@myskyline_ai/ccdebug 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +129 -0
  3. package/dist/cli.d.ts +9 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +674 -0
  6. package/dist/html-generator.d.ts +24 -0
  7. package/dist/html-generator.d.ts.map +1 -0
  8. package/dist/html-generator.js +141 -0
  9. package/dist/index-generator.d.ts +29 -0
  10. package/dist/index-generator.d.ts.map +1 -0
  11. package/dist/index-generator.js +271 -0
  12. package/dist/index.d.ts +7 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +28 -0
  15. package/dist/interceptor-loader.js +59 -0
  16. package/dist/interceptor.d.ts +46 -0
  17. package/dist/interceptor.d.ts.map +1 -0
  18. package/dist/interceptor.js +555 -0
  19. package/dist/log-file-manager.d.ts +15 -0
  20. package/dist/log-file-manager.d.ts.map +1 -0
  21. package/dist/log-file-manager.js +41 -0
  22. package/dist/shared-conversation-processor.d.ts +114 -0
  23. package/dist/shared-conversation-processor.d.ts.map +1 -0
  24. package/dist/shared-conversation-processor.js +663 -0
  25. package/dist/token-extractor.js +28 -0
  26. package/dist/types.d.ts +95 -0
  27. package/dist/types.d.ts.map +1 -0
  28. package/dist/types.js +3 -0
  29. package/frontend/dist/index.global.js +1522 -0
  30. package/frontend/dist/styles.css +985 -0
  31. package/frontend/template.html +19 -0
  32. package/package.json +83 -0
  33. package/web/debug.html +14 -0
  34. package/web/dist/assets/index-BIP9r3RA.js +48 -0
  35. package/web/dist/assets/index-BIP9r3RA.js.map +1 -0
  36. package/web/dist/assets/index-De3gn-G-.css +1 -0
  37. package/web/dist/favicon.svg +4 -0
  38. package/web/dist/index.html +15 -0
  39. package/web/index.html +14 -0
  40. package/web/package.json +47 -0
  41. package/web/server/conversation-parser.d.ts +47 -0
  42. package/web/server/conversation-parser.d.ts.map +1 -0
  43. package/web/server/conversation-parser.js +564 -0
  44. package/web/server/conversation-parser.js.map +1 -0
  45. package/web/server/index.d.ts +16 -0
  46. package/web/server/index.d.ts.map +1 -0
  47. package/web/server/index.js +60 -0
  48. package/web/server/index.js.map +1 -0
  49. package/web/server/log-file-manager.d.ts +98 -0
  50. package/web/server/log-file-manager.d.ts.map +1 -0
  51. package/web/server/log-file-manager.js +512 -0
  52. package/web/server/log-file-manager.js.map +1 -0
  53. package/web/server/src/types/index.d.ts +68 -0
  54. package/web/server/src/types/index.d.ts.map +1 -0
  55. package/web/server/src/types/index.js +3 -0
  56. package/web/server/src/types/index.js.map +1 -0
  57. package/web/server/test-path.js +48 -0
  58. package/web/server/web-server.d.ts +41 -0
  59. package/web/server/web-server.d.ts.map +1 -0
  60. package/web/server/web-server.js +807 -0
  61. package/web/server/web-server.js.map +1 -0
@@ -0,0 +1,1522 @@
1
+ /* Claude Tools Frontend Bundle */
2
+ "use strict";var ClaudeApp=(()=>{var os=Object.defineProperty;var as=Object.getOwnPropertyDescriptor;var S=(l,e,t,s)=>{for(var n=s>1?void 0:s?as(e,t):e,i=l.length-1,r;i>=0;i--)(r=l[i])&&(n=(s?r(e,t,n):r(n))||n);return s&&n&&os(e,t,n),n};var vt=class{get shadowRoot(){return this.__host.__shadowRoot}constructor(e){this.ariaAtomic="",this.ariaAutoComplete="",this.ariaBrailleLabel="",this.ariaBrailleRoleDescription="",this.ariaBusy="",this.ariaChecked="",this.ariaColCount="",this.ariaColIndex="",this.ariaColSpan="",this.ariaCurrent="",this.ariaDescription="",this.ariaDisabled="",this.ariaExpanded="",this.ariaHasPopup="",this.ariaHidden="",this.ariaInvalid="",this.ariaKeyShortcuts="",this.ariaLabel="",this.ariaLevel="",this.ariaLive="",this.ariaModal="",this.ariaMultiLine="",this.ariaMultiSelectable="",this.ariaOrientation="",this.ariaPlaceholder="",this.ariaPosInSet="",this.ariaPressed="",this.ariaReadOnly="",this.ariaRequired="",this.ariaRoleDescription="",this.ariaRowCount="",this.ariaRowIndex="",this.ariaRowSpan="",this.ariaSelected="",this.ariaSetSize="",this.ariaSort="",this.ariaValueMax="",this.ariaValueMin="",this.ariaValueNow="",this.ariaValueText="",this.role="",this.form=null,this.labels=[],this.states=new Set,this.validationMessage="",this.validity={},this.willValidate=!0,this.__host=e}checkValidity(){return console.warn("`ElementInternals.checkValidity()` was called on the server.This method always returns true."),!0}reportValidity(){return!0}setFormValue(){}setValidity(){}};var R=function(l,e,t,s,n){if(s==="m")throw new TypeError("Private method is not writable");if(s==="a"&&!n)throw new TypeError("Private accessor was defined without a setter");if(typeof e=="function"?l!==e||!n:!e.has(l))throw new TypeError("Cannot write private member to an object whose class did not declare it");return s==="a"?n.call(l,t):n?n.value=t:e.set(l,t),t},T=function(l,e,t,s){if(t==="a"&&!s)throw new TypeError("Private accessor was defined without a getter");if(typeof e=="function"?l!==e||!s:!e.has(l))throw new TypeError("Cannot read private member from an object whose class did not declare it");return t==="m"?s:t==="a"?s.call(l):s?s.value:e.get(l)},Z,Te,Se,se,Ue,ne,Ee,j,ie,z,Pe,xt,bt=l=>typeof l=="boolean"?l:l?.capture??!1;var ls=class{constructor(){this.__eventListeners=new Map,this.__captureEventListeners=new Map}addEventListener(e,t,s){if(t==null)return;let n=bt(s)?this.__captureEventListeners:this.__eventListeners,i=n.get(e);if(i===void 0)i=new Map,n.set(e,i);else if(i.has(t))return;let r=typeof s=="object"&&s?s:{};r.signal?.addEventListener("abort",()=>this.removeEventListener(e,t,s)),i.set(t,r??{})}removeEventListener(e,t,s){if(t==null)return;let n=bt(s)?this.__captureEventListeners:this.__eventListeners,i=n.get(e);i!==void 0&&(i.delete(t),i.size||n.delete(e))}dispatchEvent(e){let t=[this],s=this.__eventTargetParent;if(e.composed)for(;s;)t.push(s),s=s.__eventTargetParent;else for(;s&&s!==this.__host;)t.push(s),s=s.__eventTargetParent;let n=!1,i=!1,r=0,a=null,o=null,c=null,h=e.stopPropagation,p=e.stopImmediatePropagation;Object.defineProperties(e,{target:{get(){return a??o},...b},srcElement:{get(){return e.target},...b},currentTarget:{get(){return c},...b},eventPhase:{get(){return r},...b},composedPath:{value:()=>t,...b},stopPropagation:{value:()=>{n=!0,h.call(e)},...b},stopImmediatePropagation:{value:()=>{i=!0,p.call(e)},...b}});let d=(g,f,_)=>{typeof g=="function"?g(e):typeof g?.handleEvent=="function"&&g.handleEvent(e),f.once&&_.delete(g)},m=()=>(c=null,r=0,!e.defaultPrevented),x=t.slice().reverse();a=!this.__host||!e.composed?this:null;let w=g=>{for(o=this;o.__host&&g.includes(o.__host);)o=o.__host};for(let g of x){!a&&(!o||o===g.__host)&&w(x.slice(x.indexOf(g))),c=g,r=g===e.target?2:1;let f=g.__captureEventListeners.get(e.type);if(f){for(let[_,E]of f)if(d(_,E,f),i)return m()}if(n)return m()}let $=e.bubbles?t:[this];o=null;for(let g of $){!a&&(!o||g===o.__host)&&w($.slice(0,$.indexOf(g)+1)),c=g,r=g===e.target?2:3;let f=g.__eventListeners.get(e.type);if(f){for(let[_,E]of f)if(d(_,E,f),i)return m()}if(n)return m()}return m()}},je=ls;var b={__proto__:null};b.enumerable=!0;Object.freeze(b);var We=(z=class{constructor(e,t={}){if(Z.set(this,!1),Te.set(this,!1),Se.set(this,!1),se.set(this,!1),Ue.set(this,Date.now()),ne.set(this,!1),Ee.set(this,void 0),j.set(this,void 0),ie.set(this,void 0),this.NONE=0,this.CAPTURING_PHASE=1,this.AT_TARGET=2,this.BUBBLING_PHASE=3,arguments.length===0)throw new Error("The type argument must be specified");if(typeof t!="object"||!t)throw new Error('The "options" argument must be an object');let{bubbles:s,cancelable:n,composed:i}=t;R(this,Z,!!n,"f"),R(this,Te,!!s,"f"),R(this,Se,!!i,"f"),R(this,Ee,`${e}`,"f"),R(this,j,null,"f"),R(this,ie,!1,"f")}initEvent(e,t,s){throw new Error("Method not implemented.")}stopImmediatePropagation(){this.stopPropagation()}preventDefault(){R(this,se,!0,"f")}get target(){return T(this,j,"f")}get currentTarget(){return T(this,j,"f")}get srcElement(){return T(this,j,"f")}get type(){return T(this,Ee,"f")}get cancelable(){return T(this,Z,"f")}get defaultPrevented(){return T(this,Z,"f")&&T(this,se,"f")}get timeStamp(){return T(this,Ue,"f")}composedPath(){return T(this,ie,"f")?[T(this,j,"f")]:[]}get returnValue(){return!T(this,Z,"f")||!T(this,se,"f")}get bubbles(){return T(this,Te,"f")}get composed(){return T(this,Se,"f")}get eventPhase(){return T(this,ie,"f")?z.AT_TARGET:z.NONE}get cancelBubble(){return T(this,ne,"f")}set cancelBubble(e){e&&R(this,ne,!0,"f")}stopPropagation(){R(this,ne,!0,"f")}get isTrusted(){return!1}},Z=new WeakMap,Te=new WeakMap,Se=new WeakMap,se=new WeakMap,Ue=new WeakMap,ne=new WeakMap,Ee=new WeakMap,j=new WeakMap,ie=new WeakMap,z.NONE=0,z.CAPTURING_PHASE=1,z.AT_TARGET=2,z.BUBBLING_PHASE=3,z);Object.defineProperties(We.prototype,{initEvent:b,stopImmediatePropagation:b,preventDefault:b,target:b,currentTarget:b,srcElement:b,type:b,cancelable:b,defaultPrevented:b,timeStamp:b,composedPath:b,returnValue:b,bubbles:b,composed:b,eventPhase:b,cancelBubble:b,stopPropagation:b,isTrusted:b});var kt=(xt=class extends We{constructor(e,t={}){super(e,t),Pe.set(this,void 0),R(this,Pe,t?.detail??null,"f")}initCustomEvent(e,t,s,n){throw new Error("Method not implemented.")}get detail(){return T(this,Pe,"f")}},Pe=new WeakMap,xt);Object.defineProperties(kt.prototype,{detail:b});var Fe=We,Je=kt;globalThis.Event??=Fe;globalThis.CustomEvent??=Je;var wt=new WeakMap,re=l=>{let e=wt.get(l);return e===void 0&&wt.set(l,e=new Map),e},cs=class extends je{constructor(){super(...arguments),this.__shadowRootMode=null,this.__shadowRoot=null,this.__internals=null}get attributes(){return Array.from(re(this)).map(([e,t])=>({name:e,value:t}))}get shadowRoot(){return this.__shadowRootMode==="closed"?null:this.__shadowRoot}get localName(){return this.constructor.__localName}get tagName(){return this.localName?.toUpperCase()}setAttribute(e,t){re(this).set(e,String(t))}removeAttribute(e){re(this).delete(e)}toggleAttribute(e,t){if(this.hasAttribute(e)){if(t===void 0||!t)return this.removeAttribute(e),!1}else return t===void 0||t?(this.setAttribute(e,""),!0):!1;return!0}hasAttribute(e){return re(this).has(e)}attachShadow(e){let t={host:this};return this.__shadowRootMode=e.mode,e&&e.mode==="open"&&(this.__shadowRoot=t),t}attachInternals(){if(this.__internals!==null)throw new Error("Failed to execute 'attachInternals' on 'HTMLElement': ElementInternals for the specified element was already attached.");let e=new vt(this);return this.__internals=e,e}getAttribute(e){return re(this).get(e)??null}};var hs=class extends cs{},Ve=hs;globalThis.litServerRoot??=Object.defineProperty(new Ve,"localName",{get(){return"lit-server-root"}});var ps=class{constructor(){this.__definitions=new Map}define(e,t){if(this.__definitions.has(e))if(process.env.NODE_ENV==="development")console.warn(`'CustomElementRegistry' already has "${e}" defined. This may have been caused by live reload or hot module replacement in which case it can be safely ignored.
3
+ Make sure to test your application with a production build as repeat registrations will throw in production.`);else throw new Error(`Failed to execute 'define' on 'CustomElementRegistry': the name "${e}" has already been used with this registry`);t.__localName=e,this.__definitions.set(e,{ctor:t,observedAttributes:t.observedAttributes??[]})}get(e){return this.__definitions.get(e)?.ctor}},us=ps;var yt=new us;var oe=globalThis,Ae=oe.ShadowRoot&&(oe.ShadyCSS===void 0||oe.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,$t=Symbol(),_t=new WeakMap,Ce=class{constructor(e,t,s){if(this._$cssResult$=!0,s!==$t)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=e,this.t=t}get styleSheet(){let e=this.o,t=this.t;if(Ae&&e===void 0){let s=t!==void 0&&t.length===1;s&&(e=_t.get(t)),e===void 0&&((this.o=e=new CSSStyleSheet).replaceSync(this.cssText),s&&_t.set(t,e))}return e}toString(){return this.cssText}},Tt=l=>new Ce(typeof l=="string"?l:l+"",void 0,$t);var St=(l,e)=>{if(Ae)l.adoptedStyleSheets=e.map(t=>t instanceof CSSStyleSheet?t:t.styleSheet);else for(let t of e){let s=document.createElement("style"),n=oe.litNonce;n!==void 0&&s.setAttribute("nonce",n),s.textContent=t.cssText,l.appendChild(s)}},Ge=Ae||oe.CSSStyleSheet===void 0?l=>l:l=>l instanceof CSSStyleSheet?(e=>{let t="";for(let s of e.cssRules)t+=s.cssText;return Tt(t)})(l):l;var{is:ds,defineProperty:ms,getOwnPropertyDescriptor:fs,getOwnPropertyNames:gs,getOwnPropertySymbols:vs,getPrototypeOf:xs}=Object,ce=globalThis;ce.customElements??=yt;var Et=ce.trustedTypes,bs=Et?Et.emptyScript:"",ks=ce.reactiveElementPolyfillSupport,ae=(l,e)=>l,le={toAttribute(l,e){switch(e){case Boolean:l=l?bs:null;break;case Object:case Array:l=l==null?l:JSON.stringify(l)}return l},fromAttribute(l,e){let t=l;switch(e){case Boolean:t=l!==null;break;case Number:t=l===null?null:Number(l);break;case Object:case Array:try{t=JSON.parse(l)}catch{t=null}}return t}},Re=(l,e)=>!ds(l,e),Pt={attribute:!0,type:String,converter:le,reflect:!1,useDefault:!1,hasChanged:Re};Symbol.metadata??=Symbol("metadata"),ce.litPropertyMetadata??=new WeakMap;var L=class extends(globalThis.HTMLElement??Ve){static addInitializer(e){this._$Ei(),(this.l??=[]).push(e)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(e,t=Pt){if(t.state&&(t.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(e)&&((t=Object.create(t)).wrapped=!0),this.elementProperties.set(e,t),!t.noAccessor){let s=Symbol(),n=this.getPropertyDescriptor(e,s,t);n!==void 0&&ms(this.prototype,e,n)}}static getPropertyDescriptor(e,t,s){let{get:n,set:i}=fs(this.prototype,e)??{get(){return this[t]},set(r){this[t]=r}};return{get:n,set(r){let a=n?.call(this);i?.call(this,r),this.requestUpdate(e,a,s)},configurable:!0,enumerable:!0}}static getPropertyOptions(e){return this.elementProperties.get(e)??Pt}static _$Ei(){if(this.hasOwnProperty(ae("elementProperties")))return;let e=xs(this);e.finalize(),e.l!==void 0&&(this.l=[...e.l]),this.elementProperties=new Map(e.elementProperties)}static finalize(){if(this.hasOwnProperty(ae("finalized")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(ae("properties"))){let t=this.properties,s=[...gs(t),...vs(t)];for(let n of s)this.createProperty(n,t[n])}let e=this[Symbol.metadata];if(e!==null){let t=litPropertyMetadata.get(e);if(t!==void 0)for(let[s,n]of t)this.elementProperties.set(s,n)}this._$Eh=new Map;for(let[t,s]of this.elementProperties){let n=this._$Eu(t,s);n!==void 0&&this._$Eh.set(n,t)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(e){let t=[];if(Array.isArray(e)){let s=new Set(e.flat(1/0).reverse());for(let n of s)t.unshift(Ge(n))}else e!==void 0&&t.push(Ge(e));return t}static _$Eu(e,t){let s=t.attribute;return s===!1?void 0:typeof s=="string"?s:typeof e=="string"?e.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise(e=>this.enableUpdating=e),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach(e=>e(this))}addController(e){(this._$EO??=new Set).add(e),this.renderRoot!==void 0&&this.isConnected&&e.hostConnected?.()}removeController(e){this._$EO?.delete(e)}_$E_(){let e=new Map,t=this.constructor.elementProperties;for(let s of t.keys())this.hasOwnProperty(s)&&(e.set(s,this[s]),delete this[s]);e.size>0&&(this._$Ep=e)}createRenderRoot(){let e=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return St(e,this.constructor.elementStyles),e}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach(e=>e.hostConnected?.())}enableUpdating(e){}disconnectedCallback(){this._$EO?.forEach(e=>e.hostDisconnected?.())}attributeChangedCallback(e,t,s){this._$AK(e,s)}_$ET(e,t){let s=this.constructor.elementProperties.get(e),n=this.constructor._$Eu(e,s);if(n!==void 0&&s.reflect===!0){let i=(s.converter?.toAttribute!==void 0?s.converter:le).toAttribute(t,s.type);this._$Em=e,i==null?this.removeAttribute(n):this.setAttribute(n,i),this._$Em=null}}_$AK(e,t){let s=this.constructor,n=s._$Eh.get(e);if(n!==void 0&&this._$Em!==n){let i=s.getPropertyOptions(n),r=typeof i.converter=="function"?{fromAttribute:i.converter}:i.converter?.fromAttribute!==void 0?i.converter:le;this._$Em=n,this[n]=r.fromAttribute(t,i.type)??this._$Ej?.get(n)??null,this._$Em=null}}requestUpdate(e,t,s){if(e!==void 0){let n=this.constructor,i=this[e];if(s??=n.getPropertyOptions(e),!((s.hasChanged??Re)(i,t)||s.useDefault&&s.reflect&&i===this._$Ej?.get(e)&&!this.hasAttribute(n._$Eu(e,s))))return;this.C(e,t,s)}this.isUpdatePending===!1&&(this._$ES=this._$EP())}C(e,t,{useDefault:s,reflect:n,wrapped:i},r){s&&!(this._$Ej??=new Map).has(e)&&(this._$Ej.set(e,r??t??this[e]),i!==!0||r!==void 0)||(this._$AL.has(e)||(this.hasUpdated||s||(t=void 0),this._$AL.set(e,t)),n===!0&&this._$Em!==e&&(this._$Eq??=new Set).add(e))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(t){Promise.reject(t)}let e=this.scheduleUpdate();return e!=null&&await e,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(let[n,i]of this._$Ep)this[n]=i;this._$Ep=void 0}let s=this.constructor.elementProperties;if(s.size>0)for(let[n,i]of s){let{wrapped:r}=i,a=this[n];r!==!0||this._$AL.has(n)||a===void 0||this.C(n,void 0,i,a)}}let e=!1,t=this._$AL;try{e=this.shouldUpdate(t),e?(this.willUpdate(t),this._$EO?.forEach(s=>s.hostUpdate?.()),this.update(t)):this._$EM()}catch(s){throw e=!1,this._$EM(),s}e&&this._$AE(t)}willUpdate(e){}_$AE(e){this._$EO?.forEach(t=>t.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(e)),this.updated(e)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(e){return!0}update(e){this._$Eq&&=this._$Eq.forEach(t=>this._$ET(t,this[t])),this._$EM()}updated(e){}firstUpdated(e){}};L.elementStyles=[],L.shadowRootOptions={mode:"open"},L[ae("elementProperties")]=new Map,L[ae("finalized")]=new Map,ks?.({ReactiveElement:L}),(ce.reactiveElementVersions??=[]).push("2.1.0");var Le=globalThis,Me=Le.trustedTypes,Ct=Me?Me.createPolicy("lit-html",{createHTML:l=>l}):void 0,Nt="$lit$",D=`lit$${Math.random().toFixed(9).slice(2)}$`,Bt="?"+D,ws=`<${Bt}>`,J=Le.document===void 0?{createTreeWalker:()=>({})}:document,pe=()=>J.createComment(""),ue=l=>l===null||typeof l!="object"&&typeof l!="function",tt=Array.isArray,ys=l=>tt(l)||typeof l?.[Symbol.iterator]=="function",Ze=`[
4
+ \f\r]`,he=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,At=/-->/g,Rt=/>/g,W=RegExp(`>|${Ze}(?:([^\\s"'>=/]+)(${Ze}*=${Ze}*(?:[^
5
+ \f\r"'\`<>=]|("|')|))|$)`,"g"),Mt=/'/g,Lt=/"/g,Ot=/^(?:script|style|textarea|title)$/i,st=l=>(e,...t)=>({_$litType$:l,strings:e,values:t}),u=st(1),Nn=st(2),Bn=st(3),I=Symbol.for("lit-noChange"),y=Symbol.for("lit-nothing"),It=new WeakMap,F=J.createTreeWalker(J,129);function zt(l,e){if(!tt(l)||!l.hasOwnProperty("raw"))throw Error("invalid template strings array");return Ct!==void 0?Ct.createHTML(e):e}var _s=(l,e)=>{let t=l.length-1,s=[],n,i=e===2?"<svg>":e===3?"<math>":"",r=he;for(let a=0;a<t;a++){let o=l[a],c,h,p=-1,d=0;for(;d<o.length&&(r.lastIndex=d,h=r.exec(o),h!==null);)d=r.lastIndex,r===he?h[1]==="!--"?r=At:h[1]!==void 0?r=Rt:h[2]!==void 0?(Ot.test(h[2])&&(n=RegExp("</"+h[2],"g")),r=W):h[3]!==void 0&&(r=W):r===W?h[0]===">"?(r=n??he,p=-1):h[1]===void 0?p=-2:(p=r.lastIndex-h[2].length,c=h[1],r=h[3]===void 0?W:h[3]==='"'?Lt:Mt):r===Lt||r===Mt?r=W:r===At||r===Rt?r=he:(r=W,n=void 0);let m=r===W&&l[a+1].startsWith("/>")?" ":"";i+=r===he?o+ws:p>=0?(s.push(c),o.slice(0,p)+Nt+o.slice(p)+D+m):o+D+(p===-2?a:m)}return[zt(l,i+(l[t]||"<?>")+(e===2?"</svg>":e===3?"</math>":"")),s]},de=class l{constructor({strings:e,_$litType$:t},s){let n;this.parts=[];let i=0,r=0,a=e.length-1,o=this.parts,[c,h]=_s(e,t);if(this.el=l.createElement(c,s),F.currentNode=this.el.content,t===2||t===3){let p=this.el.content.firstChild;p.replaceWith(...p.childNodes)}for(;(n=F.nextNode())!==null&&o.length<a;){if(n.nodeType===1){if(n.hasAttributes())for(let p of n.getAttributeNames())if(p.endsWith(Nt)){let d=h[r++],m=n.getAttribute(p).split(D),x=/([.?@])?(.*)/.exec(d);o.push({type:1,index:i,name:x[2],strings:m,ctor:x[1]==="."?Ke:x[1]==="?"?Xe:x[1]==="@"?Ye:K}),n.removeAttribute(p)}else p.startsWith(D)&&(o.push({type:6,index:i}),n.removeAttribute(p));if(Ot.test(n.tagName)){let p=n.textContent.split(D),d=p.length-1;if(d>0){n.textContent=Me?Me.emptyScript:"";for(let m=0;m<d;m++)n.append(p[m],pe()),F.nextNode(),o.push({type:2,index:++i});n.append(p[d],pe())}}}else if(n.nodeType===8)if(n.data===Bt)o.push({type:2,index:i});else{let p=-1;for(;(p=n.data.indexOf(D,p+1))!==-1;)o.push({type:7,index:i}),p+=D.length-1}i++}}static createElement(e,t){let s=J.createElement("template");return s.innerHTML=e,s}};function Q(l,e,t=l,s){if(e===I)return e;let n=s!==void 0?t._$Co?.[s]:t._$Cl,i=ue(e)?void 0:e._$litDirective$;return n?.constructor!==i&&(n?._$AO?.(!1),i===void 0?n=void 0:(n=new i(l),n._$AT(l,t,s)),s!==void 0?(t._$Co??=[])[s]=n:t._$Cl=n),n!==void 0&&(e=Q(l,n._$AS(l,e.values),n,s)),e}var Qe=class{constructor(e,t){this._$AV=[],this._$AN=void 0,this._$AD=e,this._$AM=t}get parentNode(){return this._$AM.parentNode}get _$AU(){return this._$AM._$AU}u(e){let{el:{content:t},parts:s}=this._$AD,n=(e?.creationScope??J).importNode(t,!0);F.currentNode=n;let i=F.nextNode(),r=0,a=0,o=s[0];for(;o!==void 0;){if(r===o.index){let c;o.type===2?c=new me(i,i.nextSibling,this,e):o.type===1?c=new o.ctor(i,o.name,o.strings,this,e):o.type===6&&(c=new et(i,this,e)),this._$AV.push(c),o=s[++a]}r!==o?.index&&(i=F.nextNode(),r++)}return F.currentNode=J,n}p(e){let t=0;for(let s of this._$AV)s!==void 0&&(s.strings!==void 0?(s._$AI(e,s,t),t+=s.strings.length-2):s._$AI(e[t])),t++}},me=class l{get _$AU(){return this._$AM?._$AU??this._$Cv}constructor(e,t,s,n){this.type=2,this._$AH=y,this._$AN=void 0,this._$AA=e,this._$AB=t,this._$AM=s,this.options=n,this._$Cv=n?.isConnected??!0}get parentNode(){let e=this._$AA.parentNode,t=this._$AM;return t!==void 0&&e?.nodeType===11&&(e=t.parentNode),e}get startNode(){return this._$AA}get endNode(){return this._$AB}_$AI(e,t=this){e=Q(this,e,t),ue(e)?e===y||e==null||e===""?(this._$AH!==y&&this._$AR(),this._$AH=y):e!==this._$AH&&e!==I&&this._(e):e._$litType$!==void 0?this.$(e):e.nodeType!==void 0?this.T(e):ys(e)?this.k(e):this._(e)}O(e){return this._$AA.parentNode.insertBefore(e,this._$AB)}T(e){this._$AH!==e&&(this._$AR(),this._$AH=this.O(e))}_(e){this._$AH!==y&&ue(this._$AH)?this._$AA.nextSibling.data=e:this.T(J.createTextNode(e)),this._$AH=e}$(e){let{values:t,_$litType$:s}=e,n=typeof s=="number"?this._$AC(e):(s.el===void 0&&(s.el=de.createElement(zt(s.h,s.h[0]),this.options)),s);if(this._$AH?._$AD===n)this._$AH.p(t);else{let i=new Qe(n,this),r=i.u(this.options);i.p(t),this.T(r),this._$AH=i}}_$AC(e){let t=It.get(e.strings);return t===void 0&&It.set(e.strings,t=new de(e)),t}k(e){tt(this._$AH)||(this._$AH=[],this._$AR());let t=this._$AH,s,n=0;for(let i of e)n===t.length?t.push(s=new l(this.O(pe()),this.O(pe()),this,this.options)):s=t[n],s._$AI(i),n++;n<t.length&&(this._$AR(s&&s._$AB.nextSibling,n),t.length=n)}_$AR(e=this._$AA.nextSibling,t){for(this._$AP?.(!1,!0,t);e&&e!==this._$AB;){let s=e.nextSibling;e.remove(),e=s}}setConnected(e){this._$AM===void 0&&(this._$Cv=e,this._$AP?.(e))}},K=class{get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}constructor(e,t,s,n,i){this.type=1,this._$AH=y,this._$AN=void 0,this.element=e,this.name=t,this._$AM=n,this.options=i,s.length>2||s[0]!==""||s[1]!==""?(this._$AH=Array(s.length-1).fill(new String),this.strings=s):this._$AH=y}_$AI(e,t=this,s,n){let i=this.strings,r=!1;if(i===void 0)e=Q(this,e,t,0),r=!ue(e)||e!==this._$AH&&e!==I,r&&(this._$AH=e);else{let a=e,o,c;for(e=i[0],o=0;o<i.length-1;o++)c=Q(this,a[s+o],t,o),c===I&&(c=this._$AH[o]),r||=!ue(c)||c!==this._$AH[o],c===y?e=y:e!==y&&(e+=(c??"")+i[o+1]),this._$AH[o]=c}r&&!n&&this.j(e)}j(e){e===y?this.element.removeAttribute(this.name):this.element.setAttribute(this.name,e??"")}},Ke=class extends K{constructor(){super(...arguments),this.type=3}j(e){this.element[this.name]=e===y?void 0:e}},Xe=class extends K{constructor(){super(...arguments),this.type=4}j(e){this.element.toggleAttribute(this.name,!!e&&e!==y)}},Ye=class extends K{constructor(e,t,s,n,i){super(e,t,s,n,i),this.type=5}_$AI(e,t=this){if((e=Q(this,e,t,0)??y)===I)return;let s=this._$AH,n=e===y&&s!==y||e.capture!==s.capture||e.once!==s.once||e.passive!==s.passive,i=e!==y&&(s===y||n);n&&this.element.removeEventListener(this.name,this,s),i&&this.element.addEventListener(this.name,this,e),this._$AH=e}handleEvent(e){typeof this._$AH=="function"?this._$AH.call(this.options?.host??this.element,e):this._$AH.handleEvent(e)}},et=class{constructor(e,t,s){this.element=e,this.type=6,this._$AN=void 0,this._$AM=t,this.options=s}get _$AU(){return this._$AM._$AU}_$AI(e){Q(this,e)}};var $s=Le.litHtmlPolyfillSupport;$s?.(de,me),(Le.litHtmlVersions??=[]).push("3.3.0");var Dt=(l,e,t)=>{let s=t?.renderBefore??e,n=s._$litPart$;if(n===void 0){let i=t?.renderBefore??null;s._$litPart$=n=new me(e.insertBefore(pe(),i),i,void 0,t??{})}return n._$AI(l),n};var nt=globalThis,P=class extends L{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){let e=super.createRenderRoot();return this.renderOptions.renderBefore??=e.firstChild,e}update(e){let t=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(e),this._$Do=Dt(t,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return I}};P._$litElement$=!0,P.finalized=!0,nt.litElementHydrateSupport?.({LitElement:P});var Ts=nt.litElementPolyfillSupport;Ts?.({LitElement:P});(nt.litElementVersions??=[]).push("4.2.0");var H=l=>(e,t)=>{t!==void 0?t.addInitializer(()=>{customElements.define(l,e)}):customElements.define(l,e)};var Ss={attribute:!0,type:String,converter:le,reflect:!1,hasChanged:Re},Es=(l=Ss,e,t)=>{let{kind:s,metadata:n}=t,i=globalThis.litPropertyMetadata.get(n);if(i===void 0&&globalThis.litPropertyMetadata.set(n,i=new Map),s==="setter"&&((l=Object.create(l)).wrapped=!0),i.set(t.name,l),s==="accessor"){let{name:r}=t;return{set(a){let o=e.get.call(this);e.set.call(this,a),this.requestUpdate(r,o,l)},init(a){return a!==void 0&&this.C(r,void 0,l,a),a}}}if(s==="setter"){let{name:r}=t;return function(a){let o=this[r];e.call(this,a),this.requestUpdate(r,o,l)}}throw Error("Unsupported decorator location: "+s)};function q(l){return(e,t)=>typeof t=="object"?Es(l,e,t):((s,n,i)=>{let r=n.hasOwnProperty(i);return n.constructor.createProperty(i,s),r?Object.getOwnPropertyDescriptor(n,i):void 0})(l,e,t)}function X(l){return q({...l,state:!0,attribute:!1})}var Ne=class{processRawPairs(e){if(!e||e.length===0)return[];let t=[];for(let s=0;s<e.length;s++){let n=e[s];if(!(!n?.request||!n?.response))try{let i=!!n.response.body_raw,r,a=null;if(n.response.body_raw)a=this.isBedrockResponse(n.response.body_raw)?"bedrock":"standard",r=this.parseStreamingResponse(n.response.body_raw);else if(n.response.body)r=n.response.body;else continue;let o=this.extractModel(n);t.push({id:`${n.request.timestamp||Date.now()}_${Math.random()}`,timestamp:new Date((n.request.timestamp||Date.now())*1e3).toISOString(),request:n.request.body,response:r,model:o,isStreaming:i,rawStreamData:n.response.body_raw,streamFormat:a})}catch(i){console.warn(`Failed to process raw pair at index ${s}:`,i)}}return t}isBedrockResponse(e){return e.startsWith("\0\0")}parseBedrockStreamingResponse(e){if(!e||e.length===0)throw new Error("Empty bodyRaw provided to parseBedrockStreamingResponse");let t=[],s=null;try{let n=this.extractJsonChunksFromEventStream(e);for(let i of n)try{let r=JSON.parse(i);if(r.bytes){let a=r.bytes,o=this.decodeBase64ToUtf8(a),c=JSON.parse(o);t.push(c)}}catch(r){console.warn("Failed to parse JSON chunk:",i,r)}s=this.extractBedrockMetrics(e)}catch(n){throw console.error("Failed to parse Bedrock streaming response:",n),new Error(`Bedrock streaming response parsing failed: ${n}`)}return this.buildMessageFromEvents(t,s)}decodeBase64ToUtf8(e){if(typeof window<"u"&&typeof atob<"u")return atob(e);if(typeof Buffer<"u")return Buffer.from(e,"base64").toString("utf-8");throw new Error("Base64 decoding not supported in this environment")}extractJsonChunksFromEventStream(e){if(!e||e.length===0)return[];let t=[],s='event{"bytes":',n=0;for(;n<e.length;){let i=e.indexOf(s,n);if(i===-1)break;let r=i+5,a=0,o=-1;for(let c=r;c<e.length;c++){let h=e[c];if(h==="{")a++;else if(h==="}"&&(a--,a===0)){o=c;break}}if(o!==-1){let c=e.substring(r,o+1);t.push(c),n=o+1}else n=i+s.length}return t}extractBedrockMetrics(e){try{let t=e.match(/"amazon-bedrock-invocationMetrics":\s*(\{[^}]+\})/);if(t&&t[1])return JSON.parse(t[1])}catch{}return null}parseStreamingResponse(e){return this.isBedrockResponse(e)?this.parseBedrockStreamingResponse(e):this.parseStandardStreamingResponse(e)}parseStandardStreamingResponse(e){if(!e||e.length===0)throw new Error("Empty bodyRaw provided to parseStandardStreamingResponse");let t=e.split(`
6
+ `),s=[];for(let n of t){if(!n.startsWith("data: "))continue;let i=n.substring(6).trim();if(i==="[DONE]")break;try{let r=JSON.parse(i);s.push(r)}catch(r){console.warn("Failed to parse SSE event:",i,r)}}return this.buildMessageFromEvents(s)}buildMessageFromEvents(e,t){let s={id:"",type:"message",role:"assistant",content:[],model:"",stop_reason:null,stop_sequence:null,usage:{input_tokens:0,output_tokens:0,cache_creation_input_tokens:null,cache_read_input_tokens:null,server_tool_use:null,service_tier:null}},n=[],i=-1;for(let r of e)switch(r.type){case"message_start":s={...s,...r.message};break;case"content_block_start":i=r.index,n[i]={...r.content_block};break;case"content_block_delta":if(i>=0&&n[i]){let a=n[i],o=r.delta;switch(o.type){case"text_delta":a.type==="text"&&(a.text=(a.text||"")+o.text);break;case"input_json_delta":if(a.type==="tool_use"){let c=a;typeof c.input=="string"?c.input=c.input+o.partial_json:c.input=o.partial_json}break;case"thinking_delta":a.type==="thinking"&&(a.thinking=(a.thinking||"")+o.thinking);break;case"signature_delta":a.type==="thinking"&&(a.signature=(a.signature||"")+o.signature);break;case"citations_delta":break}}break;case"content_block_stop":if(i>=0&&n[i]){let a=n[i];if(a.type==="tool_use"){let o=a;if(typeof o.input=="string")try{o.input=JSON.parse(o.input)}catch{console.warn("Failed to parse tool input JSON:",o.input)}}}break;case"message_delta":if(r.delta.stop_reason&&(s.stop_reason=r.delta.stop_reason),r.delta.stop_sequence&&(s.stop_sequence=r.delta.stop_sequence),r.usage){let a=s.usage?.input_tokens??0;s.usage={input_tokens:r.usage.input_tokens??a,output_tokens:r.usage.output_tokens??s.usage?.output_tokens??0,cache_creation_input_tokens:r.usage.cache_creation_input_tokens??s.usage?.cache_creation_input_tokens??null,cache_read_input_tokens:r.usage.cache_read_input_tokens??s.usage?.cache_read_input_tokens??null,server_tool_use:r.usage.server_tool_use??s.usage?.server_tool_use??null,service_tier:null}}break;case"message_stop":break}return s.content=n.filter(r=>r!=null),t&&s.usage&&(s.usage.input_tokens=t.inputTokenCount,s.usage.output_tokens=t.outputTokenCount),s}extractModel(e){if(e.request?.url&&e.request.url.includes("bedrock-runtime")){let t=e.request.url.match(/\/model\/([^\/]+)/);if(t&&t[1])return this.normalizeModelName(t[1])}return e.request?.body&&typeof e.request.body=="object"&&"model"in e.request.body?this.normalizeModelName(e.request.body.model):e.response?.body&&typeof e.response.body=="object"&&"model"in e.response.body?this.normalizeModelName(e.response.body.model):"unknown"}normalizeModelName(e){if(!e)return"unknown";if(e.startsWith("us.anthropic.")){let t=e.match(/us\.anthropic\.([^:]+)/);if(t&&t[1])return t[1]}return e}mergeConversations(e,t={}){if(!e||e.length===0)return[];let s=new Map;for(let a of e){let o=a.request.system,c=a.model,h=JSON.stringify({system:o,model:c});s.has(h)||s.set(h,[]),s.get(h).push(a)}let n=[];for(let[,a]of s){let o=[...a].sort((h,p)=>new Date(h.timestamp).getTime()-new Date(p.timestamp).getTime()),c=new Map;for(let h of o){let p=h.request.messages||[];if(p.length===0)continue;let d=p[0],m=this.normalizeMessageForGrouping(d),x=JSON.stringify({firstMessage:m}),w=this.hashString(x);c.has(w)||c.set(w,[]),c.get(w).push(h)}for(let[h,p]of c){let d=[...p].sort((g,f)=>new Date(g.timestamp).getTime()-new Date(f.timestamp).getTime()),m=d.reduce((g,f)=>{let _=f.request.messages||[],E=g.request.messages||[];return _.length>E.length?f:g}),x=new Set(d.map(g=>g.model)),w=this.processToolResults(m.request.messages||[]),$={id:this.hashString(h),models:x,system:m.request.system,messages:w,response:m.response,allPairs:d,finalPair:m,metadata:{startTime:d[0].timestamp,endTime:m.timestamp,totalPairs:d.length,inputTokens:m.response.usage?.input_tokens||0,outputTokens:m.response.usage?.output_tokens||0,totalTokens:(m.response.usage?.input_tokens||0)+(m.response.usage?.output_tokens||0)}};n.push($)}}let i=this.detectAndMergeCompactConversations(n);return(t.includeShortConversations?i:i.filter(a=>a.messages.length>2)).sort((a,o)=>new Date(a.metadata.startTime).getTime()-new Date(o.metadata.startTime).getTime())}processToolResults(e){let t=[],s={};for(let n=0;n<e.length;n++){let i=e[n],r={...i,toolResults:{},hide:!1};if(Array.isArray(i.content)){let a=!0,o=!1;for(let c=0;c<i.content.length;c++){let h=i.content[c];if(h.type==="tool_use"&&"id"in h){let p=h;s[p.id]={messageIndex:n,toolIndex:c},a=!1}else if(h.type==="tool_result"&&"tool_use_id"in h){let p=h,d=p.tool_use_id;if(s[d]){let{messageIndex:m}=s[d];t[m]||(t[m]={...e[m],toolResults:{},hide:!1}),t[m].toolResults[d]=p,delete s[d]}}else h.type==="text"&&(o=!0),a=!1}a&&!o&&(r.hide=!0)}t[n]=r}return t}detectAndMergeCompactConversations(e){if(e.length<=1)return e;let t=[...e].sort((i,r)=>new Date(i.metadata.startTime).getTime()-new Date(r.metadata.startTime).getTime()),s=new Set,n=[];for(let i=0;i<t.length;i++){let r=t[i];if(!s.has(i))if(r.allPairs.length===1&&r.messages.length>2){let a=null,o=-1;for(let c=0;c<t.length;c++){if(c===i||s.has(c))continue;let h=t[c];if(h.messages.length===r.messages.length-2){let p=!0;for(let d=1;d<h.messages.length;d++)if(!this.messagesRoughlyEqual(h.messages[d],r.messages[d])){p=!1;break}if(p){a=h,o=c;break}}}if(a){let c=this.mergeCompactConversation(a,r);n.push(c),s.add(i),s.add(o)}else r.compacted=!0,n.push(r),s.add(i)}else n.push(r),s.add(i)}for(let i=0;i<t.length;i++)s.has(i)||n.push(t[i]);return n.sort((i,r)=>new Date(i.metadata.startTime).getTime()-new Date(r.metadata.startTime).getTime())}mergeCompactConversation(e,t){let s=e.messages||[],i=[...t.messages||[]];s.length>0&&i.length>0&&(i[0]=s[0]);let r=[...e.allPairs,...t.allPairs].sort((h,p)=>new Date(h.timestamp).getTime()-new Date(p.timestamp).getTime()),a=new Set([...e.models,...t.models]),o=r[0].timestamp,c=r[r.length-1].timestamp;return{id:t.id,models:a,system:e.system,messages:i,response:t.response,allPairs:r,finalPair:t.finalPair,compacted:!0,metadata:{startTime:o,endTime:c,totalPairs:r.length,inputTokens:(e.metadata.inputTokens||0)+(t.metadata.inputTokens||0),outputTokens:(e.metadata.outputTokens||0)+(t.metadata.outputTokens||0),totalTokens:(e.metadata.totalTokens||0)+(t.metadata.totalTokens||0)}}}messagesRoughlyEqual(e,t){if(e.role!==t.role)return!1;let s=e.content,n=t.content;return!(typeof s!=typeof n||Array.isArray(s)!==Array.isArray(n))}normalizeMessageForGrouping(e){if(!e||!e.content)return e;let t;return Array.isArray(e.content)?t=e.content.map(s=>{if(s.type==="text"&&"text"in s){let n=s.text;return n=n.replace(/Generated \d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/g,"Generated [TIMESTAMP]"),n=n.replace(/The user opened the file [^\s]+ in the IDE\./g,"The user opened file in IDE."),n=n.replace(/<system-reminder>.*?<\/system-reminder>/gs,"[SYSTEM-REMINDER]"),{type:"text",text:n}}return s}):t=e.content,{role:e.role,content:t}}hashString(e){let t=0;for(let s=0;s<e.length;s++){let n=e.charCodeAt(s);t=(t<<5)-t+n,t=t&t}return Math.abs(t).toString()}};var A=class extends P{constructor(){super(...arguments);this.data={rawPairs:[]};this.conversations=[];this.processedPairs=[];this.currentView="conversations";this.selectedModels=new Set}createRenderRoot(){return console.log("createRenderRoot"),this}connectedCallback(){super.connectedCallback(),this.data=window.claudeData||{rawPairs:[]},this.processData()}processData(){let t=performance.now(),s=new Ne;this.processedPairs=s.processRawPairs(this.data.rawPairs);let n=this.data.metadata?.includeAllRequests||!1;this.conversations=s.mergeConversations(this.processedPairs,{includeShortConversations:n});let i=new Set(this.conversations.flatMap(c=>Array.from(c.models))),r=new Set(this.processedPairs.map(c=>c.model)),a=new Set(this.data.rawPairs.map(c=>c.request.body?.model||"unknown")),o=new Set([...i,...r,...a]);this.selectedModels=o,console.log(`Processed data in ${performance.now()-t}ms`)}switchView(t){this.currentView=t}toggleModel(t){let s=new Set(this.selectedModels);s.has(t)?s.delete(t):s.add(t),this.selectedModels=s}get filteredConversations(){return this.conversations.filter(t=>Array.from(t.models).some(s=>this.selectedModels.has(s)))}get filteredProcessedPairs(){return this.processedPairs.filter(t=>this.selectedModels.has(t.model))}get filteredRawPairs(){return this.data.rawPairs.filter(t=>{let s=t.request.body?.model||"unknown";return this.selectedModels.has(s)})}get allRawPairs(){return this.data.rawPairs.filter(t=>t.response!==null)}get modelCounts(){let t=new Map;return this.conversations.forEach(s=>{Array.from(s.models).forEach(n=>{t.set(n,(t.get(n)||0)+1)})}),t}render(){let t=this.modelCounts,s=this.filteredConversations;return u`
7
+ <div class="min-h-screen bg-vs-bg text-vs-text font-mono">
8
+ <div class="max-w-[60em] mx-auto p-4">
9
+ <div class="mb-8">
10
+ <div class="mb-4 text-center">
11
+ <span class="text-vs-function">~ claude-traffic</span>
12
+ <span class="text-vs-muted ml-8">${this.data.timestamp||new Date().toISOString()}</span>
13
+ </div>
14
+
15
+ <div class="mb-8 text-center">
16
+ <span
17
+ @click=${()=>this.switchView("conversations")}
18
+ class="cursor-pointer mr-12 ${this.currentView==="conversations"?"text-vs-nav-active":"text-vs-text hover:text-vs-accent"}"
19
+ >
20
+ conversations (${s.length})
21
+ </span>
22
+ <span
23
+ @click=${()=>this.switchView("raw")}
24
+ class="cursor-pointer mr-12 ${this.currentView==="raw"?"text-vs-nav-active":"text-vs-text hover:text-vs-accent"}"
25
+ >
26
+ raw calls (${this.allRawPairs.length})
27
+ </span>
28
+ <span
29
+ @click=${()=>this.switchView("json")}
30
+ class="cursor-pointer mr-12 ${this.currentView==="json"?"text-vs-nav-active":"text-vs-text hover:text-vs-accent"}"
31
+ >
32
+ json debug (${this.filteredProcessedPairs.length})
33
+ </span>
34
+ </div>
35
+
36
+ ${t.size>1&&this.currentView!=="raw"?u`
37
+ <div class="mb-4 text-center">
38
+ ${Array.from(t.entries()).map(([n,i])=>u`
39
+ <span
40
+ @click=${()=>this.toggleModel(n)}
41
+ class="cursor-pointer hover:text-vs-accent mr-8"
42
+ >
43
+ ${this.selectedModels.has(n)?"[x]":"[ ]"} ${n}
44
+ </span>
45
+ `)}
46
+ </div>
47
+ `:""}
48
+ </div>
49
+
50
+ <div>
51
+ ${this.currentView==="conversations"?u`
52
+ <div id="conversations-view">
53
+ ${s.length===0?u`<div>No conversations found for selected models.</div>`:u`<simple-conversation-view
54
+ .conversations=${s}
55
+ ></simple-conversation-view>`}
56
+ </div>
57
+ `:""}
58
+ ${this.currentView==="raw"?u`
59
+ <div id="raw-view">
60
+ ${this.allRawPairs.length===0?u`<div>No raw pairs found.</div>`:u`<raw-pairs-view .rawPairs=${this.allRawPairs}></raw-pairs-view>`}
61
+ </div>
62
+ `:""}
63
+ ${this.currentView==="json"?u`
64
+ <div id="json-view">
65
+ ${this.filteredProcessedPairs.length===0?u`<div>No processed pairs found for selected models.</div>`:u`<json-view .processedPairs=${this.filteredProcessedPairs}></json-view>`}
66
+ </div>
67
+ `:""}
68
+ </div>
69
+ </div>
70
+ </div>
71
+ `}};S([X()],A.prototype,"data",2),S([X()],A.prototype,"conversations",2),S([X()],A.prototype,"processedPairs",2),S([X()],A.prototype,"currentView",2),S([X()],A.prototype,"selectedModels",2),A=S([H("claude-app")],A);var Ht={ATTRIBUTE:1,CHILD:2,PROPERTY:3,BOOLEAN_ATTRIBUTE:4,EVENT:5,ELEMENT:6},qt=l=>(...e)=>({_$litDirective$:l,values:e}),Be=class{constructor(e){}get _$AU(){return this._$AM._$AU}_$AT(e,t,s){this._$Ct=e,this._$AM=t,this._$Ci=s}_$AS(e,t){return this.update(e,t)}update(e,t){return this.render(...t)}};var fe=class extends Be{constructor(e){if(super(e),this.it=y,e.type!==Ht.CHILD)throw Error(this.constructor.directiveName+"() can only be used in child bindings")}render(e){if(e===y||e==null)return this._t=void 0,this.it=e;if(e===I)return e;if(typeof e!="string")throw Error(this.constructor.directiveName+"() called with a non-string value");if(e===this.it)return this._t;this.it=e;let t=[e];return t.raw=t,this._t={_$litType$:this.constructor.resultType,strings:t,values:[]}}};fe.directiveName="unsafeHTML",fe.resultType=1;var U=qt(fe);var ge=class{diff(e,t,s={}){let n;typeof s=="function"?(n=s,s={}):"callback"in s&&(n=s.callback);let i=this.castInput(e,s),r=this.castInput(t,s),a=this.removeEmpty(this.tokenize(i,s)),o=this.removeEmpty(this.tokenize(r,s));return this.diffWithOptionsObj(a,o,s,n)}diffWithOptionsObj(e,t,s,n){var i;let r=f=>{if(f=this.postProcess(f,s),n){setTimeout(function(){n(f)},0);return}else return f},a=t.length,o=e.length,c=1,h=a+o;s.maxEditLength!=null&&(h=Math.min(h,s.maxEditLength));let p=(i=s.timeout)!==null&&i!==void 0?i:1/0,d=Date.now()+p,m=[{oldPos:-1,lastComponent:void 0}],x=this.extractCommon(m[0],t,e,0,s);if(m[0].oldPos+1>=o&&x+1>=a)return r(this.buildValues(m[0].lastComponent,t,e));let w=-1/0,$=1/0,g=()=>{for(let f=Math.max(w,-c);f<=Math.min($,c);f+=2){let _,E=m[f-1],M=m[f+1];E&&(m[f-1]=void 0);let qe=!1;if(M){let gt=M.oldPos-f;qe=M&&0<=gt&&gt<a}let ft=E&&E.oldPos+1<o;if(!qe&&!ft){m[f]=void 0;continue}if(!ft||qe&&E.oldPos<M.oldPos?_=this.addToPath(M,!0,!1,0,s):_=this.addToPath(E,!1,!0,1,s),x=this.extractCommon(_,t,e,f,s),_.oldPos+1>=o&&x+1>=a)return r(this.buildValues(_.lastComponent,t,e))||!0;m[f]=_,_.oldPos+1>=o&&($=Math.min($,f-1)),x+1>=a&&(w=Math.max(w,f+1))}c++};if(n)(function f(){setTimeout(function(){if(c>h||Date.now()>d)return n(void 0);g()||f()},0)})();else for(;c<=h&&Date.now()<=d;){let f=g();if(f)return f}}addToPath(e,t,s,n,i){let r=e.lastComponent;return r&&!i.oneChangePerToken&&r.added===t&&r.removed===s?{oldPos:e.oldPos+n,lastComponent:{count:r.count+1,added:t,removed:s,previousComponent:r.previousComponent}}:{oldPos:e.oldPos+n,lastComponent:{count:1,added:t,removed:s,previousComponent:r}}}extractCommon(e,t,s,n,i){let r=t.length,a=s.length,o=e.oldPos,c=o-n,h=0;for(;c+1<r&&o+1<a&&this.equals(s[o+1],t[c+1],i);)c++,o++,h++,i.oneChangePerToken&&(e.lastComponent={count:1,previousComponent:e.lastComponent,added:!1,removed:!1});return h&&!i.oneChangePerToken&&(e.lastComponent={count:h,previousComponent:e.lastComponent,added:!1,removed:!1}),e.oldPos=o,c}equals(e,t,s){return s.comparator?s.comparator(e,t):e===t||!!s.ignoreCase&&e.toLowerCase()===t.toLowerCase()}removeEmpty(e){let t=[];for(let s=0;s<e.length;s++)e[s]&&t.push(e[s]);return t}castInput(e,t){return e}tokenize(e,t){return Array.from(e)}join(e){return e.join("")}postProcess(e,t){return e}get useLongestToken(){return!1}buildValues(e,t,s){let n=[],i;for(;e;)n.push(e),i=e.previousComponent,delete e.previousComponent,e=i;n.reverse();let r=n.length,a=0,o=0,c=0;for(;a<r;a++){let h=n[a];if(h.removed)h.value=this.join(s.slice(c,c+h.count)),c+=h.count;else{if(!h.added&&this.useLongestToken){let p=t.slice(o,o+h.count);p=p.map(function(d,m){let x=s[c+m];return x.length>d.length?x:d}),h.value=this.join(p)}else h.value=this.join(t.slice(o,o+h.count));o+=h.count,h.added||(c+=h.count)}}return n}};var it=class extends ge{constructor(){super(...arguments),this.tokenize=Ps}equals(e,t,s){return s.ignoreWhitespace?((!s.newlineIsToken||!e.includes(`
72
+ `))&&(e=e.trim()),(!s.newlineIsToken||!t.includes(`
73
+ `))&&(t=t.trim())):s.ignoreNewlineAtEof&&!s.newlineIsToken&&(e.endsWith(`
74
+ `)&&(e=e.slice(0,-1)),t.endsWith(`
75
+ `)&&(t=t.slice(0,-1))),super.equals(e,t,s)}},Ut=new it;function rt(l,e,t){return Ut.diff(l,e,t)}function Ps(l,e){e.stripTrailingCr&&(l=l.replace(/\r\n/g,`
76
+ `));let t=[],s=l.split(/(\n|\r\n)/);s[s.length-1]||s.pop();for(let n=0;n<s.length;n++){let i=s[n];n%2&&!e.newlineIsToken?t[t.length-1]+=i:t.push(i)}return t}function lt(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var G=lt();function Gt(l){G=l}var Zt=/[&<>"']/,As=new RegExp(Zt.source,"g"),Qt=/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,Rs=new RegExp(Qt.source,"g"),Ms={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},jt=l=>Ms[l];function C(l,e){if(e){if(Zt.test(l))return l.replace(As,jt)}else if(Qt.test(l))return l.replace(Rs,jt);return l}var Ls=/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig;function Is(l){return l.replace(Ls,(e,t)=>(t=t.toLowerCase(),t==="colon"?":":t.charAt(0)==="#"?t.charAt(1)==="x"?String.fromCharCode(parseInt(t.substring(2),16)):String.fromCharCode(+t.substring(1)):""))}var Ns=/(^|[^\[])\^/g;function k(l,e){let t=typeof l=="string"?l:l.source;e=e||"";let s={replace:(n,i)=>{let r=typeof i=="string"?i:i.source;return r=r.replace(Ns,"$1"),t=t.replace(n,r),s},getRegex:()=>new RegExp(t,e)};return s}function Wt(l){try{l=encodeURI(l).replace(/%25/g,"%")}catch{return null}return l}var xe={exec:()=>null};function Ft(l,e){let t=l.replace(/\|/g,(i,r,a)=>{let o=!1,c=r;for(;--c>=0&&a[c]==="\\";)o=!o;return o?"|":" |"}),s=t.split(/ \|/),n=0;if(s[0].trim()||s.shift(),s.length>0&&!s[s.length-1].trim()&&s.pop(),e)if(s.length>e)s.splice(e);else for(;s.length<e;)s.push("");for(;n<s.length;n++)s[n]=s[n].trim().replace(/\\\|/g,"|");return s}function Oe(l,e,t){let s=l.length;if(s===0)return"";let n=0;for(;n<s;){let i=l.charAt(s-n-1);if(i===e&&!t)n++;else if(i!==e&&t)n++;else break}return l.slice(0,s-n)}function Bs(l,e){if(l.indexOf(e[1])===-1)return-1;let t=0;for(let s=0;s<l.length;s++)if(l[s]==="\\")s++;else if(l[s]===e[0])t++;else if(l[s]===e[1]&&(t--,t<0))return s;return-1}function Jt(l,e,t,s){let n=e.href,i=e.title?C(e.title):null,r=l[1].replace(/\\([\[\]])/g,"$1");if(l[0].charAt(0)!=="!"){s.state.inLink=!0;let a={type:"link",raw:t,href:n,title:i,text:r,tokens:s.inlineTokens(r)};return s.state.inLink=!1,a}return{type:"image",raw:t,href:n,title:i,text:C(r)}}function Os(l,e){let t=l.match(/^(\s+)(?:```)/);if(t===null)return e;let s=t[1];return e.split(`
77
+ `).map(n=>{let i=n.match(/^\s+/);if(i===null)return n;let[r]=i;return r.length>=s.length?n.slice(s.length):n}).join(`
78
+ `)}var ee=class{options;rules;lexer;constructor(e){this.options=e||G}space(e){let t=this.rules.block.newline.exec(e);if(t&&t[0].length>0)return{type:"space",raw:t[0]}}code(e){let t=this.rules.block.code.exec(e);if(t){let s=t[0].replace(/^ {1,4}/gm,"");return{type:"code",raw:t[0],codeBlockStyle:"indented",text:this.options.pedantic?s:Oe(s,`
79
+ `)}}}fences(e){let t=this.rules.block.fences.exec(e);if(t){let s=t[0],n=Os(s,t[3]||"");return{type:"code",raw:s,lang:t[2]?t[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):t[2],text:n}}}heading(e){let t=this.rules.block.heading.exec(e);if(t){let s=t[2].trim();if(/#$/.test(s)){let n=Oe(s,"#");(this.options.pedantic||!n||/ $/.test(n))&&(s=n.trim())}return{type:"heading",raw:t[0],depth:t[1].length,text:s,tokens:this.lexer.inline(s)}}}hr(e){let t=this.rules.block.hr.exec(e);if(t)return{type:"hr",raw:t[0]}}blockquote(e){let t=this.rules.block.blockquote.exec(e);if(t){let s=t[0].replace(/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,`
80
+ $1`);s=Oe(s.replace(/^ *>[ \t]?/gm,""),`
81
+ `);let n=this.lexer.state.top;this.lexer.state.top=!0;let i=this.lexer.blockTokens(s);return this.lexer.state.top=n,{type:"blockquote",raw:t[0],tokens:i,text:s}}}list(e){let t=this.rules.block.list.exec(e);if(t){let s=t[1].trim(),n=s.length>1,i={type:"list",raw:"",ordered:n,start:n?+s.slice(0,-1):"",loose:!1,items:[]};s=n?`\\d{1,9}\\${s.slice(-1)}`:`\\${s}`,this.options.pedantic&&(s=n?s:"[*+-]");let r=new RegExp(`^( {0,3}${s})((?:[ ][^\\n]*)?(?:\\n|$))`),a="",o="",c=!1;for(;e;){let h=!1;if(!(t=r.exec(e))||this.rules.block.hr.test(e))break;a=t[0],e=e.substring(a.length);let p=t[2].split(`
82
+ `,1)[0].replace(/^\t+/,g=>" ".repeat(3*g.length)),d=e.split(`
83
+ `,1)[0],m=0;this.options.pedantic?(m=2,o=p.trimStart()):(m=t[2].search(/[^ ]/),m=m>4?1:m,o=p.slice(m),m+=t[1].length);let x=!1;if(!p&&/^ *$/.test(d)&&(a+=d+`
84
+ `,e=e.substring(d.length+1),h=!0),!h){let g=new RegExp(`^ {0,${Math.min(3,m-1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`),f=new RegExp(`^ {0,${Math.min(3,m-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`),_=new RegExp(`^ {0,${Math.min(3,m-1)}}(?:\`\`\`|~~~)`),E=new RegExp(`^ {0,${Math.min(3,m-1)}}#`);for(;e;){let M=e.split(`
85
+ `,1)[0];if(d=M,this.options.pedantic&&(d=d.replace(/^ {1,4}(?=( {4})*[^ ])/g," ")),_.test(d)||E.test(d)||g.test(d)||f.test(e))break;if(d.search(/[^ ]/)>=m||!d.trim())o+=`
86
+ `+d.slice(m);else{if(x||p.search(/[^ ]/)>=4||_.test(p)||E.test(p)||f.test(p))break;o+=`
87
+ `+d}!x&&!d.trim()&&(x=!0),a+=M+`
88
+ `,e=e.substring(M.length+1),p=d.slice(m)}}i.loose||(c?i.loose=!0:/\n *\n *$/.test(a)&&(c=!0));let w=null,$;this.options.gfm&&(w=/^\[[ xX]\] /.exec(o),w&&($=w[0]!=="[ ] ",o=o.replace(/^\[[ xX]\] +/,""))),i.items.push({type:"list_item",raw:a,task:!!w,checked:$,loose:!1,text:o,tokens:[]}),i.raw+=a}i.items[i.items.length-1].raw=a.trimEnd(),i.items[i.items.length-1].text=o.trimEnd(),i.raw=i.raw.trimEnd();for(let h=0;h<i.items.length;h++)if(this.lexer.state.top=!1,i.items[h].tokens=this.lexer.blockTokens(i.items[h].text,[]),!i.loose){let p=i.items[h].tokens.filter(m=>m.type==="space"),d=p.length>0&&p.some(m=>/\n.*\n/.test(m.raw));i.loose=d}if(i.loose)for(let h=0;h<i.items.length;h++)i.items[h].loose=!0;return i}}html(e){let t=this.rules.block.html.exec(e);if(t)return{type:"html",block:!0,raw:t[0],pre:t[1]==="pre"||t[1]==="script"||t[1]==="style",text:t[0]}}def(e){let t=this.rules.block.def.exec(e);if(t){let s=t[1].toLowerCase().replace(/\s+/g," "),n=t[2]?t[2].replace(/^<(.*)>$/,"$1").replace(this.rules.inline.anyPunctuation,"$1"):"",i=t[3]?t[3].substring(1,t[3].length-1).replace(this.rules.inline.anyPunctuation,"$1"):t[3];return{type:"def",tag:s,raw:t[0],href:n,title:i}}}table(e){let t=this.rules.block.table.exec(e);if(!t||!/[:|]/.test(t[2]))return;let s=Ft(t[1]),n=t[2].replace(/^\||\| *$/g,"").split("|"),i=t[3]&&t[3].trim()?t[3].replace(/\n[ \t]*$/,"").split(`
89
+ `):[],r={type:"table",raw:t[0],header:[],align:[],rows:[]};if(s.length===n.length){for(let a of n)/^ *-+: *$/.test(a)?r.align.push("right"):/^ *:-+: *$/.test(a)?r.align.push("center"):/^ *:-+ *$/.test(a)?r.align.push("left"):r.align.push(null);for(let a of s)r.header.push({text:a,tokens:this.lexer.inline(a)});for(let a of i)r.rows.push(Ft(a,r.header.length).map(o=>({text:o,tokens:this.lexer.inline(o)})));return r}}lheading(e){let t=this.rules.block.lheading.exec(e);if(t)return{type:"heading",raw:t[0],depth:t[2].charAt(0)==="="?1:2,text:t[1],tokens:this.lexer.inline(t[1])}}paragraph(e){let t=this.rules.block.paragraph.exec(e);if(t){let s=t[1].charAt(t[1].length-1)===`
90
+ `?t[1].slice(0,-1):t[1];return{type:"paragraph",raw:t[0],text:s,tokens:this.lexer.inline(s)}}}text(e){let t=this.rules.block.text.exec(e);if(t)return{type:"text",raw:t[0],text:t[0],tokens:this.lexer.inline(t[0])}}escape(e){let t=this.rules.inline.escape.exec(e);if(t)return{type:"escape",raw:t[0],text:C(t[1])}}tag(e){let t=this.rules.inline.tag.exec(e);if(t)return!this.lexer.state.inLink&&/^<a /i.test(t[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&/^<\/a>/i.test(t[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&/^<(pre|code|kbd|script)(\s|>)/i.test(t[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&/^<\/(pre|code|kbd|script)(\s|>)/i.test(t[0])&&(this.lexer.state.inRawBlock=!1),{type:"html",raw:t[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:t[0]}}link(e){let t=this.rules.inline.link.exec(e);if(t){let s=t[2].trim();if(!this.options.pedantic&&/^</.test(s)){if(!/>$/.test(s))return;let r=Oe(s.slice(0,-1),"\\");if((s.length-r.length)%2===0)return}else{let r=Bs(t[2],"()");if(r>-1){let o=(t[0].indexOf("!")===0?5:4)+t[1].length+r;t[2]=t[2].substring(0,r),t[0]=t[0].substring(0,o).trim(),t[3]=""}}let n=t[2],i="";if(this.options.pedantic){let r=/^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(n);r&&(n=r[1],i=r[3])}else i=t[3]?t[3].slice(1,-1):"";return n=n.trim(),/^</.test(n)&&(this.options.pedantic&&!/>$/.test(s)?n=n.slice(1):n=n.slice(1,-1)),Jt(t,{href:n&&n.replace(this.rules.inline.anyPunctuation,"$1"),title:i&&i.replace(this.rules.inline.anyPunctuation,"$1")},t[0],this.lexer)}}reflink(e,t){let s;if((s=this.rules.inline.reflink.exec(e))||(s=this.rules.inline.nolink.exec(e))){let n=(s[2]||s[1]).replace(/\s+/g," "),i=t[n.toLowerCase()];if(!i){let r=s[0].charAt(0);return{type:"text",raw:r,text:r}}return Jt(s,i,s[0],this.lexer)}}emStrong(e,t,s=""){let n=this.rules.inline.emStrongLDelim.exec(e);if(!n||n[3]&&s.match(/[\p{L}\p{N}]/u))return;if(!(n[1]||n[2]||"")||!s||this.rules.inline.punctuation.exec(s)){let r=[...n[0]].length-1,a,o,c=r,h=0,p=n[0][0]==="*"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(p.lastIndex=0,t=t.slice(-1*e.length+r);(n=p.exec(t))!=null;){if(a=n[1]||n[2]||n[3]||n[4]||n[5]||n[6],!a)continue;if(o=[...a].length,n[3]||n[4]){c+=o;continue}else if((n[5]||n[6])&&r%3&&!((r+o)%3)){h+=o;continue}if(c-=o,c>0)continue;o=Math.min(o,o+c+h);let d=[...n[0]][0].length,m=e.slice(0,r+n.index+d+o);if(Math.min(r,o)%2){let w=m.slice(1,-1);return{type:"em",raw:m,text:w,tokens:this.lexer.inlineTokens(w)}}let x=m.slice(2,-2);return{type:"strong",raw:m,text:x,tokens:this.lexer.inlineTokens(x)}}}}codespan(e){let t=this.rules.inline.code.exec(e);if(t){let s=t[2].replace(/\n/g," "),n=/[^ ]/.test(s),i=/^ /.test(s)&&/ $/.test(s);return n&&i&&(s=s.substring(1,s.length-1)),s=C(s,!0),{type:"codespan",raw:t[0],text:s}}}br(e){let t=this.rules.inline.br.exec(e);if(t)return{type:"br",raw:t[0]}}del(e){let t=this.rules.inline.del.exec(e);if(t)return{type:"del",raw:t[0],text:t[2],tokens:this.lexer.inlineTokens(t[2])}}autolink(e){let t=this.rules.inline.autolink.exec(e);if(t){let s,n;return t[2]==="@"?(s=C(t[1]),n="mailto:"+s):(s=C(t[1]),n=s),{type:"link",raw:t[0],text:s,href:n,tokens:[{type:"text",raw:s,text:s}]}}}url(e){let t;if(t=this.rules.inline.url.exec(e)){let s,n;if(t[2]==="@")s=C(t[0]),n="mailto:"+s;else{let i;do i=t[0],t[0]=this.rules.inline._backpedal.exec(t[0])?.[0]??"";while(i!==t[0]);s=C(t[0]),t[1]==="www."?n="http://"+t[0]:n=t[0]}return{type:"link",raw:t[0],text:s,href:n,tokens:[{type:"text",raw:s,text:s}]}}}inlineText(e){let t=this.rules.inline.text.exec(e);if(t){let s;return this.lexer.state.inRawBlock?s=t[0]:s=C(t[0]),{type:"text",raw:t[0],text:s}}}},zs=/^(?: *(?:\n|$))+/,Ds=/^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/,Hs=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,ke=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,qs=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,Kt=/(?:[*+-]|\d{1,9}[.)])/,Xt=k(/^(?!bull |blockCode|fences|blockquote|heading|html)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html))+?)\n {0,3}(=+|-+) *(?:\n+|$)/).replace(/bull/g,Kt).replace(/blockCode/g,/ {4}/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).getRegex(),ct=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,Us=/^[^\n]+/,ht=/(?!\s*\])(?:\\.|[^\[\]\\])+/,js=k(/^ {0,3}\[(label)\]: *(?:\n *)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n *)?| *\n *)(title))? *(?:\n+|$)/).replace("label",ht).replace("title",/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),Ws=k(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g,Kt).getRegex(),He="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",pt=/<!--(?:-?>|[\s\S]*?(?:-->|$))/,Fs=k("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|<![A-Z][\\s\\S]*?(?:>\\n*|$)|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>\\n*|$)|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:(?:\\n *)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)|</(?!script|pre|style|textarea)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$))","i").replace("comment",pt).replace("tag",He).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),Yt=k(ct).replace("hr",ke).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",He).getRegex(),Js=k(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph",Yt).getRegex(),ut={blockquote:Js,code:Ds,def:js,fences:Hs,heading:qs,hr:ke,html:Fs,lheading:Xt,list:Ws,newline:zs,paragraph:Yt,table:xe,text:Us},Vt=k("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr",ke).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("blockquote"," {0,3}>").replace("code"," {4}[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",He).getRegex(),Vs={...ut,table:Vt,paragraph:k(ct).replace("hr",ke).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("table",Vt).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",He).getRegex()},Gs={...ut,html:k(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)|<tag(?:"[^"]*"|'[^']*'|\\s[^'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment",pt).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:xe,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:k(ct).replace("hr",ke).replace("heading",` *#{1,6} *[^
91
+ ]`).replace("lheading",Xt).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()},es=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,Zs=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,ts=/^( {2,}|\\)\n(?!\s*$)/,Qs=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/,we="\\p{P}\\p{S}",Ks=k(/^((?![*_])[\spunctuation])/,"u").replace(/punctuation/g,we).getRegex(),Xs=/\[[^[\]]*?\]\([^\(\)]*?\)|`[^`]*?`|<[^<>]*?>/g,Ys=k(/^(?:\*+(?:((?!\*)[punct])|[^\s*]))|^_+(?:((?!_)[punct])|([^\s_]))/,"u").replace(/punct/g,we).getRegex(),en=k("^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)[punct](\\*+)(?=[\\s]|$)|[^punct\\s](\\*+)(?!\\*)(?=[punct\\s]|$)|(?!\\*)[punct\\s](\\*+)(?=[^punct\\s])|[\\s](\\*+)(?!\\*)(?=[punct])|(?!\\*)[punct](\\*+)(?!\\*)(?=[punct])|[^punct\\s](\\*+)(?=[^punct\\s])","gu").replace(/punct/g,we).getRegex(),tn=k("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)[punct](_+)(?=[\\s]|$)|[^punct\\s](_+)(?!_)(?=[punct\\s]|$)|(?!_)[punct\\s](_+)(?=[^punct\\s])|[\\s](_+)(?!_)(?=[punct])|(?!_)[punct](_+)(?!_)(?=[punct])","gu").replace(/punct/g,we).getRegex(),sn=k(/\\([punct])/,"gu").replace(/punct/g,we).getRegex(),nn=k(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),rn=k(pt).replace("(?:-->|$)","-->").getRegex(),on=k("^comment|^</[a-zA-Z][\\w:-]*\\s*>|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^<![a-zA-Z]+\\s[\\s\\S]*?>|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>").replace("comment",rn).replace("attribute",/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),De=/(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/,an=k(/^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/).replace("label",De).replace("href",/<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/).replace("title",/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),ss=k(/^!?\[(label)\]\[(ref)\]/).replace("label",De).replace("ref",ht).getRegex(),ns=k(/^!?\[(ref)\](?:\[\])?/).replace("ref",ht).getRegex(),ln=k("reflink|nolink(?!\\()","g").replace("reflink",ss).replace("nolink",ns).getRegex(),dt={_backpedal:xe,anyPunctuation:sn,autolink:nn,blockSkip:Xs,br:ts,code:Zs,del:xe,emStrongLDelim:Ys,emStrongRDelimAst:en,emStrongRDelimUnd:tn,escape:es,link:an,nolink:ns,punctuation:Ks,reflink:ss,reflinkSearch:ln,tag:on,text:Qs,url:xe},cn={...dt,link:k(/^!?\[(label)\]\((.*?)\)/).replace("label",De).getRegex(),reflink:k(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",De).getRegex()},ot={...dt,escape:k(es).replace("])","~|])").getRegex(),url:k(/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,"i").replace("email",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/,text:/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|https?:\/\/|ftp:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)))/},hn={...ot,br:k(ts).replace("{2,}","*").getRegex(),text:k(ot.text).replace("\\b_","\\b_| {2,}\\n").replace(/\{2,\}/g,"*").getRegex()},ze={normal:ut,gfm:Vs,pedantic:Gs},ve={normal:dt,gfm:ot,breaks:hn,pedantic:cn},N=class l{tokens;options;state;tokenizer;inlineQueue;constructor(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||G,this.options.tokenizer=this.options.tokenizer||new ee,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};let t={block:ze.normal,inline:ve.normal};this.options.pedantic?(t.block=ze.pedantic,t.inline=ve.pedantic):this.options.gfm&&(t.block=ze.gfm,this.options.breaks?t.inline=ve.breaks:t.inline=ve.gfm),this.tokenizer.rules=t}static get rules(){return{block:ze,inline:ve}}static lex(e,t){return new l(t).lex(e)}static lexInline(e,t){return new l(t).inlineTokens(e)}lex(e){e=e.replace(/\r\n|\r/g,`
92
+ `),this.blockTokens(e,this.tokens);for(let t=0;t<this.inlineQueue.length;t++){let s=this.inlineQueue[t];this.inlineTokens(s.src,s.tokens)}return this.inlineQueue=[],this.tokens}blockTokens(e,t=[]){this.options.pedantic?e=e.replace(/\t/g," ").replace(/^ +$/gm,""):e=e.replace(/^( *)(\t+)/gm,(a,o,c)=>o+" ".repeat(c.length));let s,n,i,r;for(;e;)if(!(this.options.extensions&&this.options.extensions.block&&this.options.extensions.block.some(a=>(s=a.call({lexer:this},e,t))?(e=e.substring(s.raw.length),t.push(s),!0):!1))){if(s=this.tokenizer.space(e)){e=e.substring(s.raw.length),s.raw.length===1&&t.length>0?t[t.length-1].raw+=`
93
+ `:t.push(s);continue}if(s=this.tokenizer.code(e)){e=e.substring(s.raw.length),n=t[t.length-1],n&&(n.type==="paragraph"||n.type==="text")?(n.raw+=`
94
+ `+s.raw,n.text+=`
95
+ `+s.text,this.inlineQueue[this.inlineQueue.length-1].src=n.text):t.push(s);continue}if(s=this.tokenizer.fences(e)){e=e.substring(s.raw.length),t.push(s);continue}if(s=this.tokenizer.heading(e)){e=e.substring(s.raw.length),t.push(s);continue}if(s=this.tokenizer.hr(e)){e=e.substring(s.raw.length),t.push(s);continue}if(s=this.tokenizer.blockquote(e)){e=e.substring(s.raw.length),t.push(s);continue}if(s=this.tokenizer.list(e)){e=e.substring(s.raw.length),t.push(s);continue}if(s=this.tokenizer.html(e)){e=e.substring(s.raw.length),t.push(s);continue}if(s=this.tokenizer.def(e)){e=e.substring(s.raw.length),n=t[t.length-1],n&&(n.type==="paragraph"||n.type==="text")?(n.raw+=`
96
+ `+s.raw,n.text+=`
97
+ `+s.raw,this.inlineQueue[this.inlineQueue.length-1].src=n.text):this.tokens.links[s.tag]||(this.tokens.links[s.tag]={href:s.href,title:s.title});continue}if(s=this.tokenizer.table(e)){e=e.substring(s.raw.length),t.push(s);continue}if(s=this.tokenizer.lheading(e)){e=e.substring(s.raw.length),t.push(s);continue}if(i=e,this.options.extensions&&this.options.extensions.startBlock){let a=1/0,o=e.slice(1),c;this.options.extensions.startBlock.forEach(h=>{c=h.call({lexer:this},o),typeof c=="number"&&c>=0&&(a=Math.min(a,c))}),a<1/0&&a>=0&&(i=e.substring(0,a+1))}if(this.state.top&&(s=this.tokenizer.paragraph(i))){n=t[t.length-1],r&&n.type==="paragraph"?(n.raw+=`
98
+ `+s.raw,n.text+=`
99
+ `+s.text,this.inlineQueue.pop(),this.inlineQueue[this.inlineQueue.length-1].src=n.text):t.push(s),r=i.length!==e.length,e=e.substring(s.raw.length);continue}if(s=this.tokenizer.text(e)){e=e.substring(s.raw.length),n=t[t.length-1],n&&n.type==="text"?(n.raw+=`
100
+ `+s.raw,n.text+=`
101
+ `+s.text,this.inlineQueue.pop(),this.inlineQueue[this.inlineQueue.length-1].src=n.text):t.push(s);continue}if(e){let a="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(a);break}else throw new Error(a)}}return this.state.top=!0,t}inline(e,t=[]){return this.inlineQueue.push({src:e,tokens:t}),t}inlineTokens(e,t=[]){let s,n,i,r=e,a,o,c;if(this.tokens.links){let h=Object.keys(this.tokens.links);if(h.length>0)for(;(a=this.tokenizer.rules.inline.reflinkSearch.exec(r))!=null;)h.includes(a[0].slice(a[0].lastIndexOf("[")+1,-1))&&(r=r.slice(0,a.index)+"["+"a".repeat(a[0].length-2)+"]"+r.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;(a=this.tokenizer.rules.inline.blockSkip.exec(r))!=null;)r=r.slice(0,a.index)+"["+"a".repeat(a[0].length-2)+"]"+r.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);for(;(a=this.tokenizer.rules.inline.anyPunctuation.exec(r))!=null;)r=r.slice(0,a.index)+"++"+r.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);for(;e;)if(o||(c=""),o=!1,!(this.options.extensions&&this.options.extensions.inline&&this.options.extensions.inline.some(h=>(s=h.call({lexer:this},e,t))?(e=e.substring(s.raw.length),t.push(s),!0):!1))){if(s=this.tokenizer.escape(e)){e=e.substring(s.raw.length),t.push(s);continue}if(s=this.tokenizer.tag(e)){e=e.substring(s.raw.length),n=t[t.length-1],n&&s.type==="text"&&n.type==="text"?(n.raw+=s.raw,n.text+=s.text):t.push(s);continue}if(s=this.tokenizer.link(e)){e=e.substring(s.raw.length),t.push(s);continue}if(s=this.tokenizer.reflink(e,this.tokens.links)){e=e.substring(s.raw.length),n=t[t.length-1],n&&s.type==="text"&&n.type==="text"?(n.raw+=s.raw,n.text+=s.text):t.push(s);continue}if(s=this.tokenizer.emStrong(e,r,c)){e=e.substring(s.raw.length),t.push(s);continue}if(s=this.tokenizer.codespan(e)){e=e.substring(s.raw.length),t.push(s);continue}if(s=this.tokenizer.br(e)){e=e.substring(s.raw.length),t.push(s);continue}if(s=this.tokenizer.del(e)){e=e.substring(s.raw.length),t.push(s);continue}if(s=this.tokenizer.autolink(e)){e=e.substring(s.raw.length),t.push(s);continue}if(!this.state.inLink&&(s=this.tokenizer.url(e))){e=e.substring(s.raw.length),t.push(s);continue}if(i=e,this.options.extensions&&this.options.extensions.startInline){let h=1/0,p=e.slice(1),d;this.options.extensions.startInline.forEach(m=>{d=m.call({lexer:this},p),typeof d=="number"&&d>=0&&(h=Math.min(h,d))}),h<1/0&&h>=0&&(i=e.substring(0,h+1))}if(s=this.tokenizer.inlineText(i)){e=e.substring(s.raw.length),s.raw.slice(-1)!=="_"&&(c=s.raw.slice(-1)),o=!0,n=t[t.length-1],n&&n.type==="text"?(n.raw+=s.raw,n.text+=s.text):t.push(s);continue}if(e){let h="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(h);break}else throw new Error(h)}}return t}},te=class{options;constructor(e){this.options=e||G}code(e,t,s){let n=(t||"").match(/^\S*/)?.[0];return e=e.replace(/\n$/,"")+`
102
+ `,n?'<pre><code class="language-'+C(n)+'">'+(s?e:C(e,!0))+`</code></pre>
103
+ `:"<pre><code>"+(s?e:C(e,!0))+`</code></pre>
104
+ `}blockquote(e){return`<blockquote>
105
+ ${e}</blockquote>
106
+ `}html(e,t){return e}heading(e,t,s){return`<h${t}>${e}</h${t}>
107
+ `}hr(){return`<hr>
108
+ `}list(e,t,s){let n=t?"ol":"ul",i=t&&s!==1?' start="'+s+'"':"";return"<"+n+i+`>
109
+ `+e+"</"+n+`>
110
+ `}listitem(e,t,s){return`<li>${e}</li>
111
+ `}checkbox(e){return"<input "+(e?'checked="" ':"")+'disabled="" type="checkbox">'}paragraph(e){return`<p>${e}</p>
112
+ `}table(e,t){return t&&(t=`<tbody>${t}</tbody>`),`<table>
113
+ <thead>
114
+ `+e+`</thead>
115
+ `+t+`</table>
116
+ `}tablerow(e){return`<tr>
117
+ ${e}</tr>
118
+ `}tablecell(e,t){let s=t.header?"th":"td";return(t.align?`<${s} align="${t.align}">`:`<${s}>`)+e+`</${s}>
119
+ `}strong(e){return`<strong>${e}</strong>`}em(e){return`<em>${e}</em>`}codespan(e){return`<code>${e}</code>`}br(){return"<br>"}del(e){return`<del>${e}</del>`}link(e,t,s){let n=Wt(e);if(n===null)return s;e=n;let i='<a href="'+e+'"';return t&&(i+=' title="'+t+'"'),i+=">"+s+"</a>",i}image(e,t,s){let n=Wt(e);if(n===null)return s;e=n;let i=`<img src="${e}" alt="${s}"`;return t&&(i+=` title="${t}"`),i+=">",i}text(e){return e}},be=class{strong(e){return e}em(e){return e}codespan(e){return e}del(e){return e}html(e){return e}text(e){return e}link(e,t,s){return""+s}image(e,t,s){return""+s}br(){return""}},B=class l{options;renderer;textRenderer;constructor(e){this.options=e||G,this.options.renderer=this.options.renderer||new te,this.renderer=this.options.renderer,this.renderer.options=this.options,this.textRenderer=new be}static parse(e,t){return new l(t).parse(e)}static parseInline(e,t){return new l(t).parseInline(e)}parse(e,t=!0){let s="";for(let n=0;n<e.length;n++){let i=e[n];if(this.options.extensions&&this.options.extensions.renderers&&this.options.extensions.renderers[i.type]){let r=i,a=this.options.extensions.renderers[r.type].call({parser:this},r);if(a!==!1||!["space","hr","heading","code","table","blockquote","list","html","paragraph","text"].includes(r.type)){s+=a||"";continue}}switch(i.type){case"space":continue;case"hr":{s+=this.renderer.hr();continue}case"heading":{let r=i;s+=this.renderer.heading(this.parseInline(r.tokens),r.depth,Is(this.parseInline(r.tokens,this.textRenderer)));continue}case"code":{let r=i;s+=this.renderer.code(r.text,r.lang,!!r.escaped);continue}case"table":{let r=i,a="",o="";for(let h=0;h<r.header.length;h++)o+=this.renderer.tablecell(this.parseInline(r.header[h].tokens),{header:!0,align:r.align[h]});a+=this.renderer.tablerow(o);let c="";for(let h=0;h<r.rows.length;h++){let p=r.rows[h];o="";for(let d=0;d<p.length;d++)o+=this.renderer.tablecell(this.parseInline(p[d].tokens),{header:!1,align:r.align[d]});c+=this.renderer.tablerow(o)}s+=this.renderer.table(a,c);continue}case"blockquote":{let r=i,a=this.parse(r.tokens);s+=this.renderer.blockquote(a);continue}case"list":{let r=i,a=r.ordered,o=r.start,c=r.loose,h="";for(let p=0;p<r.items.length;p++){let d=r.items[p],m=d.checked,x=d.task,w="";if(d.task){let $=this.renderer.checkbox(!!m);c?d.tokens.length>0&&d.tokens[0].type==="paragraph"?(d.tokens[0].text=$+" "+d.tokens[0].text,d.tokens[0].tokens&&d.tokens[0].tokens.length>0&&d.tokens[0].tokens[0].type==="text"&&(d.tokens[0].tokens[0].text=$+" "+d.tokens[0].tokens[0].text)):d.tokens.unshift({type:"text",text:$+" "}):w+=$+" "}w+=this.parse(d.tokens,c),h+=this.renderer.listitem(w,x,!!m)}s+=this.renderer.list(h,a,o);continue}case"html":{let r=i;s+=this.renderer.html(r.text,r.block);continue}case"paragraph":{let r=i;s+=this.renderer.paragraph(this.parseInline(r.tokens));continue}case"text":{let r=i,a=r.tokens?this.parseInline(r.tokens):r.text;for(;n+1<e.length&&e[n+1].type==="text";)r=e[++n],a+=`
120
+ `+(r.tokens?this.parseInline(r.tokens):r.text);s+=t?this.renderer.paragraph(a):a;continue}default:{let r='Token with "'+i.type+'" type was not found.';if(this.options.silent)return console.error(r),"";throw new Error(r)}}}return s}parseInline(e,t){t=t||this.renderer;let s="";for(let n=0;n<e.length;n++){let i=e[n];if(this.options.extensions&&this.options.extensions.renderers&&this.options.extensions.renderers[i.type]){let r=this.options.extensions.renderers[i.type].call({parser:this},i);if(r!==!1||!["escape","html","link","image","strong","em","codespan","br","del","text"].includes(i.type)){s+=r||"";continue}}switch(i.type){case"escape":{let r=i;s+=t.text(r.text);break}case"html":{let r=i;s+=t.html(r.text);break}case"link":{let r=i;s+=t.link(r.href,r.title,this.parseInline(r.tokens,t));break}case"image":{let r=i;s+=t.image(r.href,r.title,r.text);break}case"strong":{let r=i;s+=t.strong(this.parseInline(r.tokens,t));break}case"em":{let r=i;s+=t.em(this.parseInline(r.tokens,t));break}case"codespan":{let r=i;s+=t.codespan(r.text);break}case"br":{s+=t.br();break}case"del":{let r=i;s+=t.del(this.parseInline(r.tokens,t));break}case"text":{let r=i;s+=t.text(r.text);break}default:{let r='Token with "'+i.type+'" type was not found.';if(this.options.silent)return console.error(r),"";throw new Error(r)}}}return s}},Y=class{options;constructor(e){this.options=e||G}static passThroughHooks=new Set(["preprocess","postprocess","processAllTokens"]);preprocess(e){return e}postprocess(e){return e}processAllTokens(e){return e}},at=class{defaults=lt();options=this.setOptions;parse=this.#e(N.lex,B.parse);parseInline=this.#e(N.lexInline,B.parseInline);Parser=B;Renderer=te;TextRenderer=be;Lexer=N;Tokenizer=ee;Hooks=Y;constructor(...e){this.use(...e)}walkTokens(e,t){let s=[];for(let n of e)switch(s=s.concat(t.call(this,n)),n.type){case"table":{let i=n;for(let r of i.header)s=s.concat(this.walkTokens(r.tokens,t));for(let r of i.rows)for(let a of r)s=s.concat(this.walkTokens(a.tokens,t));break}case"list":{let i=n;s=s.concat(this.walkTokens(i.items,t));break}default:{let i=n;this.defaults.extensions?.childTokens?.[i.type]?this.defaults.extensions.childTokens[i.type].forEach(r=>{let a=i[r].flat(1/0);s=s.concat(this.walkTokens(a,t))}):i.tokens&&(s=s.concat(this.walkTokens(i.tokens,t)))}}return s}use(...e){let t=this.defaults.extensions||{renderers:{},childTokens:{}};return e.forEach(s=>{let n={...s};if(n.async=this.defaults.async||n.async||!1,s.extensions&&(s.extensions.forEach(i=>{if(!i.name)throw new Error("extension name required");if("renderer"in i){let r=t.renderers[i.name];r?t.renderers[i.name]=function(...a){let o=i.renderer.apply(this,a);return o===!1&&(o=r.apply(this,a)),o}:t.renderers[i.name]=i.renderer}if("tokenizer"in i){if(!i.level||i.level!=="block"&&i.level!=="inline")throw new Error("extension level must be 'block' or 'inline'");let r=t[i.level];r?r.unshift(i.tokenizer):t[i.level]=[i.tokenizer],i.start&&(i.level==="block"?t.startBlock?t.startBlock.push(i.start):t.startBlock=[i.start]:i.level==="inline"&&(t.startInline?t.startInline.push(i.start):t.startInline=[i.start]))}"childTokens"in i&&i.childTokens&&(t.childTokens[i.name]=i.childTokens)}),n.extensions=t),s.renderer){let i=this.defaults.renderer||new te(this.defaults);for(let r in s.renderer){if(!(r in i))throw new Error(`renderer '${r}' does not exist`);if(r==="options")continue;let a=r,o=s.renderer[a],c=i[a];i[a]=(...h)=>{let p=o.apply(i,h);return p===!1&&(p=c.apply(i,h)),p||""}}n.renderer=i}if(s.tokenizer){let i=this.defaults.tokenizer||new ee(this.defaults);for(let r in s.tokenizer){if(!(r in i))throw new Error(`tokenizer '${r}' does not exist`);if(["options","rules","lexer"].includes(r))continue;let a=r,o=s.tokenizer[a],c=i[a];i[a]=(...h)=>{let p=o.apply(i,h);return p===!1&&(p=c.apply(i,h)),p}}n.tokenizer=i}if(s.hooks){let i=this.defaults.hooks||new Y;for(let r in s.hooks){if(!(r in i))throw new Error(`hook '${r}' does not exist`);if(r==="options")continue;let a=r,o=s.hooks[a],c=i[a];Y.passThroughHooks.has(r)?i[a]=h=>{if(this.defaults.async)return Promise.resolve(o.call(i,h)).then(d=>c.call(i,d));let p=o.call(i,h);return c.call(i,p)}:i[a]=(...h)=>{let p=o.apply(i,h);return p===!1&&(p=c.apply(i,h)),p}}n.hooks=i}if(s.walkTokens){let i=this.defaults.walkTokens,r=s.walkTokens;n.walkTokens=function(a){let o=[];return o.push(r.call(this,a)),i&&(o=o.concat(i.call(this,a))),o}}this.defaults={...this.defaults,...n}}),this}setOptions(e){return this.defaults={...this.defaults,...e},this}lexer(e,t){return N.lex(e,t??this.defaults)}parser(e,t){return B.parse(e,t??this.defaults)}#e(e,t){return(s,n)=>{let i={...n},r={...this.defaults,...i};this.defaults.async===!0&&i.async===!1&&(r.silent||console.warn("marked(): The async option was set to true by an extension. The async: false option sent to parse will be ignored."),r.async=!0);let a=this.#t(!!r.silent,!!r.async);if(typeof s>"u"||s===null)return a(new Error("marked(): input parameter is undefined or null"));if(typeof s!="string")return a(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(s)+", string expected"));if(r.hooks&&(r.hooks.options=r),r.async)return Promise.resolve(r.hooks?r.hooks.preprocess(s):s).then(o=>e(o,r)).then(o=>r.hooks?r.hooks.processAllTokens(o):o).then(o=>r.walkTokens?Promise.all(this.walkTokens(o,r.walkTokens)).then(()=>o):o).then(o=>t(o,r)).then(o=>r.hooks?r.hooks.postprocess(o):o).catch(a);try{r.hooks&&(s=r.hooks.preprocess(s));let o=e(s,r);r.hooks&&(o=r.hooks.processAllTokens(o)),r.walkTokens&&this.walkTokens(o,r.walkTokens);let c=t(o,r);return r.hooks&&(c=r.hooks.postprocess(c)),c}catch(o){return a(o)}}}#t(e,t){return s=>{if(s.message+=`
121
+ Please report this to https://github.com/markedjs/marked.`,e){let n="<p>An error occurred:</p><pre>"+C(s.message+"",!0)+"</pre>";return t?Promise.resolve(n):n}if(t)return Promise.reject(s);throw s}}},V=new at;function v(l,e){return V.parse(l,e)}v.options=v.setOptions=function(l){return V.setOptions(l),v.defaults=V.defaults,Gt(v.defaults),v};v.getDefaults=lt;v.defaults=G;v.use=function(...l){return V.use(...l),v.defaults=V.defaults,Gt(v.defaults),v};v.walkTokens=function(l,e){return V.walkTokens(l,e)};v.parseInline=V.parseInline;v.Parser=B;v.parser=B.parse;v.Renderer=te;v.TextRenderer=be;v.Lexer=N;v.lexer=N.lex;v.Tokenizer=ee;v.Hooks=Y;v.parse=v;var qi=v.options,Ui=v.setOptions,ji=v.use,Wi=v.walkTokens,Fi=v.parseInline;var Ji=B.parse,Vi=N.lex;v.setOptions({gfm:!0,breaks:!0});function is(l){return l.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function O(l){if(!l)return"";try{let e=is(l);return v(e)}catch(e){return console.warn("Failed to parse markdown:",e),is(l).replace(/\n/g,"<br>")}}var ye=class extends P{constructor(){super(...arguments);this.conversations=[]}createRenderRoot(){return this}handleToggle(t,s={}){let{type:n="content",targetSelector:i,toggleSelector:r,customHandler:a}=s,o=t.currentTarget;if(n==="write"){let p=o.previousElementSibling;p&&(!p.classList.contains("hidden")?(p.classList.add("hidden"),o.classList.remove("hidden")):(p.classList.remove("hidden"),o.classList.add("hidden")));return}let c=i?o.querySelector(i):o.nextElementSibling,h=r?o.querySelector(r):o.querySelector("span:first-child");if(c){let p=c.classList.contains("hidden");a?a(c,p):(c.classList.toggle("hidden",!p),h&&(h.textContent=p?"[-]":"[+]"))}}toggleContent(t){this.handleToggle(t)}toggleWriteContent(t){this.handleToggle(t,{type:"write"})}formatContent(t,s){return typeof t=="string"?this.formatStringContent(t):Array.isArray(t)?u`
122
+ ${t.map(n=>{if(n.type==="text")return this.formatStringContent(n.text);if(n.type==="thinking")return u`
123
+ <div class="mt-4 mb-4">
124
+ <div class="text-gray-500 italic">
125
+ <em>Thinking</em>
126
+ </div>
127
+ <div class="text-gray-400 mt-2 markdown-content">
128
+ ${U(O(n.thinking||""))}
129
+ </div>
130
+ </div>
131
+ `;if(n.type==="tool_result")return u``;if(n.type==="tool_use"){let r=s?.[n.id];if(n.name==="TodoWrite"||n.name==="Edit"||n.name==="MultiEdit")return this.renderToolContainer(n,r);if(n.name==="Write"){let a=u`
132
+ <div class="bg-vs-bg-secondary p-4 text-vs-text hidden">
133
+ ${this.renderToolUseContent(n)}
134
+ </div>
135
+ <div
136
+ class="bg-vs-bg-secondary mx-4 p-4 text-vs-text cursor-pointer hover:bg-vs-border transition-colors"
137
+ @click=${this.toggleWriteContent}
138
+ >
139
+ ${this.renderWritePreview(n)}
140
+ </div>
141
+ `;return u`
142
+ <div class="mt-4 mb-4">
143
+ <div class="text-vs-type px-4 break-all">${this.getToolDisplayName(n)}</div>
144
+ ${a} ${r?this.renderToolResult(r,n):""}
145
+ </div>
146
+ `}return this.renderToolContainer(n,r,{isCollapsible:!0,isCollapsed:!0,isClickToExpand:!0})}return u`<pre class="mb-4">${JSON.stringify(n,null,2)}</pre>`})}
147
+ `:u`<pre>${JSON.stringify(t,null,2)}</pre>`}formatStringContent(t){let s=/&lt;system-reminder&gt;([\s\S]*?)&lt;\/system-reminder&gt;/g,n=/<system-reminder>([\s\S]*?)<\/system-reminder>/g,i=[],r;for(;(r=s.exec(t))!==null;)i.push(r[1].trim());for(;(r=n.exec(t))!==null;)i.push(r[1].trim());let a=t.replace(s,"").replace(n,"").trim();return u`
148
+ ${a?u`<div class="mt-4 markdown-content">${U(O(a))}</div>`:""}
149
+ ${i.length>0?this.renderCollapsibleSection("System Reminder",u`<div class="text-vs-muted">
150
+ ${i.map((o,c)=>u`
151
+ <div class="mb-4">
152
+ ${i.length>1?u`<div class="text-vs-function font-bold mb-2">Reminder ${c+1}:</div>`:""}
153
+ <div class="markdown-content">${U(O(o))}</div>
154
+ </div>
155
+ `)}
156
+ </div>`,{titleClasses:"text-vs-muted",containerClasses:"mt-4 mb-4",count:i.length>1?i.length:void 0}):""}
157
+ `}formatSystem(t){if(!t)return"";if(typeof t=="string")return O(t);if(Array.isArray(t)){let s=t.map(n=>n.type==="text"?n.text:JSON.stringify(n,null,2)).join(`
158
+ `);return O(s)}return JSON.stringify(t,null,2)}formatResponseContent(t){return t?t.content&&Array.isArray(t.content)?u`
159
+ ${t.content.map(s=>s.type==="text"?u`<div class="mt-4 markdown-content">${U(O(s.text))}</div>`:s.type==="thinking"?u`
160
+ <div class="mt-4 mb-4">
161
+ <div class="text-gray-500 italic">
162
+ <em>Thinking</em>
163
+ </div>
164
+ <div class="text-gray-400 mt-2 markdown-content">
165
+ ${U(O(s.thinking||""))}
166
+ </div>
167
+ </div>
168
+ `:s.type==="tool_use"?s.name==="TodoWrite"?u`
169
+ <div class="mt-4 mb-4">
170
+ <div class="text-vs-type px-4 break-all">${this.getToolDisplayName(s)}</div>
171
+ <div class="bg-vs-bg-secondary mx-4 p-4 text-vs-text">
172
+ ${this.renderToolUseContent(s)}
173
+ </div>
174
+ </div>
175
+ `:u`
176
+ <div class="mt-4 mb-4">
177
+ <div
178
+ class="text-vs-type px-4 py-2 break-all cursor-pointer hover:text-white transition-colors"
179
+ @click=${this.toggleContent}
180
+ >
181
+ <span class="mr-2">[+]</span>
182
+ ${this.getToolDisplayName(s)}
183
+ </div>
184
+ <div class="bg-vs-bg-secondary mx-4 p-4 text-vs-text hidden">
185
+ ${this.renderToolUseContent(s)}
186
+ </div>
187
+ </div>
188
+ `:u`<pre class="mb-4">${JSON.stringify(s,null,2)}</pre>`)}
189
+ `:u`<pre>${JSON.stringify(t,null,2)}</pre>`:u``}formatSingleParam(t,s,n=""){return s?u`${t}(<span class="text-vs-text">${this.unescapeHtml(s)}</span>)`:u`${t}`}formatMultiParam(t,s){return s.length>0?u`${t}(<span class="text-vs-text">${s.join(", ")}</span>)`:u`${t}`}unescapeHtml(t){let s=document.createElement("div");return s.innerHTML=t,s.textContent||s.innerText||""}wrapInScrollable(t,s=!0){return s&&typeof t=="string"?u`
190
+ <div class="overflow-x-auto">
191
+ <pre class="text-vs-text m-0" style="white-space: pre; font-family: monospace;">${t}</pre>
192
+ </div>
193
+ `:u` <div class="overflow-x-auto">${t}</div> `}renderCollapsibleSection(t,s,n={}){let{isExpanded:i=!1,titleClasses:r="",containerClasses:a="",count:o}=n,c=i?"":"hidden",h=i?"[-]":"[+]",p=o!==void 0?`${t} (${o})`:t;return u`
194
+ <div class="${a}">
195
+ <div class="cursor-pointer hover:text-white transition-colors ${r}" @click=${this.toggleContent}>
196
+ <span class="mr-2">${h}</span>
197
+ <span>${p}</span>
198
+ </div>
199
+ <div class="${c} mt-4">${s}</div>
200
+ </div>
201
+ `}getToolDisplayName(t,s){let n=t.name,i=t.input;switch(n){case"Read":return this.formatSingleParam(n,i?.file_path);case"Bash":return this.formatSingleParam(n,i?.command);case"Write":return this.formatSingleParam(n,i?.file_path);case"Glob":if(i?.pattern){let r=[this.unescapeHtml(i.pattern)];return i?.path&&r.push(this.unescapeHtml(i.path)),this.formatMultiParam(n,r)}return u`${n}`;case"Grep":if(i?.pattern){let r=[this.unescapeHtml(i.pattern)];return i?.include&&r.push(this.unescapeHtml(i.include)),i?.path&&r.push(this.unescapeHtml(i.path)),this.formatMultiParam(n,r)}return u`${n}`;case"LS":if(i?.path){let r=[this.unescapeHtml(i.path)];if(i?.ignore){let a=i.ignore.map(o=>this.unescapeHtml(o)).join(", ");r.push(`ignore: ${a}`)}return this.formatMultiParam(n,r)}return u`${n}`;case"Edit":return i?.file_path?this.formatSingleParam(n,this.unescapeHtml(i.file_path).split("/").pop()):u`${n}`;case"MultiEdit":if(i?.file_path){let r=this.unescapeHtml(i.file_path).split("/").pop()||i.file_path,a=i?.edits?i.edits.length:0;return this.formatMultiParam(n,[r,`${a} edits`])}return u`${n}`;case"NotebookRead":return i?.notebook_path?this.formatSingleParam(n,this.unescapeHtml(i.notebook_path).split("/").pop()):u`${n}`;case"NotebookEdit":if(i?.notebook_path&&i?.cell_number!==void 0){let r=this.unescapeHtml(i.notebook_path).split("/").pop(),a=i.cell_number,o=i?.edit_mode||"replace";return this.formatMultiParam(n,[r,`cell ${a}`,o])}return u`${n}`;case"WebFetch":return i?.url?this.formatSingleParam(n,i.url):u`${n}`;case"WebSearch":return i?.query?this.formatSingleParam(n,i.query):u`${n}`;default:return u`${n}`}}renderToolUseContent(t){let s=t.name,n=t.input;if(s==="TodoWrite"&&n?.todos){let i=n.todos;return this.wrapInScrollable(u`${i.map(r=>{let a=r.status==="completed"?"line-through text-vs-text":r.status==="in_progress"?"text-green-400":"text-vs-muted";return u`
202
+ <div class="overflow-hidden whitespace-nowrap text-ellipsis ${a}">• ${r.content}</div>
203
+ `})}`,!1)}if(s==="NotebookEdit"&&n?.new_source){let i=n.new_source;return this.wrapInScrollable(i)}if(s==="Write"&&n?.content){let i=n.content;return this.wrapInScrollable(i)}if(s==="MultiEdit"&&n?.edits){let i=n.edits;return this.wrapInScrollable(u`${i.map((r,a)=>{let o=r.old_string,c=r.new_string,h=this.renderDiff(o,c);return u`
204
+ <div class="mb-4">
205
+ <div class="text-vs-muted mb-2">Edit ${a+1}:</div>
206
+ <div>${h}</div>
207
+ </div>
208
+ `})}`,!1)}if(s==="Edit"&&n?.old_string&&n?.new_string){let i=n.old_string,r=n.new_string,a=this.renderDiff(i,r);return this.wrapInScrollable(u`${a}`,!1)}if(s==="WebFetch"&&n?.url&&n?.prompt)return this.wrapInScrollable(u`
209
+ <div class="mb-3">
210
+ <div class="text-vs-muted mb-1">URL:</div>
211
+ <div class="text-vs-text">${n.url}</div>
212
+ </div>
213
+ <div>
214
+ <div class="text-vs-muted mb-1">Prompt:</div>
215
+ <div class="text-vs-text">${n.prompt}</div>
216
+ </div>
217
+ `,!1);if(s==="WebSearch"&&n?.query){let i=[];return i.push(u`
218
+ <div class="mb-3">
219
+ <div class="text-vs-muted mb-1">Query:</div>
220
+ <div class="text-vs-text">${n.query}</div>
221
+ </div>
222
+ `),n?.allowed_domains&&i.push(u`
223
+ <div class="mb-3">
224
+ <div class="text-vs-muted mb-1">Allowed Domains:</div>
225
+ <div class="text-vs-text">${n.allowed_domains.join(", ")}</div>
226
+ </div>
227
+ `),n?.blocked_domains&&i.push(u`
228
+ <div class="mb-3">
229
+ <div class="text-vs-muted mb-1">Blocked Domains:</div>
230
+ <div class="text-vs-text">${n.blocked_domains.join(", ")}</div>
231
+ </div>
232
+ `),this.wrapInScrollable(u`${i}`,!1)}return this.wrapInScrollable(JSON.stringify(n,null,2))}renderToolResult(t,s){return u`
233
+ <div class="mb-4">
234
+ <div
235
+ class="text-vs-muted px-4 pb-0 cursor-pointer hover:text-white transition-colors"
236
+ @click=${this.toggleContent}
237
+ >
238
+ <span class="mr-2">[+]</span>
239
+ Tool Result ${t?.is_error?"\u274C":"\u2705"}
240
+ </div>
241
+ <div class="bg-vs-bg-secondary mx-4 p-4 text-vs-text hidden overflow-x-auto">
242
+ <pre class="whitespace-pre overflow-x-auto" style="white-space: pre; font-family: monospace;">
243
+ ${typeof t.content=="string"?t.content:JSON.stringify(t.content,null,2)}</pre
244
+ >
245
+ </div>
246
+ ${s?u`
247
+ <div>
248
+ <div
249
+ class="text-vs-muted px-4 cursor-pointer hover:text-white transition-colors"
250
+ @click=${this.toggleContent}
251
+ >
252
+ <span class="mr-2">[+]</span>
253
+ Raw Tool Call
254
+ </div>
255
+ <div class="bg-vs-bg-secondary mx-4 p-4 text-vs-text hidden">
256
+ ${this.wrapInScrollable(JSON.stringify(s,null,2))}
257
+ </div>
258
+ </div>
259
+ `:""}
260
+ </div>
261
+ `}renderToolContainer(t,s,n={}){let{isCollapsible:i=!1,isCollapsed:r=!1,isClickToExpand:a=!1,customContent:o}=n,c=o||u`${this.renderToolUseContent(t)}`,h=a?"text-vs-type px-4 break-all cursor-pointer hover:text-white transition-colors":"text-vs-type px-4 break-all",p=r?"bg-vs-bg-secondary mx-4 p-4 text-vs-text hidden":"bg-vs-bg-secondary mx-4 p-4 text-vs-text";return u`
262
+ <div class="mt-4 mb-4">
263
+ <div class="${h}" @click=${a?this.toggleContent:void 0}>
264
+ ${i?u`<span class="mr-2">[${r?"+":"-"}]</span>`:""}
265
+ ${this.getToolDisplayName(t)}
266
+ </div>
267
+ <div class="${p}">${c}</div>
268
+ ${s?this.renderToolResult(s,t):""}
269
+ </div>
270
+ `}renderWritePreview(t){let s=t.input;if(!s?.content)return u`<div class="text-vs-muted">No content</div>`;let i=s.content.split(`
271
+ `),r=i.slice(0,10),a=i.length>10;return u`
272
+ ${this.wrapInScrollable(r.join(`
273
+ `))}
274
+ ${a?u`<div class="text-vs-muted">... ${i.length-10} more lines (click to expand)</div>`:""}
275
+ `}renderDiff(t,s){let n=rt(t,s),i=[];for(let r of n){let a=r.value.split(`
276
+ `);a[a.length-1]===""&&a.pop();for(let o of a)r.added?i.push(u`<div class="bg-green-600/20"><pre class="text-vs-text m-0">+ ${o}</pre></div>`):r.removed?i.push(u`<div class="bg-red-600/20"><pre class="text-vs-text m-0">- ${o}</pre></div>`):i.push(u`<div><pre class="text-vs-text m-0"> ${o}</pre></div>`)}return i}hasTools(t){return!!(t.finalPair.request.tools&&t.finalPair.request.tools.length>0)}renderTools(t){return u`
277
+ ${t.map(s=>{if("name"in s&&s.name){let n="description"in s&&s.description||"No description";return this.renderCollapsibleSection(s.name,u`
278
+ <div class="text-vs-text ml-4 mb-3 markdown-content">
279
+ ${U(O(n))}
280
+ </div>
281
+
282
+ ${"input_schema"in s&&s.input_schema&&typeof s.input_schema=="object"?(()=>{let i=s.input_schema;return i.properties?u`
283
+ <div class="text-vs-muted mb-2">Parameters:</div>
284
+ ${Object.entries(i.properties).map(([r,a])=>{let o=a,c=i.required?.includes(r)?" (required)":"",h=o.type?` [${o.type}]`:"",p=o.description?` - ${o.description}`:"";return u`
285
+ <div class="ml-4 mb-1">
286
+ <span class="text-vs-user">${r}</span>
287
+ <span class="text-vs-muted">${h}${c}${p}</span>
288
+ </div>
289
+ `})}
290
+ `:u``})():u``}
291
+ `,{titleClasses:"text-vs-type font-bold",containerClasses:"mb-4",isExpanded:!0})}return u`<pre class="mb-4">${JSON.stringify(s,null,2)}</pre>`})}
292
+ `}renderConversationContent(t){return u`
293
+ <!-- System Prompt (Expandable) -->
294
+ ${t.system?this.renderCollapsibleSection("System Prompt",u`<div class="text-vs-text markdown-content mb-4">
295
+ ${U(this.formatSystem(t.system))}
296
+ </div>`,{titleClasses:"text-vs-function",containerClasses:"px-4 mt-4"}):""}
297
+
298
+ <!-- Tools (Expandable) -->
299
+ ${this.hasTools(t)?this.renderCollapsibleSection("Tools",u`<div class="ml-4">
300
+ <div class="text-vs-text">${this.renderTools(t.finalPair.request.tools||[])}</div>
301
+ </div>`,{titleClasses:"text-vs-type",containerClasses:"px-4",count:t.finalPair.request.tools?.length||0}):""}
302
+
303
+ <!-- Conversation Messages -->
304
+ <div class="px-4 mt-4">
305
+ ${t.messages.filter(s=>!s.hide).map((s,n)=>u`
306
+ <div class="mb-4">
307
+ <div
308
+ class="font-bold uppercase ${s.role==="user"?"text-vs-user":"text-vs-assistant"}"
309
+ >
310
+ <span>${s.role}</span>
311
+ </div>
312
+ <div class="text-vs-text">
313
+ ${this.formatContent(s.content,s.toolResults)}
314
+ </div>
315
+ </div>
316
+ `)}
317
+
318
+ <!-- Assistant Response -->
319
+ <div class="mb-4">
320
+ <div class="font-bold uppercase text-vs-assistant">
321
+ <span>assistant</span>
322
+ </div>
323
+ <div class="text-vs-text">${this.formatResponseContent(t.response)}</div>
324
+ </div>
325
+ </div>
326
+ `}render(){return this.conversations.length===0?u`<div>No conversations found.</div>`:u`
327
+ <div class="max-w-[60em] mx-auto">
328
+ ${this.conversations.map(t=>u`
329
+ <div class="mt-8 first:mt-0">
330
+ ${t.compacted?u`
331
+ <!-- Compacted Conversation (Collapsed) -->
332
+ <div
333
+ class="cursor-pointer text-red-400 hover:text-red-300 transition-colors border border-red-700 p-4"
334
+ @click=${this.toggleContent}
335
+ >
336
+ <span class="mr-2">[+]</span>
337
+ <span>Compacted (click to view details)</span>
338
+ </div>
339
+ <div class="hidden mt-8">
340
+ <!-- Conversation Header -->
341
+ <div class="border border-red-700 p-4 mb-0">
342
+ <div class="text-red-400">${Array.from(t.models).join(", ")}</div>
343
+ <div class="text-vs-muted">
344
+ ${new Date(t.metadata.startTime).toLocaleString()}
345
+ <span class="ml-4">${t.messages.length+1} messages</span>
346
+ </div>
347
+ </div>
348
+ ${this.renderConversationContent(t)}
349
+ </div>
350
+ `:u`
351
+ <!-- Regular Conversation -->
352
+ <!-- Conversation Header -->
353
+ <div class="border border-vs-highlight p-4 mb-0">
354
+ <div class="text-vs-assistant">${Array.from(t.models).join(", ")}</div>
355
+ <div class="text-vs-muted">
356
+ ${new Date(t.metadata.startTime).toLocaleString()}
357
+ <span class="ml-4">${t.messages.length+1} messages</span>
358
+ </div>
359
+ </div>
360
+ ${this.renderConversationContent(t)}
361
+ `}
362
+ </div>
363
+ `)}
364
+ </div>
365
+ `}};S([q({type:Array})],ye.prototype,"conversations",2),ye=S([H("simple-conversation-view")],ye);var _e=class extends P{constructor(){super(...arguments);this.rawPairs=[]}createRenderRoot(){return this}render(){if(this.rawPairs.length===0)return u`<div class="text-vs-muted">No raw pairs found.</div>`;let t=this.rawPairs.filter(s=>s.response!==null);return u`
366
+ <div>
367
+ ${t.map((s,n)=>u`
368
+ <div class="mt-8 first:mt-0">
369
+ <!-- Pair Header -->
370
+ <div class="border border-vs-highlight p-4 mb-0">
371
+ <div class="text-vs-assistant font-bold">
372
+ ${s.request.method} ${this.getUrlPath(s.request.url)}
373
+ </div>
374
+ <div class="text-vs-muted">
375
+ Raw Pair ${n+1} • ${this.getModelName(s)} • Status ${s.response.status_code} •
376
+ ${new Date(s.logged_at).toLocaleString()}
377
+ </div>
378
+ </div>
379
+
380
+ <!-- Request Section -->
381
+ <div class="px-4 mt-4">
382
+ <div class="mb-4">
383
+ <div
384
+ class="cursor-pointer text-vs-user font-bold hover:text-white transition-colors"
385
+ @click=${i=>this.toggleContent(i)}
386
+ >
387
+ <span class="mr-2">[+]</span>
388
+ <span>Request</span>
389
+ </div>
390
+ <div class="hidden mt-2">
391
+ <div class="bg-vs-bg-secondary p-4 text-vs-text overflow-x-auto">
392
+ <pre class="whitespace-pre text-vs-text m-0">${this.formatJson(s.request)}</pre>
393
+ </div>
394
+ </div>
395
+ </div>
396
+
397
+ <!-- Response Section -->
398
+ <div class="mb-4">
399
+ <div
400
+ class="cursor-pointer text-vs-assistant font-bold hover:text-white transition-colors"
401
+ @click=${i=>this.toggleContent(i)}
402
+ >
403
+ <span class="mr-2">[+]</span>
404
+ <span>Response</span>
405
+ </div>
406
+ <div class="hidden mt-2">
407
+ <div class="bg-vs-bg-secondary p-4 text-vs-text overflow-x-auto">
408
+ <pre class="whitespace-pre text-vs-text m-0">${this.formatJson(s.response)}</pre>
409
+ </div>
410
+ </div>
411
+ </div>
412
+
413
+ <!-- SSE Events Section -->
414
+ ${s.response.events&&s.response.events.length>0?u`
415
+ <div class="mb-4">
416
+ <div
417
+ class="cursor-pointer text-vs-type font-bold hover:text-white transition-colors"
418
+ @click=${i=>this.toggleContent(i)}
419
+ >
420
+ <span class="mr-2">[+]</span>
421
+ <span>SSE Events (${s.response.events.length})</span>
422
+ </div>
423
+ <div class="hidden mt-2">
424
+ <div class="bg-vs-bg-secondary p-4 text-vs-text overflow-x-auto">
425
+ <pre class="whitespace-pre text-vs-text m-0">
426
+ ${this.formatJson(s.response.events)}</pre
427
+ >
428
+ </div>
429
+ </div>
430
+ </div>
431
+ `:""}
432
+ </div>
433
+ </div>
434
+ `)}
435
+ </div>
436
+ `}getUrlPath(t){try{return new URL(t).pathname}catch{return t}}getModelName(t){if(t.request.url&&t.request.url.includes("bedrock-runtime")){let s=t.request.url.match(/\/model\/([^\/]+)/);if(s&&s[1])return this.normalizeModelName(s[1])}return t.request.body&&t.request.body.model?this.normalizeModelName(t.request.body.model):"unknown"}normalizeModelName(t){if(!t)return"unknown";if(t.startsWith("us.anthropic.")){let s=t.match(/us\.anthropic\.([^:]+)/);if(s&&s[1])return s[1]}return t}formatJson(t){try{return JSON.stringify(t,null,2)}catch{return String(t)}}toggleContent(t){let s=t.currentTarget,n=s.nextElementSibling,i=s.querySelector("span:first-child");if(n&&i){let r=n.classList.contains("hidden");n.classList.toggle("hidden",!r),i.textContent=r?"[-]":"[+]"}}};S([q({type:Array})],_e.prototype,"rawPairs",2),_e=S([H("raw-pairs-view")],_e);var $e=class extends P{constructor(){super(...arguments);this.processedPairs=[]}createRenderRoot(){return this}render(){return this.processedPairs.length===0?u`<div class="text-vs-muted">No processed pairs found.</div>`:u`
437
+ <div>
438
+ ${this.processedPairs.map((t,s)=>u`
439
+ <div class="mt-8 first:mt-0">
440
+ <!-- Pair Header -->
441
+ <div class="border border-vs-highlight p-4 mb-0">
442
+ <div class="text-vs-assistant font-bold">${t.model}</div>
443
+ <div class="text-vs-muted">
444
+ Pair ${s+1} • ${t.isStreaming?"streaming":"non-streaming"} •
445
+ ${new Date(t.timestamp).toLocaleString()}
446
+ </div>
447
+ </div>
448
+
449
+ <!-- Request Section -->
450
+ <div class="px-4 mt-4">
451
+ <div class="mb-4">
452
+ <div
453
+ class="cursor-pointer text-vs-user font-bold hover:text-white transition-colors"
454
+ @click=${n=>this.toggleContent(n)}
455
+ >
456
+ <span class="mr-2">[+]</span>
457
+ <span>Request (MessageCreateParams)</span>
458
+ </div>
459
+ <div class="hidden mt-2">
460
+ <div class="bg-vs-bg-secondary p-4 text-vs-text overflow-x-auto">
461
+ <pre class="whitespace-pre text-vs-text m-0">${this.formatJson(t.request)}</pre>
462
+ </div>
463
+ </div>
464
+ </div>
465
+
466
+ <!-- Response Section -->
467
+ <div class="mb-4">
468
+ <div
469
+ class="cursor-pointer text-vs-assistant font-bold hover:text-white transition-colors"
470
+ @click=${n=>this.toggleContent(n)}
471
+ >
472
+ <span class="mr-2">[+]</span>
473
+ <span>Response (Message)${t.isStreaming?" - Reconstructed from SSE":""}</span>
474
+ </div>
475
+ <div class="hidden mt-2">
476
+ <div class="bg-vs-bg-secondary p-4 text-vs-text overflow-x-auto">
477
+ <pre class="whitespace-pre text-vs-text m-0">${this.formatJson(t.response)}</pre>
478
+ </div>
479
+ </div>
480
+ </div>
481
+ </div>
482
+ </div>
483
+ `)}
484
+ </div>
485
+ `}formatJson(t){try{return JSON.stringify(t,null,2)}catch(s){return`Error formatting JSON: ${s}`}}toggleContent(t){let s=t.currentTarget,n=s.nextElementSibling,i=s.querySelector("span:first-child");if(n&&i){let r=n.classList.contains("hidden");n.classList.toggle("hidden",!r),i.textContent=r?"[-]":"[+]"}}};S([q({type:Array})],$e.prototype,"processedPairs",2),$e=S([H("json-view")],$e);var mt=`*, ::before, ::after {
486
+ --tw-border-spacing-x: 0;
487
+ --tw-border-spacing-y: 0;
488
+ --tw-translate-x: 0;
489
+ --tw-translate-y: 0;
490
+ --tw-rotate: 0;
491
+ --tw-skew-x: 0;
492
+ --tw-skew-y: 0;
493
+ --tw-scale-x: 1;
494
+ --tw-scale-y: 1;
495
+ --tw-pan-x: ;
496
+ --tw-pan-y: ;
497
+ --tw-pinch-zoom: ;
498
+ --tw-scroll-snap-strictness: proximity;
499
+ --tw-gradient-from-position: ;
500
+ --tw-gradient-via-position: ;
501
+ --tw-gradient-to-position: ;
502
+ --tw-ordinal: ;
503
+ --tw-slashed-zero: ;
504
+ --tw-numeric-figure: ;
505
+ --tw-numeric-spacing: ;
506
+ --tw-numeric-fraction: ;
507
+ --tw-ring-inset: ;
508
+ --tw-ring-offset-width: 0px;
509
+ --tw-ring-offset-color: #fff;
510
+ --tw-ring-color: rgb(59 130 246 / 0.5);
511
+ --tw-ring-offset-shadow: 0 0 #0000;
512
+ --tw-ring-shadow: 0 0 #0000;
513
+ --tw-shadow: 0 0 #0000;
514
+ --tw-shadow-colored: 0 0 #0000;
515
+ --tw-blur: ;
516
+ --tw-brightness: ;
517
+ --tw-contrast: ;
518
+ --tw-grayscale: ;
519
+ --tw-hue-rotate: ;
520
+ --tw-invert: ;
521
+ --tw-saturate: ;
522
+ --tw-sepia: ;
523
+ --tw-drop-shadow: ;
524
+ --tw-backdrop-blur: ;
525
+ --tw-backdrop-brightness: ;
526
+ --tw-backdrop-contrast: ;
527
+ --tw-backdrop-grayscale: ;
528
+ --tw-backdrop-hue-rotate: ;
529
+ --tw-backdrop-invert: ;
530
+ --tw-backdrop-opacity: ;
531
+ --tw-backdrop-saturate: ;
532
+ --tw-backdrop-sepia: ;
533
+ --tw-contain-size: ;
534
+ --tw-contain-layout: ;
535
+ --tw-contain-paint: ;
536
+ --tw-contain-style: ;
537
+ }
538
+
539
+ ::backdrop {
540
+ --tw-border-spacing-x: 0;
541
+ --tw-border-spacing-y: 0;
542
+ --tw-translate-x: 0;
543
+ --tw-translate-y: 0;
544
+ --tw-rotate: 0;
545
+ --tw-skew-x: 0;
546
+ --tw-skew-y: 0;
547
+ --tw-scale-x: 1;
548
+ --tw-scale-y: 1;
549
+ --tw-pan-x: ;
550
+ --tw-pan-y: ;
551
+ --tw-pinch-zoom: ;
552
+ --tw-scroll-snap-strictness: proximity;
553
+ --tw-gradient-from-position: ;
554
+ --tw-gradient-via-position: ;
555
+ --tw-gradient-to-position: ;
556
+ --tw-ordinal: ;
557
+ --tw-slashed-zero: ;
558
+ --tw-numeric-figure: ;
559
+ --tw-numeric-spacing: ;
560
+ --tw-numeric-fraction: ;
561
+ --tw-ring-inset: ;
562
+ --tw-ring-offset-width: 0px;
563
+ --tw-ring-offset-color: #fff;
564
+ --tw-ring-color: rgb(59 130 246 / 0.5);
565
+ --tw-ring-offset-shadow: 0 0 #0000;
566
+ --tw-ring-shadow: 0 0 #0000;
567
+ --tw-shadow: 0 0 #0000;
568
+ --tw-shadow-colored: 0 0 #0000;
569
+ --tw-blur: ;
570
+ --tw-brightness: ;
571
+ --tw-contrast: ;
572
+ --tw-grayscale: ;
573
+ --tw-hue-rotate: ;
574
+ --tw-invert: ;
575
+ --tw-saturate: ;
576
+ --tw-sepia: ;
577
+ --tw-drop-shadow: ;
578
+ --tw-backdrop-blur: ;
579
+ --tw-backdrop-brightness: ;
580
+ --tw-backdrop-contrast: ;
581
+ --tw-backdrop-grayscale: ;
582
+ --tw-backdrop-hue-rotate: ;
583
+ --tw-backdrop-invert: ;
584
+ --tw-backdrop-opacity: ;
585
+ --tw-backdrop-saturate: ;
586
+ --tw-backdrop-sepia: ;
587
+ --tw-contain-size: ;
588
+ --tw-contain-layout: ;
589
+ --tw-contain-paint: ;
590
+ --tw-contain-style: ;
591
+ }
592
+
593
+ /*
594
+ ! tailwindcss v3.4.17 | MIT License | https://tailwindcss.com
595
+ */
596
+
597
+ /*
598
+ 1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)
599
+ 2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)
600
+ */
601
+
602
+ *,
603
+ ::before,
604
+ ::after {
605
+ box-sizing: border-box;
606
+ /* 1 */
607
+ border-width: 0;
608
+ /* 2 */
609
+ border-style: solid;
610
+ /* 2 */
611
+ border-color: #e5e7eb;
612
+ /* 2 */
613
+ }
614
+
615
+ ::before,
616
+ ::after {
617
+ --tw-content: '';
618
+ }
619
+
620
+ /*
621
+ 1. Use a consistent sensible line-height in all browsers.
622
+ 2. Prevent adjustments of font size after orientation changes in iOS.
623
+ 3. Use a more readable tab size.
624
+ 4. Use the user's configured \`sans\` font-family by default.
625
+ 5. Use the user's configured \`sans\` font-feature-settings by default.
626
+ 6. Use the user's configured \`sans\` font-variation-settings by default.
627
+ 7. Disable tap highlights on iOS
628
+ */
629
+
630
+ html,
631
+ :host {
632
+ line-height: 1.5;
633
+ /* 1 */
634
+ -webkit-text-size-adjust: 100%;
635
+ /* 2 */
636
+ -moz-tab-size: 4;
637
+ /* 3 */
638
+ -o-tab-size: 4;
639
+ tab-size: 4;
640
+ /* 3 */
641
+ font-family: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
642
+ /* 4 */
643
+ font-feature-settings: normal;
644
+ /* 5 */
645
+ font-variation-settings: normal;
646
+ /* 6 */
647
+ -webkit-tap-highlight-color: transparent;
648
+ /* 7 */
649
+ }
650
+
651
+ /*
652
+ 1. Remove the margin in all browsers.
653
+ 2. Inherit line-height from \`html\` so users can set them as a class directly on the \`html\` element.
654
+ */
655
+
656
+ body {
657
+ margin: 0;
658
+ /* 1 */
659
+ line-height: inherit;
660
+ /* 2 */
661
+ }
662
+
663
+ /*
664
+ 1. Add the correct height in Firefox.
665
+ 2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)
666
+ 3. Ensure horizontal rules are visible by default.
667
+ */
668
+
669
+ hr {
670
+ height: 0;
671
+ /* 1 */
672
+ color: inherit;
673
+ /* 2 */
674
+ border-top-width: 1px;
675
+ /* 3 */
676
+ }
677
+
678
+ /*
679
+ Add the correct text decoration in Chrome, Edge, and Safari.
680
+ */
681
+
682
+ abbr:where([title]) {
683
+ -webkit-text-decoration: underline dotted;
684
+ text-decoration: underline dotted;
685
+ }
686
+
687
+ /*
688
+ Remove the default font size and weight for headings.
689
+ */
690
+
691
+ h1,
692
+ h2,
693
+ h3,
694
+ h4,
695
+ h5,
696
+ h6 {
697
+ font-size: inherit;
698
+ font-weight: inherit;
699
+ }
700
+
701
+ /*
702
+ Reset links to optimize for opt-in styling instead of opt-out.
703
+ */
704
+
705
+ a {
706
+ color: inherit;
707
+ text-decoration: inherit;
708
+ }
709
+
710
+ /*
711
+ Add the correct font weight in Edge and Safari.
712
+ */
713
+
714
+ b,
715
+ strong {
716
+ font-weight: bolder;
717
+ }
718
+
719
+ /*
720
+ 1. Use the user's configured \`mono\` font-family by default.
721
+ 2. Use the user's configured \`mono\` font-feature-settings by default.
722
+ 3. Use the user's configured \`mono\` font-variation-settings by default.
723
+ 4. Correct the odd \`em\` font sizing in all browsers.
724
+ */
725
+
726
+ code,
727
+ kbd,
728
+ samp,
729
+ pre {
730
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
731
+ /* 1 */
732
+ font-feature-settings: normal;
733
+ /* 2 */
734
+ font-variation-settings: normal;
735
+ /* 3 */
736
+ font-size: 1em;
737
+ /* 4 */
738
+ }
739
+
740
+ /*
741
+ Add the correct font size in all browsers.
742
+ */
743
+
744
+ small {
745
+ font-size: 80%;
746
+ }
747
+
748
+ /*
749
+ Prevent \`sub\` and \`sup\` elements from affecting the line height in all browsers.
750
+ */
751
+
752
+ sub,
753
+ sup {
754
+ font-size: 75%;
755
+ line-height: 0;
756
+ position: relative;
757
+ vertical-align: baseline;
758
+ }
759
+
760
+ sub {
761
+ bottom: -0.25em;
762
+ }
763
+
764
+ sup {
765
+ top: -0.5em;
766
+ }
767
+
768
+ /*
769
+ 1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)
770
+ 2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)
771
+ 3. Remove gaps between table borders by default.
772
+ */
773
+
774
+ table {
775
+ text-indent: 0;
776
+ /* 1 */
777
+ border-color: inherit;
778
+ /* 2 */
779
+ border-collapse: collapse;
780
+ /* 3 */
781
+ }
782
+
783
+ /*
784
+ 1. Change the font styles in all browsers.
785
+ 2. Remove the margin in Firefox and Safari.
786
+ 3. Remove default padding in all browsers.
787
+ */
788
+
789
+ button,
790
+ input,
791
+ optgroup,
792
+ select,
793
+ textarea {
794
+ font-family: inherit;
795
+ /* 1 */
796
+ font-feature-settings: inherit;
797
+ /* 1 */
798
+ font-variation-settings: inherit;
799
+ /* 1 */
800
+ font-size: 100%;
801
+ /* 1 */
802
+ font-weight: inherit;
803
+ /* 1 */
804
+ line-height: inherit;
805
+ /* 1 */
806
+ letter-spacing: inherit;
807
+ /* 1 */
808
+ color: inherit;
809
+ /* 1 */
810
+ margin: 0;
811
+ /* 2 */
812
+ padding: 0;
813
+ /* 3 */
814
+ }
815
+
816
+ /*
817
+ Remove the inheritance of text transform in Edge and Firefox.
818
+ */
819
+
820
+ button,
821
+ select {
822
+ text-transform: none;
823
+ }
824
+
825
+ /*
826
+ 1. Correct the inability to style clickable types in iOS and Safari.
827
+ 2. Remove default button styles.
828
+ */
829
+
830
+ button,
831
+ input:where([type='button']),
832
+ input:where([type='reset']),
833
+ input:where([type='submit']) {
834
+ -webkit-appearance: button;
835
+ /* 1 */
836
+ background-color: transparent;
837
+ /* 2 */
838
+ background-image: none;
839
+ /* 2 */
840
+ }
841
+
842
+ /*
843
+ Use the modern Firefox focus style for all focusable elements.
844
+ */
845
+
846
+ :-moz-focusring {
847
+ outline: auto;
848
+ }
849
+
850
+ /*
851
+ Remove the additional \`:invalid\` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)
852
+ */
853
+
854
+ :-moz-ui-invalid {
855
+ box-shadow: none;
856
+ }
857
+
858
+ /*
859
+ Add the correct vertical alignment in Chrome and Firefox.
860
+ */
861
+
862
+ progress {
863
+ vertical-align: baseline;
864
+ }
865
+
866
+ /*
867
+ Correct the cursor style of increment and decrement buttons in Safari.
868
+ */
869
+
870
+ ::-webkit-inner-spin-button,
871
+ ::-webkit-outer-spin-button {
872
+ height: auto;
873
+ }
874
+
875
+ /*
876
+ 1. Correct the odd appearance in Chrome and Safari.
877
+ 2. Correct the outline style in Safari.
878
+ */
879
+
880
+ [type='search'] {
881
+ -webkit-appearance: textfield;
882
+ /* 1 */
883
+ outline-offset: -2px;
884
+ /* 2 */
885
+ }
886
+
887
+ /*
888
+ Remove the inner padding in Chrome and Safari on macOS.
889
+ */
890
+
891
+ ::-webkit-search-decoration {
892
+ -webkit-appearance: none;
893
+ }
894
+
895
+ /*
896
+ 1. Correct the inability to style clickable types in iOS and Safari.
897
+ 2. Change font properties to \`inherit\` in Safari.
898
+ */
899
+
900
+ ::-webkit-file-upload-button {
901
+ -webkit-appearance: button;
902
+ /* 1 */
903
+ font: inherit;
904
+ /* 2 */
905
+ }
906
+
907
+ /*
908
+ Add the correct display in Chrome and Safari.
909
+ */
910
+
911
+ summary {
912
+ display: list-item;
913
+ }
914
+
915
+ /*
916
+ Removes the default spacing and border for appropriate elements.
917
+ */
918
+
919
+ blockquote,
920
+ dl,
921
+ dd,
922
+ h1,
923
+ h2,
924
+ h3,
925
+ h4,
926
+ h5,
927
+ h6,
928
+ hr,
929
+ figure,
930
+ p,
931
+ pre {
932
+ margin: 0;
933
+ }
934
+
935
+ fieldset {
936
+ margin: 0;
937
+ padding: 0;
938
+ }
939
+
940
+ legend {
941
+ padding: 0;
942
+ }
943
+
944
+ ol,
945
+ ul,
946
+ menu {
947
+ list-style: none;
948
+ margin: 0;
949
+ padding: 0;
950
+ }
951
+
952
+ /*
953
+ Reset default styling for dialogs.
954
+ */
955
+
956
+ dialog {
957
+ padding: 0;
958
+ }
959
+
960
+ /*
961
+ Prevent resizing textareas horizontally by default.
962
+ */
963
+
964
+ textarea {
965
+ resize: vertical;
966
+ }
967
+
968
+ /*
969
+ 1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)
970
+ 2. Set the default placeholder color to the user's configured gray 400 color.
971
+ */
972
+
973
+ input::-moz-placeholder, textarea::-moz-placeholder {
974
+ opacity: 1;
975
+ /* 1 */
976
+ color: #9ca3af;
977
+ /* 2 */
978
+ }
979
+
980
+ input::placeholder,
981
+ textarea::placeholder {
982
+ opacity: 1;
983
+ /* 1 */
984
+ color: #9ca3af;
985
+ /* 2 */
986
+ }
987
+
988
+ /*
989
+ Set the default cursor for buttons.
990
+ */
991
+
992
+ button,
993
+ [role="button"] {
994
+ cursor: pointer;
995
+ }
996
+
997
+ /*
998
+ Make sure disabled buttons don't get the pointer cursor.
999
+ */
1000
+
1001
+ :disabled {
1002
+ cursor: default;
1003
+ }
1004
+
1005
+ /*
1006
+ 1. Make replaced elements \`display: block\` by default. (https://github.com/mozdevs/cssremedy/issues/14)
1007
+ 2. Add \`vertical-align: middle\` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)
1008
+ This can trigger a poorly considered lint error in some tools but is included by design.
1009
+ */
1010
+
1011
+ img,
1012
+ svg,
1013
+ video,
1014
+ canvas,
1015
+ audio,
1016
+ iframe,
1017
+ embed,
1018
+ object {
1019
+ display: block;
1020
+ /* 1 */
1021
+ vertical-align: middle;
1022
+ /* 2 */
1023
+ }
1024
+
1025
+ /*
1026
+ Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)
1027
+ */
1028
+
1029
+ img,
1030
+ video {
1031
+ max-width: 100%;
1032
+ height: auto;
1033
+ }
1034
+
1035
+ /* Make elements with the HTML hidden attribute stay hidden by default */
1036
+
1037
+ [hidden]:where(:not([hidden="until-found"])) {
1038
+ display: none;
1039
+ }
1040
+
1041
+ .m-0 {
1042
+ margin: 0px;
1043
+ }
1044
+
1045
+ .mx-4 {
1046
+ margin-left: 1rem;
1047
+ margin-right: 1rem;
1048
+ }
1049
+
1050
+ .mx-auto {
1051
+ margin-left: auto;
1052
+ margin-right: auto;
1053
+ }
1054
+
1055
+ .mb-0 {
1056
+ margin-bottom: 0px;
1057
+ }
1058
+
1059
+ .mb-1 {
1060
+ margin-bottom: 0.25rem;
1061
+ }
1062
+
1063
+ .mb-2 {
1064
+ margin-bottom: 0.5rem;
1065
+ }
1066
+
1067
+ .mb-3 {
1068
+ margin-bottom: 0.75rem;
1069
+ }
1070
+
1071
+ .mb-4 {
1072
+ margin-bottom: 1rem;
1073
+ }
1074
+
1075
+ .mb-8 {
1076
+ margin-bottom: 2rem;
1077
+ }
1078
+
1079
+ .ml-4 {
1080
+ margin-left: 1rem;
1081
+ }
1082
+
1083
+ .ml-8 {
1084
+ margin-left: 2rem;
1085
+ }
1086
+
1087
+ .mr-12 {
1088
+ margin-right: 3rem;
1089
+ }
1090
+
1091
+ .mr-2 {
1092
+ margin-right: 0.5rem;
1093
+ }
1094
+
1095
+ .mr-8 {
1096
+ margin-right: 2rem;
1097
+ }
1098
+
1099
+ .mt-2 {
1100
+ margin-top: 0.5rem;
1101
+ }
1102
+
1103
+ .mt-4 {
1104
+ margin-top: 1rem;
1105
+ }
1106
+
1107
+ .mt-8 {
1108
+ margin-top: 2rem;
1109
+ }
1110
+
1111
+ .block {
1112
+ display: block;
1113
+ }
1114
+
1115
+ .hidden {
1116
+ display: none;
1117
+ }
1118
+
1119
+ .min-h-screen {
1120
+ min-height: 100vh;
1121
+ }
1122
+
1123
+ .max-w-\\[60em\\] {
1124
+ max-width: 60em;
1125
+ }
1126
+
1127
+ .cursor-pointer {
1128
+ cursor: pointer;
1129
+ }
1130
+
1131
+ .overflow-hidden {
1132
+ overflow: hidden;
1133
+ }
1134
+
1135
+ .overflow-x-auto {
1136
+ overflow-x: auto;
1137
+ }
1138
+
1139
+ .text-ellipsis {
1140
+ text-overflow: ellipsis;
1141
+ }
1142
+
1143
+ .whitespace-nowrap {
1144
+ white-space: nowrap;
1145
+ }
1146
+
1147
+ .whitespace-pre {
1148
+ white-space: pre;
1149
+ }
1150
+
1151
+ .break-all {
1152
+ word-break: break-all;
1153
+ }
1154
+
1155
+ .border {
1156
+ border-width: 1px;
1157
+ }
1158
+
1159
+ .border-red-700 {
1160
+ --tw-border-opacity: 1;
1161
+ border-color: rgb(185 28 28 / var(--tw-border-opacity, 1));
1162
+ }
1163
+
1164
+ .border-vs-highlight {
1165
+ --tw-border-opacity: 1;
1166
+ border-color: rgb(139 105 20 / var(--tw-border-opacity, 1));
1167
+ }
1168
+
1169
+ .bg-green-600\\/20 {
1170
+ background-color: rgb(22 163 74 / 0.2);
1171
+ }
1172
+
1173
+ .bg-red-600\\/20 {
1174
+ background-color: rgb(220 38 38 / 0.2);
1175
+ }
1176
+
1177
+ .bg-vs-bg {
1178
+ --tw-bg-opacity: 1;
1179
+ background-color: rgb(30 30 30 / var(--tw-bg-opacity, 1));
1180
+ }
1181
+
1182
+ .bg-vs-bg-secondary {
1183
+ --tw-bg-opacity: 1;
1184
+ background-color: rgb(45 45 48 / var(--tw-bg-opacity, 1));
1185
+ }
1186
+
1187
+ .p-4 {
1188
+ padding: 1rem;
1189
+ }
1190
+
1191
+ .px-4 {
1192
+ padding-left: 1rem;
1193
+ padding-right: 1rem;
1194
+ }
1195
+
1196
+ .py-2 {
1197
+ padding-top: 0.5rem;
1198
+ padding-bottom: 0.5rem;
1199
+ }
1200
+
1201
+ .pb-0 {
1202
+ padding-bottom: 0px;
1203
+ }
1204
+
1205
+ .text-center {
1206
+ text-align: center;
1207
+ }
1208
+
1209
+ .font-mono {
1210
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
1211
+ }
1212
+
1213
+ .font-bold {
1214
+ font-weight: 700;
1215
+ }
1216
+
1217
+ .uppercase {
1218
+ text-transform: uppercase;
1219
+ }
1220
+
1221
+ .italic {
1222
+ font-style: italic;
1223
+ }
1224
+
1225
+ .text-gray-400 {
1226
+ --tw-text-opacity: 1;
1227
+ color: rgb(156 163 175 / var(--tw-text-opacity, 1));
1228
+ }
1229
+
1230
+ .text-gray-500 {
1231
+ --tw-text-opacity: 1;
1232
+ color: rgb(107 114 128 / var(--tw-text-opacity, 1));
1233
+ }
1234
+
1235
+ .text-green-400 {
1236
+ --tw-text-opacity: 1;
1237
+ color: rgb(74 222 128 / var(--tw-text-opacity, 1));
1238
+ }
1239
+
1240
+ .text-red-400 {
1241
+ --tw-text-opacity: 1;
1242
+ color: rgb(248 113 113 / var(--tw-text-opacity, 1));
1243
+ }
1244
+
1245
+ .text-vs-assistant {
1246
+ --tw-text-opacity: 1;
1247
+ color: rgb(206 145 120 / var(--tw-text-opacity, 1));
1248
+ }
1249
+
1250
+ .text-vs-function {
1251
+ --tw-text-opacity: 1;
1252
+ color: rgb(220 220 170 / var(--tw-text-opacity, 1));
1253
+ }
1254
+
1255
+ .text-vs-muted {
1256
+ --tw-text-opacity: 1;
1257
+ color: rgb(140 140 140 / var(--tw-text-opacity, 1));
1258
+ }
1259
+
1260
+ .text-vs-nav-active {
1261
+ --tw-text-opacity: 1;
1262
+ color: rgb(244 135 113 / var(--tw-text-opacity, 1));
1263
+ }
1264
+
1265
+ .text-vs-text {
1266
+ --tw-text-opacity: 1;
1267
+ color: rgb(212 212 212 / var(--tw-text-opacity, 1));
1268
+ }
1269
+
1270
+ .text-vs-type {
1271
+ --tw-text-opacity: 1;
1272
+ color: rgb(78 201 176 / var(--tw-text-opacity, 1));
1273
+ }
1274
+
1275
+ .text-vs-user {
1276
+ --tw-text-opacity: 1;
1277
+ color: rgb(106 153 85 / var(--tw-text-opacity, 1));
1278
+ }
1279
+
1280
+ .line-through {
1281
+ text-decoration-line: line-through;
1282
+ }
1283
+
1284
+ .shadow {
1285
+ --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
1286
+ --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);
1287
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
1288
+ }
1289
+
1290
+ .filter {
1291
+ filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
1292
+ }
1293
+
1294
+ .transition-colors {
1295
+ transition-property: color, background-color, border-color, text-decoration-color, fill, stroke;
1296
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
1297
+ transition-duration: 150ms;
1298
+ }
1299
+
1300
+ html, body {
1301
+ font-size: 12px;
1302
+ background-color: #1e1e1e;
1303
+ /* vs-bg color */
1304
+ }
1305
+
1306
+ /* Text wrapping only for markdown content */
1307
+
1308
+ .markdown-content {
1309
+ word-wrap: break-word;
1310
+ overflow-wrap: break-word;
1311
+ word-break: break-word;
1312
+ max-width: 100%;
1313
+ overflow-x: hidden;
1314
+ }
1315
+
1316
+ /* Terminal-style markdown styling - full line spacing only */
1317
+
1318
+ .markdown-content h1,
1319
+ .markdown-content h2,
1320
+ .markdown-content h3,
1321
+ .markdown-content h4,
1322
+ .markdown-content h5,
1323
+ .markdown-content h6 {
1324
+ font-size: inherit;
1325
+ /* Same as body text */
1326
+ font-weight: bold;
1327
+ color: #dcdcaa;
1328
+ /* vs-function color */
1329
+ margin: 1em 0;
1330
+ /* Full line spacing */
1331
+ }
1332
+
1333
+ .markdown-content p {
1334
+ margin: 0 0 1em 0;
1335
+ /* One line after paragraphs */
1336
+ font-size: inherit;
1337
+ }
1338
+
1339
+ .markdown-content strong,
1340
+ .markdown-content b {
1341
+ font-weight: bold;
1342
+ color: #d4d4d4;
1343
+ /* vs-text color */
1344
+ }
1345
+
1346
+ .markdown-content em,
1347
+ .markdown-content i {
1348
+ font-style: italic;
1349
+ color: #ce9178;
1350
+ /* vs-assistant color */
1351
+ }
1352
+
1353
+ .markdown-content code {
1354
+ font-family: monospace;
1355
+ font-size: inherit;
1356
+ color: #4ec9b0;
1357
+ /* vs-type color */
1358
+ }
1359
+
1360
+ .markdown-content pre {
1361
+ font-family: monospace;
1362
+ font-size: inherit;
1363
+ margin: 1em 0;
1364
+ /* Full line spacing */
1365
+ white-space: pre-wrap;
1366
+ /* Wrap long lines */
1367
+ }
1368
+
1369
+ .markdown-content pre code {
1370
+ color: inherit;
1371
+ }
1372
+
1373
+ .markdown-content ul,
1374
+ .markdown-content ol {
1375
+ margin: 1em 0;
1376
+ /* Full line spacing */
1377
+ padding-left: 0;
1378
+ list-style: none;
1379
+ }
1380
+
1381
+ .markdown-content li {
1382
+ margin: 0;
1383
+ /* No spacing between list items */
1384
+ font-size: inherit;
1385
+ padding-left: 1.5em;
1386
+ position: relative;
1387
+ }
1388
+
1389
+ .markdown-content ul li::before {
1390
+ content: "- ";
1391
+ color: #8c8c8c;
1392
+ /* vs-muted */
1393
+ position: absolute;
1394
+ left: 0;
1395
+ }
1396
+
1397
+ .markdown-content ol li::before {
1398
+ content: counter(list-item) ". ";
1399
+ color: #8c8c8c;
1400
+ /* vs-muted */
1401
+ position: absolute;
1402
+ left: 0;
1403
+ }
1404
+
1405
+ .markdown-content blockquote {
1406
+ border-left: 2px solid #8c8c8c;
1407
+ /* vs-muted */
1408
+ padding-left: 0.75em;
1409
+ margin: 1em 0;
1410
+ /* Full line spacing */
1411
+ color: #8c8c8c;
1412
+ /* vs-muted */
1413
+ font-style: italic;
1414
+ }
1415
+
1416
+ .markdown-content a {
1417
+ color: #569cd6;
1418
+ /* vs-accent */
1419
+ text-decoration: underline;
1420
+ }
1421
+
1422
+ .markdown-content a:hover {
1423
+ color: #ffffff;
1424
+ }
1425
+
1426
+ .markdown-content hr {
1427
+ border: none;
1428
+ border-top: 1px solid #3e3e42;
1429
+ /* vs-border */
1430
+ margin: 1em 0;
1431
+ /* Full line spacing */
1432
+ }
1433
+
1434
+ /* Remove top margin from first element to avoid double spacing */
1435
+
1436
+ .markdown-content > *:first-child {
1437
+ margin-top: 0;
1438
+ }
1439
+
1440
+ /* Remove bottom margin from last element to avoid extra spacing */
1441
+
1442
+ .markdown-content > *:last-child {
1443
+ margin-bottom: 0;
1444
+ }
1445
+
1446
+ .first\\:mt-0:first-child {
1447
+ margin-top: 0px;
1448
+ }
1449
+
1450
+ .hover\\:bg-vs-border:hover {
1451
+ --tw-bg-opacity: 1;
1452
+ background-color: rgb(62 62 66 / var(--tw-bg-opacity, 1));
1453
+ }
1454
+
1455
+ .hover\\:text-red-300:hover {
1456
+ --tw-text-opacity: 1;
1457
+ color: rgb(252 165 165 / var(--tw-text-opacity, 1));
1458
+ }
1459
+
1460
+ .hover\\:text-vs-accent:hover {
1461
+ --tw-text-opacity: 1;
1462
+ color: rgb(86 156 214 / var(--tw-text-opacity, 1));
1463
+ }
1464
+
1465
+ .hover\\:text-white:hover {
1466
+ --tw-text-opacity: 1;
1467
+ color: rgb(255 255 255 / var(--tw-text-opacity, 1));
1468
+ }
1469
+
1470
+ `;if(mt&&mt!=="__CSS_CONTENT__"){let l=document.createElement("style");l.textContent=mt,document.head.appendChild(l)}document.readyState==="loading"?document.addEventListener("DOMContentLoaded",rs):rs();function rs(){let l=new A,e=document.getElementById("app");e?e.appendChild(l):console.error("App mount point not found")}})();
1471
+ /*! Bundled license information:
1472
+
1473
+ @lit-labs/ssr-dom-shim/lib/element-internals.js:
1474
+ @lit-labs/ssr-dom-shim/lib/events.js:
1475
+ (**
1476
+ * @license
1477
+ * Copyright 2023 Google LLC
1478
+ * SPDX-License-Identifier: BSD-3-Clause
1479
+ *)
1480
+
1481
+ @lit-labs/ssr-dom-shim/index.js:
1482
+ @lit/reactive-element/node/css-tag.js:
1483
+ (**
1484
+ * @license
1485
+ * Copyright 2019 Google LLC
1486
+ * SPDX-License-Identifier: BSD-3-Clause
1487
+ *)
1488
+
1489
+ lit-html/node/lit-html.js:
1490
+ lit-element/lit-element.js:
1491
+ @lit/reactive-element/node/decorators/custom-element.js:
1492
+ @lit/reactive-element/node/decorators/property.js:
1493
+ @lit/reactive-element/node/decorators/state.js:
1494
+ @lit/reactive-element/node/decorators/event-options.js:
1495
+ @lit/reactive-element/node/decorators/base.js:
1496
+ @lit/reactive-element/node/decorators/query.js:
1497
+ @lit/reactive-element/node/decorators/query-all.js:
1498
+ @lit/reactive-element/node/decorators/query-async.js:
1499
+ @lit/reactive-element/node/decorators/query-assigned-nodes.js:
1500
+ lit-html/node/directive.js:
1501
+ lit-html/node/directives/unsafe-html.js:
1502
+ (**
1503
+ * @license
1504
+ * Copyright 2017 Google LLC
1505
+ * SPDX-License-Identifier: BSD-3-Clause
1506
+ *)
1507
+
1508
+ lit-html/node/is-server.js:
1509
+ (**
1510
+ * @license
1511
+ * Copyright 2022 Google LLC
1512
+ * SPDX-License-Identifier: BSD-3-Clause
1513
+ *)
1514
+
1515
+ @lit/reactive-element/node/decorators/query-assigned-elements.js:
1516
+ (**
1517
+ * @license
1518
+ * Copyright 2021 Google LLC
1519
+ * SPDX-License-Identifier: BSD-3-Clause
1520
+ *)
1521
+ */
1522
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbm9kZV9tb2R1bGVzL0BsaXQtbGFicy9zc3ItZG9tLXNoaW0vc3JjL2xpYi9lbGVtZW50LWludGVybmFscy50cyIsICIuLi9ub2RlX21vZHVsZXMvQGxpdC1sYWJzL3Nzci1kb20tc2hpbS9zcmMvbGliL2V2ZW50cy50cyIsICIuLi9ub2RlX21vZHVsZXMvQGxpdC1sYWJzL3Nzci1kb20tc2hpbS9zcmMvaW5kZXgudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BsaXQvcmVhY3RpdmUtZWxlbWVudC9zcmMvY3NzLXRhZy50cyIsICIuLi9ub2RlX21vZHVsZXMvQGxpdC9yZWFjdGl2ZS1lbGVtZW50L3NyYy9yZWFjdGl2ZS1lbGVtZW50LnRzIiwgIi4uL25vZGVfbW9kdWxlcy9saXQtaHRtbC9zcmMvbGl0LWh0bWwudHMiLCAiLi4vbm9kZV9tb2R1bGVzL2xpdC1lbGVtZW50L3NyYy9saXQtZWxlbWVudC50cyIsICIuLi9ub2RlX21vZHVsZXMvQGxpdC9yZWFjdGl2ZS1lbGVtZW50L3NyYy9kZWNvcmF0b3JzL2N1c3RvbS1lbGVtZW50LnRzIiwgIi4uL25vZGVfbW9kdWxlcy9AbGl0L3JlYWN0aXZlLWVsZW1lbnQvc3JjL2RlY29yYXRvcnMvcHJvcGVydHkudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BsaXQvcmVhY3RpdmUtZWxlbWVudC9zcmMvZGVjb3JhdG9ycy9zdGF0ZS50cyIsICIuLi8uLi9zcmMvc2hhcmVkLWNvbnZlcnNhdGlvbi1wcm9jZXNzb3IudHMiLCAiLi4vc3JjL2FwcC50cyIsICIuLi9ub2RlX21vZHVsZXMvbGl0LWh0bWwvc3JjL2RpcmVjdGl2ZS50cyIsICIuLi9ub2RlX21vZHVsZXMvbGl0LWh0bWwvc3JjL2RpcmVjdGl2ZXMvdW5zYWZlLWh0bWwudHMiLCAiLi4vbm9kZV9tb2R1bGVzL2RpZmYvbGliZXNtL2RpZmYvYmFzZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvZGlmZi9saWJlc20vZGlmZi9saW5lLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9tYXJrZWQvc3JjL2RlZmF1bHRzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9tYXJrZWQvc3JjL2hlbHBlcnMudHMiLCAiLi4vbm9kZV9tb2R1bGVzL21hcmtlZC9zcmMvVG9rZW5pemVyLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9tYXJrZWQvc3JjL3J1bGVzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9tYXJrZWQvc3JjL0xleGVyLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9tYXJrZWQvc3JjL1JlbmRlcmVyLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9tYXJrZWQvc3JjL1RleHRSZW5kZXJlci50cyIsICIuLi9ub2RlX21vZHVsZXMvbWFya2VkL3NyYy9QYXJzZXIudHMiLCAiLi4vbm9kZV9tb2R1bGVzL21hcmtlZC9zcmMvSG9va3MudHMiLCAiLi4vbm9kZV9tb2R1bGVzL21hcmtlZC9zcmMvSW5zdGFuY2UudHMiLCAiLi4vbm9kZV9tb2R1bGVzL21hcmtlZC9zcmMvbWFya2VkLnRzIiwgIi4uL3NyYy91dGlscy9tYXJrZG93bi50cyIsICIuLi9zcmMvY29tcG9uZW50cy9zaW1wbGUtY29udmVyc2F0aW9uLXZpZXcudHMiLCAiLi4vc3JjL2NvbXBvbmVudHMvcmF3LXBhaXJzLXZpZXcudHMiLCAiLi4vc3JjL2NvbXBvbmVudHMvanNvbi12aWV3LnRzIiwgIi4uL3NyYy9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIExMQ1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZVxuICovXG5cbnR5cGUgQVJJQUF0dHJpYnV0ZU1hcCA9IHtcbiAgW0sgaW4ga2V5b2YgQVJJQU1peGluXTogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBNYXAgb2YgQVJJQU1peGluIHByb3BlcnRpZXMgdG8gYXR0cmlidXRlc1xuICovXG5leHBvcnQgY29uc3QgYXJpYU1peGluQXR0cmlidXRlczogQVJJQUF0dHJpYnV0ZU1hcCA9IHtcbiAgYXJpYUF0b21pYzogJ2FyaWEtYXRvbWljJyxcbiAgYXJpYUF1dG9Db21wbGV0ZTogJ2FyaWEtYXV0b2NvbXBsZXRlJyxcbiAgYXJpYUJyYWlsbGVMYWJlbDogJ2FyaWEtYnJhaWxsZWxhYmVsJyxcbiAgYXJpYUJyYWlsbGVSb2xlRGVzY3JpcHRpb246ICdhcmlhLWJyYWlsbGVyb2xlZGVzY3JpcHRpb24nLFxuICBhcmlhQnVzeTogJ2FyaWEtYnVzeScsXG4gIGFyaWFDaGVja2VkOiAnYXJpYS1jaGVja2VkJyxcbiAgYXJpYUNvbENvdW50OiAnYXJpYS1jb2xjb3VudCcsXG4gIGFyaWFDb2xJbmRleDogJ2FyaWEtY29saW5kZXgnLFxuICBhcmlhQ29sU3BhbjogJ2FyaWEtY29sc3BhbicsXG4gIGFyaWFDdXJyZW50OiAnYXJpYS1jdXJyZW50JyxcbiAgYXJpYURlc2NyaXB0aW9uOiAnYXJpYS1kZXNjcmlwdGlvbicsXG4gIGFyaWFEaXNhYmxlZDogJ2FyaWEtZGlzYWJsZWQnLFxuICBhcmlhRXhwYW5kZWQ6ICdhcmlhLWV4cGFuZGVkJyxcbiAgYXJpYUhhc1BvcHVwOiAnYXJpYS1oYXNwb3B1cCcsXG4gIGFyaWFIaWRkZW46ICdhcmlhLWhpZGRlbicsXG4gIGFyaWFJbnZhbGlkOiAnYXJpYS1pbnZhbGlkJyxcbiAgYXJpYUtleVNob3J0Y3V0czogJ2FyaWEta2V5c2hvcnRjdXRzJyxcbiAgYXJpYUxhYmVsOiAnYXJpYS1sYWJlbCcsXG4gIGFyaWFMZXZlbDogJ2FyaWEtbGV2ZWwnLFxuICBhcmlhTGl2ZTogJ2FyaWEtbGl2ZScsXG4gIGFyaWFNb2RhbDogJ2FyaWEtbW9kYWwnLFxuICBhcmlhTXVsdGlMaW5lOiAnYXJpYS1tdWx0aWxpbmUnLFxuICBhcmlhTXVsdGlTZWxlY3RhYmxlOiAnYXJpYS1tdWx0aXNlbGVjdGFibGUnLFxuICBhcmlhT3JpZW50YXRpb246ICdhcmlhLW9yaWVudGF0aW9uJyxcbiAgYXJpYVBsYWNlaG9sZGVyOiAnYXJpYS1wbGFjZWhvbGRlcicsXG4gIGFyaWFQb3NJblNldDogJ2FyaWEtcG9zaW5zZXQnLFxuICBhcmlhUHJlc3NlZDogJ2FyaWEtcHJlc3NlZCcsXG4gIGFyaWFSZWFkT25seTogJ2FyaWEtcmVhZG9ubHknLFxuICBhcmlhUmVxdWlyZWQ6ICdhcmlhLXJlcXVpcmVkJyxcbiAgYXJpYVJvbGVEZXNjcmlwdGlvbjogJ2FyaWEtcm9sZWRlc2NyaXB0aW9uJyxcbiAgYXJpYVJvd0NvdW50OiAnYXJpYS1yb3djb3VudCcsXG4gIGFyaWFSb3dJbmRleDogJ2FyaWEtcm93aW5kZXgnLFxuICBhcmlhUm93U3BhbjogJ2FyaWEtcm93c3BhbicsXG4gIGFyaWFTZWxlY3RlZDogJ2FyaWEtc2VsZWN0ZWQnLFxuICBhcmlhU2V0U2l6ZTogJ2FyaWEtc2V0c2l6ZScsXG4gIGFyaWFTb3J0OiAnYXJpYS1zb3J0JyxcbiAgYXJpYVZhbHVlTWF4OiAnYXJpYS12YWx1ZW1heCcsXG4gIGFyaWFWYWx1ZU1pbjogJ2FyaWEtdmFsdWVtaW4nLFxuICBhcmlhVmFsdWVOb3c6ICdhcmlhLXZhbHVlbm93JyxcbiAgYXJpYVZhbHVlVGV4dDogJ2FyaWEtdmFsdWV0ZXh0JyxcbiAgcm9sZTogJ3JvbGUnLFxufTtcblxudHlwZSBFbGVtZW50SW50ZXJuYWxzSW50ZXJmYWNlID0gRWxlbWVudEludGVybmFscztcblxuLy8gU2hpbSB0aGUgZ2xvYmFsIGVsZW1lbnQgaW50ZXJuYWxzIG9iamVjdFxuLy8gTWV0aG9kcyBzaG91bGQgYmUgZmluZSBhcyBub29wcyBhbmQgcHJvcGVydGllcyBjYW4gZ2VuZXJhbGx5XG4vLyBiZSB3aGlsZSBvbiB0aGUgc2VydmVyLlxuZXhwb3J0IGNvbnN0IEVsZW1lbnRJbnRlcm5hbHNTaGltID0gY2xhc3MgRWxlbWVudEludGVybmFsc1xuICBpbXBsZW1lbnRzIEVsZW1lbnRJbnRlcm5hbHNJbnRlcmZhY2VcbntcbiAgYXJpYUF0b21pYyA9ICcnO1xuICBhcmlhQXV0b0NvbXBsZXRlID0gJyc7XG4gIGFyaWFCcmFpbGxlTGFiZWwgPSAnJztcbiAgYXJpYUJyYWlsbGVSb2xlRGVzY3JpcHRpb24gPSAnJztcbiAgYXJpYUJ1c3kgPSAnJztcbiAgYXJpYUNoZWNrZWQgPSAnJztcbiAgYXJpYUNvbENvdW50ID0gJyc7XG4gIGFyaWFDb2xJbmRleCA9ICcnO1xuICBhcmlhQ29sU3BhbiA9ICcnO1xuICBhcmlhQ3VycmVudCA9ICcnO1xuICBhcmlhRGVzY3JpcHRpb24gPSAnJztcbiAgYXJpYURpc2FibGVkID0gJyc7XG4gIGFyaWFFeHBhbmRlZCA9ICcnO1xuICBhcmlhSGFzUG9wdXAgPSAnJztcbiAgYXJpYUhpZGRlbiA9ICcnO1xuICBhcmlhSW52YWxpZCA9ICcnO1xuICBhcmlhS2V5U2hvcnRjdXRzID0gJyc7XG4gIGFyaWFMYWJlbCA9ICcnO1xuICBhcmlhTGV2ZWwgPSAnJztcbiAgYXJpYUxpdmUgPSAnJztcbiAgYXJpYU1vZGFsID0gJyc7XG4gIGFyaWFNdWx0aUxpbmUgPSAnJztcbiAgYXJpYU11bHRpU2VsZWN0YWJsZSA9ICcnO1xuICBhcmlhT3JpZW50YXRpb24gPSAnJztcbiAgYXJpYVBsYWNlaG9sZGVyID0gJyc7XG4gIGFyaWFQb3NJblNldCA9ICcnO1xuICBhcmlhUHJlc3NlZCA9ICcnO1xuICBhcmlhUmVhZE9ubHkgPSAnJztcbiAgYXJpYVJlcXVpcmVkID0gJyc7XG4gIGFyaWFSb2xlRGVzY3JpcHRpb24gPSAnJztcbiAgYXJpYVJvd0NvdW50ID0gJyc7XG4gIGFyaWFSb3dJbmRleCA9ICcnO1xuICBhcmlhUm93U3BhbiA9ICcnO1xuICBhcmlhU2VsZWN0ZWQgPSAnJztcbiAgYXJpYVNldFNpemUgPSAnJztcbiAgYXJpYVNvcnQgPSAnJztcbiAgYXJpYVZhbHVlTWF4ID0gJyc7XG4gIGFyaWFWYWx1ZU1pbiA9ICcnO1xuICBhcmlhVmFsdWVOb3cgPSAnJztcbiAgYXJpYVZhbHVlVGV4dCA9ICcnO1xuICByb2xlID0gJyc7XG4gIF9faG9zdDogSFRNTEVsZW1lbnQ7XG4gIGdldCBzaGFkb3dSb290KCkge1xuICAgIC8vIEdyYWIgdGhlIHNoYWRvdyByb290IGluc3RhbmNlIGZyb20gdGhlIEVsZW1lbnQgc2hpbVxuICAgIC8vIHRvIGVuc3VyZSB0aGF0IHRoZSBzaGFkb3cgcm9vdCBpcyBhbHdheXMgYXZhaWxhYmxlXG4gICAgLy8gdG8gdGhlIGludGVybmFscyBpbnN0YW5jZSBldmVuIGlmIHRoZSBtb2RlIGlzICdjbG9zZWQnXG4gICAgcmV0dXJuICh0aGlzLl9faG9zdCBhcyBIVE1MRWxlbWVudCAmIHtfX3NoYWRvd1Jvb3Q6IFNoYWRvd1Jvb3R9KVxuICAgICAgLl9fc2hhZG93Um9vdDtcbiAgfVxuICBjb25zdHJ1Y3RvcihfaG9zdDogSFRNTEVsZW1lbnQpIHtcbiAgICB0aGlzLl9faG9zdCA9IF9ob3N0O1xuICB9XG4gIGNoZWNrVmFsaWRpdHkoKSB7XG4gICAgLy8gVE9ETyhhdWd1c3RqaykgQ29uc2lkZXIgYWN0dWFsbHkgaW1wbGVtZW50aW5nIGxvZ2ljLlxuICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbGl0L2xpdC9pc3N1ZXMvMzc0MFxuICAgIGNvbnNvbGUud2FybihcbiAgICAgICdgRWxlbWVudEludGVybmFscy5jaGVja1ZhbGlkaXR5KClgIHdhcyBjYWxsZWQgb24gdGhlIHNlcnZlci4nICtcbiAgICAgICAgJ1RoaXMgbWV0aG9kIGFsd2F5cyByZXR1cm5zIHRydWUuJ1xuICAgICk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgZm9ybSA9IG51bGw7XG4gIGxhYmVscyA9IFtdIGFzIHVua25vd24gYXMgTm9kZUxpc3RPZjxIVE1MTGFiZWxFbGVtZW50PjtcbiAgcmVwb3J0VmFsaWRpdHkoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgc2V0Rm9ybVZhbHVlKCk6IHZvaWQge31cbiAgc2V0VmFsaWRpdHkoKTogdm9pZCB7fVxuICBzdGF0ZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgdmFsaWRhdGlvbk1lc3NhZ2UgPSAnJztcbiAgdmFsaWRpdHkgPSB7fSBhcyBWYWxpZGl0eVN0YXRlO1xuICB3aWxsVmFsaWRhdGUgPSB0cnVlO1xufTtcblxuY29uc3QgRWxlbWVudEludGVybmFsc1NoaW1XaXRoUmVhbFR5cGUgPVxuICBFbGVtZW50SW50ZXJuYWxzU2hpbSBhcyBvYmplY3QgYXMgdHlwZW9mIEVsZW1lbnRJbnRlcm5hbHM7XG5leHBvcnQge0VsZW1lbnRJbnRlcm5hbHNTaGltV2l0aFJlYWxUeXBlIGFzIEVsZW1lbnRJbnRlcm5hbHN9O1xuXG5leHBvcnQgY29uc3QgSFlEUkFURV9JTlRFUk5BTFNfQVRUUl9QUkVGSVggPSAnaHlkcmF0ZS1pbnRlcm5hbHMtJztcbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuLyoqXG4gKiBUaGlzIGlzIGEgYmFzaWMgaW1wbGVtZW50YXRpb24gb2YgYW4gRXZlbnRUYXJnZXQsIEV2ZW50IGFuZCBDdXN0b21FdmVudC5cbiAqXG4gKiBUaGlzIGlzIG5vdCBmdWxseSBzcGVjIGNvbXBsaWFudCAoZS5nLiB2YWxpZGF0aW9uKSxcbiAqIGJ1dCBzaG91bGQgd29yayB3ZWxsIGVub3VnaCBmb3Igb3VyIHVzZSBjYXNlcy5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9tLnNwZWMud2hhdHdnLm9yZy8jZXZlbnR0YXJnZXRcbiAqIEBzZWUgaHR0cHM6Ly9kb20uc3BlYy53aGF0d2cub3JnLyNldmVudFxuICogQHNlZSBodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2N1c3RvbWV2ZW50XG4gKi9cblxuZXhwb3J0IGludGVyZmFjZSBFdmVudFRhcmdldFNoaW1NZXRhIHtcbiAgLyoqXG4gICAqIFRoZSBldmVudCB0YXJnZXQgcGFyZW50IHJlcHJlc2VudHMgdGhlIHByZXZpb3VzIGV2ZW50IHRhcmdldCBmb3IgYW4gZXZlbnRcbiAgICogaW4gY2FwdHVyZSBwaGFzZSBhbmQgdGhlIG5leHQgZXZlbnQgdGFyZ2V0IGZvciBhIGJ1YmJsaW5nIGV2ZW50LlxuICAgKiBOb3RlIHRoYXQgdGhpcyBpcyBub3QgdGhlIGVsZW1lbnQgcGFyZW50XG4gICAqL1xuICBfX2V2ZW50VGFyZ2V0UGFyZW50OiBFdmVudFRhcmdldCB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIFRoZSBob3N0IGV2ZW50IHRhcmdldC9lbGVtZW50IG9mIHRoaXMgZXZlbnQgdGFyZ2V0LCBpZiB0aGlzIGV2ZW50IHRhcmdldFxuICAgKiBpcyBpbnNpZGUgYSBTaGFkb3cgRE9NLlxuICAgKi9cbiAgX19ob3N0OiBFdmVudFRhcmdldCB8IHVuZGVmaW5lZDtcbn1cblxudHlwZSBFdmVudFRhcmdldEludGVyZmFjZSA9IEV2ZW50VGFyZ2V0O1xuXG5jb25zdCBpc0NhcHR1cmVFdmVudExpc3RlbmVyID0gKFxuICBvcHRpb25zOiB1bmRlZmluZWQgfCBBZGRFdmVudExpc3RlbmVyT3B0aW9ucyB8IGJvb2xlYW5cbikgPT4gKHR5cGVvZiBvcHRpb25zID09PSAnYm9vbGVhbicgPyBvcHRpb25zIDogb3B0aW9ucz8uY2FwdHVyZSA/PyBmYWxzZSk7XG5cbi8vIEV2ZW50IHBoYXNlc1xuY29uc3QgTk9ORSA9IDA7XG5jb25zdCBDQVBUVVJJTkdfUEhBU0UgPSAxO1xuY29uc3QgQVRfVEFSR0VUID0gMjtcbmNvbnN0IEJVQkJMSU5HX1BIQVNFID0gMztcblxuLy8gU2hpbSB0aGUgZ2xvYmFsIEV2ZW50VGFyZ2V0IG9iamVjdFxuY29uc3QgRXZlbnRUYXJnZXRTaGltID0gY2xhc3MgRXZlbnRUYXJnZXRcbiAgaW1wbGVtZW50cyBFdmVudFRhcmdldEludGVyZmFjZSwgRXZlbnRUYXJnZXRTaGltTWV0YVxue1xuICBwcml2YXRlIF9fZXZlbnRMaXN0ZW5lcnMgPSBuZXcgTWFwPFxuICAgIHN0cmluZyxcbiAgICBNYXA8RXZlbnRMaXN0ZW5lck9yRXZlbnRMaXN0ZW5lck9iamVjdCwgQWRkRXZlbnRMaXN0ZW5lck9wdGlvbnM+XG4gID4oKTtcbiAgcHJpdmF0ZSBfX2NhcHR1cmVFdmVudExpc3RlbmVycyA9IG5ldyBNYXA8XG4gICAgc3RyaW5nLFxuICAgIE1hcDxFdmVudExpc3RlbmVyT3JFdmVudExpc3RlbmVyT2JqZWN0LCBBZGRFdmVudExpc3RlbmVyT3B0aW9ucz5cbiAgPigpO1xuICBfX2V2ZW50VGFyZ2V0UGFyZW50OiBFdmVudFRhcmdldCB8IHVuZGVmaW5lZDtcbiAgX19ob3N0OiBFdmVudFRhcmdldCB8IHVuZGVmaW5lZDtcblxuICBhZGRFdmVudExpc3RlbmVyKFxuICAgIHR5cGU6IHN0cmluZyxcbiAgICBjYWxsYmFjazogRXZlbnRMaXN0ZW5lck9yRXZlbnRMaXN0ZW5lck9iamVjdCB8IG51bGwsXG4gICAgb3B0aW9ucz86IEFkZEV2ZW50TGlzdGVuZXJPcHRpb25zIHwgYm9vbGVhblxuICApOiB2b2lkIHtcbiAgICBpZiAoY2FsbGJhY2sgPT09IHVuZGVmaW5lZCB8fCBjYWxsYmFjayA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBldmVudExpc3RlbmVyc01hcCA9IGlzQ2FwdHVyZUV2ZW50TGlzdGVuZXIob3B0aW9ucylcbiAgICAgID8gdGhpcy5fX2NhcHR1cmVFdmVudExpc3RlbmVyc1xuICAgICAgOiB0aGlzLl9fZXZlbnRMaXN0ZW5lcnM7XG4gICAgbGV0IGV2ZW50TGlzdGVuZXJzID0gZXZlbnRMaXN0ZW5lcnNNYXAuZ2V0KHR5cGUpO1xuICAgIGlmIChldmVudExpc3RlbmVycyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBldmVudExpc3RlbmVycyA9IG5ldyBNYXAoKTtcbiAgICAgIGV2ZW50TGlzdGVuZXJzTWFwLnNldCh0eXBlLCBldmVudExpc3RlbmVycyk7XG4gICAgfSBlbHNlIGlmIChldmVudExpc3RlbmVycy5oYXMoY2FsbGJhY2spKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgbm9ybWFsaXplZE9wdGlvbnMgPVxuICAgICAgdHlwZW9mIG9wdGlvbnMgPT09ICdvYmplY3QnICYmIG9wdGlvbnMgPyBvcHRpb25zIDoge307XG4gICAgbm9ybWFsaXplZE9wdGlvbnMuc2lnbmFsPy5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsICgpID0+XG4gICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgY2FsbGJhY2ssIG9wdGlvbnMpXG4gICAgKTtcbiAgICBldmVudExpc3RlbmVycy5zZXQoY2FsbGJhY2ssIG5vcm1hbGl6ZWRPcHRpb25zID8/IHt9KTtcbiAgfVxuICByZW1vdmVFdmVudExpc3RlbmVyKFxuICAgIHR5cGU6IHN0cmluZyxcbiAgICBjYWxsYmFjazogRXZlbnRMaXN0ZW5lck9yRXZlbnRMaXN0ZW5lck9iamVjdCB8IG51bGwsXG4gICAgb3B0aW9ucz86IEV2ZW50TGlzdGVuZXJPcHRpb25zIHwgYm9vbGVhblxuICApOiB2b2lkIHtcbiAgICBpZiAoY2FsbGJhY2sgPT09IHVuZGVmaW5lZCB8fCBjYWxsYmFjayA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBldmVudExpc3RlbmVyc01hcCA9IGlzQ2FwdHVyZUV2ZW50TGlzdGVuZXIob3B0aW9ucylcbiAgICAgID8gdGhpcy5fX2NhcHR1cmVFdmVudExpc3RlbmVyc1xuICAgICAgOiB0aGlzLl9fZXZlbnRMaXN0ZW5lcnM7XG4gICAgY29uc3QgZXZlbnRMaXN0ZW5lcnMgPSBldmVudExpc3RlbmVyc01hcC5nZXQodHlwZSk7XG4gICAgaWYgKGV2ZW50TGlzdGVuZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGV2ZW50TGlzdGVuZXJzLmRlbGV0ZShjYWxsYmFjayk7XG4gICAgICBpZiAoIWV2ZW50TGlzdGVuZXJzLnNpemUpIHtcbiAgICAgICAgZXZlbnRMaXN0ZW5lcnNNYXAuZGVsZXRlKHR5cGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBkaXNwYXRjaEV2ZW50KGV2ZW50OiBFdmVudCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGNvbXBvc2VkUGF0aDogRXZlbnRUYXJnZXRbXSA9IFt0aGlzXTtcbiAgICBsZXQgcGFyZW50ID0gdGhpcy5fX2V2ZW50VGFyZ2V0UGFyZW50O1xuICAgIGlmIChldmVudC5jb21wb3NlZCkge1xuICAgICAgd2hpbGUgKHBhcmVudCkge1xuICAgICAgICBjb21wb3NlZFBhdGgucHVzaChwYXJlbnQpO1xuICAgICAgICBwYXJlbnQgPSBwYXJlbnQuX19ldmVudFRhcmdldFBhcmVudDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgdGhlIGV2ZW50IGlzIG5vdCBjb21wb3NlZCBhbmQgdGhlIGV2ZW50IHdhcyBkaXNwYXRjaGVkIGluc2lkZVxuICAgICAgLy8gc2hhZG93IERPTSwgd2UgbmVlZCB0byBzdG9wIGJlZm9yZSB0aGUgaG9zdCBvZiB0aGUgc2hhZG93IERPTS5cbiAgICAgIHdoaWxlIChwYXJlbnQgJiYgcGFyZW50ICE9PSB0aGlzLl9faG9zdCkge1xuICAgICAgICBjb21wb3NlZFBhdGgucHVzaChwYXJlbnQpO1xuICAgICAgICBwYXJlbnQgPSBwYXJlbnQuX19ldmVudFRhcmdldFBhcmVudDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBXZSBuZWVkIHRvIHBhdGNoIHZhcmlvdXMgcHJvcGVydGllcyB0aGF0IHdvdWxkIGVpdGhlciBiZSBlbXB0eSBvciB3cm9uZ1xuICAgIC8vIGluIHRoaXMgc2NlbmFyaW8uXG4gICAgbGV0IHN0b3BQcm9wYWdhdGlvbiA9IGZhbHNlO1xuICAgIGxldCBzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24gPSBmYWxzZTtcbiAgICBsZXQgZXZlbnRQaGFzZSA9IE5PTkU7XG4gICAgbGV0IHRhcmdldDogRXZlbnRUYXJnZXQgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgdG1wVGFyZ2V0OiBFdmVudFRhcmdldCB8IG51bGwgPSBudWxsO1xuICAgIGxldCBjdXJyZW50VGFyZ2V0OiBFdmVudFRhcmdldCB8IG51bGwgPSBudWxsO1xuICAgIGNvbnN0IG9yaWdpbmFsU3RvcFByb3BhZ2F0aW9uID0gZXZlbnQuc3RvcFByb3BhZ2F0aW9uO1xuICAgIGNvbnN0IG9yaWdpbmFsU3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uID0gZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGV2ZW50LCB7XG4gICAgICB0YXJnZXQ6IHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgIHJldHVybiB0YXJnZXQgPz8gdG1wVGFyZ2V0O1xuICAgICAgICB9LFxuICAgICAgICAuLi5lbnVtZXJhYmxlUHJvcGVydHksXG4gICAgICB9LFxuICAgICAgc3JjRWxlbWVudDoge1xuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIGV2ZW50LnRhcmdldDtcbiAgICAgICAgfSxcbiAgICAgICAgLi4uZW51bWVyYWJsZVByb3BlcnR5LFxuICAgICAgfSxcbiAgICAgIGN1cnJlbnRUYXJnZXQ6IHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgIHJldHVybiBjdXJyZW50VGFyZ2V0O1xuICAgICAgICB9LFxuICAgICAgICAuLi5lbnVtZXJhYmxlUHJvcGVydHksXG4gICAgICB9LFxuICAgICAgZXZlbnRQaGFzZToge1xuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIGV2ZW50UGhhc2U7XG4gICAgICAgIH0sXG4gICAgICAgIC4uLmVudW1lcmFibGVQcm9wZXJ0eSxcbiAgICAgIH0sXG4gICAgICBjb21wb3NlZFBhdGg6IHtcbiAgICAgICAgdmFsdWU6ICgpID0+IGNvbXBvc2VkUGF0aCxcbiAgICAgICAgLi4uZW51bWVyYWJsZVByb3BlcnR5LFxuICAgICAgfSxcbiAgICAgIHN0b3BQcm9wYWdhdGlvbjoge1xuICAgICAgICB2YWx1ZTogKCkgPT4ge1xuICAgICAgICAgIHN0b3BQcm9wYWdhdGlvbiA9IHRydWU7XG4gICAgICAgICAgb3JpZ2luYWxTdG9wUHJvcGFnYXRpb24uY2FsbChldmVudCk7XG4gICAgICAgIH0sXG4gICAgICAgIC4uLmVudW1lcmFibGVQcm9wZXJ0eSxcbiAgICAgIH0sXG4gICAgICBzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246IHtcbiAgICAgICAgdmFsdWU6ICgpID0+IHtcbiAgICAgICAgICBzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24gPSB0cnVlO1xuICAgICAgICAgIG9yaWdpbmFsU3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uLmNhbGwoZXZlbnQpO1xuICAgICAgICB9LFxuICAgICAgICAuLi5lbnVtZXJhYmxlUHJvcGVydHksXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gQW4gZXZlbnQgaGFuZGxlciBjYW4gZWl0aGVyIGJlIGEgZnVuY3Rpb24sIGFuIG9iamVjdCB3aXRoIGEgaGFuZGxlRXZlbnRcbiAgICAvLyBtZXRob2Qgb3IgbnVsbC4gVGhpcyBmdW5jdGlvbiB0YWtlcyBjYXJlIHRvIGNhbGwgdGhlIGV2ZW50IGhhbmRsZXJcbiAgICAvLyBjb3JyZWN0bHkuXG4gICAgY29uc3QgaW52b2tlRXZlbnRMaXN0ZW5lciA9IChcbiAgICAgIGxpc3RlbmVyOiBFdmVudExpc3RlbmVyT3JFdmVudExpc3RlbmVyT2JqZWN0LFxuICAgICAgb3B0aW9uczogQWRkRXZlbnRMaXN0ZW5lck9wdGlvbnMsXG4gICAgICBldmVudExpc3RlbmVyTWFwOiBNYXA8XG4gICAgICAgIEV2ZW50TGlzdGVuZXJPckV2ZW50TGlzdGVuZXJPYmplY3QsXG4gICAgICAgIEFkZEV2ZW50TGlzdGVuZXJPcHRpb25zXG4gICAgICA+XG4gICAgKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIGxpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGxpc3RlbmVyKGV2ZW50KTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGxpc3RlbmVyPy5oYW5kbGVFdmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBsaXN0ZW5lci5oYW5kbGVFdmVudChldmVudCk7XG4gICAgICB9XG4gICAgICBpZiAob3B0aW9ucy5vbmNlKSB7XG4gICAgICAgIGV2ZW50TGlzdGVuZXJNYXAuZGVsZXRlKGxpc3RlbmVyKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIC8vIFdoZW4gYW4gZXZlbnQgaXMgZmluaXNoZWQgYmVpbmcgZGlzcGF0Y2hlZCwgd2hpY2ggY2FuIGJlIGFmdGVyIHRoZSBldmVudFxuICAgIC8vIHRyZWUgaGFzIGJlZW4gdHJhdmVyc2VkIG9yIHN0b3BQcm9wYWdhdGlvbi9zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24gaGFzXG4gICAgLy8gYmVlbiBjYWxsZWQuIE9uY2UgdGhhdCBpcyB0aGUgY2FzZSwgdGhlIGN1cnJlbnRUYXJnZXQgYW5kIGV2ZW50UGhhc2VcbiAgICAvLyBuZWVkIHRvIGJlIHJlc2V0IGFuZCBhIHZhbHVlLCByZXByZXNlbnRpbmcgd2hldGhlciB0aGUgZXZlbnQgaGFzIG5vdFxuICAgIC8vIGJlZW4gcHJldmVudGVkLCBuZWVkcyB0byBiZSByZXR1cm5lZC5cbiAgICBjb25zdCBmaW5pc2hEaXNwYXRjaCA9ICgpID0+IHtcbiAgICAgIGN1cnJlbnRUYXJnZXQgPSBudWxsO1xuICAgICAgZXZlbnRQaGFzZSA9IE5PTkU7XG4gICAgICByZXR1cm4gIWV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQ7XG4gICAgfTtcblxuICAgIC8vIEFuIGV2ZW50IHN0YXJ0cyB3aXRoIHRoZSBjYXB0dXJlIG9yZGVyLCB3aGVyZSBpdCBzdGFydHMgZnJvbSB0aGUgdG9wLlxuICAgIC8vIFRoaXMgaXMgZG9uZSBldmVuIGlmIGJ1YmJsZXMgaXMgc2V0IHRvIGZhbHNlLCB3aGljaCBpcyB0aGUgZGVmYXVsdC5cbiAgICBjb25zdCBjYXB0dXJlRXZlbnRQYXRoID0gY29tcG9zZWRQYXRoLnNsaWNlKCkucmV2ZXJzZSgpO1xuICAgIC8vIElmIHRoZSBldmVudCB0YXJnZXQsIHdoaWNoIGRpc3BhdGNoZXMgdGhlIGV2ZW50LCBpcyBlaXRoZXIgaW4gdGhlIGxpZ2h0IERPTVxuICAgIC8vIG9yIHRoZSBldmVudCBpcyBub3QgY29tcG9zZWQsIHRoZSB0YXJnZXQgaXMgYWx3YXlzIGl0c2VsZi4gSWYgdGhhdCBpcyBub3RcbiAgICAvLyB0aGUgY2FzZSwgdGhlIHRhcmdldCBuZWVkcyB0byBiZSByZXRhcmdldGVkOiBodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI3JldGFyZ2V0XG4gICAgdGFyZ2V0ID0gIXRoaXMuX19ob3N0IHx8ICFldmVudC5jb21wb3NlZCA/IHRoaXMgOiBudWxsO1xuICAgIGNvbnN0IHJldGFyZ2V0ID0gKGV2ZW50VGFyZ2V0czogRXZlbnRUYXJnZXRbXSkgPT4ge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG4gICAgICB0bXBUYXJnZXQgPSB0aGlzO1xuICAgICAgd2hpbGUgKHRtcFRhcmdldC5fX2hvc3QgJiYgZXZlbnRUYXJnZXRzLmluY2x1ZGVzKHRtcFRhcmdldC5fX2hvc3QpKSB7XG4gICAgICAgIHRtcFRhcmdldCA9IHRtcFRhcmdldC5fX2hvc3Q7XG4gICAgICB9XG4gICAgfTtcbiAgICBmb3IgKGNvbnN0IGV2ZW50VGFyZ2V0IG9mIGNhcHR1cmVFdmVudFBhdGgpIHtcbiAgICAgIGlmICghdGFyZ2V0ICYmICghdG1wVGFyZ2V0IHx8IHRtcFRhcmdldCA9PT0gZXZlbnRUYXJnZXQuX19ob3N0KSkge1xuICAgICAgICByZXRhcmdldChjYXB0dXJlRXZlbnRQYXRoLnNsaWNlKGNhcHR1cmVFdmVudFBhdGguaW5kZXhPZihldmVudFRhcmdldCkpKTtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnRUYXJnZXQgPSBldmVudFRhcmdldDtcbiAgICAgIGV2ZW50UGhhc2UgPSBldmVudFRhcmdldCA9PT0gZXZlbnQudGFyZ2V0ID8gQVRfVEFSR0VUIDogQ0FQVFVSSU5HX1BIQVNFO1xuICAgICAgY29uc3QgY2FwdHVyZUV2ZW50TGlzdGVuZXJzID0gZXZlbnRUYXJnZXQuX19jYXB0dXJlRXZlbnRMaXN0ZW5lcnMuZ2V0KFxuICAgICAgICBldmVudC50eXBlXG4gICAgICApO1xuICAgICAgaWYgKGNhcHR1cmVFdmVudExpc3RlbmVycykge1xuICAgICAgICBmb3IgKGNvbnN0IFtsaXN0ZW5lciwgb3B0aW9uc10gb2YgY2FwdHVyZUV2ZW50TGlzdGVuZXJzKSB7XG4gICAgICAgICAgaW52b2tlRXZlbnRMaXN0ZW5lcihsaXN0ZW5lciwgb3B0aW9ucywgY2FwdHVyZUV2ZW50TGlzdGVuZXJzKTtcbiAgICAgICAgICBpZiAoc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKSB7XG4gICAgICAgICAgICAvLyBFdmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSBzdG9wcyBhbnkgZm9sbG93aW5nIGludm9jYXRpb25cbiAgICAgICAgICAgIC8vIG9mIGFuIGV2ZW50IGhhbmRsZXIgZXZlbiBvbiB0aGUgc2FtZSBldmVudCB0YXJnZXQuXG4gICAgICAgICAgICByZXR1cm4gZmluaXNoRGlzcGF0Y2goKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzdG9wUHJvcGFnYXRpb24pIHtcbiAgICAgICAgLy8gRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCkgc3RvcHMgYW55IGZvbGxvd2luZyBpbnZvY2F0aW9uXG4gICAgICAgIC8vIG9mIGFuIGV2ZW50IGhhbmRsZXIgZm9yIGFueSBmb2xsb3dpbmcgZXZlbnQgdGFyZ2V0cy5cbiAgICAgICAgcmV0dXJuIGZpbmlzaERpc3BhdGNoKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYnViYmxlRXZlbnRQYXRoID0gZXZlbnQuYnViYmxlcyA/IGNvbXBvc2VkUGF0aCA6IFt0aGlzXTtcbiAgICB0bXBUYXJnZXQgPSBudWxsO1xuICAgIGZvciAoY29uc3QgZXZlbnRUYXJnZXQgb2YgYnViYmxlRXZlbnRQYXRoKSB7XG4gICAgICBpZiAoXG4gICAgICAgICF0YXJnZXQgJiZcbiAgICAgICAgKCF0bXBUYXJnZXQgfHwgZXZlbnRUYXJnZXQgPT09ICh0bXBUYXJnZXQgYXMgRXZlbnRUYXJnZXQpLl9faG9zdClcbiAgICAgICkge1xuICAgICAgICByZXRhcmdldChcbiAgICAgICAgICBidWJibGVFdmVudFBhdGguc2xpY2UoMCwgYnViYmxlRXZlbnRQYXRoLmluZGV4T2YoZXZlbnRUYXJnZXQpICsgMSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnRUYXJnZXQgPSBldmVudFRhcmdldDtcbiAgICAgIGV2ZW50UGhhc2UgPSBldmVudFRhcmdldCA9PT0gZXZlbnQudGFyZ2V0ID8gQVRfVEFSR0VUIDogQlVCQkxJTkdfUEhBU0U7XG4gICAgICBjb25zdCBjYXB0dXJlRXZlbnRMaXN0ZW5lcnMgPSBldmVudFRhcmdldC5fX2V2ZW50TGlzdGVuZXJzLmdldChcbiAgICAgICAgZXZlbnQudHlwZVxuICAgICAgKTtcbiAgICAgIGlmIChjYXB0dXJlRXZlbnRMaXN0ZW5lcnMpIHtcbiAgICAgICAgZm9yIChjb25zdCBbbGlzdGVuZXIsIG9wdGlvbnNdIG9mIGNhcHR1cmVFdmVudExpc3RlbmVycykge1xuICAgICAgICAgIGludm9rZUV2ZW50TGlzdGVuZXIobGlzdGVuZXIsIG9wdGlvbnMsIGNhcHR1cmVFdmVudExpc3RlbmVycyk7XG4gICAgICAgICAgaWYgKHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbikge1xuICAgICAgICAgICAgLy8gRXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCkgc3RvcHMgYW55IGZvbGxvd2luZyBpbnZvY2F0aW9uXG4gICAgICAgICAgICAvLyBvZiBhbiBldmVudCBoYW5kbGVyIGV2ZW4gb24gdGhlIHNhbWUgZXZlbnQgdGFyZ2V0LlxuICAgICAgICAgICAgcmV0dXJuIGZpbmlzaERpc3BhdGNoKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoc3RvcFByb3BhZ2F0aW9uKSB7XG4gICAgICAgIC8vIEV2ZW50LnN0b3BQcm9wYWdhdGlvbigpIHN0b3BzIGFueSBmb2xsb3dpbmcgaW52b2NhdGlvblxuICAgICAgICAvLyBvZiBhbiBldmVudCBoYW5kbGVyIGZvciBhbnkgZm9sbG93aW5nIGV2ZW50IHRhcmdldHMuXG4gICAgICAgIHJldHVybiBmaW5pc2hEaXNwYXRjaCgpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmluaXNoRGlzcGF0Y2goKTtcbiAgfVxufTtcblxuY29uc3QgRXZlbnRUYXJnZXRTaGltV2l0aFJlYWxUeXBlID1cbiAgRXZlbnRUYXJnZXRTaGltIGFzIG9iamVjdCBhcyB0eXBlb2YgRXZlbnRUYXJnZXQ7XG5leHBvcnQge1xuICBFdmVudFRhcmdldFNoaW1XaXRoUmVhbFR5cGUgYXMgRXZlbnRUYXJnZXQsXG4gIEV2ZW50VGFyZ2V0U2hpbVdpdGhSZWFsVHlwZSBhcyBFdmVudFRhcmdldFNoaW0sXG59O1xuXG4vKiBBZGFwdGVkIGZyb20gTm9kZS5qcyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvYmxvYi9tYWluL2xpYi9pbnRlcm5hbC9ldmVudF90YXJnZXQuanMgKi9cblxudHlwZSBFdmVudEludGVyZmFjZSA9IEV2ZW50O1xuXG5jb25zdCBlbnVtZXJhYmxlUHJvcGVydHk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge19fcHJvdG9fXzogbnVsbH07XG5lbnVtZXJhYmxlUHJvcGVydHkuZW51bWVyYWJsZSA9IHRydWU7XG5PYmplY3QuZnJlZXplKGVudW1lcmFibGVQcm9wZXJ0eSk7XG5cbi8vIFRPRE86IFJlbW92ZSB0aGlzIHdoZW4gd2UgcmVtb3ZlIHN1cHBvcnQgZm9yIHZtIG1vZHVsZXMgKC0tZXhwZXJpbWVudGFsLXZtLW1vZHVsZXMpLlxuY29uc3QgRXZlbnRTaGltID0gY2xhc3MgRXZlbnQgaW1wbGVtZW50cyBFdmVudEludGVyZmFjZSB7XG4gICNjYW5jZWxhYmxlID0gZmFsc2U7XG4gICNidWJibGVzID0gZmFsc2U7XG4gICNjb21wb3NlZCA9IGZhbHNlO1xuICAjZGVmYXVsdFByZXZlbnRlZCA9IGZhbHNlO1xuICAjdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgI3Byb3BhZ2F0aW9uU3RvcHBlZCA9IGZhbHNlO1xuICAjdHlwZTogc3RyaW5nO1xuICAjdGFyZ2V0OiBFdmVudFRhcmdldCB8IG51bGw7XG4gICNpc0JlaW5nRGlzcGF0Y2hlZDogYm9vbGVhbjtcbiAgcmVhZG9ubHkgTk9ORSA9IE5PTkU7XG4gIHJlYWRvbmx5IENBUFRVUklOR19QSEFTRSA9IENBUFRVUklOR19QSEFTRTtcbiAgcmVhZG9ubHkgQVRfVEFSR0VUID0gQVRfVEFSR0VUO1xuICByZWFkb25seSBCVUJCTElOR19QSEFTRSA9IEJVQkJMSU5HX1BIQVNFO1xuICBzdGF0aWMgcmVhZG9ubHkgTk9ORSA9IE5PTkU7XG4gIHN0YXRpYyByZWFkb25seSBDQVBUVVJJTkdfUEhBU0UgPSBDQVBUVVJJTkdfUEhBU0U7XG4gIHN0YXRpYyByZWFkb25seSBBVF9UQVJHRVQgPSBBVF9UQVJHRVQ7XG4gIHN0YXRpYyByZWFkb25seSBCVUJCTElOR19QSEFTRSA9IEJVQkJMSU5HX1BIQVNFO1xuXG4gIGNvbnN0cnVjdG9yKHR5cGU6IHN0cmluZywgb3B0aW9uczogRXZlbnRJbml0ID0ge30pIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMClcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHR5cGUgYXJndW1lbnQgbXVzdCBiZSBzcGVjaWZpZWRgKTtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgIT09ICdvYmplY3QnIHx8ICFvcHRpb25zKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBcIm9wdGlvbnNcIiBhcmd1bWVudCBtdXN0IGJlIGFuIG9iamVjdGApO1xuICAgIH1cbiAgICBjb25zdCB7YnViYmxlcywgY2FuY2VsYWJsZSwgY29tcG9zZWR9ID0gb3B0aW9ucztcbiAgICB0aGlzLiNjYW5jZWxhYmxlID0gISFjYW5jZWxhYmxlO1xuICAgIHRoaXMuI2J1YmJsZXMgPSAhIWJ1YmJsZXM7XG4gICAgdGhpcy4jY29tcG9zZWQgPSAhIWNvbXBvc2VkO1xuXG4gICAgdGhpcy4jdHlwZSA9IGAke3R5cGV9YDtcbiAgICB0aGlzLiN0YXJnZXQgPSBudWxsO1xuICAgIHRoaXMuI2lzQmVpbmdEaXNwYXRjaGVkID0gZmFsc2U7XG4gIH1cblxuICBpbml0RXZlbnQoX3R5cGU6IHN0cmluZywgX2J1YmJsZXM/OiBib29sZWFuLCBfY2FuY2VsYWJsZT86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cblxuICBzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSB7XG4gICAgdGhpcy5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuXG4gIHByZXZlbnREZWZhdWx0KCkge1xuICAgIHRoaXMuI2RlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlO1xuICB9XG5cbiAgZ2V0IHRhcmdldCgpOiBFdmVudFRhcmdldCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLiN0YXJnZXQ7XG4gIH1cblxuICBnZXQgY3VycmVudFRhcmdldCgpOiBFdmVudFRhcmdldCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLiN0YXJnZXQ7XG4gIH1cblxuICBnZXQgc3JjRWxlbWVudCgpOiBFdmVudFRhcmdldCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLiN0YXJnZXQ7XG4gIH1cblxuICBnZXQgdHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLiN0eXBlO1xuICB9XG5cbiAgZ2V0IGNhbmNlbGFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuI2NhbmNlbGFibGU7XG4gIH1cblxuICBnZXQgZGVmYXVsdFByZXZlbnRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy4jY2FuY2VsYWJsZSAmJiB0aGlzLiNkZWZhdWx0UHJldmVudGVkO1xuICB9XG5cbiAgZ2V0IHRpbWVTdGFtcCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLiN0aW1lc3RhbXA7XG4gIH1cblxuICBjb21wb3NlZFBhdGgoKTogRXZlbnRUYXJnZXRbXSB7XG4gICAgcmV0dXJuIHRoaXMuI2lzQmVpbmdEaXNwYXRjaGVkID8gW3RoaXMuI3RhcmdldCFdIDogW107XG4gIH1cblxuICBnZXQgcmV0dXJuVmFsdWUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLiNjYW5jZWxhYmxlIHx8ICF0aGlzLiNkZWZhdWx0UHJldmVudGVkO1xuICB9XG5cbiAgZ2V0IGJ1YmJsZXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuI2J1YmJsZXM7XG4gIH1cblxuICBnZXQgY29tcG9zZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuI2NvbXBvc2VkO1xuICB9XG5cbiAgZ2V0IGV2ZW50UGhhc2UoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy4jaXNCZWluZ0Rpc3BhdGNoZWQgPyBFdmVudC5BVF9UQVJHRVQgOiBFdmVudC5OT05FO1xuICB9XG5cbiAgZ2V0IGNhbmNlbEJ1YmJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy4jcHJvcGFnYXRpb25TdG9wcGVkO1xuICB9XG5cbiAgc2V0IGNhbmNlbEJ1YmJsZSh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy4jcHJvcGFnYXRpb25TdG9wcGVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBzdG9wUHJvcGFnYXRpb24oKTogdm9pZCB7XG4gICAgdGhpcy4jcHJvcGFnYXRpb25TdG9wcGVkID0gdHJ1ZTtcbiAgfVxuXG4gIGdldCBpc1RydXN0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhFdmVudFNoaW0ucHJvdG90eXBlLCB7XG4gIGluaXRFdmVudDogZW51bWVyYWJsZVByb3BlcnR5LFxuICBzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246IGVudW1lcmFibGVQcm9wZXJ0eSxcbiAgcHJldmVudERlZmF1bHQ6IGVudW1lcmFibGVQcm9wZXJ0eSxcbiAgdGFyZ2V0OiBlbnVtZXJhYmxlUHJvcGVydHksXG4gIGN1cnJlbnRUYXJnZXQ6IGVudW1lcmFibGVQcm9wZXJ0eSxcbiAgc3JjRWxlbWVudDogZW51bWVyYWJsZVByb3BlcnR5LFxuICB0eXBlOiBlbnVtZXJhYmxlUHJvcGVydHksXG4gIGNhbmNlbGFibGU6IGVudW1lcmFibGVQcm9wZXJ0eSxcbiAgZGVmYXVsdFByZXZlbnRlZDogZW51bWVyYWJsZVByb3BlcnR5LFxuICB0aW1lU3RhbXA6IGVudW1lcmFibGVQcm9wZXJ0eSxcbiAgY29tcG9zZWRQYXRoOiBlbnVtZXJhYmxlUHJvcGVydHksXG4gIHJldHVyblZhbHVlOiBlbnVtZXJhYmxlUHJvcGVydHksXG4gIGJ1YmJsZXM6IGVudW1lcmFibGVQcm9wZXJ0eSxcbiAgY29tcG9zZWQ6IGVudW1lcmFibGVQcm9wZXJ0eSxcbiAgZXZlbnRQaGFzZTogZW51bWVyYWJsZVByb3BlcnR5LFxuICBjYW5jZWxCdWJibGU6IGVudW1lcmFibGVQcm9wZXJ0eSxcbiAgc3RvcFByb3BhZ2F0aW9uOiBlbnVtZXJhYmxlUHJvcGVydHksXG4gIGlzVHJ1c3RlZDogZW51bWVyYWJsZVByb3BlcnR5LFxufSk7XG5cbnR5cGUgQ3VzdG9tRXZlbnRJbnRlcmZhY2UgPSBDdXN0b21FdmVudDtcblxuLy8gVE9ETzogUmVtb3ZlIHRoaXMgd2hlbiB3ZSByZW1vdmUgc3VwcG9ydCBmb3Igdm0gbW9kdWxlcyAoLS1leHBlcmltZW50YWwtdm0tbW9kdWxlcykuXG5jb25zdCBDdXN0b21FdmVudFNoaW0gPSBjbGFzcyBDdXN0b21FdmVudDxUPlxuICBleHRlbmRzIEV2ZW50U2hpbVxuICBpbXBsZW1lbnRzIEN1c3RvbUV2ZW50SW50ZXJmYWNlXG57XG4gICNkZXRhaWw6IFQgfCBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKHR5cGU6IHN0cmluZywgb3B0aW9uczogQ3VzdG9tRXZlbnRJbml0PFQ+ID0ge30pIHtcbiAgICBzdXBlcih0eXBlLCBvcHRpb25zKTtcbiAgICB0aGlzLiNkZXRhaWwgPSBvcHRpb25zPy5kZXRhaWwgPz8gbnVsbDtcbiAgfVxuXG4gIGluaXRDdXN0b21FdmVudChcbiAgICBfdHlwZTogc3RyaW5nLFxuICAgIF9idWJibGVzPzogYm9vbGVhbixcbiAgICBfY2FuY2VsYWJsZT86IGJvb2xlYW4sXG4gICAgX2RldGFpbD86IFRcbiAgKTogdm9pZCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG5cbiAgZ2V0IGRldGFpbCgpOiBUIHtcbiAgICByZXR1cm4gdGhpcy4jZGV0YWlsITtcbiAgfVxufTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQ3VzdG9tRXZlbnRTaGltLnByb3RvdHlwZSwge1xuICBkZXRhaWw6IGVudW1lcmFibGVQcm9wZXJ0eSxcbn0pO1xuXG5jb25zdCBFdmVudFNoaW1XaXRoUmVhbFR5cGUgPSBFdmVudFNoaW0gYXMgb2JqZWN0IGFzIHR5cGVvZiBFdmVudDtcbmNvbnN0IEN1c3RvbUV2ZW50U2hpbVdpdGhSZWFsVHlwZSA9XG4gIEN1c3RvbUV2ZW50U2hpbSBhcyBvYmplY3QgYXMgdHlwZW9mIEN1c3RvbUV2ZW50O1xuZXhwb3J0IHtcbiAgRXZlbnRTaGltV2l0aFJlYWxUeXBlIGFzIEV2ZW50LFxuICBFdmVudFNoaW1XaXRoUmVhbFR5cGUgYXMgRXZlbnRTaGltLFxuICBDdXN0b21FdmVudFNoaW1XaXRoUmVhbFR5cGUgYXMgQ3VzdG9tRXZlbnQsXG4gIEN1c3RvbUV2ZW50U2hpbVdpdGhSZWFsVHlwZSBhcyBDdXN0b21FdmVudFNoaW0sXG59O1xuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2VcbiAqL1xuaW1wb3J0IHtFbGVtZW50SW50ZXJuYWxzU2hpbX0gZnJvbSAnLi9saWIvZWxlbWVudC1pbnRlcm5hbHMuanMnO1xuaW1wb3J0IHtcbiAgRXZlbnRUYXJnZXRTaGltLFxuICBFdmVudFNoaW0sXG4gIEN1c3RvbUV2ZW50U2hpbSxcbiAgRXZlbnRUYXJnZXRTaGltTWV0YSxcbn0gZnJvbSAnLi9saWIvZXZlbnRzLmpzJztcblxuZXhwb3J0IHtcbiAgYXJpYU1peGluQXR0cmlidXRlcyxcbiAgRWxlbWVudEludGVybmFscyxcbiAgSFlEUkFURV9JTlRFUk5BTFNfQVRUUl9QUkVGSVgsXG59IGZyb20gJy4vbGliL2VsZW1lbnQtaW50ZXJuYWxzLmpzJztcbmV4cG9ydCB7Q3VzdG9tRXZlbnQsIEV2ZW50LCBFdmVudFRhcmdldH0gZnJvbSAnLi9saWIvZXZlbnRzLmpzJztcblxuLy8gSW4gYW4gZW1wdHkgTm9kZS5qcyB2bSwgd2UgbmVlZCB0byBwYXRjaCB0aGUgZ2xvYmFsIGNvbnRleHQuXG4vLyBUT0RPOiBSZW1vdmUgdGhlc2UgZ2xvYmFsVGhpcyBhc3NpZ25tZW50cyB3aGVuIHdlIHJlbW92ZSBzdXBwb3J0XG4vLyBmb3Igdm0gbW9kdWxlcyAoLS1leHBlcmltZW50YWwtdm0tbW9kdWxlcykuXG5nbG9iYWxUaGlzLkV2ZW50ID8/PSBFdmVudFNoaW07XG5nbG9iYWxUaGlzLkN1c3RvbUV2ZW50ID8/PSBDdXN0b21FdmVudFNoaW07XG5cbi8vIEludGVybmFsIHR5cGUgdG8gYmUgdXNlZCBmb3IgdGhlIGV2ZW50IHBvbHlmaWxsIGZ1bmN0aW9uYWxpdHkuXG5leHBvcnQgdHlwZSBIVE1MRWxlbWVudFdpdGhFdmVudE1ldGEgPSBIVE1MRWxlbWVudCAmIEV2ZW50VGFyZ2V0U2hpbU1ldGE7XG5cbmNvbnN0IGF0dHJpYnV0ZXMgPSBuZXcgV2Vha01hcDxcbiAgSW5zdGFuY2VUeXBlPHR5cGVvZiBIVE1MRWxlbWVudFNoaW0+LFxuICBNYXA8c3RyaW5nLCBzdHJpbmc+XG4+KCk7XG5jb25zdCBhdHRyaWJ1dGVzRm9yRWxlbWVudCA9IChcbiAgZWxlbWVudDogSW5zdGFuY2VUeXBlPHR5cGVvZiBIVE1MRWxlbWVudFNoaW0+XG4pID0+IHtcbiAgbGV0IGF0dHJzID0gYXR0cmlidXRlcy5nZXQoZWxlbWVudCk7XG4gIGlmIChhdHRycyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYXR0cmlidXRlcy5zZXQoZWxlbWVudCwgKGF0dHJzID0gbmV3IE1hcCgpKSk7XG4gIH1cbiAgcmV0dXJuIGF0dHJzO1xufTtcblxuLy8gVGhlIHR5cGluZ3MgYXJvdW5kIHRoZSBleHBvcnRzIGJlbG93IGFyZSBhIGxpdHRsZSBmdW5reTpcbi8vXG4vLyAxLiBXZSB3YW50IHRoZSBgbmFtZWAgb2YgdGhlIHNoaW0gY2xhc3NlcyB0byBtYXRjaCB0aGUgcmVhbCBvbmVzIGF0IHJ1bnRpbWUsXG4vLyAgICBoZW5jZSBlLmcuIGBjbGFzcyBFbGVtZW50YC5cbi8vIDIuIFdlIGNhbid0IHNoYWRvdyB0aGUgZ2xvYmFsIHR5cGVzIHdpdGggYSBzaW1wbGUgY2xhc3MgZGVjbGFyYXRpb24sIGJlY2F1c2Vcbi8vICAgIHRoZW4gd2UgY2FuJ3QgcmVmZXJlbmNlIHRoZSBnbG9iYWwgdHlwZXMgZm9yIGNhc3RpbmcsIGhlbmNlIGUuZy5cbi8vICAgIGBjb25zdCBFbGVtZW50U2hpbSA9IGNsYXNzIEVsZW1lbnRgLlxuLy8gMy4gV2Ugd2FudCB0byBleHBvcnQgdGhlIGNsYXNzZXMgdHlwZWQgYXMgdGhlIHJlYWwgb25lcywgaGVuY2UgZS5nLlxuLy8gICAgYGNvbnN0IEVsZW1lbnRTaGltV2l0aFJlYWxUeXBlID0gRWxlbWVudFNoaW0gYXMgb2JqZWN0IGFzIHR5cGVvZiBFbGVtZW50O2AuXG4vLyA0LiBXZSB3YW50IHRoZSBleHBvcnRlZCBuYW1lcyB0byBtYXRjaCB0aGUgcmVhbCBvbmVzLCBoZW5jZSBlLmcuXG4vLyAgICBgZXhwb3J0IHtFbGVtZW50U2hpbVdpdGhSZWFsVHlwZSBhcyBFbGVtZW50fWAuXG5jb25zdCBFbGVtZW50U2hpbSA9IGNsYXNzIEVsZW1lbnQgZXh0ZW5kcyBFdmVudFRhcmdldFNoaW0ge1xuICBnZXQgYXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShhdHRyaWJ1dGVzRm9yRWxlbWVudCh0aGlzKSkubWFwKChbbmFtZSwgdmFsdWVdKSA9PiAoe1xuICAgICAgbmFtZSxcbiAgICAgIHZhbHVlLFxuICAgIH0pKTtcbiAgfVxuICBwcml2YXRlIF9fc2hhZG93Um9vdE1vZGU6IG51bGwgfCBTaGFkb3dSb290TW9kZSA9IG51bGw7XG4gIHByb3RlY3RlZCBfX3NoYWRvd1Jvb3Q6IG51bGwgfCBTaGFkb3dSb290ID0gbnVsbDtcbiAgcHJvdGVjdGVkIF9faW50ZXJuYWxzOiBudWxsIHwgRWxlbWVudEludGVybmFscyA9IG51bGw7XG5cbiAgZ2V0IHNoYWRvd1Jvb3QoKSB7XG4gICAgaWYgKHRoaXMuX19zaGFkb3dSb290TW9kZSA9PT0gJ2Nsb3NlZCcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fX3NoYWRvd1Jvb3Q7XG4gIH1cbiAgZ2V0IGxvY2FsTmFtZSgpIHtcbiAgICByZXR1cm4gKHRoaXMuY29uc3RydWN0b3IgYXMgTmFtZWRDdXN0b21IVE1MRWxlbWVudENvbnN0cnVjdG9yKS5fX2xvY2FsTmFtZTtcbiAgfVxuICBnZXQgdGFnTmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5sb2NhbE5hbWU/LnRvVXBwZXJDYXNlKCk7XG4gIH1cbiAgc2V0QXR0cmlidXRlKG5hbWU6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICAvLyBFbXVsYXRlIGJyb3dzZXIgYmVoYXZpb3IgdGhhdCBzaWxlbnRseSBjYXN0cyBhbGwgdmFsdWVzIHRvIHN0cmluZy4gRS5nLlxuICAgIC8vIGA0MmAgYmVjb21lcyBgXCI0MlwiYCBhbmQgYHt9YCBiZWNvbWVzIGBcIltvYmplY3QgT2JqZWN0XVwiXCJgLlxuICAgIGF0dHJpYnV0ZXNGb3JFbGVtZW50KHRoaXMpLnNldChuYW1lLCBTdHJpbmcodmFsdWUpKTtcbiAgfVxuICByZW1vdmVBdHRyaWJ1dGUobmFtZTogc3RyaW5nKSB7XG4gICAgYXR0cmlidXRlc0ZvckVsZW1lbnQodGhpcykuZGVsZXRlKG5hbWUpO1xuICB9XG4gIHRvZ2dsZUF0dHJpYnV0ZShuYW1lOiBzdHJpbmcsIGZvcmNlPzogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgIC8vIFN0ZXBzIHJlZmVyZW5jZSBodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2RvbS1lbGVtZW50LXRvZ2dsZWF0dHJpYnV0ZVxuICAgIGlmICh0aGlzLmhhc0F0dHJpYnV0ZShuYW1lKSkge1xuICAgICAgLy8gU3RlcCA1XG4gICAgICBpZiAoZm9yY2UgPT09IHVuZGVmaW5lZCB8fCAhZm9yY2UpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU3RlcCA0XG4gICAgICBpZiAoZm9yY2UgPT09IHVuZGVmaW5lZCB8fCBmb3JjZSkge1xuICAgICAgICAvLyBTdGVwIDQuMVxuICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCAnJyk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gU3RlcCA0LjJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBTdGVwIDZcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBoYXNBdHRyaWJ1dGUobmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGF0dHJpYnV0ZXNGb3JFbGVtZW50KHRoaXMpLmhhcyhuYW1lKTtcbiAgfVxuICBhdHRhY2hTaGFkb3coaW5pdDogU2hhZG93Um9vdEluaXQpOiBTaGFkb3dSb290IHtcbiAgICBjb25zdCBzaGFkb3dSb290ID0ge2hvc3Q6IHRoaXN9IGFzIG9iamVjdCBhcyBTaGFkb3dSb290O1xuICAgIHRoaXMuX19zaGFkb3dSb290TW9kZSA9IGluaXQubW9kZTtcbiAgICBpZiAoaW5pdCAmJiBpbml0Lm1vZGUgPT09ICdvcGVuJykge1xuICAgICAgdGhpcy5fX3NoYWRvd1Jvb3QgPSBzaGFkb3dSb290O1xuICAgIH1cbiAgICByZXR1cm4gc2hhZG93Um9vdDtcbiAgfVxuICBhdHRhY2hJbnRlcm5hbHMoKTogRWxlbWVudEludGVybmFscyB7XG4gICAgaWYgKHRoaXMuX19pbnRlcm5hbHMgIT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byBleGVjdXRlICdhdHRhY2hJbnRlcm5hbHMnIG9uICdIVE1MRWxlbWVudCc6IGAgK1xuICAgICAgICAgIGBFbGVtZW50SW50ZXJuYWxzIGZvciB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgd2FzIGFscmVhZHkgYXR0YWNoZWQuYFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgaW50ZXJuYWxzID0gbmV3IEVsZW1lbnRJbnRlcm5hbHNTaGltKHRoaXMgYXMgdW5rbm93biBhcyBIVE1MRWxlbWVudCk7XG4gICAgdGhpcy5fX2ludGVybmFscyA9IGludGVybmFscztcbiAgICByZXR1cm4gaW50ZXJuYWxzIGFzIEVsZW1lbnRJbnRlcm5hbHM7XG4gIH1cbiAgZ2V0QXR0cmlidXRlKG5hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IHZhbHVlID0gYXR0cmlidXRlc0ZvckVsZW1lbnQodGhpcykuZ2V0KG5hbWUpO1xuICAgIHJldHVybiB2YWx1ZSA/PyBudWxsO1xuICB9XG59O1xuY29uc3QgRWxlbWVudFNoaW1XaXRoUmVhbFR5cGUgPSBFbGVtZW50U2hpbSBhcyBvYmplY3QgYXMgdHlwZW9mIEVsZW1lbnQ7XG5leHBvcnQge0VsZW1lbnRTaGltV2l0aFJlYWxUeXBlIGFzIEVsZW1lbnR9O1xuXG5jb25zdCBIVE1MRWxlbWVudFNoaW0gPSBjbGFzcyBIVE1MRWxlbWVudCBleHRlbmRzIEVsZW1lbnRTaGltIHt9O1xuY29uc3QgSFRNTEVsZW1lbnRTaGltV2l0aFJlYWxUeXBlID1cbiAgSFRNTEVsZW1lbnRTaGltIGFzIG9iamVjdCBhcyB0eXBlb2YgSFRNTEVsZW1lbnQ7XG5leHBvcnQge0hUTUxFbGVtZW50U2hpbVdpdGhSZWFsVHlwZSBhcyBIVE1MRWxlbWVudH07XG5cbi8vIEZvciBjb252ZW5pZW5jZSwgd2UgcHJvdmlkZSBhIGdsb2JhbCBpbnN0YW5jZSBvZiBhIEhUTUxFbGVtZW50IGFzIGFuIGV2ZW50XG4vLyB0YXJnZXQuIFRoaXMgZmFjaWxpdGF0ZXMgcmVnaXN0ZXJpbmcgZ2xvYmFsIGV2ZW50IGhhbmRsZXJzXG4vLyAoZS5nLiBmb3IgQGxpdC9jb250ZXh0IENvbnRleHRQcm92aWRlcikuXG4vLyBXZSB1c2UgdGhpcyBpbiBpbiB0aGUgU1NSIHJlbmRlciBmdW5jdGlvbi5cbi8vIE5vdGUsIHRoaXMgaXMgYSBiZXNwb2tlIGVsZW1lbnQgYW5kIG5vdCBzaW1wbHkgYGRvY3VtZW50YCBvciBgd2luZG93YCBzaW5jZVxuLy8gdXNlciBjb2RlIHJlbGllcyBvbiB0aGVzZSBiZWluZyB1bmRlZmluZWQgaW4gdGhlIHNlcnZlciBlbnZpcm9ubWVudC5cbmdsb2JhbFRoaXMubGl0U2VydmVyUm9vdCA/Pz0gT2JqZWN0LmRlZmluZVByb3BlcnR5KFxuICBuZXcgSFRNTEVsZW1lbnRTaGltV2l0aFJlYWxUeXBlKCksXG4gICdsb2NhbE5hbWUnLFxuICB7XG4gICAgLy8gUGF0Y2ggbG9jYWxOYW1lIChhbmQgdGFnTmFtZSkgdG8gcmV0dXJuIGEgdW5pcXVlIG5hbWUuXG4gICAgZ2V0KCkge1xuICAgICAgcmV0dXJuICdsaXQtc2VydmVyLXJvb3QnO1xuICAgIH0sXG4gIH1cbik7XG5cbmludGVyZmFjZSBDdXN0b21IVE1MRWxlbWVudENvbnN0cnVjdG9yIHtcbiAgbmV3ICgpOiBIVE1MRWxlbWVudDtcbiAgb2JzZXJ2ZWRBdHRyaWJ1dGVzPzogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBOYW1lZEN1c3RvbUhUTUxFbGVtZW50Q29uc3RydWN0b3JcbiAgZXh0ZW5kcyBDdXN0b21IVE1MRWxlbWVudENvbnN0cnVjdG9yIHtcbiAgX19sb2NhbE5hbWU6IHN0cmluZztcbn1cblxudHlwZSBDdXN0b21FbGVtZW50UmVnaXN0cmF0aW9uID0ge1xuICBjdG9yOiB7bmV3ICgpOiBIVE1MRWxlbWVudH07XG4gIG9ic2VydmVkQXR0cmlidXRlczogc3RyaW5nW107XG59O1xuXG5jb25zdCBDdXN0b21FbGVtZW50UmVnaXN0cnlTaGltID0gY2xhc3MgQ3VzdG9tRWxlbWVudFJlZ2lzdHJ5IHtcbiAgcHJpdmF0ZSBfX2RlZmluaXRpb25zID0gbmV3IE1hcDxzdHJpbmcsIEN1c3RvbUVsZW1lbnRSZWdpc3RyYXRpb24+KCk7XG5cbiAgZGVmaW5lKG5hbWU6IHN0cmluZywgY3RvcjogQ3VzdG9tSFRNTEVsZW1lbnRDb25zdHJ1Y3Rvcikge1xuICAgIGlmICh0aGlzLl9fZGVmaW5pdGlvbnMuaGFzKG5hbWUpKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGAnQ3VzdG9tRWxlbWVudFJlZ2lzdHJ5JyBhbHJlYWR5IGhhcyBcIiR7bmFtZX1cIiBkZWZpbmVkLiBgICtcbiAgICAgICAgICAgIGBUaGlzIG1heSBoYXZlIGJlZW4gY2F1c2VkIGJ5IGxpdmUgcmVsb2FkIG9yIGhvdCBtb2R1bGUgYCArXG4gICAgICAgICAgICBgcmVwbGFjZW1lbnQgaW4gd2hpY2ggY2FzZSBpdCBjYW4gYmUgc2FmZWx5IGlnbm9yZWQuXFxuYCArXG4gICAgICAgICAgICBgTWFrZSBzdXJlIHRvIHRlc3QgeW91ciBhcHBsaWNhdGlvbiB3aXRoIGEgcHJvZHVjdGlvbiBidWlsZCBhcyBgICtcbiAgICAgICAgICAgIGByZXBlYXQgcmVnaXN0cmF0aW9ucyB3aWxsIHRocm93IGluIHByb2R1Y3Rpb24uYFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gZXhlY3V0ZSAnZGVmaW5lJyBvbiAnQ3VzdG9tRWxlbWVudFJlZ2lzdHJ5JzogYCArXG4gICAgICAgICAgICBgdGhlIG5hbWUgXCIke25hbWV9XCIgaGFzIGFscmVhZHkgYmVlbiB1c2VkIHdpdGggdGhpcyByZWdpc3RyeWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gUHJvdmlkZSB0YWdOYW1lIGFuZCBsb2NhbE5hbWUgZm9yIHRoZSBjb21wb25lbnQuXG4gICAgKGN0b3IgYXMgTmFtZWRDdXN0b21IVE1MRWxlbWVudENvbnN0cnVjdG9yKS5fX2xvY2FsTmFtZSA9IG5hbWU7XG4gICAgdGhpcy5fX2RlZmluaXRpb25zLnNldChuYW1lLCB7XG4gICAgICBjdG9yLFxuICAgICAgLy8gTm90ZSBpdCdzIGltcG9ydGFudCB3ZSByZWFkIGBvYnNlcnZlZEF0dHJpYnV0ZXNgIGluIGNhc2UgaXQgaXMgYSBnZXR0ZXJcbiAgICAgIC8vIHdpdGggc2lkZS1lZmZlY3RzLCBhcyBpcyB0aGUgY2FzZSBpbiBMaXQsIHdoZXJlIGl0IHRyaWdnZXJzIGNsYXNzXG4gICAgICAvLyBmaW5hbGl6YXRpb24uXG4gICAgICAvL1xuICAgICAgLy8gVE9ETyhhb21hcmtzKSBUbyBiZSBzcGVjIGNvbXBsaWFudCwgd2Ugc2hvdWxkIGFsc28gY2FwdHVyZSB0aGVcbiAgICAgIC8vIHJlZ2lzdHJhdGlvbi10aW1lIGxpZmVjeWNsZSBtZXRob2RzIGxpa2UgYGNvbm5lY3RlZENhbGxiYWNrYC4gRm9yIHRoZW1cbiAgICAgIC8vIHRvIGJlIGFjdHVhbGx5IGFjY2Vzc2libGUgdG8gZS5nLiB0aGUgTGl0IFNTUiBlbGVtZW50IHJlbmRlcmVyLCB0aG91Z2gsXG4gICAgICAvLyB3ZSdkIG5lZWQgdG8gaW50cm9kdWNlIGEgbmV3IEFQSSBmb3IgYWNjZXNzaW5nIHRoZW0gKHNpbmNlIGBnZXRgIG9ubHlcbiAgICAgIC8vIHJldHVybnMgdGhlIGNvbnN0cnVjdG9yKS5cbiAgICAgIG9ic2VydmVkQXR0cmlidXRlczogY3Rvci5vYnNlcnZlZEF0dHJpYnV0ZXMgPz8gW10sXG4gICAgfSk7XG4gIH1cblxuICBnZXQobmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgZGVmaW5pdGlvbiA9IHRoaXMuX19kZWZpbml0aW9ucy5nZXQobmFtZSk7XG4gICAgcmV0dXJuIGRlZmluaXRpb24/LmN0b3I7XG4gIH1cbn07XG5jb25zdCBDdXN0b21FbGVtZW50UmVnaXN0cnlTaGltV2l0aFJlYWxUeXBlID1cbiAgQ3VzdG9tRWxlbWVudFJlZ2lzdHJ5U2hpbSBhcyBvYmplY3QgYXMgdHlwZW9mIEN1c3RvbUVsZW1lbnRSZWdpc3RyeTtcbmV4cG9ydCB7Q3VzdG9tRWxlbWVudFJlZ2lzdHJ5U2hpbVdpdGhSZWFsVHlwZSBhcyBDdXN0b21FbGVtZW50UmVnaXN0cnl9O1xuXG5leHBvcnQgY29uc3QgY3VzdG9tRWxlbWVudHMgPSBuZXcgQ3VzdG9tRWxlbWVudFJlZ2lzdHJ5U2hpbVdpdGhSZWFsVHlwZSgpO1xuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2VcbiAqL1xuXG5jb25zdCBOT0RFX01PREUgPSBmYWxzZTtcblxuLy8gQWxsb3dzIG1pbmlmaWVycyB0byByZW5hbWUgcmVmZXJlbmNlcyB0byBnbG9iYWxUaGlzXG5jb25zdCBnbG9iYWwgPSBnbG9iYWxUaGlzO1xuXG4vKipcbiAqIFdoZXRoZXIgdGhlIGN1cnJlbnQgYnJvd3NlciBzdXBwb3J0cyBgYWRvcHRlZFN0eWxlU2hlZXRzYC5cbiAqL1xuZXhwb3J0IGNvbnN0IHN1cHBvcnRzQWRvcHRpbmdTdHlsZVNoZWV0czogYm9vbGVhbiA9XG4gIGdsb2JhbC5TaGFkb3dSb290ICYmXG4gIChnbG9iYWwuU2hhZHlDU1MgPT09IHVuZGVmaW5lZCB8fCBnbG9iYWwuU2hhZHlDU1MubmF0aXZlU2hhZG93KSAmJlxuICAnYWRvcHRlZFN0eWxlU2hlZXRzJyBpbiBEb2N1bWVudC5wcm90b3R5cGUgJiZcbiAgJ3JlcGxhY2UnIGluIENTU1N0eWxlU2hlZXQucHJvdG90eXBlO1xuXG4vKipcbiAqIEEgQ1NTUmVzdWx0IG9yIG5hdGl2ZSBDU1NTdHlsZVNoZWV0LlxuICpcbiAqIEluIGJyb3dzZXJzIHRoYXQgc3VwcG9ydCBjb25zdHJ1Y3RpYmxlIENTUyBzdHlsZSBzaGVldHMsIENTU1N0eWxlU2hlZXRcbiAqIG9iamVjdCBjYW4gYmUgdXNlZCBmb3Igc3R5bGluZyBhbG9uZyBzaWRlIENTU1Jlc3VsdCBmcm9tIHRoZSBgY3NzYFxuICogdGVtcGxhdGUgdGFnLlxuICovXG5leHBvcnQgdHlwZSBDU1NSZXN1bHRPck5hdGl2ZSA9IENTU1Jlc3VsdCB8IENTU1N0eWxlU2hlZXQ7XG5cbmV4cG9ydCB0eXBlIENTU1Jlc3VsdEFycmF5ID0gQXJyYXk8Q1NTUmVzdWx0T3JOYXRpdmUgfCBDU1NSZXN1bHRBcnJheT47XG5cbi8qKlxuICogQSBzaW5nbGUgQ1NTUmVzdWx0LCBDU1NTdHlsZVNoZWV0LCBvciBhbiBhcnJheSBvciBuZXN0ZWQgYXJyYXlzIG9mIHRob3NlLlxuICovXG5leHBvcnQgdHlwZSBDU1NSZXN1bHRHcm91cCA9IENTU1Jlc3VsdE9yTmF0aXZlIHwgQ1NTUmVzdWx0QXJyYXk7XG5cbmNvbnN0IGNvbnN0cnVjdGlvblRva2VuID0gU3ltYm9sKCk7XG5cbmNvbnN0IGNzc1RhZ0NhY2hlID0gbmV3IFdlYWtNYXA8VGVtcGxhdGVTdHJpbmdzQXJyYXksIENTU1N0eWxlU2hlZXQ+KCk7XG5cbi8qKlxuICogQSBjb250YWluZXIgZm9yIGEgc3RyaW5nIG9mIENTUyB0ZXh0LCB0aGF0IG1heSBiZSB1c2VkIHRvIGNyZWF0ZSBhIENTU1N0eWxlU2hlZXQuXG4gKlxuICogQ1NTUmVzdWx0IGlzIHRoZSByZXR1cm4gdmFsdWUgb2YgYGNzc2AtdGFnZ2VkIHRlbXBsYXRlIGxpdGVyYWxzIGFuZFxuICogYHVuc2FmZUNTUygpYC4gSW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgQ1NTUmVzdWx0cyBhcmUgb25seSBjcmVhdGVkIHZpYSB0aGVcbiAqIGBjc3NgIHRhZyBhbmQgYHVuc2FmZUNTUygpYCwgQ1NTUmVzdWx0IGNhbm5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseS5cbiAqL1xuZXhwb3J0IGNsYXNzIENTU1Jlc3VsdCB7XG4gIC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gIFsnXyRjc3NSZXN1bHQkJ10gPSB0cnVlO1xuICByZWFkb25seSBjc3NUZXh0OiBzdHJpbmc7XG4gIHByaXZhdGUgX3N0eWxlU2hlZXQ/OiBDU1NTdHlsZVNoZWV0O1xuICBwcml2YXRlIF9zdHJpbmdzOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSB8IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgIGNzc1RleHQ6IHN0cmluZyxcbiAgICBzdHJpbmdzOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSB8IHVuZGVmaW5lZCxcbiAgICBzYWZlVG9rZW46IHN5bWJvbFxuICApIHtcbiAgICBpZiAoc2FmZVRva2VuICE9PSBjb25zdHJ1Y3Rpb25Ub2tlbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnQ1NTUmVzdWx0IGlzIG5vdCBjb25zdHJ1Y3RhYmxlLiBVc2UgYHVuc2FmZUNTU2Agb3IgYGNzc2AgaW5zdGVhZC4nXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmNzc1RleHQgPSBjc3NUZXh0O1xuICAgIHRoaXMuX3N0cmluZ3MgPSBzdHJpbmdzO1xuICB9XG5cbiAgLy8gVGhpcyBpcyBhIGdldHRlciBzbyB0aGF0IGl0J3MgbGF6eS4gSW4gcHJhY3RpY2UsIHRoaXMgbWVhbnMgc3R5bGVzaGVldHNcbiAgLy8gYXJlIG5vdCBjcmVhdGVkIHVudGlsIHRoZSBmaXJzdCBlbGVtZW50IGluc3RhbmNlIGlzIG1hZGUuXG4gIGdldCBzdHlsZVNoZWV0KCk6IENTU1N0eWxlU2hlZXQgfCB1bmRlZmluZWQge1xuICAgIC8vIElmIGBzdXBwb3J0c0Fkb3B0aW5nU3R5bGVTaGVldHNgIGlzIHRydWUgdGhlbiB3ZSBhc3N1bWUgQ1NTU3R5bGVTaGVldCBpc1xuICAgIC8vIGNvbnN0cnVjdGFibGUuXG4gICAgbGV0IHN0eWxlU2hlZXQgPSB0aGlzLl9zdHlsZVNoZWV0O1xuICAgIGNvbnN0IHN0cmluZ3MgPSB0aGlzLl9zdHJpbmdzO1xuICAgIGlmIChzdXBwb3J0c0Fkb3B0aW5nU3R5bGVTaGVldHMgJiYgc3R5bGVTaGVldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBjYWNoZWFibGUgPSBzdHJpbmdzICE9PSB1bmRlZmluZWQgJiYgc3RyaW5ncy5sZW5ndGggPT09IDE7XG4gICAgICBpZiAoY2FjaGVhYmxlKSB7XG4gICAgICAgIHN0eWxlU2hlZXQgPSBjc3NUYWdDYWNoZS5nZXQoc3RyaW5ncyk7XG4gICAgICB9XG4gICAgICBpZiAoc3R5bGVTaGVldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICh0aGlzLl9zdHlsZVNoZWV0ID0gc3R5bGVTaGVldCA9IG5ldyBDU1NTdHlsZVNoZWV0KCkpLnJlcGxhY2VTeW5jKFxuICAgICAgICAgIHRoaXMuY3NzVGV4dFxuICAgICAgICApO1xuICAgICAgICBpZiAoY2FjaGVhYmxlKSB7XG4gICAgICAgICAgY3NzVGFnQ2FjaGUuc2V0KHN0cmluZ3MsIHN0eWxlU2hlZXQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdHlsZVNoZWV0O1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jc3NUZXh0O1xuICB9XG59XG5cbnR5cGUgQ29uc3RydWN0YWJsZUNTU1Jlc3VsdCA9IENTU1Jlc3VsdCAmIHtcbiAgbmV3IChcbiAgICBjc3NUZXh0OiBzdHJpbmcsXG4gICAgc3RyaW5nczogVGVtcGxhdGVTdHJpbmdzQXJyYXkgfCB1bmRlZmluZWQsXG4gICAgc2FmZVRva2VuOiBzeW1ib2xcbiAgKTogQ1NTUmVzdWx0O1xufTtcblxuY29uc3QgdGV4dEZyb21DU1NSZXN1bHQgPSAodmFsdWU6IENTU1Jlc3VsdEdyb3VwIHwgbnVtYmVyKSA9PiB7XG4gIC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gIGlmICgodmFsdWUgYXMgQ1NTUmVzdWx0KVsnXyRjc3NSZXN1bHQkJ10gPT09IHRydWUpIHtcbiAgICByZXR1cm4gKHZhbHVlIGFzIENTU1Jlc3VsdCkuY3NzVGV4dDtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBWYWx1ZSBwYXNzZWQgdG8gJ2NzcycgZnVuY3Rpb24gbXVzdCBiZSBhICdjc3MnIGZ1bmN0aW9uIHJlc3VsdDogYCArXG4gICAgICAgIGAke3ZhbHVlfS4gVXNlICd1bnNhZmVDU1MnIHRvIHBhc3Mgbm9uLWxpdGVyYWwgdmFsdWVzLCBidXQgdGFrZSBjYXJlIGAgK1xuICAgICAgICBgdG8gZW5zdXJlIHBhZ2Ugc2VjdXJpdHkuYFxuICAgICk7XG4gIH1cbn07XG5cbi8qKlxuICogV3JhcCBhIHZhbHVlIGZvciBpbnRlcnBvbGF0aW9uIGluIGEge0BsaW5rY29kZSBjc3N9IHRhZ2dlZCB0ZW1wbGF0ZSBsaXRlcmFsLlxuICpcbiAqIFRoaXMgaXMgdW5zYWZlIGJlY2F1c2UgdW50cnVzdGVkIENTUyB0ZXh0IGNhbiBiZSB1c2VkIHRvIHBob25lIGhvbWVcbiAqIG9yIGV4ZmlsdHJhdGUgZGF0YSB0byBhbiBhdHRhY2tlciBjb250cm9sbGVkIHNpdGUuIFRha2UgY2FyZSB0byBvbmx5IHVzZVxuICogdGhpcyB3aXRoIHRydXN0ZWQgaW5wdXQuXG4gKi9cbmV4cG9ydCBjb25zdCB1bnNhZmVDU1MgPSAodmFsdWU6IHVua25vd24pID0+XG4gIG5ldyAoQ1NTUmVzdWx0IGFzIENvbnN0cnVjdGFibGVDU1NSZXN1bHQpKFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZSA6IFN0cmluZyh2YWx1ZSksXG4gICAgdW5kZWZpbmVkLFxuICAgIGNvbnN0cnVjdGlvblRva2VuXG4gICk7XG5cbi8qKlxuICogQSB0ZW1wbGF0ZSBsaXRlcmFsIHRhZyB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIExpdEVsZW1lbnQnc1xuICoge0BsaW5rY29kZSBMaXRFbGVtZW50LnN0eWxlc30gcHJvcGVydHkgdG8gc2V0IGVsZW1lbnQgc3R5bGVzLlxuICpcbiAqIEZvciBzZWN1cml0eSByZWFzb25zLCBvbmx5IGxpdGVyYWwgc3RyaW5nIHZhbHVlcyBhbmQgbnVtYmVyIG1heSBiZSB1c2VkIGluXG4gKiBlbWJlZGRlZCBleHByZXNzaW9ucy4gVG8gaW5jb3Jwb3JhdGUgbm9uLWxpdGVyYWwgdmFsdWVzIHtAbGlua2NvZGUgdW5zYWZlQ1NTfVxuICogbWF5IGJlIHVzZWQgaW5zaWRlIGFuIGV4cHJlc3Npb24uXG4gKi9cbmV4cG9ydCBjb25zdCBjc3MgPSAoXG4gIHN0cmluZ3M6IFRlbXBsYXRlU3RyaW5nc0FycmF5LFxuICAuLi52YWx1ZXM6IChDU1NSZXN1bHRHcm91cCB8IG51bWJlcilbXVxuKTogQ1NTUmVzdWx0ID0+IHtcbiAgY29uc3QgY3NzVGV4dCA9XG4gICAgc3RyaW5ncy5sZW5ndGggPT09IDFcbiAgICAgID8gc3RyaW5nc1swXVxuICAgICAgOiB2YWx1ZXMucmVkdWNlKFxuICAgICAgICAgIChhY2MsIHYsIGlkeCkgPT4gYWNjICsgdGV4dEZyb21DU1NSZXN1bHQodikgKyBzdHJpbmdzW2lkeCArIDFdLFxuICAgICAgICAgIHN0cmluZ3NbMF1cbiAgICAgICAgKTtcbiAgcmV0dXJuIG5ldyAoQ1NTUmVzdWx0IGFzIENvbnN0cnVjdGFibGVDU1NSZXN1bHQpKFxuICAgIGNzc1RleHQsXG4gICAgc3RyaW5ncyxcbiAgICBjb25zdHJ1Y3Rpb25Ub2tlblxuICApO1xufTtcblxuLyoqXG4gKiBBcHBsaWVzIHRoZSBnaXZlbiBzdHlsZXMgdG8gYSBgc2hhZG93Um9vdGAuIFdoZW4gU2hhZG93IERPTSBpc1xuICogYXZhaWxhYmxlIGJ1dCBgYWRvcHRlZFN0eWxlU2hlZXRzYCBpcyBub3QsIHN0eWxlcyBhcmUgYXBwZW5kZWQgdG8gdGhlXG4gKiBgc2hhZG93Um9vdGAgdG8gW21pbWljIHRoZSBuYXRpdmUgZmVhdHVyZV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1NoYWRvd1Jvb3QvYWRvcHRlZFN0eWxlU2hlZXRzKS5cbiAqIE5vdGUsIHdoZW4gc2hpbW1pbmcgaXMgdXNlZCwgYW55IHN0eWxlcyB0aGF0IGFyZSBzdWJzZXF1ZW50bHkgcGxhY2VkIGludG9cbiAqIHRoZSBzaGFkb3dSb290IHNob3VsZCBiZSBwbGFjZWQgKmJlZm9yZSogYW55IHNoaW1tZWQgYWRvcHRlZCBzdHlsZXMuIFRoaXNcbiAqIHdpbGwgbWF0Y2ggc3BlYyBiZWhhdmlvciB0aGF0IGdpdmVzIGFkb3B0ZWQgc2hlZXRzIHByZWNlZGVuY2Ugb3ZlciBzdHlsZXMgaW5cbiAqIHNoYWRvd1Jvb3QuXG4gKi9cbmV4cG9ydCBjb25zdCBhZG9wdFN0eWxlcyA9IChcbiAgcmVuZGVyUm9vdDogU2hhZG93Um9vdCxcbiAgc3R5bGVzOiBBcnJheTxDU1NSZXN1bHRPck5hdGl2ZT5cbikgPT4ge1xuICBpZiAoc3VwcG9ydHNBZG9wdGluZ1N0eWxlU2hlZXRzKSB7XG4gICAgKHJlbmRlclJvb3QgYXMgU2hhZG93Um9vdCkuYWRvcHRlZFN0eWxlU2hlZXRzID0gc3R5bGVzLm1hcCgocykgPT5cbiAgICAgIHMgaW5zdGFuY2VvZiBDU1NTdHlsZVNoZWV0ID8gcyA6IHMuc3R5bGVTaGVldCFcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIGZvciAoY29uc3QgcyBvZiBzdHlsZXMpIHtcbiAgICAgIGNvbnN0IHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBjb25zdCBub25jZSA9IChnbG9iYWwgYXMgYW55KVsnbGl0Tm9uY2UnXTtcbiAgICAgIGlmIChub25jZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHN0eWxlLnNldEF0dHJpYnV0ZSgnbm9uY2UnLCBub25jZSk7XG4gICAgICB9XG4gICAgICBzdHlsZS50ZXh0Q29udGVudCA9IChzIGFzIENTU1Jlc3VsdCkuY3NzVGV4dDtcbiAgICAgIHJlbmRlclJvb3QuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuICAgIH1cbiAgfVxufTtcblxuY29uc3QgY3NzUmVzdWx0RnJvbVN0eWxlU2hlZXQgPSAoc2hlZXQ6IENTU1N0eWxlU2hlZXQpID0+IHtcbiAgbGV0IGNzc1RleHQgPSAnJztcbiAgZm9yIChjb25zdCBydWxlIG9mIHNoZWV0LmNzc1J1bGVzKSB7XG4gICAgY3NzVGV4dCArPSBydWxlLmNzc1RleHQ7XG4gIH1cbiAgcmV0dXJuIHVuc2FmZUNTUyhjc3NUZXh0KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDb21wYXRpYmxlU3R5bGUgPVxuICBzdXBwb3J0c0Fkb3B0aW5nU3R5bGVTaGVldHMgfHxcbiAgKE5PREVfTU9ERSAmJiBnbG9iYWwuQ1NTU3R5bGVTaGVldCA9PT0gdW5kZWZpbmVkKVxuICAgID8gKHM6IENTU1Jlc3VsdE9yTmF0aXZlKSA9PiBzXG4gICAgOiAoczogQ1NTUmVzdWx0T3JOYXRpdmUpID0+XG4gICAgICAgIHMgaW5zdGFuY2VvZiBDU1NTdHlsZVNoZWV0ID8gY3NzUmVzdWx0RnJvbVN0eWxlU2hlZXQocykgOiBzO1xuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2VcbiAqL1xuXG4vKipcbiAqIFVzZSB0aGlzIG1vZHVsZSBpZiB5b3Ugd2FudCB0byBjcmVhdGUgeW91ciBvd24gYmFzZSBjbGFzcyBleHRlbmRpbmdcbiAqIHtAbGluayBSZWFjdGl2ZUVsZW1lbnR9LlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKi9cblxuaW1wb3J0IHtcbiAgZ2V0Q29tcGF0aWJsZVN0eWxlLFxuICBhZG9wdFN0eWxlcyxcbiAgQ1NTUmVzdWx0R3JvdXAsXG4gIENTU1Jlc3VsdE9yTmF0aXZlLFxufSBmcm9tICcuL2Nzcy10YWcuanMnO1xuaW1wb3J0IHR5cGUge1xuICBSZWFjdGl2ZUNvbnRyb2xsZXIsXG4gIFJlYWN0aXZlQ29udHJvbGxlckhvc3QsXG59IGZyb20gJy4vcmVhY3RpdmUtY29udHJvbGxlci5qcyc7XG5cbi8vIEluIHRoZSBOb2RlIGJ1aWxkLCB0aGlzIGltcG9ydCB3aWxsIGJlIGluamVjdGVkIGJ5IFJvbGx1cDpcbi8vIGltcG9ydCB7SFRNTEVsZW1lbnQsIGN1c3RvbUVsZW1lbnRzfSBmcm9tICdAbGl0LWxhYnMvc3NyLWRvbS1zaGltJztcblxuZXhwb3J0ICogZnJvbSAnLi9jc3MtdGFnLmpzJztcbmV4cG9ydCB0eXBlIHtcbiAgUmVhY3RpdmVDb250cm9sbGVyLFxuICBSZWFjdGl2ZUNvbnRyb2xsZXJIb3N0LFxufSBmcm9tICcuL3JlYWN0aXZlLWNvbnRyb2xsZXIuanMnO1xuXG4vKipcbiAqIFJlbW92ZXMgdGhlIGByZWFkb25seWAgbW9kaWZpZXIgZnJvbSBwcm9wZXJ0aWVzIGluIHRoZSB1bmlvbiBLLlxuICpcbiAqIFRoaXMgaXMgYSBzYWZlciB3YXkgdG8gY2FzdCBhIHZhbHVlIHRvIGEgdHlwZSB3aXRoIGEgbXV0YWJsZSB2ZXJzaW9uIG9mIGFcbiAqIHJlYWRvbmx5IGZpZWxkLCB0aGFuIGNhc3RpbmcgdG8gYW4gaW50ZXJmYWNlIHdpdGggdGhlIGZpZWxkIHJlLWRlY2xhcmVkXG4gKiBiZWNhdXNlIGl0IHByZXNlcnZlcyB0aGUgdHlwZSBvZiBhbGwgdGhlIGZpZWxkcyBhbmQgd2FybnMgb24gdHlwb3MuXG4gKi9cbnR5cGUgTXV0YWJsZTxULCBLIGV4dGVuZHMga2V5b2YgVD4gPSBPbWl0PFQsIEs+ICYge1xuICAtcmVhZG9ubHkgW1AgaW4ga2V5b2YgUGljazxULCBLPl06IFAgZXh0ZW5kcyBLID8gVFtQXSA6IG5ldmVyO1xufTtcblxuLy8gVE9ETyAoanVzdGluZmFnbmFuaSk6IEFkZCBgaGFzT3duYCBoZXJlIHdoZW4gd2Ugc2hpcCBFUzIwMjJcbmNvbnN0IHtcbiAgaXMsXG4gIGRlZmluZVByb3BlcnR5LFxuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsXG4gIGdldE93blByb3BlcnR5TmFtZXMsXG4gIGdldE93blByb3BlcnR5U3ltYm9scyxcbiAgZ2V0UHJvdG90eXBlT2YsXG59ID0gT2JqZWN0O1xuXG5jb25zdCBOT0RFX01PREUgPSBmYWxzZTtcblxuLy8gTGV0cyBhIG1pbmlmaWVyIHJlcGxhY2UgZ2xvYmFsVGhpcyByZWZlcmVuY2VzIHdpdGggYSBtaW5pZmllZCBuYW1lXG5jb25zdCBnbG9iYWwgPSBnbG9iYWxUaGlzO1xuXG5pZiAoTk9ERV9NT0RFKSB7XG4gIGdsb2JhbC5jdXN0b21FbGVtZW50cyA/Pz0gY3VzdG9tRWxlbWVudHM7XG59XG5cbmNvbnN0IERFVl9NT0RFID0gdHJ1ZTtcblxubGV0IGlzc3VlV2FybmluZzogKGNvZGU6IHN0cmluZywgd2FybmluZzogc3RyaW5nKSA9PiB2b2lkO1xuXG5jb25zdCB0cnVzdGVkVHlwZXMgPSAoZ2xvYmFsIGFzIHVua25vd24gYXMge3RydXN0ZWRUeXBlcz86IHtlbXB0eVNjcmlwdDogJyd9fSlcbiAgLnRydXN0ZWRUeXBlcztcblxuLy8gVGVtcG9yYXJ5IHdvcmthcm91bmQgZm9yIGh0dHBzOi8vY3JidWcuY29tLzk5MzI2OFxuLy8gQ3VycmVudGx5LCBhbnkgYXR0cmlidXRlIHN0YXJ0aW5nIHdpdGggXCJvblwiIGlzIGNvbnNpZGVyZWQgdG8gYmUgYVxuLy8gVHJ1c3RlZFNjcmlwdCBzb3VyY2UuIFN1Y2ggYm9vbGVhbiBhdHRyaWJ1dGVzIG11c3QgYmUgc2V0IHRvIHRoZSBlcXVpdmFsZW50XG4vLyB0cnVzdGVkIGVtcHR5U2NyaXB0IHZhbHVlLlxuY29uc3QgZW1wdHlTdHJpbmdGb3JCb29sZWFuQXR0cmlidXRlID0gdHJ1c3RlZFR5cGVzXG4gID8gKHRydXN0ZWRUeXBlcy5lbXB0eVNjcmlwdCBhcyB1bmtub3duIGFzICcnKVxuICA6ICcnO1xuXG5jb25zdCBwb2x5ZmlsbFN1cHBvcnQgPSBERVZfTU9ERVxuICA/IGdsb2JhbC5yZWFjdGl2ZUVsZW1lbnRQb2x5ZmlsbFN1cHBvcnREZXZNb2RlXG4gIDogZ2xvYmFsLnJlYWN0aXZlRWxlbWVudFBvbHlmaWxsU3VwcG9ydDtcblxuaWYgKERFVl9NT0RFKSB7XG4gIC8vIEVuc3VyZSB3YXJuaW5ncyBhcmUgaXNzdWVkIG9ubHkgMXgsIGV2ZW4gaWYgbXVsdGlwbGUgdmVyc2lvbnMgb2YgTGl0XG4gIC8vIGFyZSBsb2FkZWQuXG4gIGdsb2JhbC5saXRJc3N1ZWRXYXJuaW5ncyA/Pz0gbmV3IFNldCgpO1xuXG4gIC8qKlxuICAgKiBJc3N1ZSBhIHdhcm5pbmcgaWYgd2UgaGF2ZW4ndCBhbHJlYWR5LCBiYXNlZCBlaXRoZXIgb24gYGNvZGVgIG9yIGB3YXJuaW5nYC5cbiAgICogV2FybmluZ3MgYXJlIGRpc2FibGVkIGF1dG9tYXRpY2FsbHkgb25seSBieSBgd2FybmluZ2A7IGRpc2FibGluZyB2aWEgYGNvZGVgXG4gICAqIGNhbiBiZSBkb25lIGJ5IHVzZXJzLlxuICAgKi9cbiAgaXNzdWVXYXJuaW5nID0gKGNvZGU6IHN0cmluZywgd2FybmluZzogc3RyaW5nKSA9PiB7XG4gICAgd2FybmluZyArPSBgIFNlZSBodHRwczovL2xpdC5kZXYvbXNnLyR7Y29kZX0gZm9yIG1vcmUgaW5mb3JtYXRpb24uYDtcbiAgICBpZiAoXG4gICAgICAhZ2xvYmFsLmxpdElzc3VlZFdhcm5pbmdzIS5oYXMod2FybmluZykgJiZcbiAgICAgICFnbG9iYWwubGl0SXNzdWVkV2FybmluZ3MhLmhhcyhjb2RlKVxuICAgICkge1xuICAgICAgY29uc29sZS53YXJuKHdhcm5pbmcpO1xuICAgICAgZ2xvYmFsLmxpdElzc3VlZFdhcm5pbmdzIS5hZGQod2FybmluZyk7XG4gICAgfVxuICB9O1xuXG4gIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICBpc3N1ZVdhcm5pbmcoXG4gICAgICAnZGV2LW1vZGUnLFxuICAgICAgYExpdCBpcyBpbiBkZXYgbW9kZS4gTm90IHJlY29tbWVuZGVkIGZvciBwcm9kdWN0aW9uIWBcbiAgICApO1xuXG4gICAgLy8gSXNzdWUgcG9seWZpbGwgc3VwcG9ydCB3YXJuaW5nLlxuICAgIGlmIChnbG9iYWwuU2hhZHlET00/LmluVXNlICYmIHBvbHlmaWxsU3VwcG9ydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpc3N1ZVdhcm5pbmcoXG4gICAgICAgICdwb2x5ZmlsbC1zdXBwb3J0LW1pc3NpbmcnLFxuICAgICAgICBgU2hhZG93IERPTSBpcyBiZWluZyBwb2x5ZmlsbGVkIHZpYSBcXGBTaGFkeURPTVxcYCBidXQgYCArXG4gICAgICAgICAgYHRoZSBcXGBwb2x5ZmlsbC1zdXBwb3J0XFxgIG1vZHVsZSBoYXMgbm90IGJlZW4gbG9hZGVkLmBcbiAgICAgICk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBDb250YWlucyB0eXBlcyB0aGF0IGFyZSBwYXJ0IG9mIHRoZSB1bnN0YWJsZSBkZWJ1ZyBBUEkuXG4gKlxuICogRXZlcnl0aGluZyBpbiB0aGlzIEFQSSBpcyBub3Qgc3RhYmxlIGFuZCBtYXkgY2hhbmdlIG9yIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZSxcbiAqIGV2ZW4gb24gcGF0Y2ggcmVsZWFzZXMuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbmFtZXNwYWNlXG5leHBvcnQgbmFtZXNwYWNlIFJlYWN0aXZlVW5zdGFibGUge1xuICAvKipcbiAgICogV2hlbiBMaXQgaXMgcnVubmluZyBpbiBkZXYgbW9kZSBhbmQgYHdpbmRvdy5lbWl0TGl0RGVidWdMb2dFdmVudHNgIGlzIHRydWUsXG4gICAqIHdlIHdpbGwgZW1pdCAnbGl0LWRlYnVnJyBldmVudHMgdG8gd2luZG93LCB3aXRoIGxpdmUgZGV0YWlscyBhYm91dCB0aGUgdXBkYXRlIGFuZCByZW5kZXJcbiAgICogbGlmZWN5Y2xlLiBUaGVzZSBjYW4gYmUgdXNlZnVsIGZvciB3cml0aW5nIGRlYnVnIHRvb2xpbmcgYW5kIHZpc3VhbGl6YXRpb25zLlxuICAgKlxuICAgKiBQbGVhc2UgYmUgYXdhcmUgdGhhdCBydW5uaW5nIHdpdGggd2luZG93LmVtaXRMaXREZWJ1Z0xvZ0V2ZW50cyBoYXMgcGVyZm9ybWFuY2Ugb3ZlcmhlYWQsXG4gICAqIG1ha2luZyBjZXJ0YWluIG9wZXJhdGlvbnMgdGhhdCBhcmUgbm9ybWFsbHkgdmVyeSBjaGVhcCAobGlrZSBhIG5vLW9wIHJlbmRlcikgbXVjaCBzbG93ZXIsXG4gICAqIGJlY2F1c2Ugd2UgbXVzdCBjb3B5IGRhdGEgYW5kIGRpc3BhdGNoIGV2ZW50cy5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbmFtZXNwYWNlXG4gIGV4cG9ydCBuYW1lc3BhY2UgRGVidWdMb2cge1xuICAgIGV4cG9ydCB0eXBlIEVudHJ5ID0gVXBkYXRlO1xuICAgIGV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlIHtcbiAgICAgIGtpbmQ6ICd1cGRhdGUnO1xuICAgIH1cbiAgfVxufVxuXG5pbnRlcmZhY2UgRGVidWdMb2dnaW5nV2luZG93IHtcbiAgLy8gRXZlbiBpbiBkZXYgbW9kZSwgd2UgZ2VuZXJhbGx5IGRvbid0IHdhbnQgdG8gZW1pdCB0aGVzZSBldmVudHMsIGFzIHRoYXQnc1xuICAvLyBhbm90aGVyIGxldmVsIG9mIGNvc3QsIHNvIG9ubHkgZW1pdCB0aGVtIHdoZW4gREVWX01PREUgaXMgdHJ1ZSBfYW5kXyB3aGVuXG4gIC8vIHdpbmRvdy5lbWl0TGl0RGVidWdFdmVudHMgaXMgdHJ1ZS5cbiAgZW1pdExpdERlYnVnTG9nRXZlbnRzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBVc2VmdWwgZm9yIHZpc3VhbGl6aW5nIGFuZCBsb2dnaW5nIGluc2lnaHRzIGludG8gd2hhdCB0aGUgTGl0IHRlbXBsYXRlIHN5c3RlbSBpcyBkb2luZy5cbiAqXG4gKiBDb21waWxlZCBvdXQgb2YgcHJvZCBtb2RlIGJ1aWxkcy5cbiAqL1xuY29uc3QgZGVidWdMb2dFdmVudCA9IERFVl9NT0RFXG4gID8gKGV2ZW50OiBSZWFjdGl2ZVVuc3RhYmxlLkRlYnVnTG9nLkVudHJ5KSA9PiB7XG4gICAgICBjb25zdCBzaG91bGRFbWl0ID0gKGdsb2JhbCBhcyB1bmtub3duIGFzIERlYnVnTG9nZ2luZ1dpbmRvdylcbiAgICAgICAgLmVtaXRMaXREZWJ1Z0xvZ0V2ZW50cztcbiAgICAgIGlmICghc2hvdWxkRW1pdCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBnbG9iYWwuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgbmV3IEN1c3RvbUV2ZW50PFJlYWN0aXZlVW5zdGFibGUuRGVidWdMb2cuRW50cnk+KCdsaXQtZGVidWcnLCB7XG4gICAgICAgICAgZGV0YWlsOiBldmVudCxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICA6IHVuZGVmaW5lZDtcblxuLypcbiAqIFdoZW4gdXNpbmcgQ2xvc3VyZSBDb21waWxlciwgSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eShwcm9wZXJ0eSwgb2JqZWN0KSBpc1xuICogcmVwbGFjZWQgYXQgY29tcGlsZSB0aW1lIGJ5IHRoZSBtdW5nZWQgbmFtZSBmb3Igb2JqZWN0W3Byb3BlcnR5XS4gV2UgY2Fubm90XG4gKiBhbGlhcyB0aGlzIGZ1bmN0aW9uLCBzbyB3ZSBoYXZlIHRvIHVzZSBhIHNtYWxsIHNoaW0gdGhhdCBoYXMgdGhlIHNhbWVcbiAqIGJlaGF2aW9yIHdoZW4gbm90IGNvbXBpbGluZy5cbiAqL1xuLypAX19JTkxJTkVfXyovXG5jb25zdCBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5ID0gPFAgZXh0ZW5kcyBQcm9wZXJ0eUtleT4oXG4gIHByb3A6IFAsXG4gIF9vYmo6IHVua25vd25cbik6IFAgPT4gcHJvcDtcblxuLyoqXG4gKiBDb252ZXJ0cyBwcm9wZXJ0eSB2YWx1ZXMgdG8gYW5kIGZyb20gYXR0cmlidXRlIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21wbGV4QXR0cmlidXRlQ29udmVydGVyPFR5cGUgPSB1bmtub3duLCBUeXBlSGludCA9IHVua25vd24+IHtcbiAgLyoqXG4gICAqIENhbGxlZCB0byBjb252ZXJ0IGFuIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIHByb3BlcnR5XG4gICAqIHZhbHVlLlxuICAgKi9cbiAgZnJvbUF0dHJpYnV0ZT8odmFsdWU6IHN0cmluZyB8IG51bGwsIHR5cGU/OiBUeXBlSGludCk6IFR5cGU7XG5cbiAgLyoqXG4gICAqIENhbGxlZCB0byBjb252ZXJ0IGEgcHJvcGVydHkgdmFsdWUgdG8gYW4gYXR0cmlidXRlXG4gICAqIHZhbHVlLlxuICAgKlxuICAgKiBJdCByZXR1cm5zIHVua25vd24gaW5zdGVhZCBvZiBzdHJpbmcsIHRvIGJlIGNvbXBhdGlibGUgd2l0aFxuICAgKiBodHRwczovL2dpdGh1Yi5jb20vV0lDRy90cnVzdGVkLXR5cGVzIChhbmQgc2ltaWxhciBlZmZvcnRzKS5cbiAgICovXG4gIHRvQXR0cmlidXRlPyh2YWx1ZTogVHlwZSwgdHlwZT86IFR5cGVIaW50KTogdW5rbm93bjtcbn1cblxudHlwZSBBdHRyaWJ1dGVDb252ZXJ0ZXI8VHlwZSA9IHVua25vd24sIFR5cGVIaW50ID0gdW5rbm93bj4gPVxuICB8IENvbXBsZXhBdHRyaWJ1dGVDb252ZXJ0ZXI8VHlwZT5cbiAgfCAoKHZhbHVlOiBzdHJpbmcgfCBudWxsLCB0eXBlPzogVHlwZUhpbnQpID0+IFR5cGUpO1xuXG4vKipcbiAqIERlZmluZXMgb3B0aW9ucyBmb3IgYSBwcm9wZXJ0eSBhY2Nlc3Nvci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9wZXJ0eURlY2xhcmF0aW9uPFR5cGUgPSB1bmtub3duLCBUeXBlSGludCA9IHVua25vd24+IHtcbiAgLyoqXG4gICAqIFdoZW4gc2V0IHRvIGB0cnVlYCwgaW5kaWNhdGVzIHRoZSBwcm9wZXJ0eSBpcyBpbnRlcm5hbCBwcml2YXRlIHN0YXRlLiBUaGVcbiAgICogcHJvcGVydHkgc2hvdWxkIG5vdCBiZSBzZXQgYnkgdXNlcnMuIFdoZW4gdXNpbmcgVHlwZVNjcmlwdCwgdGhpcyBwcm9wZXJ0eVxuICAgKiBzaG91bGQgYmUgbWFya2VkIGFzIGBwcml2YXRlYCBvciBgcHJvdGVjdGVkYCwgYW5kIGl0IGlzIGFsc28gYSBjb21tb25cbiAgICogcHJhY3RpY2UgdG8gdXNlIGEgbGVhZGluZyBgX2AgaW4gdGhlIG5hbWUuIFRoZSBwcm9wZXJ0eSBpcyBub3QgYWRkZWQgdG9cbiAgICogYG9ic2VydmVkQXR0cmlidXRlc2AuXG4gICAqL1xuICByZWFkb25seSBzdGF0ZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBob3cgYW5kIHdoZXRoZXIgdGhlIHByb3BlcnR5IGJlY29tZXMgYW4gb2JzZXJ2ZWQgYXR0cmlidXRlLlxuICAgKiBJZiB0aGUgdmFsdWUgaXMgYGZhbHNlYCwgdGhlIHByb3BlcnR5IGlzIG5vdCBhZGRlZCB0byBgb2JzZXJ2ZWRBdHRyaWJ1dGVzYC5cbiAgICogSWYgdHJ1ZSBvciBhYnNlbnQsIHRoZSBsb3dlcmNhc2VkIHByb3BlcnR5IG5hbWUgaXMgb2JzZXJ2ZWQgKGUuZy4gYGZvb0JhcmBcbiAgICogYmVjb21lcyBgZm9vYmFyYCkuIElmIGEgc3RyaW5nLCB0aGUgc3RyaW5nIHZhbHVlIGlzIG9ic2VydmVkIChlLmdcbiAgICogYGF0dHJpYnV0ZTogJ2Zvby1iYXInYCkuXG4gICAqL1xuICByZWFkb25seSBhdHRyaWJ1dGU/OiBib29sZWFuIHwgc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgdGhlIHR5cGUgb2YgdGhlIHByb3BlcnR5LiBUaGlzIGlzIHVzZWQgb25seSBhcyBhIGhpbnQgZm9yIHRoZVxuICAgKiBgY29udmVydGVyYCB0byBkZXRlcm1pbmUgaG93IHRvIGNvbnZlcnQgdGhlIGF0dHJpYnV0ZVxuICAgKiB0by9mcm9tIGEgcHJvcGVydHkuXG4gICAqL1xuICByZWFkb25seSB0eXBlPzogVHlwZUhpbnQ7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBob3cgdG8gY29udmVydCB0aGUgYXR0cmlidXRlIHRvL2Zyb20gYSBwcm9wZXJ0eS4gSWYgdGhpcyB2YWx1ZVxuICAgKiBpcyBhIGZ1bmN0aW9uLCBpdCBpcyB1c2VkIHRvIGNvbnZlcnQgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBhIHRoZSBwcm9wZXJ0eVxuICAgKiB2YWx1ZS4gSWYgaXQncyBhbiBvYmplY3QsIGl0IGNhbiBoYXZlIGtleXMgZm9yIGBmcm9tQXR0cmlidXRlYCBhbmRcbiAgICogYHRvQXR0cmlidXRlYC4gSWYgbm8gYHRvQXR0cmlidXRlYCBmdW5jdGlvbiBpcyBwcm92aWRlZCBhbmRcbiAgICogYHJlZmxlY3RgIGlzIHNldCB0byBgdHJ1ZWAsIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyBzZXQgZGlyZWN0bHkgdG8gdGhlXG4gICAqIGF0dHJpYnV0ZS4gQSBkZWZhdWx0IGBjb252ZXJ0ZXJgIGlzIHVzZWQgaWYgbm9uZSBpcyBwcm92aWRlZDsgaXQgc3VwcG9ydHNcbiAgICogYEJvb2xlYW5gLCBgU3RyaW5nYCwgYE51bWJlcmAsIGBPYmplY3RgLCBhbmQgYEFycmF5YC4gTm90ZSxcbiAgICogd2hlbiBhIHByb3BlcnR5IGNoYW5nZXMgYW5kIHRoZSBjb252ZXJ0ZXIgaXMgdXNlZCB0byB1cGRhdGUgdGhlIGF0dHJpYnV0ZSxcbiAgICogdGhlIHByb3BlcnR5IGlzIG5ldmVyIHVwZGF0ZWQgYWdhaW4gYXMgYSByZXN1bHQgb2YgdGhlIGF0dHJpYnV0ZSBjaGFuZ2luZyxcbiAgICogYW5kIHZpY2UgdmVyc2EuXG4gICAqL1xuICByZWFkb25seSBjb252ZXJ0ZXI/OiBBdHRyaWJ1dGVDb252ZXJ0ZXI8VHlwZSwgVHlwZUhpbnQ+O1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIHByb3BlcnR5IHNob3VsZCByZWZsZWN0IHRvIGFuIGF0dHJpYnV0ZS5cbiAgICogSWYgYHRydWVgLCB3aGVuIHRoZSBwcm9wZXJ0eSBpcyBzZXQsIHRoZSBhdHRyaWJ1dGUgaXMgc2V0IHVzaW5nIHRoZVxuICAgKiBhdHRyaWJ1dGUgbmFtZSBkZXRlcm1pbmVkIGFjY29yZGluZyB0byB0aGUgcnVsZXMgZm9yIHRoZSBgYXR0cmlidXRlYFxuICAgKiBwcm9wZXJ0eSBvcHRpb24gYW5kIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgY29udmVydGVkIHVzaW5nIHRoZSBydWxlc1xuICAgKiBmcm9tIHRoZSBgY29udmVydGVyYCBwcm9wZXJ0eSBvcHRpb24uXG4gICAqL1xuICByZWFkb25seSByZWZsZWN0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBmdW5jdGlvbiB0aGF0IGluZGljYXRlcyBpZiBhIHByb3BlcnR5IHNob3VsZCBiZSBjb25zaWRlcmVkIGNoYW5nZWQgd2hlblxuICAgKiBpdCBpcyBzZXQuIFRoZSBmdW5jdGlvbiBzaG91bGQgdGFrZSB0aGUgYG5ld1ZhbHVlYCBhbmQgYG9sZFZhbHVlYCBhbmRcbiAgICogcmV0dXJuIGB0cnVlYCBpZiBhbiB1cGRhdGUgc2hvdWxkIGJlIHJlcXVlc3RlZC5cbiAgICovXG4gIGhhc0NoYW5nZWQ/KHZhbHVlOiBUeXBlLCBvbGRWYWx1ZTogVHlwZSk6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIGFuIGFjY2Vzc29yIHdpbGwgYmUgY3JlYXRlZCBmb3IgdGhpcyBwcm9wZXJ0eS4gQnlcbiAgICogZGVmYXVsdCwgYW4gYWNjZXNzb3Igd2lsbCBiZSBnZW5lcmF0ZWQgZm9yIHRoaXMgcHJvcGVydHkgdGhhdCByZXF1ZXN0cyBhblxuICAgKiB1cGRhdGUgd2hlbiBzZXQuIElmIHRoaXMgZmxhZyBpcyBgdHJ1ZWAsIG5vIGFjY2Vzc29yIHdpbGwgYmUgY3JlYXRlZCwgYW5kXG4gICAqIGl0IHdpbGwgYmUgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eSB0byBjYWxsXG4gICAqIGB0aGlzLnJlcXVlc3RVcGRhdGUocHJvcGVydHlOYW1lLCBvbGRWYWx1ZSlgIHRvIHJlcXVlc3QgYW4gdXBkYXRlIHdoZW5cbiAgICogdGhlIHByb3BlcnR5IGNoYW5nZXMuXG4gICAqL1xuICByZWFkb25seSBub0FjY2Vzc29yPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIHByb3BlcnR5IGlzIHdyYXBwaW5nIGFjY2Vzc29ycy4gVGhpcyBpcyBzZXQgYnkgYEBwcm9wZXJ0eWBcbiAgICogdG8gY29udHJvbCB0aGUgaW5pdGlhbCB2YWx1ZSBjaGFuZ2UgYW5kIHJlZmxlY3Rpb24gbG9naWMuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgd3JhcHBlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZW4gYHRydWVgLCB1c2VzIHRoZSBpbml0aWFsIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBhcyB0aGUgZGVmYXVsdCB2YWx1ZSxcbiAgICogd2hpY2ggY2hhbmdlcyBob3cgYXR0cmlidXRlcyBhcmUgaGFuZGxlZDpcbiAgICogIC0gVGhlIGluaXRpYWwgdmFsdWUgZG9lcyAqbm90KiByZWZsZWN0LCBldmVuIGlmIHRoZSBgcmVmbGVjdGAgb3B0aW9uIGlzIGB0cnVlYC5cbiAgICogICAgU3Vic2VxdWVudCBjaGFuZ2VzIHRvIHRoZSBwcm9wZXJ0eSB3aWxsIHJlZmxlY3QsIGV2ZW4gaWYgdGhleSBhcmUgZXF1YWwgdG8gdGhlXG4gICAqICAgICBkZWZhdWx0IHZhbHVlLlxuICAgKiAgLSBXaGVuIHRoZSBhdHRyaWJ1dGUgaXMgcmVtb3ZlZCwgdGhlIHByb3BlcnR5IGlzIHNldCB0byB0aGUgZGVmYXVsdCB2YWx1ZVxuICAgKiAgLSBUaGUgaW5pdGlhbCB2YWx1ZSB3aWxsIG5vdCB0cmlnZ2VyIGFuIG9sZCB2YWx1ZSBpbiB0aGUgYGNoYW5nZWRQcm9wZXJ0aWVzYCBtYXBcbiAgICogICAgYXJndW1lbnQgdG8gdXBkYXRlIGxpZmVjeWNsZSBtZXRob2RzLlxuICAgKlxuICAgKiBXaGVuIHNldCwgcHJvcGVydGllcyBtdXN0IGJlIGluaXRpYWxpemVkLCBlaXRoZXIgd2l0aCBhIGZpZWxkIGluaXRpYWxpemVyLCBvciBhblxuICAgKiBhc3NpZ25tZW50IGluIHRoZSBjb25zdHJ1Y3Rvci4gTm90IGluaXRpYWxpemluZyB0aGUgcHJvcGVydHkgbWF5IGxlYWQgdG9cbiAgICogaW1wcm9wZXIgaGFuZGxpbmcgb2Ygc3Vic2VxdWVudCBwcm9wZXJ0eSBhc3NpZ25tZW50cy5cbiAgICpcbiAgICogV2hpbGUgdGhpcyBiZWhhdmlvciBpcyBvcHQtaW4sIG1vc3QgcHJvcGVydGllcyB0aGF0IHJlZmxlY3QgdG8gYXR0cmlidXRlcyBzaG91bGRcbiAgICogdXNlIGB1c2VEZWZhdWx0OiB0cnVlYCBzbyB0aGF0IHRoZWlyIGluaXRpYWwgdmFsdWVzIGRvIG5vdCByZWZsZWN0LlxuICAgKi9cbiAgdXNlRGVmYXVsdD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogTWFwIG9mIHByb3BlcnRpZXMgdG8gUHJvcGVydHlEZWNsYXJhdGlvbiBvcHRpb25zLiBGb3IgZWFjaCBwcm9wZXJ0eSBhblxuICogYWNjZXNzb3IgaXMgbWFkZSwgYW5kIHRoZSBwcm9wZXJ0eSBpcyBwcm9jZXNzZWQgYWNjb3JkaW5nIHRvIHRoZVxuICogUHJvcGVydHlEZWNsYXJhdGlvbiBvcHRpb25zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb3BlcnR5RGVjbGFyYXRpb25zIHtcbiAgcmVhZG9ubHkgW2tleTogc3RyaW5nXTogUHJvcGVydHlEZWNsYXJhdGlvbjtcbn1cblxudHlwZSBQcm9wZXJ0eURlY2xhcmF0aW9uTWFwID0gTWFwPFByb3BlcnR5S2V5LCBQcm9wZXJ0eURlY2xhcmF0aW9uPjtcblxudHlwZSBBdHRyaWJ1dGVNYXAgPSBNYXA8c3RyaW5nLCBQcm9wZXJ0eUtleT47XG5cbi8qKlxuICogQSBNYXAgb2YgcHJvcGVydHkga2V5cyB0byB2YWx1ZXMuXG4gKlxuICogVGFrZXMgYW4gb3B0aW9uYWwgdHlwZSBwYXJhbWV0ZXIgVCwgd2hpY2ggd2hlbiBzcGVjaWZpZWQgYXMgYSBub24tYW55LFxuICogbm9uLXVua25vd24gdHlwZSwgd2lsbCBtYWtlIHRoZSBNYXAgbW9yZSBzdHJvbmdseS10eXBlZCwgYXNzb2NpYXRpbmcgdGhlIG1hcFxuICoga2V5cyB3aXRoIHRoZWlyIGNvcnJlc3BvbmRpbmcgdmFsdWUgdHlwZSBvbiBULlxuICpcbiAqIFVzZSBgUHJvcGVydHlWYWx1ZXM8dGhpcz5gIHdoZW4gb3ZlcnJpZGluZyBSZWFjdGl2ZUVsZW1lbnQudXBkYXRlKCkgYW5kXG4gKiBvdGhlciBsaWZlY3ljbGUgbWV0aG9kcyBpbiBvcmRlciB0byBnZXQgc3Ryb25nZXIgdHlwZS1jaGVja2luZyBvbiBrZXlzXG4gKiBhbmQgdmFsdWVzLlxuICovXG4vLyBUaGlzIHR5cGUgaXMgY29uZGl0aW9uYWwgc28gdGhhdCBpZiB0aGUgcGFyYW1ldGVyIFQgaXMgbm90IHNwZWNpZmllZCwgb3Jcbi8vIGlzIGBhbnlgLCB0aGUgdHlwZSB3aWxsIGluY2x1ZGUgYE1hcDxQcm9wZXJ0eUtleSwgdW5rbm93bj5gLiBTaW5jZSBUIGlzIG5vdFxuLy8gZ2l2ZW4gaW4gdGhlIHVzZXMgb2YgUHJvcGVydHlWYWx1ZXMgaW4gdGhpcyBmaWxlLCBhbGwgdXNlcyBoZXJlIGZhbGxiYWNrIHRvXG4vLyBtZWFuaW5nIGBNYXA8UHJvcGVydHlLZXksIHVua25vd24+YCwgYnV0IGlmIGEgZGV2ZWxvcGVyIHVzZXNcbi8vIGBQcm9wZXJ0eVZhbHVlczx0aGlzPmAgKG9yIGFueSBvdGhlciB2YWx1ZSBmb3IgVCkgdGhleSB3aWxsIGdldCBhXG4vLyBzdHJvbmdseS10eXBlZCBNYXAgdHlwZS5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgdHlwZSBQcm9wZXJ0eVZhbHVlczxUID0gYW55PiA9IFQgZXh0ZW5kcyBvYmplY3RcbiAgPyBQcm9wZXJ0eVZhbHVlTWFwPFQ+XG4gIDogTWFwPFByb3BlcnR5S2V5LCB1bmtub3duPjtcblxuLyoqXG4gKiBEbyBub3QgdXNlLCBpbnN0ZWFkIHByZWZlciB7QGxpbmtjb2RlIFByb3BlcnR5VmFsdWVzfS5cbiAqL1xuLy8gVGhpcyB0eXBlIG11c3QgYmUgZXhwb3J0ZWQgc3VjaCB0aGF0IEphdmFTY3JpcHQgZ2VuZXJhdGVkIGJ5IHRoZSBHb29nbGVcbi8vIENsb3N1cmUgQ29tcGlsZXIgY2FuIGltcG9ydCBhIHR5cGUgcmVmZXJlbmNlLlxuZXhwb3J0IGludGVyZmFjZSBQcm9wZXJ0eVZhbHVlTWFwPFQ+IGV4dGVuZHMgTWFwPFByb3BlcnR5S2V5LCB1bmtub3duPiB7XG4gIGdldDxLIGV4dGVuZHMga2V5b2YgVD4oazogSyk6IFRbS10gfCB1bmRlZmluZWQ7XG4gIHNldDxLIGV4dGVuZHMga2V5b2YgVD4oa2V5OiBLLCB2YWx1ZTogVFtLXSk6IHRoaXM7XG4gIGhhczxLIGV4dGVuZHMga2V5b2YgVD4oazogSyk6IGJvb2xlYW47XG4gIGRlbGV0ZTxLIGV4dGVuZHMga2V5b2YgVD4oazogSyk6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0Q29udmVydGVyOiBDb21wbGV4QXR0cmlidXRlQ29udmVydGVyID0ge1xuICB0b0F0dHJpYnV0ZSh2YWx1ZTogdW5rbm93biwgdHlwZT86IHVua25vd24pOiB1bmtub3duIHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgQm9vbGVhbjpcbiAgICAgICAgdmFsdWUgPSB2YWx1ZSA/IGVtcHR5U3RyaW5nRm9yQm9vbGVhbkF0dHJpYnV0ZSA6IG51bGw7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBPYmplY3Q6XG4gICAgICBjYXNlIEFycmF5OlxuICAgICAgICAvLyBpZiB0aGUgdmFsdWUgaXMgYG51bGxgIG9yIGB1bmRlZmluZWRgIHBhc3MgdGhpcyB0aHJvdWdoXG4gICAgICAgIC8vIHRvIGFsbG93IHJlbW92aW5nL25vIGNoYW5nZSBiZWhhdmlvci5cbiAgICAgICAgdmFsdWUgPSB2YWx1ZSA9PSBudWxsID8gdmFsdWUgOiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH0sXG5cbiAgZnJvbUF0dHJpYnV0ZSh2YWx1ZTogc3RyaW5nIHwgbnVsbCwgdHlwZT86IHVua25vd24pIHtcbiAgICBsZXQgZnJvbVZhbHVlOiB1bmtub3duID0gdmFsdWU7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIEJvb2xlYW46XG4gICAgICAgIGZyb21WYWx1ZSA9IHZhbHVlICE9PSBudWxsO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgTnVtYmVyOlxuICAgICAgICBmcm9tVmFsdWUgPSB2YWx1ZSA9PT0gbnVsbCA/IG51bGwgOiBOdW1iZXIodmFsdWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgT2JqZWN0OlxuICAgICAgY2FzZSBBcnJheTpcbiAgICAgICAgLy8gRG8gKm5vdCogZ2VuZXJhdGUgZXhjZXB0aW9uIHdoZW4gaW52YWxpZCBKU09OIGlzIHNldCBhcyBlbGVtZW50c1xuICAgICAgICAvLyBkb24ndCBub3JtYWxseSBjb21wbGFpbiBvbiBiZWluZyBtaXMtY29uZmlndXJlZC5cbiAgICAgICAgLy8gVE9ETyhzb3J2ZWxsKTogRG8gZ2VuZXJhdGUgZXhjZXB0aW9uIGluICpkZXYgbW9kZSouXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gQXNzZXJ0IHRvIGFkaGVyZSB0byBCYXplbCdzIFwibXVzdCB0eXBlIGFzc2VydCBKU09OIHBhcnNlXCIgcnVsZS5cbiAgICAgICAgICBmcm9tVmFsdWUgPSBKU09OLnBhcnNlKHZhbHVlISkgYXMgdW5rbm93bjtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGZyb21WYWx1ZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBmcm9tVmFsdWU7XG4gIH0sXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEhhc0NoYW5nZWQge1xuICAodmFsdWU6IHVua25vd24sIG9sZDogdW5rbm93bik6IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ2hhbmdlIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0cnVlIGlmIGB2YWx1ZWAgaXMgZGlmZmVyZW50IGZyb20gYG9sZFZhbHVlYC5cbiAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgYXMgdGhlIGRlZmF1bHQgZm9yIGEgcHJvcGVydHkncyBgaGFzQ2hhbmdlZGAgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBjb25zdCBub3RFcXVhbDogSGFzQ2hhbmdlZCA9ICh2YWx1ZTogdW5rbm93biwgb2xkOiB1bmtub3duKTogYm9vbGVhbiA9PlxuICAhaXModmFsdWUsIG9sZCk7XG5cbmNvbnN0IGRlZmF1bHRQcm9wZXJ0eURlY2xhcmF0aW9uOiBQcm9wZXJ0eURlY2xhcmF0aW9uID0ge1xuICBhdHRyaWJ1dGU6IHRydWUsXG4gIHR5cGU6IFN0cmluZyxcbiAgY29udmVydGVyOiBkZWZhdWx0Q29udmVydGVyLFxuICByZWZsZWN0OiBmYWxzZSxcbiAgdXNlRGVmYXVsdDogZmFsc2UsXG4gIGhhc0NoYW5nZWQ6IG5vdEVxdWFsLFxufTtcblxuLyoqXG4gKiBBIHN0cmluZyByZXByZXNlbnRpbmcgb25lIG9mIHRoZSBzdXBwb3J0ZWQgZGV2IG1vZGUgd2FybmluZyBjYXRlZ29yaWVzLlxuICovXG5leHBvcnQgdHlwZSBXYXJuaW5nS2luZCA9XG4gIHwgJ2NoYW5nZS1pbi11cGRhdGUnXG4gIHwgJ21pZ3JhdGlvbidcbiAgfCAnYXN5bmMtcGVyZm9ybS11cGRhdGUnO1xuXG5leHBvcnQgdHlwZSBJbml0aWFsaXplciA9IChlbGVtZW50OiBSZWFjdGl2ZUVsZW1lbnQpID0+IHZvaWQ7XG5cbi8vIFRlbXBvcmFyeSwgdW50aWwgZ29vZ2xlMyBpcyBvbiBUeXBlU2NyaXB0IDUuMlxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgU3ltYm9sQ29uc3RydWN0b3Ige1xuICAgIHJlYWRvbmx5IG1ldGFkYXRhOiB1bmlxdWUgc3ltYm9sO1xuICB9XG59XG5cbi8vIEVuc3VyZSBtZXRhZGF0YSBpcyBlbmFibGVkLiBUeXBlU2NyaXB0IGRvZXMgbm90IHBvbHlmaWxsXG4vLyBTeW1ib2wubWV0YWRhdGEsIHNvIHdlIG11c3QgZW5zdXJlIHRoYXQgaXQgZXhpc3RzLlxuKFN5bWJvbCBhcyB7bWV0YWRhdGE6IHN5bWJvbH0pLm1ldGFkYXRhID8/PSBTeW1ib2woJ21ldGFkYXRhJyk7XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgLy8gVGhpcyBpcyBwdWJsaWMgZ2xvYmFsIEFQSSwgZG8gbm90IGNoYW5nZSFcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXZhclxuICB2YXIgbGl0UHJvcGVydHlNZXRhZGF0YTogV2Vha01hcDxcbiAgICBvYmplY3QsXG4gICAgTWFwPFByb3BlcnR5S2V5LCBQcm9wZXJ0eURlY2xhcmF0aW9uPlxuICA+O1xufVxuXG4vLyBNYXAgZnJvbSBhIGNsYXNzJ3MgbWV0YWRhdGEgb2JqZWN0IHRvIHByb3BlcnR5IG9wdGlvbnNcbi8vIE5vdGUgdGhhdCB3ZSBtdXN0IHVzZSBudWxsaXNoLWNvYWxlc2NpbmcgYXNzaWdubWVudCBzbyB0aGF0IHdlIG9ubHkgdXNlIG9uZVxuLy8gbWFwIGV2ZW4gaWYgd2UgbG9hZCBtdWx0aXBsZSB2ZXJzaW9uIG9mIHRoaXMgbW9kdWxlLlxuZ2xvYmFsLmxpdFByb3BlcnR5TWV0YWRhdGEgPz89IG5ldyBXZWFrTWFwPFxuICBvYmplY3QsXG4gIE1hcDxQcm9wZXJ0eUtleSwgUHJvcGVydHlEZWNsYXJhdGlvbj5cbj4oKTtcblxuLyoqXG4gKiBCYXNlIGVsZW1lbnQgY2xhc3Mgd2hpY2ggbWFuYWdlcyBlbGVtZW50IHByb3BlcnRpZXMgYW5kIGF0dHJpYnV0ZXMuIFdoZW5cbiAqIHByb3BlcnRpZXMgY2hhbmdlLCB0aGUgYHVwZGF0ZWAgbWV0aG9kIGlzIGFzeW5jaHJvbm91c2x5IGNhbGxlZC4gVGhpcyBtZXRob2RcbiAqIHNob3VsZCBiZSBzdXBwbGllZCBieSBzdWJjbGFzc2VzIHRvIHJlbmRlciB1cGRhdGVzIGFzIGRlc2lyZWQuXG4gKiBAbm9Jbmhlcml0RG9jXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBSZWFjdGl2ZUVsZW1lbnRcbiAgLy8gSW4gdGhlIE5vZGUgYnVpbGQsIHRoaXMgYGV4dGVuZHNgIGNsYXVzZSB3aWxsIGJlIHN1YnN0aXR1dGVkIHdpdGhcbiAgLy8gYChnbG9iYWxUaGlzLkhUTUxFbGVtZW50ID8/IEhUTUxFbGVtZW50KWAuXG4gIC8vXG4gIC8vIFRoaXMgd2F5LCB3ZSB3aWxsIGZpcnN0IHByZWZlciBhbnkgZ2xvYmFsIGBIVE1MRWxlbWVudGAgcG9seWZpbGwgdGhhdCB0aGVcbiAgLy8gdXNlciBoYXMgYXNzaWduZWQsIGFuZCB0aGVuIGZhbGwgYmFjayB0byB0aGUgYEhUTUxFbGVtZW50YCBzaGltIHdoaWNoIGhhc1xuICAvLyBiZWVuIGltcG9ydGVkIChzZWUgbm90ZSBhdCB0aGUgdG9wIG9mIHRoaXMgZmlsZSBhYm91dCBob3cgdGhpcyBpbXBvcnQgaXNcbiAgLy8gZ2VuZXJhdGVkIGJ5IFJvbGx1cCkuIE5vdGUgdGhhdCB0aGUgYEhUTUxFbGVtZW50YCB2YXJpYWJsZSBoYXMgYmVlblxuICAvLyBzaGFkb3dlZCBieSB0aGlzIGltcG9ydCwgc28gaXQgbm8gbG9uZ2VyIHJlZmVycyB0byB0aGUgZ2xvYmFsLlxuICBleHRlbmRzIEhUTUxFbGVtZW50XG4gIGltcGxlbWVudHMgUmVhY3RpdmVDb250cm9sbGVySG9zdFxue1xuICAvLyBOb3RlOiB0aGVzZSBhcmUgcGF0Y2hlZCBpbiBvbmx5IGluIERFVl9NT0RFLlxuICAvKipcbiAgICogUmVhZCBvciBzZXQgYWxsIHRoZSBlbmFibGVkIHdhcm5pbmcgY2F0ZWdvcmllcyBmb3IgdGhpcyBjbGFzcy5cbiAgICpcbiAgICogVGhpcyBwcm9wZXJ0eSBpcyBvbmx5IHVzZWQgaW4gZGV2ZWxvcG1lbnQgYnVpbGRzLlxuICAgKlxuICAgKiBAbm9jb2xsYXBzZVxuICAgKiBAY2F0ZWdvcnkgZGV2LW1vZGVcbiAgICovXG4gIHN0YXRpYyBlbmFibGVkV2FybmluZ3M/OiBXYXJuaW5nS2luZFtdO1xuXG4gIC8qKlxuICAgKiBFbmFibGUgdGhlIGdpdmVuIHdhcm5pbmcgY2F0ZWdvcnkgZm9yIHRoaXMgY2xhc3MuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIG9ubHkgZXhpc3RzIGluIGRldmVsb3BtZW50IGJ1aWxkcywgc28gaXQgc2hvdWxkIGJlIGFjY2Vzc2VkXG4gICAqIHdpdGggYSBndWFyZCBsaWtlOlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiAvLyBFbmFibGUgZm9yIGFsbCBSZWFjdGl2ZUVsZW1lbnQgc3ViY2xhc3Nlc1xuICAgKiBSZWFjdGl2ZUVsZW1lbnQuZW5hYmxlV2FybmluZz8uKCdtaWdyYXRpb24nKTtcbiAgICpcbiAgICogLy8gRW5hYmxlIGZvciBvbmx5IE15RWxlbWVudCBhbmQgc3ViY2xhc3Nlc1xuICAgKiBNeUVsZW1lbnQuZW5hYmxlV2FybmluZz8uKCdtaWdyYXRpb24nKTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBub2NvbGxhcHNlXG4gICAqIEBjYXRlZ29yeSBkZXYtbW9kZVxuICAgKi9cbiAgc3RhdGljIGVuYWJsZVdhcm5pbmc/OiAod2FybmluZ0tpbmQ6IFdhcm5pbmdLaW5kKSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBEaXNhYmxlIHRoZSBnaXZlbiB3YXJuaW5nIGNhdGVnb3J5IGZvciB0aGlzIGNsYXNzLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBvbmx5IGV4aXN0cyBpbiBkZXZlbG9wbWVudCBidWlsZHMsIHNvIGl0IHNob3VsZCBiZSBhY2Nlc3NlZFxuICAgKiB3aXRoIGEgZ3VhcmQgbGlrZTpcbiAgICpcbiAgICogYGBgdHNcbiAgICogLy8gRGlzYWJsZSBmb3IgYWxsIFJlYWN0aXZlRWxlbWVudCBzdWJjbGFzc2VzXG4gICAqIFJlYWN0aXZlRWxlbWVudC5kaXNhYmxlV2FybmluZz8uKCdtaWdyYXRpb24nKTtcbiAgICpcbiAgICogLy8gRGlzYWJsZSBmb3Igb25seSBNeUVsZW1lbnQgYW5kIHN1YmNsYXNzZXNcbiAgICogTXlFbGVtZW50LmRpc2FibGVXYXJuaW5nPy4oJ21pZ3JhdGlvbicpO1xuICAgKiBgYGBcbiAgICpcbiAgICogQG5vY29sbGFwc2VcbiAgICogQGNhdGVnb3J5IGRldi1tb2RlXG4gICAqL1xuICBzdGF0aWMgZGlzYWJsZVdhcm5pbmc/OiAod2FybmluZ0tpbmQ6IFdhcm5pbmdLaW5kKSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGluaXRpYWxpemVyIGZ1bmN0aW9uIHRvIHRoZSBjbGFzcyB0aGF0IGlzIGNhbGxlZCBkdXJpbmcgaW5zdGFuY2VcbiAgICogY29uc3RydWN0aW9uLlxuICAgKlxuICAgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgY29kZSB0aGF0IHJ1bnMgYWdhaW5zdCBhIGBSZWFjdGl2ZUVsZW1lbnRgXG4gICAqIHN1YmNsYXNzLCBzdWNoIGFzIGEgZGVjb3JhdG9yLCB0aGF0IG5lZWRzIHRvIGRvIHdvcmsgZm9yIGVhY2hcbiAgICogaW5zdGFuY2UsIHN1Y2ggYXMgc2V0dGluZyB1cCBhIGBSZWFjdGl2ZUNvbnRyb2xsZXJgLlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiBjb25zdCBteURlY29yYXRvciA9ICh0YXJnZXQ6IHR5cGVvZiBSZWFjdGl2ZUVsZW1lbnQsIGtleTogc3RyaW5nKSA9PiB7XG4gICAqICAgdGFyZ2V0LmFkZEluaXRpYWxpemVyKChpbnN0YW5jZTogUmVhY3RpdmVFbGVtZW50KSA9PiB7XG4gICAqICAgICAvLyBUaGlzIGlzIHJ1biBkdXJpbmcgY29uc3RydWN0aW9uIG9mIHRoZSBlbGVtZW50XG4gICAqICAgICBuZXcgTXlDb250cm9sbGVyKGluc3RhbmNlKTtcbiAgICogICB9KTtcbiAgICogfVxuICAgKiBgYGBcbiAgICpcbiAgICogRGVjb3JhdGluZyBhIGZpZWxkIHdpbGwgdGhlbiBjYXVzZSBlYWNoIGluc3RhbmNlIHRvIHJ1biBhbiBpbml0aWFsaXplclxuICAgKiB0aGF0IGFkZHMgYSBjb250cm9sbGVyOlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiBjbGFzcyBNeUVsZW1lbnQgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgICogICBAbXlEZWNvcmF0b3IgZm9vO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKlxuICAgKiBJbml0aWFsaXplcnMgYXJlIHN0b3JlZCBwZXItY29uc3RydWN0b3IuIEFkZGluZyBhbiBpbml0aWFsaXplciB0byBhXG4gICAqIHN1YmNsYXNzIGRvZXMgbm90IGFkZCBpdCB0byBhIHN1cGVyY2xhc3MuIFNpbmNlIGluaXRpYWxpemVycyBhcmUgcnVuIGluXG4gICAqIGNvbnN0cnVjdG9ycywgaW5pdGlhbGl6ZXJzIHdpbGwgcnVuIGluIG9yZGVyIG9mIHRoZSBjbGFzcyBoaWVyYXJjaHksXG4gICAqIHN0YXJ0aW5nIHdpdGggc3VwZXJjbGFzc2VzIGFuZCBwcm9ncmVzc2luZyB0byB0aGUgaW5zdGFuY2UncyBjbGFzcy5cbiAgICpcbiAgICogQG5vY29sbGFwc2VcbiAgICovXG4gIHN0YXRpYyBhZGRJbml0aWFsaXplcihpbml0aWFsaXplcjogSW5pdGlhbGl6ZXIpIHtcbiAgICB0aGlzLl9fcHJlcGFyZSgpO1xuICAgICh0aGlzLl9pbml0aWFsaXplcnMgPz89IFtdKS5wdXNoKGluaXRpYWxpemVyKTtcbiAgfVxuXG4gIHN0YXRpYyBfaW5pdGlhbGl6ZXJzPzogSW5pdGlhbGl6ZXJbXTtcblxuICAvKlxuICAgKiBEdWUgdG8gY2xvc3VyZSBjb21waWxlciBFUzYgY29tcGlsYXRpb24gYnVncywgQG5vY29sbGFwc2UgaXMgcmVxdWlyZWQgb25cbiAgICogYWxsIHN0YXRpYyBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzIHdpdGggaW5pdGlhbGl6ZXJzLiAgUmVmZXJlbmNlOlxuICAgKiAtIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvY2xvc3VyZS1jb21waWxlci9pc3N1ZXMvMTc3NlxuICAgKi9cblxuICAvKipcbiAgICogTWFwcyBhdHRyaWJ1dGUgbmFtZXMgdG8gcHJvcGVydGllczsgZm9yIGV4YW1wbGUgYGZvb2JhcmAgYXR0cmlidXRlIHRvXG4gICAqIGBmb29CYXJgIHByb3BlcnR5LiBDcmVhdGVkIGxhemlseSBvbiB1c2VyIHN1YmNsYXNzZXMgd2hlbiBmaW5hbGl6aW5nIHRoZVxuICAgKiBjbGFzcy5cbiAgICogQG5vY29sbGFwc2VcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIF9fYXR0cmlidXRlVG9Qcm9wZXJ0eU1hcDogQXR0cmlidXRlTWFwO1xuXG4gIC8qKlxuICAgKiBNYXJrcyBjbGFzcyBhcyBoYXZpbmcgYmVlbiBmaW5hbGl6ZWQsIHdoaWNoIGluY2x1ZGVzIGNyZWF0aW5nIHByb3BlcnRpZXNcbiAgICogZnJvbSBgc3RhdGljIHByb3BlcnRpZXNgLCBidXQgZG9lcyAqbm90KiBpbmNsdWRlIGFsbCBwcm9wZXJ0aWVzIGNyZWF0ZWRcbiAgICogZnJvbSBkZWNvcmF0b3JzLlxuICAgKiBAbm9jb2xsYXBzZVxuICAgKi9cbiAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbGl6ZWQ6IHRydWUgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIE1lbW9pemVkIGxpc3Qgb2YgYWxsIGVsZW1lbnQgcHJvcGVydGllcywgaW5jbHVkaW5nIGFueSBzdXBlcmNsYXNzXG4gICAqIHByb3BlcnRpZXMuIENyZWF0ZWQgbGF6aWx5IG9uIHVzZXIgc3ViY2xhc3NlcyB3aGVuIGZpbmFsaXppbmcgdGhlIGNsYXNzLlxuICAgKlxuICAgKiBAbm9jb2xsYXBzZVxuICAgKiBAY2F0ZWdvcnkgcHJvcGVydGllc1xuICAgKi9cbiAgc3RhdGljIGVsZW1lbnRQcm9wZXJ0aWVzOiBQcm9wZXJ0eURlY2xhcmF0aW9uTWFwO1xuXG4gIC8qKlxuICAgKiBVc2VyLXN1cHBsaWVkIG9iamVjdCB0aGF0IG1hcHMgcHJvcGVydHkgbmFtZXMgdG8gYFByb3BlcnR5RGVjbGFyYXRpb25gXG4gICAqIG9iamVjdHMgY29udGFpbmluZyBvcHRpb25zIGZvciBjb25maWd1cmluZyByZWFjdGl2ZSBwcm9wZXJ0aWVzLiBXaGVuXG4gICAqIGEgcmVhY3RpdmUgcHJvcGVydHkgaXMgc2V0IHRoZSBlbGVtZW50IHdpbGwgdXBkYXRlIGFuZCByZW5kZXIuXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQgcHJvcGVydGllcyBhcmUgcHVibGljIGZpZWxkcywgYW5kIGFzIHN1Y2gsIHRoZXkgc2hvdWxkIGJlXG4gICAqIGNvbnNpZGVyZWQgYXMgcHJpbWFyaWx5IHNldHRhYmxlIGJ5IGVsZW1lbnQgdXNlcnMsIGVpdGhlciB2aWEgYXR0cmlidXRlIG9yXG4gICAqIHRoZSBwcm9wZXJ0eSBpdHNlbGYuXG4gICAqXG4gICAqIEdlbmVyYWxseSwgcHJvcGVydGllcyB0aGF0IGFyZSBjaGFuZ2VkIGJ5IHRoZSBlbGVtZW50IHNob3VsZCBiZSBwcml2YXRlIG9yXG4gICAqIHByb3RlY3RlZCBmaWVsZHMgYW5kIHNob3VsZCB1c2UgdGhlIGBzdGF0ZTogdHJ1ZWAgb3B0aW9uLiBQcm9wZXJ0aWVzXG4gICAqIG1hcmtlZCBhcyBgc3RhdGVgIGRvIG5vdCByZWZsZWN0IGZyb20gdGhlIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlXG4gICAqXG4gICAqIEhvd2V2ZXIsIHNvbWV0aW1lcyBlbGVtZW50IGNvZGUgZG9lcyBuZWVkIHRvIHNldCBhIHB1YmxpYyBwcm9wZXJ0eS4gVGhpc1xuICAgKiBzaG91bGQgdHlwaWNhbGx5IG9ubHkgYmUgZG9uZSBpbiByZXNwb25zZSB0byB1c2VyIGludGVyYWN0aW9uLCBhbmQgYW4gZXZlbnRcbiAgICogc2hvdWxkIGJlIGZpcmVkIGluZm9ybWluZyB0aGUgdXNlcjsgZm9yIGV4YW1wbGUsIGEgY2hlY2tib3ggc2V0cyBpdHNcbiAgICogYGNoZWNrZWRgIHByb3BlcnR5IHdoZW4gY2xpY2tlZCBhbmQgZmlyZXMgYSBgY2hhbmdlZGAgZXZlbnQuIE11dGF0aW5nXG4gICAqIHB1YmxpYyBwcm9wZXJ0aWVzIHNob3VsZCB0eXBpY2FsbHkgbm90IGJlIGRvbmUgZm9yIG5vbi1wcmltaXRpdmUgKG9iamVjdCBvclxuICAgKiBhcnJheSkgcHJvcGVydGllcy4gSW4gb3RoZXIgY2FzZXMgd2hlbiBhbiBlbGVtZW50IG5lZWRzIHRvIG1hbmFnZSBzdGF0ZSwgYVxuICAgKiBwcml2YXRlIHByb3BlcnR5IHNldCB3aXRoIHRoZSBgc3RhdGU6IHRydWVgIG9wdGlvbiBzaG91bGQgYmUgdXNlZC4gV2hlblxuICAgKiBuZWVkZWQsIHN0YXRlIHByb3BlcnRpZXMgY2FuIGJlIGluaXRpYWxpemVkIHZpYSBwdWJsaWMgcHJvcGVydGllcyB0b1xuICAgKiBmYWNpbGl0YXRlIGNvbXBsZXggaW50ZXJhY3Rpb25zLlxuICAgKiBAbm9jb2xsYXBzZVxuICAgKiBAY2F0ZWdvcnkgcHJvcGVydGllc1xuICAgKi9cbiAgc3RhdGljIHByb3BlcnRpZXM6IFByb3BlcnR5RGVjbGFyYXRpb25zO1xuXG4gIC8qKlxuICAgKiBNZW1vaXplZCBsaXN0IG9mIGFsbCBlbGVtZW50IHN0eWxlcy5cbiAgICogQ3JlYXRlZCBsYXppbHkgb24gdXNlciBzdWJjbGFzc2VzIHdoZW4gZmluYWxpemluZyB0aGUgY2xhc3MuXG4gICAqIEBub2NvbGxhcHNlXG4gICAqIEBjYXRlZ29yeSBzdHlsZXNcbiAgICovXG4gIHN0YXRpYyBlbGVtZW50U3R5bGVzOiBBcnJheTxDU1NSZXN1bHRPck5hdGl2ZT4gPSBbXTtcblxuICAvKipcbiAgICogQXJyYXkgb2Ygc3R5bGVzIHRvIGFwcGx5IHRvIHRoZSBlbGVtZW50LiBUaGUgc3R5bGVzIHNob3VsZCBiZSBkZWZpbmVkXG4gICAqIHVzaW5nIHRoZSB7QGxpbmtjb2RlIGNzc30gdGFnIGZ1bmN0aW9uLCB2aWEgY29uc3RydWN0aWJsZSBzdHlsZXNoZWV0cywgb3JcbiAgICogaW1wb3J0ZWQgZnJvbSBuYXRpdmUgQ1NTIG1vZHVsZSBzY3JpcHRzLlxuICAgKlxuICAgKiBOb3RlIG9uIENvbnRlbnQgU2VjdXJpdHkgUG9saWN5OlxuICAgKlxuICAgKiBFbGVtZW50IHN0eWxlcyBhcmUgaW1wbGVtZW50ZWQgd2l0aCBgPHN0eWxlPmAgdGFncyB3aGVuIHRoZSBicm93c2VyIGRvZXNuJ3RcbiAgICogc3VwcG9ydCBhZG9wdGVkIFN0eWxlU2hlZXRzLiBUbyB1c2Ugc3VjaCBgPHN0eWxlPmAgdGFncyB3aXRoIHRoZSBzdHlsZS1zcmNcbiAgICogQ1NQIGRpcmVjdGl2ZSwgdGhlIHN0eWxlLXNyYyB2YWx1ZSBtdXN0IGVpdGhlciBpbmNsdWRlICd1bnNhZmUtaW5saW5lJyBvclxuICAgKiBgbm9uY2UtPGJhc2U2NC12YWx1ZT5gIHdpdGggYDxiYXNlNjQtdmFsdWU+YCByZXBsYWNlZCBiZSBhIHNlcnZlci1nZW5lcmF0ZWRcbiAgICogbm9uY2UuXG4gICAqXG4gICAqIFRvIHByb3ZpZGUgYSBub25jZSB0byB1c2Ugb24gZ2VuZXJhdGVkIGA8c3R5bGU+YCBlbGVtZW50cywgc2V0XG4gICAqIGB3aW5kb3cubGl0Tm9uY2VgIHRvIGEgc2VydmVyLWdlbmVyYXRlZCBub25jZSBpbiB5b3VyIHBhZ2UncyBIVE1MLCBiZWZvcmVcbiAgICogbG9hZGluZyBhcHBsaWNhdGlvbiBjb2RlOlxuICAgKlxuICAgKiBgYGBodG1sXG4gICAqIDxzY3JpcHQ+XG4gICAqICAgLy8gR2VuZXJhdGVkIGFuZCB1bmlxdWUgcGVyIHJlcXVlc3Q6XG4gICAqICAgd2luZG93LmxpdE5vbmNlID0gJ2ExYjJjM2Q0JztcbiAgICogPC9zY3JpcHQ+XG4gICAqIGBgYFxuICAgKiBAbm9jb2xsYXBzZVxuICAgKiBAY2F0ZWdvcnkgc3R5bGVzXG4gICAqL1xuICBzdGF0aWMgc3R5bGVzPzogQ1NTUmVzdWx0R3JvdXA7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBsaXN0IG9mIGF0dHJpYnV0ZXMgY29ycmVzcG9uZGluZyB0byB0aGUgcmVnaXN0ZXJlZCBwcm9wZXJ0aWVzLlxuICAgKiBAbm9jb2xsYXBzZVxuICAgKiBAY2F0ZWdvcnkgYXR0cmlidXRlc1xuICAgKi9cbiAgc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKSB7XG4gICAgLy8gRW5zdXJlIHdlJ3ZlIGNyZWF0ZWQgYWxsIHByb3BlcnRpZXNcbiAgICB0aGlzLmZpbmFsaXplKCk7XG4gICAgLy8gdGhpcy5fX2F0dHJpYnV0ZVRvUHJvcGVydHlNYXAgaXMgb25seSB1bmRlZmluZWQgYWZ0ZXIgZmluYWxpemUoKSBpblxuICAgIC8vIFJlYWN0aXZlRWxlbWVudCBpdHNlbGYuIFJlYWN0aXZlRWxlbWVudC5vYnNlcnZlZEF0dHJpYnV0ZXMgaXMgb25seVxuICAgIC8vIGFjY2Vzc2VkIHdpdGggUmVhY3RpdmVFbGVtZW50IGFzIHRoZSByZWNlaXZlciB3aGVuIGEgc3ViY2xhc3Mgb3IgbWl4aW5cbiAgICAvLyBjYWxscyBzdXBlci5vYnNlcnZlZEF0dHJpYnV0ZXNcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5fX2F0dHJpYnV0ZVRvUHJvcGVydHlNYXAgJiYgWy4uLnRoaXMuX19hdHRyaWJ1dGVUb1Byb3BlcnR5TWFwLmtleXMoKV1cbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfX2luc3RhbmNlUHJvcGVydGllcz86IFByb3BlcnR5VmFsdWVzID0gdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgcHJvcGVydHkgYWNjZXNzb3Igb24gdGhlIGVsZW1lbnQgcHJvdG90eXBlIGlmIG9uZSBkb2VzIG5vdCBleGlzdFxuICAgKiBhbmQgc3RvcmVzIGEge0BsaW5rY29kZSBQcm9wZXJ0eURlY2xhcmF0aW9ufSBmb3IgdGhlIHByb3BlcnR5IHdpdGggdGhlXG4gICAqIGdpdmVuIG9wdGlvbnMuIFRoZSBwcm9wZXJ0eSBzZXR0ZXIgY2FsbHMgdGhlIHByb3BlcnR5J3MgYGhhc0NoYW5nZWRgXG4gICAqIHByb3BlcnR5IG9wdGlvbiBvciB1c2VzIGEgc3RyaWN0IGlkZW50aXR5IGNoZWNrIHRvIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdFxuICAgKiB0byByZXF1ZXN0IGFuIHVwZGF0ZS5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgbWF5IGJlIG92ZXJyaWRkZW4gdG8gY3VzdG9taXplIHByb3BlcnRpZXM7IGhvd2V2ZXIsXG4gICAqIHdoZW4gZG9pbmcgc28sIGl0J3MgaW1wb3J0YW50IHRvIGNhbGwgYHN1cGVyLmNyZWF0ZVByb3BlcnR5YCB0byBlbnN1cmVcbiAgICogdGhlIHByb3BlcnR5IGlzIHNldHVwIGNvcnJlY3RseS4gVGhpcyBtZXRob2QgY2FsbHNcbiAgICogYGdldFByb3BlcnR5RGVzY3JpcHRvcmAgaW50ZXJuYWxseSB0byBnZXQgYSBkZXNjcmlwdG9yIHRvIGluc3RhbGwuXG4gICAqIFRvIGN1c3RvbWl6ZSB3aGF0IHByb3BlcnRpZXMgZG8gd2hlbiB0aGV5IGFyZSBnZXQgb3Igc2V0LCBvdmVycmlkZVxuICAgKiBgZ2V0UHJvcGVydHlEZXNjcmlwdG9yYC4gVG8gY3VzdG9taXplIHRoZSBvcHRpb25zIGZvciBhIHByb3BlcnR5LFxuICAgKiBpbXBsZW1lbnQgYGNyZWF0ZVByb3BlcnR5YCBsaWtlIHRoaXM6XG4gICAqXG4gICAqIGBgYHRzXG4gICAqIHN0YXRpYyBjcmVhdGVQcm9wZXJ0eShuYW1lLCBvcHRpb25zKSB7XG4gICAqICAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24ob3B0aW9ucywge215T3B0aW9uOiB0cnVlfSk7XG4gICAqICAgc3VwZXIuY3JlYXRlUHJvcGVydHkobmFtZSwgb3B0aW9ucyk7XG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIEBub2NvbGxhcHNlXG4gICAqIEBjYXRlZ29yeSBwcm9wZXJ0aWVzXG4gICAqL1xuICBzdGF0aWMgY3JlYXRlUHJvcGVydHkoXG4gICAgbmFtZTogUHJvcGVydHlLZXksXG4gICAgb3B0aW9uczogUHJvcGVydHlEZWNsYXJhdGlvbiA9IGRlZmF1bHRQcm9wZXJ0eURlY2xhcmF0aW9uXG4gICkge1xuICAgIC8vIElmIHRoaXMgaXMgYSBzdGF0ZSBwcm9wZXJ0eSwgZm9yY2UgdGhlIGF0dHJpYnV0ZSB0byBmYWxzZS5cbiAgICBpZiAob3B0aW9ucy5zdGF0ZSkge1xuICAgICAgKG9wdGlvbnMgYXMgTXV0YWJsZTxQcm9wZXJ0eURlY2xhcmF0aW9uLCAnYXR0cmlidXRlJz4pLmF0dHJpYnV0ZSA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLl9fcHJlcGFyZSgpO1xuICAgIC8vIFdoZXRoZXIgdGhpcyBwcm9wZXJ0eSBpcyB3cmFwcGluZyBhY2Nlc3NvcnMuXG4gICAgLy8gSGVscHMgY29udHJvbCB0aGUgaW5pdGlhbCB2YWx1ZSBjaGFuZ2UgYW5kIHJlZmxlY3Rpb24gbG9naWMuXG4gICAgaWYgKHRoaXMucHJvdG90eXBlLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICBvcHRpb25zID0gT2JqZWN0LmNyZWF0ZShvcHRpb25zKTtcbiAgICAgIG9wdGlvbnMud3JhcHBlZCA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMuZWxlbWVudFByb3BlcnRpZXMuc2V0KG5hbWUsIG9wdGlvbnMpO1xuICAgIGlmICghb3B0aW9ucy5ub0FjY2Vzc29yKSB7XG4gICAgICBjb25zdCBrZXkgPSBERVZfTU9ERVxuICAgICAgICA/IC8vIFVzZSBTeW1ib2wuZm9yIGluIGRldiBtb2RlIHRvIG1ha2UgaXQgZWFzaWVyIHRvIG1haW50YWluIHN0YXRlXG4gICAgICAgICAgLy8gd2hlbiBkb2luZyBITVIuXG4gICAgICAgICAgU3ltYm9sLmZvcihgJHtTdHJpbmcobmFtZSl9IChAcHJvcGVydHkoKSBjYWNoZSlgKVxuICAgICAgICA6IFN5bWJvbCgpO1xuICAgICAgY29uc3QgZGVzY3JpcHRvciA9IHRoaXMuZ2V0UHJvcGVydHlEZXNjcmlwdG9yKG5hbWUsIGtleSwgb3B0aW9ucyk7XG4gICAgICBpZiAoZGVzY3JpcHRvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGRlZmluZVByb3BlcnR5KHRoaXMucHJvdG90eXBlLCBuYW1lLCBkZXNjcmlwdG9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgdG8gYmUgZGVmaW5lZCBvbiB0aGUgZ2l2ZW4gbmFtZWQgcHJvcGVydHkuXG4gICAqIElmIG5vIGRlc2NyaXB0b3IgaXMgcmV0dXJuZWQsIHRoZSBwcm9wZXJ0eSB3aWxsIG5vdCBiZWNvbWUgYW4gYWNjZXNzb3IuXG4gICAqIEZvciBleGFtcGxlLFxuICAgKlxuICAgKiBgYGB0c1xuICAgKiBjbGFzcyBNeUVsZW1lbnQgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgICogICBzdGF0aWMgZ2V0UHJvcGVydHlEZXNjcmlwdG9yKG5hbWUsIGtleSwgb3B0aW9ucykge1xuICAgKiAgICAgY29uc3QgZGVmYXVsdERlc2NyaXB0b3IgPVxuICAgKiAgICAgICAgIHN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcihuYW1lLCBrZXksIG9wdGlvbnMpO1xuICAgKiAgICAgY29uc3Qgc2V0dGVyID0gZGVmYXVsdERlc2NyaXB0b3Iuc2V0O1xuICAgKiAgICAgcmV0dXJuIHtcbiAgICogICAgICAgZ2V0OiBkZWZhdWx0RGVzY3JpcHRvci5nZXQsXG4gICAqICAgICAgIHNldCh2YWx1ZSkge1xuICAgKiAgICAgICAgIHNldHRlci5jYWxsKHRoaXMsIHZhbHVlKTtcbiAgICogICAgICAgICAvLyBjdXN0b20gYWN0aW9uLlxuICAgKiAgICAgICB9LFxuICAgKiAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAqICAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICogICAgIH1cbiAgICogICB9XG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIEBub2NvbGxhcHNlXG4gICAqIEBjYXRlZ29yeSBwcm9wZXJ0aWVzXG4gICAqL1xuICBwcm90ZWN0ZWQgc3RhdGljIGdldFByb3BlcnR5RGVzY3JpcHRvcihcbiAgICBuYW1lOiBQcm9wZXJ0eUtleSxcbiAgICBrZXk6IHN0cmluZyB8IHN5bWJvbCxcbiAgICBvcHRpb25zOiBQcm9wZXJ0eURlY2xhcmF0aW9uXG4gICk6IFByb3BlcnR5RGVzY3JpcHRvciB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qge2dldCwgc2V0fSA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0aGlzLnByb3RvdHlwZSwgbmFtZSkgPz8ge1xuICAgICAgZ2V0KHRoaXM6IFJlYWN0aXZlRWxlbWVudCkge1xuICAgICAgICByZXR1cm4gdGhpc1trZXkgYXMga2V5b2YgdHlwZW9mIHRoaXNdO1xuICAgICAgfSxcbiAgICAgIHNldCh0aGlzOiBSZWFjdGl2ZUVsZW1lbnQsIHY6IHVua25vd24pIHtcbiAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCB1bmtub3duPilba2V5XSA9IHY7XG4gICAgICB9LFxuICAgIH07XG4gICAgaWYgKERFVl9NT0RFICYmIGdldCA9PSBudWxsKSB7XG4gICAgICBpZiAoJ3ZhbHVlJyBpbiAoZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRoaXMucHJvdG90eXBlLCBuYW1lKSA/PyB7fSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBGaWVsZCAke0pTT04uc3RyaW5naWZ5KFN0cmluZyhuYW1lKSl9IG9uIGAgK1xuICAgICAgICAgICAgYCR7dGhpcy5uYW1lfSB3YXMgZGVjbGFyZWQgYXMgYSByZWFjdGl2ZSBwcm9wZXJ0eSBgICtcbiAgICAgICAgICAgIGBidXQgaXQncyBhY3R1YWxseSBkZWNsYXJlZCBhcyBhIHZhbHVlIG9uIHRoZSBwcm90b3R5cGUuIGAgK1xuICAgICAgICAgICAgYFVzdWFsbHkgdGhpcyBpcyBkdWUgdG8gdXNpbmcgQHByb3BlcnR5IG9yIEBzdGF0ZSBvbiBhIG1ldGhvZC5gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpc3N1ZVdhcm5pbmcoXG4gICAgICAgICdyZWFjdGl2ZS1wcm9wZXJ0eS13aXRob3V0LWdldHRlcicsXG4gICAgICAgIGBGaWVsZCAke0pTT04uc3RyaW5naWZ5KFN0cmluZyhuYW1lKSl9IG9uIGAgK1xuICAgICAgICAgIGAke3RoaXMubmFtZX0gd2FzIGRlY2xhcmVkIGFzIGEgcmVhY3RpdmUgcHJvcGVydHkgYCArXG4gICAgICAgICAgYGJ1dCBpdCBkb2VzIG5vdCBoYXZlIGEgZ2V0dGVyLiBUaGlzIHdpbGwgYmUgYW4gZXJyb3IgaW4gYSBgICtcbiAgICAgICAgICBgZnV0dXJlIHZlcnNpb24gb2YgTGl0LmBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBnZXQsXG4gICAgICBzZXQodGhpczogUmVhY3RpdmVFbGVtZW50LCB2YWx1ZTogdW5rbm93bikge1xuICAgICAgICBjb25zdCBvbGRWYWx1ZSA9IGdldD8uY2FsbCh0aGlzKTtcbiAgICAgICAgc2V0Py5jYWxsKHRoaXMsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0VXBkYXRlKG5hbWUsIG9sZFZhbHVlLCBvcHRpb25zKTtcbiAgICAgIH0sXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcHJvcGVydHkgb3B0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHByb3BlcnR5LlxuICAgKiBUaGVzZSBvcHRpb25zIGFyZSBkZWZpbmVkIHdpdGggYSBgUHJvcGVydHlEZWNsYXJhdGlvbmAgdmlhIHRoZSBgcHJvcGVydGllc2BcbiAgICogb2JqZWN0IG9yIHRoZSBgQHByb3BlcnR5YCBkZWNvcmF0b3IgYW5kIGFyZSByZWdpc3RlcmVkIGluXG4gICAqIGBjcmVhdGVQcm9wZXJ0eSguLi4pYC5cbiAgICpcbiAgICogTm90ZSwgdGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNvbnNpZGVyZWQgXCJmaW5hbFwiIGFuZCBub3Qgb3ZlcnJpZGRlbi4gVG9cbiAgICogY3VzdG9taXplIHRoZSBvcHRpb25zIGZvciBhIGdpdmVuIHByb3BlcnR5LCBvdmVycmlkZVxuICAgKiB7QGxpbmtjb2RlIGNyZWF0ZVByb3BlcnR5fS5cbiAgICpcbiAgICogQG5vY29sbGFwc2VcbiAgICogQGZpbmFsXG4gICAqIEBjYXRlZ29yeSBwcm9wZXJ0aWVzXG4gICAqL1xuICBzdGF0aWMgZ2V0UHJvcGVydHlPcHRpb25zKG5hbWU6IFByb3BlcnR5S2V5KSB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudFByb3BlcnRpZXMuZ2V0KG5hbWUpID8/IGRlZmF1bHRQcm9wZXJ0eURlY2xhcmF0aW9uO1xuICB9XG5cbiAgLy8gVGVtcG9yYXJ5LCB1bnRpbCBnb29nbGUzIGlzIG9uIFR5cGVTY3JpcHQgNS4yXG4gIGRlY2xhcmUgc3RhdGljIFtTeW1ib2wubWV0YWRhdGFdOiBvYmplY3QgJiBSZWNvcmQ8UHJvcGVydHlLZXksIHVua25vd24+O1xuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBzdGF0aWMgb3duIHByb3BlcnRpZXMgb2YgdGhlIGNsYXNzIHVzZWQgaW4gYm9va2tlZXBpbmdcbiAgICogZm9yIGVsZW1lbnQgcHJvcGVydGllcywgaW5pdGlhbGl6ZXJzLCBldGMuXG4gICAqXG4gICAqIENhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgYnkgY29kZSB0aGF0IG5lZWRzIHRvIGVuc3VyZSB0aGVzZVxuICAgKiBwcm9wZXJ0aWVzIGV4aXN0IGJlZm9yZSB1c2luZyB0aGVtLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBlbnN1cmVzIHRoZSBzdXBlcmNsYXNzIGlzIGZpbmFsaXplZCBzbyB0aGF0IGluaGVyaXRlZFxuICAgKiBwcm9wZXJ0eSBtZXRhZGF0YSBjYW4gYmUgY29waWVkIGRvd24uXG4gICAqIEBub2NvbGxhcHNlXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBfX3ByZXBhcmUoKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdlbGVtZW50UHJvcGVydGllcycsIHRoaXMpKVxuICAgICkge1xuICAgICAgLy8gQWxyZWFkeSBwcmVwYXJlZFxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBGaW5hbGl6ZSBhbnkgc3VwZXJjbGFzc2VzXG4gICAgY29uc3Qgc3VwZXJDdG9yID0gZ2V0UHJvdG90eXBlT2YodGhpcykgYXMgdHlwZW9mIFJlYWN0aXZlRWxlbWVudDtcbiAgICBzdXBlckN0b3IuZmluYWxpemUoKTtcblxuICAgIC8vIENyZWF0ZSBvd24gc2V0IG9mIGluaXRpYWxpemVycyBmb3IgdGhpcyBjbGFzcyBpZiBhbnkgZXhpc3Qgb24gdGhlXG4gICAgLy8gc3VwZXJjbGFzcyBhbmQgY29weSB0aGVtIGRvd24uIE5vdGUsIGZvciBhIHNtYWxsIHBlcmYgYm9vc3QsIGF2b2lkXG4gICAgLy8gY3JlYXRpbmcgaW5pdGlhbGl6ZXJzIHVubGVzcyBuZWVkZWQuXG4gICAgaWYgKHN1cGVyQ3Rvci5faW5pdGlhbGl6ZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX2luaXRpYWxpemVycyA9IFsuLi5zdXBlckN0b3IuX2luaXRpYWxpemVyc107XG4gICAgfVxuICAgIC8vIEluaXRpYWxpemUgZWxlbWVudFByb3BlcnRpZXMgZnJvbSB0aGUgc3VwZXJjbGFzc1xuICAgIHRoaXMuZWxlbWVudFByb3BlcnRpZXMgPSBuZXcgTWFwKHN1cGVyQ3Rvci5lbGVtZW50UHJvcGVydGllcyk7XG4gIH1cblxuICAvKipcbiAgICogRmluaXNoZXMgc2V0dGluZyB1cCB0aGUgY2xhc3Mgc28gdGhhdCBpdCdzIHJlYWR5IHRvIGJlIHJlZ2lzdGVyZWRcbiAgICogYXMgYSBjdXN0b20gZWxlbWVudCBhbmQgaW5zdGFudGlhdGVkLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIFJlYWN0aXZlRWxlbWVudC5vYnNlcnZlZEF0dHJpYnV0ZXMgZ2V0dGVyLlxuICAgKiBJZiB5b3Ugb3ZlcnJpZGUgdGhlIG9ic2VydmVkQXR0cmlidXRlcyBnZXR0ZXIsIHlvdSBtdXN0IGVpdGhlciBjYWxsXG4gICAqIHN1cGVyLm9ic2VydmVkQXR0cmlidXRlcyB0byB0cmlnZ2VyIGZpbmFsaXphdGlvbiwgb3IgY2FsbCBmaW5hbGl6ZSgpXG4gICAqIHlvdXJzZWxmLlxuICAgKlxuICAgKiBAbm9jb2xsYXBzZVxuICAgKi9cbiAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbGl6ZSgpIHtcbiAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdmaW5hbGl6ZWQnLCB0aGlzKSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5maW5hbGl6ZWQgPSB0cnVlO1xuICAgIHRoaXMuX19wcmVwYXJlKCk7XG5cbiAgICAvLyBDcmVhdGUgcHJvcGVydGllcyBmcm9tIHRoZSBzdGF0aWMgcHJvcGVydGllcyBibG9jazpcbiAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdwcm9wZXJ0aWVzJywgdGhpcykpKSB7XG4gICAgICBjb25zdCBwcm9wcyA9IHRoaXMucHJvcGVydGllcztcbiAgICAgIGNvbnN0IHByb3BLZXlzID0gW1xuICAgICAgICAuLi5nZXRPd25Qcm9wZXJ0eU5hbWVzKHByb3BzKSxcbiAgICAgICAgLi4uZ2V0T3duUHJvcGVydHlTeW1ib2xzKHByb3BzKSxcbiAgICAgIF0gYXMgQXJyYXk8a2V5b2YgdHlwZW9mIHByb3BzPjtcbiAgICAgIGZvciAoY29uc3QgcCBvZiBwcm9wS2V5cykge1xuICAgICAgICB0aGlzLmNyZWF0ZVByb3BlcnR5KHAsIHByb3BzW3BdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgcHJvcGVydGllcyBmcm9tIHN0YW5kYXJkIGRlY29yYXRvciBtZXRhZGF0YTpcbiAgICBjb25zdCBtZXRhZGF0YSA9IHRoaXNbU3ltYm9sLm1ldGFkYXRhXTtcbiAgICBpZiAobWV0YWRhdGEgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBsaXRQcm9wZXJ0eU1ldGFkYXRhLmdldChtZXRhZGF0YSk7XG4gICAgICBpZiAocHJvcGVydGllcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGZvciAoY29uc3QgW3AsIG9wdGlvbnNdIG9mIHByb3BlcnRpZXMpIHtcbiAgICAgICAgICB0aGlzLmVsZW1lbnRQcm9wZXJ0aWVzLnNldChwLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENyZWF0ZSB0aGUgYXR0cmlidXRlLXRvLXByb3BlcnR5IG1hcFxuICAgIHRoaXMuX19hdHRyaWJ1dGVUb1Byb3BlcnR5TWFwID0gbmV3IE1hcCgpO1xuICAgIGZvciAoY29uc3QgW3AsIG9wdGlvbnNdIG9mIHRoaXMuZWxlbWVudFByb3BlcnRpZXMpIHtcbiAgICAgIGNvbnN0IGF0dHIgPSB0aGlzLl9fYXR0cmlidXRlTmFtZUZvclByb3BlcnR5KHAsIG9wdGlvbnMpO1xuICAgICAgaWYgKGF0dHIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLl9fYXR0cmlidXRlVG9Qcm9wZXJ0eU1hcC5zZXQoYXR0ciwgcCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5lbGVtZW50U3R5bGVzID0gdGhpcy5maW5hbGl6ZVN0eWxlcyh0aGlzLnN0eWxlcyk7XG5cbiAgICBpZiAoREVWX01PREUpIHtcbiAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KCdjcmVhdGVQcm9wZXJ0eScpKSB7XG4gICAgICAgIGlzc3VlV2FybmluZyhcbiAgICAgICAgICAnbm8tb3ZlcnJpZGUtY3JlYXRlLXByb3BlcnR5JyxcbiAgICAgICAgICAnT3ZlcnJpZGluZyBSZWFjdGl2ZUVsZW1lbnQuY3JlYXRlUHJvcGVydHkoKSBpcyBkZXByZWNhdGVkLiAnICtcbiAgICAgICAgICAgICdUaGUgb3ZlcnJpZGUgd2lsbCBub3QgYmUgY2FsbGVkIHdpdGggc3RhbmRhcmQgZGVjb3JhdG9ycydcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KCdnZXRQcm9wZXJ0eURlc2NyaXB0b3InKSkge1xuICAgICAgICBpc3N1ZVdhcm5pbmcoXG4gICAgICAgICAgJ25vLW92ZXJyaWRlLWdldC1wcm9wZXJ0eS1kZXNjcmlwdG9yJyxcbiAgICAgICAgICAnT3ZlcnJpZGluZyBSZWFjdGl2ZUVsZW1lbnQuZ2V0UHJvcGVydHlEZXNjcmlwdG9yKCkgaXMgZGVwcmVjYXRlZC4gJyArXG4gICAgICAgICAgICAnVGhlIG92ZXJyaWRlIHdpbGwgbm90IGJlIGNhbGxlZCB3aXRoIHN0YW5kYXJkIGRlY29yYXRvcnMnXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE9wdGlvbnMgdXNlZCB3aGVuIGNhbGxpbmcgYGF0dGFjaFNoYWRvd2AuIFNldCB0aGlzIHByb3BlcnR5IHRvIGN1c3RvbWl6ZVxuICAgKiB0aGUgb3B0aW9ucyBmb3IgdGhlIHNoYWRvd1Jvb3Q7IGZvciBleGFtcGxlLCB0byBjcmVhdGUgYSBjbG9zZWRcbiAgICogc2hhZG93Um9vdDogYHttb2RlOiAnY2xvc2VkJ31gLlxuICAgKlxuICAgKiBOb3RlLCB0aGVzZSBvcHRpb25zIGFyZSB1c2VkIGluIGBjcmVhdGVSZW5kZXJSb290YC4gSWYgdGhpcyBtZXRob2RcbiAgICogaXMgY3VzdG9taXplZCwgb3B0aW9ucyBzaG91bGQgYmUgcmVzcGVjdGVkIGlmIHBvc3NpYmxlLlxuICAgKiBAbm9jb2xsYXBzZVxuICAgKiBAY2F0ZWdvcnkgcmVuZGVyaW5nXG4gICAqL1xuICBzdGF0aWMgc2hhZG93Um9vdE9wdGlvbnM6IFNoYWRvd1Jvb3RJbml0ID0ge21vZGU6ICdvcGVuJ307XG5cbiAgLyoqXG4gICAqIFRha2VzIHRoZSBzdHlsZXMgdGhlIHVzZXIgc3VwcGxpZWQgdmlhIHRoZSBgc3RhdGljIHN0eWxlc2AgcHJvcGVydHkgYW5kXG4gICAqIHJldHVybnMgdGhlIGFycmF5IG9mIHN0eWxlcyB0byBhcHBseSB0byB0aGUgZWxlbWVudC5cbiAgICogT3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gaW50ZWdyYXRlIGludG8gYSBzdHlsZSBtYW5hZ2VtZW50IHN5c3RlbS5cbiAgICpcbiAgICogU3R5bGVzIGFyZSBkZWR1cGxpY2F0ZWQgcHJlc2VydmluZyB0aGUgX2xhc3RfIGluc3RhbmNlIGluIHRoZSBsaXN0LiBUaGlzXG4gICAqIGlzIGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHRvIGF2b2lkIGR1cGxpY2F0ZWQgc3R5bGVzIHRoYXQgY2FuIG9jY3VyXG4gICAqIGVzcGVjaWFsbHkgd2hlbiBjb21wb3NpbmcgdmlhIHN1YmNsYXNzaW5nLiBUaGUgbGFzdCBpdGVtIGlzIGtlcHQgdG8gdHJ5XG4gICAqIHRvIHByZXNlcnZlIHRoZSBjYXNjYWRlIG9yZGVyIHdpdGggdGhlIGFzc3VtcHRpb24gdGhhdCBpdCdzIG1vc3QgaW1wb3J0YW50XG4gICAqIHRoYXQgbGFzdCBhZGRlZCBzdHlsZXMgb3ZlcnJpZGUgcHJldmlvdXMgc3R5bGVzLlxuICAgKlxuICAgKiBAbm9jb2xsYXBzZVxuICAgKiBAY2F0ZWdvcnkgc3R5bGVzXG4gICAqL1xuICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsaXplU3R5bGVzKFxuICAgIHN0eWxlcz86IENTU1Jlc3VsdEdyb3VwXG4gICk6IEFycmF5PENTU1Jlc3VsdE9yTmF0aXZlPiB7XG4gICAgY29uc3QgZWxlbWVudFN0eWxlcyA9IFtdO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHN0eWxlcykpIHtcbiAgICAgIC8vIERlZHVwZSB0aGUgZmxhdHRlbmVkIGFycmF5IGluIHJldmVyc2Ugb3JkZXIgdG8gcHJlc2VydmUgdGhlIGxhc3QgaXRlbXMuXG4gICAgICAvLyBDYXN0aW5nIHRvIEFycmF5PHVua25vd24+IHdvcmtzIGFyb3VuZCBUUyBlcnJvciB0aGF0XG4gICAgICAvLyBhcHBlYXJzIHRvIGNvbWUgZnJvbSB0cnlpbmcgdG8gZmxhdHRlbiBhIHR5cGUgQ1NTUmVzdWx0QXJyYXkuXG4gICAgICBjb25zdCBzZXQgPSBuZXcgU2V0KChzdHlsZXMgYXMgQXJyYXk8dW5rbm93bj4pLmZsYXQoSW5maW5pdHkpLnJldmVyc2UoKSk7XG4gICAgICAvLyBUaGVuIHByZXNlcnZlIG9yaWdpbmFsIG9yZGVyIGJ5IGFkZGluZyB0aGUgc2V0IGl0ZW1zIGluIHJldmVyc2Ugb3JkZXIuXG4gICAgICBmb3IgKGNvbnN0IHMgb2Ygc2V0KSB7XG4gICAgICAgIGVsZW1lbnRTdHlsZXMudW5zaGlmdChnZXRDb21wYXRpYmxlU3R5bGUocyBhcyBDU1NSZXN1bHRPck5hdGl2ZSkpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoc3R5bGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGVsZW1lbnRTdHlsZXMucHVzaChnZXRDb21wYXRpYmxlU3R5bGUoc3R5bGVzKSk7XG4gICAgfVxuICAgIHJldHVybiBlbGVtZW50U3R5bGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIE5vZGUgb3IgU2hhZG93Um9vdCBpbnRvIHdoaWNoIGVsZW1lbnQgRE9NIHNob3VsZCBiZSByZW5kZXJlZC4gRGVmYXVsdHNcbiAgICogdG8gYW4gb3BlbiBzaGFkb3dSb290LlxuICAgKiBAY2F0ZWdvcnkgcmVuZGVyaW5nXG4gICAqL1xuICByZWFkb25seSByZW5kZXJSb290ITogSFRNTEVsZW1lbnQgfCBEb2N1bWVudEZyYWdtZW50O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eSBuYW1lIGZvciB0aGUgZ2l2ZW4gYXR0cmlidXRlIGBuYW1lYC5cbiAgICogQG5vY29sbGFwc2VcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIF9fYXR0cmlidXRlTmFtZUZvclByb3BlcnR5KFxuICAgIG5hbWU6IFByb3BlcnR5S2V5LFxuICAgIG9wdGlvbnM6IFByb3BlcnR5RGVjbGFyYXRpb25cbiAgKSB7XG4gICAgY29uc3QgYXR0cmlidXRlID0gb3B0aW9ucy5hdHRyaWJ1dGU7XG4gICAgcmV0dXJuIGF0dHJpYnV0ZSA9PT0gZmFsc2VcbiAgICAgID8gdW5kZWZpbmVkXG4gICAgICA6IHR5cGVvZiBhdHRyaWJ1dGUgPT09ICdzdHJpbmcnXG4gICAgICAgID8gYXR0cmlidXRlXG4gICAgICAgIDogdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnXG4gICAgICAgICAgPyBuYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIEluaXRpYWxpemUgdG8gYW4gdW5yZXNvbHZlZCBQcm9taXNlIHNvIHdlIGNhbiBtYWtlIHN1cmUgdGhlIGVsZW1lbnQgaGFzXG4gIC8vIGNvbm5lY3RlZCBiZWZvcmUgZmlyc3QgdXBkYXRlLlxuICBwcml2YXRlIF9fdXBkYXRlUHJvbWlzZSE6IFByb21pc2U8Ym9vbGVhbj47XG5cbiAgLyoqXG4gICAqIFRydWUgaWYgdGhlcmUgaXMgYSBwZW5kaW5nIHVwZGF0ZSBhcyBhIHJlc3VsdCBvZiBjYWxsaW5nIGByZXF1ZXN0VXBkYXRlKClgLlxuICAgKiBTaG91bGQgb25seSBiZSByZWFkLlxuICAgKiBAY2F0ZWdvcnkgdXBkYXRlc1xuICAgKi9cbiAgaXNVcGRhdGVQZW5kaW5nID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIElzIHNldCB0byBgdHJ1ZWAgYWZ0ZXIgdGhlIGZpcnN0IHVwZGF0ZS4gVGhlIGVsZW1lbnQgY29kZSBjYW5ub3QgYXNzdW1lXG4gICAqIHRoYXQgYHJlbmRlclJvb3RgIGV4aXN0cyBiZWZvcmUgdGhlIGVsZW1lbnQgYGhhc1VwZGF0ZWRgLlxuICAgKiBAY2F0ZWdvcnkgdXBkYXRlc1xuICAgKi9cbiAgaGFzVXBkYXRlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBNYXAgd2l0aCBrZXlzIGZvciBhbnkgcHJvcGVydGllcyB0aGF0IGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgbGFzdFxuICAgKiB1cGRhdGUgY3ljbGUgd2l0aCBwcmV2aW91cyB2YWx1ZXMuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgXyRjaGFuZ2VkUHJvcGVydGllcyE6IFByb3BlcnR5VmFsdWVzO1xuXG4gIC8qKlxuICAgKiBSZWNvcmRzIHByb3BlcnR5IGRlZmF1bHQgdmFsdWVzIHdoZW4gdGhlXG4gICAqIGB1c2VEZWZhdWx0YCBvcHRpb24gaXMgdXNlZC5cbiAgICovXG4gIHByaXZhdGUgX19kZWZhdWx0VmFsdWVzPzogTWFwPFByb3BlcnR5S2V5LCB1bmtub3duPjtcblxuICAvKipcbiAgICogUHJvcGVydGllcyB0aGF0IHNob3VsZCBiZSByZWZsZWN0ZWQgd2hlbiB1cGRhdGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBfX3JlZmxlY3RpbmdQcm9wZXJ0aWVzPzogU2V0PFByb3BlcnR5S2V5PjtcblxuICAvKipcbiAgICogTmFtZSBvZiBjdXJyZW50bHkgcmVmbGVjdGluZyBwcm9wZXJ0eVxuICAgKi9cbiAgcHJpdmF0ZSBfX3JlZmxlY3RpbmdQcm9wZXJ0eTogUHJvcGVydHlLZXkgfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogU2V0IG9mIGNvbnRyb2xsZXJzLlxuICAgKi9cbiAgcHJpdmF0ZSBfX2NvbnRyb2xsZXJzPzogU2V0PFJlYWN0aXZlQ29udHJvbGxlcj47XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9faW5pdGlhbGl6ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVybmFsIG9ubHkgb3ZlcnJpZGUgcG9pbnQgZm9yIGN1c3RvbWl6aW5nIHdvcmsgZG9uZSB3aGVuIGVsZW1lbnRzXG4gICAqIGFyZSBjb25zdHJ1Y3RlZC5cbiAgICovXG4gIHByaXZhdGUgX19pbml0aWFsaXplKCkge1xuICAgIHRoaXMuX191cGRhdGVQcm9taXNlID0gbmV3IFByb21pc2U8Ym9vbGVhbj4oXG4gICAgICAocmVzKSA9PiAodGhpcy5lbmFibGVVcGRhdGluZyA9IHJlcylcbiAgICApO1xuICAgIHRoaXMuXyRjaGFuZ2VkUHJvcGVydGllcyA9IG5ldyBNYXAoKTtcbiAgICAvLyBUaGlzIGVucXVldWVzIGEgbWljcm90YXNrIHRoYXQgbXVzdCBydW4gYmVmb3JlIHRoZSBmaXJzdCB1cGRhdGUsIHNvIGl0XG4gICAgLy8gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHJlcXVlc3RVcGRhdGUoKVxuICAgIHRoaXMuX19zYXZlSW5zdGFuY2VQcm9wZXJ0aWVzKCk7XG4gICAgLy8gZW5zdXJlcyBmaXJzdCB1cGRhdGUgd2lsbCBiZSBjYXVnaHQgYnkgYW4gZWFybHkgYWNjZXNzIG9mXG4gICAgLy8gYHVwZGF0ZUNvbXBsZXRlYFxuICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgpO1xuICAgICh0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBSZWFjdGl2ZUVsZW1lbnQpLl9pbml0aWFsaXplcnM/LmZvckVhY2goKGkpID0+XG4gICAgICBpKHRoaXMpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBgUmVhY3RpdmVDb250cm9sbGVyYCB0byBwYXJ0aWNpcGF0ZSBpbiB0aGUgZWxlbWVudCdzIHJlYWN0aXZlXG4gICAqIHVwZGF0ZSBjeWNsZS4gVGhlIGVsZW1lbnQgYXV0b21hdGljYWxseSBjYWxscyBpbnRvIGFueSByZWdpc3RlcmVkXG4gICAqIGNvbnRyb2xsZXJzIGR1cmluZyBpdHMgbGlmZWN5Y2xlIGNhbGxiYWNrcy5cbiAgICpcbiAgICogSWYgdGhlIGVsZW1lbnQgaXMgY29ubmVjdGVkIHdoZW4gYGFkZENvbnRyb2xsZXIoKWAgaXMgY2FsbGVkLCB0aGVcbiAgICogY29udHJvbGxlcidzIGBob3N0Q29ubmVjdGVkKClgIGNhbGxiYWNrIHdpbGwgYmUgaW1tZWRpYXRlbHkgY2FsbGVkLlxuICAgKiBAY2F0ZWdvcnkgY29udHJvbGxlcnNcbiAgICovXG4gIGFkZENvbnRyb2xsZXIoY29udHJvbGxlcjogUmVhY3RpdmVDb250cm9sbGVyKSB7XG4gICAgKHRoaXMuX19jb250cm9sbGVycyA/Pz0gbmV3IFNldCgpKS5hZGQoY29udHJvbGxlcik7XG4gICAgLy8gSWYgYSBjb250cm9sbGVyIGlzIGFkZGVkIGFmdGVyIHRoZSBlbGVtZW50IGhhcyBiZWVuIGNvbm5lY3RlZCxcbiAgICAvLyBjYWxsIGhvc3RDb25uZWN0ZWQuIE5vdGUsIHJlLXVzaW5nIGV4aXN0ZW5jZSBvZiBgcmVuZGVyUm9vdGAgaGVyZVxuICAgIC8vICh3aGljaCBpcyBzZXQgaW4gY29ubmVjdGVkQ2FsbGJhY2spIHRvIGF2b2lkIHRoZSBuZWVkIHRvIHRyYWNrIGFcbiAgICAvLyBmaXJzdCBjb25uZWN0ZWQgc3RhdGUuXG4gICAgaWYgKHRoaXMucmVuZGVyUm9vdCAhPT0gdW5kZWZpbmVkICYmIHRoaXMuaXNDb25uZWN0ZWQpIHtcbiAgICAgIGNvbnRyb2xsZXIuaG9zdENvbm5lY3RlZD8uKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBgUmVhY3RpdmVDb250cm9sbGVyYCBmcm9tIHRoZSBlbGVtZW50LlxuICAgKiBAY2F0ZWdvcnkgY29udHJvbGxlcnNcbiAgICovXG4gIHJlbW92ZUNvbnRyb2xsZXIoY29udHJvbGxlcjogUmVhY3RpdmVDb250cm9sbGVyKSB7XG4gICAgdGhpcy5fX2NvbnRyb2xsZXJzPy5kZWxldGUoY29udHJvbGxlcik7XG4gIH1cblxuICAvKipcbiAgICogRml4ZXMgYW55IHByb3BlcnRpZXMgc2V0IG9uIHRoZSBpbnN0YW5jZSBiZWZvcmUgdXBncmFkZSB0aW1lLlxuICAgKiBPdGhlcndpc2UgdGhlc2Ugd291bGQgc2hhZG93IHRoZSBhY2Nlc3NvciBhbmQgYnJlYWsgdGhlc2UgcHJvcGVydGllcy5cbiAgICogVGhlIHByb3BlcnRpZXMgYXJlIHN0b3JlZCBpbiBhIE1hcCB3aGljaCBpcyBwbGF5ZWQgYmFjayBhZnRlciB0aGVcbiAgICogY29uc3RydWN0b3IgcnVucy5cbiAgICovXG4gIHByaXZhdGUgX19zYXZlSW5zdGFuY2VQcm9wZXJ0aWVzKCkge1xuICAgIGNvbnN0IGluc3RhbmNlUHJvcGVydGllcyA9IG5ldyBNYXA8UHJvcGVydHlLZXksIHVua25vd24+KCk7XG4gICAgY29uc3QgZWxlbWVudFByb3BlcnRpZXMgPSAodGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgUmVhY3RpdmVFbGVtZW50KVxuICAgICAgLmVsZW1lbnRQcm9wZXJ0aWVzO1xuICAgIGZvciAoY29uc3QgcCBvZiBlbGVtZW50UHJvcGVydGllcy5rZXlzKCkgYXMgSXRlcmFibGVJdGVyYXRvcjxrZXlvZiB0aGlzPikge1xuICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkocCkpIHtcbiAgICAgICAgaW5zdGFuY2VQcm9wZXJ0aWVzLnNldChwLCB0aGlzW3BdKTtcbiAgICAgICAgZGVsZXRlIHRoaXNbcF07XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpbnN0YW5jZVByb3BlcnRpZXMuc2l6ZSA+IDApIHtcbiAgICAgIHRoaXMuX19pbnN0YW5jZVByb3BlcnRpZXMgPSBpbnN0YW5jZVByb3BlcnRpZXM7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG5vZGUgaW50byB3aGljaCB0aGUgZWxlbWVudCBzaG91bGQgcmVuZGVyIGFuZCBieSBkZWZhdWx0XG4gICAqIGNyZWF0ZXMgYW5kIHJldHVybnMgYW4gb3BlbiBzaGFkb3dSb290LiBJbXBsZW1lbnQgdG8gY3VzdG9taXplIHdoZXJlIHRoZVxuICAgKiBlbGVtZW50J3MgRE9NIGlzIHJlbmRlcmVkLiBGb3IgZXhhbXBsZSwgdG8gcmVuZGVyIGludG8gdGhlIGVsZW1lbnQnc1xuICAgKiBjaGlsZE5vZGVzLCByZXR1cm4gYHRoaXNgLlxuICAgKlxuICAgKiBAcmV0dXJuIFJldHVybnMgYSBub2RlIGludG8gd2hpY2ggdG8gcmVuZGVyLlxuICAgKiBAY2F0ZWdvcnkgcmVuZGVyaW5nXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlUmVuZGVyUm9vdCgpOiBIVE1MRWxlbWVudCB8IERvY3VtZW50RnJhZ21lbnQge1xuICAgIGNvbnN0IHJlbmRlclJvb3QgPVxuICAgICAgdGhpcy5zaGFkb3dSb290ID8/XG4gICAgICB0aGlzLmF0dGFjaFNoYWRvdyhcbiAgICAgICAgKHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIFJlYWN0aXZlRWxlbWVudCkuc2hhZG93Um9vdE9wdGlvbnNcbiAgICAgICk7XG4gICAgYWRvcHRTdHlsZXMoXG4gICAgICByZW5kZXJSb290LFxuICAgICAgKHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIFJlYWN0aXZlRWxlbWVudCkuZWxlbWVudFN0eWxlc1xuICAgICk7XG4gICAgcmV0dXJuIHJlbmRlclJvb3Q7XG4gIH1cblxuICAvKipcbiAgICogT24gZmlyc3QgY29ubmVjdGlvbiwgY3JlYXRlcyB0aGUgZWxlbWVudCdzIHJlbmRlclJvb3QsIHNldHMgdXBcbiAgICogZWxlbWVudCBzdHlsaW5nLCBhbmQgZW5hYmxlcyB1cGRhdGluZy5cbiAgICogQGNhdGVnb3J5IGxpZmVjeWNsZVxuICAgKi9cbiAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgLy8gQ3JlYXRlIHJlbmRlclJvb3QgYmVmb3JlIGNvbnRyb2xsZXJzIGBob3N0Q29ubmVjdGVkYFxuICAgICh0aGlzIGFzIE11dGFibGU8dHlwZW9mIHRoaXMsICdyZW5kZXJSb290Jz4pLnJlbmRlclJvb3QgPz89XG4gICAgICB0aGlzLmNyZWF0ZVJlbmRlclJvb3QoKTtcbiAgICB0aGlzLmVuYWJsZVVwZGF0aW5nKHRydWUpO1xuICAgIHRoaXMuX19jb250cm9sbGVycz8uZm9yRWFjaCgoYykgPT4gYy5ob3N0Q29ubmVjdGVkPy4oKSk7XG4gIH1cblxuICAvKipcbiAgICogTm90ZSwgdGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNvbnNpZGVyZWQgZmluYWwgYW5kIG5vdCBvdmVycmlkZGVuLiBJdCBpc1xuICAgKiBvdmVycmlkZGVuIG9uIHRoZSBlbGVtZW50IGluc3RhbmNlIHdpdGggYSBmdW5jdGlvbiB0aGF0IHRyaWdnZXJzIHRoZSBmaXJzdFxuICAgKiB1cGRhdGUuXG4gICAqIEBjYXRlZ29yeSB1cGRhdGVzXG4gICAqL1xuICBwcm90ZWN0ZWQgZW5hYmxlVXBkYXRpbmcoX3JlcXVlc3RlZFVwZGF0ZTogYm9vbGVhbikge31cblxuICAvKipcbiAgICogQWxsb3dzIGZvciBgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKWAgaW4gZXh0ZW5zaW9ucyB3aGlsZVxuICAgKiByZXNlcnZpbmcgdGhlIHBvc3NpYmlsaXR5IG9mIG1ha2luZyBub24tYnJlYWtpbmcgZmVhdHVyZSBhZGRpdGlvbnNcbiAgICogd2hlbiBkaXNjb25uZWN0aW5nIGF0IHNvbWUgcG9pbnQgaW4gdGhlIGZ1dHVyZS5cbiAgICogQGNhdGVnb3J5IGxpZmVjeWNsZVxuICAgKi9cbiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgdGhpcy5fX2NvbnRyb2xsZXJzPy5mb3JFYWNoKChjKSA9PiBjLmhvc3REaXNjb25uZWN0ZWQ/LigpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTeW5jaHJvbml6ZXMgcHJvcGVydHkgdmFsdWVzIHdoZW4gYXR0cmlidXRlcyBjaGFuZ2UuXG4gICAqXG4gICAqIFNwZWNpZmljYWxseSwgd2hlbiBhbiBhdHRyaWJ1dGUgaXMgc2V0LCB0aGUgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSBpcyBzZXQuXG4gICAqIFlvdSBzaG91bGQgcmFyZWx5IG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgY2FsbGJhY2suIElmIHRoaXMgbWV0aG9kIGlzXG4gICAqIG92ZXJyaWRkZW4sIGBzdXBlci5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgX29sZCwgdmFsdWUpYCBtdXN0IGJlXG4gICAqIGNhbGxlZC5cbiAgICpcbiAgICogU2VlIFtyZXNwb25kaW5nIHRvIGF0dHJpYnV0ZSBjaGFuZ2VzXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2ViX2NvbXBvbmVudHMvVXNpbmdfY3VzdG9tX2VsZW1lbnRzI3Jlc3BvbmRpbmdfdG9fYXR0cmlidXRlX2NoYW5nZXMpXG4gICAqIG9uIE1ETiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFja2AuXG4gICAqIEBjYXRlZ29yeSBhdHRyaWJ1dGVzXG4gICAqL1xuICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIF9vbGQ6IHN0cmluZyB8IG51bGwsXG4gICAgdmFsdWU6IHN0cmluZyB8IG51bGxcbiAgKSB7XG4gICAgdGhpcy5fJGF0dHJpYnV0ZVRvUHJvcGVydHkobmFtZSwgdmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBfX3Byb3BlcnR5VG9BdHRyaWJ1dGUobmFtZTogUHJvcGVydHlLZXksIHZhbHVlOiB1bmtub3duKSB7XG4gICAgY29uc3QgZWxlbVByb3BlcnRpZXM6IFByb3BlcnR5RGVjbGFyYXRpb25NYXAgPSAoXG4gICAgICB0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBSZWFjdGl2ZUVsZW1lbnRcbiAgICApLmVsZW1lbnRQcm9wZXJ0aWVzO1xuICAgIGNvbnN0IG9wdGlvbnMgPSBlbGVtUHJvcGVydGllcy5nZXQobmFtZSkhO1xuICAgIGNvbnN0IGF0dHIgPSAoXG4gICAgICB0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBSZWFjdGl2ZUVsZW1lbnRcbiAgICApLl9fYXR0cmlidXRlTmFtZUZvclByb3BlcnR5KG5hbWUsIG9wdGlvbnMpO1xuICAgIGlmIChhdHRyICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5yZWZsZWN0ID09PSB0cnVlKSB7XG4gICAgICBjb25zdCBjb252ZXJ0ZXIgPVxuICAgICAgICAob3B0aW9ucy5jb252ZXJ0ZXIgYXMgQ29tcGxleEF0dHJpYnV0ZUNvbnZlcnRlcik/LnRvQXR0cmlidXRlICE9PVxuICAgICAgICB1bmRlZmluZWRcbiAgICAgICAgICA/IChvcHRpb25zLmNvbnZlcnRlciBhcyBDb21wbGV4QXR0cmlidXRlQ29udmVydGVyKVxuICAgICAgICAgIDogZGVmYXVsdENvbnZlcnRlcjtcbiAgICAgIGNvbnN0IGF0dHJWYWx1ZSA9IGNvbnZlcnRlci50b0F0dHJpYnV0ZSEodmFsdWUsIG9wdGlvbnMudHlwZSk7XG4gICAgICBpZiAoXG4gICAgICAgIERFVl9NT0RFICYmXG4gICAgICAgICh0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBSZWFjdGl2ZUVsZW1lbnQpLmVuYWJsZWRXYXJuaW5ncyEuaW5jbHVkZXMoXG4gICAgICAgICAgJ21pZ3JhdGlvbidcbiAgICAgICAgKSAmJlxuICAgICAgICBhdHRyVmFsdWUgPT09IHVuZGVmaW5lZFxuICAgICAgKSB7XG4gICAgICAgIGlzc3VlV2FybmluZyhcbiAgICAgICAgICAndW5kZWZpbmVkLWF0dHJpYnV0ZS12YWx1ZScsXG4gICAgICAgICAgYFRoZSBhdHRyaWJ1dGUgdmFsdWUgZm9yIHRoZSAke25hbWUgYXMgc3RyaW5nfSBwcm9wZXJ0eSBpcyBgICtcbiAgICAgICAgICAgIGB1bmRlZmluZWQgb24gZWxlbWVudCAke3RoaXMubG9jYWxOYW1lfS4gVGhlIGF0dHJpYnV0ZSB3aWxsIGJlIGAgK1xuICAgICAgICAgICAgYHJlbW92ZWQsIGJ1dCBpbiB0aGUgcHJldmlvdXMgdmVyc2lvbiBvZiBcXGBSZWFjdGl2ZUVsZW1lbnRcXGAsIGAgK1xuICAgICAgICAgICAgYHRoZSBhdHRyaWJ1dGUgd291bGQgbm90IGhhdmUgY2hhbmdlZC5gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICAvLyBUcmFjayBpZiB0aGUgcHJvcGVydHkgaXMgYmVpbmcgcmVmbGVjdGVkIHRvIGF2b2lkXG4gICAgICAvLyBzZXR0aW5nIHRoZSBwcm9wZXJ0eSBhZ2FpbiB2aWEgYGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFja2AuIE5vdGU6XG4gICAgICAvLyAxLiB0aGlzIHRha2VzIGFkdmFudGFnZSBvZiB0aGUgZmFjdCB0aGF0IHRoZSBjYWxsYmFjayBpcyBzeW5jaHJvbm91cy5cbiAgICAgIC8vIDIuIHdpbGwgYmVoYXZlIGluY29ycmVjdGx5IGlmIG11bHRpcGxlIGF0dHJpYnV0ZXMgYXJlIGluIHRoZSByZWFjdGlvblxuICAgICAgLy8gc3RhY2sgYXQgdGltZSBvZiBjYWxsaW5nLiBIb3dldmVyLCBzaW5jZSB3ZSBwcm9jZXNzIGF0dHJpYnV0ZXNcbiAgICAgIC8vIGluIGB1cGRhdGVgIHRoaXMgc2hvdWxkIG5vdCBiZSBwb3NzaWJsZSAob3IgYW4gZXh0cmVtZSBjb3JuZXIgY2FzZVxuICAgICAgLy8gdGhhdCB3ZSdkIGxpa2UgdG8gZGlzY292ZXIpLlxuICAgICAgLy8gbWFyayBzdGF0ZSByZWZsZWN0aW5nXG4gICAgICB0aGlzLl9fcmVmbGVjdGluZ1Byb3BlcnR5ID0gbmFtZTtcbiAgICAgIGlmIChhdHRyVmFsdWUgPT0gbnVsbCkge1xuICAgICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShhdHRyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKGF0dHIsIGF0dHJWYWx1ZSBhcyBzdHJpbmcpO1xuICAgICAgfVxuICAgICAgLy8gbWFyayBzdGF0ZSBub3QgcmVmbGVjdGluZ1xuICAgICAgdGhpcy5fX3JlZmxlY3RpbmdQcm9wZXJ0eSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfJGF0dHJpYnV0ZVRvUHJvcGVydHkobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIHwgbnVsbCkge1xuICAgIGNvbnN0IGN0b3IgPSB0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBSZWFjdGl2ZUVsZW1lbnQ7XG4gICAgLy8gTm90ZSwgaGludCB0aGlzIGFzIGFuIGBBdHRyaWJ1dGVNYXBgIHNvIGNsb3N1cmUgY2xlYXJseSB1bmRlcnN0YW5kc1xuICAgIC8vIHRoZSB0eXBlOyBpdCBoYXMgaXNzdWVzIHdpdGggdHJhY2tpbmcgdHlwZXMgdGhyb3VnaCBzdGF0aWNzXG4gICAgY29uc3QgcHJvcE5hbWUgPSAoY3Rvci5fX2F0dHJpYnV0ZVRvUHJvcGVydHlNYXAgYXMgQXR0cmlidXRlTWFwKS5nZXQobmFtZSk7XG4gICAgLy8gVXNlIHRyYWNraW5nIGluZm8gdG8gYXZvaWQgcmVmbGVjdGluZyBhIHByb3BlcnR5IHZhbHVlIHRvIGFuIGF0dHJpYnV0ZVxuICAgIC8vIGlmIGl0IHdhcyBqdXN0IHNldCBiZWNhdXNlIHRoZSBhdHRyaWJ1dGUgY2hhbmdlZC5cbiAgICBpZiAocHJvcE5hbWUgIT09IHVuZGVmaW5lZCAmJiB0aGlzLl9fcmVmbGVjdGluZ1Byb3BlcnR5ICE9PSBwcm9wTmFtZSkge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IGN0b3IuZ2V0UHJvcGVydHlPcHRpb25zKHByb3BOYW1lKTtcbiAgICAgIGNvbnN0IGNvbnZlcnRlciA9XG4gICAgICAgIHR5cGVvZiBvcHRpb25zLmNvbnZlcnRlciA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgID8ge2Zyb21BdHRyaWJ1dGU6IG9wdGlvbnMuY29udmVydGVyfVxuICAgICAgICAgIDogb3B0aW9ucy5jb252ZXJ0ZXI/LmZyb21BdHRyaWJ1dGUgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBvcHRpb25zLmNvbnZlcnRlclxuICAgICAgICAgICAgOiBkZWZhdWx0Q29udmVydGVyO1xuICAgICAgLy8gbWFyayBzdGF0ZSByZWZsZWN0aW5nXG4gICAgICB0aGlzLl9fcmVmbGVjdGluZ1Byb3BlcnR5ID0gcHJvcE5hbWU7XG4gICAgICB0aGlzW3Byb3BOYW1lIGFzIGtleW9mIHRoaXNdID1cbiAgICAgICAgY29udmVydGVyLmZyb21BdHRyaWJ1dGUhKHZhbHVlLCBvcHRpb25zLnR5cGUpID8/XG4gICAgICAgIHRoaXMuX19kZWZhdWx0VmFsdWVzPy5nZXQocHJvcE5hbWUpID8/XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIChudWxsIGFzIGFueSk7XG4gICAgICAvLyBtYXJrIHN0YXRlIG5vdCByZWZsZWN0aW5nXG4gICAgICB0aGlzLl9fcmVmbGVjdGluZ1Byb3BlcnR5ID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdHMgYW4gdXBkYXRlIHdoaWNoIGlzIHByb2Nlc3NlZCBhc3luY2hyb25vdXNseS4gVGhpcyBzaG91bGQgYmUgY2FsbGVkXG4gICAqIHdoZW4gYW4gZWxlbWVudCBzaG91bGQgdXBkYXRlIGJhc2VkIG9uIHNvbWUgc3RhdGUgbm90IHRyaWdnZXJlZCBieSBzZXR0aW5nXG4gICAqIGEgcmVhY3RpdmUgcHJvcGVydHkuIEluIHRoaXMgY2FzZSwgcGFzcyBubyBhcmd1bWVudHMuIEl0IHNob3VsZCBhbHNvIGJlXG4gICAqIGNhbGxlZCB3aGVuIG1hbnVhbGx5IGltcGxlbWVudGluZyBhIHByb3BlcnR5IHNldHRlci4gSW4gdGhpcyBjYXNlLCBwYXNzIHRoZVxuICAgKiBwcm9wZXJ0eSBgbmFtZWAgYW5kIGBvbGRWYWx1ZWAgdG8gZW5zdXJlIHRoYXQgYW55IGNvbmZpZ3VyZWQgcHJvcGVydHlcbiAgICogb3B0aW9ucyBhcmUgaG9ub3JlZC5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgbmFtZSBvZiByZXF1ZXN0aW5nIHByb3BlcnR5XG4gICAqIEBwYXJhbSBvbGRWYWx1ZSBvbGQgdmFsdWUgb2YgcmVxdWVzdGluZyBwcm9wZXJ0eVxuICAgKiBAcGFyYW0gb3B0aW9ucyBwcm9wZXJ0eSBvcHRpb25zIHRvIHVzZSBpbnN0ZWFkIG9mIHRoZSBwcmV2aW91c2x5XG4gICAqICAgICBjb25maWd1cmVkIG9wdGlvbnNcbiAgICogQGNhdGVnb3J5IHVwZGF0ZXNcbiAgICovXG4gIHJlcXVlc3RVcGRhdGUoXG4gICAgbmFtZT86IFByb3BlcnR5S2V5LFxuICAgIG9sZFZhbHVlPzogdW5rbm93bixcbiAgICBvcHRpb25zPzogUHJvcGVydHlEZWNsYXJhdGlvblxuICApOiB2b2lkIHtcbiAgICAvLyBJZiB3ZSBoYXZlIGEgcHJvcGVydHkga2V5LCBwZXJmb3JtIHByb3BlcnR5IHVwZGF0ZSBzdGVwcy5cbiAgICBpZiAobmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoREVWX01PREUgJiYgKG5hbWUgYXMgdW5rbm93bikgaW5zdGFuY2VvZiBFdmVudCkge1xuICAgICAgICBpc3N1ZVdhcm5pbmcoXG4gICAgICAgICAgYGAsXG4gICAgICAgICAgYFRoZSByZXF1ZXN0VXBkYXRlKCkgbWV0aG9kIHdhcyBjYWxsZWQgd2l0aCBhbiBFdmVudCBhcyB0aGUgcHJvcGVydHkgbmFtZS4gVGhpcyBpcyBwcm9iYWJseSBhIG1pc3Rha2UgY2F1c2VkIGJ5IGJpbmRpbmcgdGhpcy5yZXF1ZXN0VXBkYXRlIGFzIGFuIGV2ZW50IGxpc3RlbmVyLiBJbnN0ZWFkIGJpbmQgYSBmdW5jdGlvbiB0aGF0IHdpbGwgY2FsbCBpdCB3aXRoIG5vIGFyZ3VtZW50czogKCkgPT4gdGhpcy5yZXF1ZXN0VXBkYXRlKClgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBjdG9yID0gdGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgUmVhY3RpdmVFbGVtZW50O1xuICAgICAgY29uc3QgbmV3VmFsdWUgPSB0aGlzW25hbWUgYXMga2V5b2YgdGhpc107XG4gICAgICBvcHRpb25zID8/PSBjdG9yLmdldFByb3BlcnR5T3B0aW9ucyhuYW1lKTtcbiAgICAgIGNvbnN0IGNoYW5nZWQgPVxuICAgICAgICAob3B0aW9ucy5oYXNDaGFuZ2VkID8/IG5vdEVxdWFsKShuZXdWYWx1ZSwgb2xkVmFsdWUpIHx8XG4gICAgICAgIC8vIFdoZW4gdGhlcmUgaXMgbm8gY2hhbmdlLCBjaGVjayBhIGNvcm5lciBjYXNlIHRoYXQgY2FuIG9jY3VyIHdoZW5cbiAgICAgICAgLy8gMS4gdGhlcmUncyBhIGluaXRpYWwgdmFsdWUgd2hpY2ggd2FzIG5vdCByZWZsZWN0ZWRcbiAgICAgICAgLy8gMi4gdGhlIHByb3BlcnR5IGlzIHN1YnNlcXVlbnRseSBzZXQgdG8gdGhpcyB2YWx1ZS5cbiAgICAgICAgLy8gRm9yIGV4YW1wbGUsIGBwcm9wOiB7dXNlRGVmYXVsdDogdHJ1ZSwgcmVmbGVjdDogdHJ1ZX1gXG4gICAgICAgIC8vIGFuZCBlbC5wcm9wID0gJ2ZvbycuIFRoaXMgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSBjaGFuZ2UgaWYgdGhlXG4gICAgICAgIC8vIGF0dHJpYnV0ZSBpcyBub3Qgc2V0IGJlY2F1c2Ugd2Ugd2lsbCBub3cgcmVmbGVjdCB0aGUgcHJvcGVydHkgdG8gdGhlIGF0dHJpYnV0ZS5cbiAgICAgICAgKG9wdGlvbnMudXNlRGVmYXVsdCAmJlxuICAgICAgICAgIG9wdGlvbnMucmVmbGVjdCAmJlxuICAgICAgICAgIG5ld1ZhbHVlID09PSB0aGlzLl9fZGVmYXVsdFZhbHVlcz8uZ2V0KG5hbWUpICYmXG4gICAgICAgICAgIXRoaXMuaGFzQXR0cmlidXRlKGN0b3IuX19hdHRyaWJ1dGVOYW1lRm9yUHJvcGVydHkobmFtZSwgb3B0aW9ucykhKSk7XG4gICAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgICB0aGlzLl8kY2hhbmdlUHJvcGVydHkobmFtZSwgb2xkVmFsdWUsIG9wdGlvbnMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQWJvcnQgdGhlIHJlcXVlc3QgaWYgdGhlIHByb3BlcnR5IHNob3VsZCBub3QgYmUgY29uc2lkZXJlZCBjaGFuZ2VkLlxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLmlzVXBkYXRlUGVuZGluZyA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuX191cGRhdGVQcm9taXNlID0gdGhpcy5fX2VucXVldWVVcGRhdGUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBfJGNoYW5nZVByb3BlcnR5KFxuICAgIG5hbWU6IFByb3BlcnR5S2V5LFxuICAgIG9sZFZhbHVlOiB1bmtub3duLFxuICAgIHt1c2VEZWZhdWx0LCByZWZsZWN0LCB3cmFwcGVkfTogUHJvcGVydHlEZWNsYXJhdGlvbixcbiAgICBpbml0aWFsaXplVmFsdWU/OiB1bmtub3duXG4gICkge1xuICAgIC8vIFJlY29yZCBkZWZhdWx0IHZhbHVlIHdoZW4gdXNlRGVmYXVsdCBpcyB1c2VkLiBUaGlzIGFsbG93cyB1cyB0b1xuICAgIC8vIHJlc3RvcmUgdGhpcyB2YWx1ZSB3aGVuIHRoZSBhdHRyaWJ1dGUgaXMgcmVtb3ZlZC5cbiAgICBpZiAodXNlRGVmYXVsdCAmJiAhKHRoaXMuX19kZWZhdWx0VmFsdWVzID8/PSBuZXcgTWFwKCkpLmhhcyhuYW1lKSkge1xuICAgICAgdGhpcy5fX2RlZmF1bHRWYWx1ZXMuc2V0KFxuICAgICAgICBuYW1lLFxuICAgICAgICBpbml0aWFsaXplVmFsdWUgPz8gb2xkVmFsdWUgPz8gdGhpc1tuYW1lIGFzIGtleW9mIHRoaXNdXG4gICAgICApO1xuICAgICAgLy8gaWYgdGhpcyBpcyBub3Qgd3JhcHBpbmcgYW4gYWNjZXNzb3IsIGl0IG11c3QgYmUgYW4gaW5pdGlhbCBzZXR0aW5nXG4gICAgICAvLyBhbmQgaW4gdGhpcyBjYXNlIHdlIGRvIG5vdCB3YW50IHRvIHJlY29yZCB0aGUgY2hhbmdlIG9yIHJlZmxlY3QuXG4gICAgICBpZiAod3JhcHBlZCAhPT0gdHJ1ZSB8fCBpbml0aWFsaXplVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFRPRE8gKGp1c3RpbmZhZ25hbmkpOiBDcmVhdGUgYSBiZW5jaG1hcmsgb2YgTWFwLmhhcygpICsgTWFwLnNldChcbiAgICAvLyB2cyBqdXN0IE1hcC5zZXQoKVxuICAgIGlmICghdGhpcy5fJGNoYW5nZWRQcm9wZXJ0aWVzLmhhcyhuYW1lKSkge1xuICAgICAgLy8gT24gdGhlIGluaXRpYWwgY2hhbmdlLCB0aGUgb2xkIHZhbHVlIHNob3VsZCBiZSBgdW5kZWZpbmVkYCwgZXhjZXB0XG4gICAgICAvLyB3aXRoIGB1c2VEZWZhdWx0YFxuICAgICAgaWYgKCF0aGlzLmhhc1VwZGF0ZWQgJiYgIXVzZURlZmF1bHQpIHtcbiAgICAgICAgb2xkVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICB0aGlzLl8kY2hhbmdlZFByb3BlcnRpZXMuc2V0KG5hbWUsIG9sZFZhbHVlKTtcbiAgICB9XG4gICAgLy8gQWRkIHRvIHJlZmxlY3RpbmcgcHJvcGVydGllcyBzZXQuXG4gICAgLy8gTm90ZSwgaXQncyBpbXBvcnRhbnQgdGhhdCBldmVyeSBjaGFuZ2UgaGFzIGEgY2hhbmNlIHRvIGFkZCB0aGVcbiAgICAvLyBwcm9wZXJ0eSB0byBgX19yZWZsZWN0aW5nUHJvcGVydGllc2AuIFRoaXMgZW5zdXJlcyBzZXR0aW5nXG4gICAgLy8gYXR0cmlidXRlICsgcHJvcGVydHkgcmVmbGVjdHMgY29ycmVjdGx5LlxuICAgIGlmIChyZWZsZWN0ID09PSB0cnVlICYmIHRoaXMuX19yZWZsZWN0aW5nUHJvcGVydHkgIT09IG5hbWUpIHtcbiAgICAgICh0aGlzLl9fcmVmbGVjdGluZ1Byb3BlcnRpZXMgPz89IG5ldyBTZXQ8UHJvcGVydHlLZXk+KCkpLmFkZChuYW1lKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB1cCB0aGUgZWxlbWVudCB0byBhc3luY2hyb25vdXNseSB1cGRhdGUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9fZW5xdWV1ZVVwZGF0ZSgpIHtcbiAgICB0aGlzLmlzVXBkYXRlUGVuZGluZyA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEVuc3VyZSBhbnkgcHJldmlvdXMgdXBkYXRlIGhhcyByZXNvbHZlZCBiZWZvcmUgdXBkYXRpbmcuXG4gICAgICAvLyBUaGlzIGBhd2FpdGAgYWxzbyBlbnN1cmVzIHRoYXQgcHJvcGVydHkgY2hhbmdlcyBhcmUgYmF0Y2hlZC5cbiAgICAgIGF3YWl0IHRoaXMuX191cGRhdGVQcm9taXNlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIFJlZmlyZSBhbnkgcHJldmlvdXMgZXJyb3JzIGFzeW5jIHNvIHRoZXkgZG8gbm90IGRpc3J1cHQgdGhlIHVwZGF0ZVxuICAgICAgLy8gY3ljbGUuIEVycm9ycyBhcmUgcmVmaXJlZCBzbyBkZXZlbG9wZXJzIGhhdmUgYSBjaGFuY2UgdG8gb2JzZXJ2ZVxuICAgICAgLy8gdGhlbSwgYW5kIHRoaXMgY2FuIGJlIGRvbmUgYnkgaW1wbGVtZW50aW5nXG4gICAgICAvLyBgd2luZG93Lm9udW5oYW5kbGVkcmVqZWN0aW9uYC5cbiAgICAgIFByb21pc2UucmVqZWN0KGUpO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnNjaGVkdWxlVXBkYXRlKCk7XG4gICAgLy8gSWYgYHNjaGVkdWxlVXBkYXRlYCByZXR1cm5zIGEgUHJvbWlzZSwgd2UgYXdhaXQgaXQuIFRoaXMgaXMgZG9uZSB0b1xuICAgIC8vIGVuYWJsZSBjb29yZGluYXRpbmcgdXBkYXRlcyB3aXRoIGEgc2NoZWR1bGVyLiBOb3RlLCB0aGUgcmVzdWx0IGlzXG4gICAgLy8gY2hlY2tlZCB0byBhdm9pZCBkZWxheWluZyBhbiBhZGRpdGlvbmFsIG1pY3JvdGFzayB1bmxlc3Mgd2UgbmVlZCB0by5cbiAgICBpZiAocmVzdWx0ICE9IG51bGwpIHtcbiAgICAgIGF3YWl0IHJlc3VsdDtcbiAgICB9XG4gICAgcmV0dXJuICF0aGlzLmlzVXBkYXRlUGVuZGluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBTY2hlZHVsZXMgYW4gZWxlbWVudCB1cGRhdGUuIFlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gY2hhbmdlIHRoZVxuICAgKiB0aW1pbmcgb2YgdXBkYXRlcyBieSByZXR1cm5pbmcgYSBQcm9taXNlLiBUaGUgdXBkYXRlIHdpbGwgYXdhaXQgdGhlXG4gICAqIHJldHVybmVkIFByb21pc2UsIGFuZCB5b3Ugc2hvdWxkIHJlc29sdmUgdGhlIFByb21pc2UgdG8gYWxsb3cgdGhlIHVwZGF0ZVxuICAgKiB0byBwcm9jZWVkLiBJZiB0aGlzIG1ldGhvZCBpcyBvdmVycmlkZGVuLCBgc3VwZXIuc2NoZWR1bGVVcGRhdGUoKWBcbiAgICogbXVzdCBiZSBjYWxsZWQuXG4gICAqXG4gICAqIEZvciBpbnN0YW5jZSwgdG8gc2NoZWR1bGUgdXBkYXRlcyB0byBvY2N1ciBqdXN0IGJlZm9yZSB0aGUgbmV4dCBmcmFtZTpcbiAgICpcbiAgICogYGBgdHNcbiAgICogb3ZlcnJpZGUgcHJvdGVjdGVkIGFzeW5jIHNjaGVkdWxlVXBkYXRlKCk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgKiAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gcmVzb2x2ZSgpKSk7XG4gICAqICAgc3VwZXIuc2NoZWR1bGVVcGRhdGUoKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICogQGNhdGVnb3J5IHVwZGF0ZXNcbiAgICovXG4gIHByb3RlY3RlZCBzY2hlZHVsZVVwZGF0ZSgpOiB2b2lkIHwgUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5wZXJmb3JtVXBkYXRlKCk7XG4gICAgaWYgKFxuICAgICAgREVWX01PREUgJiZcbiAgICAgICh0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBSZWFjdGl2ZUVsZW1lbnQpLmVuYWJsZWRXYXJuaW5ncyEuaW5jbHVkZXMoXG4gICAgICAgICdhc3luYy1wZXJmb3JtLXVwZGF0ZSdcbiAgICAgICkgJiZcbiAgICAgIHR5cGVvZiAocmVzdWx0IGFzIHVua25vd24gYXMgUHJvbWlzZTx1bmtub3duPiB8IHVuZGVmaW5lZCk/LnRoZW4gPT09XG4gICAgICAgICdmdW5jdGlvbidcbiAgICApIHtcbiAgICAgIGlzc3VlV2FybmluZyhcbiAgICAgICAgJ2FzeW5jLXBlcmZvcm0tdXBkYXRlJyxcbiAgICAgICAgYEVsZW1lbnQgJHt0aGlzLmxvY2FsTmFtZX0gcmV0dXJuZWQgYSBQcm9taXNlIGZyb20gcGVyZm9ybVVwZGF0ZSgpLiBgICtcbiAgICAgICAgICBgVGhpcyBiZWhhdmlvciBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgYCArXG4gICAgICAgICAgYHZlcnNpb24gb2YgUmVhY3RpdmVFbGVtZW50LmBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybXMgYW4gZWxlbWVudCB1cGRhdGUuIE5vdGUsIGlmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZHVyaW5nIHRoZVxuICAgKiB1cGRhdGUsIGBmaXJzdFVwZGF0ZWRgIGFuZCBgdXBkYXRlZGAgd2lsbCBub3QgYmUgY2FsbGVkLlxuICAgKlxuICAgKiBDYWxsIGBwZXJmb3JtVXBkYXRlKClgIHRvIGltbWVkaWF0ZWx5IHByb2Nlc3MgYSBwZW5kaW5nIHVwZGF0ZS4gVGhpcyBzaG91bGRcbiAgICogZ2VuZXJhbGx5IG5vdCBiZSBuZWVkZWQsIGJ1dCBpdCBjYW4gYmUgZG9uZSBpbiByYXJlIGNhc2VzIHdoZW4geW91IG5lZWQgdG9cbiAgICogdXBkYXRlIHN5bmNocm9ub3VzbHkuXG4gICAqXG4gICAqIEBjYXRlZ29yeSB1cGRhdGVzXG4gICAqL1xuICBwcm90ZWN0ZWQgcGVyZm9ybVVwZGF0ZSgpOiB2b2lkIHtcbiAgICAvLyBBYm9ydCBhbnkgdXBkYXRlIGlmIG9uZSBpcyBub3QgcGVuZGluZyB3aGVuIHRoaXMgaXMgY2FsbGVkLlxuICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBpZiBgcGVyZm9ybVVwZGF0ZWAgaXMgY2FsbGVkIGVhcmx5IHRvIFwiZmx1c2hcIlxuICAgIC8vIHRoZSB1cGRhdGUuXG4gICAgaWYgKCF0aGlzLmlzVXBkYXRlUGVuZGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkZWJ1Z0xvZ0V2ZW50Py4oe2tpbmQ6ICd1cGRhdGUnfSk7XG4gICAgaWYgKCF0aGlzLmhhc1VwZGF0ZWQpIHtcbiAgICAgIC8vIENyZWF0ZSByZW5kZXJSb290IGJlZm9yZSBmaXJzdCB1cGRhdGUuIFRoaXMgb2NjdXJzIGluIGBjb25uZWN0ZWRDYWxsYmFja2BcbiAgICAgIC8vIGJ1dCBpcyBkb25lIGhlcmUgdG8gc3VwcG9ydCBvdXQgb2YgdHJlZSBjYWxscyB0byBgZW5hYmxlVXBkYXRpbmdgL2BwZXJmb3JtVXBkYXRlYC5cbiAgICAgICh0aGlzIGFzIE11dGFibGU8dHlwZW9mIHRoaXMsICdyZW5kZXJSb290Jz4pLnJlbmRlclJvb3QgPz89XG4gICAgICAgIHRoaXMuY3JlYXRlUmVuZGVyUm9vdCgpO1xuICAgICAgaWYgKERFVl9NT0RFKSB7XG4gICAgICAgIC8vIFByb2R1Y2Ugd2FybmluZyBpZiBhbnkgcmVhY3RpdmUgcHJvcGVydGllcyBvbiB0aGUgcHJvdG90eXBlIGFyZVxuICAgICAgICAvLyBzaGFkb3dlZCBieSBjbGFzcyBmaWVsZHMuIEluc3RhbmNlIGZpZWxkcyBzZXQgYmVmb3JlIHVwZ3JhZGUgYXJlXG4gICAgICAgIC8vIGRlbGV0ZWQgYnkgdGhpcyBwb2ludCwgc28gYW55IG93biBwcm9wZXJ0eSBpcyBjYXVzZWQgYnkgY2xhc3MgZmllbGRcbiAgICAgICAgLy8gaW5pdGlhbGl6YXRpb24gaW4gdGhlIGNvbnN0cnVjdG9yLlxuICAgICAgICBjb25zdCBjdG9yID0gdGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgUmVhY3RpdmVFbGVtZW50O1xuICAgICAgICBjb25zdCBzaGFkb3dlZFByb3BlcnRpZXMgPSBbLi4uY3Rvci5lbGVtZW50UHJvcGVydGllcy5rZXlzKCldLmZpbHRlcihcbiAgICAgICAgICAocCkgPT4gdGhpcy5oYXNPd25Qcm9wZXJ0eShwKSAmJiBwIGluIGdldFByb3RvdHlwZU9mKHRoaXMpXG4gICAgICAgICk7XG4gICAgICAgIGlmIChzaGFkb3dlZFByb3BlcnRpZXMubGVuZ3RoKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBvbiBlbGVtZW50ICR7dGhpcy5sb2NhbE5hbWV9IHdpbGwgbm90IGAgK1xuICAgICAgICAgICAgICBgdHJpZ2dlciB1cGRhdGVzIGFzIGV4cGVjdGVkIGJlY2F1c2UgdGhleSBhcmUgc2V0IHVzaW5nIGNsYXNzIGAgK1xuICAgICAgICAgICAgICBgZmllbGRzOiAke3NoYWRvd2VkUHJvcGVydGllcy5qb2luKCcsICcpfS4gYCArXG4gICAgICAgICAgICAgIGBOYXRpdmUgY2xhc3MgZmllbGRzIGFuZCBzb21lIGNvbXBpbGVkIG91dHB1dCB3aWxsIG92ZXJ3cml0ZSBgICtcbiAgICAgICAgICAgICAgYGFjY2Vzc29ycyB1c2VkIGZvciBkZXRlY3RpbmcgY2hhbmdlcy4gU2VlIGAgK1xuICAgICAgICAgICAgICBgaHR0cHM6Ly9saXQuZGV2L21zZy9jbGFzcy1maWVsZC1zaGFkb3dpbmcgYCArXG4gICAgICAgICAgICAgIGBmb3IgbW9yZSBpbmZvcm1hdGlvbi5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gTWl4aW4gaW5zdGFuY2UgcHJvcGVydGllcyBvbmNlLCBpZiB0aGV5IGV4aXN0LlxuICAgICAgaWYgKHRoaXMuX19pbnN0YW5jZVByb3BlcnRpZXMpIHtcbiAgICAgICAgLy8gVE9ETyAoanVzdGluZmFnbmFuaSk6IHNob3VsZCB3ZSB1c2UgdGhlIHN0b3JlZCB2YWx1ZT8gQ291bGQgYSBuZXcgdmFsdWVcbiAgICAgICAgLy8gaGF2ZSBiZWVuIHNldCBzaW5jZSB3ZSBzdG9yZWQgdGhlIG93biBwcm9wZXJ0eSB2YWx1ZT9cbiAgICAgICAgZm9yIChjb25zdCBbcCwgdmFsdWVdIG9mIHRoaXMuX19pbnN0YW5jZVByb3BlcnRpZXMpIHtcbiAgICAgICAgICB0aGlzW3AgYXMga2V5b2YgdGhpc10gPSB2YWx1ZSBhcyB0aGlzW2tleW9mIHRoaXNdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX19pbnN0YW5jZVByb3BlcnRpZXMgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICAvLyBUcmlnZ2VyIGluaXRpYWwgdmFsdWUgcmVmbGVjdGlvbiBhbmQgcG9wdWxhdGUgdGhlIGluaXRpYWxcbiAgICAgIC8vIGBjaGFuZ2VkUHJvcGVydGllc2AgbWFwLCBidXQgb25seSBmb3IgdGhlIGNhc2Ugb2YgcHJvcGVydGllcyBjcmVhdGVkXG4gICAgICAvLyB2aWEgYGNyZWF0ZVByb3BlcnR5YCBvbiBhY2Nlc3NvcnMsIHdoaWNoIHdpbGwgbm90IGhhdmUgYWxyZWFkeVxuICAgICAgLy8gcG9wdWxhdGVkIHRoZSBgY2hhbmdlZFByb3BlcnRpZXNgIG1hcCBzaW5jZSB0aGV5IGFyZSBub3Qgc2V0LlxuICAgICAgLy8gV2UgY2FuJ3Qga25vdyBpZiB0aGVzZSBhY2Nlc3NvcnMgaGFkIGluaXRpYWxpemVycywgc28gd2UganVzdCBzZXRcbiAgICAgIC8vIHRoZW0gYW55d2F5IC0gYSBkaWZmZXJlbmNlIGZyb20gZXhwZXJpbWVudGFsIGRlY29yYXRvcnMgb24gZmllbGRzIGFuZFxuICAgICAgLy8gc3RhbmRhcmQgZGVjb3JhdG9ycyBvbiBhdXRvLWFjY2Vzc29ycy5cbiAgICAgIC8vIEZvciBjb250ZXh0IHNlZTpcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9saXQvbGl0L3B1bGwvNDE4MyNpc3N1ZWNvbW1lbnQtMTcxMTk1OTYzNVxuICAgICAgY29uc3QgZWxlbWVudFByb3BlcnRpZXMgPSAodGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgUmVhY3RpdmVFbGVtZW50KVxuICAgICAgICAuZWxlbWVudFByb3BlcnRpZXM7XG4gICAgICBpZiAoZWxlbWVudFByb3BlcnRpZXMuc2l6ZSA+IDApIHtcbiAgICAgICAgZm9yIChjb25zdCBbcCwgb3B0aW9uc10gb2YgZWxlbWVudFByb3BlcnRpZXMpIHtcbiAgICAgICAgICBjb25zdCB7d3JhcHBlZH0gPSBvcHRpb25zO1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpc1twIGFzIGtleW9mIHRoaXNdO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHdyYXBwZWQgPT09IHRydWUgJiZcbiAgICAgICAgICAgICF0aGlzLl8kY2hhbmdlZFByb3BlcnRpZXMuaGFzKHApICYmXG4gICAgICAgICAgICB2YWx1ZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLl8kY2hhbmdlUHJvcGVydHkocCwgdW5kZWZpbmVkLCBvcHRpb25zLCB2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGxldCBzaG91bGRVcGRhdGUgPSBmYWxzZTtcbiAgICBjb25zdCBjaGFuZ2VkUHJvcGVydGllcyA9IHRoaXMuXyRjaGFuZ2VkUHJvcGVydGllcztcbiAgICB0cnkge1xuICAgICAgc2hvdWxkVXBkYXRlID0gdGhpcy5zaG91bGRVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXMpO1xuICAgICAgaWYgKHNob3VsZFVwZGF0ZSkge1xuICAgICAgICB0aGlzLndpbGxVcGRhdGUoY2hhbmdlZFByb3BlcnRpZXMpO1xuICAgICAgICB0aGlzLl9fY29udHJvbGxlcnM/LmZvckVhY2goKGMpID0+IGMuaG9zdFVwZGF0ZT8uKCkpO1xuICAgICAgICB0aGlzLnVwZGF0ZShjaGFuZ2VkUHJvcGVydGllcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9fbWFya1VwZGF0ZWQoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBQcmV2ZW50IGBmaXJzdFVwZGF0ZWRgIGFuZCBgdXBkYXRlZGAgZnJvbSBydW5uaW5nIHdoZW4gdGhlcmUncyBhblxuICAgICAgLy8gdXBkYXRlIGV4Y2VwdGlvbi5cbiAgICAgIHNob3VsZFVwZGF0ZSA9IGZhbHNlO1xuICAgICAgLy8gRW5zdXJlIGVsZW1lbnQgY2FuIGFjY2VwdCBhZGRpdGlvbmFsIHVwZGF0ZXMgYWZ0ZXIgYW4gZXhjZXB0aW9uLlxuICAgICAgdGhpcy5fX21hcmtVcGRhdGVkKCk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICAvLyBUaGUgdXBkYXRlIGlzIG5vIGxvbmdlciBjb25zaWRlcmVkIHBlbmRpbmcgYW5kIGZ1cnRoZXIgdXBkYXRlcyBhcmUgbm93IGFsbG93ZWQuXG4gICAgaWYgKHNob3VsZFVwZGF0ZSkge1xuICAgICAgdGhpcy5fJGRpZFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEludm9rZWQgYmVmb3JlIGB1cGRhdGUoKWAgdG8gY29tcHV0ZSB2YWx1ZXMgbmVlZGVkIGR1cmluZyB0aGUgdXBkYXRlLlxuICAgKlxuICAgKiBJbXBsZW1lbnQgYHdpbGxVcGRhdGVgIHRvIGNvbXB1dGUgcHJvcGVydHkgdmFsdWVzIHRoYXQgZGVwZW5kIG9uIG90aGVyXG4gICAqIHByb3BlcnRpZXMgYW5kIGFyZSB1c2VkIGluIHRoZSByZXN0IG9mIHRoZSB1cGRhdGUgcHJvY2Vzcy5cbiAgICpcbiAgICogYGBgdHNcbiAgICogd2lsbFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllcykge1xuICAgKiAgIC8vIG9ubHkgbmVlZCB0byBjaGVjayBjaGFuZ2VkIHByb3BlcnRpZXMgZm9yIGFuIGV4cGVuc2l2ZSBjb21wdXRhdGlvbi5cbiAgICogICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdmaXJzdE5hbWUnKSB8fCBjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ2xhc3ROYW1lJykpIHtcbiAgICogICAgIHRoaXMuc2hhID0gY29tcHV0ZVNIQShgJHt0aGlzLmZpcnN0TmFtZX0gJHt0aGlzLmxhc3ROYW1lfWApO1xuICAgKiAgIH1cbiAgICogfVxuICAgKlxuICAgKiByZW5kZXIoKSB7XG4gICAqICAgcmV0dXJuIGh0bWxgU0hBOiAke3RoaXMuc2hhfWA7XG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIEBjYXRlZ29yeSB1cGRhdGVzXG4gICAqL1xuICBwcm90ZWN0ZWQgd2lsbFVwZGF0ZShfY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzKTogdm9pZCB7fVxuXG4gIC8vIE5vdGUsIHRoaXMgaXMgYW4gb3ZlcnJpZGUgcG9pbnQgZm9yIHBvbHlmaWxsLXN1cHBvcnQuXG4gIC8vIEBpbnRlcm5hbFxuICBfJGRpZFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXMpIHtcbiAgICB0aGlzLl9fY29udHJvbGxlcnM/LmZvckVhY2goKGMpID0+IGMuaG9zdFVwZGF0ZWQ/LigpKTtcbiAgICBpZiAoIXRoaXMuaGFzVXBkYXRlZCkge1xuICAgICAgdGhpcy5oYXNVcGRhdGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKTtcbiAgICBpZiAoXG4gICAgICBERVZfTU9ERSAmJlxuICAgICAgdGhpcy5pc1VwZGF0ZVBlbmRpbmcgJiZcbiAgICAgICh0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBSZWFjdGl2ZUVsZW1lbnQpLmVuYWJsZWRXYXJuaW5ncyEuaW5jbHVkZXMoXG4gICAgICAgICdjaGFuZ2UtaW4tdXBkYXRlJ1xuICAgICAgKVxuICAgICkge1xuICAgICAgaXNzdWVXYXJuaW5nKFxuICAgICAgICAnY2hhbmdlLWluLXVwZGF0ZScsXG4gICAgICAgIGBFbGVtZW50ICR7dGhpcy5sb2NhbE5hbWV9IHNjaGVkdWxlZCBhbiB1cGRhdGUgYCArXG4gICAgICAgICAgYChnZW5lcmFsbHkgYmVjYXVzZSBhIHByb3BlcnR5IHdhcyBzZXQpIGAgK1xuICAgICAgICAgIGBhZnRlciBhbiB1cGRhdGUgY29tcGxldGVkLCBjYXVzaW5nIGEgbmV3IHVwZGF0ZSB0byBiZSBzY2hlZHVsZWQuIGAgK1xuICAgICAgICAgIGBUaGlzIGlzIGluZWZmaWNpZW50IGFuZCBzaG91bGQgYmUgYXZvaWRlZCB1bmxlc3MgdGhlIG5leHQgdXBkYXRlIGAgK1xuICAgICAgICAgIGBjYW4gb25seSBiZSBzY2hlZHVsZWQgYXMgYSBzaWRlIGVmZmVjdCBvZiB0aGUgcHJldmlvdXMgdXBkYXRlLmBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfX21hcmtVcGRhdGVkKCkge1xuICAgIHRoaXMuXyRjaGFuZ2VkUHJvcGVydGllcyA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLmlzVXBkYXRlUGVuZGluZyA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZWxlbWVudCBoYXMgY29tcGxldGVkIHVwZGF0aW5nLlxuICAgKiBUaGUgUHJvbWlzZSB2YWx1ZSBpcyBhIGJvb2xlYW4gdGhhdCBpcyBgdHJ1ZWAgaWYgdGhlIGVsZW1lbnQgY29tcGxldGVkIHRoZVxuICAgKiB1cGRhdGUgd2l0aG91dCB0cmlnZ2VyaW5nIGFub3RoZXIgdXBkYXRlLiBUaGUgUHJvbWlzZSByZXN1bHQgaXMgYGZhbHNlYCBpZlxuICAgKiBhIHByb3BlcnR5IHdhcyBzZXQgaW5zaWRlIGB1cGRhdGVkKClgLiBJZiB0aGUgUHJvbWlzZSBpcyByZWplY3RlZCwgYW5cbiAgICogZXhjZXB0aW9uIHdhcyB0aHJvd24gZHVyaW5nIHRoZSB1cGRhdGUuXG4gICAqXG4gICAqIFRvIGF3YWl0IGFkZGl0aW9uYWwgYXN5bmNocm9ub3VzIHdvcmssIG92ZXJyaWRlIHRoZSBgZ2V0VXBkYXRlQ29tcGxldGVgXG4gICAqIG1ldGhvZC4gRm9yIGV4YW1wbGUsIGl0IGlzIHNvbWV0aW1lcyB1c2VmdWwgdG8gYXdhaXQgYSByZW5kZXJlZCBlbGVtZW50XG4gICAqIGJlZm9yZSBmdWxmaWxsaW5nIHRoaXMgUHJvbWlzZS4gVG8gZG8gdGhpcywgZmlyc3QgYXdhaXRcbiAgICogYHN1cGVyLmdldFVwZGF0ZUNvbXBsZXRlKClgLCB0aGVuIGFueSBzdWJzZXF1ZW50IHN0YXRlLlxuICAgKlxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSBvZiBhIGJvb2xlYW4gdGhhdCByZXNvbHZlcyB0byB0cnVlIGlmIHRoZSB1cGRhdGUgY29tcGxldGVkXG4gICAqICAgICB3aXRob3V0IHRyaWdnZXJpbmcgYW5vdGhlciB1cGRhdGUuXG4gICAqIEBjYXRlZ29yeSB1cGRhdGVzXG4gICAqL1xuICBnZXQgdXBkYXRlQ29tcGxldGUoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VXBkYXRlQ29tcGxldGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBwb2ludCBmb3IgdGhlIGB1cGRhdGVDb21wbGV0ZWAgcHJvbWlzZS5cbiAgICpcbiAgICogSXQgaXMgbm90IHNhZmUgdG8gb3ZlcnJpZGUgdGhlIGB1cGRhdGVDb21wbGV0ZWAgZ2V0dGVyIGRpcmVjdGx5IGR1ZSB0byBhXG4gICAqIGxpbWl0YXRpb24gaW4gVHlwZVNjcmlwdCB3aGljaCBtZWFucyBpdCBpcyBub3QgcG9zc2libGUgdG8gY2FsbCBhXG4gICAqIHN1cGVyY2xhc3MgZ2V0dGVyIChlLmcuIGBzdXBlci51cGRhdGVDb21wbGV0ZS50aGVuKC4uLilgKSB3aGVuIHRoZSB0YXJnZXRcbiAgICogbGFuZ3VhZ2UgaXMgRVM1IChodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzMzOCkuXG4gICAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBvdmVycmlkZGVuIGluc3RlYWQuIEZvciBleGFtcGxlOlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiBjbGFzcyBNeUVsZW1lbnQgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgICogICBvdmVycmlkZSBhc3luYyBnZXRVcGRhdGVDb21wbGV0ZSgpIHtcbiAgICogICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN1cGVyLmdldFVwZGF0ZUNvbXBsZXRlKCk7XG4gICAqICAgICBhd2FpdCB0aGlzLl9teUNoaWxkLnVwZGF0ZUNvbXBsZXRlO1xuICAgKiAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICogICB9XG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIG9mIGEgYm9vbGVhbiB0aGF0IHJlc29sdmVzIHRvIHRydWUgaWYgdGhlIHVwZGF0ZSBjb21wbGV0ZWRcbiAgICogICAgIHdpdGhvdXQgdHJpZ2dlcmluZyBhbm90aGVyIHVwZGF0ZS5cbiAgICogQGNhdGVnb3J5IHVwZGF0ZXNcbiAgICovXG4gIHByb3RlY3RlZCBnZXRVcGRhdGVDb21wbGV0ZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5fX3VwZGF0ZVByb21pc2U7XG4gIH1cblxuICAvKipcbiAgICogQ29udHJvbHMgd2hldGhlciBvciBub3QgYHVwZGF0ZSgpYCBzaG91bGQgYmUgY2FsbGVkIHdoZW4gdGhlIGVsZW1lbnQgcmVxdWVzdHNcbiAgICogYW4gdXBkYXRlLiBCeSBkZWZhdWx0LCB0aGlzIG1ldGhvZCBhbHdheXMgcmV0dXJucyBgdHJ1ZWAsIGJ1dCB0aGlzIGNhbiBiZVxuICAgKiBjdXN0b21pemVkIHRvIGNvbnRyb2wgd2hlbiB0byB1cGRhdGUuXG4gICAqXG4gICAqIEBwYXJhbSBfY2hhbmdlZFByb3BlcnRpZXMgTWFwIG9mIGNoYW5nZWQgcHJvcGVydGllcyB3aXRoIG9sZCB2YWx1ZXNcbiAgICogQGNhdGVnb3J5IHVwZGF0ZXNcbiAgICovXG4gIHByb3RlY3RlZCBzaG91bGRVcGRhdGUoX2NoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlcyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIGVsZW1lbnQuIFRoaXMgbWV0aG9kIHJlZmxlY3RzIHByb3BlcnR5IHZhbHVlcyB0byBhdHRyaWJ1dGVzLlxuICAgKiBJdCBjYW4gYmUgb3ZlcnJpZGRlbiB0byByZW5kZXIgYW5kIGtlZXAgdXBkYXRlZCBlbGVtZW50IERPTS5cbiAgICogU2V0dGluZyBwcm9wZXJ0aWVzIGluc2lkZSB0aGlzIG1ldGhvZCB3aWxsICpub3QqIHRyaWdnZXJcbiAgICogYW5vdGhlciB1cGRhdGUuXG4gICAqXG4gICAqIEBwYXJhbSBfY2hhbmdlZFByb3BlcnRpZXMgTWFwIG9mIGNoYW5nZWQgcHJvcGVydGllcyB3aXRoIG9sZCB2YWx1ZXNcbiAgICogQGNhdGVnb3J5IHVwZGF0ZXNcbiAgICovXG4gIHByb3RlY3RlZCB1cGRhdGUoX2NoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlcykge1xuICAgIC8vIFRoZSBmb3JFYWNoKCkgZXhwcmVzc2lvbiB3aWxsIG9ubHkgcnVuIHdoZW4gX19yZWZsZWN0aW5nUHJvcGVydGllcyBpc1xuICAgIC8vIGRlZmluZWQsIGFuZCBpdCByZXR1cm5zIHVuZGVmaW5lZCwgc2V0dGluZyBfX3JlZmxlY3RpbmdQcm9wZXJ0aWVzIHRvXG4gICAgLy8gdW5kZWZpbmVkXG4gICAgdGhpcy5fX3JlZmxlY3RpbmdQcm9wZXJ0aWVzICYmPSB0aGlzLl9fcmVmbGVjdGluZ1Byb3BlcnRpZXMuZm9yRWFjaCgocCkgPT5cbiAgICAgIHRoaXMuX19wcm9wZXJ0eVRvQXR0cmlidXRlKHAsIHRoaXNbcCBhcyBrZXlvZiB0aGlzXSlcbiAgICApIGFzIHVuZGVmaW5lZDtcbiAgICB0aGlzLl9fbWFya1VwZGF0ZWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZva2VkIHdoZW5ldmVyIHRoZSBlbGVtZW50IGlzIHVwZGF0ZWQuIEltcGxlbWVudCB0byBwZXJmb3JtXG4gICAqIHBvc3QtdXBkYXRpbmcgdGFza3MgdmlhIERPTSBBUElzLCBmb3IgZXhhbXBsZSwgZm9jdXNpbmcgYW4gZWxlbWVudC5cbiAgICpcbiAgICogU2V0dGluZyBwcm9wZXJ0aWVzIGluc2lkZSB0aGlzIG1ldGhvZCB3aWxsIHRyaWdnZXIgdGhlIGVsZW1lbnQgdG8gdXBkYXRlXG4gICAqIGFnYWluIGFmdGVyIHRoaXMgdXBkYXRlIGN5Y2xlIGNvbXBsZXRlcy5cbiAgICpcbiAgICogQHBhcmFtIF9jaGFuZ2VkUHJvcGVydGllcyBNYXAgb2YgY2hhbmdlZCBwcm9wZXJ0aWVzIHdpdGggb2xkIHZhbHVlc1xuICAgKiBAY2F0ZWdvcnkgdXBkYXRlc1xuICAgKi9cbiAgcHJvdGVjdGVkIHVwZGF0ZWQoX2NoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlcykge31cblxuICAvKipcbiAgICogSW52b2tlZCB3aGVuIHRoZSBlbGVtZW50IGlzIGZpcnN0IHVwZGF0ZWQuIEltcGxlbWVudCB0byBwZXJmb3JtIG9uZSB0aW1lXG4gICAqIHdvcmsgb24gdGhlIGVsZW1lbnQgYWZ0ZXIgdXBkYXRlLlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiBmaXJzdFVwZGF0ZWQoKSB7XG4gICAqICAgdGhpcy5yZW5kZXJSb290LmdldEVsZW1lbnRCeUlkKCdteS10ZXh0LWFyZWEnKS5mb2N1cygpO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKlxuICAgKiBTZXR0aW5nIHByb3BlcnRpZXMgaW5zaWRlIHRoaXMgbWV0aG9kIHdpbGwgdHJpZ2dlciB0aGUgZWxlbWVudCB0byB1cGRhdGVcbiAgICogYWdhaW4gYWZ0ZXIgdGhpcyB1cGRhdGUgY3ljbGUgY29tcGxldGVzLlxuICAgKlxuICAgKiBAcGFyYW0gX2NoYW5nZWRQcm9wZXJ0aWVzIE1hcCBvZiBjaGFuZ2VkIHByb3BlcnRpZXMgd2l0aCBvbGQgdmFsdWVzXG4gICAqIEBjYXRlZ29yeSB1cGRhdGVzXG4gICAqL1xuICBwcm90ZWN0ZWQgZmlyc3RVcGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXMpIHt9XG59XG4vLyBBc3NpZ25lZCBoZXJlIHRvIHdvcmsgYXJvdW5kIGEganNjb21waWxlciBidWcgd2l0aCBzdGF0aWMgZmllbGRzXG4vLyB3aGVuIGNvbXBpbGluZyB0byBFUzUuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2Nsb3N1cmUtY29tcGlsZXIvaXNzdWVzLzMxNzdcbihSZWFjdGl2ZUVsZW1lbnQgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbXG4gIEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ2VsZW1lbnRQcm9wZXJ0aWVzJywgUmVhY3RpdmVFbGVtZW50KVxuXSA9IG5ldyBNYXAoKTtcbihSZWFjdGl2ZUVsZW1lbnQgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbXG4gIEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ2ZpbmFsaXplZCcsIFJlYWN0aXZlRWxlbWVudClcbl0gPSBuZXcgTWFwKCk7XG5cbi8vIEFwcGx5IHBvbHlmaWxscyBpZiBhdmFpbGFibGVcbnBvbHlmaWxsU3VwcG9ydD8uKHtSZWFjdGl2ZUVsZW1lbnR9KTtcblxuLy8gRGV2IG1vZGUgd2FybmluZ3MuLi5cbmlmIChERVZfTU9ERSkge1xuICAvLyBEZWZhdWx0IHdhcm5pbmcgc2V0LlxuICBSZWFjdGl2ZUVsZW1lbnQuZW5hYmxlZFdhcm5pbmdzID0gW1xuICAgICdjaGFuZ2UtaW4tdXBkYXRlJyxcbiAgICAnYXN5bmMtcGVyZm9ybS11cGRhdGUnLFxuICBdO1xuICBjb25zdCBlbnN1cmVPd25XYXJuaW5ncyA9IGZ1bmN0aW9uIChjdG9yOiB0eXBlb2YgUmVhY3RpdmVFbGVtZW50KSB7XG4gICAgaWYgKFxuICAgICAgIWN0b3IuaGFzT3duUHJvcGVydHkoSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgnZW5hYmxlZFdhcm5pbmdzJywgY3RvcikpXG4gICAgKSB7XG4gICAgICBjdG9yLmVuYWJsZWRXYXJuaW5ncyA9IGN0b3IuZW5hYmxlZFdhcm5pbmdzIS5zbGljZSgpO1xuICAgIH1cbiAgfTtcbiAgUmVhY3RpdmVFbGVtZW50LmVuYWJsZVdhcm5pbmcgPSBmdW5jdGlvbiAoXG4gICAgdGhpczogdHlwZW9mIFJlYWN0aXZlRWxlbWVudCxcbiAgICB3YXJuaW5nOiBXYXJuaW5nS2luZFxuICApIHtcbiAgICBlbnN1cmVPd25XYXJuaW5ncyh0aGlzKTtcbiAgICBpZiAoIXRoaXMuZW5hYmxlZFdhcm5pbmdzIS5pbmNsdWRlcyh3YXJuaW5nKSkge1xuICAgICAgdGhpcy5lbmFibGVkV2FybmluZ3MhLnB1c2god2FybmluZyk7XG4gICAgfVxuICB9O1xuICBSZWFjdGl2ZUVsZW1lbnQuZGlzYWJsZVdhcm5pbmcgPSBmdW5jdGlvbiAoXG4gICAgdGhpczogdHlwZW9mIFJlYWN0aXZlRWxlbWVudCxcbiAgICB3YXJuaW5nOiBXYXJuaW5nS2luZFxuICApIHtcbiAgICBlbnN1cmVPd25XYXJuaW5ncyh0aGlzKTtcbiAgICBjb25zdCBpID0gdGhpcy5lbmFibGVkV2FybmluZ3MhLmluZGV4T2Yod2FybmluZyk7XG4gICAgaWYgKGkgPj0gMCkge1xuICAgICAgdGhpcy5lbmFibGVkV2FybmluZ3MhLnNwbGljZShpLCAxKTtcbiAgICB9XG4gIH07XG59XG5cbi8vIElNUE9SVEFOVDogZG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydHkgbmFtZSBvciB0aGUgYXNzaWdubWVudCBleHByZXNzaW9uLlxuLy8gVGhpcyBsaW5lIHdpbGwgYmUgdXNlZCBpbiByZWdleGVzIHRvIHNlYXJjaCBmb3IgUmVhY3RpdmVFbGVtZW50IHVzYWdlLlxuKGdsb2JhbC5yZWFjdGl2ZUVsZW1lbnRWZXJzaW9ucyA/Pz0gW10pLnB1c2goJzIuMS4wJyk7XG5pZiAoREVWX01PREUgJiYgZ2xvYmFsLnJlYWN0aXZlRWxlbWVudFZlcnNpb25zLmxlbmd0aCA+IDEpIHtcbiAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgIGlzc3VlV2FybmluZyEoXG4gICAgICAnbXVsdGlwbGUtdmVyc2lvbnMnLFxuICAgICAgYE11bHRpcGxlIHZlcnNpb25zIG9mIExpdCBsb2FkZWQuIExvYWRpbmcgbXVsdGlwbGUgdmVyc2lvbnMgYCArXG4gICAgICAgIGBpcyBub3QgcmVjb21tZW5kZWQuYFxuICAgICk7XG4gIH0pO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2VcbiAqL1xuXG4vLyBJTVBPUlRBTlQ6IHRoZXNlIGltcG9ydHMgbXVzdCBiZSB0eXBlLW9ubHlcbmltcG9ydCB0eXBlIHtEaXJlY3RpdmUsIERpcmVjdGl2ZVJlc3VsdCwgUGFydEluZm99IGZyb20gJy4vZGlyZWN0aXZlLmpzJztcbmltcG9ydCB0eXBlIHtUcnVzdGVkSFRNTCwgVHJ1c3RlZFR5cGVzV2luZG93fSBmcm9tICd0cnVzdGVkLXR5cGVzL2xpYi9pbmRleC5qcyc7XG5cbmNvbnN0IERFVl9NT0RFID0gdHJ1ZTtcbmNvbnN0IEVOQUJMRV9FWFRSQV9TRUNVUklUWV9IT09LUyA9IHRydWU7XG5jb25zdCBFTkFCTEVfU0hBRFlET01fTk9QQVRDSCA9IHRydWU7XG5jb25zdCBOT0RFX01PREUgPSBmYWxzZTtcblxuLy8gQWxsb3dzIG1pbmlmaWVycyB0byByZW5hbWUgcmVmZXJlbmNlcyB0byBnbG9iYWxUaGlzXG5jb25zdCBnbG9iYWwgPSBnbG9iYWxUaGlzO1xuXG4vKipcbiAqIENvbnRhaW5zIHR5cGVzIHRoYXQgYXJlIHBhcnQgb2YgdGhlIHVuc3RhYmxlIGRlYnVnIEFQSS5cbiAqXG4gKiBFdmVyeXRoaW5nIGluIHRoaXMgQVBJIGlzIG5vdCBzdGFibGUgYW5kIG1heSBjaGFuZ2Ugb3IgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLFxuICogZXZlbiBvbiBwYXRjaCByZWxlYXNlcy5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1uYW1lc3BhY2VcbmV4cG9ydCBuYW1lc3BhY2UgTGl0VW5zdGFibGUge1xuICAvKipcbiAgICogV2hlbiBMaXQgaXMgcnVubmluZyBpbiBkZXYgbW9kZSBhbmQgYHdpbmRvdy5lbWl0TGl0RGVidWdMb2dFdmVudHNgIGlzIHRydWUsXG4gICAqIHdlIHdpbGwgZW1pdCAnbGl0LWRlYnVnJyBldmVudHMgdG8gd2luZG93LCB3aXRoIGxpdmUgZGV0YWlscyBhYm91dCB0aGUgdXBkYXRlIGFuZCByZW5kZXJcbiAgICogbGlmZWN5Y2xlLiBUaGVzZSBjYW4gYmUgdXNlZnVsIGZvciB3cml0aW5nIGRlYnVnIHRvb2xpbmcgYW5kIHZpc3VhbGl6YXRpb25zLlxuICAgKlxuICAgKiBQbGVhc2UgYmUgYXdhcmUgdGhhdCBydW5uaW5nIHdpdGggd2luZG93LmVtaXRMaXREZWJ1Z0xvZ0V2ZW50cyBoYXMgcGVyZm9ybWFuY2Ugb3ZlcmhlYWQsXG4gICAqIG1ha2luZyBjZXJ0YWluIG9wZXJhdGlvbnMgdGhhdCBhcmUgbm9ybWFsbHkgdmVyeSBjaGVhcCAobGlrZSBhIG5vLW9wIHJlbmRlcikgbXVjaCBzbG93ZXIsXG4gICAqIGJlY2F1c2Ugd2UgbXVzdCBjb3B5IGRhdGEgYW5kIGRpc3BhdGNoIGV2ZW50cy5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbmFtZXNwYWNlXG4gIGV4cG9ydCBuYW1lc3BhY2UgRGVidWdMb2cge1xuICAgIGV4cG9ydCB0eXBlIEVudHJ5ID1cbiAgICAgIHwgVGVtcGxhdGVQcmVwXG4gICAgICB8IFRlbXBsYXRlSW5zdGFudGlhdGVkXG4gICAgICB8IFRlbXBsYXRlSW5zdGFudGlhdGVkQW5kVXBkYXRlZFxuICAgICAgfCBUZW1wbGF0ZVVwZGF0aW5nXG4gICAgICB8IEJlZ2luUmVuZGVyXG4gICAgICB8IEVuZFJlbmRlclxuICAgICAgfCBDb21taXRQYXJ0RW50cnlcbiAgICAgIHwgU2V0UGFydFZhbHVlO1xuICAgIGV4cG9ydCBpbnRlcmZhY2UgVGVtcGxhdGVQcmVwIHtcbiAgICAgIGtpbmQ6ICd0ZW1wbGF0ZSBwcmVwJztcbiAgICAgIHRlbXBsYXRlOiBUZW1wbGF0ZTtcbiAgICAgIHN0cmluZ3M6IFRlbXBsYXRlU3RyaW5nc0FycmF5O1xuICAgICAgY2xvbmFibGVUZW1wbGF0ZTogSFRNTFRlbXBsYXRlRWxlbWVudDtcbiAgICAgIHBhcnRzOiBUZW1wbGF0ZVBhcnRbXTtcbiAgICB9XG4gICAgZXhwb3J0IGludGVyZmFjZSBCZWdpblJlbmRlciB7XG4gICAgICBraW5kOiAnYmVnaW4gcmVuZGVyJztcbiAgICAgIGlkOiBudW1iZXI7XG4gICAgICB2YWx1ZTogdW5rbm93bjtcbiAgICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCBEb2N1bWVudEZyYWdtZW50O1xuICAgICAgb3B0aW9uczogUmVuZGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgICAgIHBhcnQ6IENoaWxkUGFydCB8IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZXhwb3J0IGludGVyZmFjZSBFbmRSZW5kZXIge1xuICAgICAga2luZDogJ2VuZCByZW5kZXInO1xuICAgICAgaWQ6IG51bWJlcjtcbiAgICAgIHZhbHVlOiB1bmtub3duO1xuICAgICAgY29udGFpbmVyOiBIVE1MRWxlbWVudCB8IERvY3VtZW50RnJhZ21lbnQ7XG4gICAgICBvcHRpb25zOiBSZW5kZXJPcHRpb25zIHwgdW5kZWZpbmVkO1xuICAgICAgcGFydDogQ2hpbGRQYXJ0O1xuICAgIH1cbiAgICBleHBvcnQgaW50ZXJmYWNlIFRlbXBsYXRlSW5zdGFudGlhdGVkIHtcbiAgICAgIGtpbmQ6ICd0ZW1wbGF0ZSBpbnN0YW50aWF0ZWQnO1xuICAgICAgdGVtcGxhdGU6IFRlbXBsYXRlIHwgQ29tcGlsZWRUZW1wbGF0ZTtcbiAgICAgIGluc3RhbmNlOiBUZW1wbGF0ZUluc3RhbmNlO1xuICAgICAgb3B0aW9uczogUmVuZGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgICAgIGZyYWdtZW50OiBOb2RlO1xuICAgICAgcGFydHM6IEFycmF5PFBhcnQgfCB1bmRlZmluZWQ+O1xuICAgICAgdmFsdWVzOiB1bmtub3duW107XG4gICAgfVxuICAgIGV4cG9ydCBpbnRlcmZhY2UgVGVtcGxhdGVJbnN0YW50aWF0ZWRBbmRVcGRhdGVkIHtcbiAgICAgIGtpbmQ6ICd0ZW1wbGF0ZSBpbnN0YW50aWF0ZWQgYW5kIHVwZGF0ZWQnO1xuICAgICAgdGVtcGxhdGU6IFRlbXBsYXRlIHwgQ29tcGlsZWRUZW1wbGF0ZTtcbiAgICAgIGluc3RhbmNlOiBUZW1wbGF0ZUluc3RhbmNlO1xuICAgICAgb3B0aW9uczogUmVuZGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgICAgIGZyYWdtZW50OiBOb2RlO1xuICAgICAgcGFydHM6IEFycmF5PFBhcnQgfCB1bmRlZmluZWQ+O1xuICAgICAgdmFsdWVzOiB1bmtub3duW107XG4gICAgfVxuICAgIGV4cG9ydCBpbnRlcmZhY2UgVGVtcGxhdGVVcGRhdGluZyB7XG4gICAgICBraW5kOiAndGVtcGxhdGUgdXBkYXRpbmcnO1xuICAgICAgdGVtcGxhdGU6IFRlbXBsYXRlIHwgQ29tcGlsZWRUZW1wbGF0ZTtcbiAgICAgIGluc3RhbmNlOiBUZW1wbGF0ZUluc3RhbmNlO1xuICAgICAgb3B0aW9uczogUmVuZGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgICAgIHBhcnRzOiBBcnJheTxQYXJ0IHwgdW5kZWZpbmVkPjtcbiAgICAgIHZhbHVlczogdW5rbm93bltdO1xuICAgIH1cbiAgICBleHBvcnQgaW50ZXJmYWNlIFNldFBhcnRWYWx1ZSB7XG4gICAgICBraW5kOiAnc2V0IHBhcnQnO1xuICAgICAgcGFydDogUGFydDtcbiAgICAgIHZhbHVlOiB1bmtub3duO1xuICAgICAgdmFsdWVJbmRleDogbnVtYmVyO1xuICAgICAgdmFsdWVzOiB1bmtub3duW107XG4gICAgICB0ZW1wbGF0ZUluc3RhbmNlOiBUZW1wbGF0ZUluc3RhbmNlO1xuICAgIH1cblxuICAgIGV4cG9ydCB0eXBlIENvbW1pdFBhcnRFbnRyeSA9XG4gICAgICB8IENvbW1pdE5vdGhpbmdUb0NoaWxkRW50cnlcbiAgICAgIHwgQ29tbWl0VGV4dFxuICAgICAgfCBDb21taXROb2RlXG4gICAgICB8IENvbW1pdEF0dHJpYnV0ZVxuICAgICAgfCBDb21taXRQcm9wZXJ0eVxuICAgICAgfCBDb21taXRCb29sZWFuQXR0cmlidXRlXG4gICAgICB8IENvbW1pdEV2ZW50TGlzdGVuZXJcbiAgICAgIHwgQ29tbWl0VG9FbGVtZW50QmluZGluZztcblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29tbWl0Tm90aGluZ1RvQ2hpbGRFbnRyeSB7XG4gICAgICBraW5kOiAnY29tbWl0IG5vdGhpbmcgdG8gY2hpbGQnO1xuICAgICAgc3RhcnQ6IENoaWxkTm9kZTtcbiAgICAgIGVuZDogQ2hpbGROb2RlIHwgbnVsbDtcbiAgICAgIHBhcmVudDogRGlzY29ubmVjdGFibGUgfCB1bmRlZmluZWQ7XG4gICAgICBvcHRpb25zOiBSZW5kZXJPcHRpb25zIHwgdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29tbWl0VGV4dCB7XG4gICAgICBraW5kOiAnY29tbWl0IHRleHQnO1xuICAgICAgbm9kZTogVGV4dDtcbiAgICAgIHZhbHVlOiB1bmtub3duO1xuICAgICAgb3B0aW9uczogUmVuZGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBleHBvcnQgaW50ZXJmYWNlIENvbW1pdE5vZGUge1xuICAgICAga2luZDogJ2NvbW1pdCBub2RlJztcbiAgICAgIHN0YXJ0OiBOb2RlO1xuICAgICAgcGFyZW50OiBEaXNjb25uZWN0YWJsZSB8IHVuZGVmaW5lZDtcbiAgICAgIHZhbHVlOiBOb2RlO1xuICAgICAgb3B0aW9uczogUmVuZGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBleHBvcnQgaW50ZXJmYWNlIENvbW1pdEF0dHJpYnV0ZSB7XG4gICAgICBraW5kOiAnY29tbWl0IGF0dHJpYnV0ZSc7XG4gICAgICBlbGVtZW50OiBFbGVtZW50O1xuICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgdmFsdWU6IHVua25vd247XG4gICAgICBvcHRpb25zOiBSZW5kZXJPcHRpb25zIHwgdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29tbWl0UHJvcGVydHkge1xuICAgICAga2luZDogJ2NvbW1pdCBwcm9wZXJ0eSc7XG4gICAgICBlbGVtZW50OiBFbGVtZW50O1xuICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgdmFsdWU6IHVua25vd247XG4gICAgICBvcHRpb25zOiBSZW5kZXJPcHRpb25zIHwgdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29tbWl0Qm9vbGVhbkF0dHJpYnV0ZSB7XG4gICAgICBraW5kOiAnY29tbWl0IGJvb2xlYW4gYXR0cmlidXRlJztcbiAgICAgIGVsZW1lbnQ6IEVsZW1lbnQ7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICB2YWx1ZTogYm9vbGVhbjtcbiAgICAgIG9wdGlvbnM6IFJlbmRlck9wdGlvbnMgfCB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgZXhwb3J0IGludGVyZmFjZSBDb21taXRFdmVudExpc3RlbmVyIHtcbiAgICAgIGtpbmQ6ICdjb21taXQgZXZlbnQgbGlzdGVuZXInO1xuICAgICAgZWxlbWVudDogRWxlbWVudDtcbiAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgIHZhbHVlOiB1bmtub3duO1xuICAgICAgb2xkTGlzdGVuZXI6IHVua25vd247XG4gICAgICBvcHRpb25zOiBSZW5kZXJPcHRpb25zIHwgdW5kZWZpbmVkO1xuICAgICAgLy8gVHJ1ZSBpZiB3ZSdyZSByZW1vdmluZyB0aGUgb2xkIGV2ZW50IGxpc3RlbmVyIChlLmcuIGJlY2F1c2Ugc2V0dGluZ3MgY2hhbmdlZCwgb3IgdmFsdWUgaXMgbm90aGluZylcbiAgICAgIHJlbW92ZUxpc3RlbmVyOiBib29sZWFuO1xuICAgICAgLy8gVHJ1ZSBpZiB3ZSdyZSBhZGRpbmcgYSBuZXcgZXZlbnQgbGlzdGVuZXIgKGUuZy4gYmVjYXVzZSBmaXJzdCByZW5kZXIsIG9yIHNldHRpbmdzIGNoYW5nZWQpXG4gICAgICBhZGRMaXN0ZW5lcjogYm9vbGVhbjtcbiAgICB9XG5cbiAgICBleHBvcnQgaW50ZXJmYWNlIENvbW1pdFRvRWxlbWVudEJpbmRpbmcge1xuICAgICAga2luZDogJ2NvbW1pdCB0byBlbGVtZW50IGJpbmRpbmcnO1xuICAgICAgZWxlbWVudDogRWxlbWVudDtcbiAgICAgIHZhbHVlOiB1bmtub3duO1xuICAgICAgb3B0aW9uczogUmVuZGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbn1cblxuaW50ZXJmYWNlIERlYnVnTG9nZ2luZ1dpbmRvdyB7XG4gIC8vIEV2ZW4gaW4gZGV2IG1vZGUsIHdlIGdlbmVyYWxseSBkb24ndCB3YW50IHRvIGVtaXQgdGhlc2UgZXZlbnRzLCBhcyB0aGF0J3NcbiAgLy8gYW5vdGhlciBsZXZlbCBvZiBjb3N0LCBzbyBvbmx5IGVtaXQgdGhlbSB3aGVuIERFVl9NT0RFIGlzIHRydWUgX2FuZF8gd2hlblxuICAvLyB3aW5kb3cuZW1pdExpdERlYnVnRXZlbnRzIGlzIHRydWUuXG4gIGVtaXRMaXREZWJ1Z0xvZ0V2ZW50cz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogVXNlZnVsIGZvciB2aXN1YWxpemluZyBhbmQgbG9nZ2luZyBpbnNpZ2h0cyBpbnRvIHdoYXQgdGhlIExpdCB0ZW1wbGF0ZSBzeXN0ZW0gaXMgZG9pbmcuXG4gKlxuICogQ29tcGlsZWQgb3V0IG9mIHByb2QgbW9kZSBidWlsZHMuXG4gKi9cbmNvbnN0IGRlYnVnTG9nRXZlbnQgPSBERVZfTU9ERVxuICA/IChldmVudDogTGl0VW5zdGFibGUuRGVidWdMb2cuRW50cnkpID0+IHtcbiAgICAgIGNvbnN0IHNob3VsZEVtaXQgPSAoZ2xvYmFsIGFzIHVua25vd24gYXMgRGVidWdMb2dnaW5nV2luZG93KVxuICAgICAgICAuZW1pdExpdERlYnVnTG9nRXZlbnRzO1xuICAgICAgaWYgKCFzaG91bGRFbWl0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGdsb2JhbC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQ8TGl0VW5zdGFibGUuRGVidWdMb2cuRW50cnk+KCdsaXQtZGVidWcnLCB7XG4gICAgICAgICAgZGV0YWlsOiBldmVudCxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICA6IHVuZGVmaW5lZDtcbi8vIFVzZWQgZm9yIGNvbm5lY3RpbmcgYmVnaW5SZW5kZXIgYW5kIGVuZFJlbmRlciBldmVudHMgd2hlbiB0aGVyZSBhcmUgbmVzdGVkXG4vLyByZW5kZXJzIHdoZW4gZXJyb3JzIGFyZSB0aHJvd24gcHJldmVudGluZyBhbiBlbmRSZW5kZXIgZXZlbnQgZnJvbSBiZWluZ1xuLy8gY2FsbGVkLlxubGV0IGRlYnVnTG9nUmVuZGVySWQgPSAwO1xuXG5sZXQgaXNzdWVXYXJuaW5nOiAoY29kZTogc3RyaW5nLCB3YXJuaW5nOiBzdHJpbmcpID0+IHZvaWQ7XG5cbmlmIChERVZfTU9ERSkge1xuICBnbG9iYWwubGl0SXNzdWVkV2FybmluZ3MgPz89IG5ldyBTZXQoKTtcblxuICAvKipcbiAgICogSXNzdWUgYSB3YXJuaW5nIGlmIHdlIGhhdmVuJ3QgYWxyZWFkeSwgYmFzZWQgZWl0aGVyIG9uIGBjb2RlYCBvciBgd2FybmluZ2AuXG4gICAqIFdhcm5pbmdzIGFyZSBkaXNhYmxlZCBhdXRvbWF0aWNhbGx5IG9ubHkgYnkgYHdhcm5pbmdgOyBkaXNhYmxpbmcgdmlhIGBjb2RlYFxuICAgKiBjYW4gYmUgZG9uZSBieSB1c2Vycy5cbiAgICovXG4gIGlzc3VlV2FybmluZyA9IChjb2RlOiBzdHJpbmcsIHdhcm5pbmc6IHN0cmluZykgPT4ge1xuICAgIHdhcm5pbmcgKz0gY29kZVxuICAgICAgPyBgIFNlZSBodHRwczovL2xpdC5kZXYvbXNnLyR7Y29kZX0gZm9yIG1vcmUgaW5mb3JtYXRpb24uYFxuICAgICAgOiAnJztcbiAgICBpZiAoXG4gICAgICAhZ2xvYmFsLmxpdElzc3VlZFdhcm5pbmdzIS5oYXMod2FybmluZykgJiZcbiAgICAgICFnbG9iYWwubGl0SXNzdWVkV2FybmluZ3MhLmhhcyhjb2RlKVxuICAgICkge1xuICAgICAgY29uc29sZS53YXJuKHdhcm5pbmcpO1xuICAgICAgZ2xvYmFsLmxpdElzc3VlZFdhcm5pbmdzIS5hZGQod2FybmluZyk7XG4gICAgfVxuICB9O1xuXG4gIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICBpc3N1ZVdhcm5pbmcoXG4gICAgICAnZGV2LW1vZGUnLFxuICAgICAgYExpdCBpcyBpbiBkZXYgbW9kZS4gTm90IHJlY29tbWVuZGVkIGZvciBwcm9kdWN0aW9uIWBcbiAgICApO1xuICB9KTtcbn1cblxuY29uc3Qgd3JhcCA9XG4gIEVOQUJMRV9TSEFEWURPTV9OT1BBVENIICYmXG4gIGdsb2JhbC5TaGFkeURPTT8uaW5Vc2UgJiZcbiAgZ2xvYmFsLlNoYWR5RE9NPy5ub1BhdGNoID09PSB0cnVlXG4gICAgPyAoZ2xvYmFsLlNoYWR5RE9NIS53cmFwIGFzIDxUIGV4dGVuZHMgTm9kZT4obm9kZTogVCkgPT4gVClcbiAgICA6IDxUIGV4dGVuZHMgTm9kZT4obm9kZTogVCkgPT4gbm9kZTtcblxuY29uc3QgdHJ1c3RlZFR5cGVzID0gKGdsb2JhbCBhcyB1bmtub3duIGFzIFRydXN0ZWRUeXBlc1dpbmRvdykudHJ1c3RlZFR5cGVzO1xuXG4vKipcbiAqIE91ciBUcnVzdGVkVHlwZVBvbGljeSBmb3IgSFRNTCB3aGljaCBpcyBkZWNsYXJlZCB1c2luZyB0aGUgaHRtbCB0ZW1wbGF0ZVxuICogdGFnIGZ1bmN0aW9uLlxuICpcbiAqIFRoYXQgSFRNTCBpcyBhIGRldmVsb3Blci1hdXRob3JlZCBjb25zdGFudCwgYW5kIGlzIHBhcnNlZCB3aXRoIGlubmVySFRNTFxuICogYmVmb3JlIGFueSB1bnRydXN0ZWQgZXhwcmVzc2lvbnMgaGF2ZSBiZWVuIG1peGVkIGluLiBUaGVyZWZvciBpdCBpc1xuICogY29uc2lkZXJlZCBzYWZlIGJ5IGNvbnN0cnVjdGlvbi5cbiAqL1xuY29uc3QgcG9saWN5ID0gdHJ1c3RlZFR5cGVzXG4gID8gdHJ1c3RlZFR5cGVzLmNyZWF0ZVBvbGljeSgnbGl0LWh0bWwnLCB7XG4gICAgICBjcmVhdGVIVE1MOiAocykgPT4gcyxcbiAgICB9KVxuICA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBVc2VkIHRvIHNhbml0aXplIGFueSB2YWx1ZSBiZWZvcmUgaXQgaXMgd3JpdHRlbiBpbnRvIHRoZSBET00uIFRoaXMgY2FuIGJlXG4gKiB1c2VkIHRvIGltcGxlbWVudCBhIHNlY3VyaXR5IHBvbGljeSBvZiBhbGxvd2VkIGFuZCBkaXNhbGxvd2VkIHZhbHVlcyBpblxuICogb3JkZXIgdG8gcHJldmVudCBYU1MgYXR0YWNrcy5cbiAqXG4gKiBPbmUgd2F5IG9mIHVzaW5nIHRoaXMgY2FsbGJhY2sgd291bGQgYmUgdG8gY2hlY2sgYXR0cmlidXRlcyBhbmQgcHJvcGVydGllc1xuICogYWdhaW5zdCBhIGxpc3Qgb2YgaGlnaCByaXNrIGZpZWxkcywgYW5kIHJlcXVpcmUgdGhhdCB2YWx1ZXMgd3JpdHRlbiB0byBzdWNoXG4gKiBmaWVsZHMgYmUgaW5zdGFuY2VzIG9mIGEgY2xhc3Mgd2hpY2ggaXMgc2FmZSBieSBjb25zdHJ1Y3Rpb24uIENsb3N1cmUncyBTYWZlXG4gKiBIVE1MIFR5cGVzIGlzIG9uZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIHRlY2huaXF1ZSAoXG4gKiBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL3NhZmUtaHRtbC10eXBlcy9ibG9iL21hc3Rlci9kb2Mvc2FmZWh0bWwtdHlwZXMubWQpLlxuICogVGhlIFRydXN0ZWRUeXBlcyBwb2x5ZmlsbCBpbiBBUEktb25seSBtb2RlIGNvdWxkIGFsc28gYmUgdXNlZCBhcyBhIGJhc2lzXG4gKiBmb3IgdGhpcyB0ZWNobmlxdWUgKGh0dHBzOi8vZ2l0aHViLmNvbS9XSUNHL3RydXN0ZWQtdHlwZXMpLlxuICpcbiAqIEBwYXJhbSBub2RlIFRoZSBIVE1MIG5vZGUgKHVzdWFsbHkgZWl0aGVyIGEgI3RleHQgbm9kZSBvciBhbiBFbGVtZW50KSB0aGF0XG4gKiAgICAgaXMgYmVpbmcgd3JpdHRlbiB0by4gTm90ZSB0aGF0IHRoaXMgaXMganVzdCBhbiBleGVtcGxhciBub2RlLCB0aGUgd3JpdGVcbiAqICAgICBtYXkgdGFrZSBwbGFjZSBhZ2FpbnN0IGFub3RoZXIgaW5zdGFuY2Ugb2YgdGhlIHNhbWUgY2xhc3Mgb2Ygbm9kZS5cbiAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSBvciBwcm9wZXJ0eSAoZm9yIGV4YW1wbGUsICdocmVmJykuXG4gKiBAcGFyYW0gdHlwZSBJbmRpY2F0ZXMgd2hldGhlciB0aGUgd3JpdGUgdGhhdCdzIGFib3V0IHRvIGJlIHBlcmZvcm1lZCB3aWxsXG4gKiAgICAgYmUgdG8gYSBwcm9wZXJ0eSBvciBhIG5vZGUuXG4gKiBAcmV0dXJuIEEgZnVuY3Rpb24gdGhhdCB3aWxsIHNhbml0aXplIHRoaXMgY2xhc3Mgb2Ygd3JpdGVzLlxuICovXG5leHBvcnQgdHlwZSBTYW5pdGl6ZXJGYWN0b3J5ID0gKFxuICBub2RlOiBOb2RlLFxuICBuYW1lOiBzdHJpbmcsXG4gIHR5cGU6ICdwcm9wZXJ0eScgfCAnYXR0cmlidXRlJ1xuKSA9PiBWYWx1ZVNhbml0aXplcjtcblxuLyoqXG4gKiBBIGZ1bmN0aW9uIHdoaWNoIGNhbiBzYW5pdGl6ZSB2YWx1ZXMgdGhhdCB3aWxsIGJlIHdyaXR0ZW4gdG8gYSBzcGVjaWZpYyBraW5kXG4gKiBvZiBET00gc2luay5cbiAqXG4gKiBTZWUgU2FuaXRpemVyRmFjdG9yeS5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHNhbml0aXplLiBXaWxsIGJlIHRoZSBhY3R1YWwgdmFsdWUgcGFzc2VkIGludG9cbiAqICAgICB0aGUgbGl0LWh0bWwgdGVtcGxhdGUgbGl0ZXJhbCwgc28gdGhpcyBjb3VsZCBiZSBvZiBhbnkgdHlwZS5cbiAqIEByZXR1cm4gVGhlIHZhbHVlIHRvIHdyaXRlIHRvIHRoZSBET00uIFVzdWFsbHkgdGhlIHNhbWUgYXMgdGhlIGlucHV0IHZhbHVlLFxuICogICAgIHVubGVzcyBzYW5pdGl6YXRpb24gaXMgbmVlZGVkLlxuICovXG5leHBvcnQgdHlwZSBWYWx1ZVNhbml0aXplciA9ICh2YWx1ZTogdW5rbm93bikgPT4gdW5rbm93bjtcblxuY29uc3QgaWRlbnRpdHlGdW5jdGlvbjogVmFsdWVTYW5pdGl6ZXIgPSAodmFsdWU6IHVua25vd24pID0+IHZhbHVlO1xuY29uc3Qgbm9vcFNhbml0aXplcjogU2FuaXRpemVyRmFjdG9yeSA9IChcbiAgX25vZGU6IE5vZGUsXG4gIF9uYW1lOiBzdHJpbmcsXG4gIF90eXBlOiAncHJvcGVydHknIHwgJ2F0dHJpYnV0ZSdcbikgPT4gaWRlbnRpdHlGdW5jdGlvbjtcblxuLyoqIFNldHMgdGhlIGdsb2JhbCBzYW5pdGl6ZXIgZmFjdG9yeS4gKi9cbmNvbnN0IHNldFNhbml0aXplciA9IChuZXdTYW5pdGl6ZXI6IFNhbml0aXplckZhY3RvcnkpID0+IHtcbiAgaWYgKCFFTkFCTEVfRVhUUkFfU0VDVVJJVFlfSE9PS1MpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHNhbml0aXplckZhY3RvcnlJbnRlcm5hbCAhPT0gbm9vcFNhbml0aXplcikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBBdHRlbXB0ZWQgdG8gb3ZlcndyaXRlIGV4aXN0aW5nIGxpdC1odG1sIHNlY3VyaXR5IHBvbGljeS5gICtcbiAgICAgICAgYCBzZXRTYW5pdGl6ZURPTVZhbHVlRmFjdG9yeSBzaG91bGQgYmUgY2FsbGVkIGF0IG1vc3Qgb25jZS5gXG4gICAgKTtcbiAgfVxuICBzYW5pdGl6ZXJGYWN0b3J5SW50ZXJuYWwgPSBuZXdTYW5pdGl6ZXI7XG59O1xuXG4vKipcbiAqIE9ubHkgdXNlZCBpbiBpbnRlcm5hbCB0ZXN0cywgbm90IGEgcGFydCBvZiB0aGUgcHVibGljIEFQSS5cbiAqL1xuY29uc3QgX3Rlc3RPbmx5Q2xlYXJTYW5pdGl6ZXJGYWN0b3J5RG9Ob3RDYWxsT3JFbHNlID0gKCkgPT4ge1xuICBzYW5pdGl6ZXJGYWN0b3J5SW50ZXJuYWwgPSBub29wU2FuaXRpemVyO1xufTtcblxuY29uc3QgY3JlYXRlU2FuaXRpemVyOiBTYW5pdGl6ZXJGYWN0b3J5ID0gKG5vZGUsIG5hbWUsIHR5cGUpID0+IHtcbiAgcmV0dXJuIHNhbml0aXplckZhY3RvcnlJbnRlcm5hbChub2RlLCBuYW1lLCB0eXBlKTtcbn07XG5cbi8vIEFkZGVkIHRvIGFuIGF0dHJpYnV0ZSBuYW1lIHRvIG1hcmsgdGhlIGF0dHJpYnV0ZSBhcyBib3VuZCBzbyB3ZSBjYW4gZmluZFxuLy8gaXQgZWFzaWx5LlxuY29uc3QgYm91bmRBdHRyaWJ1dGVTdWZmaXggPSAnJGxpdCQnO1xuXG4vLyBUaGlzIG1hcmtlciBpcyB1c2VkIGluIG1hbnkgc3ludGFjdGljIHBvc2l0aW9ucyBpbiBIVE1MLCBzbyBpdCBtdXN0IGJlXG4vLyBhIHZhbGlkIGVsZW1lbnQgbmFtZSBhbmQgYXR0cmlidXRlIG5hbWUuIFdlIGRvbid0IHN1cHBvcnQgZHluYW1pYyBuYW1lcyAoeWV0KVxuLy8gYnV0IHRoaXMgYXQgbGVhc3QgZW5zdXJlcyB0aGF0IHRoZSBwYXJzZSB0cmVlIGlzIGNsb3NlciB0byB0aGUgdGVtcGxhdGVcbi8vIGludGVudGlvbi5cbmNvbnN0IG1hcmtlciA9IGBsaXQkJHtNYXRoLnJhbmRvbSgpLnRvRml4ZWQoOSkuc2xpY2UoMil9JGA7XG5cbi8vIFN0cmluZyB1c2VkIHRvIHRlbGwgaWYgYSBjb21tZW50IGlzIGEgbWFya2VyIGNvbW1lbnRcbmNvbnN0IG1hcmtlck1hdGNoID0gJz8nICsgbWFya2VyO1xuXG4vLyBUZXh0IHVzZWQgdG8gaW5zZXJ0IGEgY29tbWVudCBtYXJrZXIgbm9kZS4gV2UgdXNlIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25cbi8vIHN5bnRheCBiZWNhdXNlIGl0J3Mgc2xpZ2h0bHkgc21hbGxlciwgYnV0IHBhcnNlcyBhcyBhIGNvbW1lbnQgbm9kZS5cbmNvbnN0IG5vZGVNYXJrZXIgPSBgPCR7bWFya2VyTWF0Y2h9PmA7XG5cbmNvbnN0IGQgPVxuICBOT0RFX01PREUgJiYgZ2xvYmFsLmRvY3VtZW50ID09PSB1bmRlZmluZWRcbiAgICA/ICh7XG4gICAgICAgIGNyZWF0ZVRyZWVXYWxrZXIoKSB7XG4gICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9LFxuICAgICAgfSBhcyB1bmtub3duIGFzIERvY3VtZW50KVxuICAgIDogZG9jdW1lbnQ7XG5cbi8vIENyZWF0ZXMgYSBkeW5hbWljIG1hcmtlci4gV2UgbmV2ZXIgaGF2ZSB0byBzZWFyY2ggZm9yIHRoZXNlIGluIHRoZSBET00uXG5jb25zdCBjcmVhdGVNYXJrZXIgPSAoKSA9PiBkLmNyZWF0ZUNvbW1lbnQoJycpO1xuXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10eXBlb2Ytb3BlcmF0b3JcbnR5cGUgUHJpbWl0aXZlID0gbnVsbCB8IHVuZGVmaW5lZCB8IGJvb2xlYW4gfCBudW1iZXIgfCBzdHJpbmcgfCBzeW1ib2wgfCBiaWdpbnQ7XG5jb25zdCBpc1ByaW1pdGl2ZSA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFByaW1pdGl2ZSA9PlxuICB2YWx1ZSA9PT0gbnVsbCB8fCAodHlwZW9mIHZhbHVlICE9ICdvYmplY3QnICYmIHR5cGVvZiB2YWx1ZSAhPSAnZnVuY3Rpb24nKTtcbmNvbnN0IGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuY29uc3QgaXNJdGVyYWJsZSA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIEl0ZXJhYmxlPHVua25vd24+ID0+XG4gIGlzQXJyYXkodmFsdWUpIHx8XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHR5cGVvZiAodmFsdWUgYXMgYW55KT8uW1N5bWJvbC5pdGVyYXRvcl0gPT09ICdmdW5jdGlvbic7XG5cbmNvbnN0IFNQQUNFX0NIQVIgPSBgWyBcXHRcXG5cXGZcXHJdYDtcbmNvbnN0IEFUVFJfVkFMVUVfQ0hBUiA9IGBbXiBcXHRcXG5cXGZcXHJcIidcXGA8Pj1dYDtcbmNvbnN0IE5BTUVfQ0hBUiA9IGBbXlxcXFxzXCInPj0vXWA7XG5cbi8vIFRoZXNlIHJlZ2V4ZXMgcmVwcmVzZW50IHRoZSBmaXZlIHBhcnNpbmcgc3RhdGVzIHRoYXQgd2UgY2FyZSBhYm91dCBpbiB0aGVcbi8vIFRlbXBsYXRlJ3MgSFRNTCBzY2FubmVyLiBUaGV5IG1hdGNoIHRoZSAqZW5kKiBvZiB0aGUgc3RhdGUgdGhleSdyZSBuYW1lZFxuLy8gYWZ0ZXIuXG4vLyBEZXBlbmRpbmcgb24gdGhlIG1hdGNoLCB3ZSB0cmFuc2l0aW9uIHRvIGEgbmV3IHN0YXRlLiBJZiB0aGVyZSdzIG5vIG1hdGNoLFxuLy8gd2Ugc3RheSBpbiB0aGUgc2FtZSBzdGF0ZS5cbi8vIE5vdGUgdGhhdCB0aGUgcmVnZXhlcyBhcmUgc3RhdGVmdWwuIFdlIHV0aWxpemUgbGFzdEluZGV4IGFuZCBzeW5jIGl0XG4vLyBhY3Jvc3MgdGhlIG11bHRpcGxlIHJlZ2V4ZXMgdXNlZC4gSW4gYWRkaXRpb24gdG8gdGhlIGZpdmUgcmVnZXhlcyBiZWxvd1xuLy8gd2UgYWxzbyBkeW5hbWljYWxseSBjcmVhdGUgYSByZWdleCB0byBmaW5kIHRoZSBtYXRjaGluZyBlbmQgdGFncyBmb3IgcmF3XG4vLyB0ZXh0IGVsZW1lbnRzLlxuXG4vKipcbiAqIEVuZCBvZiB0ZXh0IGlzOiBgPGAgZm9sbG93ZWQgYnk6XG4gKiAgIChjb21tZW50IHN0YXJ0KSBvciAodGFnKSBvciAoZHluYW1pYyB0YWcgYmluZGluZylcbiAqL1xuY29uc3QgdGV4dEVuZFJlZ2V4ID0gLzwoPzooIS0tfFxcL1teYS16QS1aXSl8KFxcLz9bYS16QS1aXVtePlxcc10qKXwoXFwvPyQpKS9nO1xuY29uc3QgQ09NTUVOVF9TVEFSVCA9IDE7XG5jb25zdCBUQUdfTkFNRSA9IDI7XG5jb25zdCBEWU5BTUlDX1RBR19OQU1FID0gMztcblxuY29uc3QgY29tbWVudEVuZFJlZ2V4ID0gLy0tPi9nO1xuLyoqXG4gKiBDb21tZW50cyBub3Qgc3RhcnRlZCB3aXRoIDwhLS0sIGxpa2UgPC97LCBjYW4gYmUgZW5kZWQgYnkgYSBzaW5nbGUgYD5gXG4gKi9cbmNvbnN0IGNvbW1lbnQyRW5kUmVnZXggPSAvPi9nO1xuXG4vKipcbiAqIFRoZSB0YWdFbmQgcmVnZXggbWF0Y2hlcyB0aGUgZW5kIG9mIHRoZSBcImluc2lkZSBhbiBvcGVuaW5nXCIgdGFnIHN5bnRheFxuICogcG9zaXRpb24uIEl0IGVpdGhlciBtYXRjaGVzIGEgYD5gLCBhbiBhdHRyaWJ1dGUtbGlrZSBzZXF1ZW5jZSwgb3IgdGhlIGVuZFxuICogb2YgdGhlIHN0cmluZyBhZnRlciBhIHNwYWNlIChhdHRyaWJ1dGUtbmFtZSBwb3NpdGlvbiBlbmRpbmcpLlxuICpcbiAqIFNlZSBhdHRyaWJ1dGVzIGluIHRoZSBIVE1MIHNwZWM6XG4gKiBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvc3ludGF4Lmh0bWwjZWxlbWVudHMtYXR0cmlidXRlc1xuICpcbiAqIFwiIFxcdFxcblxcZlxcclwiIGFyZSBIVE1MIHNwYWNlIGNoYXJhY3RlcnM6XG4gKiBodHRwczovL2luZnJhLnNwZWMud2hhdHdnLm9yZy8jYXNjaWktd2hpdGVzcGFjZVxuICpcbiAqIFNvIGFuIGF0dHJpYnV0ZSBpczpcbiAqICAqIFRoZSBuYW1lOiBhbnkgY2hhcmFjdGVyIGV4Y2VwdCBhIHdoaXRlc3BhY2UgY2hhcmFjdGVyLCAoXCIpLCAoJyksIFwiPlwiLFxuICogICAgXCI9XCIsIG9yIFwiL1wiLiBOb3RlOiB0aGlzIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBIVE1MIHNwZWMgd2hpY2ggYWxzbyBleGNsdWRlcyBjb250cm9sIGNoYXJhY3RlcnMuXG4gKiAgKiBGb2xsb3dlZCBieSB6ZXJvIG9yIG1vcmUgc3BhY2UgY2hhcmFjdGVyc1xuICogICogRm9sbG93ZWQgYnkgXCI9XCJcbiAqICAqIEZvbGxvd2VkIGJ5IHplcm8gb3IgbW9yZSBzcGFjZSBjaGFyYWN0ZXJzXG4gKiAgKiBGb2xsb3dlZCBieTpcbiAqICAgICogQW55IGNoYXJhY3RlciBleGNlcHQgc3BhY2UsICgnKSwgKFwiKSwgXCI8XCIsIFwiPlwiLCBcIj1cIiwgKGApLCBvclxuICogICAgKiAoXCIpIHRoZW4gYW55IG5vbi0oXCIpLCBvclxuICogICAgKiAoJykgdGhlbiBhbnkgbm9uLSgnKVxuICovXG5jb25zdCB0YWdFbmRSZWdleCA9IG5ldyBSZWdFeHAoXG4gIGA+fCR7U1BBQ0VfQ0hBUn0oPzooJHtOQU1FX0NIQVJ9KykoJHtTUEFDRV9DSEFSfSo9JHtTUEFDRV9DSEFSfSooPzoke0FUVFJfVkFMVUVfQ0hBUn18KFwifCcpfCkpfCQpYCxcbiAgJ2cnXG4pO1xuY29uc3QgRU5USVJFX01BVENIID0gMDtcbmNvbnN0IEFUVFJJQlVURV9OQU1FID0gMTtcbmNvbnN0IFNQQUNFU19BTkRfRVFVQUxTID0gMjtcbmNvbnN0IFFVT1RFX0NIQVIgPSAzO1xuXG5jb25zdCBzaW5nbGVRdW90ZUF0dHJFbmRSZWdleCA9IC8nL2c7XG5jb25zdCBkb3VibGVRdW90ZUF0dHJFbmRSZWdleCA9IC9cIi9nO1xuLyoqXG4gKiBNYXRjaGVzIHRoZSByYXcgdGV4dCBlbGVtZW50cy5cbiAqXG4gKiBDb21tZW50cyBhcmUgbm90IHBhcnNlZCB3aXRoaW4gcmF3IHRleHQgZWxlbWVudHMsIHNvIHdlIG5lZWQgdG8gc2VhcmNoIHRoZWlyXG4gKiB0ZXh0IGNvbnRlbnQgZm9yIG1hcmtlciBzdHJpbmdzLlxuICovXG5jb25zdCByYXdUZXh0RWxlbWVudCA9IC9eKD86c2NyaXB0fHN0eWxlfHRleHRhcmVhfHRpdGxlKSQvaTtcblxuLyoqIFRlbXBsYXRlUmVzdWx0IHR5cGVzICovXG5jb25zdCBIVE1MX1JFU1VMVCA9IDE7XG5jb25zdCBTVkdfUkVTVUxUID0gMjtcbmNvbnN0IE1BVEhNTF9SRVNVTFQgPSAzO1xuXG50eXBlIFJlc3VsdFR5cGUgPSB0eXBlb2YgSFRNTF9SRVNVTFQgfCB0eXBlb2YgU1ZHX1JFU1VMVCB8IHR5cGVvZiBNQVRITUxfUkVTVUxUO1xuXG4vLyBUZW1wbGF0ZVBhcnQgdHlwZXNcbi8vIElNUE9SVEFOVDogdGhlc2UgbXVzdCBtYXRjaCB0aGUgdmFsdWVzIGluIFBhcnRUeXBlXG5jb25zdCBBVFRSSUJVVEVfUEFSVCA9IDE7XG5jb25zdCBDSElMRF9QQVJUID0gMjtcbmNvbnN0IFBST1BFUlRZX1BBUlQgPSAzO1xuY29uc3QgQk9PTEVBTl9BVFRSSUJVVEVfUEFSVCA9IDQ7XG5jb25zdCBFVkVOVF9QQVJUID0gNTtcbmNvbnN0IEVMRU1FTlRfUEFSVCA9IDY7XG5jb25zdCBDT01NRU5UX1BBUlQgPSA3O1xuXG4vKipcbiAqIFRoZSByZXR1cm4gdHlwZSBvZiB0aGUgdGVtcGxhdGUgdGFnIGZ1bmN0aW9ucywge0BsaW5rY29kZSBodG1sfSBhbmRcbiAqIHtAbGlua2NvZGUgc3ZnfSB3aGVuIGl0IGhhc24ndCBiZWVuIGNvbXBpbGVkIGJ5IEBsaXQtbGFicy9jb21waWxlci5cbiAqXG4gKiBBIGBUZW1wbGF0ZVJlc3VsdGAgb2JqZWN0IGhvbGRzIGFsbCB0aGUgaW5mb3JtYXRpb24gYWJvdXQgYSB0ZW1wbGF0ZVxuICogZXhwcmVzc2lvbiByZXF1aXJlZCB0byByZW5kZXIgaXQ6IHRoZSB0ZW1wbGF0ZSBzdHJpbmdzLCBleHByZXNzaW9uIHZhbHVlcyxcbiAqIGFuZCB0eXBlIG9mIHRlbXBsYXRlIChodG1sIG9yIHN2ZykuXG4gKlxuICogYFRlbXBsYXRlUmVzdWx0YCBvYmplY3RzIGRvIG5vdCBjcmVhdGUgYW55IERPTSBvbiB0aGVpciBvd24uIFRvIGNyZWF0ZSBvclxuICogdXBkYXRlIERPTSB5b3UgbmVlZCB0byByZW5kZXIgdGhlIGBUZW1wbGF0ZVJlc3VsdGAuIFNlZVxuICogW1JlbmRlcmluZ10oaHR0cHM6Ly9saXQuZGV2L2RvY3MvY29tcG9uZW50cy9yZW5kZXJpbmcpIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICpcbiAqL1xuZXhwb3J0IHR5cGUgVW5jb21waWxlZFRlbXBsYXRlUmVzdWx0PFQgZXh0ZW5kcyBSZXN1bHRUeXBlID0gUmVzdWx0VHlwZT4gPSB7XG4gIC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gIFsnXyRsaXRUeXBlJCddOiBUO1xuICBzdHJpbmdzOiBUZW1wbGF0ZVN0cmluZ3NBcnJheTtcbiAgdmFsdWVzOiB1bmtub3duW107XG59O1xuXG4vKipcbiAqIFRoaXMgaXMgYSB0ZW1wbGF0ZSByZXN1bHQgdGhhdCBtYXkgYmUgZWl0aGVyIHVuY29tcGlsZWQgb3IgY29tcGlsZWQuXG4gKlxuICogSW4gdGhlIGZ1dHVyZSwgVGVtcGxhdGVSZXN1bHQgd2lsbCBiZSB0aGlzIHR5cGUuIElmIHlvdSB3YW50IHRvIGV4cGxpY2l0bHlcbiAqIG5vdGUgdGhhdCBhIHRlbXBsYXRlIHJlc3VsdCBpcyBwb3RlbnRpYWxseSBjb21waWxlZCwgeW91IGNhbiByZWZlcmVuY2UgdGhpc1xuICogdHlwZSBhbmQgaXQgd2lsbCBjb250aW51ZSB0byBiZWhhdmUgdGhlIHNhbWUgdGhyb3VnaCB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uXG4gKiBvZiBMaXQuIFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3IgY29kZSB0aGF0IHdhbnRzIHRvIHByZXBhcmUgZm9yIHRoZSBuZXh0XG4gKiBtYWpvciB2ZXJzaW9uIG9mIExpdC5cbiAqL1xuZXhwb3J0IHR5cGUgTWF5YmVDb21waWxlZFRlbXBsYXRlUmVzdWx0PFQgZXh0ZW5kcyBSZXN1bHRUeXBlID0gUmVzdWx0VHlwZT4gPVxuICB8IFVuY29tcGlsZWRUZW1wbGF0ZVJlc3VsdDxUPlxuICB8IENvbXBpbGVkVGVtcGxhdGVSZXN1bHQ7XG5cbi8qKlxuICogVGhlIHJldHVybiB0eXBlIG9mIHRoZSB0ZW1wbGF0ZSB0YWcgZnVuY3Rpb25zLCB7QGxpbmtjb2RlIGh0bWx9IGFuZFxuICoge0BsaW5rY29kZSBzdmd9LlxuICpcbiAqIEEgYFRlbXBsYXRlUmVzdWx0YCBvYmplY3QgaG9sZHMgYWxsIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBhIHRlbXBsYXRlXG4gKiBleHByZXNzaW9uIHJlcXVpcmVkIHRvIHJlbmRlciBpdDogdGhlIHRlbXBsYXRlIHN0cmluZ3MsIGV4cHJlc3Npb24gdmFsdWVzLFxuICogYW5kIHR5cGUgb2YgdGVtcGxhdGUgKGh0bWwgb3Igc3ZnKS5cbiAqXG4gKiBgVGVtcGxhdGVSZXN1bHRgIG9iamVjdHMgZG8gbm90IGNyZWF0ZSBhbnkgRE9NIG9uIHRoZWlyIG93bi4gVG8gY3JlYXRlIG9yXG4gKiB1cGRhdGUgRE9NIHlvdSBuZWVkIHRvIHJlbmRlciB0aGUgYFRlbXBsYXRlUmVzdWx0YC4gU2VlXG4gKiBbUmVuZGVyaW5nXShodHRwczovL2xpdC5kZXYvZG9jcy9jb21wb25lbnRzL3JlbmRlcmluZykgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICogSW4gTGl0IDQsIHRoaXMgdHlwZSB3aWxsIGJlIGFuIGFsaWFzIG9mXG4gKiBNYXliZUNvbXBpbGVkVGVtcGxhdGVSZXN1bHQsIHNvIHRoYXQgY29kZSB3aWxsIGdldCB0eXBlIGVycm9ycyBpZiBpdCBhc3N1bWVzXG4gKiB0aGF0IExpdCB0ZW1wbGF0ZXMgYXJlIG5vdCBjb21waWxlZC4gV2hlbiBkZWxpYmVyYXRlbHkgd29ya2luZyB3aXRoIG9ubHlcbiAqIG9uZSwgdXNlIGVpdGhlciB7QGxpbmtjb2RlIENvbXBpbGVkVGVtcGxhdGVSZXN1bHR9IG9yXG4gKiB7QGxpbmtjb2RlIFVuY29tcGlsZWRUZW1wbGF0ZVJlc3VsdH0gZXhwbGljaXRseS5cbiAqL1xuZXhwb3J0IHR5cGUgVGVtcGxhdGVSZXN1bHQ8VCBleHRlbmRzIFJlc3VsdFR5cGUgPSBSZXN1bHRUeXBlPiA9XG4gIFVuY29tcGlsZWRUZW1wbGF0ZVJlc3VsdDxUPjtcblxuZXhwb3J0IHR5cGUgSFRNTFRlbXBsYXRlUmVzdWx0ID0gVGVtcGxhdGVSZXN1bHQ8dHlwZW9mIEhUTUxfUkVTVUxUPjtcblxuZXhwb3J0IHR5cGUgU1ZHVGVtcGxhdGVSZXN1bHQgPSBUZW1wbGF0ZVJlc3VsdDx0eXBlb2YgU1ZHX1JFU1VMVD47XG5cbmV4cG9ydCB0eXBlIE1hdGhNTFRlbXBsYXRlUmVzdWx0ID0gVGVtcGxhdGVSZXN1bHQ8dHlwZW9mIE1BVEhNTF9SRVNVTFQ+O1xuXG4vKipcbiAqIEEgVGVtcGxhdGVSZXN1bHQgdGhhdCBoYXMgYmVlbiBjb21waWxlZCBieSBAbGl0LWxhYnMvY29tcGlsZXIsIHNraXBwaW5nIHRoZVxuICogcHJlcGFyZSBzdGVwLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbXBpbGVkVGVtcGxhdGVSZXN1bHQge1xuICAvLyBUaGlzIGlzIGEgZmFjdG9yeSBpbiBvcmRlciB0byBtYWtlIHRlbXBsYXRlIGluaXRpYWxpemF0aW9uIGxhenlcbiAgLy8gYW5kIGFsbG93IFNoYWR5UmVuZGVyT3B0aW9ucyBzY29wZSB0byBiZSBwYXNzZWQgaW4uXG4gIC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gIFsnXyRsaXRUeXBlJCddOiBDb21waWxlZFRlbXBsYXRlO1xuICB2YWx1ZXM6IHVua25vd25bXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21waWxlZFRlbXBsYXRlIGV4dGVuZHMgT21pdDxUZW1wbGF0ZSwgJ2VsJz4ge1xuICAvLyBlbCBpcyBvdmVycmlkZGVuIHRvIGJlIG9wdGlvbmFsLiBXZSBpbml0aWFsaXplIGl0IG9uIGZpcnN0IHJlbmRlclxuICBlbD86IEhUTUxUZW1wbGF0ZUVsZW1lbnQ7XG5cbiAgLy8gVGhlIHByZXBhcmVkIEhUTUwgc3RyaW5nIHRvIGNyZWF0ZSBhIHRlbXBsYXRlIGVsZW1lbnQgZnJvbS5cbiAgLy8gVGhlIHR5cGUgaXMgYSBUZW1wbGF0ZVN0cmluZ3NBcnJheSB0byBndWFyYW50ZWUgdGhhdCB0aGUgdmFsdWUgY2FtZSBmcm9tXG4gIC8vIHNvdXJjZSBjb2RlLCBwcmV2ZW50aW5nIGEgSlNPTiBpbmplY3Rpb24gYXR0YWNrLlxuICBoOiBUZW1wbGF0ZVN0cmluZ3NBcnJheTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSB0ZW1wbGF0ZSBsaXRlcmFsIHRhZyBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBUZW1wbGF0ZVJlc3VsdCB3aXRoXG4gKiB0aGUgZ2l2ZW4gcmVzdWx0IHR5cGUuXG4gKi9cbmNvbnN0IHRhZyA9XG4gIDxUIGV4dGVuZHMgUmVzdWx0VHlwZT4odHlwZTogVCkgPT5cbiAgKHN0cmluZ3M6IFRlbXBsYXRlU3RyaW5nc0FycmF5LCAuLi52YWx1ZXM6IHVua25vd25bXSk6IFRlbXBsYXRlUmVzdWx0PFQ+ID0+IHtcbiAgICAvLyBXYXJuIGFnYWluc3QgdGVtcGxhdGVzIG9jdGFsIGVzY2FwZSBzZXF1ZW5jZXNcbiAgICAvLyBXZSBkbyB0aGlzIGhlcmUgcmF0aGVyIHRoYW4gaW4gcmVuZGVyIHNvIHRoYXQgdGhlIHdhcm5pbmcgaXMgY2xvc2VyIHRvIHRoZVxuICAgIC8vIHRlbXBsYXRlIGRlZmluaXRpb24uXG4gICAgaWYgKERFVl9NT0RFICYmIHN0cmluZ3Muc29tZSgocykgPT4gcyA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAnU29tZSB0ZW1wbGF0ZSBzdHJpbmdzIGFyZSB1bmRlZmluZWQuXFxuJyArXG4gICAgICAgICAgJ1RoaXMgaXMgcHJvYmFibHkgY2F1c2VkIGJ5IGlsbGVnYWwgb2N0YWwgZXNjYXBlIHNlcXVlbmNlcy4nXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoREVWX01PREUpIHtcbiAgICAgIC8vIEltcG9ydCBzdGF0aWMtaHRtbC5qcyByZXN1bHRzIGluIGEgY2lyY3VsYXIgZGVwZW5kZW5jeSB3aGljaCBnMyBkb2Vzbid0XG4gICAgICAvLyBoYW5kbGUuIEluc3RlYWQgd2Uga25vdyB0aGF0IHN0YXRpYyB2YWx1ZXMgbXVzdCBoYXZlIHRoZSBmaWVsZFxuICAgICAgLy8gYF8kbGl0U3RhdGljJGAuXG4gICAgICBpZiAoXG4gICAgICAgIHZhbHVlcy5zb21lKCh2YWwpID0+ICh2YWwgYXMge18kbGl0U3RhdGljJDogdW5rbm93bn0pPy5bJ18kbGl0U3RhdGljJCddKVxuICAgICAgKSB7XG4gICAgICAgIGlzc3VlV2FybmluZyhcbiAgICAgICAgICAnJyxcbiAgICAgICAgICBgU3RhdGljIHZhbHVlcyAnbGl0ZXJhbCcgb3IgJ3Vuc2FmZVN0YXRpYycgY2Fubm90IGJlIHVzZWQgYXMgdmFsdWVzIHRvIG5vbi1zdGF0aWMgdGVtcGxhdGVzLlxcbmAgK1xuICAgICAgICAgICAgYFBsZWFzZSB1c2UgdGhlIHN0YXRpYyAnaHRtbCcgdGFnIGZ1bmN0aW9uLiBTZWUgaHR0cHM6Ly9saXQuZGV2L2RvY3MvdGVtcGxhdGVzL2V4cHJlc3Npb25zLyNzdGF0aWMtZXhwcmVzc2lvbnNgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAvLyBUaGlzIHByb3BlcnR5IG5lZWRzIHRvIHJlbWFpbiB1bm1pbmlmaWVkLlxuICAgICAgWydfJGxpdFR5cGUkJ106IHR5cGUsXG4gICAgICBzdHJpbmdzLFxuICAgICAgdmFsdWVzLFxuICAgIH07XG4gIH07XG5cbi8qKlxuICogSW50ZXJwcmV0cyBhIHRlbXBsYXRlIGxpdGVyYWwgYXMgYW4gSFRNTCB0ZW1wbGF0ZSB0aGF0IGNhbiBlZmZpY2llbnRseVxuICogcmVuZGVyIHRvIGFuZCB1cGRhdGUgYSBjb250YWluZXIuXG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IGhlYWRlciA9ICh0aXRsZTogc3RyaW5nKSA9PiBodG1sYDxoMT4ke3RpdGxlfTwvaDE+YDtcbiAqIGBgYFxuICpcbiAqIFRoZSBgaHRtbGAgdGFnIHJldHVybnMgYSBkZXNjcmlwdGlvbiBvZiB0aGUgRE9NIHRvIHJlbmRlciBhcyBhIHZhbHVlLiBJdCBpc1xuICogbGF6eSwgbWVhbmluZyBubyB3b3JrIGlzIGRvbmUgdW50aWwgdGhlIHRlbXBsYXRlIGlzIHJlbmRlcmVkLiBXaGVuIHJlbmRlcmluZyxcbiAqIGlmIGEgdGVtcGxhdGUgY29tZXMgZnJvbSB0aGUgc2FtZSBleHByZXNzaW9uIGFzIGEgcHJldmlvdXNseSByZW5kZXJlZCByZXN1bHQsXG4gKiBpdCdzIGVmZmljaWVudGx5IHVwZGF0ZWQgaW5zdGVhZCBvZiByZXBsYWNlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGh0bWwgPSB0YWcoSFRNTF9SRVNVTFQpO1xuXG4vKipcbiAqIEludGVycHJldHMgYSB0ZW1wbGF0ZSBsaXRlcmFsIGFzIGFuIFNWRyBmcmFnbWVudCB0aGF0IGNhbiBlZmZpY2llbnRseSByZW5kZXJcbiAqIHRvIGFuZCB1cGRhdGUgYSBjb250YWluZXIuXG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IHJlY3QgPSBzdmdgPHJlY3Qgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjEwXCI+PC9yZWN0PmA7XG4gKlxuICogY29uc3QgbXlJbWFnZSA9IGh0bWxgXG4gKiAgIDxzdmcgdmlld0JveD1cIjAgMCAxMCAxMFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAqICAgICAke3JlY3R9XG4gKiAgIDwvc3ZnPmA7XG4gKiBgYGBcbiAqXG4gKiBUaGUgYHN2Z2AgKnRhZyBmdW5jdGlvbiogc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgU1ZHIGZyYWdtZW50cywgb3IgZWxlbWVudHNcbiAqIHRoYXQgd291bGQgYmUgY29udGFpbmVkICoqaW5zaWRlKiogYW4gYDxzdmc+YCBIVE1MIGVsZW1lbnQuIEEgY29tbW9uIGVycm9yIGlzXG4gKiBwbGFjaW5nIGFuIGA8c3ZnPmAgKmVsZW1lbnQqIGluIGEgdGVtcGxhdGUgdGFnZ2VkIHdpdGggdGhlIGBzdmdgIHRhZ1xuICogZnVuY3Rpb24uIFRoZSBgPHN2Zz5gIGVsZW1lbnQgaXMgYW4gSFRNTCBlbGVtZW50IGFuZCBzaG91bGQgYmUgdXNlZCB3aXRoaW4gYVxuICogdGVtcGxhdGUgdGFnZ2VkIHdpdGggdGhlIHtAbGlua2NvZGUgaHRtbH0gdGFnIGZ1bmN0aW9uLlxuICpcbiAqIEluIExpdEVsZW1lbnQgdXNhZ2UsIGl0J3MgaW52YWxpZCB0byByZXR1cm4gYW4gU1ZHIGZyYWdtZW50IGZyb20gdGhlXG4gKiBgcmVuZGVyKClgIG1ldGhvZCwgYXMgdGhlIFNWRyBmcmFnbWVudCB3aWxsIGJlIGNvbnRhaW5lZCB3aXRoaW4gdGhlIGVsZW1lbnQnc1xuICogc2hhZG93IHJvb3QgYW5kIHRodXMgbm90IGJlIHByb3Blcmx5IGNvbnRhaW5lZCB3aXRoaW4gYW4gYDxzdmc+YCBIVE1MXG4gKiBlbGVtZW50LlxuICovXG5leHBvcnQgY29uc3Qgc3ZnID0gdGFnKFNWR19SRVNVTFQpO1xuXG4vKipcbiAqIEludGVycHJldHMgYSB0ZW1wbGF0ZSBsaXRlcmFsIGFzIE1hdGhNTCBmcmFnbWVudCB0aGF0IGNhbiBlZmZpY2llbnRseSByZW5kZXJcbiAqIHRvIGFuZCB1cGRhdGUgYSBjb250YWluZXIuXG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IG51bSA9IG1hdGhtbGA8bW4+MTwvbW4+YDtcbiAqXG4gKiBjb25zdCBlcSA9IGh0bWxgXG4gKiAgIDxtYXRoPlxuICogICAgICR7bnVtfVxuICogICA8L21hdGg+YDtcbiAqIGBgYFxuICpcbiAqIFRoZSBgbWF0aG1sYCAqdGFnIGZ1bmN0aW9uKiBzaG91bGQgb25seSBiZSB1c2VkIGZvciBNYXRoTUwgZnJhZ21lbnRzLCBvclxuICogZWxlbWVudHMgdGhhdCB3b3VsZCBiZSBjb250YWluZWQgKippbnNpZGUqKiBhIGA8bWF0aD5gIEhUTUwgZWxlbWVudC4gQSBjb21tb25cbiAqIGVycm9yIGlzIHBsYWNpbmcgYSBgPG1hdGg+YCAqZWxlbWVudCogaW4gYSB0ZW1wbGF0ZSB0YWdnZWQgd2l0aCB0aGUgYG1hdGhtbGBcbiAqIHRhZyBmdW5jdGlvbi4gVGhlIGA8bWF0aD5gIGVsZW1lbnQgaXMgYW4gSFRNTCBlbGVtZW50IGFuZCBzaG91bGQgYmUgdXNlZFxuICogd2l0aGluIGEgdGVtcGxhdGUgdGFnZ2VkIHdpdGggdGhlIHtAbGlua2NvZGUgaHRtbH0gdGFnIGZ1bmN0aW9uLlxuICpcbiAqIEluIExpdEVsZW1lbnQgdXNhZ2UsIGl0J3MgaW52YWxpZCB0byByZXR1cm4gYW4gTWF0aE1MIGZyYWdtZW50IGZyb20gdGhlXG4gKiBgcmVuZGVyKClgIG1ldGhvZCwgYXMgdGhlIE1hdGhNTCBmcmFnbWVudCB3aWxsIGJlIGNvbnRhaW5lZCB3aXRoaW4gdGhlXG4gKiBlbGVtZW50J3Mgc2hhZG93IHJvb3QgYW5kIHRodXMgbm90IGJlIHByb3Blcmx5IGNvbnRhaW5lZCB3aXRoaW4gYSBgPG1hdGg+YFxuICogSFRNTCBlbGVtZW50LlxuICovXG5leHBvcnQgY29uc3QgbWF0aG1sID0gdGFnKE1BVEhNTF9SRVNVTFQpO1xuXG4vKipcbiAqIEEgc2VudGluZWwgdmFsdWUgdGhhdCBzaWduYWxzIHRoYXQgYSB2YWx1ZSB3YXMgaGFuZGxlZCBieSBhIGRpcmVjdGl2ZSBhbmRcbiAqIHNob3VsZCBub3QgYmUgd3JpdHRlbiB0byB0aGUgRE9NLlxuICovXG5leHBvcnQgY29uc3Qgbm9DaGFuZ2UgPSBTeW1ib2wuZm9yKCdsaXQtbm9DaGFuZ2UnKTtcblxuLyoqXG4gKiBBIHNlbnRpbmVsIHZhbHVlIHRoYXQgc2lnbmFscyBhIENoaWxkUGFydCB0byBmdWxseSBjbGVhciBpdHMgY29udGVudC5cbiAqXG4gKiBgYGB0c1xuICogY29uc3QgYnV0dG9uID0gaHRtbGAke1xuICogIHVzZXIuaXNBZG1pblxuICogICAgPyBodG1sYDxidXR0b24+REVMRVRFPC9idXR0b24+YFxuICogICAgOiBub3RoaW5nXG4gKiB9YDtcbiAqIGBgYFxuICpcbiAqIFByZWZlciB1c2luZyBgbm90aGluZ2Agb3ZlciBvdGhlciBmYWxzeSB2YWx1ZXMgYXMgaXQgcHJvdmlkZXMgYSBjb25zaXN0ZW50XG4gKiBiZWhhdmlvciBiZXR3ZWVuIHZhcmlvdXMgZXhwcmVzc2lvbiBiaW5kaW5nIGNvbnRleHRzLlxuICpcbiAqIEluIGNoaWxkIGV4cHJlc3Npb25zLCBgdW5kZWZpbmVkYCwgYG51bGxgLCBgJydgLCBhbmQgYG5vdGhpbmdgIGFsbCBiZWhhdmUgdGhlXG4gKiBzYW1lIGFuZCByZW5kZXIgbm8gbm9kZXMuIEluIGF0dHJpYnV0ZSBleHByZXNzaW9ucywgYG5vdGhpbmdgIF9yZW1vdmVzXyB0aGVcbiAqIGF0dHJpYnV0ZSwgd2hpbGUgYHVuZGVmaW5lZGAgYW5kIGBudWxsYCB3aWxsIHJlbmRlciBhbiBlbXB0eSBzdHJpbmcuIEluXG4gKiBwcm9wZXJ0eSBleHByZXNzaW9ucyBgbm90aGluZ2AgYmVjb21lcyBgdW5kZWZpbmVkYC5cbiAqL1xuZXhwb3J0IGNvbnN0IG5vdGhpbmcgPSBTeW1ib2wuZm9yKCdsaXQtbm90aGluZycpO1xuXG4vKipcbiAqIFRoZSBjYWNoZSBvZiBwcmVwYXJlZCB0ZW1wbGF0ZXMsIGtleWVkIGJ5IHRoZSB0YWdnZWQgVGVtcGxhdGVTdHJpbmdzQXJyYXlcbiAqIGFuZCBfbm90XyBhY2NvdW50aW5nIGZvciB0aGUgc3BlY2lmaWMgdGVtcGxhdGUgdGFnIHVzZWQuIFRoaXMgbWVhbnMgdGhhdFxuICogdGVtcGxhdGUgdGFncyBjYW5ub3QgYmUgZHluYW1pYyAtIHRoZXkgbXVzdCBzdGF0aWNhbGx5IGJlIG9uZSBvZiBodG1sLCBzdmcsXG4gKiBvciBhdHRyLiBUaGlzIHJlc3RyaWN0aW9uIHNpbXBsaWZpZXMgdGhlIGNhY2hlIGxvb2t1cCwgd2hpY2ggaXMgb24gdGhlIGhvdFxuICogcGF0aCBmb3IgcmVuZGVyaW5nLlxuICovXG5jb25zdCB0ZW1wbGF0ZUNhY2hlID0gbmV3IFdlYWtNYXA8VGVtcGxhdGVTdHJpbmdzQXJyYXksIFRlbXBsYXRlPigpO1xuXG4vKipcbiAqIE9iamVjdCBzcGVjaWZ5aW5nIG9wdGlvbnMgZm9yIGNvbnRyb2xsaW5nIGxpdC1odG1sIHJlbmRlcmluZy4gTm90ZSB0aGF0XG4gKiB3aGlsZSBgcmVuZGVyYCBtYXkgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIG9uIHRoZSBzYW1lIGBjb250YWluZXJgIChhbmRcbiAqIGByZW5kZXJCZWZvcmVgIHJlZmVyZW5jZSBub2RlKSB0byBlZmZpY2llbnRseSB1cGRhdGUgdGhlIHJlbmRlcmVkIGNvbnRlbnQsXG4gKiBvbmx5IHRoZSBvcHRpb25zIHBhc3NlZCBpbiBkdXJpbmcgdGhlIGZpcnN0IHJlbmRlciBhcmUgcmVzcGVjdGVkIGR1cmluZ1xuICogdGhlIGxpZmV0aW1lIG9mIHJlbmRlcnMgdG8gdGhhdCB1bmlxdWUgYGNvbnRhaW5lcmAgKyBgcmVuZGVyQmVmb3JlYFxuICogY29tYmluYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVuZGVyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBbiBvYmplY3QgdG8gdXNlIGFzIHRoZSBgdGhpc2AgdmFsdWUgZm9yIGV2ZW50IGxpc3RlbmVycy4gSXQncyBvZnRlblxuICAgKiB1c2VmdWwgdG8gc2V0IHRoaXMgdG8gdGhlIGhvc3QgY29tcG9uZW50IHJlbmRlcmluZyBhIHRlbXBsYXRlLlxuICAgKi9cbiAgaG9zdD86IG9iamVjdDtcbiAgLyoqXG4gICAqIEEgRE9NIG5vZGUgYmVmb3JlIHdoaWNoIHRvIHJlbmRlciBjb250ZW50IGluIHRoZSBjb250YWluZXIuXG4gICAqL1xuICByZW5kZXJCZWZvcmU/OiBDaGlsZE5vZGUgfCBudWxsO1xuICAvKipcbiAgICogTm9kZSB1c2VkIGZvciBjbG9uaW5nIHRoZSB0ZW1wbGF0ZSAoYGltcG9ydE5vZGVgIHdpbGwgYmUgY2FsbGVkIG9uIHRoaXNcbiAgICogbm9kZSkuIFRoaXMgY29udHJvbHMgdGhlIGBvd25lckRvY3VtZW50YCBvZiB0aGUgcmVuZGVyZWQgRE9NLCBhbG9uZyB3aXRoXG4gICAqIGFueSBpbmhlcml0ZWQgY29udGV4dC4gRGVmYXVsdHMgdG8gdGhlIGdsb2JhbCBgZG9jdW1lbnRgLlxuICAgKi9cbiAgY3JlYXRpb25TY29wZT86IHtpbXBvcnROb2RlKG5vZGU6IE5vZGUsIGRlZXA/OiBib29sZWFuKTogTm9kZX07XG4gIC8qKlxuICAgKiBUaGUgaW5pdGlhbCBjb25uZWN0ZWQgc3RhdGUgZm9yIHRoZSB0b3AtbGV2ZWwgcGFydCBiZWluZyByZW5kZXJlZC4gSWYgbm9cbiAgICogYGlzQ29ubmVjdGVkYCBvcHRpb24gaXMgc2V0LCBgQXN5bmNEaXJlY3RpdmVgcyB3aWxsIGJlIGNvbm5lY3RlZCBieVxuICAgKiBkZWZhdWx0LiBTZXQgdG8gYGZhbHNlYCBpZiB0aGUgaW5pdGlhbCByZW5kZXIgb2NjdXJzIGluIGEgZGlzY29ubmVjdGVkIHRyZWVcbiAgICogYW5kIGBBc3luY0RpcmVjdGl2ZWBzIHNob3VsZCBzZWUgYGlzQ29ubmVjdGVkID09PSBmYWxzZWAgZm9yIHRoZWlyIGluaXRpYWxcbiAgICogcmVuZGVyLiBUaGUgYHBhcnQuc2V0Q29ubmVjdGVkKClgIG1ldGhvZCBtdXN0IGJlIHVzZWQgc3Vic2VxdWVudCB0byBpbml0aWFsXG4gICAqIHJlbmRlciB0byBjaGFuZ2UgdGhlIGNvbm5lY3RlZCBzdGF0ZSBvZiB0aGUgcGFydC5cbiAgICovXG4gIGlzQ29ubmVjdGVkPzogYm9vbGVhbjtcbn1cblxuY29uc3Qgd2Fsa2VyID0gZC5jcmVhdGVUcmVlV2Fsa2VyKFxuICBkLFxuICAxMjkgLyogTm9kZUZpbHRlci5TSE9XX3tFTEVNRU5UfENPTU1FTlR9ICovXG4pO1xuXG5sZXQgc2FuaXRpemVyRmFjdG9yeUludGVybmFsOiBTYW5pdGl6ZXJGYWN0b3J5ID0gbm9vcFNhbml0aXplcjtcblxuLy9cbi8vIENsYXNzZXMgb25seSBiZWxvdyBoZXJlLCBjb25zdCB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgb25seSBhYm92ZSBoZXJlLi4uXG4vL1xuLy8gS2VlcGluZyB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgYW5kIGNsYXNzZXMgdG9nZXRoZXIgaW1wcm92ZXMgbWluaWZpY2F0aW9uLlxuLy8gSW50ZXJmYWNlcyBhbmQgdHlwZSBhbGlhc2VzIGNhbiBiZSBpbnRlcmxlYXZlZCBmcmVlbHkuXG4vL1xuXG4vLyBUeXBlIGZvciBjbGFzc2VzIHRoYXQgaGF2ZSBhIGBfZGlyZWN0aXZlYCBvciBgX2RpcmVjdGl2ZXNbXWAgZmllbGQsIHVzZWQgYnlcbi8vIGByZXNvbHZlRGlyZWN0aXZlYFxuZXhwb3J0IGludGVyZmFjZSBEaXJlY3RpdmVQYXJlbnQge1xuICBfJHBhcmVudD86IERpcmVjdGl2ZVBhcmVudDtcbiAgXyRpc0Nvbm5lY3RlZDogYm9vbGVhbjtcbiAgX19kaXJlY3RpdmU/OiBEaXJlY3RpdmU7XG4gIF9fZGlyZWN0aXZlcz86IEFycmF5PERpcmVjdGl2ZSB8IHVuZGVmaW5lZD47XG59XG5cbmZ1bmN0aW9uIHRydXN0RnJvbVRlbXBsYXRlU3RyaW5nKFxuICB0c2E6IFRlbXBsYXRlU3RyaW5nc0FycmF5LFxuICBzdHJpbmdGcm9tVFNBOiBzdHJpbmdcbik6IFRydXN0ZWRIVE1MIHtcbiAgLy8gQSBzZWN1cml0eSBjaGVjayB0byBwcmV2ZW50IHNwb29maW5nIG9mIExpdCB0ZW1wbGF0ZSByZXN1bHRzLlxuICAvLyBJbiB0aGUgZnV0dXJlLCB3ZSBtYXkgYmUgYWJsZSB0byByZXBsYWNlIHRoaXMgd2l0aCBBcnJheS5pc1RlbXBsYXRlT2JqZWN0LFxuICAvLyB0aG91Z2ggd2UgbWlnaHQgbmVlZCB0byBtYWtlIHRoYXQgY2hlY2sgaW5zaWRlIG9mIHRoZSBodG1sIGFuZCBzdmdcbiAgLy8gZnVuY3Rpb25zLCBiZWNhdXNlIHByZWNvbXBpbGVkIHRlbXBsYXRlcyBkb24ndCBjb21lIGluIGFzXG4gIC8vIFRlbXBsYXRlU3RyaW5nQXJyYXkgb2JqZWN0cy5cbiAgaWYgKCFpc0FycmF5KHRzYSkgfHwgIXRzYS5oYXNPd25Qcm9wZXJ0eSgncmF3JykpIHtcbiAgICBsZXQgbWVzc2FnZSA9ICdpbnZhbGlkIHRlbXBsYXRlIHN0cmluZ3MgYXJyYXknO1xuICAgIGlmIChERVZfTU9ERSkge1xuICAgICAgbWVzc2FnZSA9IGBcbiAgICAgICAgICBJbnRlcm5hbCBFcnJvcjogZXhwZWN0ZWQgdGVtcGxhdGUgc3RyaW5ncyB0byBiZSBhbiBhcnJheVxuICAgICAgICAgIHdpdGggYSAncmF3JyBmaWVsZC4gRmFraW5nIGEgdGVtcGxhdGUgc3RyaW5ncyBhcnJheSBieVxuICAgICAgICAgIGNhbGxpbmcgaHRtbCBvciBzdmcgbGlrZSBhbiBvcmRpbmFyeSBmdW5jdGlvbiBpcyBlZmZlY3RpdmVseVxuICAgICAgICAgIHRoZSBzYW1lIGFzIGNhbGxpbmcgdW5zYWZlSHRtbCBhbmQgY2FuIGxlYWQgdG8gbWFqb3Igc2VjdXJpdHlcbiAgICAgICAgICBpc3N1ZXMsIGUuZy4gb3BlbmluZyB5b3VyIGNvZGUgdXAgdG8gWFNTIGF0dGFja3MuXG4gICAgICAgICAgSWYgeW91J3JlIHVzaW5nIHRoZSBodG1sIG9yIHN2ZyB0YWdnZWQgdGVtcGxhdGUgZnVuY3Rpb25zIG5vcm1hbGx5XG4gICAgICAgICAgYW5kIHN0aWxsIHNlZWluZyB0aGlzIGVycm9yLCBwbGVhc2UgZmlsZSBhIGJ1ZyBhdFxuICAgICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9saXQvbGl0L2lzc3Vlcy9uZXc/dGVtcGxhdGU9YnVnX3JlcG9ydC5tZFxuICAgICAgICAgIGFuZCBpbmNsdWRlIGluZm9ybWF0aW9uIGFib3V0IHlvdXIgYnVpbGQgdG9vbGluZywgaWYgYW55LlxuICAgICAgICBgXG4gICAgICAgIC50cmltKClcbiAgICAgICAgLnJlcGxhY2UoL1xcbiAqL2csICdcXG4nKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICB9XG4gIHJldHVybiBwb2xpY3kgIT09IHVuZGVmaW5lZFxuICAgID8gcG9saWN5LmNyZWF0ZUhUTUwoc3RyaW5nRnJvbVRTQSlcbiAgICA6IChzdHJpbmdGcm9tVFNBIGFzIHVua25vd24gYXMgVHJ1c3RlZEhUTUwpO1xufVxuXG4vKipcbiAqIFJldHVybnMgYW4gSFRNTCBzdHJpbmcgZm9yIHRoZSBnaXZlbiBUZW1wbGF0ZVN0cmluZ3NBcnJheSBhbmQgcmVzdWx0IHR5cGVcbiAqIChIVE1MIG9yIFNWRyksIGFsb25nIHdpdGggdGhlIGNhc2Utc2Vuc2l0aXZlIGJvdW5kIGF0dHJpYnV0ZSBuYW1lcyBpblxuICogdGVtcGxhdGUgb3JkZXIuIFRoZSBIVE1MIGNvbnRhaW5zIGNvbW1lbnQgbWFya2VycyBkZW5vdGluZyB0aGUgYENoaWxkUGFydGBzXG4gKiBhbmQgc3VmZml4ZXMgb24gYm91bmQgYXR0cmlidXRlcyBkZW5vdGluZyB0aGUgYEF0dHJpYnV0ZVBhcnRzYC5cbiAqXG4gKiBAcGFyYW0gc3RyaW5ncyB0ZW1wbGF0ZSBzdHJpbmdzIGFycmF5XG4gKiBAcGFyYW0gdHlwZSBIVE1MIG9yIFNWR1xuICogQHJldHVybiBBcnJheSBjb250YWluaW5nIGBbaHRtbCwgYXR0ck5hbWVzXWAgKGFycmF5IHJldHVybmVkIGZvciB0ZXJzZW5lc3MsXG4gKiAgICAgdG8gYXZvaWQgb2JqZWN0IGZpZWxkcyBzaW5jZSB0aGlzIGNvZGUgaXMgc2hhcmVkIHdpdGggbm9uLW1pbmlmaWVkIFNTUlxuICogICAgIGNvZGUpXG4gKi9cbmNvbnN0IGdldFRlbXBsYXRlSHRtbCA9IChcbiAgc3RyaW5nczogVGVtcGxhdGVTdHJpbmdzQXJyYXksXG4gIHR5cGU6IFJlc3VsdFR5cGVcbik6IFtUcnVzdGVkSFRNTCwgQXJyYXk8c3RyaW5nPl0gPT4ge1xuICAvLyBJbnNlcnQgbWFrZXJzIGludG8gdGhlIHRlbXBsYXRlIEhUTUwgdG8gcmVwcmVzZW50IHRoZSBwb3NpdGlvbiBvZlxuICAvLyBiaW5kaW5ncy4gVGhlIGZvbGxvd2luZyBjb2RlIHNjYW5zIHRoZSB0ZW1wbGF0ZSBzdHJpbmdzIHRvIGRldGVybWluZSB0aGVcbiAgLy8gc3ludGFjdGljIHBvc2l0aW9uIG9mIHRoZSBiaW5kaW5ncy4gVGhleSBjYW4gYmUgaW4gdGV4dCBwb3NpdGlvbiwgd2hlcmVcbiAgLy8gd2UgaW5zZXJ0IGFuIEhUTUwgY29tbWVudCwgYXR0cmlidXRlIHZhbHVlIHBvc2l0aW9uLCB3aGVyZSB3ZSBpbnNlcnQgYVxuICAvLyBzZW50aW5lbCBzdHJpbmcgYW5kIHJlLXdyaXRlIHRoZSBhdHRyaWJ1dGUgbmFtZSwgb3IgaW5zaWRlIGEgdGFnIHdoZXJlXG4gIC8vIHdlIGluc2VydCB0aGUgc2VudGluZWwgc3RyaW5nLlxuICBjb25zdCBsID0gc3RyaW5ncy5sZW5ndGggLSAxO1xuICAvLyBTdG9yZXMgdGhlIGNhc2Utc2Vuc2l0aXZlIGJvdW5kIGF0dHJpYnV0ZSBuYW1lcyBpbiB0aGUgb3JkZXIgb2YgdGhlaXJcbiAgLy8gcGFydHMuIEVsZW1lbnRQYXJ0cyBhcmUgYWxzbyByZWZsZWN0ZWQgaW4gdGhpcyBhcnJheSBhcyB1bmRlZmluZWRcbiAgLy8gcmF0aGVyIHRoYW4gYSBzdHJpbmcsIHRvIGRpc2FtYmlndWF0ZSBmcm9tIGF0dHJpYnV0ZSBiaW5kaW5ncy5cbiAgY29uc3QgYXR0ck5hbWVzOiBBcnJheTxzdHJpbmc+ID0gW107XG4gIGxldCBodG1sID1cbiAgICB0eXBlID09PSBTVkdfUkVTVUxUID8gJzxzdmc+JyA6IHR5cGUgPT09IE1BVEhNTF9SRVNVTFQgPyAnPG1hdGg+JyA6ICcnO1xuXG4gIC8vIFdoZW4gd2UncmUgaW5zaWRlIGEgcmF3IHRleHQgdGFnIChub3QgaXQncyB0ZXh0IGNvbnRlbnQpLCB0aGUgcmVnZXhcbiAgLy8gd2lsbCBzdGlsbCBiZSB0YWdSZWdleCBzbyB3ZSBjYW4gZmluZCBhdHRyaWJ1dGVzLCBidXQgd2lsbCBzd2l0Y2ggdG9cbiAgLy8gdGhpcyByZWdleCB3aGVuIHRoZSB0YWcgZW5kcy5cbiAgbGV0IHJhd1RleHRFbmRSZWdleDogUmVnRXhwIHwgdW5kZWZpbmVkO1xuXG4gIC8vIFRoZSBjdXJyZW50IHBhcnNpbmcgc3RhdGUsIHJlcHJlc2VudGVkIGFzIGEgcmVmZXJlbmNlIHRvIG9uZSBvZiB0aGVcbiAgLy8gcmVnZXhlc1xuICBsZXQgcmVnZXggPSB0ZXh0RW5kUmVnZXg7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsOyBpKyspIHtcbiAgICBjb25zdCBzID0gc3RyaW5nc1tpXTtcbiAgICAvLyBUaGUgaW5kZXggb2YgdGhlIGVuZCBvZiB0aGUgbGFzdCBhdHRyaWJ1dGUgbmFtZS4gV2hlbiB0aGlzIGlzXG4gICAgLy8gcG9zaXRpdmUgYXQgZW5kIG9mIGEgc3RyaW5nLCBpdCBtZWFucyB3ZSdyZSBpbiBhbiBhdHRyaWJ1dGUgdmFsdWVcbiAgICAvLyBwb3NpdGlvbiBhbmQgbmVlZCB0byByZXdyaXRlIHRoZSBhdHRyaWJ1dGUgbmFtZS5cbiAgICAvLyBXZSBhbHNvIHVzZSBhIHNwZWNpYWwgdmFsdWUgb2YgLTIgdG8gaW5kaWNhdGUgdGhhdCB3ZSBlbmNvdW50ZXJlZFxuICAgIC8vIHRoZSBlbmQgb2YgYSBzdHJpbmcgaW4gYXR0cmlidXRlIG5hbWUgcG9zaXRpb24uXG4gICAgbGV0IGF0dHJOYW1lRW5kSW5kZXggPSAtMTtcbiAgICBsZXQgYXR0ck5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgbGFzdEluZGV4ID0gMDtcbiAgICBsZXQgbWF0Y2ghOiBSZWdFeHBFeGVjQXJyYXkgfCBudWxsO1xuXG4gICAgLy8gVGhlIGNvbmRpdGlvbnMgaW4gdGhpcyBsb29wIGhhbmRsZSB0aGUgY3VycmVudCBwYXJzZSBzdGF0ZSwgYW5kIHRoZVxuICAgIC8vIGFzc2lnbm1lbnRzIHRvIHRoZSBgcmVnZXhgIHZhcmlhYmxlIGFyZSB0aGUgc3RhdGUgdHJhbnNpdGlvbnMuXG4gICAgd2hpbGUgKGxhc3RJbmRleCA8IHMubGVuZ3RoKSB7XG4gICAgICAvLyBNYWtlIHN1cmUgd2Ugc3RhcnQgc2VhcmNoaW5nIGZyb20gd2hlcmUgd2UgcHJldmlvdXNseSBsZWZ0IG9mZlxuICAgICAgcmVnZXgubGFzdEluZGV4ID0gbGFzdEluZGV4O1xuICAgICAgbWF0Y2ggPSByZWdleC5leGVjKHMpO1xuICAgICAgaWYgKG1hdGNoID09PSBudWxsKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgbGFzdEluZGV4ID0gcmVnZXgubGFzdEluZGV4O1xuICAgICAgaWYgKHJlZ2V4ID09PSB0ZXh0RW5kUmVnZXgpIHtcbiAgICAgICAgaWYgKG1hdGNoW0NPTU1FTlRfU1RBUlRdID09PSAnIS0tJykge1xuICAgICAgICAgIHJlZ2V4ID0gY29tbWVudEVuZFJlZ2V4O1xuICAgICAgICB9IGVsc2UgaWYgKG1hdGNoW0NPTU1FTlRfU1RBUlRdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBXZSBzdGFydGVkIGEgd2VpcmQgY29tbWVudCwgbGlrZSA8L3tcbiAgICAgICAgICByZWdleCA9IGNvbW1lbnQyRW5kUmVnZXg7XG4gICAgICAgIH0gZWxzZSBpZiAobWF0Y2hbVEFHX05BTUVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAocmF3VGV4dEVsZW1lbnQudGVzdChtYXRjaFtUQUdfTkFNRV0pKSB7XG4gICAgICAgICAgICAvLyBSZWNvcmQgaWYgd2UgZW5jb3VudGVyIGEgcmF3LXRleHQgZWxlbWVudC4gV2UnbGwgc3dpdGNoIHRvXG4gICAgICAgICAgICAvLyB0aGlzIHJlZ2V4IGF0IHRoZSBlbmQgb2YgdGhlIHRhZy5cbiAgICAgICAgICAgIHJhd1RleHRFbmRSZWdleCA9IG5ldyBSZWdFeHAoYDwvJHttYXRjaFtUQUdfTkFNRV19YCwgJ2cnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVnZXggPSB0YWdFbmRSZWdleDtcbiAgICAgICAgfSBlbHNlIGlmIChtYXRjaFtEWU5BTUlDX1RBR19OQU1FXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKERFVl9NT0RFKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICdCaW5kaW5ncyBpbiB0YWcgbmFtZXMgYXJlIG5vdCBzdXBwb3J0ZWQuIFBsZWFzZSB1c2Ugc3RhdGljIHRlbXBsYXRlcyBpbnN0ZWFkLiAnICtcbiAgICAgICAgICAgICAgICAnU2VlIGh0dHBzOi8vbGl0LmRldi9kb2NzL3RlbXBsYXRlcy9leHByZXNzaW9ucy8jc3RhdGljLWV4cHJlc3Npb25zJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVnZXggPSB0YWdFbmRSZWdleDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChyZWdleCA9PT0gdGFnRW5kUmVnZXgpIHtcbiAgICAgICAgaWYgKG1hdGNoW0VOVElSRV9NQVRDSF0gPT09ICc+Jykge1xuICAgICAgICAgIC8vIEVuZCBvZiBhIHRhZy4gSWYgd2UgaGFkIHN0YXJ0ZWQgYSByYXctdGV4dCBlbGVtZW50LCB1c2UgdGhhdFxuICAgICAgICAgIC8vIHJlZ2V4XG4gICAgICAgICAgcmVnZXggPSByYXdUZXh0RW5kUmVnZXggPz8gdGV4dEVuZFJlZ2V4O1xuICAgICAgICAgIC8vIFdlIG1heSBiZSBlbmRpbmcgYW4gdW5xdW90ZWQgYXR0cmlidXRlIHZhbHVlLCBzbyBtYWtlIHN1cmUgd2VcbiAgICAgICAgICAvLyBjbGVhciBhbnkgcGVuZGluZyBhdHRyTmFtZUVuZEluZGV4XG4gICAgICAgICAgYXR0ck5hbWVFbmRJbmRleCA9IC0xO1xuICAgICAgICB9IGVsc2UgaWYgKG1hdGNoW0FUVFJJQlVURV9OQU1FXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gQXR0cmlidXRlIG5hbWUgcG9zaXRpb25cbiAgICAgICAgICBhdHRyTmFtZUVuZEluZGV4ID0gLTI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXR0ck5hbWVFbmRJbmRleCA9IHJlZ2V4Lmxhc3RJbmRleCAtIG1hdGNoW1NQQUNFU19BTkRfRVFVQUxTXS5sZW5ndGg7XG4gICAgICAgICAgYXR0ck5hbWUgPSBtYXRjaFtBVFRSSUJVVEVfTkFNRV07XG4gICAgICAgICAgcmVnZXggPVxuICAgICAgICAgICAgbWF0Y2hbUVVPVEVfQ0hBUl0gPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICA/IHRhZ0VuZFJlZ2V4XG4gICAgICAgICAgICAgIDogbWF0Y2hbUVVPVEVfQ0hBUl0gPT09ICdcIidcbiAgICAgICAgICAgICAgICA/IGRvdWJsZVF1b3RlQXR0ckVuZFJlZ2V4XG4gICAgICAgICAgICAgICAgOiBzaW5nbGVRdW90ZUF0dHJFbmRSZWdleDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgcmVnZXggPT09IGRvdWJsZVF1b3RlQXR0ckVuZFJlZ2V4IHx8XG4gICAgICAgIHJlZ2V4ID09PSBzaW5nbGVRdW90ZUF0dHJFbmRSZWdleFxuICAgICAgKSB7XG4gICAgICAgIHJlZ2V4ID0gdGFnRW5kUmVnZXg7XG4gICAgICB9IGVsc2UgaWYgKHJlZ2V4ID09PSBjb21tZW50RW5kUmVnZXggfHwgcmVnZXggPT09IGNvbW1lbnQyRW5kUmVnZXgpIHtcbiAgICAgICAgcmVnZXggPSB0ZXh0RW5kUmVnZXg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBOb3Qgb25lIG9mIHRoZSBmaXZlIHN0YXRlIHJlZ2V4ZXMsIHNvIGl0IG11c3QgYmUgdGhlIGR5bmFtaWNhbGx5XG4gICAgICAgIC8vIGNyZWF0ZWQgcmF3IHRleHQgcmVnZXggYW5kIHdlJ3JlIGF0IHRoZSBjbG9zZSBvZiB0aGF0IGVsZW1lbnQuXG4gICAgICAgIHJlZ2V4ID0gdGFnRW5kUmVnZXg7XG4gICAgICAgIHJhd1RleHRFbmRSZWdleCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoREVWX01PREUpIHtcbiAgICAgIC8vIElmIHdlIGhhdmUgYSBhdHRyTmFtZUVuZEluZGV4LCB3aGljaCBpbmRpY2F0ZXMgdGhhdCB3ZSBzaG91bGRcbiAgICAgIC8vIHJld3JpdGUgdGhlIGF0dHJpYnV0ZSBuYW1lLCBhc3NlcnQgdGhhdCB3ZSdyZSBpbiBhIHZhbGlkIGF0dHJpYnV0ZVxuICAgICAgLy8gcG9zaXRpb24gLSBlaXRoZXIgaW4gYSB0YWcsIG9yIGEgcXVvdGVkIGF0dHJpYnV0ZSB2YWx1ZS5cbiAgICAgIGNvbnNvbGUuYXNzZXJ0KFxuICAgICAgICBhdHRyTmFtZUVuZEluZGV4ID09PSAtMSB8fFxuICAgICAgICAgIHJlZ2V4ID09PSB0YWdFbmRSZWdleCB8fFxuICAgICAgICAgIHJlZ2V4ID09PSBzaW5nbGVRdW90ZUF0dHJFbmRSZWdleCB8fFxuICAgICAgICAgIHJlZ2V4ID09PSBkb3VibGVRdW90ZUF0dHJFbmRSZWdleCxcbiAgICAgICAgJ3VuZXhwZWN0ZWQgcGFyc2Ugc3RhdGUgQidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gV2UgaGF2ZSBmb3VyIGNhc2VzOlxuICAgIC8vICAxLiBXZSdyZSBpbiB0ZXh0IHBvc2l0aW9uLCBhbmQgbm90IGluIGEgcmF3IHRleHQgZWxlbWVudFxuICAgIC8vICAgICAocmVnZXggPT09IHRleHRFbmRSZWdleCk6IGluc2VydCBhIGNvbW1lbnQgbWFya2VyLlxuICAgIC8vICAyLiBXZSBoYXZlIGEgbm9uLW5lZ2F0aXZlIGF0dHJOYW1lRW5kSW5kZXggd2hpY2ggbWVhbnMgd2UgbmVlZCB0b1xuICAgIC8vICAgICByZXdyaXRlIHRoZSBhdHRyaWJ1dGUgbmFtZSB0byBhZGQgYSBib3VuZCBhdHRyaWJ1dGUgc3VmZml4LlxuICAgIC8vICAzLiBXZSdyZSBhdCB0aGUgbm9uLWZpcnN0IGJpbmRpbmcgaW4gYSBtdWx0aS1iaW5kaW5nIGF0dHJpYnV0ZSwgdXNlIGFcbiAgICAvLyAgICAgcGxhaW4gbWFya2VyLlxuICAgIC8vICA0LiBXZSdyZSBzb21ld2hlcmUgZWxzZSBpbnNpZGUgdGhlIHRhZy4gSWYgd2UncmUgaW4gYXR0cmlidXRlIG5hbWVcbiAgICAvLyAgICAgcG9zaXRpb24gKGF0dHJOYW1lRW5kSW5kZXggPT09IC0yKSwgYWRkIGEgc2VxdWVudGlhbCBzdWZmaXggdG9cbiAgICAvLyAgICAgZ2VuZXJhdGUgYSB1bmlxdWUgYXR0cmlidXRlIG5hbWUuXG5cbiAgICAvLyBEZXRlY3QgYSBiaW5kaW5nIG5leHQgdG8gc2VsZi1jbG9zaW5nIHRhZyBlbmQgYW5kIGluc2VydCBhIHNwYWNlIHRvXG4gICAgLy8gc2VwYXJhdGUgdGhlIG1hcmtlciBmcm9tIHRoZSB0YWcgZW5kOlxuICAgIGNvbnN0IGVuZCA9XG4gICAgICByZWdleCA9PT0gdGFnRW5kUmVnZXggJiYgc3RyaW5nc1tpICsgMV0uc3RhcnRzV2l0aCgnLz4nKSA/ICcgJyA6ICcnO1xuICAgIGh0bWwgKz1cbiAgICAgIHJlZ2V4ID09PSB0ZXh0RW5kUmVnZXhcbiAgICAgICAgPyBzICsgbm9kZU1hcmtlclxuICAgICAgICA6IGF0dHJOYW1lRW5kSW5kZXggPj0gMFxuICAgICAgICAgID8gKGF0dHJOYW1lcy5wdXNoKGF0dHJOYW1lISksXG4gICAgICAgICAgICBzLnNsaWNlKDAsIGF0dHJOYW1lRW5kSW5kZXgpICtcbiAgICAgICAgICAgICAgYm91bmRBdHRyaWJ1dGVTdWZmaXggK1xuICAgICAgICAgICAgICBzLnNsaWNlKGF0dHJOYW1lRW5kSW5kZXgpKSArXG4gICAgICAgICAgICBtYXJrZXIgK1xuICAgICAgICAgICAgZW5kXG4gICAgICAgICAgOiBzICsgbWFya2VyICsgKGF0dHJOYW1lRW5kSW5kZXggPT09IC0yID8gaSA6IGVuZCk7XG4gIH1cblxuICBjb25zdCBodG1sUmVzdWx0OiBzdHJpbmcgfCBUcnVzdGVkSFRNTCA9XG4gICAgaHRtbCArXG4gICAgKHN0cmluZ3NbbF0gfHwgJzw/PicpICtcbiAgICAodHlwZSA9PT0gU1ZHX1JFU1VMVCA/ICc8L3N2Zz4nIDogdHlwZSA9PT0gTUFUSE1MX1JFU1VMVCA/ICc8L21hdGg+JyA6ICcnKTtcblxuICAvLyBSZXR1cm5lZCBhcyBhbiBhcnJheSBmb3IgdGVyc2VuZXNzXG4gIHJldHVybiBbdHJ1c3RGcm9tVGVtcGxhdGVTdHJpbmcoc3RyaW5ncywgaHRtbFJlc3VsdCksIGF0dHJOYW1lc107XG59O1xuXG4vKiogQGludGVybmFsICovXG5leHBvcnQgdHlwZSB7VGVtcGxhdGV9O1xuY2xhc3MgVGVtcGxhdGUge1xuICAvKiogQGludGVybmFsICovXG4gIGVsITogSFRNTFRlbXBsYXRlRWxlbWVudDtcblxuICBwYXJ0czogQXJyYXk8VGVtcGxhdGVQYXJ0PiA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gICAge3N0cmluZ3MsIFsnXyRsaXRUeXBlJCddOiB0eXBlfTogVW5jb21waWxlZFRlbXBsYXRlUmVzdWx0LFxuICAgIG9wdGlvbnM/OiBSZW5kZXJPcHRpb25zXG4gICkge1xuICAgIGxldCBub2RlOiBOb2RlIHwgbnVsbDtcbiAgICBsZXQgbm9kZUluZGV4ID0gMDtcbiAgICBsZXQgYXR0ck5hbWVJbmRleCA9IDA7XG4gICAgY29uc3QgcGFydENvdW50ID0gc3RyaW5ncy5sZW5ndGggLSAxO1xuICAgIGNvbnN0IHBhcnRzID0gdGhpcy5wYXJ0cztcblxuICAgIC8vIENyZWF0ZSB0ZW1wbGF0ZSBlbGVtZW50XG4gICAgY29uc3QgW2h0bWwsIGF0dHJOYW1lc10gPSBnZXRUZW1wbGF0ZUh0bWwoc3RyaW5ncywgdHlwZSk7XG4gICAgdGhpcy5lbCA9IFRlbXBsYXRlLmNyZWF0ZUVsZW1lbnQoaHRtbCwgb3B0aW9ucyk7XG4gICAgd2Fsa2VyLmN1cnJlbnROb2RlID0gdGhpcy5lbC5jb250ZW50O1xuXG4gICAgLy8gUmUtcGFyZW50IFNWRyBvciBNYXRoTUwgbm9kZXMgaW50byB0ZW1wbGF0ZSByb290XG4gICAgaWYgKHR5cGUgPT09IFNWR19SRVNVTFQgfHwgdHlwZSA9PT0gTUFUSE1MX1JFU1VMVCkge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IHRoaXMuZWwuY29udGVudC5maXJzdENoaWxkITtcbiAgICAgIHdyYXBwZXIucmVwbGFjZVdpdGgoLi4ud3JhcHBlci5jaGlsZE5vZGVzKTtcbiAgICB9XG5cbiAgICAvLyBXYWxrIHRoZSB0ZW1wbGF0ZSB0byBmaW5kIGJpbmRpbmcgbWFya2VycyBhbmQgY3JlYXRlIFRlbXBsYXRlUGFydHNcbiAgICB3aGlsZSAoKG5vZGUgPSB3YWxrZXIubmV4dE5vZGUoKSkgIT09IG51bGwgJiYgcGFydHMubGVuZ3RoIDwgcGFydENvdW50KSB7XG4gICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICBpZiAoREVWX01PREUpIHtcbiAgICAgICAgICBjb25zdCB0YWcgPSAobm9kZSBhcyBFbGVtZW50KS5sb2NhbE5hbWU7XG4gICAgICAgICAgLy8gV2FybiBpZiBgdGV4dGFyZWFgIGluY2x1ZGVzIGFuIGV4cHJlc3Npb24gYW5kIHRocm93IGlmIGB0ZW1wbGF0ZWBcbiAgICAgICAgICAvLyBkb2VzIHNpbmNlIHRoZXNlIGFyZSBub3Qgc3VwcG9ydGVkLiBXZSBkbyB0aGlzIGJ5IGNoZWNraW5nXG4gICAgICAgICAgLy8gaW5uZXJIVE1MIGZvciBhbnl0aGluZyB0aGF0IGxvb2tzIGxpa2UgYSBtYXJrZXIuIFRoaXMgY2F0Y2hlc1xuICAgICAgICAgIC8vIGNhc2VzIGxpa2UgYmluZGluZ3MgaW4gdGV4dGFyZWEgdGhlcmUgbWFya2VycyB0dXJuIGludG8gdGV4dCBub2Rlcy5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAvXig/OnRleHRhcmVhfHRlbXBsYXRlKSQvaSEudGVzdCh0YWcpICYmXG4gICAgICAgICAgICAobm9kZSBhcyBFbGVtZW50KS5pbm5lckhUTUwuaW5jbHVkZXMobWFya2VyKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY29uc3QgbSA9XG4gICAgICAgICAgICAgIGBFeHByZXNzaW9ucyBhcmUgbm90IHN1cHBvcnRlZCBpbnNpZGUgXFxgJHt0YWd9XFxgIGAgK1xuICAgICAgICAgICAgICBgZWxlbWVudHMuIFNlZSBodHRwczovL2xpdC5kZXYvbXNnL2V4cHJlc3Npb24taW4tJHt0YWd9IGZvciBtb3JlIGAgK1xuICAgICAgICAgICAgICBgaW5mb3JtYXRpb24uYDtcbiAgICAgICAgICAgIGlmICh0YWcgPT09ICd0ZW1wbGF0ZScpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG0pO1xuICAgICAgICAgICAgfSBlbHNlIGlzc3VlV2FybmluZygnJywgbSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFRPRE8gKGp1c3RpbmZhZ25hbmkpOiBmb3IgYXR0ZW1wdGVkIGR5bmFtaWMgdGFnIG5hbWVzLCB3ZSBkb24ndFxuICAgICAgICAvLyBpbmNyZW1lbnQgdGhlIGJpbmRpbmdJbmRleCwgYW5kIGl0J2xsIGJlIG9mZiBieSAxIGluIHRoZSBlbGVtZW50XG4gICAgICAgIC8vIGFuZCBvZmYgYnkgdHdvIGFmdGVyIGl0LlxuICAgICAgICBpZiAoKG5vZGUgYXMgRWxlbWVudCkuaGFzQXR0cmlidXRlcygpKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIChub2RlIGFzIEVsZW1lbnQpLmdldEF0dHJpYnV0ZU5hbWVzKCkpIHtcbiAgICAgICAgICAgIGlmIChuYW1lLmVuZHNXaXRoKGJvdW5kQXR0cmlidXRlU3VmZml4KSkge1xuICAgICAgICAgICAgICBjb25zdCByZWFsTmFtZSA9IGF0dHJOYW1lc1thdHRyTmFtZUluZGV4KytdO1xuICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IChub2RlIGFzIEVsZW1lbnQpLmdldEF0dHJpYnV0ZShuYW1lKSE7XG4gICAgICAgICAgICAgIGNvbnN0IHN0YXRpY3MgPSB2YWx1ZS5zcGxpdChtYXJrZXIpO1xuICAgICAgICAgICAgICBjb25zdCBtID0gLyhbLj9AXSk/KC4qKS8uZXhlYyhyZWFsTmFtZSkhO1xuICAgICAgICAgICAgICBwYXJ0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBBVFRSSUJVVEVfUEFSVCxcbiAgICAgICAgICAgICAgICBpbmRleDogbm9kZUluZGV4LFxuICAgICAgICAgICAgICAgIG5hbWU6IG1bMl0sXG4gICAgICAgICAgICAgICAgc3RyaW5nczogc3RhdGljcyxcbiAgICAgICAgICAgICAgICBjdG9yOlxuICAgICAgICAgICAgICAgICAgbVsxXSA9PT0gJy4nXG4gICAgICAgICAgICAgICAgICAgID8gUHJvcGVydHlQYXJ0XG4gICAgICAgICAgICAgICAgICAgIDogbVsxXSA9PT0gJz8nXG4gICAgICAgICAgICAgICAgICAgICAgPyBCb29sZWFuQXR0cmlidXRlUGFydFxuICAgICAgICAgICAgICAgICAgICAgIDogbVsxXSA9PT0gJ0AnXG4gICAgICAgICAgICAgICAgICAgICAgICA/IEV2ZW50UGFydFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBBdHRyaWJ1dGVQYXJ0LFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgKG5vZGUgYXMgRWxlbWVudCkucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lLnN0YXJ0c1dpdGgobWFya2VyKSkge1xuICAgICAgICAgICAgICBwYXJ0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBFTEVNRU5UX1BBUlQsXG4gICAgICAgICAgICAgICAgaW5kZXg6IG5vZGVJbmRleCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIChub2RlIGFzIEVsZW1lbnQpLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gVE9ETyAoanVzdGluZmFnbmFuaSk6IGJlbmNobWFyayB0aGUgcmVnZXggYWdhaW5zdCB0ZXN0aW5nIGZvciBlYWNoXG4gICAgICAgIC8vIG9mIHRoZSAzIHJhdyB0ZXh0IGVsZW1lbnQgbmFtZXMuXG4gICAgICAgIGlmIChyYXdUZXh0RWxlbWVudC50ZXN0KChub2RlIGFzIEVsZW1lbnQpLnRhZ05hbWUpKSB7XG4gICAgICAgICAgLy8gRm9yIHJhdyB0ZXh0IGVsZW1lbnRzIHdlIG5lZWQgdG8gc3BsaXQgdGhlIHRleHQgY29udGVudCBvblxuICAgICAgICAgIC8vIG1hcmtlcnMsIGNyZWF0ZSBhIFRleHQgbm9kZSBmb3IgZWFjaCBzZWdtZW50LCBhbmQgY3JlYXRlXG4gICAgICAgICAgLy8gYSBUZW1wbGF0ZVBhcnQgZm9yIGVhY2ggbWFya2VyLlxuICAgICAgICAgIGNvbnN0IHN0cmluZ3MgPSAobm9kZSBhcyBFbGVtZW50KS50ZXh0Q29udGVudCEuc3BsaXQobWFya2VyKTtcbiAgICAgICAgICBjb25zdCBsYXN0SW5kZXggPSBzdHJpbmdzLmxlbmd0aCAtIDE7XG4gICAgICAgICAgaWYgKGxhc3RJbmRleCA+IDApIHtcbiAgICAgICAgICAgIChub2RlIGFzIEVsZW1lbnQpLnRleHRDb250ZW50ID0gdHJ1c3RlZFR5cGVzXG4gICAgICAgICAgICAgID8gKHRydXN0ZWRUeXBlcy5lbXB0eVNjcmlwdCBhcyB1bmtub3duIGFzICcnKVxuICAgICAgICAgICAgICA6ICcnO1xuICAgICAgICAgICAgLy8gR2VuZXJhdGUgYSBuZXcgdGV4dCBub2RlIGZvciBlYWNoIGxpdGVyYWwgc2VjdGlvblxuICAgICAgICAgICAgLy8gVGhlc2Ugbm9kZXMgYXJlIGFsc28gdXNlZCBhcyB0aGUgbWFya2VycyBmb3IgY2hpbGQgcGFydHNcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGFzdEluZGV4OyBpKyspIHtcbiAgICAgICAgICAgICAgKG5vZGUgYXMgRWxlbWVudCkuYXBwZW5kKHN0cmluZ3NbaV0sIGNyZWF0ZU1hcmtlcigpKTtcbiAgICAgICAgICAgICAgLy8gV2FsayBwYXN0IHRoZSBtYXJrZXIgbm9kZSB3ZSBqdXN0IGFkZGVkXG4gICAgICAgICAgICAgIHdhbGtlci5uZXh0Tm9kZSgpO1xuICAgICAgICAgICAgICBwYXJ0cy5wdXNoKHt0eXBlOiBDSElMRF9QQVJULCBpbmRleDogKytub2RlSW5kZXh9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIE5vdGUgYmVjYXVzZSB0aGlzIG1hcmtlciBpcyBhZGRlZCBhZnRlciB0aGUgd2Fsa2VyJ3MgY3VycmVudFxuICAgICAgICAgICAgLy8gbm9kZSwgaXQgd2lsbCBiZSB3YWxrZWQgdG8gaW4gdGhlIG91dGVyIGxvb3AgKGFuZCBpZ25vcmVkKSwgc29cbiAgICAgICAgICAgIC8vIHdlIGRvbid0IG5lZWQgdG8gYWRqdXN0IG5vZGVJbmRleCBoZXJlXG4gICAgICAgICAgICAobm9kZSBhcyBFbGVtZW50KS5hcHBlbmQoc3RyaW5nc1tsYXN0SW5kZXhdLCBjcmVhdGVNYXJrZXIoKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG5vZGUubm9kZVR5cGUgPT09IDgpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IChub2RlIGFzIENvbW1lbnQpLmRhdGE7XG4gICAgICAgIGlmIChkYXRhID09PSBtYXJrZXJNYXRjaCkge1xuICAgICAgICAgIHBhcnRzLnB1c2goe3R5cGU6IENISUxEX1BBUlQsIGluZGV4OiBub2RlSW5kZXh9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsZXQgaSA9IC0xO1xuICAgICAgICAgIHdoaWxlICgoaSA9IChub2RlIGFzIENvbW1lbnQpLmRhdGEuaW5kZXhPZihtYXJrZXIsIGkgKyAxKSkgIT09IC0xKSB7XG4gICAgICAgICAgICAvLyBDb21tZW50IG5vZGUgaGFzIGEgYmluZGluZyBtYXJrZXIgaW5zaWRlLCBtYWtlIGFuIGluYWN0aXZlIHBhcnRcbiAgICAgICAgICAgIC8vIFRoZSBiaW5kaW5nIHdvbid0IHdvcmssIGJ1dCBzdWJzZXF1ZW50IGJpbmRpbmdzIHdpbGxcbiAgICAgICAgICAgIHBhcnRzLnB1c2goe3R5cGU6IENPTU1FTlRfUEFSVCwgaW5kZXg6IG5vZGVJbmRleH0pO1xuICAgICAgICAgICAgLy8gTW92ZSB0byB0aGUgZW5kIG9mIHRoZSBtYXRjaFxuICAgICAgICAgICAgaSArPSBtYXJrZXIubGVuZ3RoIC0gMTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG5vZGVJbmRleCsrO1xuICAgIH1cblxuICAgIGlmIChERVZfTU9ERSkge1xuICAgICAgLy8gSWYgdGhlcmUgd2FzIGEgZHVwbGljYXRlIGF0dHJpYnV0ZSBvbiBhIHRhZywgdGhlbiB3aGVuIHRoZSB0YWcgaXNcbiAgICAgIC8vIHBhcnNlZCBpbnRvIGFuIGVsZW1lbnQgdGhlIGF0dHJpYnV0ZSBnZXRzIGRlLWR1cGxpY2F0ZWQuIFdlIGNhbiBkZXRlY3RcbiAgICAgIC8vIHRoaXMgbWlzbWF0Y2ggaWYgd2UgaGF2ZW4ndCBwcmVjaXNlbHkgY29uc3VtZWQgZXZlcnkgYXR0cmlidXRlIG5hbWVcbiAgICAgIC8vIHdoZW4gcHJlcGFyaW5nIHRoZSB0ZW1wbGF0ZS4gVGhpcyB3b3JrcyBiZWNhdXNlIGBhdHRyTmFtZXNgIGlzIGJ1aWx0XG4gICAgICAvLyBmcm9tIHRoZSB0ZW1wbGF0ZSBzdHJpbmcgYW5kIGBhdHRyTmFtZUluZGV4YCBjb21lcyBmcm9tIHByb2Nlc3NpbmcgdGhlXG4gICAgICAvLyByZXN1bHRpbmcgRE9NLlxuICAgICAgaWYgKGF0dHJOYW1lcy5sZW5ndGggIT09IGF0dHJOYW1lSW5kZXgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBEZXRlY3RlZCBkdXBsaWNhdGUgYXR0cmlidXRlIGJpbmRpbmdzLiBUaGlzIG9jY3VycyBpZiB5b3VyIHRlbXBsYXRlIGAgK1xuICAgICAgICAgICAgYGhhcyBkdXBsaWNhdGUgYXR0cmlidXRlcyBvbiBhbiBlbGVtZW50IHRhZy4gRm9yIGV4YW1wbGUgYCArXG4gICAgICAgICAgICBgXCI8aW5wdXQgP2Rpc2FibGVkPVxcJHt0cnVlfSA/ZGlzYWJsZWQ9XFwke2ZhbHNlfT5cIiBjb250YWlucyBhIGAgK1xuICAgICAgICAgICAgYGR1cGxpY2F0ZSBcImRpc2FibGVkXCIgYXR0cmlidXRlLiBUaGUgZXJyb3Igd2FzIGRldGVjdGVkIGluIGAgK1xuICAgICAgICAgICAgYHRoZSBmb2xsb3dpbmcgdGVtcGxhdGU6IFxcbmAgK1xuICAgICAgICAgICAgJ2AnICtcbiAgICAgICAgICAgIHN0cmluZ3Muam9pbignJHsuLi59JykgK1xuICAgICAgICAgICAgJ2AnXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gV2UgY291bGQgc2V0IHdhbGtlci5jdXJyZW50Tm9kZSB0byBhbm90aGVyIG5vZGUgaGVyZSB0byBwcmV2ZW50IGEgbWVtb3J5XG4gICAgLy8gbGVhaywgYnV0IGV2ZXJ5IHRpbWUgd2UgcHJlcGFyZSBhIHRlbXBsYXRlLCB3ZSBpbW1lZGlhdGVseSByZW5kZXIgaXRcbiAgICAvLyBhbmQgcmUtdXNlIHRoZSB3YWxrZXIgaW4gbmV3IFRlbXBsYXRlSW5zdGFuY2UuX2Nsb25lKCkuXG4gICAgZGVidWdMb2dFdmVudCAmJlxuICAgICAgZGVidWdMb2dFdmVudCh7XG4gICAgICAgIGtpbmQ6ICd0ZW1wbGF0ZSBwcmVwJyxcbiAgICAgICAgdGVtcGxhdGU6IHRoaXMsXG4gICAgICAgIGNsb25hYmxlVGVtcGxhdGU6IHRoaXMuZWwsXG4gICAgICAgIHBhcnRzOiB0aGlzLnBhcnRzLFxuICAgICAgICBzdHJpbmdzLFxuICAgICAgfSk7XG4gIH1cblxuICAvLyBPdmVycmlkZGVuIHZpYSBgbGl0SHRtbFBvbHlmaWxsU3VwcG9ydGAgdG8gcHJvdmlkZSBwbGF0Zm9ybSBzdXBwb3J0LlxuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGNyZWF0ZUVsZW1lbnQoaHRtbDogVHJ1c3RlZEhUTUwsIF9vcHRpb25zPzogUmVuZGVyT3B0aW9ucykge1xuICAgIGNvbnN0IGVsID0gZC5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpO1xuICAgIGVsLmlubmVySFRNTCA9IGh0bWwgYXMgdW5rbm93biBhcyBzdHJpbmc7XG4gICAgcmV0dXJuIGVsO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGlzY29ubmVjdGFibGUge1xuICBfJHBhcmVudD86IERpc2Nvbm5lY3RhYmxlO1xuICBfJGRpc2Nvbm5lY3RhYmxlQ2hpbGRyZW4/OiBTZXQ8RGlzY29ubmVjdGFibGU+O1xuICAvLyBSYXRoZXIgdGhhbiBob2xkIGNvbm5lY3Rpb24gc3RhdGUgb24gaW5zdGFuY2VzLCBEaXNjb25uZWN0YWJsZXMgcmVjdXJzaXZlbHlcbiAgLy8gZmV0Y2ggdGhlIGNvbm5lY3Rpb24gc3RhdGUgZnJvbSB0aGUgUm9vdFBhcnQgdGhleSBhcmUgY29ubmVjdGVkIGluIHZpYVxuICAvLyBnZXR0ZXJzIHVwIHRoZSBEaXNjb25uZWN0YWJsZSB0cmVlIHZpYSBfJHBhcmVudCByZWZlcmVuY2VzLiBUaGlzIHB1c2hlcyB0aGVcbiAgLy8gY29zdCBvZiB0cmFja2luZyB0aGUgaXNDb25uZWN0ZWQgc3RhdGUgdG8gYEFzeW5jRGlyZWN0aXZlc2AsIGFuZCBhdm9pZHNcbiAgLy8gbmVlZGluZyB0byBwYXNzIGFsbCBEaXNjb25uZWN0YWJsZXMgKHBhcnRzLCB0ZW1wbGF0ZSBpbnN0YW5jZXMsIGFuZFxuICAvLyBkaXJlY3RpdmVzKSB0aGVpciBjb25uZWN0aW9uIHN0YXRlIGVhY2ggdGltZSBpdCBjaGFuZ2VzLCB3aGljaCB3b3VsZCBiZVxuICAvLyBjb3N0bHkgZm9yIHRyZWVzIHRoYXQgaGF2ZSBubyBBc3luY0RpcmVjdGl2ZXMuXG4gIF8kaXNDb25uZWN0ZWQ6IGJvb2xlYW47XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVEaXJlY3RpdmUoXG4gIHBhcnQ6IENoaWxkUGFydCB8IEF0dHJpYnV0ZVBhcnQgfCBFbGVtZW50UGFydCxcbiAgdmFsdWU6IHVua25vd24sXG4gIHBhcmVudDogRGlyZWN0aXZlUGFyZW50ID0gcGFydCxcbiAgYXR0cmlidXRlSW5kZXg/OiBudW1iZXJcbik6IHVua25vd24ge1xuICAvLyBCYWlsIGVhcmx5IGlmIHRoZSB2YWx1ZSBpcyBleHBsaWNpdGx5IG5vQ2hhbmdlLiBOb3RlLCB0aGlzIG1lYW5zIGFueVxuICAvLyBuZXN0ZWQgZGlyZWN0aXZlIGlzIHN0aWxsIGF0dGFjaGVkIGFuZCBpcyBub3QgcnVuLlxuICBpZiAodmFsdWUgPT09IG5vQ2hhbmdlKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGxldCBjdXJyZW50RGlyZWN0aXZlID1cbiAgICBhdHRyaWJ1dGVJbmRleCAhPT0gdW5kZWZpbmVkXG4gICAgICA/IChwYXJlbnQgYXMgQXR0cmlidXRlUGFydCkuX19kaXJlY3RpdmVzPy5bYXR0cmlidXRlSW5kZXhdXG4gICAgICA6IChwYXJlbnQgYXMgQ2hpbGRQYXJ0IHwgRWxlbWVudFBhcnQgfCBEaXJlY3RpdmUpLl9fZGlyZWN0aXZlO1xuICBjb25zdCBuZXh0RGlyZWN0aXZlQ29uc3RydWN0b3IgPSBpc1ByaW1pdGl2ZSh2YWx1ZSlcbiAgICA/IHVuZGVmaW5lZFxuICAgIDogLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgICAgICh2YWx1ZSBhcyBEaXJlY3RpdmVSZXN1bHQpWydfJGxpdERpcmVjdGl2ZSQnXTtcbiAgaWYgKGN1cnJlbnREaXJlY3RpdmU/LmNvbnN0cnVjdG9yICE9PSBuZXh0RGlyZWN0aXZlQ29uc3RydWN0b3IpIHtcbiAgICAvLyBUaGlzIHByb3BlcnR5IG5lZWRzIHRvIHJlbWFpbiB1bm1pbmlmaWVkLlxuICAgIGN1cnJlbnREaXJlY3RpdmU/LlsnXyRub3RpZnlEaXJlY3RpdmVDb25uZWN0aW9uQ2hhbmdlZCddPy4oZmFsc2UpO1xuICAgIGlmIChuZXh0RGlyZWN0aXZlQ29uc3RydWN0b3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY3VycmVudERpcmVjdGl2ZSA9IHVuZGVmaW5lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgY3VycmVudERpcmVjdGl2ZSA9IG5ldyBuZXh0RGlyZWN0aXZlQ29uc3RydWN0b3IocGFydCBhcyBQYXJ0SW5mbyk7XG4gICAgICBjdXJyZW50RGlyZWN0aXZlLl8kaW5pdGlhbGl6ZShwYXJ0LCBwYXJlbnQsIGF0dHJpYnV0ZUluZGV4KTtcbiAgICB9XG4gICAgaWYgKGF0dHJpYnV0ZUluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICgocGFyZW50IGFzIEF0dHJpYnV0ZVBhcnQpLl9fZGlyZWN0aXZlcyA/Pz0gW10pW2F0dHJpYnV0ZUluZGV4XSA9XG4gICAgICAgIGN1cnJlbnREaXJlY3RpdmU7XG4gICAgfSBlbHNlIHtcbiAgICAgIChwYXJlbnQgYXMgQ2hpbGRQYXJ0IHwgRGlyZWN0aXZlKS5fX2RpcmVjdGl2ZSA9IGN1cnJlbnREaXJlY3RpdmU7XG4gICAgfVxuICB9XG4gIGlmIChjdXJyZW50RGlyZWN0aXZlICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YWx1ZSA9IHJlc29sdmVEaXJlY3RpdmUoXG4gICAgICBwYXJ0LFxuICAgICAgY3VycmVudERpcmVjdGl2ZS5fJHJlc29sdmUocGFydCwgKHZhbHVlIGFzIERpcmVjdGl2ZVJlc3VsdCkudmFsdWVzKSxcbiAgICAgIGN1cnJlbnREaXJlY3RpdmUsXG4gICAgICBhdHRyaWJ1dGVJbmRleFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5leHBvcnQgdHlwZSB7VGVtcGxhdGVJbnN0YW5jZX07XG4vKipcbiAqIEFuIHVwZGF0ZWFibGUgaW5zdGFuY2Ugb2YgYSBUZW1wbGF0ZS4gSG9sZHMgcmVmZXJlbmNlcyB0byB0aGUgUGFydHMgdXNlZCB0b1xuICogdXBkYXRlIHRoZSB0ZW1wbGF0ZSBpbnN0YW5jZS5cbiAqL1xuY2xhc3MgVGVtcGxhdGVJbnN0YW5jZSBpbXBsZW1lbnRzIERpc2Nvbm5lY3RhYmxlIHtcbiAgXyR0ZW1wbGF0ZTogVGVtcGxhdGU7XG4gIF8kcGFydHM6IEFycmF5PFBhcnQgfCB1bmRlZmluZWQ+ID0gW107XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfJHBhcmVudDogQ2hpbGRQYXJ0O1xuICAvKiogQGludGVybmFsICovXG4gIF8kZGlzY29ubmVjdGFibGVDaGlsZHJlbj86IFNldDxEaXNjb25uZWN0YWJsZT4gPSB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IodGVtcGxhdGU6IFRlbXBsYXRlLCBwYXJlbnQ6IENoaWxkUGFydCkge1xuICAgIHRoaXMuXyR0ZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgIHRoaXMuXyRwYXJlbnQgPSBwYXJlbnQ7XG4gIH1cblxuICAvLyBDYWxsZWQgYnkgQ2hpbGRQYXJ0IHBhcmVudE5vZGUgZ2V0dGVyXG4gIGdldCBwYXJlbnROb2RlKCkge1xuICAgIHJldHVybiB0aGlzLl8kcGFyZW50LnBhcmVudE5vZGU7XG4gIH1cblxuICAvLyBTZWUgY29tbWVudCBpbiBEaXNjb25uZWN0YWJsZSBpbnRlcmZhY2UgZm9yIHdoeSB0aGlzIGlzIGEgZ2V0dGVyXG4gIGdldCBfJGlzQ29ubmVjdGVkKCkge1xuICAgIHJldHVybiB0aGlzLl8kcGFyZW50Ll8kaXNDb25uZWN0ZWQ7XG4gIH1cblxuICAvLyBUaGlzIG1ldGhvZCBpcyBzZXBhcmF0ZSBmcm9tIHRoZSBjb25zdHJ1Y3RvciBiZWNhdXNlIHdlIG5lZWQgdG8gcmV0dXJuIGFcbiAgLy8gRG9jdW1lbnRGcmFnbWVudCBhbmQgd2UgZG9uJ3Qgd2FudCB0byBob2xkIG9udG8gaXQgd2l0aCBhbiBpbnN0YW5jZSBmaWVsZC5cbiAgX2Nsb25lKG9wdGlvbnM6IFJlbmRlck9wdGlvbnMgfCB1bmRlZmluZWQpIHtcbiAgICBjb25zdCB7XG4gICAgICBlbDoge2NvbnRlbnR9LFxuICAgICAgcGFydHM6IHBhcnRzLFxuICAgIH0gPSB0aGlzLl8kdGVtcGxhdGU7XG4gICAgY29uc3QgZnJhZ21lbnQgPSAob3B0aW9ucz8uY3JlYXRpb25TY29wZSA/PyBkKS5pbXBvcnROb2RlKGNvbnRlbnQsIHRydWUpO1xuICAgIHdhbGtlci5jdXJyZW50Tm9kZSA9IGZyYWdtZW50O1xuXG4gICAgbGV0IG5vZGUgPSB3YWxrZXIubmV4dE5vZGUoKSE7XG4gICAgbGV0IG5vZGVJbmRleCA9IDA7XG4gICAgbGV0IHBhcnRJbmRleCA9IDA7XG4gICAgbGV0IHRlbXBsYXRlUGFydCA9IHBhcnRzWzBdO1xuXG4gICAgd2hpbGUgKHRlbXBsYXRlUGFydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAobm9kZUluZGV4ID09PSB0ZW1wbGF0ZVBhcnQuaW5kZXgpIHtcbiAgICAgICAgbGV0IHBhcnQ6IFBhcnQgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh0ZW1wbGF0ZVBhcnQudHlwZSA9PT0gQ0hJTERfUEFSVCkge1xuICAgICAgICAgIHBhcnQgPSBuZXcgQ2hpbGRQYXJ0KFxuICAgICAgICAgICAgbm9kZSBhcyBIVE1MRWxlbWVudCxcbiAgICAgICAgICAgIG5vZGUubmV4dFNpYmxpbmcsXG4gICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgb3B0aW9uc1xuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAodGVtcGxhdGVQYXJ0LnR5cGUgPT09IEFUVFJJQlVURV9QQVJUKSB7XG4gICAgICAgICAgcGFydCA9IG5ldyB0ZW1wbGF0ZVBhcnQuY3RvcihcbiAgICAgICAgICAgIG5vZGUgYXMgSFRNTEVsZW1lbnQsXG4gICAgICAgICAgICB0ZW1wbGF0ZVBhcnQubmFtZSxcbiAgICAgICAgICAgIHRlbXBsYXRlUGFydC5zdHJpbmdzLFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHRlbXBsYXRlUGFydC50eXBlID09PSBFTEVNRU5UX1BBUlQpIHtcbiAgICAgICAgICBwYXJ0ID0gbmV3IEVsZW1lbnRQYXJ0KG5vZGUgYXMgSFRNTEVsZW1lbnQsIHRoaXMsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuXyRwYXJ0cy5wdXNoKHBhcnQpO1xuICAgICAgICB0ZW1wbGF0ZVBhcnQgPSBwYXJ0c1srK3BhcnRJbmRleF07XG4gICAgICB9XG4gICAgICBpZiAobm9kZUluZGV4ICE9PSB0ZW1wbGF0ZVBhcnQ/LmluZGV4KSB7XG4gICAgICAgIG5vZGUgPSB3YWxrZXIubmV4dE5vZGUoKSE7XG4gICAgICAgIG5vZGVJbmRleCsrO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBXZSBuZWVkIHRvIHNldCB0aGUgY3VycmVudE5vZGUgYXdheSBmcm9tIHRoZSBjbG9uZWQgdHJlZSBzbyB0aGF0IHdlXG4gICAgLy8gZG9uJ3QgaG9sZCBvbnRvIHRoZSB0cmVlIGV2ZW4gaWYgdGhlIHRyZWUgaXMgZGV0YWNoZWQgYW5kIHNob3VsZCBiZVxuICAgIC8vIGZyZWVkLlxuICAgIHdhbGtlci5jdXJyZW50Tm9kZSA9IGQ7XG4gICAgcmV0dXJuIGZyYWdtZW50O1xuICB9XG5cbiAgX3VwZGF0ZSh2YWx1ZXM6IEFycmF5PHVua25vd24+KSB7XG4gICAgbGV0IGkgPSAwO1xuICAgIGZvciAoY29uc3QgcGFydCBvZiB0aGlzLl8kcGFydHMpIHtcbiAgICAgIGlmIChwYXJ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZGVidWdMb2dFdmVudCAmJlxuICAgICAgICAgIGRlYnVnTG9nRXZlbnQoe1xuICAgICAgICAgICAga2luZDogJ3NldCBwYXJ0JyxcbiAgICAgICAgICAgIHBhcnQsXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWVzW2ldLFxuICAgICAgICAgICAgdmFsdWVJbmRleDogaSxcbiAgICAgICAgICAgIHZhbHVlcyxcbiAgICAgICAgICAgIHRlbXBsYXRlSW5zdGFuY2U6IHRoaXMsXG4gICAgICAgICAgfSk7XG4gICAgICAgIGlmICgocGFydCBhcyBBdHRyaWJ1dGVQYXJ0KS5zdHJpbmdzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAocGFydCBhcyBBdHRyaWJ1dGVQYXJ0KS5fJHNldFZhbHVlKHZhbHVlcywgcGFydCBhcyBBdHRyaWJ1dGVQYXJ0LCBpKTtcbiAgICAgICAgICAvLyBUaGUgbnVtYmVyIG9mIHZhbHVlcyB0aGUgcGFydCBjb25zdW1lcyBpcyBwYXJ0LnN0cmluZ3MubGVuZ3RoIC0gMVxuICAgICAgICAgIC8vIHNpbmNlIHZhbHVlcyBhcmUgaW4gYmV0d2VlbiB0ZW1wbGF0ZSBzcGFucy4gV2UgaW5jcmVtZW50IGkgYnkgMVxuICAgICAgICAgIC8vIGxhdGVyIGluIHRoZSBsb29wLCBzbyBpbmNyZW1lbnQgaXQgYnkgcGFydC5zdHJpbmdzLmxlbmd0aCAtIDIgaGVyZVxuICAgICAgICAgIGkgKz0gKHBhcnQgYXMgQXR0cmlidXRlUGFydCkuc3RyaW5ncyEubGVuZ3RoIC0gMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwYXJ0Ll8kc2V0VmFsdWUodmFsdWVzW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaSsrO1xuICAgIH1cbiAgfVxufVxuXG4vKlxuICogUGFydHNcbiAqL1xudHlwZSBBdHRyaWJ1dGVUZW1wbGF0ZVBhcnQgPSB7XG4gIHJlYWRvbmx5IHR5cGU6IHR5cGVvZiBBVFRSSUJVVEVfUEFSVDtcbiAgcmVhZG9ubHkgaW5kZXg6IG51bWJlcjtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSBjdG9yOiB0eXBlb2YgQXR0cmlidXRlUGFydDtcbiAgcmVhZG9ubHkgc3RyaW5nczogUmVhZG9ubHlBcnJheTxzdHJpbmc+O1xufTtcbnR5cGUgQ2hpbGRUZW1wbGF0ZVBhcnQgPSB7XG4gIHJlYWRvbmx5IHR5cGU6IHR5cGVvZiBDSElMRF9QQVJUO1xuICByZWFkb25seSBpbmRleDogbnVtYmVyO1xufTtcbnR5cGUgRWxlbWVudFRlbXBsYXRlUGFydCA9IHtcbiAgcmVhZG9ubHkgdHlwZTogdHlwZW9mIEVMRU1FTlRfUEFSVDtcbiAgcmVhZG9ubHkgaW5kZXg6IG51bWJlcjtcbn07XG50eXBlIENvbW1lbnRUZW1wbGF0ZVBhcnQgPSB7XG4gIHJlYWRvbmx5IHR5cGU6IHR5cGVvZiBDT01NRU5UX1BBUlQ7XG4gIHJlYWRvbmx5IGluZGV4OiBudW1iZXI7XG59O1xuXG4vKipcbiAqIEEgVGVtcGxhdGVQYXJ0IHJlcHJlc2VudHMgYSBkeW5hbWljIHBhcnQgaW4gYSB0ZW1wbGF0ZSwgYmVmb3JlIHRoZSB0ZW1wbGF0ZVxuICogaXMgaW5zdGFudGlhdGVkLiBXaGVuIGEgdGVtcGxhdGUgaXMgaW5zdGFudGlhdGVkIFBhcnRzIGFyZSBjcmVhdGVkIGZyb21cbiAqIFRlbXBsYXRlUGFydHMuXG4gKi9cbnR5cGUgVGVtcGxhdGVQYXJ0ID1cbiAgfCBDaGlsZFRlbXBsYXRlUGFydFxuICB8IEF0dHJpYnV0ZVRlbXBsYXRlUGFydFxuICB8IEVsZW1lbnRUZW1wbGF0ZVBhcnRcbiAgfCBDb21tZW50VGVtcGxhdGVQYXJ0O1xuXG5leHBvcnQgdHlwZSBQYXJ0ID1cbiAgfCBDaGlsZFBhcnRcbiAgfCBBdHRyaWJ1dGVQYXJ0XG4gIHwgUHJvcGVydHlQYXJ0XG4gIHwgQm9vbGVhbkF0dHJpYnV0ZVBhcnRcbiAgfCBFbGVtZW50UGFydFxuICB8IEV2ZW50UGFydDtcblxuZXhwb3J0IHR5cGUge0NoaWxkUGFydH07XG5jbGFzcyBDaGlsZFBhcnQgaW1wbGVtZW50cyBEaXNjb25uZWN0YWJsZSB7XG4gIHJlYWRvbmx5IHR5cGUgPSBDSElMRF9QQVJUO1xuICByZWFkb25seSBvcHRpb25zOiBSZW5kZXJPcHRpb25zIHwgdW5kZWZpbmVkO1xuICBfJGNvbW1pdHRlZFZhbHVlOiB1bmtub3duID0gbm90aGluZztcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfX2RpcmVjdGl2ZT86IERpcmVjdGl2ZTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfJHN0YXJ0Tm9kZTogQ2hpbGROb2RlO1xuICAvKiogQGludGVybmFsICovXG4gIF8kZW5kTm9kZTogQ2hpbGROb2RlIHwgbnVsbDtcbiAgcHJpdmF0ZSBfdGV4dFNhbml0aXplcjogVmFsdWVTYW5pdGl6ZXIgfCB1bmRlZmluZWQ7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgXyRwYXJlbnQ6IERpc2Nvbm5lY3RhYmxlIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogQ29ubmVjdGlvbiBzdGF0ZSBmb3IgUm9vdFBhcnRzIG9ubHkgKGkuZS4gQ2hpbGRQYXJ0IHdpdGhvdXQgXyRwYXJlbnRcbiAgICogcmV0dXJuZWQgZnJvbSB0b3AtbGV2ZWwgYHJlbmRlcmApLiBUaGlzIGZpZWxkIGlzIHVudXNlZCBvdGhlcndpc2UuIFRoZVxuICAgKiBpbnRlbnRpb24gd291bGQgYmUgY2xlYXJlciBpZiB3ZSBtYWRlIGBSb290UGFydGAgYSBzdWJjbGFzcyBvZiBgQ2hpbGRQYXJ0YFxuICAgKiB3aXRoIHRoaXMgZmllbGQgKGFuZCBhIGRpZmZlcmVudCBfJGlzQ29ubmVjdGVkIGdldHRlciksIGJ1dCB0aGUgc3ViY2xhc3NcbiAgICogY2F1c2VkIGEgcGVyZiByZWdyZXNzaW9uLCBwb3NzaWJseSBkdWUgdG8gbWFraW5nIGNhbGwgc2l0ZXMgcG9seW1vcnBoaWMuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgX19pc0Nvbm5lY3RlZDogYm9vbGVhbjtcblxuICAvLyBTZWUgY29tbWVudCBpbiBEaXNjb25uZWN0YWJsZSBpbnRlcmZhY2UgZm9yIHdoeSB0aGlzIGlzIGEgZ2V0dGVyXG4gIGdldCBfJGlzQ29ubmVjdGVkKCkge1xuICAgIC8vIENoaWxkUGFydHMgdGhhdCBhcmUgbm90IGF0IHRoZSByb290IHNob3VsZCBhbHdheXMgYmUgY3JlYXRlZCB3aXRoIGFcbiAgICAvLyBwYXJlbnQ7IG9ubHkgUm9vdENoaWxkTm9kZSdzIHdvbid0LCBzbyB0aGV5IHJldHVybiB0aGUgbG9jYWwgaXNDb25uZWN0ZWRcbiAgICAvLyBzdGF0ZVxuICAgIHJldHVybiB0aGlzLl8kcGFyZW50Py5fJGlzQ29ubmVjdGVkID8/IHRoaXMuX19pc0Nvbm5lY3RlZDtcbiAgfVxuXG4gIC8vIFRoZSBmb2xsb3dpbmcgZmllbGRzIHdpbGwgYmUgcGF0Y2hlZCBvbnRvIENoaWxkUGFydHMgd2hlbiByZXF1aXJlZCBieVxuICAvLyBBc3luY0RpcmVjdGl2ZVxuICAvKiogQGludGVybmFsICovXG4gIF8kZGlzY29ubmVjdGFibGVDaGlsZHJlbj86IFNldDxEaXNjb25uZWN0YWJsZT4gPSB1bmRlZmluZWQ7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgXyRub3RpZnlDb25uZWN0aW9uQ2hhbmdlZD8oXG4gICAgaXNDb25uZWN0ZWQ6IGJvb2xlYW4sXG4gICAgcmVtb3ZlRnJvbVBhcmVudD86IGJvb2xlYW4sXG4gICAgZnJvbT86IG51bWJlclxuICApOiB2b2lkO1xuICAvKiogQGludGVybmFsICovXG4gIF8kcmVwYXJlbnREaXNjb25uZWN0YWJsZXM/KHBhcmVudDogRGlzY29ubmVjdGFibGUpOiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHN0YXJ0Tm9kZTogQ2hpbGROb2RlLFxuICAgIGVuZE5vZGU6IENoaWxkTm9kZSB8IG51bGwsXG4gICAgcGFyZW50OiBUZW1wbGF0ZUluc3RhbmNlIHwgQ2hpbGRQYXJ0IHwgdW5kZWZpbmVkLFxuICAgIG9wdGlvbnM6IFJlbmRlck9wdGlvbnMgfCB1bmRlZmluZWRcbiAgKSB7XG4gICAgdGhpcy5fJHN0YXJ0Tm9kZSA9IHN0YXJ0Tm9kZTtcbiAgICB0aGlzLl8kZW5kTm9kZSA9IGVuZE5vZGU7XG4gICAgdGhpcy5fJHBhcmVudCA9IHBhcmVudDtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIC8vIE5vdGUgX19pc0Nvbm5lY3RlZCBpcyBvbmx5IGV2ZXIgYWNjZXNzZWQgb24gUm9vdFBhcnRzIChpLmUuIHdoZW4gdGhlcmUgaXNcbiAgICAvLyBubyBfJHBhcmVudCk7IHRoZSB2YWx1ZSBvbiBhIG5vbi1yb290LXBhcnQgaXMgXCJkb24ndCBjYXJlXCIsIGJ1dCBjaGVja2luZ1xuICAgIC8vIGZvciBwYXJlbnQgd291bGQgYmUgbW9yZSBjb2RlXG4gICAgdGhpcy5fX2lzQ29ubmVjdGVkID0gb3B0aW9ucz8uaXNDb25uZWN0ZWQgPz8gdHJ1ZTtcbiAgICBpZiAoRU5BQkxFX0VYVFJBX1NFQ1VSSVRZX0hPT0tTKSB7XG4gICAgICAvLyBFeHBsaWNpdGx5IGluaXRpYWxpemUgZm9yIGNvbnNpc3RlbnQgY2xhc3Mgc2hhcGUuXG4gICAgICB0aGlzLl90ZXh0U2FuaXRpemVyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcGFyZW50IG5vZGUgaW50byB3aGljaCB0aGUgcGFydCByZW5kZXJzIGl0cyBjb250ZW50LlxuICAgKlxuICAgKiBBIENoaWxkUGFydCdzIGNvbnRlbnQgY29uc2lzdHMgb2YgYSByYW5nZSBvZiBhZGphY2VudCBjaGlsZCBub2RlcyBvZlxuICAgKiBgLnBhcmVudE5vZGVgLCBwb3NzaWJseSBib3JkZXJlZCBieSAnbWFya2VyIG5vZGVzJyAoYC5zdGFydE5vZGVgIGFuZFxuICAgKiBgLmVuZE5vZGVgKS5cbiAgICpcbiAgICogLSBJZiBib3RoIGAuc3RhcnROb2RlYCBhbmQgYC5lbmROb2RlYCBhcmUgbm9uLW51bGwsIHRoZW4gdGhlIHBhcnQncyBjb250ZW50XG4gICAqIGNvbnNpc3RzIG9mIGFsbCBzaWJsaW5ncyBiZXR3ZWVuIGAuc3RhcnROb2RlYCBhbmQgYC5lbmROb2RlYCwgZXhjbHVzaXZlbHkuXG4gICAqXG4gICAqIC0gSWYgYC5zdGFydE5vZGVgIGlzIG5vbi1udWxsIGJ1dCBgLmVuZE5vZGVgIGlzIG51bGwsIHRoZW4gdGhlIHBhcnQnc1xuICAgKiBjb250ZW50IGNvbnNpc3RzIG9mIGFsbCBzaWJsaW5ncyBmb2xsb3dpbmcgYC5zdGFydE5vZGVgLCB1cCB0byBhbmRcbiAgICogaW5jbHVkaW5nIHRoZSBsYXN0IGNoaWxkIG9mIGAucGFyZW50Tm9kZWAuIElmIGAuZW5kTm9kZWAgaXMgbm9uLW51bGwsIHRoZW5cbiAgICogYC5zdGFydE5vZGVgIHdpbGwgYWx3YXlzIGJlIG5vbi1udWxsLlxuICAgKlxuICAgKiAtIElmIGJvdGggYC5lbmROb2RlYCBhbmQgYC5zdGFydE5vZGVgIGFyZSBudWxsLCB0aGVuIHRoZSBwYXJ0J3MgY29udGVudFxuICAgKiBjb25zaXN0cyBvZiBhbGwgY2hpbGQgbm9kZXMgb2YgYC5wYXJlbnROb2RlYC5cbiAgICovXG4gIGdldCBwYXJlbnROb2RlKCk6IE5vZGUge1xuICAgIGxldCBwYXJlbnROb2RlOiBOb2RlID0gd3JhcCh0aGlzLl8kc3RhcnROb2RlKS5wYXJlbnROb2RlITtcbiAgICBjb25zdCBwYXJlbnQgPSB0aGlzLl8kcGFyZW50O1xuICAgIGlmIChcbiAgICAgIHBhcmVudCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBwYXJlbnROb2RlPy5ub2RlVHlwZSA9PT0gMTEgLyogTm9kZS5ET0NVTUVOVF9GUkFHTUVOVCAqL1xuICAgICkge1xuICAgICAgLy8gSWYgdGhlIHBhcmVudE5vZGUgaXMgYSBEb2N1bWVudEZyYWdtZW50LCBpdCBtYXkgYmUgYmVjYXVzZSB0aGUgRE9NIGlzXG4gICAgICAvLyBzdGlsbCBpbiB0aGUgY2xvbmVkIGZyYWdtZW50IGR1cmluZyBpbml0aWFsIHJlbmRlcjsgaWYgc28sIGdldCB0aGUgcmVhbFxuICAgICAgLy8gcGFyZW50Tm9kZSB0aGUgcGFydCB3aWxsIGJlIGNvbW1pdHRlZCBpbnRvIGJ5IGFza2luZyB0aGUgcGFyZW50LlxuICAgICAgcGFyZW50Tm9kZSA9IChwYXJlbnQgYXMgQ2hpbGRQYXJ0IHwgVGVtcGxhdGVJbnN0YW5jZSkucGFyZW50Tm9kZTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcmVudE5vZGU7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBhcnQncyBsZWFkaW5nIG1hcmtlciBub2RlLCBpZiBhbnkuIFNlZSBgLnBhcmVudE5vZGVgIGZvciBtb3JlXG4gICAqIGluZm9ybWF0aW9uLlxuICAgKi9cbiAgZ2V0IHN0YXJ0Tm9kZSgpOiBOb2RlIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuXyRzdGFydE5vZGU7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBhcnQncyB0cmFpbGluZyBtYXJrZXIgbm9kZSwgaWYgYW55LiBTZWUgYC5wYXJlbnROb2RlYCBmb3IgbW9yZVxuICAgKiBpbmZvcm1hdGlvbi5cbiAgICovXG4gIGdldCBlbmROb2RlKCk6IE5vZGUgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fJGVuZE5vZGU7XG4gIH1cblxuICBfJHNldFZhbHVlKHZhbHVlOiB1bmtub3duLCBkaXJlY3RpdmVQYXJlbnQ6IERpcmVjdGl2ZVBhcmVudCA9IHRoaXMpOiB2b2lkIHtcbiAgICBpZiAoREVWX01PREUgJiYgdGhpcy5wYXJlbnROb2RlID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUaGlzIFxcYENoaWxkUGFydFxcYCBoYXMgbm8gXFxgcGFyZW50Tm9kZVxcYCBhbmQgdGhlcmVmb3JlIGNhbm5vdCBhY2NlcHQgYSB2YWx1ZS4gVGhpcyBsaWtlbHkgbWVhbnMgdGhlIGVsZW1lbnQgY29udGFpbmluZyB0aGUgcGFydCB3YXMgbWFuaXB1bGF0ZWQgaW4gYW4gdW5zdXBwb3J0ZWQgd2F5IG91dHNpZGUgb2YgTGl0J3MgY29udHJvbCBzdWNoIHRoYXQgdGhlIHBhcnQncyBtYXJrZXIgbm9kZXMgd2VyZSBlamVjdGVkIGZyb20gRE9NLiBGb3IgZXhhbXBsZSwgc2V0dGluZyB0aGUgZWxlbWVudCdzIFxcYGlubmVySFRNTFxcYCBvciBcXGB0ZXh0Q29udGVudFxcYCBjYW4gZG8gdGhpcy5gXG4gICAgICApO1xuICAgIH1cbiAgICB2YWx1ZSA9IHJlc29sdmVEaXJlY3RpdmUodGhpcywgdmFsdWUsIGRpcmVjdGl2ZVBhcmVudCk7XG4gICAgaWYgKGlzUHJpbWl0aXZlKHZhbHVlKSkge1xuICAgICAgLy8gTm9uLXJlbmRlcmluZyBjaGlsZCB2YWx1ZXMuIEl0J3MgaW1wb3J0YW50IHRoYXQgdGhlc2UgZG8gbm90IHJlbmRlclxuICAgICAgLy8gZW1wdHkgdGV4dCBub2RlcyB0byBhdm9pZCBpc3N1ZXMgd2l0aCBwcmV2ZW50aW5nIGRlZmF1bHQgPHNsb3Q+XG4gICAgICAvLyBmYWxsYmFjayBjb250ZW50LlxuICAgICAgaWYgKHZhbHVlID09PSBub3RoaW5nIHx8IHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT09ICcnKSB7XG4gICAgICAgIGlmICh0aGlzLl8kY29tbWl0dGVkVmFsdWUgIT09IG5vdGhpbmcpIHtcbiAgICAgICAgICBkZWJ1Z0xvZ0V2ZW50ICYmXG4gICAgICAgICAgICBkZWJ1Z0xvZ0V2ZW50KHtcbiAgICAgICAgICAgICAga2luZDogJ2NvbW1pdCBub3RoaW5nIHRvIGNoaWxkJyxcbiAgICAgICAgICAgICAgc3RhcnQ6IHRoaXMuXyRzdGFydE5vZGUsXG4gICAgICAgICAgICAgIGVuZDogdGhpcy5fJGVuZE5vZGUsXG4gICAgICAgICAgICAgIHBhcmVudDogdGhpcy5fJHBhcmVudCxcbiAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5fJGNsZWFyKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fJGNvbW1pdHRlZFZhbHVlID0gbm90aGluZztcbiAgICAgIH0gZWxzZSBpZiAodmFsdWUgIT09IHRoaXMuXyRjb21taXR0ZWRWYWx1ZSAmJiB2YWx1ZSAhPT0gbm9DaGFuZ2UpIHtcbiAgICAgICAgdGhpcy5fY29tbWl0VGV4dCh2YWx1ZSk7XG4gICAgICB9XG4gICAgICAvLyBUaGlzIHByb3BlcnR5IG5lZWRzIHRvIHJlbWFpbiB1bm1pbmlmaWVkLlxuICAgIH0gZWxzZSBpZiAoKHZhbHVlIGFzIFRlbXBsYXRlUmVzdWx0KVsnXyRsaXRUeXBlJCddICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX2NvbW1pdFRlbXBsYXRlUmVzdWx0KHZhbHVlIGFzIFRlbXBsYXRlUmVzdWx0KTtcbiAgICB9IGVsc2UgaWYgKCh2YWx1ZSBhcyBOb2RlKS5ub2RlVHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoREVWX01PREUgJiYgdGhpcy5vcHRpb25zPy5ob3N0ID09PSB2YWx1ZSkge1xuICAgICAgICB0aGlzLl9jb21taXRUZXh0KFxuICAgICAgICAgIGBbcHJvYmFibGUgbWlzdGFrZTogcmVuZGVyZWQgYSB0ZW1wbGF0ZSdzIGhvc3QgaW4gaXRzZWxmIGAgK1xuICAgICAgICAgICAgYChjb21tb25seSBjYXVzZWQgYnkgd3JpdGluZyBcXCR7dGhpc30gaW4gYSB0ZW1wbGF0ZV1gXG4gICAgICAgICk7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgQXR0ZW1wdGVkIHRvIHJlbmRlciB0aGUgdGVtcGxhdGUgaG9zdGAsXG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgYGluc2lkZSBpdHNlbGYuIFRoaXMgaXMgYWxtb3N0IGFsd2F5cyBhIG1pc3Rha2UsIGFuZCBpbiBkZXYgbW9kZSBgLFxuICAgICAgICAgIGB3ZSByZW5kZXIgc29tZSB3YXJuaW5nIHRleHQuIEluIHByb2R1Y3Rpb24gaG93ZXZlciwgd2UnbGwgYCxcbiAgICAgICAgICBgcmVuZGVyIGl0LCB3aGljaCB3aWxsIHVzdWFsbHkgcmVzdWx0IGluIGFuIGVycm9yLCBhbmQgc29tZXRpbWVzIGAsXG4gICAgICAgICAgYGluIHRoZSBlbGVtZW50IGRpc2FwcGVhcmluZyBmcm9tIHRoZSBET00uYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLl9jb21taXROb2RlKHZhbHVlIGFzIE5vZGUpO1xuICAgIH0gZWxzZSBpZiAoaXNJdGVyYWJsZSh2YWx1ZSkpIHtcbiAgICAgIHRoaXMuX2NvbW1pdEl0ZXJhYmxlKHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRmFsbGJhY2ssIHdpbGwgcmVuZGVyIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb25cbiAgICAgIHRoaXMuX2NvbW1pdFRleHQodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2luc2VydDxUIGV4dGVuZHMgTm9kZT4obm9kZTogVCkge1xuICAgIHJldHVybiB3cmFwKHdyYXAodGhpcy5fJHN0YXJ0Tm9kZSkucGFyZW50Tm9kZSEpLmluc2VydEJlZm9yZShcbiAgICAgIG5vZGUsXG4gICAgICB0aGlzLl8kZW5kTm9kZVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9jb21taXROb2RlKHZhbHVlOiBOb2RlKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuXyRjb21taXR0ZWRWYWx1ZSAhPT0gdmFsdWUpIHtcbiAgICAgIHRoaXMuXyRjbGVhcigpO1xuICAgICAgaWYgKFxuICAgICAgICBFTkFCTEVfRVhUUkFfU0VDVVJJVFlfSE9PS1MgJiZcbiAgICAgICAgc2FuaXRpemVyRmFjdG9yeUludGVybmFsICE9PSBub29wU2FuaXRpemVyXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgcGFyZW50Tm9kZU5hbWUgPSB0aGlzLl8kc3RhcnROb2RlLnBhcmVudE5vZGU/Lm5vZGVOYW1lO1xuICAgICAgICBpZiAocGFyZW50Tm9kZU5hbWUgPT09ICdTVFlMRScgfHwgcGFyZW50Tm9kZU5hbWUgPT09ICdTQ1JJUFQnKSB7XG4gICAgICAgICAgbGV0IG1lc3NhZ2UgPSAnRm9yYmlkZGVuJztcbiAgICAgICAgICBpZiAoREVWX01PREUpIHtcbiAgICAgICAgICAgIGlmIChwYXJlbnROb2RlTmFtZSA9PT0gJ1NUWUxFJykge1xuICAgICAgICAgICAgICBtZXNzYWdlID1cbiAgICAgICAgICAgICAgICBgTGl0IGRvZXMgbm90IHN1cHBvcnQgYmluZGluZyBpbnNpZGUgc3R5bGUgbm9kZXMuIGAgK1xuICAgICAgICAgICAgICAgIGBUaGlzIGlzIGEgc2VjdXJpdHkgcmlzaywgYXMgc3R5bGUgaW5qZWN0aW9uIGF0dGFja3MgY2FuIGAgK1xuICAgICAgICAgICAgICAgIGBleGZpbHRyYXRlIGRhdGEgYW5kIHNwb29mIFVJcy4gYCArXG4gICAgICAgICAgICAgICAgYENvbnNpZGVyIGluc3RlYWQgdXNpbmcgY3NzXFxgLi4uXFxgIGxpdGVyYWxzIGAgK1xuICAgICAgICAgICAgICAgIGB0byBjb21wb3NlIHN0eWxlcywgYW5kIGRvIGR5bmFtaWMgc3R5bGluZyB3aXRoIGAgK1xuICAgICAgICAgICAgICAgIGBjc3MgY3VzdG9tIHByb3BlcnRpZXMsIDo6cGFydHMsIDxzbG90PnMsIGAgK1xuICAgICAgICAgICAgICAgIGBhbmQgYnkgbXV0YXRpbmcgdGhlIERPTSByYXRoZXIgdGhhbiBzdHlsZXNoZWV0cy5gO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbWVzc2FnZSA9XG4gICAgICAgICAgICAgICAgYExpdCBkb2VzIG5vdCBzdXBwb3J0IGJpbmRpbmcgaW5zaWRlIHNjcmlwdCBub2Rlcy4gYCArXG4gICAgICAgICAgICAgICAgYFRoaXMgaXMgYSBzZWN1cml0eSByaXNrLCBhcyBpdCBjb3VsZCBhbGxvdyBhcmJpdHJhcnkgYCArXG4gICAgICAgICAgICAgICAgYGNvZGUgZXhlY3V0aW9uLmA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZGVidWdMb2dFdmVudCAmJlxuICAgICAgICBkZWJ1Z0xvZ0V2ZW50KHtcbiAgICAgICAgICBraW5kOiAnY29tbWl0IG5vZGUnLFxuICAgICAgICAgIHN0YXJ0OiB0aGlzLl8kc3RhcnROb2RlLFxuICAgICAgICAgIHBhcmVudDogdGhpcy5fJHBhcmVudCxcbiAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuICAgICAgICB9KTtcbiAgICAgIHRoaXMuXyRjb21taXR0ZWRWYWx1ZSA9IHRoaXMuX2luc2VydCh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfY29tbWl0VGV4dCh2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIC8vIElmIHRoZSBjb21taXR0ZWQgdmFsdWUgaXMgYSBwcmltaXRpdmUgaXQgbWVhbnMgd2UgY2FsbGVkIF9jb21taXRUZXh0IG9uXG4gICAgLy8gdGhlIHByZXZpb3VzIHJlbmRlciwgYW5kIHdlIGtub3cgdGhhdCB0aGlzLl8kc3RhcnROb2RlLm5leHRTaWJsaW5nIGlzIGFcbiAgICAvLyBUZXh0IG5vZGUuIFdlIGNhbiBub3cganVzdCByZXBsYWNlIHRoZSB0ZXh0IGNvbnRlbnQgKC5kYXRhKSBvZiB0aGUgbm9kZS5cbiAgICBpZiAoXG4gICAgICB0aGlzLl8kY29tbWl0dGVkVmFsdWUgIT09IG5vdGhpbmcgJiZcbiAgICAgIGlzUHJpbWl0aXZlKHRoaXMuXyRjb21taXR0ZWRWYWx1ZSlcbiAgICApIHtcbiAgICAgIGNvbnN0IG5vZGUgPSB3cmFwKHRoaXMuXyRzdGFydE5vZGUpLm5leHRTaWJsaW5nIGFzIFRleHQ7XG4gICAgICBpZiAoRU5BQkxFX0VYVFJBX1NFQ1VSSVRZX0hPT0tTKSB7XG4gICAgICAgIGlmICh0aGlzLl90ZXh0U2FuaXRpemVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLl90ZXh0U2FuaXRpemVyID0gY3JlYXRlU2FuaXRpemVyKG5vZGUsICdkYXRhJywgJ3Byb3BlcnR5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUgPSB0aGlzLl90ZXh0U2FuaXRpemVyKHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgICAgZGVidWdMb2dFdmVudCh7XG4gICAgICAgICAga2luZDogJ2NvbW1pdCB0ZXh0JyxcbiAgICAgICAgICBub2RlLFxuICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgICAgfSk7XG4gICAgICAobm9kZSBhcyBUZXh0KS5kYXRhID0gdmFsdWUgYXMgc3RyaW5nO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoRU5BQkxFX0VYVFJBX1NFQ1VSSVRZX0hPT0tTKSB7XG4gICAgICAgIGNvbnN0IHRleHROb2RlID0gZC5jcmVhdGVUZXh0Tm9kZSgnJyk7XG4gICAgICAgIHRoaXMuX2NvbW1pdE5vZGUodGV4dE5vZGUpO1xuICAgICAgICAvLyBXaGVuIHNldHRpbmcgdGV4dCBjb250ZW50LCBmb3Igc2VjdXJpdHkgcHVycG9zZXMgaXQgbWF0dGVycyBhIGxvdFxuICAgICAgICAvLyB3aGF0IHRoZSBwYXJlbnQgaXMuIEZvciBleGFtcGxlLCA8c3R5bGU+IGFuZCA8c2NyaXB0PiBuZWVkIHRvIGJlXG4gICAgICAgIC8vIGhhbmRsZWQgd2l0aCBjYXJlLCB3aGlsZSA8c3Bhbj4gZG9lcyBub3QuIFNvIGZpcnN0IHdlIG5lZWQgdG8gcHV0IGFcbiAgICAgICAgLy8gdGV4dCBub2RlIGludG8gdGhlIGRvY3VtZW50LCB0aGVuIHdlIGNhbiBzYW5pdGl6ZSBpdHMgY29udGVudC5cbiAgICAgICAgaWYgKHRoaXMuX3RleHRTYW5pdGl6ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMuX3RleHRTYW5pdGl6ZXIgPSBjcmVhdGVTYW5pdGl6ZXIodGV4dE5vZGUsICdkYXRhJywgJ3Byb3BlcnR5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUgPSB0aGlzLl90ZXh0U2FuaXRpemVyKHZhbHVlKTtcbiAgICAgICAgZGVidWdMb2dFdmVudCAmJlxuICAgICAgICAgIGRlYnVnTG9nRXZlbnQoe1xuICAgICAgICAgICAga2luZDogJ2NvbW1pdCB0ZXh0JyxcbiAgICAgICAgICAgIG5vZGU6IHRleHROb2RlLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgICAgICAgfSk7XG4gICAgICAgIHRleHROb2RlLmRhdGEgPSB2YWx1ZSBhcyBzdHJpbmc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9jb21taXROb2RlKGQuY3JlYXRlVGV4dE5vZGUodmFsdWUgYXMgc3RyaW5nKSk7XG4gICAgICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgICAgICBkZWJ1Z0xvZ0V2ZW50KHtcbiAgICAgICAgICAgIGtpbmQ6ICdjb21taXQgdGV4dCcsXG4gICAgICAgICAgICBub2RlOiB3cmFwKHRoaXMuXyRzdGFydE5vZGUpLm5leHRTaWJsaW5nIGFzIFRleHQsXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fJGNvbW1pdHRlZFZhbHVlID0gdmFsdWU7XG4gIH1cblxuICBwcml2YXRlIF9jb21taXRUZW1wbGF0ZVJlc3VsdChcbiAgICByZXN1bHQ6IFRlbXBsYXRlUmVzdWx0IHwgQ29tcGlsZWRUZW1wbGF0ZVJlc3VsdFxuICApOiB2b2lkIHtcbiAgICAvLyBUaGlzIHByb3BlcnR5IG5lZWRzIHRvIHJlbWFpbiB1bm1pbmlmaWVkLlxuICAgIGNvbnN0IHt2YWx1ZXMsIFsnXyRsaXRUeXBlJCddOiB0eXBlfSA9IHJlc3VsdDtcbiAgICAvLyBJZiAkbGl0VHlwZSQgaXMgYSBudW1iZXIsIHJlc3VsdCBpcyBhIHBsYWluIFRlbXBsYXRlUmVzdWx0IGFuZCB3ZSBnZXRcbiAgICAvLyB0aGUgdGVtcGxhdGUgZnJvbSB0aGUgdGVtcGxhdGUgY2FjaGUuIElmIG5vdCwgcmVzdWx0IGlzIGFcbiAgICAvLyBDb21waWxlZFRlbXBsYXRlUmVzdWx0IGFuZCBfJGxpdFR5cGUkIGlzIGEgQ29tcGlsZWRUZW1wbGF0ZSBhbmQgd2UgbmVlZFxuICAgIC8vIHRvIGNyZWF0ZSB0aGUgPHRlbXBsYXRlPiBlbGVtZW50IHRoZSBmaXJzdCB0aW1lIHdlIHNlZSBpdC5cbiAgICBjb25zdCB0ZW1wbGF0ZTogVGVtcGxhdGUgfCBDb21waWxlZFRlbXBsYXRlID1cbiAgICAgIHR5cGVvZiB0eXBlID09PSAnbnVtYmVyJ1xuICAgICAgICA/IHRoaXMuXyRnZXRUZW1wbGF0ZShyZXN1bHQgYXMgVW5jb21waWxlZFRlbXBsYXRlUmVzdWx0KVxuICAgICAgICA6ICh0eXBlLmVsID09PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICh0eXBlLmVsID0gVGVtcGxhdGUuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgdHJ1c3RGcm9tVGVtcGxhdGVTdHJpbmcodHlwZS5oLCB0eXBlLmhbMF0pLFxuICAgICAgICAgICAgICB0aGlzLm9wdGlvbnNcbiAgICAgICAgICAgICkpLFxuICAgICAgICAgIHR5cGUpO1xuXG4gICAgaWYgKCh0aGlzLl8kY29tbWl0dGVkVmFsdWUgYXMgVGVtcGxhdGVJbnN0YW5jZSk/Ll8kdGVtcGxhdGUgPT09IHRlbXBsYXRlKSB7XG4gICAgICBkZWJ1Z0xvZ0V2ZW50ICYmXG4gICAgICAgIGRlYnVnTG9nRXZlbnQoe1xuICAgICAgICAgIGtpbmQ6ICd0ZW1wbGF0ZSB1cGRhdGluZycsXG4gICAgICAgICAgdGVtcGxhdGUsXG4gICAgICAgICAgaW5zdGFuY2U6IHRoaXMuXyRjb21taXR0ZWRWYWx1ZSBhcyBUZW1wbGF0ZUluc3RhbmNlLFxuICAgICAgICAgIHBhcnRzOiAodGhpcy5fJGNvbW1pdHRlZFZhbHVlIGFzIFRlbXBsYXRlSW5zdGFuY2UpLl8kcGFydHMsXG4gICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuICAgICAgICAgIHZhbHVlcyxcbiAgICAgICAgfSk7XG4gICAgICAodGhpcy5fJGNvbW1pdHRlZFZhbHVlIGFzIFRlbXBsYXRlSW5zdGFuY2UpLl91cGRhdGUodmFsdWVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgVGVtcGxhdGVJbnN0YW5jZSh0ZW1wbGF0ZSBhcyBUZW1wbGF0ZSwgdGhpcyk7XG4gICAgICBjb25zdCBmcmFnbWVudCA9IGluc3RhbmNlLl9jbG9uZSh0aGlzLm9wdGlvbnMpO1xuICAgICAgZGVidWdMb2dFdmVudCAmJlxuICAgICAgICBkZWJ1Z0xvZ0V2ZW50KHtcbiAgICAgICAgICBraW5kOiAndGVtcGxhdGUgaW5zdGFudGlhdGVkJyxcbiAgICAgICAgICB0ZW1wbGF0ZSxcbiAgICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgICBwYXJ0czogaW5zdGFuY2UuXyRwYXJ0cyxcbiAgICAgICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgICAgICAgZnJhZ21lbnQsXG4gICAgICAgICAgdmFsdWVzLFxuICAgICAgICB9KTtcbiAgICAgIGluc3RhbmNlLl91cGRhdGUodmFsdWVzKTtcbiAgICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgICAgZGVidWdMb2dFdmVudCh7XG4gICAgICAgICAga2luZDogJ3RlbXBsYXRlIGluc3RhbnRpYXRlZCBhbmQgdXBkYXRlZCcsXG4gICAgICAgICAgdGVtcGxhdGUsXG4gICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgcGFydHM6IGluc3RhbmNlLl8kcGFydHMsXG4gICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuICAgICAgICAgIGZyYWdtZW50LFxuICAgICAgICAgIHZhbHVlcyxcbiAgICAgICAgfSk7XG4gICAgICB0aGlzLl9jb21taXROb2RlKGZyYWdtZW50KTtcbiAgICAgIHRoaXMuXyRjb21taXR0ZWRWYWx1ZSA9IGluc3RhbmNlO1xuICAgIH1cbiAgfVxuXG4gIC8vIE92ZXJyaWRkZW4gdmlhIGBsaXRIdG1sUG9seWZpbGxTdXBwb3J0YCB0byBwcm92aWRlIHBsYXRmb3JtIHN1cHBvcnQuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgXyRnZXRUZW1wbGF0ZShyZXN1bHQ6IFVuY29tcGlsZWRUZW1wbGF0ZVJlc3VsdCkge1xuICAgIGxldCB0ZW1wbGF0ZSA9IHRlbXBsYXRlQ2FjaGUuZ2V0KHJlc3VsdC5zdHJpbmdzKTtcbiAgICBpZiAodGVtcGxhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGVtcGxhdGVDYWNoZS5zZXQocmVzdWx0LnN0cmluZ3MsICh0ZW1wbGF0ZSA9IG5ldyBUZW1wbGF0ZShyZXN1bHQpKSk7XG4gICAgfVxuICAgIHJldHVybiB0ZW1wbGF0ZTtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbW1pdEl0ZXJhYmxlKHZhbHVlOiBJdGVyYWJsZTx1bmtub3duPik6IHZvaWQge1xuICAgIC8vIEZvciBhbiBJdGVyYWJsZSwgd2UgY3JlYXRlIGEgbmV3IEluc3RhbmNlUGFydCBwZXIgaXRlbSwgdGhlbiBzZXQgaXRzXG4gICAgLy8gdmFsdWUgdG8gdGhlIGl0ZW0uIFRoaXMgaXMgYSBsaXR0bGUgYml0IG9mIG92ZXJoZWFkIGZvciBldmVyeSBpdGVtIGluXG4gICAgLy8gYW4gSXRlcmFibGUsIGJ1dCBpdCBsZXRzIHVzIHJlY3Vyc2UgZWFzaWx5IGFuZCBlZmZpY2llbnRseSB1cGRhdGUgQXJyYXlzXG4gICAgLy8gb2YgVGVtcGxhdGVSZXN1bHRzIHRoYXQgd2lsbCBiZSBjb21tb25seSByZXR1cm5lZCBmcm9tIGV4cHJlc3Npb25zIGxpa2U6XG4gICAgLy8gYXJyYXkubWFwKChpKSA9PiBodG1sYCR7aX1gKSwgYnkgcmV1c2luZyBleGlzdGluZyBUZW1wbGF0ZUluc3RhbmNlcy5cblxuICAgIC8vIElmIHZhbHVlIGlzIGFuIGFycmF5LCB0aGVuIHRoZSBwcmV2aW91cyByZW5kZXIgd2FzIG9mIGFuXG4gICAgLy8gaXRlcmFibGUgYW5kIHZhbHVlIHdpbGwgY29udGFpbiB0aGUgQ2hpbGRQYXJ0cyBmcm9tIHRoZSBwcmV2aW91c1xuICAgIC8vIHJlbmRlci4gSWYgdmFsdWUgaXMgbm90IGFuIGFycmF5LCBjbGVhciB0aGlzIHBhcnQgYW5kIG1ha2UgYSBuZXdcbiAgICAvLyBhcnJheSBmb3IgQ2hpbGRQYXJ0cy5cbiAgICBpZiAoIWlzQXJyYXkodGhpcy5fJGNvbW1pdHRlZFZhbHVlKSkge1xuICAgICAgdGhpcy5fJGNvbW1pdHRlZFZhbHVlID0gW107XG4gICAgICB0aGlzLl8kY2xlYXIoKTtcbiAgICB9XG5cbiAgICAvLyBMZXRzIHVzIGtlZXAgdHJhY2sgb2YgaG93IG1hbnkgaXRlbXMgd2Ugc3RhbXBlZCBzbyB3ZSBjYW4gY2xlYXIgbGVmdG92ZXJcbiAgICAvLyBpdGVtcyBmcm9tIGEgcHJldmlvdXMgcmVuZGVyXG4gICAgY29uc3QgaXRlbVBhcnRzID0gdGhpcy5fJGNvbW1pdHRlZFZhbHVlIGFzIENoaWxkUGFydFtdO1xuICAgIGxldCBwYXJ0SW5kZXggPSAwO1xuICAgIGxldCBpdGVtUGFydDogQ2hpbGRQYXJ0IHwgdW5kZWZpbmVkO1xuXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKSB7XG4gICAgICBpZiAocGFydEluZGV4ID09PSBpdGVtUGFydHMubGVuZ3RoKSB7XG4gICAgICAgIC8vIElmIG5vIGV4aXN0aW5nIHBhcnQsIGNyZWF0ZSBhIG5ldyBvbmVcbiAgICAgICAgLy8gVE9ETyAoanVzdGluZmFnbmFuaSk6IHRlc3QgcGVyZiBpbXBhY3Qgb2YgYWx3YXlzIGNyZWF0aW5nIHR3byBwYXJ0c1xuICAgICAgICAvLyBpbnN0ZWFkIG9mIHNoYXJpbmcgcGFydHMgYmV0d2VlbiBub2Rlc1xuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbGl0L2xpdC9pc3N1ZXMvMTI2NlxuICAgICAgICBpdGVtUGFydHMucHVzaChcbiAgICAgICAgICAoaXRlbVBhcnQgPSBuZXcgQ2hpbGRQYXJ0KFxuICAgICAgICAgICAgdGhpcy5faW5zZXJ0KGNyZWF0ZU1hcmtlcigpKSxcbiAgICAgICAgICAgIHRoaXMuX2luc2VydChjcmVhdGVNYXJrZXIoKSksXG4gICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgdGhpcy5vcHRpb25zXG4gICAgICAgICAgKSlcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFJldXNlIGFuIGV4aXN0aW5nIHBhcnRcbiAgICAgICAgaXRlbVBhcnQgPSBpdGVtUGFydHNbcGFydEluZGV4XTtcbiAgICAgIH1cbiAgICAgIGl0ZW1QYXJ0Ll8kc2V0VmFsdWUoaXRlbSk7XG4gICAgICBwYXJ0SW5kZXgrKztcbiAgICB9XG5cbiAgICBpZiAocGFydEluZGV4IDwgaXRlbVBhcnRzLmxlbmd0aCkge1xuICAgICAgLy8gaXRlbVBhcnRzIGFsd2F5cyBoYXZlIGVuZCBub2Rlc1xuICAgICAgdGhpcy5fJGNsZWFyKFxuICAgICAgICBpdGVtUGFydCAmJiB3cmFwKGl0ZW1QYXJ0Ll8kZW5kTm9kZSEpLm5leHRTaWJsaW5nLFxuICAgICAgICBwYXJ0SW5kZXhcbiAgICAgICk7XG4gICAgICAvLyBUcnVuY2F0ZSB0aGUgcGFydHMgYXJyYXkgc28gX3ZhbHVlIHJlZmxlY3RzIHRoZSBjdXJyZW50IHN0YXRlXG4gICAgICBpdGVtUGFydHMubGVuZ3RoID0gcGFydEluZGV4O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHRoZSBub2RlcyBjb250YWluZWQgd2l0aGluIHRoaXMgUGFydCBmcm9tIHRoZSBET00uXG4gICAqXG4gICAqIEBwYXJhbSBzdGFydCBTdGFydCBub2RlIHRvIGNsZWFyIGZyb20sIGZvciBjbGVhcmluZyBhIHN1YnNldCBvZiB0aGUgcGFydCdzXG4gICAqICAgICBET00gKHVzZWQgd2hlbiB0cnVuY2F0aW5nIGl0ZXJhYmxlcylcbiAgICogQHBhcmFtIGZyb20gIFdoZW4gYHN0YXJ0YCBpcyBzcGVjaWZpZWQsIHRoZSBpbmRleCB3aXRoaW4gdGhlIGl0ZXJhYmxlIGZyb21cbiAgICogICAgIHdoaWNoIENoaWxkUGFydHMgYXJlIGJlaW5nIHJlbW92ZWQsIHVzZWQgZm9yIGRpc2Nvbm5lY3RpbmcgZGlyZWN0aXZlcyBpblxuICAgKiAgICAgdGhvc2UgUGFydHMuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgXyRjbGVhcihcbiAgICBzdGFydDogQ2hpbGROb2RlIHwgbnVsbCA9IHdyYXAodGhpcy5fJHN0YXJ0Tm9kZSkubmV4dFNpYmxpbmcsXG4gICAgZnJvbT86IG51bWJlclxuICApIHtcbiAgICB0aGlzLl8kbm90aWZ5Q29ubmVjdGlvbkNoYW5nZWQ/LihmYWxzZSwgdHJ1ZSwgZnJvbSk7XG4gICAgd2hpbGUgKHN0YXJ0ICYmIHN0YXJ0ICE9PSB0aGlzLl8kZW5kTm9kZSkge1xuICAgICAgY29uc3QgbiA9IHdyYXAoc3RhcnQhKS5uZXh0U2libGluZztcbiAgICAgICh3cmFwKHN0YXJ0ISkgYXMgRWxlbWVudCkucmVtb3ZlKCk7XG4gICAgICBzdGFydCA9IG47XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBSb290UGFydCdzIGBpc0Nvbm5lY3RlZGAuIE5vdGUgdGhhdCB0aGlzIG1ldGhvZFxuICAgKiBzaG91bGQgb25seSBiZSBjYWxsZWQgb24gYFJvb3RQYXJ0YHMgKHRoZSBgQ2hpbGRQYXJ0YCByZXR1cm5lZCBmcm9tIGFcbiAgICogdG9wLWxldmVsIGByZW5kZXIoKWAgY2FsbCkuIEl0IGhhcyBubyBlZmZlY3Qgb24gbm9uLXJvb3QgQ2hpbGRQYXJ0cy5cbiAgICogQHBhcmFtIGlzQ29ubmVjdGVkIFdoZXRoZXIgdG8gc2V0XG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgc2V0Q29ubmVjdGVkKGlzQ29ubmVjdGVkOiBib29sZWFuKSB7XG4gICAgaWYgKHRoaXMuXyRwYXJlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fX2lzQ29ubmVjdGVkID0gaXNDb25uZWN0ZWQ7XG4gICAgICB0aGlzLl8kbm90aWZ5Q29ubmVjdGlvbkNoYW5nZWQ/Lihpc0Nvbm5lY3RlZCk7XG4gICAgfSBlbHNlIGlmIChERVZfTU9ERSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAncGFydC5zZXRDb25uZWN0ZWQoKSBtYXkgb25seSBiZSBjYWxsZWQgb24gYSAnICtcbiAgICAgICAgICAnUm9vdFBhcnQgcmV0dXJuZWQgZnJvbSByZW5kZXIoKS4nXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEEgdG9wLWxldmVsIGBDaGlsZFBhcnRgIHJldHVybmVkIGZyb20gYHJlbmRlcmAgdGhhdCBtYW5hZ2VzIHRoZSBjb25uZWN0ZWRcbiAqIHN0YXRlIG9mIGBBc3luY0RpcmVjdGl2ZWBzIGNyZWF0ZWQgdGhyb3VnaG91dCB0aGUgdHJlZSBiZWxvdyBpdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSb290UGFydCBleHRlbmRzIENoaWxkUGFydCB7XG4gIC8qKlxuICAgKiBTZXRzIHRoZSBjb25uZWN0aW9uIHN0YXRlIGZvciBgQXN5bmNEaXJlY3RpdmVgcyBjb250YWluZWQgd2l0aGluIHRoaXMgcm9vdFxuICAgKiBDaGlsZFBhcnQuXG4gICAqXG4gICAqIGxpdC1odG1sIGRvZXMgbm90IGF1dG9tYXRpY2FsbHkgbW9uaXRvciB0aGUgY29ubmVjdGVkbmVzcyBvZiBET00gcmVuZGVyZWQ7XG4gICAqIGFzIHN1Y2gsIGl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGVyIHRvIGByZW5kZXJgIHRvIGVuc3VyZSB0aGF0XG4gICAqIGBwYXJ0LnNldENvbm5lY3RlZChmYWxzZSlgIGlzIGNhbGxlZCBiZWZvcmUgdGhlIHBhcnQgb2JqZWN0IGlzIHBvdGVudGlhbGx5XG4gICAqIGRpc2NhcmRlZCwgdG8gZW5zdXJlIHRoYXQgYEFzeW5jRGlyZWN0aXZlYHMgaGF2ZSBhIGNoYW5jZSB0byBkaXNwb3NlIG9mXG4gICAqIGFueSByZXNvdXJjZXMgYmVpbmcgaGVsZC4gSWYgYSBgUm9vdFBhcnRgIHRoYXQgd2FzIHByZXZpb3VzbHlcbiAgICogZGlzY29ubmVjdGVkIGlzIHN1YnNlcXVlbnRseSByZS1jb25uZWN0ZWQgKGFuZCBpdHMgYEFzeW5jRGlyZWN0aXZlYHMgc2hvdWxkXG4gICAqIHJlLWNvbm5lY3QpLCBgc2V0Q29ubmVjdGVkKHRydWUpYCBzaG91bGQgYmUgY2FsbGVkLlxuICAgKlxuICAgKiBAcGFyYW0gaXNDb25uZWN0ZWQgV2hldGhlciBkaXJlY3RpdmVzIHdpdGhpbiB0aGlzIHRyZWUgc2hvdWxkIGJlIGNvbm5lY3RlZFxuICAgKiBvciBub3RcbiAgICovXG4gIHNldENvbm5lY3RlZChpc0Nvbm5lY3RlZDogYm9vbGVhbik6IHZvaWQ7XG59XG5cbmV4cG9ydCB0eXBlIHtBdHRyaWJ1dGVQYXJ0fTtcbmNsYXNzIEF0dHJpYnV0ZVBhcnQgaW1wbGVtZW50cyBEaXNjb25uZWN0YWJsZSB7XG4gIHJlYWRvbmx5IHR5cGU6XG4gICAgfCB0eXBlb2YgQVRUUklCVVRFX1BBUlRcbiAgICB8IHR5cGVvZiBQUk9QRVJUWV9QQVJUXG4gICAgfCB0eXBlb2YgQk9PTEVBTl9BVFRSSUJVVEVfUEFSVFxuICAgIHwgdHlwZW9mIEVWRU5UX1BBUlQgPSBBVFRSSUJVVEVfUEFSVDtcbiAgcmVhZG9ubHkgZWxlbWVudDogSFRNTEVsZW1lbnQ7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgb3B0aW9uczogUmVuZGVyT3B0aW9ucyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogSWYgdGhpcyBhdHRyaWJ1dGUgcGFydCByZXByZXNlbnRzIGFuIGludGVycG9sYXRpb24sIHRoaXMgY29udGFpbnMgdGhlXG4gICAqIHN0YXRpYyBzdHJpbmdzIG9mIHRoZSBpbnRlcnBvbGF0aW9uLiBGb3Igc2luZ2xlLXZhbHVlLCBjb21wbGV0ZSBiaW5kaW5ncyxcbiAgICogdGhpcyBpcyB1bmRlZmluZWQuXG4gICAqL1xuICByZWFkb25seSBzdHJpbmdzPzogUmVhZG9ubHlBcnJheTxzdHJpbmc+O1xuICAvKiogQGludGVybmFsICovXG4gIF8kY29tbWl0dGVkVmFsdWU6IHVua25vd24gfCBBcnJheTx1bmtub3duPiA9IG5vdGhpbmc7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX19kaXJlY3RpdmVzPzogQXJyYXk8RGlyZWN0aXZlIHwgdW5kZWZpbmVkPjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfJHBhcmVudDogRGlzY29ubmVjdGFibGU7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgXyRkaXNjb25uZWN0YWJsZUNoaWxkcmVuPzogU2V0PERpc2Nvbm5lY3RhYmxlPiA9IHVuZGVmaW5lZDtcblxuICBwcm90ZWN0ZWQgX3Nhbml0aXplcjogVmFsdWVTYW5pdGl6ZXIgfCB1bmRlZmluZWQ7XG5cbiAgZ2V0IHRhZ05hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudC50YWdOYW1lO1xuICB9XG5cbiAgLy8gU2VlIGNvbW1lbnQgaW4gRGlzY29ubmVjdGFibGUgaW50ZXJmYWNlIGZvciB3aHkgdGhpcyBpcyBhIGdldHRlclxuICBnZXQgXyRpc0Nvbm5lY3RlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fJHBhcmVudC5fJGlzQ29ubmVjdGVkO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZWxlbWVudDogSFRNTEVsZW1lbnQsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHN0cmluZ3M6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPixcbiAgICBwYXJlbnQ6IERpc2Nvbm5lY3RhYmxlLFxuICAgIG9wdGlvbnM6IFJlbmRlck9wdGlvbnMgfCB1bmRlZmluZWRcbiAgKSB7XG4gICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuXyRwYXJlbnQgPSBwYXJlbnQ7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICBpZiAoc3RyaW5ncy5sZW5ndGggPiAyIHx8IHN0cmluZ3NbMF0gIT09ICcnIHx8IHN0cmluZ3NbMV0gIT09ICcnKSB7XG4gICAgICB0aGlzLl8kY29tbWl0dGVkVmFsdWUgPSBuZXcgQXJyYXkoc3RyaW5ncy5sZW5ndGggLSAxKS5maWxsKG5ldyBTdHJpbmcoKSk7XG4gICAgICB0aGlzLnN0cmluZ3MgPSBzdHJpbmdzO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl8kY29tbWl0dGVkVmFsdWUgPSBub3RoaW5nO1xuICAgIH1cbiAgICBpZiAoRU5BQkxFX0VYVFJBX1NFQ1VSSVRZX0hPT0tTKSB7XG4gICAgICB0aGlzLl9zYW5pdGl6ZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoaXMgcGFydCBieSByZXNvbHZpbmcgdGhlIHZhbHVlIGZyb20gcG9zc2libHkgbXVsdGlwbGVcbiAgICogdmFsdWVzIGFuZCBzdGF0aWMgc3RyaW5ncyBhbmQgY29tbWl0dGluZyBpdCB0byB0aGUgRE9NLlxuICAgKiBJZiB0aGlzIHBhcnQgaXMgc2luZ2xlLXZhbHVlZCwgYHRoaXMuX3N0cmluZ3NgIHdpbGwgYmUgdW5kZWZpbmVkLCBhbmQgdGhlXG4gICAqIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aXRoIGEgc2luZ2xlIHZhbHVlIGFyZ3VtZW50LiBJZiB0aGlzIHBhcnQgaXNcbiAgICogbXVsdGktdmFsdWUsIGB0aGlzLl9zdHJpbmdzYCB3aWxsIGJlIGRlZmluZWQsIGFuZCB0aGUgbWV0aG9kIGlzIGNhbGxlZFxuICAgKiB3aXRoIHRoZSB2YWx1ZSBhcnJheSBvZiB0aGUgcGFydCdzIG93bmluZyBUZW1wbGF0ZUluc3RhbmNlLCBhbmQgYW4gb2Zmc2V0XG4gICAqIGludG8gdGhlIHZhbHVlIGFycmF5IGZyb20gd2hpY2ggdGhlIHZhbHVlcyBzaG91bGQgYmUgcmVhZC5cbiAgICogVGhpcyBtZXRob2QgaXMgb3ZlcmxvYWRlZCB0aGlzIHdheSB0byBlbGltaW5hdGUgc2hvcnQtbGl2ZWQgYXJyYXkgc2xpY2VzXG4gICAqIG9mIHRoZSB0ZW1wbGF0ZSBpbnN0YW5jZSB2YWx1ZXMsIGFuZCBhbGxvdyBhIGZhc3QtcGF0aCBmb3Igc2luZ2xlLXZhbHVlZFxuICAgKiBwYXJ0cy5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSBwYXJ0IHZhbHVlLCBvciBhbiBhcnJheSBvZiB2YWx1ZXMgZm9yIG11bHRpLXZhbHVlZCBwYXJ0c1xuICAgKiBAcGFyYW0gdmFsdWVJbmRleCB0aGUgaW5kZXggdG8gc3RhcnQgcmVhZGluZyB2YWx1ZXMgZnJvbS4gYHVuZGVmaW5lZGAgZm9yXG4gICAqICAgc2luZ2xlLXZhbHVlZCBwYXJ0c1xuICAgKiBAcGFyYW0gbm9Db21taXQgY2F1c2VzIHRoZSBwYXJ0IHRvIG5vdCBjb21taXQgaXRzIHZhbHVlIHRvIHRoZSBET00uIFVzZWRcbiAgICogICBpbiBoeWRyYXRpb24gdG8gcHJpbWUgYXR0cmlidXRlIHBhcnRzIHdpdGggdGhlaXIgZmlyc3QtcmVuZGVyZWQgdmFsdWUsXG4gICAqICAgYnV0IG5vdCBzZXQgdGhlIGF0dHJpYnV0ZSwgYW5kIGluIFNTUiB0byBuby1vcCB0aGUgRE9NIG9wZXJhdGlvbiBhbmRcbiAgICogICBjYXB0dXJlIHRoZSB2YWx1ZSBmb3Igc2VyaWFsaXphdGlvbi5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBfJHNldFZhbHVlKFxuICAgIHZhbHVlOiB1bmtub3duIHwgQXJyYXk8dW5rbm93bj4sXG4gICAgZGlyZWN0aXZlUGFyZW50OiBEaXJlY3RpdmVQYXJlbnQgPSB0aGlzLFxuICAgIHZhbHVlSW5kZXg/OiBudW1iZXIsXG4gICAgbm9Db21taXQ/OiBib29sZWFuXG4gICkge1xuICAgIGNvbnN0IHN0cmluZ3MgPSB0aGlzLnN0cmluZ3M7XG5cbiAgICAvLyBXaGV0aGVyIGFueSBvZiB0aGUgdmFsdWVzIGhhcyBjaGFuZ2VkLCBmb3IgZGlydHktY2hlY2tpbmdcbiAgICBsZXQgY2hhbmdlID0gZmFsc2U7XG5cbiAgICBpZiAoc3RyaW5ncyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBTaW5nbGUtdmFsdWUgYmluZGluZyBjYXNlXG4gICAgICB2YWx1ZSA9IHJlc29sdmVEaXJlY3RpdmUodGhpcywgdmFsdWUsIGRpcmVjdGl2ZVBhcmVudCwgMCk7XG4gICAgICBjaGFuZ2UgPVxuICAgICAgICAhaXNQcmltaXRpdmUodmFsdWUpIHx8XG4gICAgICAgICh2YWx1ZSAhPT0gdGhpcy5fJGNvbW1pdHRlZFZhbHVlICYmIHZhbHVlICE9PSBub0NoYW5nZSk7XG4gICAgICBpZiAoY2hhbmdlKSB7XG4gICAgICAgIHRoaXMuXyRjb21taXR0ZWRWYWx1ZSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJbnRlcnBvbGF0aW9uIGNhc2VcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHZhbHVlIGFzIEFycmF5PHVua25vd24+O1xuICAgICAgdmFsdWUgPSBzdHJpbmdzWzBdO1xuXG4gICAgICBsZXQgaSwgdjtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBzdHJpbmdzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICB2ID0gcmVzb2x2ZURpcmVjdGl2ZSh0aGlzLCB2YWx1ZXNbdmFsdWVJbmRleCEgKyBpXSwgZGlyZWN0aXZlUGFyZW50LCBpKTtcblxuICAgICAgICBpZiAodiA9PT0gbm9DaGFuZ2UpIHtcbiAgICAgICAgICAvLyBJZiB0aGUgdXNlci1wcm92aWRlZCB2YWx1ZSBpcyBgbm9DaGFuZ2VgLCB1c2UgdGhlIHByZXZpb3VzIHZhbHVlXG4gICAgICAgICAgdiA9ICh0aGlzLl8kY29tbWl0dGVkVmFsdWUgYXMgQXJyYXk8dW5rbm93bj4pW2ldO1xuICAgICAgICB9XG4gICAgICAgIGNoYW5nZSB8fD1cbiAgICAgICAgICAhaXNQcmltaXRpdmUodikgfHwgdiAhPT0gKHRoaXMuXyRjb21taXR0ZWRWYWx1ZSBhcyBBcnJheTx1bmtub3duPilbaV07XG4gICAgICAgIGlmICh2ID09PSBub3RoaW5nKSB7XG4gICAgICAgICAgdmFsdWUgPSBub3RoaW5nO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlICE9PSBub3RoaW5nKSB7XG4gICAgICAgICAgdmFsdWUgKz0gKHYgPz8gJycpICsgc3RyaW5nc1tpICsgMV07XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2UgYWx3YXlzIHJlY29yZCBlYWNoIHZhbHVlLCBldmVuIGlmIG9uZSBpcyBgbm90aGluZ2AsIGZvciBmdXR1cmVcbiAgICAgICAgLy8gY2hhbmdlIGRldGVjdGlvbi5cbiAgICAgICAgKHRoaXMuXyRjb21taXR0ZWRWYWx1ZSBhcyBBcnJheTx1bmtub3duPilbaV0gPSB2O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hhbmdlICYmICFub0NvbW1pdCkge1xuICAgICAgdGhpcy5fY29tbWl0VmFsdWUodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2NvbW1pdFZhbHVlKHZhbHVlOiB1bmtub3duKSB7XG4gICAgaWYgKHZhbHVlID09PSBub3RoaW5nKSB7XG4gICAgICAod3JhcCh0aGlzLmVsZW1lbnQpIGFzIEVsZW1lbnQpLnJlbW92ZUF0dHJpYnV0ZSh0aGlzLm5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoRU5BQkxFX0VYVFJBX1NFQ1VSSVRZX0hPT0tTKSB7XG4gICAgICAgIGlmICh0aGlzLl9zYW5pdGl6ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMuX3Nhbml0aXplciA9IHNhbml0aXplckZhY3RvcnlJbnRlcm5hbChcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudCxcbiAgICAgICAgICAgIHRoaXMubmFtZSxcbiAgICAgICAgICAgICdhdHRyaWJ1dGUnXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB2YWx1ZSA9IHRoaXMuX3Nhbml0aXplcih2YWx1ZSA/PyAnJyk7XG4gICAgICB9XG4gICAgICBkZWJ1Z0xvZ0V2ZW50ICYmXG4gICAgICAgIGRlYnVnTG9nRXZlbnQoe1xuICAgICAgICAgIGtpbmQ6ICdjb21taXQgYXR0cmlidXRlJyxcbiAgICAgICAgICBlbGVtZW50OiB0aGlzLmVsZW1lbnQsXG4gICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICAgICAgfSk7XG4gICAgICAod3JhcCh0aGlzLmVsZW1lbnQpIGFzIEVsZW1lbnQpLnNldEF0dHJpYnV0ZShcbiAgICAgICAgdGhpcy5uYW1lLFxuICAgICAgICAodmFsdWUgPz8gJycpIGFzIHN0cmluZ1xuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUge1Byb3BlcnR5UGFydH07XG5jbGFzcyBQcm9wZXJ0eVBhcnQgZXh0ZW5kcyBBdHRyaWJ1dGVQYXJ0IHtcbiAgb3ZlcnJpZGUgcmVhZG9ubHkgdHlwZSA9IFBST1BFUlRZX1BBUlQ7XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBvdmVycmlkZSBfY29tbWl0VmFsdWUodmFsdWU6IHVua25vd24pIHtcbiAgICBpZiAoRU5BQkxFX0VYVFJBX1NFQ1VSSVRZX0hPT0tTKSB7XG4gICAgICBpZiAodGhpcy5fc2FuaXRpemVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5fc2FuaXRpemVyID0gc2FuaXRpemVyRmFjdG9yeUludGVybmFsKFxuICAgICAgICAgIHRoaXMuZWxlbWVudCxcbiAgICAgICAgICB0aGlzLm5hbWUsXG4gICAgICAgICAgJ3Byb3BlcnR5J1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdmFsdWUgPSB0aGlzLl9zYW5pdGl6ZXIodmFsdWUpO1xuICAgIH1cbiAgICBkZWJ1Z0xvZ0V2ZW50ICYmXG4gICAgICBkZWJ1Z0xvZ0V2ZW50KHtcbiAgICAgICAga2luZDogJ2NvbW1pdCBwcm9wZXJ0eScsXG4gICAgICAgIGVsZW1lbnQ6IHRoaXMuZWxlbWVudCxcbiAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuICAgICAgfSk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAodGhpcy5lbGVtZW50IGFzIGFueSlbdGhpcy5uYW1lXSA9IHZhbHVlID09PSBub3RoaW5nID8gdW5kZWZpbmVkIDogdmFsdWU7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUge0Jvb2xlYW5BdHRyaWJ1dGVQYXJ0fTtcbmNsYXNzIEJvb2xlYW5BdHRyaWJ1dGVQYXJ0IGV4dGVuZHMgQXR0cmlidXRlUGFydCB7XG4gIG92ZXJyaWRlIHJlYWRvbmx5IHR5cGUgPSBCT09MRUFOX0FUVFJJQlVURV9QQVJUO1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgb3ZlcnJpZGUgX2NvbW1pdFZhbHVlKHZhbHVlOiB1bmtub3duKSB7XG4gICAgZGVidWdMb2dFdmVudCAmJlxuICAgICAgZGVidWdMb2dFdmVudCh7XG4gICAgICAgIGtpbmQ6ICdjb21taXQgYm9vbGVhbiBhdHRyaWJ1dGUnLFxuICAgICAgICBlbGVtZW50OiB0aGlzLmVsZW1lbnQsXG4gICAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgdmFsdWU6ICEhKHZhbHVlICYmIHZhbHVlICE9PSBub3RoaW5nKSxcbiAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuICAgICAgfSk7XG4gICAgKHdyYXAodGhpcy5lbGVtZW50KSBhcyBFbGVtZW50KS50b2dnbGVBdHRyaWJ1dGUoXG4gICAgICB0aGlzLm5hbWUsXG4gICAgICAhIXZhbHVlICYmIHZhbHVlICE9PSBub3RoaW5nXG4gICAgKTtcbiAgfVxufVxuXG50eXBlIEV2ZW50TGlzdGVuZXJXaXRoT3B0aW9ucyA9IEV2ZW50TGlzdGVuZXJPckV2ZW50TGlzdGVuZXJPYmplY3QgJlxuICBQYXJ0aWFsPEFkZEV2ZW50TGlzdGVuZXJPcHRpb25zPjtcblxuLyoqXG4gKiBBbiBBdHRyaWJ1dGVQYXJ0IHRoYXQgbWFuYWdlcyBhbiBldmVudCBsaXN0ZW5lciB2aWEgYWRkL3JlbW92ZUV2ZW50TGlzdGVuZXIuXG4gKlxuICogVGhpcyBwYXJ0IHdvcmtzIGJ5IGFkZGluZyBpdHNlbGYgYXMgdGhlIGV2ZW50IGxpc3RlbmVyIG9uIGFuIGVsZW1lbnQsIHRoZW5cbiAqIGRlbGVnYXRpbmcgdG8gdGhlIHZhbHVlIHBhc3NlZCB0byBpdC4gVGhpcyByZWR1Y2VzIHRoZSBudW1iZXIgb2YgY2FsbHMgdG9cbiAqIGFkZC9yZW1vdmVFdmVudExpc3RlbmVyIGlmIHRoZSBsaXN0ZW5lciBjaGFuZ2VzIGZyZXF1ZW50bHksIHN1Y2ggYXMgd2hlbiBhblxuICogaW5saW5lIGZ1bmN0aW9uIGlzIHVzZWQgYXMgYSBsaXN0ZW5lci5cbiAqXG4gKiBCZWNhdXNlIGV2ZW50IG9wdGlvbnMgYXJlIHBhc3NlZCB3aGVuIGFkZGluZyBsaXN0ZW5lcnMsIHdlIG11c3QgdGFrZSBjYXNlXG4gKiB0byBhZGQgYW5kIHJlbW92ZSB0aGUgcGFydCBhcyBhIGxpc3RlbmVyIHdoZW4gdGhlIGV2ZW50IG9wdGlvbnMgY2hhbmdlLlxuICovXG5leHBvcnQgdHlwZSB7RXZlbnRQYXJ0fTtcbmNsYXNzIEV2ZW50UGFydCBleHRlbmRzIEF0dHJpYnV0ZVBhcnQge1xuICBvdmVycmlkZSByZWFkb25seSB0eXBlID0gRVZFTlRfUEFSVDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBlbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgc3RyaW5nczogUmVhZG9ubHlBcnJheTxzdHJpbmc+LFxuICAgIHBhcmVudDogRGlzY29ubmVjdGFibGUsXG4gICAgb3B0aW9uczogUmVuZGVyT3B0aW9ucyB8IHVuZGVmaW5lZFxuICApIHtcbiAgICBzdXBlcihlbGVtZW50LCBuYW1lLCBzdHJpbmdzLCBwYXJlbnQsIG9wdGlvbnMpO1xuXG4gICAgaWYgKERFVl9NT0RFICYmIHRoaXMuc3RyaW5ncyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBBIFxcYDwke2VsZW1lbnQubG9jYWxOYW1lfT5cXGAgaGFzIGEgXFxgQCR7bmFtZX09Li4uXFxgIGxpc3RlbmVyIHdpdGggYCArXG4gICAgICAgICAgJ2ludmFsaWQgY29udGVudC4gRXZlbnQgbGlzdGVuZXJzIGluIHRlbXBsYXRlcyBtdXN0IGhhdmUgZXhhY3RseSAnICtcbiAgICAgICAgICAnb25lIGV4cHJlc3Npb24gYW5kIG5vIHN1cnJvdW5kaW5nIHRleHQuJ1xuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyBFdmVudFBhcnQgZG9lcyBub3QgdXNlIHRoZSBiYXNlIF8kc2V0VmFsdWUvX3Jlc29sdmVWYWx1ZSBpbXBsZW1lbnRhdGlvblxuICAvLyBzaW5jZSB0aGUgZGlydHkgY2hlY2tpbmcgaXMgbW9yZSBjb21wbGV4XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgb3ZlcnJpZGUgXyRzZXRWYWx1ZShcbiAgICBuZXdMaXN0ZW5lcjogdW5rbm93bixcbiAgICBkaXJlY3RpdmVQYXJlbnQ6IERpcmVjdGl2ZVBhcmVudCA9IHRoaXNcbiAgKSB7XG4gICAgbmV3TGlzdGVuZXIgPVxuICAgICAgcmVzb2x2ZURpcmVjdGl2ZSh0aGlzLCBuZXdMaXN0ZW5lciwgZGlyZWN0aXZlUGFyZW50LCAwKSA/PyBub3RoaW5nO1xuICAgIGlmIChuZXdMaXN0ZW5lciA9PT0gbm9DaGFuZ2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgb2xkTGlzdGVuZXIgPSB0aGlzLl8kY29tbWl0dGVkVmFsdWU7XG5cbiAgICAvLyBJZiB0aGUgbmV3IHZhbHVlIGlzIG5vdGhpbmcgb3IgYW55IG9wdGlvbnMgY2hhbmdlIHdlIGhhdmUgdG8gcmVtb3ZlIHRoZVxuICAgIC8vIHBhcnQgYXMgYSBsaXN0ZW5lci5cbiAgICBjb25zdCBzaG91bGRSZW1vdmVMaXN0ZW5lciA9XG4gICAgICAobmV3TGlzdGVuZXIgPT09IG5vdGhpbmcgJiYgb2xkTGlzdGVuZXIgIT09IG5vdGhpbmcpIHx8XG4gICAgICAobmV3TGlzdGVuZXIgYXMgRXZlbnRMaXN0ZW5lcldpdGhPcHRpb25zKS5jYXB0dXJlICE9PVxuICAgICAgICAob2xkTGlzdGVuZXIgYXMgRXZlbnRMaXN0ZW5lcldpdGhPcHRpb25zKS5jYXB0dXJlIHx8XG4gICAgICAobmV3TGlzdGVuZXIgYXMgRXZlbnRMaXN0ZW5lcldpdGhPcHRpb25zKS5vbmNlICE9PVxuICAgICAgICAob2xkTGlzdGVuZXIgYXMgRXZlbnRMaXN0ZW5lcldpdGhPcHRpb25zKS5vbmNlIHx8XG4gICAgICAobmV3TGlzdGVuZXIgYXMgRXZlbnRMaXN0ZW5lcldpdGhPcHRpb25zKS5wYXNzaXZlICE9PVxuICAgICAgICAob2xkTGlzdGVuZXIgYXMgRXZlbnRMaXN0ZW5lcldpdGhPcHRpb25zKS5wYXNzaXZlO1xuXG4gICAgLy8gSWYgdGhlIG5ldyB2YWx1ZSBpcyBub3Qgbm90aGluZyBhbmQgd2UgcmVtb3ZlZCB0aGUgbGlzdGVuZXIsIHdlIGhhdmVcbiAgICAvLyB0byBhZGQgdGhlIHBhcnQgYXMgYSBsaXN0ZW5lci5cbiAgICBjb25zdCBzaG91bGRBZGRMaXN0ZW5lciA9XG4gICAgICBuZXdMaXN0ZW5lciAhPT0gbm90aGluZyAmJlxuICAgICAgKG9sZExpc3RlbmVyID09PSBub3RoaW5nIHx8IHNob3VsZFJlbW92ZUxpc3RlbmVyKTtcblxuICAgIGRlYnVnTG9nRXZlbnQgJiZcbiAgICAgIGRlYnVnTG9nRXZlbnQoe1xuICAgICAgICBraW5kOiAnY29tbWl0IGV2ZW50IGxpc3RlbmVyJyxcbiAgICAgICAgZWxlbWVudDogdGhpcy5lbGVtZW50LFxuICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgIHZhbHVlOiBuZXdMaXN0ZW5lcixcbiAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuICAgICAgICByZW1vdmVMaXN0ZW5lcjogc2hvdWxkUmVtb3ZlTGlzdGVuZXIsXG4gICAgICAgIGFkZExpc3RlbmVyOiBzaG91bGRBZGRMaXN0ZW5lcixcbiAgICAgICAgb2xkTGlzdGVuZXIsXG4gICAgICB9KTtcbiAgICBpZiAoc2hvdWxkUmVtb3ZlTGlzdGVuZXIpIHtcbiAgICAgIHRoaXMuZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgICB0aGlzLm5hbWUsXG4gICAgICAgIHRoaXMsXG4gICAgICAgIG9sZExpc3RlbmVyIGFzIEV2ZW50TGlzdGVuZXJXaXRoT3B0aW9uc1xuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHNob3VsZEFkZExpc3RlbmVyKSB7XG4gICAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgdGhpcy5uYW1lLFxuICAgICAgICB0aGlzLFxuICAgICAgICBuZXdMaXN0ZW5lciBhcyBFdmVudExpc3RlbmVyV2l0aE9wdGlvbnNcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuXyRjb21taXR0ZWRWYWx1ZSA9IG5ld0xpc3RlbmVyO1xuICB9XG5cbiAgaGFuZGxlRXZlbnQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLl8kY29tbWl0dGVkVmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMuXyRjb21taXR0ZWRWYWx1ZS5jYWxsKHRoaXMub3B0aW9ucz8uaG9zdCA/PyB0aGlzLmVsZW1lbnQsIGV2ZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgKHRoaXMuXyRjb21taXR0ZWRWYWx1ZSBhcyBFdmVudExpc3RlbmVyT2JqZWN0KS5oYW5kbGVFdmVudChldmVudCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCB0eXBlIHtFbGVtZW50UGFydH07XG5jbGFzcyBFbGVtZW50UGFydCBpbXBsZW1lbnRzIERpc2Nvbm5lY3RhYmxlIHtcbiAgcmVhZG9ubHkgdHlwZSA9IEVMRU1FTlRfUEFSVDtcblxuICAvKiogQGludGVybmFsICovXG4gIF9fZGlyZWN0aXZlPzogRGlyZWN0aXZlO1xuXG4gIC8vIFRoaXMgaXMgdG8gZW5zdXJlIHRoYXQgZXZlcnkgUGFydCBoYXMgYSBfJGNvbW1pdHRlZFZhbHVlXG4gIF8kY29tbWl0dGVkVmFsdWU6IHVuZGVmaW5lZDtcblxuICAvKiogQGludGVybmFsICovXG4gIF8kcGFyZW50ITogRGlzY29ubmVjdGFibGU7XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfJGRpc2Nvbm5lY3RhYmxlQ2hpbGRyZW4/OiBTZXQ8RGlzY29ubmVjdGFibGU+ID0gdW5kZWZpbmVkO1xuXG4gIG9wdGlvbnM6IFJlbmRlck9wdGlvbnMgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGVsZW1lbnQ6IEVsZW1lbnQsXG4gICAgcGFyZW50OiBEaXNjb25uZWN0YWJsZSxcbiAgICBvcHRpb25zOiBSZW5kZXJPcHRpb25zIHwgdW5kZWZpbmVkXG4gICkge1xuICAgIHRoaXMuXyRwYXJlbnQgPSBwYXJlbnQ7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgfVxuXG4gIC8vIFNlZSBjb21tZW50IGluIERpc2Nvbm5lY3RhYmxlIGludGVyZmFjZSBmb3Igd2h5IHRoaXMgaXMgYSBnZXR0ZXJcbiAgZ2V0IF8kaXNDb25uZWN0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuXyRwYXJlbnQuXyRpc0Nvbm5lY3RlZDtcbiAgfVxuXG4gIF8kc2V0VmFsdWUodmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICBkZWJ1Z0xvZ0V2ZW50ICYmXG4gICAgICBkZWJ1Z0xvZ0V2ZW50KHtcbiAgICAgICAga2luZDogJ2NvbW1pdCB0byBlbGVtZW50IGJpbmRpbmcnLFxuICAgICAgICBlbGVtZW50OiB0aGlzLmVsZW1lbnQsXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgICB9KTtcbiAgICByZXNvbHZlRGlyZWN0aXZlKHRoaXMsIHZhbHVlKTtcbiAgfVxufVxuXG4vKipcbiAqIEVORCBVU0VSUyBTSE9VTEQgTk9UIFJFTFkgT04gVEhJUyBPQkpFQ1QuXG4gKlxuICogUHJpdmF0ZSBleHBvcnRzIGZvciB1c2UgYnkgb3RoZXIgTGl0IHBhY2thZ2VzLCBub3QgaW50ZW5kZWQgZm9yIHVzZSBieVxuICogZXh0ZXJuYWwgdXNlcnMuXG4gKlxuICogV2UgY3VycmVudGx5IGRvIG5vdCBtYWtlIGEgbWFuZ2xlZCByb2xsdXAgYnVpbGQgb2YgdGhlIGxpdC1zc3IgY29kZS4gSW4gb3JkZXJcbiAqIHRvIGtlZXAgYSBudW1iZXIgb2YgKG90aGVyd2lzZSBwcml2YXRlKSB0b3AtbGV2ZWwgZXhwb3J0cyBtYW5nbGVkIGluIHRoZVxuICogY2xpZW50IHNpZGUgY29kZSwgd2UgZXhwb3J0IGEgXyRMSCBvYmplY3QgY29udGFpbmluZyB0aG9zZSBtZW1iZXJzIChvclxuICogaGVscGVyIG1ldGhvZHMgZm9yIGFjY2Vzc2luZyBwcml2YXRlIGZpZWxkcyBvZiB0aG9zZSBtZW1iZXJzKSwgYW5kIHRoZW5cbiAqIHJlLWV4cG9ydCB0aGVtIGZvciB1c2UgaW4gbGl0LXNzci4gVGhpcyBrZWVwcyBsaXQtc3NyIGFnbm9zdGljIHRvIHdoZXRoZXIgdGhlXG4gKiBjbGllbnQtc2lkZSBjb2RlIGlzIGJlaW5nIHVzZWQgaW4gYGRldmAgbW9kZSBvciBgcHJvZGAgbW9kZS5cbiAqXG4gKiBUaGlzIGhhcyBhIHVuaXF1ZSBuYW1lLCB0byBkaXNhbWJpZ3VhdGUgaXQgZnJvbSBwcml2YXRlIGV4cG9ydHMgaW5cbiAqIGxpdC1lbGVtZW50LCB3aGljaCByZS1leHBvcnRzIGFsbCBvZiBsaXQtaHRtbC5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY29uc3QgXyRMSCA9IHtcbiAgLy8gVXNlZCBpbiBsaXQtc3NyXG4gIF9ib3VuZEF0dHJpYnV0ZVN1ZmZpeDogYm91bmRBdHRyaWJ1dGVTdWZmaXgsXG4gIF9tYXJrZXI6IG1hcmtlcixcbiAgX21hcmtlck1hdGNoOiBtYXJrZXJNYXRjaCxcbiAgX0hUTUxfUkVTVUxUOiBIVE1MX1JFU1VMVCxcbiAgX2dldFRlbXBsYXRlSHRtbDogZ2V0VGVtcGxhdGVIdG1sLFxuICAvLyBVc2VkIGluIHRlc3RzIGFuZCBwcml2YXRlLXNzci1zdXBwb3J0XG4gIF9UZW1wbGF0ZUluc3RhbmNlOiBUZW1wbGF0ZUluc3RhbmNlLFxuICBfaXNJdGVyYWJsZTogaXNJdGVyYWJsZSxcbiAgX3Jlc29sdmVEaXJlY3RpdmU6IHJlc29sdmVEaXJlY3RpdmUsXG4gIF9DaGlsZFBhcnQ6IENoaWxkUGFydCxcbiAgX0F0dHJpYnV0ZVBhcnQ6IEF0dHJpYnV0ZVBhcnQsXG4gIF9Cb29sZWFuQXR0cmlidXRlUGFydDogQm9vbGVhbkF0dHJpYnV0ZVBhcnQsXG4gIF9FdmVudFBhcnQ6IEV2ZW50UGFydCxcbiAgX1Byb3BlcnR5UGFydDogUHJvcGVydHlQYXJ0LFxuICBfRWxlbWVudFBhcnQ6IEVsZW1lbnRQYXJ0LFxufTtcblxuLy8gQXBwbHkgcG9seWZpbGxzIGlmIGF2YWlsYWJsZVxuY29uc3QgcG9seWZpbGxTdXBwb3J0ID0gREVWX01PREVcbiAgPyBnbG9iYWwubGl0SHRtbFBvbHlmaWxsU3VwcG9ydERldk1vZGVcbiAgOiBnbG9iYWwubGl0SHRtbFBvbHlmaWxsU3VwcG9ydDtcbnBvbHlmaWxsU3VwcG9ydD8uKFRlbXBsYXRlLCBDaGlsZFBhcnQpO1xuXG4vLyBJTVBPUlRBTlQ6IGRvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnR5IG5hbWUgb3IgdGhlIGFzc2lnbm1lbnQgZXhwcmVzc2lvbi5cbi8vIFRoaXMgbGluZSB3aWxsIGJlIHVzZWQgaW4gcmVnZXhlcyB0byBzZWFyY2ggZm9yIGxpdC1odG1sIHVzYWdlLlxuKGdsb2JhbC5saXRIdG1sVmVyc2lvbnMgPz89IFtdKS5wdXNoKCczLjMuMCcpO1xuaWYgKERFVl9NT0RFICYmIGdsb2JhbC5saXRIdG1sVmVyc2lvbnMubGVuZ3RoID4gMSkge1xuICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgaXNzdWVXYXJuaW5nIShcbiAgICAgICdtdWx0aXBsZS12ZXJzaW9ucycsXG4gICAgICBgTXVsdGlwbGUgdmVyc2lvbnMgb2YgTGl0IGxvYWRlZC4gYCArXG4gICAgICAgIGBMb2FkaW5nIG11bHRpcGxlIHZlcnNpb25zIGlzIG5vdCByZWNvbW1lbmRlZC5gXG4gICAgKTtcbiAgfSk7XG59XG5cbi8qKlxuICogUmVuZGVycyBhIHZhbHVlLCB1c3VhbGx5IGEgbGl0LWh0bWwgVGVtcGxhdGVSZXN1bHQsIHRvIHRoZSBjb250YWluZXIuXG4gKlxuICogVGhpcyBleGFtcGxlIHJlbmRlcnMgdGhlIHRleHQgXCJIZWxsbywgWm9lIVwiIGluc2lkZSBhIHBhcmFncmFwaCB0YWcsIGFwcGVuZGluZ1xuICogaXQgdG8gdGhlIGNvbnRhaW5lciBgZG9jdW1lbnQuYm9keWAuXG4gKlxuICogYGBganNcbiAqIGltcG9ydCB7aHRtbCwgcmVuZGVyfSBmcm9tICdsaXQnO1xuICpcbiAqIGNvbnN0IG5hbWUgPSBcIlpvZVwiO1xuICogcmVuZGVyKGh0bWxgPHA+SGVsbG8sICR7bmFtZX0hPC9wPmAsIGRvY3VtZW50LmJvZHkpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHZhbHVlIEFueSBbcmVuZGVyYWJsZVxuICogICB2YWx1ZV0oaHR0cHM6Ly9saXQuZGV2L2RvY3MvdGVtcGxhdGVzL2V4cHJlc3Npb25zLyNjaGlsZC1leHByZXNzaW9ucyksXG4gKiAgIHR5cGljYWxseSBhIHtAbGlua2NvZGUgVGVtcGxhdGVSZXN1bHR9IGNyZWF0ZWQgYnkgZXZhbHVhdGluZyBhIHRlbXBsYXRlIHRhZ1xuICogICBsaWtlIHtAbGlua2NvZGUgaHRtbH0gb3Ige0BsaW5rY29kZSBzdmd9LlxuICogQHBhcmFtIGNvbnRhaW5lciBBIERPTSBjb250YWluZXIgdG8gcmVuZGVyIHRvLiBUaGUgZmlyc3QgcmVuZGVyIHdpbGwgYXBwZW5kXG4gKiAgIHRoZSByZW5kZXJlZCB2YWx1ZSB0byB0aGUgY29udGFpbmVyLCBhbmQgc3Vic2VxdWVudCByZW5kZXJzIHdpbGxcbiAqICAgZWZmaWNpZW50bHkgdXBkYXRlIHRoZSByZW5kZXJlZCB2YWx1ZSBpZiB0aGUgc2FtZSByZXN1bHQgdHlwZSB3YXNcbiAqICAgcHJldmlvdXNseSByZW5kZXJlZCB0aGVyZS5cbiAqIEBwYXJhbSBvcHRpb25zIFNlZSB7QGxpbmtjb2RlIFJlbmRlck9wdGlvbnN9IGZvciBvcHRpb25zIGRvY3VtZW50YXRpb24uXG4gKiBAc2VlXG4gKiB7QGxpbmsgaHR0cHM6Ly9saXQuZGV2L2RvY3MvbGlicmFyaWVzL3N0YW5kYWxvbmUtdGVtcGxhdGVzLyNyZW5kZXJpbmctbGl0LWh0bWwtdGVtcGxhdGVzfCBSZW5kZXJpbmcgTGl0IEhUTUwgVGVtcGxhdGVzfVxuICovXG5leHBvcnQgY29uc3QgcmVuZGVyID0gKFxuICB2YWx1ZTogdW5rbm93bixcbiAgY29udGFpbmVyOiBIVE1MRWxlbWVudCB8IERvY3VtZW50RnJhZ21lbnQsXG4gIG9wdGlvbnM/OiBSZW5kZXJPcHRpb25zXG4pOiBSb290UGFydCA9PiB7XG4gIGlmIChERVZfTU9ERSAmJiBjb250YWluZXIgPT0gbnVsbCkge1xuICAgIC8vIEdpdmUgYSBjbGVhcmVyIGVycm9yIG1lc3NhZ2UgdGhhblxuICAgIC8vICAgICBVbmNhdWdodCBUeXBlRXJyb3I6IENhbm5vdCByZWFkIHByb3BlcnRpZXMgb2YgbnVsbCAocmVhZGluZ1xuICAgIC8vICAgICAnXyRsaXRQYXJ0JCcpXG4gICAgLy8gd2hpY2ggcmVhZHMgbGlrZSBhbiBpbnRlcm5hbCBMaXQgZXJyb3IuXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgVGhlIGNvbnRhaW5lciB0byByZW5kZXIgaW50byBtYXkgbm90IGJlICR7Y29udGFpbmVyfWApO1xuICB9XG4gIGNvbnN0IHJlbmRlcklkID0gREVWX01PREUgPyBkZWJ1Z0xvZ1JlbmRlcklkKysgOiAwO1xuICBjb25zdCBwYXJ0T3duZXJOb2RlID0gb3B0aW9ucz8ucmVuZGVyQmVmb3JlID8/IGNvbnRhaW5lcjtcbiAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgbGV0IHBhcnQ6IENoaWxkUGFydCA9IChwYXJ0T3duZXJOb2RlIGFzIGFueSlbJ18kbGl0UGFydCQnXTtcbiAgZGVidWdMb2dFdmVudCAmJlxuICAgIGRlYnVnTG9nRXZlbnQoe1xuICAgICAga2luZDogJ2JlZ2luIHJlbmRlcicsXG4gICAgICBpZDogcmVuZGVySWQsXG4gICAgICB2YWx1ZSxcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIG9wdGlvbnMsXG4gICAgICBwYXJ0LFxuICAgIH0pO1xuICBpZiAocGFydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgZW5kTm9kZSA9IG9wdGlvbnM/LnJlbmRlckJlZm9yZSA/PyBudWxsO1xuICAgIC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAocGFydE93bmVyTm9kZSBhcyBhbnkpWydfJGxpdFBhcnQkJ10gPSBwYXJ0ID0gbmV3IENoaWxkUGFydChcbiAgICAgIGNvbnRhaW5lci5pbnNlcnRCZWZvcmUoY3JlYXRlTWFya2VyKCksIGVuZE5vZGUpLFxuICAgICAgZW5kTm9kZSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIG9wdGlvbnMgPz8ge31cbiAgICApO1xuICB9XG4gIHBhcnQuXyRzZXRWYWx1ZSh2YWx1ZSk7XG4gIGRlYnVnTG9nRXZlbnQgJiZcbiAgICBkZWJ1Z0xvZ0V2ZW50KHtcbiAgICAgIGtpbmQ6ICdlbmQgcmVuZGVyJyxcbiAgICAgIGlkOiByZW5kZXJJZCxcbiAgICAgIHZhbHVlLFxuICAgICAgY29udGFpbmVyLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIHBhcnQsXG4gICAgfSk7XG4gIHJldHVybiBwYXJ0IGFzIFJvb3RQYXJ0O1xufTtcblxuaWYgKEVOQUJMRV9FWFRSQV9TRUNVUklUWV9IT09LUykge1xuICByZW5kZXIuc2V0U2FuaXRpemVyID0gc2V0U2FuaXRpemVyO1xuICByZW5kZXIuY3JlYXRlU2FuaXRpemVyID0gY3JlYXRlU2FuaXRpemVyO1xuICBpZiAoREVWX01PREUpIHtcbiAgICByZW5kZXIuX3Rlc3RPbmx5Q2xlYXJTYW5pdGl6ZXJGYWN0b3J5RG9Ob3RDYWxsT3JFbHNlID1cbiAgICAgIF90ZXN0T25seUNsZWFyU2FuaXRpemVyRmFjdG9yeURvTm90Q2FsbE9yRWxzZTtcbiAgfVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2VcbiAqL1xuXG4vKipcbiAqIFRoZSBtYWluIExpdEVsZW1lbnQgbW9kdWxlLCB3aGljaCBkZWZpbmVzIHRoZSB7QGxpbmtjb2RlIExpdEVsZW1lbnR9IGJhc2VcbiAqIGNsYXNzIGFuZCByZWxhdGVkIEFQSXMuXG4gKlxuICogTGl0RWxlbWVudCBjb21wb25lbnRzIGNhbiBkZWZpbmUgYSB0ZW1wbGF0ZSBhbmQgYSBzZXQgb2Ygb2JzZXJ2ZWRcbiAqIHByb3BlcnRpZXMuIENoYW5naW5nIGFuIG9ic2VydmVkIHByb3BlcnR5IHRyaWdnZXJzIGEgcmUtcmVuZGVyIG9mIHRoZVxuICogZWxlbWVudC5cbiAqXG4gKiBJbXBvcnQge0BsaW5rY29kZSBMaXRFbGVtZW50fSBhbmQge0BsaW5rY29kZSBodG1sfSBmcm9tIHRoaXMgbW9kdWxlIHRvXG4gKiBjcmVhdGUgYSBjb21wb25lbnQ6XG4gKlxuICogIGBgYGpzXG4gKiBpbXBvcnQge0xpdEVsZW1lbnQsIGh0bWx9IGZyb20gJ2xpdC1lbGVtZW50JztcbiAqXG4gKiBjbGFzcyBNeUVsZW1lbnQgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAqXG4gKiAgIC8vIERlY2xhcmUgb2JzZXJ2ZWQgcHJvcGVydGllc1xuICogICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7XG4gKiAgICAgcmV0dXJuIHtcbiAqICAgICAgIGFkamVjdGl2ZToge31cbiAqICAgICB9XG4gKiAgIH1cbiAqXG4gKiAgIGNvbnN0cnVjdG9yKCkge1xuICogICAgIHRoaXMuYWRqZWN0aXZlID0gJ2F3ZXNvbWUnO1xuICogICB9XG4gKlxuICogICAvLyBEZWZpbmUgdGhlIGVsZW1lbnQncyB0ZW1wbGF0ZVxuICogICByZW5kZXIoKSB7XG4gKiAgICAgcmV0dXJuIGh0bWxgPHA+eW91ciAke2FkamVjdGl2ZX0gdGVtcGxhdGUgaGVyZTwvcD5gO1xuICogICB9XG4gKiB9XG4gKlxuICogY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdteS1lbGVtZW50JywgTXlFbGVtZW50KTtcbiAqIGBgYFxuICpcbiAqIGBMaXRFbGVtZW50YCBleHRlbmRzIHtAbGlua2NvZGUgUmVhY3RpdmVFbGVtZW50fSBhbmQgYWRkcyBsaXQtaHRtbFxuICogdGVtcGxhdGluZy4gVGhlIGBSZWFjdGl2ZUVsZW1lbnRgIGNsYXNzIGlzIHByb3ZpZGVkIGZvciB1c2VycyB0aGF0IHdhbnQgdG9cbiAqIGJ1aWxkIHRoZWlyIG93biBjdXN0b20gZWxlbWVudCBiYXNlIGNsYXNzZXMgdGhhdCBkb24ndCB1c2UgbGl0LWh0bWwuXG4gKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKi9cbmltcG9ydCB7UHJvcGVydHlWYWx1ZXMsIFJlYWN0aXZlRWxlbWVudH0gZnJvbSAnQGxpdC9yZWFjdGl2ZS1lbGVtZW50JztcbmltcG9ydCB7cmVuZGVyLCBSZW5kZXJPcHRpb25zLCBub0NoYW5nZSwgUm9vdFBhcnR9IGZyb20gJ2xpdC1odG1sJztcbmV4cG9ydCAqIGZyb20gJ0BsaXQvcmVhY3RpdmUtZWxlbWVudCc7XG5leHBvcnQgKiBmcm9tICdsaXQtaHRtbCc7XG5cbmltcG9ydCB7TGl0VW5zdGFibGV9IGZyb20gJ2xpdC1odG1sJztcbmltcG9ydCB7UmVhY3RpdmVVbnN0YWJsZX0gZnJvbSAnQGxpdC9yZWFjdGl2ZS1lbGVtZW50JztcblxuLyoqXG4gKiBDb250YWlucyB0eXBlcyB0aGF0IGFyZSBwYXJ0IG9mIHRoZSB1bnN0YWJsZSBkZWJ1ZyBBUEkuXG4gKlxuICogRXZlcnl0aGluZyBpbiB0aGlzIEFQSSBpcyBub3Qgc3RhYmxlIGFuZCBtYXkgY2hhbmdlIG9yIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZSxcbiAqIGV2ZW4gb24gcGF0Y2ggcmVsZWFzZXMuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbmFtZXNwYWNlXG5leHBvcnQgbmFtZXNwYWNlIFVuc3RhYmxlIHtcbiAgLyoqXG4gICAqIFdoZW4gTGl0IGlzIHJ1bm5pbmcgaW4gZGV2IG1vZGUgYW5kIGB3aW5kb3cuZW1pdExpdERlYnVnTG9nRXZlbnRzYCBpcyB0cnVlLFxuICAgKiB3ZSB3aWxsIGVtaXQgJ2xpdC1kZWJ1ZycgZXZlbnRzIHRvIHdpbmRvdywgd2l0aCBsaXZlIGRldGFpbHMgYWJvdXQgdGhlIHVwZGF0ZSBhbmQgcmVuZGVyXG4gICAqIGxpZmVjeWNsZS4gVGhlc2UgY2FuIGJlIHVzZWZ1bCBmb3Igd3JpdGluZyBkZWJ1ZyB0b29saW5nIGFuZCB2aXN1YWxpemF0aW9ucy5cbiAgICpcbiAgICogUGxlYXNlIGJlIGF3YXJlIHRoYXQgcnVubmluZyB3aXRoIHdpbmRvdy5lbWl0TGl0RGVidWdMb2dFdmVudHMgaGFzIHBlcmZvcm1hbmNlIG92ZXJoZWFkLFxuICAgKiBtYWtpbmcgY2VydGFpbiBvcGVyYXRpb25zIHRoYXQgYXJlIG5vcm1hbGx5IHZlcnkgY2hlYXAgKGxpa2UgYSBuby1vcCByZW5kZXIpIG11Y2ggc2xvd2VyLFxuICAgKiBiZWNhdXNlIHdlIG11c3QgY29weSBkYXRhIGFuZCBkaXNwYXRjaCBldmVudHMuXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5hbWVzcGFjZVxuICBleHBvcnQgbmFtZXNwYWNlIERlYnVnTG9nIHtcbiAgICBleHBvcnQgdHlwZSBFbnRyeSA9XG4gICAgICB8IExpdFVuc3RhYmxlLkRlYnVnTG9nLkVudHJ5XG4gICAgICB8IFJlYWN0aXZlVW5zdGFibGUuRGVidWdMb2cuRW50cnk7XG4gIH1cbn1cbi8qXG4gKiBXaGVuIHVzaW5nIENsb3N1cmUgQ29tcGlsZXIsIEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkocHJvcGVydHksIG9iamVjdCkgaXNcbiAqIHJlcGxhY2VkIGF0IGNvbXBpbGUgdGltZSBieSB0aGUgbXVuZ2VkIG5hbWUgZm9yIG9iamVjdFtwcm9wZXJ0eV0uIFdlIGNhbm5vdFxuICogYWxpYXMgdGhpcyBmdW5jdGlvbiwgc28gd2UgaGF2ZSB0byB1c2UgYSBzbWFsbCBzaGltIHRoYXQgaGFzIHRoZSBzYW1lXG4gKiBiZWhhdmlvciB3aGVuIG5vdCBjb21waWxpbmcuXG4gKi9cbi8qQF9fSU5MSU5FX18qL1xuY29uc3QgSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSA9IDxQIGV4dGVuZHMgUHJvcGVydHlLZXk+KFxuICBwcm9wOiBQLFxuICBfb2JqOiB1bmtub3duXG4pOiBQID0+IHByb3A7XG5cbmNvbnN0IERFVl9NT0RFID0gdHJ1ZTtcbi8vIEFsbG93cyBtaW5pZmllcnMgdG8gcmVuYW1lIHJlZmVyZW5jZXMgdG8gZ2xvYmFsVGhpc1xuY29uc3QgZ2xvYmFsID0gZ2xvYmFsVGhpcztcblxubGV0IGlzc3VlV2FybmluZzogKGNvZGU6IHN0cmluZywgd2FybmluZzogc3RyaW5nKSA9PiB2b2lkO1xuXG5pZiAoREVWX01PREUpIHtcbiAgLy8gRW5zdXJlIHdhcm5pbmdzIGFyZSBpc3N1ZWQgb25seSAxeCwgZXZlbiBpZiBtdWx0aXBsZSB2ZXJzaW9ucyBvZiBMaXRcbiAgLy8gYXJlIGxvYWRlZC5cbiAgZ2xvYmFsLmxpdElzc3VlZFdhcm5pbmdzID8/PSBuZXcgU2V0KCk7XG5cbiAgLyoqXG4gICAqIElzc3VlIGEgd2FybmluZyBpZiB3ZSBoYXZlbid0IGFscmVhZHksIGJhc2VkIGVpdGhlciBvbiBgY29kZWAgb3IgYHdhcm5pbmdgLlxuICAgKiBXYXJuaW5ncyBhcmUgZGlzYWJsZWQgYXV0b21hdGljYWxseSBvbmx5IGJ5IGB3YXJuaW5nYDsgZGlzYWJsaW5nIHZpYSBgY29kZWBcbiAgICogY2FuIGJlIGRvbmUgYnkgdXNlcnMuXG4gICAqL1xuICBpc3N1ZVdhcm5pbmcgPSAoY29kZTogc3RyaW5nLCB3YXJuaW5nOiBzdHJpbmcpID0+IHtcbiAgICB3YXJuaW5nICs9IGAgU2VlIGh0dHBzOi8vbGl0LmRldi9tc2cvJHtjb2RlfSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5gO1xuICAgIGlmIChcbiAgICAgICFnbG9iYWwubGl0SXNzdWVkV2FybmluZ3MhLmhhcyh3YXJuaW5nKSAmJlxuICAgICAgIWdsb2JhbC5saXRJc3N1ZWRXYXJuaW5ncyEuaGFzKGNvZGUpXG4gICAgKSB7XG4gICAgICBjb25zb2xlLndhcm4od2FybmluZyk7XG4gICAgICBnbG9iYWwubGl0SXNzdWVkV2FybmluZ3MhLmFkZCh3YXJuaW5nKTtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogQmFzZSBlbGVtZW50IGNsYXNzIHRoYXQgbWFuYWdlcyBlbGVtZW50IHByb3BlcnRpZXMgYW5kIGF0dHJpYnV0ZXMsIGFuZFxuICogcmVuZGVycyBhIGxpdC1odG1sIHRlbXBsYXRlLlxuICpcbiAqIFRvIGRlZmluZSBhIGNvbXBvbmVudCwgc3ViY2xhc3MgYExpdEVsZW1lbnRgIGFuZCBpbXBsZW1lbnQgYVxuICogYHJlbmRlcmAgbWV0aG9kIHRvIHByb3ZpZGUgdGhlIGNvbXBvbmVudCdzIHRlbXBsYXRlLiBEZWZpbmUgcHJvcGVydGllc1xuICogdXNpbmcgdGhlIHtAbGlua2NvZGUgTGl0RWxlbWVudC5wcm9wZXJ0aWVzIHByb3BlcnRpZXN9IHByb3BlcnR5IG9yIHRoZVxuICoge0BsaW5rY29kZSBwcm9wZXJ0eX0gZGVjb3JhdG9yLlxuICovXG5leHBvcnQgY2xhc3MgTGl0RWxlbWVudCBleHRlbmRzIFJlYWN0aXZlRWxlbWVudCB7XG4gIC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gIHN0YXRpYyBbJ18kbGl0RWxlbWVudCQnXSA9IHRydWU7XG5cbiAgLyoqXG4gICAqIEBjYXRlZ29yeSByZW5kZXJpbmdcbiAgICovXG4gIHJlYWRvbmx5IHJlbmRlck9wdGlvbnM6IFJlbmRlck9wdGlvbnMgPSB7aG9zdDogdGhpc307XG5cbiAgcHJpdmF0ZSBfX2NoaWxkUGFydDogUm9vdFBhcnQgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBjYXRlZ29yeSByZW5kZXJpbmdcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBjcmVhdGVSZW5kZXJSb290KCkge1xuICAgIGNvbnN0IHJlbmRlclJvb3QgPSBzdXBlci5jcmVhdGVSZW5kZXJSb290KCk7XG4gICAgLy8gV2hlbiBhZG9wdGVkU3R5bGVTaGVldHMgYXJlIHNoaW1tZWQsIHRoZXkgYXJlIGluc2VydGVkIGludG8gdGhlXG4gICAgLy8gc2hhZG93Um9vdCBieSBjcmVhdGVSZW5kZXJSb290LiBBZGp1c3QgdGhlIHJlbmRlckJlZm9yZSBub2RlIHNvIHRoYXRcbiAgICAvLyBhbnkgc3R5bGVzIGluIExpdCBjb250ZW50IHJlbmRlciBiZWZvcmUgYWRvcHRlZFN0eWxlU2hlZXRzLiBUaGlzIGlzXG4gICAgLy8gaW1wb3J0YW50IHNvIHRoYXQgYWRvcHRlZFN0eWxlU2hlZXRzIGhhdmUgcHJlY2VkZW5jZSBvdmVyIHN0eWxlcyBpblxuICAgIC8vIHRoZSBzaGFkb3dSb290LlxuICAgIHRoaXMucmVuZGVyT3B0aW9ucy5yZW5kZXJCZWZvcmUgPz89IHJlbmRlclJvb3QhLmZpcnN0Q2hpbGQgYXMgQ2hpbGROb2RlO1xuICAgIHJldHVybiByZW5kZXJSb290O1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIGVsZW1lbnQuIFRoaXMgbWV0aG9kIHJlZmxlY3RzIHByb3BlcnR5IHZhbHVlcyB0byBhdHRyaWJ1dGVzXG4gICAqIGFuZCBjYWxscyBgcmVuZGVyYCB0byByZW5kZXIgRE9NIHZpYSBsaXQtaHRtbC4gU2V0dGluZyBwcm9wZXJ0aWVzIGluc2lkZVxuICAgKiB0aGlzIG1ldGhvZCB3aWxsICpub3QqIHRyaWdnZXIgYW5vdGhlciB1cGRhdGUuXG4gICAqIEBwYXJhbSBjaGFuZ2VkUHJvcGVydGllcyBNYXAgb2YgY2hhbmdlZCBwcm9wZXJ0aWVzIHdpdGggb2xkIHZhbHVlc1xuICAgKiBAY2F0ZWdvcnkgdXBkYXRlc1xuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHVwZGF0ZShjaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZXMpIHtcbiAgICAvLyBTZXR0aW5nIHByb3BlcnRpZXMgaW4gYHJlbmRlcmAgc2hvdWxkIG5vdCB0cmlnZ2VyIGFuIHVwZGF0ZS4gU2luY2VcbiAgICAvLyB1cGRhdGVzIGFyZSBhbGxvd2VkIGFmdGVyIHN1cGVyLnVwZGF0ZSwgaXQncyBpbXBvcnRhbnQgdG8gY2FsbCBgcmVuZGVyYFxuICAgIC8vIGJlZm9yZSB0aGF0LlxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5yZW5kZXIoKTtcbiAgICBpZiAoIXRoaXMuaGFzVXBkYXRlZCkge1xuICAgICAgdGhpcy5yZW5kZXJPcHRpb25zLmlzQ29ubmVjdGVkID0gdGhpcy5pc0Nvbm5lY3RlZDtcbiAgICB9XG4gICAgc3VwZXIudXBkYXRlKGNoYW5nZWRQcm9wZXJ0aWVzKTtcbiAgICB0aGlzLl9fY2hpbGRQYXJ0ID0gcmVuZGVyKHZhbHVlLCB0aGlzLnJlbmRlclJvb3QsIHRoaXMucmVuZGVyT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogSW52b2tlZCB3aGVuIHRoZSBjb21wb25lbnQgaXMgYWRkZWQgdG8gdGhlIGRvY3VtZW50J3MgRE9NLlxuICAgKlxuICAgKiBJbiBgY29ubmVjdGVkQ2FsbGJhY2soKWAgeW91IHNob3VsZCBzZXR1cCB0YXNrcyB0aGF0IHNob3VsZCBvbmx5IG9jY3VyIHdoZW5cbiAgICogdGhlIGVsZW1lbnQgaXMgY29ubmVjdGVkIHRvIHRoZSBkb2N1bWVudC4gVGhlIG1vc3QgY29tbW9uIG9mIHRoZXNlIGlzXG4gICAqIGFkZGluZyBldmVudCBsaXN0ZW5lcnMgdG8gbm9kZXMgZXh0ZXJuYWwgdG8gdGhlIGVsZW1lbnQsIGxpa2UgYSBrZXlkb3duXG4gICAqIGV2ZW50IGhhbmRsZXIgYWRkZWQgdG8gdGhlIHdpbmRvdy5cbiAgICpcbiAgICogYGBgdHNcbiAgICogY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAqICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICogICBhZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5faGFuZGxlS2V5ZG93bik7XG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIFR5cGljYWxseSwgYW55dGhpbmcgZG9uZSBpbiBgY29ubmVjdGVkQ2FsbGJhY2soKWAgc2hvdWxkIGJlIHVuZG9uZSB3aGVuIHRoZVxuICAgKiBlbGVtZW50IGlzIGRpc2Nvbm5lY3RlZCwgaW4gYGRpc2Nvbm5lY3RlZENhbGxiYWNrKClgLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgbGlmZWN5Y2xlXG4gICAqL1xuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuX19jaGlsZFBhcnQ/LnNldENvbm5lY3RlZCh0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZva2VkIHdoZW4gdGhlIGNvbXBvbmVudCBpcyByZW1vdmVkIGZyb20gdGhlIGRvY3VtZW50J3MgRE9NLlxuICAgKlxuICAgKiBUaGlzIGNhbGxiYWNrIGlzIHRoZSBtYWluIHNpZ25hbCB0byB0aGUgZWxlbWVudCB0aGF0IGl0IG1heSBubyBsb25nZXIgYmVcbiAgICogdXNlZC4gYGRpc2Nvbm5lY3RlZENhbGxiYWNrKClgIHNob3VsZCBlbnN1cmUgdGhhdCBub3RoaW5nIGlzIGhvbGRpbmcgYVxuICAgKiByZWZlcmVuY2UgdG8gdGhlIGVsZW1lbnQgKHN1Y2ggYXMgZXZlbnQgbGlzdGVuZXJzIGFkZGVkIHRvIG5vZGVzIGV4dGVybmFsXG4gICAqIHRvIHRoZSBlbGVtZW50KSwgc28gdGhhdCBpdCBpcyBmcmVlIHRvIGJlIGdhcmJhZ2UgY29sbGVjdGVkLlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICogICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgKiAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5faGFuZGxlS2V5ZG93bik7XG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIEFuIGVsZW1lbnQgbWF5IGJlIHJlLWNvbm5lY3RlZCBhZnRlciBiZWluZyBkaXNjb25uZWN0ZWQuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBsaWZlY3ljbGVcbiAgICovXG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5fX2NoaWxkUGFydD8uc2V0Q29ubmVjdGVkKGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZva2VkIG9uIGVhY2ggdXBkYXRlIHRvIHBlcmZvcm0gcmVuZGVyaW5nIHRhc2tzLiBUaGlzIG1ldGhvZCBtYXkgcmV0dXJuXG4gICAqIGFueSB2YWx1ZSByZW5kZXJhYmxlIGJ5IGxpdC1odG1sJ3MgYENoaWxkUGFydGAgLSB0eXBpY2FsbHkgYVxuICAgKiBgVGVtcGxhdGVSZXN1bHRgLiBTZXR0aW5nIHByb3BlcnRpZXMgaW5zaWRlIHRoaXMgbWV0aG9kIHdpbGwgKm5vdCogdHJpZ2dlclxuICAgKiB0aGUgZWxlbWVudCB0byB1cGRhdGUuXG4gICAqIEBjYXRlZ29yeSByZW5kZXJpbmdcbiAgICovXG4gIHByb3RlY3RlZCByZW5kZXIoKTogdW5rbm93biB7XG4gICAgcmV0dXJuIG5vQ2hhbmdlO1xuICB9XG59XG5cbi8qKlxuICogRW5zdXJlIHRoaXMgY2xhc3MgaXMgbWFya2VkIGFzIGBmaW5hbGl6ZWRgIGFzIGFuIG9wdGltaXphdGlvbiBlbnN1cmluZ1xuICogaXQgd2lsbCBub3QgbmVlZGxlc3NseSB0cnkgdG8gYGZpbmFsaXplYC5cbiAqXG4gKiBOb3RlIHRoaXMgcHJvcGVydHkgbmFtZSBpcyBhIHN0cmluZyB0byBwcmV2ZW50IGJyZWFraW5nIENsb3N1cmUgSlMgQ29tcGlsZXJcbiAqIG9wdGltaXphdGlvbnMuIFNlZSBAbGl0L3JlYWN0aXZlLWVsZW1lbnQgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKi9cbihMaXRFbGVtZW50IGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW1xuICBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdmaW5hbGl6ZWQnLCBMaXRFbGVtZW50KVxuXSA9IHRydWU7XG5cbi8vIEluc3RhbGwgaHlkcmF0aW9uIGlmIGF2YWlsYWJsZVxuZ2xvYmFsLmxpdEVsZW1lbnRIeWRyYXRlU3VwcG9ydD8uKHtMaXRFbGVtZW50fSk7XG5cbi8vIEFwcGx5IHBvbHlmaWxscyBpZiBhdmFpbGFibGVcbmNvbnN0IHBvbHlmaWxsU3VwcG9ydCA9IERFVl9NT0RFXG4gID8gZ2xvYmFsLmxpdEVsZW1lbnRQb2x5ZmlsbFN1cHBvcnREZXZNb2RlXG4gIDogZ2xvYmFsLmxpdEVsZW1lbnRQb2x5ZmlsbFN1cHBvcnQ7XG5wb2x5ZmlsbFN1cHBvcnQ/Lih7TGl0RWxlbWVudH0pO1xuXG4vKipcbiAqIEVORCBVU0VSUyBTSE9VTEQgTk9UIFJFTFkgT04gVEhJUyBPQkpFQ1QuXG4gKlxuICogUHJpdmF0ZSBleHBvcnRzIGZvciB1c2UgYnkgb3RoZXIgTGl0IHBhY2thZ2VzLCBub3QgaW50ZW5kZWQgZm9yIHVzZSBieVxuICogZXh0ZXJuYWwgdXNlcnMuXG4gKlxuICogV2UgY3VycmVudGx5IGRvIG5vdCBtYWtlIGEgbWFuZ2xlZCByb2xsdXAgYnVpbGQgb2YgdGhlIGxpdC1zc3IgY29kZS4gSW4gb3JkZXJcbiAqIHRvIGtlZXAgYSBudW1iZXIgb2YgKG90aGVyd2lzZSBwcml2YXRlKSB0b3AtbGV2ZWwgZXhwb3J0cyAgbWFuZ2xlZCBpbiB0aGVcbiAqIGNsaWVudCBzaWRlIGNvZGUsIHdlIGV4cG9ydCBhIF8kTEUgb2JqZWN0IGNvbnRhaW5pbmcgdGhvc2UgbWVtYmVycyAob3JcbiAqIGhlbHBlciBtZXRob2RzIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSBmaWVsZHMgb2YgdGhvc2UgbWVtYmVycyksIGFuZCB0aGVuXG4gKiByZS1leHBvcnQgdGhlbSBmb3IgdXNlIGluIGxpdC1zc3IuIFRoaXMga2VlcHMgbGl0LXNzciBhZ25vc3RpYyB0byB3aGV0aGVyIHRoZVxuICogY2xpZW50LXNpZGUgY29kZSBpcyBiZWluZyB1c2VkIGluIGBkZXZgIG1vZGUgb3IgYHByb2RgIG1vZGUuXG4gKlxuICogVGhpcyBoYXMgYSB1bmlxdWUgbmFtZSwgdG8gZGlzYW1iaWd1YXRlIGl0IGZyb20gcHJpdmF0ZSBleHBvcnRzIGluXG4gKiBsaXQtaHRtbCwgc2luY2UgdGhpcyBtb2R1bGUgcmUtZXhwb3J0cyBhbGwgb2YgbGl0LWh0bWwuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IF8kTEUgPSB7XG4gIF8kYXR0cmlidXRlVG9Qcm9wZXJ0eTogKFxuICAgIGVsOiBMaXRFbGVtZW50LFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZTogc3RyaW5nIHwgbnVsbFxuICApID0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAoZWwgYXMgYW55KS5fJGF0dHJpYnV0ZVRvUHJvcGVydHkobmFtZSwgdmFsdWUpO1xuICB9LFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgXyRjaGFuZ2VkUHJvcGVydGllczogKGVsOiBMaXRFbGVtZW50KSA9PiAoZWwgYXMgYW55KS5fJGNoYW5nZWRQcm9wZXJ0aWVzLFxufTtcblxuLy8gSU1QT1JUQU5UOiBkbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0eSBuYW1lIG9yIHRoZSBhc3NpZ25tZW50IGV4cHJlc3Npb24uXG4vLyBUaGlzIGxpbmUgd2lsbCBiZSB1c2VkIGluIHJlZ2V4ZXMgdG8gc2VhcmNoIGZvciBMaXRFbGVtZW50IHVzYWdlLlxuKGdsb2JhbC5saXRFbGVtZW50VmVyc2lvbnMgPz89IFtdKS5wdXNoKCc0LjIuMCcpO1xuaWYgKERFVl9NT0RFICYmIGdsb2JhbC5saXRFbGVtZW50VmVyc2lvbnMubGVuZ3RoID4gMSkge1xuICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgaXNzdWVXYXJuaW5nIShcbiAgICAgICdtdWx0aXBsZS12ZXJzaW9ucycsXG4gICAgICBgTXVsdGlwbGUgdmVyc2lvbnMgb2YgTGl0IGxvYWRlZC4gTG9hZGluZyBtdWx0aXBsZSB2ZXJzaW9ucyBgICtcbiAgICAgICAgYGlzIG5vdCByZWNvbW1lbmRlZC5gXG4gICAgKTtcbiAgfSk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZVxuICovXG5cbi8qXG4gKiBJTVBPUlRBTlQ6IEZvciBjb21wYXRpYmlsaXR5IHdpdGggdHNpY2tsZSBhbmQgdGhlIENsb3N1cmUgSlMgY29tcGlsZXIsIGFsbFxuICogcHJvcGVydHkgZGVjb3JhdG9ycyAoYnV0IG5vdCBjbGFzcyBkZWNvcmF0b3JzKSBpbiB0aGlzIGZpbGUgdGhhdCBoYXZlXG4gKiBhbiBARXhwb3J0RGVjb3JhdGVkSXRlbXMgYW5ub3RhdGlvbiBtdXN0IGJlIGRlZmluZWQgYXMgYSByZWd1bGFyIGZ1bmN0aW9uLFxuICogbm90IGFuIGFycm93IGZ1bmN0aW9uLlxuICovXG5cbmltcG9ydCB0eXBlIHtDb25zdHJ1Y3Rvcn0gZnJvbSAnLi9iYXNlLmpzJztcblxuLyoqXG4gKiBBbGxvdyBmb3IgY3VzdG9tIGVsZW1lbnQgY2xhc3NlcyB3aXRoIHByaXZhdGUgY29uc3RydWN0b3JzXG4gKi9cbnR5cGUgQ3VzdG9tRWxlbWVudENsYXNzID0gT21pdDx0eXBlb2YgSFRNTEVsZW1lbnQsICduZXcnPjtcblxuZXhwb3J0IHR5cGUgQ3VzdG9tRWxlbWVudERlY29yYXRvciA9IHtcbiAgLy8gbGVnYWN5XG4gIChjbHM6IEN1c3RvbUVsZW1lbnRDbGFzcyk6IHZvaWQ7XG5cbiAgLy8gc3RhbmRhcmRcbiAgKFxuICAgIHRhcmdldDogQ3VzdG9tRWxlbWVudENsYXNzLFxuICAgIGNvbnRleHQ6IENsYXNzRGVjb3JhdG9yQ29udGV4dDxDb25zdHJ1Y3RvcjxIVE1MRWxlbWVudD4+XG4gICk6IHZvaWQ7XG59O1xuXG4vKipcbiAqIENsYXNzIGRlY29yYXRvciBmYWN0b3J5IHRoYXQgZGVmaW5lcyB0aGUgZGVjb3JhdGVkIGNsYXNzIGFzIGEgY3VzdG9tIGVsZW1lbnQuXG4gKlxuICogYGBganNcbiAqIEBjdXN0b21FbGVtZW50KCdteS1lbGVtZW50JylcbiAqIGNsYXNzIE15RWxlbWVudCBleHRlbmRzIExpdEVsZW1lbnQge1xuICogICByZW5kZXIoKSB7XG4gKiAgICAgcmV0dXJuIGh0bWxgYDtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKiBAY2F0ZWdvcnkgRGVjb3JhdG9yXG4gKiBAcGFyYW0gdGFnTmFtZSBUaGUgdGFnIG5hbWUgb2YgdGhlIGN1c3RvbSBlbGVtZW50IHRvIGRlZmluZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGN1c3RvbUVsZW1lbnQgPVxuICAodGFnTmFtZTogc3RyaW5nKTogQ3VzdG9tRWxlbWVudERlY29yYXRvciA9PlxuICAoXG4gICAgY2xhc3NPclRhcmdldDogQ3VzdG9tRWxlbWVudENsYXNzIHwgQ29uc3RydWN0b3I8SFRNTEVsZW1lbnQ+LFxuICAgIGNvbnRleHQ/OiBDbGFzc0RlY29yYXRvckNvbnRleHQ8Q29uc3RydWN0b3I8SFRNTEVsZW1lbnQ+PlxuICApID0+IHtcbiAgICBpZiAoY29udGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb250ZXh0LmFkZEluaXRpYWxpemVyKCgpID0+IHtcbiAgICAgICAgY3VzdG9tRWxlbWVudHMuZGVmaW5lKFxuICAgICAgICAgIHRhZ05hbWUsXG4gICAgICAgICAgY2xhc3NPclRhcmdldCBhcyBDdXN0b21FbGVtZW50Q29uc3RydWN0b3JcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjdXN0b21FbGVtZW50cy5kZWZpbmUodGFnTmFtZSwgY2xhc3NPclRhcmdldCBhcyBDdXN0b21FbGVtZW50Q29uc3RydWN0b3IpO1xuICAgIH1cbiAgfTtcbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4gKi9cblxuLypcbiAqIElNUE9SVEFOVDogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0c2lja2xlIGFuZCB0aGUgQ2xvc3VyZSBKUyBjb21waWxlciwgYWxsXG4gKiBwcm9wZXJ0eSBkZWNvcmF0b3JzIChidXQgbm90IGNsYXNzIGRlY29yYXRvcnMpIGluIHRoaXMgZmlsZSB0aGF0IGhhdmVcbiAqIGFuIEBFeHBvcnREZWNvcmF0ZWRJdGVtcyBhbm5vdGF0aW9uIG11c3QgYmUgZGVmaW5lZCBhcyBhIHJlZ3VsYXIgZnVuY3Rpb24sXG4gKiBub3QgYW4gYXJyb3cgZnVuY3Rpb24uXG4gKi9cblxuaW1wb3J0IHtcbiAgdHlwZSBQcm9wZXJ0eURlY2xhcmF0aW9uLFxuICB0eXBlIFJlYWN0aXZlRWxlbWVudCxcbiAgZGVmYXVsdENvbnZlcnRlcixcbiAgbm90RXF1YWwsXG59IGZyb20gJy4uL3JlYWN0aXZlLWVsZW1lbnQuanMnO1xuaW1wb3J0IHR5cGUge0ludGVyZmFjZX0gZnJvbSAnLi9iYXNlLmpzJztcblxuY29uc3QgREVWX01PREUgPSB0cnVlO1xuXG5sZXQgaXNzdWVXYXJuaW5nOiAoY29kZTogc3RyaW5nLCB3YXJuaW5nOiBzdHJpbmcpID0+IHZvaWQ7XG5cbmlmIChERVZfTU9ERSkge1xuICAvLyBFbnN1cmUgd2FybmluZ3MgYXJlIGlzc3VlZCBvbmx5IDF4LCBldmVuIGlmIG11bHRpcGxlIHZlcnNpb25zIG9mIExpdFxuICAvLyBhcmUgbG9hZGVkLlxuICBnbG9iYWxUaGlzLmxpdElzc3VlZFdhcm5pbmdzID8/PSBuZXcgU2V0KCk7XG5cbiAgLyoqXG4gICAqIElzc3VlIGEgd2FybmluZyBpZiB3ZSBoYXZlbid0IGFscmVhZHksIGJhc2VkIGVpdGhlciBvbiBgY29kZWAgb3IgYHdhcm5pbmdgLlxuICAgKiBXYXJuaW5ncyBhcmUgZGlzYWJsZWQgYXV0b21hdGljYWxseSBvbmx5IGJ5IGB3YXJuaW5nYDsgZGlzYWJsaW5nIHZpYSBgY29kZWBcbiAgICogY2FuIGJlIGRvbmUgYnkgdXNlcnMuXG4gICAqL1xuICBpc3N1ZVdhcm5pbmcgPSAoY29kZTogc3RyaW5nLCB3YXJuaW5nOiBzdHJpbmcpID0+IHtcbiAgICB3YXJuaW5nICs9IGAgU2VlIGh0dHBzOi8vbGl0LmRldi9tc2cvJHtjb2RlfSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5gO1xuICAgIGlmIChcbiAgICAgICFnbG9iYWxUaGlzLmxpdElzc3VlZFdhcm5pbmdzIS5oYXMod2FybmluZykgJiZcbiAgICAgICFnbG9iYWxUaGlzLmxpdElzc3VlZFdhcm5pbmdzIS5oYXMoY29kZSlcbiAgICApIHtcbiAgICAgIGNvbnNvbGUud2Fybih3YXJuaW5nKTtcbiAgICAgIGdsb2JhbFRoaXMubGl0SXNzdWVkV2FybmluZ3MhLmFkZCh3YXJuaW5nKTtcbiAgICB9XG4gIH07XG59XG5cbi8vIE92ZXJsb2FkcyBmb3IgcHJvcGVydHkgZGVjb3JhdG9yIHNvIHRoYXQgVHlwZVNjcmlwdCBjYW4gaW5mZXIgdGhlIGNvcnJlY3Rcbi8vIHJldHVybiB0eXBlIHdoZW4gYSBkZWNvcmF0b3IgaXMgdXNlZCBhcyBhbiBhY2Nlc3NvciBkZWNvcmF0b3Igb3IgYSBzZXR0ZXJcbi8vIGRlY29yYXRvci5cbmV4cG9ydCB0eXBlIFByb3BlcnR5RGVjb3JhdG9yID0ge1xuICAvLyBhY2Nlc3NvciBkZWNvcmF0b3Igc2lnbmF0dXJlXG4gIDxDIGV4dGVuZHMgSW50ZXJmYWNlPFJlYWN0aXZlRWxlbWVudD4sIFY+KFxuICAgIHRhcmdldDogQ2xhc3NBY2Nlc3NvckRlY29yYXRvclRhcmdldDxDLCBWPixcbiAgICBjb250ZXh0OiBDbGFzc0FjY2Vzc29yRGVjb3JhdG9yQ29udGV4dDxDLCBWPlxuICApOiBDbGFzc0FjY2Vzc29yRGVjb3JhdG9yUmVzdWx0PEMsIFY+O1xuXG4gIC8vIHNldHRlciBkZWNvcmF0b3Igc2lnbmF0dXJlXG4gIDxDIGV4dGVuZHMgSW50ZXJmYWNlPFJlYWN0aXZlRWxlbWVudD4sIFY+KFxuICAgIHRhcmdldDogKHZhbHVlOiBWKSA9PiB2b2lkLFxuICAgIGNvbnRleHQ6IENsYXNzU2V0dGVyRGVjb3JhdG9yQ29udGV4dDxDLCBWPlxuICApOiAodGhpczogQywgdmFsdWU6IFYpID0+IHZvaWQ7XG5cbiAgLy8gbGVnYWN5IGRlY29yYXRvciBzaWduYXR1cmVcbiAgKFxuICAgIHByb3RvT3JEZXNjcmlwdG9yOiBPYmplY3QsXG4gICAgbmFtZTogUHJvcGVydHlLZXksXG4gICAgZGVzY3JpcHRvcj86IFByb3BlcnR5RGVzY3JpcHRvclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICk6IGFueTtcbn07XG5cbmNvbnN0IGxlZ2FjeVByb3BlcnR5ID0gKFxuICBvcHRpb25zOiBQcm9wZXJ0eURlY2xhcmF0aW9uIHwgdW5kZWZpbmVkLFxuICBwcm90bzogT2JqZWN0LFxuICBuYW1lOiBQcm9wZXJ0eUtleVxuKSA9PiB7XG4gIGNvbnN0IGhhc093blByb3BlcnR5ID0gcHJvdG8uaGFzT3duUHJvcGVydHkobmFtZSk7XG4gIChwcm90by5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgUmVhY3RpdmVFbGVtZW50KS5jcmVhdGVQcm9wZXJ0eShuYW1lLCBvcHRpb25zKTtcbiAgLy8gRm9yIGFjY2Vzc29ycyAod2hpY2ggaGF2ZSBhIGRlc2NyaXB0b3Igb24gdGhlIHByb3RvdHlwZSkgd2UgbmVlZCB0b1xuICAvLyByZXR1cm4gYSBkZXNjcmlwdG9yLCBvdGhlcndpc2UgVHlwZVNjcmlwdCBvdmVyd3JpdGVzIHRoZSBkZXNjcmlwdG9yIHdlXG4gIC8vIGRlZmluZSBpbiBjcmVhdGVQcm9wZXJ0eSgpIHdpdGggdGhlIG9yaWdpbmFsIGRlc2NyaXB0b3IuIFdlIGRvbid0IGRvIHRoaXNcbiAgLy8gZm9yIGZpZWxkcywgd2hpY2ggZG9uJ3QgaGF2ZSBhIGRlc2NyaXB0b3IsIGJlY2F1c2UgdGhpcyBjb3VsZCBvdmVyd3JpdGVcbiAgLy8gZGVzY3JpcHRvciBkZWZpbmVkIGJ5IG90aGVyIGRlY29yYXRvcnMuXG4gIHJldHVybiBoYXNPd25Qcm9wZXJ0eVxuICAgID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90bywgbmFtZSlcbiAgICA6IHVuZGVmaW5lZDtcbn07XG5cbi8vIFRoaXMgaXMgZHVwbGljYXRlZCBmcm9tIGEgc2ltaWxhciB2YXJpYWJsZSBpbiByZWFjdGl2ZS1lbGVtZW50LnRzLCBidXRcbi8vIGFjdHVhbGx5IG1ha2VzIHNlbnNlIHRvIGhhdmUgdGhpcyBkZWZhdWx0IGRlZmluZWQgd2l0aCB0aGUgZGVjb3JhdG9yLCBzb1xuLy8gdGhhdCBkaWZmZXJlbnQgZGVjb3JhdG9ycyBjb3VsZCBoYXZlIGRpZmZlcmVudCBkZWZhdWx0cy5cbmNvbnN0IGRlZmF1bHRQcm9wZXJ0eURlY2xhcmF0aW9uOiBQcm9wZXJ0eURlY2xhcmF0aW9uID0ge1xuICBhdHRyaWJ1dGU6IHRydWUsXG4gIHR5cGU6IFN0cmluZyxcbiAgY29udmVydGVyOiBkZWZhdWx0Q29udmVydGVyLFxuICByZWZsZWN0OiBmYWxzZSxcbiAgaGFzQ2hhbmdlZDogbm90RXF1YWwsXG59O1xuXG4vLyBUZW1wb3JhcnkgdHlwZSwgdW50aWwgZ29vZ2xlMyBpcyBvbiBUeXBlU2NyaXB0IDUuMlxudHlwZSBTdGFuZGFyZFByb3BlcnR5Q29udGV4dDxDLCBWPiA9IChcbiAgfCBDbGFzc0FjY2Vzc29yRGVjb3JhdG9yQ29udGV4dDxDLCBWPlxuICB8IENsYXNzU2V0dGVyRGVjb3JhdG9yQ29udGV4dDxDLCBWPlxuKSAmIHttZXRhZGF0YTogb2JqZWN0fTtcblxuLyoqXG4gKiBXcmFwcyBhIGNsYXNzIGFjY2Vzc29yIG9yIHNldHRlciBzbyB0aGF0IGByZXF1ZXN0VXBkYXRlKClgIGlzIGNhbGxlZCB3aXRoIHRoZVxuICogcHJvcGVydHkgbmFtZSBhbmQgb2xkIHZhbHVlIHdoZW4gdGhlIGFjY2Vzc29yIGlzIHNldC5cbiAqL1xuZXhwb3J0IGNvbnN0IHN0YW5kYXJkUHJvcGVydHkgPSA8QyBleHRlbmRzIEludGVyZmFjZTxSZWFjdGl2ZUVsZW1lbnQ+LCBWPihcbiAgb3B0aW9uczogUHJvcGVydHlEZWNsYXJhdGlvbiA9IGRlZmF1bHRQcm9wZXJ0eURlY2xhcmF0aW9uLFxuICB0YXJnZXQ6IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JUYXJnZXQ8QywgVj4gfCAoKHZhbHVlOiBWKSA9PiB2b2lkKSxcbiAgY29udGV4dDogU3RhbmRhcmRQcm9wZXJ0eUNvbnRleHQ8QywgVj5cbik6IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JSZXN1bHQ8QywgVj4gfCAoKHRoaXM6IEMsIHZhbHVlOiBWKSA9PiB2b2lkKSA9PiB7XG4gIGNvbnN0IHtraW5kLCBtZXRhZGF0YX0gPSBjb250ZXh0O1xuXG4gIGlmIChERVZfTU9ERSAmJiBtZXRhZGF0YSA9PSBudWxsKSB7XG4gICAgaXNzdWVXYXJuaW5nKFxuICAgICAgJ21pc3NpbmctY2xhc3MtbWV0YWRhdGEnLFxuICAgICAgYFRoZSBjbGFzcyAke3RhcmdldH0gaXMgbWlzc2luZyBkZWNvcmF0b3IgbWV0YWRhdGEuIFRoaXMgYCArXG4gICAgICAgIGBjb3VsZCBtZWFuIHRoYXQgeW91J3JlIHVzaW5nIGEgY29tcGlsZXIgdGhhdCBzdXBwb3J0cyBkZWNvcmF0b3JzIGAgK1xuICAgICAgICBgYnV0IGRvZXNuJ3Qgc3VwcG9ydCBkZWNvcmF0b3IgbWV0YWRhdGEsIHN1Y2ggYXMgVHlwZVNjcmlwdCA1LjEuIGAgK1xuICAgICAgICBgUGxlYXNlIHVwZGF0ZSB5b3VyIGNvbXBpbGVyLmBcbiAgICApO1xuICB9XG5cbiAgLy8gU3RvcmUgdGhlIHByb3BlcnR5IG9wdGlvbnNcbiAgbGV0IHByb3BlcnRpZXMgPSBnbG9iYWxUaGlzLmxpdFByb3BlcnR5TWV0YWRhdGEuZ2V0KG1ldGFkYXRhKTtcbiAgaWYgKHByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCkge1xuICAgIGdsb2JhbFRoaXMubGl0UHJvcGVydHlNZXRhZGF0YS5zZXQobWV0YWRhdGEsIChwcm9wZXJ0aWVzID0gbmV3IE1hcCgpKSk7XG4gIH1cbiAgaWYgKGtpbmQgPT09ICdzZXR0ZXInKSB7XG4gICAgb3B0aW9ucyA9IE9iamVjdC5jcmVhdGUob3B0aW9ucyk7XG4gICAgb3B0aW9ucy53cmFwcGVkID0gdHJ1ZTtcbiAgfVxuICBwcm9wZXJ0aWVzLnNldChjb250ZXh0Lm5hbWUsIG9wdGlvbnMpO1xuXG4gIGlmIChraW5kID09PSAnYWNjZXNzb3InKSB7XG4gICAgLy8gU3RhbmRhcmQgZGVjb3JhdG9ycyBjYW5ub3QgZHluYW1pY2FsbHkgbW9kaWZ5IHRoZSBjbGFzcywgc28gd2UgY2FuJ3RcbiAgICAvLyByZXBsYWNlIGEgZmllbGQgd2l0aCBhY2Nlc3NvcnMuIFRoZSB1c2VyIG11c3QgdXNlIHRoZSBuZXcgYGFjY2Vzc29yYFxuICAgIC8vIGtleXdvcmQgaW5zdGVhZC5cbiAgICBjb25zdCB7bmFtZX0gPSBjb250ZXh0O1xuICAgIHJldHVybiB7XG4gICAgICBzZXQodGhpczogUmVhY3RpdmVFbGVtZW50LCB2OiBWKSB7XG4gICAgICAgIGNvbnN0IG9sZFZhbHVlID0gKFxuICAgICAgICAgIHRhcmdldCBhcyBDbGFzc0FjY2Vzc29yRGVjb3JhdG9yVGFyZ2V0PEMsIFY+XG4gICAgICAgICkuZ2V0LmNhbGwodGhpcyBhcyB1bmtub3duIGFzIEMpO1xuICAgICAgICAodGFyZ2V0IGFzIENsYXNzQWNjZXNzb3JEZWNvcmF0b3JUYXJnZXQ8QywgVj4pLnNldC5jYWxsKFxuICAgICAgICAgIHRoaXMgYXMgdW5rbm93biBhcyBDLFxuICAgICAgICAgIHZcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0VXBkYXRlKG5hbWUsIG9sZFZhbHVlLCBvcHRpb25zKTtcbiAgICAgIH0sXG4gICAgICBpbml0KHRoaXM6IFJlYWN0aXZlRWxlbWVudCwgdjogVik6IFYge1xuICAgICAgICBpZiAodiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5fJGNoYW5nZVByb3BlcnR5KG5hbWUsIHVuZGVmaW5lZCwgb3B0aW9ucywgdik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHY7XG4gICAgICB9LFxuICAgIH0gYXMgdW5rbm93biBhcyBDbGFzc0FjY2Vzc29yRGVjb3JhdG9yUmVzdWx0PEMsIFY+O1xuICB9IGVsc2UgaWYgKGtpbmQgPT09ICdzZXR0ZXInKSB7XG4gICAgY29uc3Qge25hbWV9ID0gY29udGV4dDtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRoaXM6IFJlYWN0aXZlRWxlbWVudCwgdmFsdWU6IFYpIHtcbiAgICAgIGNvbnN0IG9sZFZhbHVlID0gdGhpc1tuYW1lIGFzIGtleW9mIFJlYWN0aXZlRWxlbWVudF07XG4gICAgICAodGFyZ2V0IGFzICh2YWx1ZTogVikgPT4gdm9pZCkuY2FsbCh0aGlzLCB2YWx1ZSk7XG4gICAgICB0aGlzLnJlcXVlc3RVcGRhdGUobmFtZSwgb2xkVmFsdWUsIG9wdGlvbnMpO1xuICAgIH0gYXMgdW5rbm93biBhcyAodGhpczogQywgdmFsdWU6IFYpID0+IHZvaWQ7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBkZWNvcmF0b3IgbG9jYXRpb246ICR7a2luZH1gKTtcbn07XG5cbi8qKlxuICogQSBjbGFzcyBmaWVsZCBvciBhY2Nlc3NvciBkZWNvcmF0b3Igd2hpY2ggY3JlYXRlcyBhIHJlYWN0aXZlIHByb3BlcnR5IHRoYXRcbiAqIHJlZmxlY3RzIGEgY29ycmVzcG9uZGluZyBhdHRyaWJ1dGUgdmFsdWUuIFdoZW4gYSBkZWNvcmF0ZWQgcHJvcGVydHkgaXMgc2V0XG4gKiB0aGUgZWxlbWVudCB3aWxsIHVwZGF0ZSBhbmQgcmVuZGVyLiBBIHtAbGlua2NvZGUgUHJvcGVydHlEZWNsYXJhdGlvbn0gbWF5XG4gKiBvcHRpb25hbGx5IGJlIHN1cHBsaWVkIHRvIGNvbmZpZ3VyZSBwcm9wZXJ0eSBmZWF0dXJlcy5cbiAqXG4gKiBUaGlzIGRlY29yYXRvciBzaG91bGQgb25seSBiZSB1c2VkIGZvciBwdWJsaWMgZmllbGRzLiBBcyBwdWJsaWMgZmllbGRzLFxuICogcHJvcGVydGllcyBzaG91bGQgYmUgY29uc2lkZXJlZCBhcyBwcmltYXJpbHkgc2V0dGFibGUgYnkgZWxlbWVudCB1c2VycyxcbiAqIGVpdGhlciB2aWEgYXR0cmlidXRlIG9yIHRoZSBwcm9wZXJ0eSBpdHNlbGYuXG4gKlxuICogR2VuZXJhbGx5LCBwcm9wZXJ0aWVzIHRoYXQgYXJlIGNoYW5nZWQgYnkgdGhlIGVsZW1lbnQgc2hvdWxkIGJlIHByaXZhdGUgb3JcbiAqIHByb3RlY3RlZCBmaWVsZHMgYW5kIHNob3VsZCB1c2UgdGhlIHtAbGlua2NvZGUgc3RhdGV9IGRlY29yYXRvci5cbiAqXG4gKiBIb3dldmVyLCBzb21ldGltZXMgZWxlbWVudCBjb2RlIGRvZXMgbmVlZCB0byBzZXQgYSBwdWJsaWMgcHJvcGVydHkuIFRoaXNcbiAqIHNob3VsZCB0eXBpY2FsbHkgb25seSBiZSBkb25lIGluIHJlc3BvbnNlIHRvIHVzZXIgaW50ZXJhY3Rpb24sIGFuZCBhbiBldmVudFxuICogc2hvdWxkIGJlIGZpcmVkIGluZm9ybWluZyB0aGUgdXNlcjsgZm9yIGV4YW1wbGUsIGEgY2hlY2tib3ggc2V0cyBpdHNcbiAqIGBjaGVja2VkYCBwcm9wZXJ0eSB3aGVuIGNsaWNrZWQgYW5kIGZpcmVzIGEgYGNoYW5nZWRgIGV2ZW50LiBNdXRhdGluZyBwdWJsaWNcbiAqIHByb3BlcnRpZXMgc2hvdWxkIHR5cGljYWxseSBub3QgYmUgZG9uZSBmb3Igbm9uLXByaW1pdGl2ZSAob2JqZWN0IG9yIGFycmF5KVxuICogcHJvcGVydGllcy4gSW4gb3RoZXIgY2FzZXMgd2hlbiBhbiBlbGVtZW50IG5lZWRzIHRvIG1hbmFnZSBzdGF0ZSwgYSBwcml2YXRlXG4gKiBwcm9wZXJ0eSBkZWNvcmF0ZWQgdmlhIHRoZSB7QGxpbmtjb2RlIHN0YXRlfSBkZWNvcmF0b3Igc2hvdWxkIGJlIHVzZWQuIFdoZW5cbiAqIG5lZWRlZCwgc3RhdGUgcHJvcGVydGllcyBjYW4gYmUgaW5pdGlhbGl6ZWQgdmlhIHB1YmxpYyBwcm9wZXJ0aWVzIHRvXG4gKiBmYWNpbGl0YXRlIGNvbXBsZXggaW50ZXJhY3Rpb25zLlxuICpcbiAqIGBgYHRzXG4gKiBjbGFzcyBNeUVsZW1lbnQge1xuICogICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pXG4gKiAgIGNsaWNrZWQgPSBmYWxzZTtcbiAqIH1cbiAqIGBgYFxuICogQGNhdGVnb3J5IERlY29yYXRvclxuICogQEV4cG9ydERlY29yYXRlZEl0ZW1zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9wZXJ0eShvcHRpb25zPzogUHJvcGVydHlEZWNsYXJhdGlvbik6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgcmV0dXJuIDxDIGV4dGVuZHMgSW50ZXJmYWNlPFJlYWN0aXZlRWxlbWVudD4sIFY+KFxuICAgIHByb3RvT3JUYXJnZXQ6XG4gICAgICB8IG9iamVjdFxuICAgICAgfCBDbGFzc0FjY2Vzc29yRGVjb3JhdG9yVGFyZ2V0PEMsIFY+XG4gICAgICB8ICgodmFsdWU6IFYpID0+IHZvaWQpLFxuICAgIG5hbWVPckNvbnRleHQ6XG4gICAgICB8IFByb3BlcnR5S2V5XG4gICAgICB8IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JDb250ZXh0PEMsIFY+XG4gICAgICB8IENsYXNzU2V0dGVyRGVjb3JhdG9yQ29udGV4dDxDLCBWPlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICk6IGFueSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHR5cGVvZiBuYW1lT3JDb250ZXh0ID09PSAnb2JqZWN0J1xuICAgICAgICA/IHN0YW5kYXJkUHJvcGVydHk8QywgVj4oXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgcHJvdG9PclRhcmdldCBhc1xuICAgICAgICAgICAgICB8IENsYXNzQWNjZXNzb3JEZWNvcmF0b3JUYXJnZXQ8QywgVj5cbiAgICAgICAgICAgICAgfCAoKHZhbHVlOiBWKSA9PiB2b2lkKSxcbiAgICAgICAgICAgIG5hbWVPckNvbnRleHQgYXMgU3RhbmRhcmRQcm9wZXJ0eUNvbnRleHQ8QywgVj5cbiAgICAgICAgICApXG4gICAgICAgIDogbGVnYWN5UHJvcGVydHkoXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgcHJvdG9PclRhcmdldCBhcyBPYmplY3QsXG4gICAgICAgICAgICBuYW1lT3JDb250ZXh0IGFzIFByb3BlcnR5S2V5XG4gICAgICAgICAgKVxuICAgICkgYXMgUHJvcGVydHlEZWNvcmF0b3I7XG4gIH07XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZVxuICovXG5cbi8qXG4gKiBJTVBPUlRBTlQ6IEZvciBjb21wYXRpYmlsaXR5IHdpdGggdHNpY2tsZSBhbmQgdGhlIENsb3N1cmUgSlMgY29tcGlsZXIsIGFsbFxuICogcHJvcGVydHkgZGVjb3JhdG9ycyAoYnV0IG5vdCBjbGFzcyBkZWNvcmF0b3JzKSBpbiB0aGlzIGZpbGUgdGhhdCBoYXZlXG4gKiBhbiBARXhwb3J0RGVjb3JhdGVkSXRlbXMgYW5ub3RhdGlvbiBtdXN0IGJlIGRlZmluZWQgYXMgYSByZWd1bGFyIGZ1bmN0aW9uLFxuICogbm90IGFuIGFycm93IGZ1bmN0aW9uLlxuICovXG5cbmltcG9ydCB7cHJvcGVydHl9IGZyb20gJy4vcHJvcGVydHkuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlRGVjbGFyYXRpb248VHlwZSA9IHVua25vd24+IHtcbiAgLyoqXG4gICAqIEEgZnVuY3Rpb24gdGhhdCBpbmRpY2F0ZXMgaWYgYSBwcm9wZXJ0eSBzaG91bGQgYmUgY29uc2lkZXJlZCBjaGFuZ2VkIHdoZW5cbiAgICogaXQgaXMgc2V0LiBUaGUgZnVuY3Rpb24gc2hvdWxkIHRha2UgdGhlIGBuZXdWYWx1ZWAgYW5kIGBvbGRWYWx1ZWAgYW5kXG4gICAqIHJldHVybiBgdHJ1ZWAgaWYgYW4gdXBkYXRlIHNob3VsZCBiZSByZXF1ZXN0ZWQuXG4gICAqL1xuICBoYXNDaGFuZ2VkPyh2YWx1ZTogVHlwZSwgb2xkVmFsdWU6IFR5cGUpOiBib29sZWFuO1xufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkIHVzZSBTdGF0ZURlY2xhcmF0aW9uXG4gKi9cbmV4cG9ydCB0eXBlIEludGVybmFsUHJvcGVydHlEZWNsYXJhdGlvbjxUeXBlID0gdW5rbm93bj4gPVxuICBTdGF0ZURlY2xhcmF0aW9uPFR5cGU+O1xuXG4vKipcbiAqIERlY2xhcmVzIGEgcHJpdmF0ZSBvciBwcm90ZWN0ZWQgcmVhY3RpdmUgcHJvcGVydHkgdGhhdCBzdGlsbCB0cmlnZ2Vyc1xuICogdXBkYXRlcyB0byB0aGUgZWxlbWVudCB3aGVuIGl0IGNoYW5nZXMuIEl0IGRvZXMgbm90IHJlZmxlY3QgZnJvbSB0aGVcbiAqIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlLlxuICpcbiAqIFByb3BlcnRpZXMgZGVjbGFyZWQgdGhpcyB3YXkgbXVzdCBub3QgYmUgdXNlZCBmcm9tIEhUTUwgb3IgSFRNTCB0ZW1wbGF0aW5nXG4gKiBzeXN0ZW1zLCB0aGV5J3JlIHNvbGVseSBmb3IgcHJvcGVydGllcyBpbnRlcm5hbCB0byB0aGUgZWxlbWVudC4gVGhlc2VcbiAqIHByb3BlcnRpZXMgbWF5IGJlIHJlbmFtZWQgYnkgb3B0aW1pemF0aW9uIHRvb2xzIGxpa2UgY2xvc3VyZSBjb21waWxlci5cbiAqIEBjYXRlZ29yeSBEZWNvcmF0b3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YXRlKG9wdGlvbnM/OiBTdGF0ZURlY2xhcmF0aW9uKSB7XG4gIHJldHVybiBwcm9wZXJ0eSh7XG4gICAgLi4ub3B0aW9ucyxcbiAgICAvLyBBZGQgYm90aCBgc3RhdGVgIGFuZCBgYXR0cmlidXRlYCBiZWNhdXNlIHdlIGZvdW5kIGEgdGhpcmQgcGFydHlcbiAgICAvLyBjb250cm9sbGVyIHRoYXQgaXMga2V5aW5nIG9mZiBvZiBQcm9wZXJ0eU9wdGlvbnMuc3RhdGUgdG8gZGV0ZXJtaW5lXG4gICAgLy8gd2hldGhlciBhIGZpZWxkIGlzIGEgcHJpdmF0ZSBpbnRlcm5hbCBwcm9wZXJ0eSBvciBub3QuXG4gICAgc3RhdGU6IHRydWUsXG4gICAgYXR0cmlidXRlOiBmYWxzZSxcbiAgfSk7XG59XG4iLCAiaW1wb3J0IHR5cGUge1xuICAgIENvbnRlbnRCbG9jayxcbiAgICBDb250ZW50QmxvY2tQYXJhbSxcbiAgICBNZXNzYWdlLFxuICAgIE1lc3NhZ2VDcmVhdGVQYXJhbXMsXG4gICAgTWVzc2FnZVBhcmFtLFxuICAgIFJhd01lc3NhZ2VTdHJlYW1FdmVudCxcbiAgICBUZXh0QmxvY2ssXG4gICAgVGV4dEJsb2NrUGFyYW0sXG4gICAgVG9vbFJlc3VsdEJsb2NrUGFyYW0sXG4gICAgVGhpbmtpbmdCbG9jayxcbiAgICBUb29sVXNlQmxvY2sgYXMgVG9vbFVzZUJsb2NrVHlwZSxcbn0gZnJvbSBcIkBhbnRocm9waWMtYWkvc2RrL3Jlc291cmNlcy9tZXNzYWdlc1wiO1xuaW1wb3J0IHR5cGUgeyBSYXdQYWlyLCBCZWRyb2NrSW52b2NhdGlvbk1ldHJpY3MgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vLyBDb3JlIGludGVyZmFjZXMgZm9yIHByb2Nlc3NlZCBkYXRhXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NlZFBhaXIge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgcmVxdWVzdDogTWVzc2FnZUNyZWF0ZVBhcmFtcztcbiAgICByZXNwb25zZTogTWVzc2FnZTtcbiAgICBtb2RlbDogc3RyaW5nO1xuICAgIGlzU3RyZWFtaW5nOiBib29sZWFuO1xuICAgIHJhd1N0cmVhbURhdGE/OiBzdHJpbmc7IC8vIFJhdyBTU0UvYm9keV9yYXcgZGF0YSBmb3IgZGVidWdnaW5nXG4gICAgc3RyZWFtRm9ybWF0PzogXCJzdGFuZGFyZFwiIHwgXCJiZWRyb2NrXCIgfCBudWxsOyAvLyBEZXRlY3RlZCBzdHJlYW0gZm9ybWF0XG59XG5cbi8vIEV4dGVuZGVkIG1lc3NhZ2UgdHlwZSB3aXRoIHRvb2wgcmVzdWx0IHBhaXJpbmdcbmV4cG9ydCBpbnRlcmZhY2UgRW5oYW5jZWRNZXNzYWdlUGFyYW0gZXh0ZW5kcyBNZXNzYWdlUGFyYW0ge1xuICAgIHRvb2xSZXN1bHRzPzogUmVjb3JkPHN0cmluZywgVG9vbFJlc3VsdEJsb2NrUGFyYW0+O1xuICAgIGhpZGU/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNpbXBsZUNvbnZlcnNhdGlvbiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBtb2RlbHM6IFNldDxzdHJpbmc+O1xuICAgIHN5c3RlbT86IHN0cmluZyB8IFRleHRCbG9ja1BhcmFtW107XG4gICAgbWVzc2FnZXM6IEVuaGFuY2VkTWVzc2FnZVBhcmFtW107XG4gICAgcmVzcG9uc2U6IE1lc3NhZ2U7XG4gICAgYWxsUGFpcnM6IFByb2Nlc3NlZFBhaXJbXTtcbiAgICBmaW5hbFBhaXI6IFByb2Nlc3NlZFBhaXI7XG4gICAgY29tcGFjdGVkPzogYm9vbGVhbjtcbiAgICBtZXRhZGF0YToge1xuICAgICAgICBzdGFydFRpbWU6IHN0cmluZztcbiAgICAgICAgZW5kVGltZTogc3RyaW5nO1xuICAgICAgICB0b3RhbFBhaXJzOiBudW1iZXI7XG4gICAgICAgIGlucHV0VG9rZW5zOiBudW1iZXI7XG4gICAgICAgIG91dHB1dFRva2VuczogbnVtYmVyO1xuICAgICAgICB0b3RhbFRva2VuczogbnVtYmVyO1xuICAgIH07XG59XG5cbi8qKlxuICogU2hhcmVkIGNvbnZlcnNhdGlvbiBwcm9jZXNzaW5nIGZ1bmN0aW9uYWxpdHkgZm9yIGJvdGggZnJvbnRlbmQgYW5kIGJhY2tlbmRcbiAqL1xuZXhwb3J0IGNsYXNzIFNoYXJlZENvbnZlcnNhdGlvblByb2Nlc3NvciB7XG4gICAgLyoqXG4gICAgICogUHJvY2VzcyByYXcgSlNPTkwgcGFpcnMgaW50byBQcm9jZXNzZWRQYWlyc1xuICAgICAqL1xuICAgIHByb2Nlc3NSYXdQYWlycyhyYXdQYWlyczogUmF3UGFpcltdKTogUHJvY2Vzc2VkUGFpcltdIHtcbiAgICAgICAgaWYgKCFyYXdQYWlycyB8fCByYXdQYWlycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByb2Nlc3NlZFBhaXJzOiBQcm9jZXNzZWRQYWlyW10gPSBbXTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhd1BhaXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBwYWlyID0gcmF3UGFpcnNbaV07XG4gICAgICAgICAgICBpZiAoIXBhaXI/LnJlcXVlc3QgfHwgIXBhaXI/LnJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgLy8gRGV0ZWN0IHN0cmVhbWluZ1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzU3RyZWFtaW5nID0gISFwYWlyLnJlc3BvbnNlLmJvZHlfcmF3O1xuICAgICAgICAgICAgICAgIGxldCByZXNwb25zZTogTWVzc2FnZTtcbiAgICAgICAgICAgICAgICBsZXQgc3RyZWFtRm9ybWF0OiBcInN0YW5kYXJkXCIgfCBcImJlZHJvY2tcIiB8IG51bGwgPSBudWxsO1xuXG4gICAgICAgICAgICAgICAgaWYgKHBhaXIucmVzcG9uc2UuYm9keV9yYXcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUGFyc2Ugc3RyZWFtaW5nIHJlc3BvbnNlIGFuZCBkZXRlY3QgZm9ybWF0XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbUZvcm1hdCA9IHRoaXMuaXNCZWRyb2NrUmVzcG9uc2UocGFpci5yZXNwb25zZS5ib2R5X3JhdykgPyBcImJlZHJvY2tcIiA6IFwic3RhbmRhcmRcIjtcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSB0aGlzLnBhcnNlU3RyZWFtaW5nUmVzcG9uc2UocGFpci5yZXNwb25zZS5ib2R5X3Jhdyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYWlyLnJlc3BvbnNlLmJvZHkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBwYWlyLnJlc3BvbnNlLmJvZHkgYXMgTWVzc2FnZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBFeHRyYWN0IG1vZGVsIGZyb20gcmVxdWVzdCBoZWFkZXJzIG9yIFVSTFxuICAgICAgICAgICAgICAgIGNvbnN0IG1vZGVsID0gdGhpcy5leHRyYWN0TW9kZWwocGFpcik7XG5cbiAgICAgICAgICAgICAgICBwcm9jZXNzZWRQYWlycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGAke3BhaXIucmVxdWVzdC50aW1lc3RhbXAgfHwgRGF0ZS5ub3coKX1fJHtNYXRoLnJhbmRvbSgpfWAsXG4gICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKHBhaXIucmVxdWVzdC50aW1lc3RhbXAgfHwgRGF0ZS5ub3coKSkgKiAxMDAwKS50b0lTT1N0cmluZygpLFxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0OiBwYWlyLnJlcXVlc3QuYm9keSBhcyBNZXNzYWdlQ3JlYXRlUGFyYW1zLFxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZSxcbiAgICAgICAgICAgICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgICAgICAgICAgIGlzU3RyZWFtaW5nLFxuICAgICAgICAgICAgICAgICAgICByYXdTdHJlYW1EYXRhOiBwYWlyLnJlc3BvbnNlLmJvZHlfcmF3LFxuICAgICAgICAgICAgICAgICAgICBzdHJlYW1Gb3JtYXQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIHByb2Nlc3MgcmF3IHBhaXIgYXQgaW5kZXggJHtpfTpgLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgLy8gQ29udGludWUgcHJvY2Vzc2luZyBvdGhlciBwYWlyc1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHByb2Nlc3NlZFBhaXJzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVjdCBpZiB0aGUgcmVzcG9uc2UgaXMgZnJvbSBCZWRyb2NrIGJ5IGNoZWNraW5nIGZvciBiaW5hcnkgZXZlbnQgc3RyZWFtIGZvcm1hdFxuICAgICAqL1xuICAgIHByaXZhdGUgaXNCZWRyb2NrUmVzcG9uc2UoYm9keVJhdzogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIC8vIENoZWNrIGZvciBBV1MgRXZlbnRTdHJlYW0gZm9ybWF0IHdpdGggYmluYXJ5IGhlYWRlcnMgYW5kIGJhc2U2NCBlbmNvZGVkIGV2ZW50c1xuICAgICAgICByZXR1cm4gYm9keVJhdy5zdGFydHNXaXRoKFwiXFx1MDAwMFxcdTAwMDBcIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFyc2UgQmVkcm9jayBiaW5hcnkgZXZlbnQgc3RyZWFtIGFuZCBleHRyYWN0IHRoZSBzdGFuZGFyZCBtZXNzYWdlIGV2ZW50c1xuICAgICAqL1xuICAgIHByaXZhdGUgcGFyc2VCZWRyb2NrU3RyZWFtaW5nUmVzcG9uc2UoYm9keVJhdzogc3RyaW5nKTogTWVzc2FnZSB7XG4gICAgICAgIGlmICghYm9keVJhdyB8fCBib2R5UmF3Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRW1wdHkgYm9keVJhdyBwcm92aWRlZCB0byBwYXJzZUJlZHJvY2tTdHJlYW1pbmdSZXNwb25zZVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGV2ZW50czogUmF3TWVzc2FnZVN0cmVhbUV2ZW50W10gPSBbXTtcbiAgICAgICAgbGV0IGJlZHJvY2tNZXRyaWNzOiBCZWRyb2NrSW52b2NhdGlvbk1ldHJpY3MgfCBudWxsID0gbnVsbDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gRXh0cmFjdCBKU09OIHBheWxvYWRzIGZyb20gQVdTIEV2ZW50U3RyZWFtIGZvcm1hdFxuICAgICAgICAgICAgLy8gVGhlIGZvcm1hdCBjb250YWlucyBiaW5hcnkgaGVhZGVycyBmb2xsb3dlZCBieSBKU09OIHBheWxvYWRzXG4gICAgICAgICAgICBjb25zdCBqc29uQ2h1bmtzID0gdGhpcy5leHRyYWN0SnNvbkNodW5rc0Zyb21FdmVudFN0cmVhbShib2R5UmF3KTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBqc29uQ2h1bmsgb2YganNvbkNodW5rcykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50UGF5bG9hZCA9IEpTT04ucGFyc2UoanNvbkNodW5rKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGFuIGV2ZW50IHdpdGggYmFzZTY0LWVuY29kZWQgYnl0ZXNcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50UGF5bG9hZC5ieXRlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZTY0RGF0YSA9IGV2ZW50UGF5bG9hZC5ieXRlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlY29kZWRKc29uID0gdGhpcy5kZWNvZGVCYXNlNjRUb1V0ZjgoYmFzZTY0RGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBldmVudCA9IEpTT04ucGFyc2UoZGVjb2RlZEpzb24pIGFzIFJhd01lc3NhZ2VTdHJlYW1FdmVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cy5wdXNoKGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGNodW5rRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFwiRmFpbGVkIHRvIHBhcnNlIEpTT04gY2h1bms6XCIsIGpzb25DaHVuaywgY2h1bmtFcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIC8vIENvbnRpbnVlIHdpdGggb3RoZXIgY2h1bmtzXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBFeHRyYWN0IEJlZHJvY2sgbWV0cmljcyBmcm9tIHRoZSBsYXN0IGV2ZW50IGlmIHByZXNlbnRcbiAgICAgICAgICAgIGJlZHJvY2tNZXRyaWNzID0gdGhpcy5leHRyYWN0QmVkcm9ja01ldHJpY3MoYm9keVJhdyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIHBhcnNlIEJlZHJvY2sgc3RyZWFtaW5nIHJlc3BvbnNlOlwiLCBlcnJvcik7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJlZHJvY2sgc3RyZWFtaW5nIHJlc3BvbnNlIHBhcnNpbmcgZmFpbGVkOiAke2Vycm9yfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGRNZXNzYWdlRnJvbUV2ZW50cyhldmVudHMsIGJlZHJvY2tNZXRyaWNzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWNvZGUgYmFzZTY0IHN0cmluZyB0byBVVEYtOCwgY29tcGF0aWJsZSB3aXRoIGJvdGggYnJvd3NlciBhbmQgTm9kZS5qcyBlbnZpcm9ubWVudHNcbiAgICAgKi9cbiAgICBwcml2YXRlIGRlY29kZUJhc2U2NFRvVXRmOChiYXNlNjREYXRhOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICAvLyBDaGVjayBpZiB3ZSdyZSBpbiBhIGJyb3dzZXIgZW52aXJvbm1lbnRcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIGF0b2IgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIC8vIEJyb3dzZXIgZW52aXJvbm1lbnQgLSB1c2UgYXRvYigpXG4gICAgICAgICAgICByZXR1cm4gYXRvYihiYXNlNjREYXRhKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgQnVmZmVyICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAvLyBOb2RlLmpzIGVudmlyb25tZW50IC0gdXNlIEJ1ZmZlclxuICAgICAgICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGJhc2U2NERhdGEsIFwiYmFzZTY0XCIpLnRvU3RyaW5nKFwidXRmLThcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBGYWxsYmFjayBpbXBsZW1lbnRhdGlvbiBmb3IgZW52aXJvbm1lbnRzIHdpdGhvdXQgZWl0aGVyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJCYXNlNjQgZGVjb2Rpbmcgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGVudmlyb25tZW50XCIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXh0cmFjdCBKU09OIGNodW5rcyBmcm9tIEFXUyBFdmVudFN0cmVhbSBiaW5hcnkgZm9ybWF0XG4gICAgICovXG4gICAgcHJpdmF0ZSBleHRyYWN0SnNvbkNodW5rc0Zyb21FdmVudFN0cmVhbShib2R5UmF3OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgICAgIGlmICghYm9keVJhdyB8fCBib2R5UmF3Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QganNvbkNodW5rczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgY29uc3QgcGF0dGVybiA9ICdldmVudHtcImJ5dGVzXCI6JztcblxuICAgICAgICBsZXQgc2VhcmNoSW5kZXggPSAwO1xuXG4gICAgICAgIHdoaWxlIChzZWFyY2hJbmRleCA8IGJvZHlSYXcubGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyBGaW5kIHRoZSBuZXh0IG9jY3VycmVuY2Ugb2YgdGhlIHBhdHRlcm5cbiAgICAgICAgICAgIGNvbnN0IHBhdHRlcm5JbmRleCA9IGJvZHlSYXcuaW5kZXhPZihwYXR0ZXJuLCBzZWFyY2hJbmRleCk7XG4gICAgICAgICAgICBpZiAocGF0dGVybkluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBObyBtb3JlIHBhdHRlcm5zIGZvdW5kXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFN0YXJ0IGV4dHJhY3RpbmcgSlNPTiBmcm9tIHRoZSAneycgYWZ0ZXIgJ2V2ZW50J1xuICAgICAgICAgICAgY29uc3QganNvblN0YXJ0SW5kZXggPSBwYXR0ZXJuSW5kZXggKyA1OyAvLyBTa2lwICdldmVudCcgcHJlZml4XG4gICAgICAgICAgICBsZXQgYnJhY2VDb3VudCA9IDA7XG4gICAgICAgICAgICBsZXQganNvbkVuZEluZGV4ID0gLTE7XG5cbiAgICAgICAgICAgIC8vIEZpbmQgdGhlIG1hdGNoaW5nIGNsb3NpbmcgYnJhY2VcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBqc29uU3RhcnRJbmRleDsgaSA8IGJvZHlSYXcubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGFyID0gYm9keVJhd1tpXTtcblxuICAgICAgICAgICAgICAgIGlmIChjaGFyID09PSBcIntcIikge1xuICAgICAgICAgICAgICAgICAgICBicmFjZUNvdW50Kys7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGFyID09PSBcIn1cIikge1xuICAgICAgICAgICAgICAgICAgICBicmFjZUNvdW50LS07XG4gICAgICAgICAgICAgICAgICAgIGlmIChicmFjZUNvdW50ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBqc29uRW5kSW5kZXggPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEV4dHJhY3QgdGhlIEpTT04gY2h1bmsgaWYgd2UgZm91bmQgYSBjb21wbGV0ZSBvYmplY3RcbiAgICAgICAgICAgIGlmIChqc29uRW5kSW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgY29uc3QganNvbkNodW5rID0gYm9keVJhdy5zdWJzdHJpbmcoanNvblN0YXJ0SW5kZXgsIGpzb25FbmRJbmRleCArIDEpO1xuICAgICAgICAgICAgICAgIGpzb25DaHVua3MucHVzaChqc29uQ2h1bmspO1xuICAgICAgICAgICAgICAgIHNlYXJjaEluZGV4ID0ganNvbkVuZEluZGV4ICsgMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gTm8gbWF0Y2hpbmcgYnJhY2UgZm91bmQsIG1vdmUgcGFzdCB0aGlzIHBhdHRlcm5cbiAgICAgICAgICAgICAgICBzZWFyY2hJbmRleCA9IHBhdHRlcm5JbmRleCArIHBhdHRlcm4ubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGpzb25DaHVua3M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXh0cmFjdCBCZWRyb2NrIGludm9jYXRpb24gbWV0cmljcyBmcm9tIHRoZSByZXNwb25zZVxuICAgICAqL1xuICAgIHByaXZhdGUgZXh0cmFjdEJlZHJvY2tNZXRyaWNzKGJvZHlSYXc6IHN0cmluZyk6IEJlZHJvY2tJbnZvY2F0aW9uTWV0cmljcyB8IG51bGwge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gTG9vayBmb3IgdGhlIGFtYXpvbi1iZWRyb2NrLWludm9jYXRpb25NZXRyaWNzIGluIHRoZSBsYXN0IGRlY29kZWQgZXZlbnRcbiAgICAgICAgICAgIGNvbnN0IG1ldHJpY3NNYXRjaCA9IGJvZHlSYXcubWF0Y2goL1wiYW1hem9uLWJlZHJvY2staW52b2NhdGlvbk1ldHJpY3NcIjpcXHMqKFxce1tefV0rXFx9KS8pO1xuICAgICAgICAgICAgaWYgKG1ldHJpY3NNYXRjaCAmJiBtZXRyaWNzTWF0Y2hbMV0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShtZXRyaWNzTWF0Y2hbMV0pIGFzIEJlZHJvY2tJbnZvY2F0aW9uTWV0cmljcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gU2tpcCBpbnZhbGlkIG1ldHJpY3NcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZSBzdHJlYW1pbmcgcmVzcG9uc2UgZnJvbSByYXcgU1NFIGRhdGFcbiAgICAgKi9cbiAgICBwcml2YXRlIHBhcnNlU3RyZWFtaW5nUmVzcG9uc2UoYm9keVJhdzogc3RyaW5nKTogTWVzc2FnZSB7XG4gICAgICAgIGlmICh0aGlzLmlzQmVkcm9ja1Jlc3BvbnNlKGJvZHlSYXcpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUJlZHJvY2tTdHJlYW1pbmdSZXNwb25zZShib2R5UmF3KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcnNlU3RhbmRhcmRTdHJlYW1pbmdSZXNwb25zZShib2R5UmF3KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnNlIHN0YW5kYXJkIEFudGhyb3BpYyBBUEkgc3RyZWFtaW5nIHJlc3BvbnNlXG4gICAgICovXG4gICAgcHJpdmF0ZSBwYXJzZVN0YW5kYXJkU3RyZWFtaW5nUmVzcG9uc2UoYm9keVJhdzogc3RyaW5nKTogTWVzc2FnZSB7XG4gICAgICAgIGlmICghYm9keVJhdyB8fCBib2R5UmF3Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRW1wdHkgYm9keVJhdyBwcm92aWRlZCB0byBwYXJzZVN0YW5kYXJkU3RyZWFtaW5nUmVzcG9uc2VcIik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsaW5lcyA9IGJvZHlSYXcuc3BsaXQoXCJcXG5cIik7XG4gICAgICAgIGNvbnN0IGV2ZW50czogUmF3TWVzc2FnZVN0cmVhbUV2ZW50W10gPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgICAgICAgIGlmICghbGluZS5zdGFydHNXaXRoKFwiZGF0YTogXCIpKSBjb250aW51ZTtcblxuICAgICAgICAgICAgY29uc3QgZGF0YSA9IGxpbmUuc3Vic3RyaW5nKDYpLnRyaW0oKTtcbiAgICAgICAgICAgIGlmIChkYXRhID09PSBcIltET05FXVwiKSBicmVhaztcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBldmVudCA9IEpTT04ucGFyc2UoZGF0YSkgYXMgUmF3TWVzc2FnZVN0cmVhbUV2ZW50O1xuICAgICAgICAgICAgICAgIGV2ZW50cy5wdXNoKGV2ZW50KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXCJGYWlsZWQgdG8gcGFyc2UgU1NFIGV2ZW50OlwiLCBkYXRhLCBlKTtcbiAgICAgICAgICAgICAgICAvLyBTa2lwIGludmFsaWQgSlNPTlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGRNZXNzYWdlRnJvbUV2ZW50cyhldmVudHMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJ1aWxkIGEgTWVzc2FnZSBvYmplY3QgZnJvbSBhIGxpc3Qgb2Ygc3RyZWFtaW5nIGV2ZW50c1xuICAgICAqL1xuICAgIHByaXZhdGUgYnVpbGRNZXNzYWdlRnJvbUV2ZW50cyhcbiAgICAgICAgZXZlbnRzOiBSYXdNZXNzYWdlU3RyZWFtRXZlbnRbXSxcbiAgICAgICAgYmVkcm9ja01ldHJpY3M/OiBCZWRyb2NrSW52b2NhdGlvbk1ldHJpY3MgfCBudWxsLFxuICAgICk6IE1lc3NhZ2Uge1xuICAgICAgICAvLyBJbml0aWFsaXplIHdpdGggZGVmYXVsdHNcbiAgICAgICAgbGV0IG1lc3NhZ2U6IFBhcnRpYWw8TWVzc2FnZT4gPSB7XG4gICAgICAgICAgICBpZDogXCJcIixcbiAgICAgICAgICAgIHR5cGU6IFwibWVzc2FnZVwiLFxuICAgICAgICAgICAgcm9sZTogXCJhc3Npc3RhbnRcIixcbiAgICAgICAgICAgIGNvbnRlbnQ6IFtdLFxuICAgICAgICAgICAgbW9kZWw6IFwiXCIsXG4gICAgICAgICAgICBzdG9wX3JlYXNvbjogbnVsbCxcbiAgICAgICAgICAgIHN0b3Bfc2VxdWVuY2U6IG51bGwsXG4gICAgICAgICAgICB1c2FnZToge1xuICAgICAgICAgICAgICAgIGlucHV0X3Rva2VuczogMCxcbiAgICAgICAgICAgICAgICBvdXRwdXRfdG9rZW5zOiAwLFxuICAgICAgICAgICAgICAgIGNhY2hlX2NyZWF0aW9uX2lucHV0X3Rva2VuczogbnVsbCxcbiAgICAgICAgICAgICAgICBjYWNoZV9yZWFkX2lucHV0X3Rva2VuczogbnVsbCxcbiAgICAgICAgICAgICAgICBzZXJ2ZXJfdG9vbF91c2U6IG51bGwsXG4gICAgICAgICAgICAgICAgc2VydmljZV90aWVyOiBudWxsLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBUcmFjayBjb250ZW50IGJsb2NrcyBiZWluZyBidWlsdFxuICAgICAgICBjb25zdCBjb250ZW50QmxvY2tzOiBDb250ZW50QmxvY2tbXSA9IFtdO1xuICAgICAgICBsZXQgY3VycmVudEJsb2NrSW5kZXggPSAtMTtcblxuICAgICAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cykge1xuICAgICAgICAgICAgc3dpdGNoIChldmVudC50eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcIm1lc3NhZ2Vfc3RhcnRcIjpcbiAgICAgICAgICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSBtZXNzYWdlIHdpdGggYmFzZSBzdHJ1Y3R1cmVcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IHsgLi4ubWVzc2FnZSwgLi4uZXZlbnQubWVzc2FnZSB9O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgXCJjb250ZW50X2Jsb2NrX3N0YXJ0XCI6XG4gICAgICAgICAgICAgICAgICAgIC8vIFN0YXJ0IGEgbmV3IGNvbnRlbnQgYmxvY2tcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrSW5kZXggPSBldmVudC5pbmRleDtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudEJsb2Nrc1tjdXJyZW50QmxvY2tJbmRleF0gPSB7IC4uLmV2ZW50LmNvbnRlbnRfYmxvY2sgfTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIFwiY29udGVudF9ibG9ja19kZWx0YVwiOlxuICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIGN1cnJlbnQgY29udGVudCBibG9ja1xuICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEJsb2NrSW5kZXggPj0gMCAmJiBjb250ZW50QmxvY2tzW2N1cnJlbnRCbG9ja0luZGV4XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmxvY2sgPSBjb250ZW50QmxvY2tzW2N1cnJlbnRCbG9ja0luZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlbHRhID0gZXZlbnQuZGVsdGE7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZGVsdGEudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ0ZXh0X2RlbHRhXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChibG9jay50eXBlID09PSBcInRleHRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJsb2NrIGFzIFRleHRCbG9jaykudGV4dCA9ICgoYmxvY2sgYXMgVGV4dEJsb2NrKS50ZXh0IHx8IFwiXCIpICsgZGVsdGEudGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJpbnB1dF9qc29uX2RlbHRhXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChibG9jay50eXBlID09PSBcInRvb2xfdXNlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFjY3VtdWxhdGUgSlNPTiBzdHJpbmcgZm9yIHRvb2xfdXNlIGJsb2Nrc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9vbEJsb2NrID0gYmxvY2sgYXMgVG9vbFVzZUJsb2NrVHlwZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdG9vbEJsb2NrLmlucHV0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbEJsb2NrLmlucHV0ID0gdG9vbEJsb2NrLmlucHV0ICsgZGVsdGEucGFydGlhbF9qc29uO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbml0aWFsaXplIGFzIHN0cmluZyBpZiBub3QgYWxyZWFkeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0b29sQmxvY2suaW5wdXQgYXMgYW55KSA9IGRlbHRhLnBhcnRpYWxfanNvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ0aGlua2luZ19kZWx0YVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmxvY2sudHlwZSA9PT0gXCJ0aGlua2luZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmxvY2sgYXMgVGhpbmtpbmdCbG9jaykudGhpbmtpbmcgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYmxvY2sgYXMgVGhpbmtpbmdCbG9jaykudGhpbmtpbmcgfHwgXCJcIikgKyBkZWx0YS50aGlua2luZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJzaWduYXR1cmVfZGVsdGFcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJsb2NrLnR5cGUgPT09IFwidGhpbmtpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJsb2NrIGFzIFRoaW5raW5nQmxvY2spLnNpZ25hdHVyZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChibG9jayBhcyBUaGlua2luZ0Jsb2NrKS5zaWduYXR1cmUgfHwgXCJcIikgKyBkZWx0YS5zaWduYXR1cmU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiY2l0YXRpb25zX2RlbHRhXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBjaXRhdGlvbnMgZGVsdGEgaWYgbmVlZGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSBcImNvbnRlbnRfYmxvY2tfc3RvcFwiOlxuICAgICAgICAgICAgICAgICAgICAvLyBGaW5hbGl6ZSBjb250ZW50IGJsb2NrXG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50QmxvY2tJbmRleCA+PSAwICYmIGNvbnRlbnRCbG9ja3NbY3VycmVudEJsb2NrSW5kZXhdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBibG9jayA9IGNvbnRlbnRCbG9ja3NbY3VycmVudEJsb2NrSW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGFyc2UgSlNPTiBpbnB1dCBpZiBpdCdzIGEgdG9vbF91c2UgYmxvY2tcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChibG9jay50eXBlID09PSBcInRvb2xfdXNlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0b29sQmxvY2sgPSBibG9jayBhcyBUb29sVXNlQmxvY2tUeXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdG9vbEJsb2NrLmlucHV0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sQmxvY2suaW5wdXQgPSBKU09OLnBhcnNlKHRvb2xCbG9jay5pbnB1dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEtlZXAgYXMgc3RyaW5nIGlmIEpTT04gcGFyc2luZyBmYWlsc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFwiRmFpbGVkIHRvIHBhcnNlIHRvb2wgaW5wdXQgSlNPTjpcIiwgdG9vbEJsb2NrLmlucHV0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgXCJtZXNzYWdlX2RlbHRhXCI6XG4gICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBtZXNzYWdlLWxldmVsIGZpZWxkc1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZGVsdGEuc3RvcF9yZWFzb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc3RvcF9yZWFzb24gPSBldmVudC5kZWx0YS5zdG9wX3JlYXNvbjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZGVsdGEuc3RvcF9zZXF1ZW5jZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zdG9wX3NlcXVlbmNlID0gZXZlbnQuZGVsdGEuc3RvcF9zZXF1ZW5jZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQudXNhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZXNlcnZlIGV4aXN0aW5nIGlucHV0X3Rva2VucyBpZiBub3QgcHJvdmlkZWQgaW4gdGhpcyBkZWx0YVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5wdXQgdG9rZW5zIGFyZSB0eXBpY2FsbHkgb25seSBzZW50IG9uY2UgYW5kIHNob3VsZG4ndCBjaGFuZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRJbnB1dFRva2VucyA9IG1lc3NhZ2UudXNhZ2U/LmlucHV0X3Rva2VucyA/PyAwO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnVzYWdlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X3Rva2VuczogZXZlbnQudXNhZ2UuaW5wdXRfdG9rZW5zID8/IGN1cnJlbnRJbnB1dFRva2VucyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfdG9rZW5zOiBldmVudC51c2FnZS5vdXRwdXRfdG9rZW5zID8/IG1lc3NhZ2UudXNhZ2U/Lm91dHB1dF90b2tlbnMgPz8gMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZV9jcmVhdGlvbl9pbnB1dF90b2tlbnM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnVzYWdlLmNhY2hlX2NyZWF0aW9uX2lucHV0X3Rva2VucyA/PyBtZXNzYWdlLnVzYWdlPy5jYWNoZV9jcmVhdGlvbl9pbnB1dF90b2tlbnMgPz8gbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZV9yZWFkX2lucHV0X3Rva2VuczpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQudXNhZ2UuY2FjaGVfcmVhZF9pbnB1dF90b2tlbnMgPz8gbWVzc2FnZS51c2FnZT8uY2FjaGVfcmVhZF9pbnB1dF90b2tlbnMgPz8gbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJfdG9vbF91c2U6IGV2ZW50LnVzYWdlLnNlcnZlcl90b29sX3VzZSA/PyBtZXNzYWdlLnVzYWdlPy5zZXJ2ZXJfdG9vbF91c2UgPz8gbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX3RpZXI6IG51bGwsIC8vIE1lc3NhZ2VEZWx0YVVzYWdlIGRvZXNuJ3QgaGF2ZSBzZXJ2aWNlX3RpZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIFwibWVzc2FnZV9zdG9wXCI6XG4gICAgICAgICAgICAgICAgICAgIC8vIEZpbmFsaXplIG1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgdGhlIGZpbmFsIGNvbnRlbnQgYmxvY2tzXG4gICAgICAgIG1lc3NhZ2UuY29udGVudCA9IGNvbnRlbnRCbG9ja3MuZmlsdGVyKChibG9jaykgPT4gYmxvY2sgIT0gbnVsbCk7XG5cbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBiZWRyb2NrIG1ldHJpY3MsIG1lcmdlIHRoZW0gaW50byB1c2FnZVxuICAgICAgICBpZiAoYmVkcm9ja01ldHJpY3MgJiYgbWVzc2FnZS51c2FnZSkge1xuICAgICAgICAgICAgbWVzc2FnZS51c2FnZS5pbnB1dF90b2tlbnMgPSBiZWRyb2NrTWV0cmljcy5pbnB1dFRva2VuQ291bnQ7XG4gICAgICAgICAgICBtZXNzYWdlLnVzYWdlLm91dHB1dF90b2tlbnMgPSBiZWRyb2NrTWV0cmljcy5vdXRwdXRUb2tlbkNvdW50O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2UgYXMgTWVzc2FnZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHRyYWN0IG1vZGVsIG5hbWUgZnJvbSB0aGUgcmF3IHBhaXJcbiAgICAgKi9cbiAgICBwcml2YXRlIGV4dHJhY3RNb2RlbChwYWlyOiBSYXdQYWlyKTogc3RyaW5nIHtcbiAgICAgICAgLy8gVHJ5IHRvIGV4dHJhY3QgZnJvbSBCZWRyb2NrIFVSTFxuICAgICAgICBpZiAocGFpci5yZXF1ZXN0Py51cmwgJiYgcGFpci5yZXF1ZXN0LnVybC5pbmNsdWRlcyhcImJlZHJvY2stcnVudGltZVwiKSkge1xuICAgICAgICAgICAgY29uc3QgdXJsTWF0Y2ggPSBwYWlyLnJlcXVlc3QudXJsLm1hdGNoKC9cXC9tb2RlbFxcLyhbXlxcL10rKS8pO1xuICAgICAgICAgICAgaWYgKHVybE1hdGNoICYmIHVybE1hdGNoWzFdKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubm9ybWFsaXplTW9kZWxOYW1lKHVybE1hdGNoWzFdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRyeSB0byBnZXQgbW9kZWwgZnJvbSByZXF1ZXN0IGJvZHlcbiAgICAgICAgaWYgKHBhaXIucmVxdWVzdD8uYm9keSAmJiB0eXBlb2YgcGFpci5yZXF1ZXN0LmJvZHkgPT09IFwib2JqZWN0XCIgJiYgXCJtb2RlbFwiIGluIHBhaXIucmVxdWVzdC5ib2R5KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ub3JtYWxpemVNb2RlbE5hbWUoKHBhaXIucmVxdWVzdC5ib2R5IGFzIGFueSkubW9kZWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJ5IHRvIGdldCBmcm9tIHJlc3BvbnNlXG4gICAgICAgIGlmIChwYWlyLnJlc3BvbnNlPy5ib2R5ICYmIHR5cGVvZiBwYWlyLnJlc3BvbnNlLmJvZHkgPT09IFwib2JqZWN0XCIgJiYgXCJtb2RlbFwiIGluIHBhaXIucmVzcG9uc2UuYm9keSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubm9ybWFsaXplTW9kZWxOYW1lKChwYWlyLnJlc3BvbnNlLmJvZHkgYXMgYW55KS5tb2RlbCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWZhdWx0XG4gICAgICAgIHJldHVybiBcInVua25vd25cIjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOb3JtYWxpemUgbW9kZWwgbmFtZXMgZnJvbSBkaWZmZXJlbnQgZm9ybWF0cyB0byBhIGNvbnNpc3RlbnQgZGlzcGxheSBmb3JtYXRcbiAgICAgKi9cbiAgICBwcml2YXRlIG5vcm1hbGl6ZU1vZGVsTmFtZShtb2RlbE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGlmICghbW9kZWxOYW1lKSByZXR1cm4gXCJ1bmtub3duXCI7XG5cbiAgICAgICAgLy8gSGFuZGxlIEJlZHJvY2sgbW9kZWwgbmFtZXNcbiAgICAgICAgaWYgKG1vZGVsTmFtZS5zdGFydHNXaXRoKFwidXMuYW50aHJvcGljLlwiKSkge1xuICAgICAgICAgICAgLy8gQ29udmVydCBcInVzLmFudGhyb3BpYy5jbGF1ZGUtMy01LXNvbm5ldC0yMDI0MTAyMi12MTowXCIgdG8gXCJjbGF1ZGUtMy01LXNvbm5ldC0yMDI0MTAyMlwiXG4gICAgICAgICAgICBjb25zdCBtYXRjaCA9IG1vZGVsTmFtZS5tYXRjaCgvdXNcXC5hbnRocm9waWNcXC4oW146XSspLyk7XG4gICAgICAgICAgICBpZiAobWF0Y2ggJiYgbWF0Y2hbMV0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hbMV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXR1cm4gYXMtaXMgZm9yIG90aGVyIGZvcm1hdHNcbiAgICAgICAgcmV0dXJuIG1vZGVsTmFtZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHcm91cCBwcm9jZXNzZWQgcGFpcnMgaW50byBjb252ZXJzYXRpb25zXG4gICAgICovXG4gICAgbWVyZ2VDb252ZXJzYXRpb25zKFxuICAgICAgICBwYWlyczogUHJvY2Vzc2VkUGFpcltdLFxuICAgICAgICBvcHRpb25zOiB7IGluY2x1ZGVTaG9ydENvbnZlcnNhdGlvbnM/OiBib29sZWFuIH0gPSB7fSxcbiAgICApOiBTaW1wbGVDb252ZXJzYXRpb25bXSB7XG4gICAgICAgIGlmICghcGFpcnMgfHwgcGFpcnMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cbiAgICAgICAgLy8gR3JvdXAgcGFpcnMgYnkgc3lzdGVtIGluc3RydWN0aW9ucyArIG1vZGVsXG4gICAgICAgIGNvbnN0IHBhaXJzQnlTeXN0ZW0gPSBuZXcgTWFwPHN0cmluZywgUHJvY2Vzc2VkUGFpcltdPigpO1xuXG4gICAgICAgIGZvciAoY29uc3QgcGFpciBvZiBwYWlycykge1xuICAgICAgICAgICAgY29uc3Qgc3lzdGVtID0gcGFpci5yZXF1ZXN0LnN5c3RlbTtcbiAgICAgICAgICAgIGNvbnN0IG1vZGVsID0gcGFpci5tb2RlbDtcbiAgICAgICAgICAgIGNvbnN0IHN5c3RlbUtleSA9IEpTT04uc3RyaW5naWZ5KHsgc3lzdGVtLCBtb2RlbCB9KTtcblxuICAgICAgICAgICAgaWYgKCFwYWlyc0J5U3lzdGVtLmhhcyhzeXN0ZW1LZXkpKSB7XG4gICAgICAgICAgICAgICAgcGFpcnNCeVN5c3RlbS5zZXQoc3lzdGVtS2V5LCBbXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYWlyc0J5U3lzdGVtLmdldChzeXN0ZW1LZXkpIS5wdXNoKHBhaXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWxsQ29udmVyc2F0aW9uczogU2ltcGxlQ29udmVyc2F0aW9uW10gPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IFssIHN5c3RlbVBhaXJzXSBvZiBwYWlyc0J5U3lzdGVtKSB7XG4gICAgICAgICAgICBjb25zdCBzb3J0ZWRQYWlycyA9IFsuLi5zeXN0ZW1QYWlyc10uc29ydChcbiAgICAgICAgICAgICAgICAoYSwgYikgPT4gbmV3IERhdGUoYS50aW1lc3RhbXApLmdldFRpbWUoKSAtIG5ldyBEYXRlKGIudGltZXN0YW1wKS5nZXRUaW1lKCksXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBHcm91cCBwYWlycyBieSBjb252ZXJzYXRpb24gdGhyZWFkXG4gICAgICAgICAgICBjb25zdCBjb252ZXJzYXRpb25UaHJlYWRzID0gbmV3IE1hcDxzdHJpbmcsIFByb2Nlc3NlZFBhaXJbXT4oKTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBwYWlyIG9mIHNvcnRlZFBhaXJzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZXMgPSBwYWlyLnJlcXVlc3QubWVzc2FnZXMgfHwgW107XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VzLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBmaXJzdFVzZXJNZXNzYWdlID0gbWVzc2FnZXNbMF07XG4gICAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZEZpcnN0TWVzc2FnZSA9IHRoaXMubm9ybWFsaXplTWVzc2FnZUZvckdyb3VwaW5nKGZpcnN0VXNlck1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnZlcnNhdGlvbktleSA9IEpTT04uc3RyaW5naWZ5KHsgZmlyc3RNZXNzYWdlOiBub3JtYWxpemVkRmlyc3RNZXNzYWdlIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleUhhc2ggPSB0aGlzLmhhc2hTdHJpbmcoY29udmVyc2F0aW9uS2V5KTtcblxuICAgICAgICAgICAgICAgIGlmICghY29udmVyc2F0aW9uVGhyZWFkcy5oYXMoa2V5SGFzaCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udmVyc2F0aW9uVGhyZWFkcy5zZXQoa2V5SGFzaCwgW10pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25UaHJlYWRzLmdldChrZXlIYXNoKSEucHVzaChwYWlyKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRm9yIGVhY2ggY29udmVyc2F0aW9uIHRocmVhZCwga2VlcCB0aGUgZmluYWwgcGFpclxuICAgICAgICAgICAgZm9yIChjb25zdCBbY29udmVyc2F0aW9uS2V5LCB0aHJlYWRQYWlyc10gb2YgY29udmVyc2F0aW9uVGhyZWFkcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNvcnRlZFRocmVhZFBhaXJzID0gWy4uLnRocmVhZFBhaXJzXS5zb3J0KFxuICAgICAgICAgICAgICAgICAgICAoYSwgYikgPT4gbmV3IERhdGUoYS50aW1lc3RhbXApLmdldFRpbWUoKSAtIG5ldyBEYXRlKGIudGltZXN0YW1wKS5nZXRUaW1lKCksXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGZpbmFsUGFpciA9IHNvcnRlZFRocmVhZFBhaXJzLnJlZHVjZSgobG9uZ2VzdCwgY3VycmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50TWVzc2FnZXMgPSBjdXJyZW50LnJlcXVlc3QubWVzc2FnZXMgfHwgW107XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvbmdlc3RNZXNzYWdlcyA9IGxvbmdlc3QucmVxdWVzdC5tZXNzYWdlcyB8fCBbXTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRNZXNzYWdlcy5sZW5ndGggPiBsb25nZXN0TWVzc2FnZXMubGVuZ3RoID8gY3VycmVudCA6IGxvbmdlc3Q7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBtb2RlbHNVc2VkID0gbmV3IFNldChzb3J0ZWRUaHJlYWRQYWlycy5tYXAoKHBhaXIpID0+IHBhaXIubW9kZWwpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBlbmhhbmNlZE1lc3NhZ2VzID0gdGhpcy5wcm9jZXNzVG9vbFJlc3VsdHMoZmluYWxQYWlyLnJlcXVlc3QubWVzc2FnZXMgfHwgW10pO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgY29udmVyc2F0aW9uOiBTaW1wbGVDb252ZXJzYXRpb24gPSB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiB0aGlzLmhhc2hTdHJpbmcoY29udmVyc2F0aW9uS2V5KSxcbiAgICAgICAgICAgICAgICAgICAgbW9kZWxzOiBtb2RlbHNVc2VkLFxuICAgICAgICAgICAgICAgICAgICBzeXN0ZW06IGZpbmFsUGFpci5yZXF1ZXN0LnN5c3RlbSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXM6IGVuaGFuY2VkTWVzc2FnZXMsXG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlOiBmaW5hbFBhaXIucmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgICAgIGFsbFBhaXJzOiBzb3J0ZWRUaHJlYWRQYWlycyxcbiAgICAgICAgICAgICAgICAgICAgZmluYWxQYWlyOiBmaW5hbFBhaXIsXG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWU6IHNvcnRlZFRocmVhZFBhaXJzWzBdLnRpbWVzdGFtcCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZFRpbWU6IGZpbmFsUGFpci50aW1lc3RhbXAsXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFBhaXJzOiBzb3J0ZWRUaHJlYWRQYWlycy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFRva2VuczogZmluYWxQYWlyLnJlc3BvbnNlLnVzYWdlPy5pbnB1dF90b2tlbnMgfHwgMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFRva2VuczogZmluYWxQYWlyLnJlc3BvbnNlLnVzYWdlPy5vdXRwdXRfdG9rZW5zIHx8IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFRva2VuczpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmluYWxQYWlyLnJlc3BvbnNlLnVzYWdlPy5pbnB1dF90b2tlbnMgfHwgMCkgKyAoZmluYWxQYWlyLnJlc3BvbnNlLnVzYWdlPy5vdXRwdXRfdG9rZW5zIHx8IDApLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBhbGxDb252ZXJzYXRpb25zLnB1c2goY29udmVyc2F0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFwcGx5IGNvbXBhY3QgY29udmVyc2F0aW9uIGRldGVjdGlvblxuICAgICAgICBjb25zdCBtZXJnZWRDb252ZXJzYXRpb25zID0gdGhpcy5kZXRlY3RBbmRNZXJnZUNvbXBhY3RDb252ZXJzYXRpb25zKGFsbENvbnZlcnNhdGlvbnMpO1xuXG4gICAgICAgIC8vIEZpbHRlciBvdXQgc2hvcnQgY29udmVyc2F0aW9ucyB1bmxlc3MgZXhwbGljaXRseSBpbmNsdWRlZFxuICAgICAgICBjb25zdCBmaWx0ZXJlZENvbnZlcnNhdGlvbnMgPSBvcHRpb25zLmluY2x1ZGVTaG9ydENvbnZlcnNhdGlvbnNcbiAgICAgICAgICAgID8gbWVyZ2VkQ29udmVyc2F0aW9uc1xuICAgICAgICAgICAgOiBtZXJnZWRDb252ZXJzYXRpb25zLmZpbHRlcigoY29udikgPT4gY29udi5tZXNzYWdlcy5sZW5ndGggPiAyKTtcblxuICAgICAgICAvLyBTb3J0IGJ5IHN0YXJ0IHRpbWVcbiAgICAgICAgcmV0dXJuIGZpbHRlcmVkQ29udmVyc2F0aW9ucy5zb3J0KFxuICAgICAgICAgICAgKGEsIGIpID0+IG5ldyBEYXRlKGEubWV0YWRhdGEuc3RhcnRUaW1lKS5nZXRUaW1lKCkgLSBuZXcgRGF0ZShiLm1ldGFkYXRhLnN0YXJ0VGltZSkuZ2V0VGltZSgpLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb2Nlc3MgbWVzc2FnZXMgdG8gcGFpciB0b29sX3VzZSB3aXRoIHRvb2xfcmVzdWx0XG4gICAgICovXG4gICAgcHJpdmF0ZSBwcm9jZXNzVG9vbFJlc3VsdHMobWVzc2FnZXM6IE1lc3NhZ2VQYXJhbVtdKTogRW5oYW5jZWRNZXNzYWdlUGFyYW1bXSB7XG4gICAgICAgIGNvbnN0IGVuaGFuY2VkTWVzc2FnZXM6IEVuaGFuY2VkTWVzc2FnZVBhcmFtW10gPSBbXTtcbiAgICAgICAgY29uc3QgcGVuZGluZ1Rvb2xVc2VzOiBSZWNvcmQ8c3RyaW5nLCB7IG1lc3NhZ2VJbmRleDogbnVtYmVyOyB0b29sSW5kZXg6IG51bWJlciB9PiA9IHt9O1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWVzc2FnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBtZXNzYWdlc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IGVuaGFuY2VkTWVzc2FnZTogRW5oYW5jZWRNZXNzYWdlUGFyYW0gPSB7IC4uLm1lc3NhZ2UsIHRvb2xSZXN1bHRzOiB7fSwgaGlkZTogZmFsc2UgfTtcblxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobWVzc2FnZS5jb250ZW50KSkge1xuICAgICAgICAgICAgICAgIGxldCBoYXNPbmx5VG9vbFJlc3VsdHMgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGxldCBoYXNUZXh0Q29udGVudCA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBtZXNzYWdlLmNvbnRlbnQubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYmxvY2sgPSBtZXNzYWdlLmNvbnRlbnRbal07XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGJsb2NrLnR5cGUgPT09IFwidG9vbF91c2VcIiAmJiBcImlkXCIgaW4gYmxvY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvb2xVc2UgPSBibG9jayBhcyBUb29sVXNlQmxvY2tUeXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ1Rvb2xVc2VzW3Rvb2xVc2UuaWRdID0geyBtZXNzYWdlSW5kZXg6IGksIHRvb2xJbmRleDogaiB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgaGFzT25seVRvb2xSZXN1bHRzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYmxvY2sudHlwZSA9PT0gXCJ0b29sX3Jlc3VsdFwiICYmIFwidG9vbF91c2VfaWRcIiBpbiBibG9jaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9vbFJlc3VsdCA9IGJsb2NrIGFzIFRvb2xSZXN1bHRCbG9ja1BhcmFtO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9vbFVzZUlkID0gdG9vbFJlc3VsdC50b29sX3VzZV9pZDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBlbmRpbmdUb29sVXNlc1t0b29sVXNlSWRdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBtZXNzYWdlSW5kZXggfSA9IHBlbmRpbmdUb29sVXNlc1t0b29sVXNlSWRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZW5oYW5jZWRNZXNzYWdlc1ttZXNzYWdlSW5kZXhdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuaGFuY2VkTWVzc2FnZXNbbWVzc2FnZUluZGV4XSA9IHsgLi4ubWVzc2FnZXNbbWVzc2FnZUluZGV4XSwgdG9vbFJlc3VsdHM6IHt9LCBoaWRlOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmhhbmNlZE1lc3NhZ2VzW21lc3NhZ2VJbmRleF0udG9vbFJlc3VsdHMhW3Rvb2xVc2VJZF0gPSB0b29sUmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwZW5kaW5nVG9vbFVzZXNbdG9vbFVzZUlkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChibG9jay50eXBlID09PSBcInRleHRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaGFzVGV4dENvbnRlbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaGFzT25seVRvb2xSZXN1bHRzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNPbmx5VG9vbFJlc3VsdHMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChoYXNPbmx5VG9vbFJlc3VsdHMgJiYgIWhhc1RleHRDb250ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGVuaGFuY2VkTWVzc2FnZS5oaWRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGVuaGFuY2VkTWVzc2FnZXNbaV0gPSBlbmhhbmNlZE1lc3NhZ2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZW5oYW5jZWRNZXNzYWdlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlY3QgYW5kIG1lcmdlIGNvbXBhY3QgY29udmVyc2F0aW9uc1xuICAgICAqL1xuICAgIHByaXZhdGUgZGV0ZWN0QW5kTWVyZ2VDb21wYWN0Q29udmVyc2F0aW9ucyhjb252ZXJzYXRpb25zOiBTaW1wbGVDb252ZXJzYXRpb25bXSk6IFNpbXBsZUNvbnZlcnNhdGlvbltdIHtcbiAgICAgICAgaWYgKGNvbnZlcnNhdGlvbnMubGVuZ3RoIDw9IDEpIHJldHVybiBjb252ZXJzYXRpb25zO1xuXG4gICAgICAgIGNvbnN0IHNvcnRlZENvbnZlcnNhdGlvbnMgPSBbLi4uY29udmVyc2F0aW9uc10uc29ydChcbiAgICAgICAgICAgIChhLCBiKSA9PiBuZXcgRGF0ZShhLm1ldGFkYXRhLnN0YXJ0VGltZSkuZ2V0VGltZSgpIC0gbmV3IERhdGUoYi5tZXRhZGF0YS5zdGFydFRpbWUpLmdldFRpbWUoKSxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCB1c2VkQ29udmVyc2F0aW9ucyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICAgICAgICBjb25zdCBtZXJnZWRDb252ZXJzYXRpb25zOiBTaW1wbGVDb252ZXJzYXRpb25bXSA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc29ydGVkQ29udmVyc2F0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudENvbnYgPSBzb3J0ZWRDb252ZXJzYXRpb25zW2ldO1xuXG4gICAgICAgICAgICBpZiAodXNlZENvbnZlcnNhdGlvbnMuaGFzKGkpKSBjb250aW51ZTtcblxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIGNvbXBhY3QgY29udmVyc2F0aW9uICgxIHBhaXIgd2l0aCBtYW55IG1lc3NhZ2VzKVxuICAgICAgICAgICAgaWYgKGN1cnJlbnRDb252LmFsbFBhaXJzLmxlbmd0aCA9PT0gMSAmJiBjdXJyZW50Q29udi5tZXNzYWdlcy5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgICAgICAgbGV0IG9yaWdpbmFsQ29udjogU2ltcGxlQ29udmVyc2F0aW9uIHwgbnVsbCA9IG51bGw7XG4gICAgICAgICAgICAgICAgbGV0IG9yaWdpbmFsSW5kZXggPSAtMTtcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc29ydGVkQ29udmVyc2F0aW9ucy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaiA9PT0gaSB8fCB1c2VkQ29udmVyc2F0aW9ucy5oYXMoaikpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG90aGVyQ29udiA9IHNvcnRlZENvbnZlcnNhdGlvbnNbal07XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgb3RoZXIgY29udmVyc2F0aW9uIGhhcyBleGFjdGx5IDIgZmV3ZXIgbWVzc2FnZXNcbiAgICAgICAgICAgICAgICAgICAgaWYgKG90aGVyQ29udi5tZXNzYWdlcy5sZW5ndGggPT09IGN1cnJlbnRDb252Lm1lc3NhZ2VzLmxlbmd0aCAtIDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIG1lc3NhZ2VzIG1hdGNoIChzaW1wbGlmaWVkIGNoZWNrKVxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2VzTWF0Y2ggPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDE7IGsgPCBvdGhlckNvbnYubWVzc2FnZXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMubWVzc2FnZXNSb3VnaGx5RXF1YWwob3RoZXJDb252Lm1lc3NhZ2VzW2tdLCBjdXJyZW50Q29udi5tZXNzYWdlc1trXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXNNYXRjaCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlc01hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxDb252ID0gb3RoZXJDb252O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsSW5kZXggPSBqO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsQ29udikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXJnZWRDb252ID0gdGhpcy5tZXJnZUNvbXBhY3RDb252ZXJzYXRpb24ob3JpZ2luYWxDb252LCBjdXJyZW50Q29udik7XG4gICAgICAgICAgICAgICAgICAgIG1lcmdlZENvbnZlcnNhdGlvbnMucHVzaChtZXJnZWRDb252KTtcbiAgICAgICAgICAgICAgICAgICAgdXNlZENvbnZlcnNhdGlvbnMuYWRkKGkpO1xuICAgICAgICAgICAgICAgICAgICB1c2VkQ29udmVyc2F0aW9ucy5hZGQob3JpZ2luYWxJbmRleCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudENvbnYuY29tcGFjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgbWVyZ2VkQ29udmVyc2F0aW9ucy5wdXNoKGN1cnJlbnRDb252KTtcbiAgICAgICAgICAgICAgICAgICAgdXNlZENvbnZlcnNhdGlvbnMuYWRkKGkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbWVyZ2VkQ29udmVyc2F0aW9ucy5wdXNoKGN1cnJlbnRDb252KTtcbiAgICAgICAgICAgICAgICB1c2VkQ29udmVyc2F0aW9ucy5hZGQoaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgcmVtYWluaW5nIGNvbnZlcnNhdGlvbnNcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3J0ZWRDb252ZXJzYXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIXVzZWRDb252ZXJzYXRpb25zLmhhcyhpKSkge1xuICAgICAgICAgICAgICAgIG1lcmdlZENvbnZlcnNhdGlvbnMucHVzaChzb3J0ZWRDb252ZXJzYXRpb25zW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtZXJnZWRDb252ZXJzYXRpb25zLnNvcnQoXG4gICAgICAgICAgICAoYSwgYikgPT4gbmV3IERhdGUoYS5tZXRhZGF0YS5zdGFydFRpbWUpLmdldFRpbWUoKSAtIG5ldyBEYXRlKGIubWV0YWRhdGEuc3RhcnRUaW1lKS5nZXRUaW1lKCksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWVyZ2UgYSBjb21wYWN0IGNvbnZlcnNhdGlvbiB3aXRoIGl0cyBvcmlnaW5hbCBjb3VudGVycGFydFxuICAgICAqL1xuICAgIHByaXZhdGUgbWVyZ2VDb21wYWN0Q29udmVyc2F0aW9uKFxuICAgICAgICBvcmlnaW5hbENvbnY6IFNpbXBsZUNvbnZlcnNhdGlvbixcbiAgICAgICAgY29tcGFjdENvbnY6IFNpbXBsZUNvbnZlcnNhdGlvbixcbiAgICApOiBTaW1wbGVDb252ZXJzYXRpb24ge1xuICAgICAgICBjb25zdCBvcmlnaW5hbE1lc3NhZ2VzID0gb3JpZ2luYWxDb252Lm1lc3NhZ2VzIHx8IFtdO1xuICAgICAgICBjb25zdCBjb21wYWN0TWVzc2FnZXMgPSBjb21wYWN0Q29udi5tZXNzYWdlcyB8fCBbXTtcblxuICAgICAgICBjb25zdCBtZXJnZWRNZXNzYWdlcyA9IFsuLi5jb21wYWN0TWVzc2FnZXNdO1xuICAgICAgICBpZiAob3JpZ2luYWxNZXNzYWdlcy5sZW5ndGggPiAwICYmIG1lcmdlZE1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIG1lcmdlZE1lc3NhZ2VzWzBdID0gb3JpZ2luYWxNZXNzYWdlc1swXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFsbFBhaXJzID0gWy4uLm9yaWdpbmFsQ29udi5hbGxQYWlycywgLi4uY29tcGFjdENvbnYuYWxsUGFpcnNdLnNvcnQoXG4gICAgICAgICAgICAoYSwgYikgPT4gbmV3IERhdGUoYS50aW1lc3RhbXApLmdldFRpbWUoKSAtIG5ldyBEYXRlKGIudGltZXN0YW1wKS5nZXRUaW1lKCksXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgYWxsTW9kZWxzID0gbmV3IFNldChbLi4ub3JpZ2luYWxDb252Lm1vZGVscywgLi4uY29tcGFjdENvbnYubW9kZWxzXSk7XG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IGFsbFBhaXJzWzBdLnRpbWVzdGFtcDtcbiAgICAgICAgY29uc3QgZW5kVGltZSA9IGFsbFBhaXJzW2FsbFBhaXJzLmxlbmd0aCAtIDFdLnRpbWVzdGFtcDtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6IGNvbXBhY3RDb252LmlkLFxuICAgICAgICAgICAgbW9kZWxzOiBhbGxNb2RlbHMsXG4gICAgICAgICAgICBzeXN0ZW06IG9yaWdpbmFsQ29udi5zeXN0ZW0sXG4gICAgICAgICAgICBtZXNzYWdlczogbWVyZ2VkTWVzc2FnZXMsXG4gICAgICAgICAgICByZXNwb25zZTogY29tcGFjdENvbnYucmVzcG9uc2UsXG4gICAgICAgICAgICBhbGxQYWlyczogYWxsUGFpcnMsXG4gICAgICAgICAgICBmaW5hbFBhaXI6IGNvbXBhY3RDb252LmZpbmFsUGFpcixcbiAgICAgICAgICAgIGNvbXBhY3RlZDogdHJ1ZSxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgc3RhcnRUaW1lOiBzdGFydFRpbWUsXG4gICAgICAgICAgICAgICAgZW5kVGltZTogZW5kVGltZSxcbiAgICAgICAgICAgICAgICB0b3RhbFBhaXJzOiBhbGxQYWlycy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgaW5wdXRUb2tlbnM6IChvcmlnaW5hbENvbnYubWV0YWRhdGEuaW5wdXRUb2tlbnMgfHwgMCkgKyAoY29tcGFjdENvbnYubWV0YWRhdGEuaW5wdXRUb2tlbnMgfHwgMCksXG4gICAgICAgICAgICAgICAgb3V0cHV0VG9rZW5zOiAob3JpZ2luYWxDb252Lm1ldGFkYXRhLm91dHB1dFRva2VucyB8fCAwKSArIChjb21wYWN0Q29udi5tZXRhZGF0YS5vdXRwdXRUb2tlbnMgfHwgMCksXG4gICAgICAgICAgICAgICAgdG90YWxUb2tlbnM6IChvcmlnaW5hbENvbnYubWV0YWRhdGEudG90YWxUb2tlbnMgfHwgMCkgKyAoY29tcGFjdENvbnYubWV0YWRhdGEudG90YWxUb2tlbnMgfHwgMCksXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbXBhcmUgdHdvIG1lc3NhZ2VzIHRvIHNlZSBpZiB0aGV5J3JlIHJvdWdobHkgZXF1YWxcbiAgICAgKi9cbiAgICBwcml2YXRlIG1lc3NhZ2VzUm91Z2hseUVxdWFsKG1zZzE6IE1lc3NhZ2VQYXJhbSwgbXNnMjogTWVzc2FnZVBhcmFtKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChtc2cxLnJvbGUgIT09IG1zZzIucm9sZSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnQxID0gbXNnMS5jb250ZW50O1xuICAgICAgICBjb25zdCBjb250ZW50MiA9IG1zZzIuY29udGVudDtcblxuICAgICAgICBpZiAodHlwZW9mIGNvbnRlbnQxICE9PSB0eXBlb2YgY29udGVudDIpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29udGVudDEpICE9PSBBcnJheS5pc0FycmF5KGNvbnRlbnQyKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5vcm1hbGl6ZSBtZXNzYWdlIGZvciBncm91cGluZyAocmVtb3ZlcyBkeW5hbWljIGNvbnRlbnQpXG4gICAgICovXG4gICAgcHJpdmF0ZSBub3JtYWxpemVNZXNzYWdlRm9yR3JvdXBpbmcobWVzc2FnZTogTWVzc2FnZVBhcmFtKTogTWVzc2FnZVBhcmFtIHtcbiAgICAgICAgaWYgKCFtZXNzYWdlIHx8ICFtZXNzYWdlLmNvbnRlbnQpIHJldHVybiBtZXNzYWdlO1xuXG4gICAgICAgIGxldCBub3JtYWxpemVkQ29udGVudDogc3RyaW5nIHwgQ29udGVudEJsb2NrUGFyYW1bXTtcblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShtZXNzYWdlLmNvbnRlbnQpKSB7XG4gICAgICAgICAgICBub3JtYWxpemVkQ29udGVudCA9IG1lc3NhZ2UuY29udGVudC5tYXAoKGJsb2NrKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGJsb2NrLnR5cGUgPT09IFwidGV4dFwiICYmIFwidGV4dFwiIGluIGJsb2NrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0ZXh0ID0gYmxvY2sudGV4dDtcbiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZSgvR2VuZXJhdGVkIFxcZHs0fS1cXGR7Mn0tXFxkezJ9IFxcZHsyfTpcXGR7Mn06XFxkezJ9L2csIFwiR2VuZXJhdGVkIFtUSU1FU1RBTVBdXCIpO1xuICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC9UaGUgdXNlciBvcGVuZWQgdGhlIGZpbGUgW15cXHNdKyBpbiB0aGUgSURFXFwuL2csIFwiVGhlIHVzZXIgb3BlbmVkIGZpbGUgaW4gSURFLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZSgvPHN5c3RlbS1yZW1pbmRlcj4uKj88XFwvc3lzdGVtLXJlbWluZGVyPi9ncywgXCJbU1lTVEVNLVJFTUlOREVSXVwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdHlwZTogXCJ0ZXh0XCIsIHRleHQ6IHRleHQgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJsb2NrO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBub3JtYWxpemVkQ29udGVudCA9IG1lc3NhZ2UuY29udGVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByb2xlOiBtZXNzYWdlLnJvbGUsXG4gICAgICAgICAgICBjb250ZW50OiBub3JtYWxpemVkQ29udGVudCxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZSBoYXNoIHN0cmluZyBmb3IgY29udmVyc2F0aW9uIGdyb3VwaW5nXG4gICAgICovXG4gICAgcHJpdmF0ZSBoYXNoU3RyaW5nKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IGhhc2ggPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgY2hhciA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAgICAgaGFzaCA9IChoYXNoIDw8IDUpIC0gaGFzaCArIGNoYXI7XG4gICAgICAgICAgICBoYXNoID0gaGFzaCAmIGhhc2g7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE1hdGguYWJzKGhhc2gpLnRvU3RyaW5nKCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IExpdEVsZW1lbnQsIGh0bWwgfSBmcm9tIFwibGl0XCI7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBzdGF0ZSB9IGZyb20gXCJsaXQvZGVjb3JhdG9ycy5qc1wiO1xuaW1wb3J0IHsgQ2xhdWRlRGF0YSB9IGZyb20gXCIuLi8uLi9zcmMvdHlwZXNcIjtcbmltcG9ydCB7XG5cdFNoYXJlZENvbnZlcnNhdGlvblByb2Nlc3Nvcixcblx0U2ltcGxlQ29udmVyc2F0aW9uLFxuXHRQcm9jZXNzZWRQYWlyLFxufSBmcm9tIFwiLi4vLi4vc3JjL3NoYXJlZC1jb252ZXJzYXRpb24tcHJvY2Vzc29yXCI7XG5cbkBjdXN0b21FbGVtZW50KFwiY2xhdWRlLWFwcFwiKVxuZXhwb3J0IGNsYXNzIENsYXVkZUFwcCBleHRlbmRzIExpdEVsZW1lbnQge1xuXHRAc3RhdGUoKSBwcml2YXRlIGRhdGE6IENsYXVkZURhdGEgPSB7IHJhd1BhaXJzOiBbXSB9O1xuXHRAc3RhdGUoKSBwcml2YXRlIGNvbnZlcnNhdGlvbnM6IFNpbXBsZUNvbnZlcnNhdGlvbltdID0gW107XG5cdEBzdGF0ZSgpIHByaXZhdGUgcHJvY2Vzc2VkUGFpcnM6IFByb2Nlc3NlZFBhaXJbXSA9IFtdO1xuXHRAc3RhdGUoKSBwcml2YXRlIGN1cnJlbnRWaWV3OiBcImNvbnZlcnNhdGlvbnNcIiB8IFwicmF3XCIgfCBcImpzb25cIiA9IFwiY29udmVyc2F0aW9uc1wiO1xuXHRAc3RhdGUoKSBwcml2YXRlIHNlbGVjdGVkTW9kZWxzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcblxuXHQvLyBEaXNhYmxlIHNoYWRvdyBET00gdG8gdXNlIGdsb2JhbCBUYWlsd2luZCBzdHlsZXNcblx0Y3JlYXRlUmVuZGVyUm9vdCgpIHtcblx0XHRjb25zb2xlLmxvZyhcImNyZWF0ZVJlbmRlclJvb3RcIik7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRjb25uZWN0ZWRDYWxsYmFjaygpIHtcblx0XHRzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXHRcdHRoaXMuZGF0YSA9IHdpbmRvdy5jbGF1ZGVEYXRhIHx8IHsgcmF3UGFpcnM6IFtdIH07XG5cdFx0dGhpcy5wcm9jZXNzRGF0YSgpO1xuXHR9XG5cblx0cHJpdmF0ZSBwcm9jZXNzRGF0YSgpIHtcblx0XHRjb25zdCBzdGFydCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuXG5cdFx0Ly8gVXNlIHNoYXJlZCBwcm9jZXNzb3IgZm9yIGJvdGggcHJvY2Vzc2VkIHBhaXJzIGFuZCBjb252ZXJzYXRpb25zXG5cdFx0Y29uc3QgcHJvY2Vzc29yID0gbmV3IFNoYXJlZENvbnZlcnNhdGlvblByb2Nlc3NvcigpO1xuXG5cdFx0Ly8gUHJvY2VzcyByYXcgcGFpcnMgdXNpbmcgc2hhcmVkIHByb2Nlc3NvclxuXHRcdHRoaXMucHJvY2Vzc2VkUGFpcnMgPSBwcm9jZXNzb3IucHJvY2Vzc1Jhd1BhaXJzKHRoaXMuZGF0YS5yYXdQYWlycyk7XG5cdFx0Ly8gQ2hlY2sgZm9yIGluY2x1ZGUgYWxsIHJlcXVlc3RzIGZsYWcgZnJvbSBlbnZpcm9ubWVudCBvciBkYXRhXG5cdFx0Y29uc3QgaW5jbHVkZUFsbFJlcXVlc3RzID0gdGhpcy5kYXRhLm1ldGFkYXRhPy5pbmNsdWRlQWxsUmVxdWVzdHMgfHwgZmFsc2U7XG5cdFx0dGhpcy5jb252ZXJzYXRpb25zID0gcHJvY2Vzc29yLm1lcmdlQ29udmVyc2F0aW9ucyh0aGlzLnByb2Nlc3NlZFBhaXJzLCB7XG5cdFx0XHRpbmNsdWRlU2hvcnRDb252ZXJzYXRpb25zOiBpbmNsdWRlQWxsUmVxdWVzdHMsXG5cdFx0fSk7XG5cblx0XHQvLyBJbml0aWFsaXplIHdpdGggYWxsIG1vZGVscyBhdmFpbGFibGUsIGJ1dCBoYWlrdSBtb2RlbHMgZGlzYWJsZWQgYnkgZGVmYXVsdCBpbiBVSVxuXHRcdGNvbnN0IGNvbnZlcnNhdGlvbk1vZGVscyA9IG5ldyBTZXQodGhpcy5jb252ZXJzYXRpb25zLmZsYXRNYXAoKGMpID0+IEFycmF5LmZyb20oYy5tb2RlbHMpKSk7XG5cdFx0Y29uc3QgcHJvY2Vzc2VkUGFpck1vZGVscyA9IG5ldyBTZXQodGhpcy5wcm9jZXNzZWRQYWlycy5tYXAoKHApID0+IHAubW9kZWwpKTtcblx0XHRjb25zdCByYXdQYWlyTW9kZWxzID0gbmV3IFNldCh0aGlzLmRhdGEucmF3UGFpcnMubWFwKChwYWlyKSA9PiBwYWlyLnJlcXVlc3QuYm9keT8ubW9kZWwgfHwgXCJ1bmtub3duXCIpKTtcblx0XHRjb25zdCBhbGxNb2RlbHMgPSBuZXcgU2V0KFsuLi5jb252ZXJzYXRpb25Nb2RlbHMsIC4uLnByb2Nlc3NlZFBhaXJNb2RlbHMsIC4uLnJhd1BhaXJNb2RlbHNdKTtcblxuXHRcdC8vIFNlbGVjdCBhbGwgbW9kZWxzIGJ5IGRlZmF1bHQgKGluY2x1ZGluZyBoYWlrdSlcblx0XHR0aGlzLnNlbGVjdGVkTW9kZWxzID0gYWxsTW9kZWxzO1xuXHRcdGNvbnNvbGUubG9nKGBQcm9jZXNzZWQgZGF0YSBpbiAke3BlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnR9bXNgKTtcblx0fVxuXG5cdHByaXZhdGUgc3dpdGNoVmlldyh2aWV3OiBcImNvbnZlcnNhdGlvbnNcIiB8IFwicmF3XCIgfCBcImpzb25cIikge1xuXHRcdHRoaXMuY3VycmVudFZpZXcgPSB2aWV3O1xuXHR9XG5cblx0cHJpdmF0ZSB0b2dnbGVNb2RlbChtb2RlbDogc3RyaW5nKSB7XG5cdFx0Y29uc3QgbmV3U2VsZWN0ZWRNb2RlbHMgPSBuZXcgU2V0KHRoaXMuc2VsZWN0ZWRNb2RlbHMpO1xuXHRcdGlmIChuZXdTZWxlY3RlZE1vZGVscy5oYXMobW9kZWwpKSB7XG5cdFx0XHRuZXdTZWxlY3RlZE1vZGVscy5kZWxldGUobW9kZWwpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRuZXdTZWxlY3RlZE1vZGVscy5hZGQobW9kZWwpO1xuXHRcdH1cblx0XHR0aGlzLnNlbGVjdGVkTW9kZWxzID0gbmV3U2VsZWN0ZWRNb2RlbHM7XG5cdH1cblxuXHRwcml2YXRlIGdldCBmaWx0ZXJlZENvbnZlcnNhdGlvbnMoKSB7XG5cdFx0cmV0dXJuIHRoaXMuY29udmVyc2F0aW9ucy5maWx0ZXIoKGMpID0+IHtcblx0XHRcdC8vIFNob3cgY29udmVyc2F0aW9uIGlmIEFOWSBvZiBpdHMgbW9kZWxzIGFyZSBzZWxlY3RlZFxuXHRcdFx0cmV0dXJuIEFycmF5LmZyb20oYy5tb2RlbHMpLnNvbWUoKG1vZGVsKSA9PiB0aGlzLnNlbGVjdGVkTW9kZWxzLmhhcyhtb2RlbCkpO1xuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXQgZmlsdGVyZWRQcm9jZXNzZWRQYWlycygpIHtcblx0XHRyZXR1cm4gdGhpcy5wcm9jZXNzZWRQYWlycy5maWx0ZXIoKHBhaXIpID0+IHRoaXMuc2VsZWN0ZWRNb2RlbHMuaGFzKHBhaXIubW9kZWwpKTtcblx0fVxuXG5cdHByaXZhdGUgZ2V0IGZpbHRlcmVkUmF3UGFpcnMoKSB7XG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5yYXdQYWlycy5maWx0ZXIoKHBhaXIpID0+IHtcblx0XHRcdGNvbnN0IG1vZGVsID0gcGFpci5yZXF1ZXN0LmJvZHk/Lm1vZGVsIHx8IFwidW5rbm93blwiO1xuXHRcdFx0cmV0dXJuIHRoaXMuc2VsZWN0ZWRNb2RlbHMuaGFzKG1vZGVsKTtcblx0XHR9KTtcblx0fVxuXG5cdHByaXZhdGUgZ2V0IGFsbFJhd1BhaXJzKCkge1xuXHRcdC8vIERlYnVnIHZpZXcgc2hvd3MgQUxMIHJhdyBwYWlycyB3aXRob3V0IGFueSBmaWx0ZXJpbmdcblx0XHRyZXR1cm4gdGhpcy5kYXRhLnJhd1BhaXJzLmZpbHRlcigocGFpcikgPT4gcGFpci5yZXNwb25zZSAhPT0gbnVsbCk7XG5cdH1cblxuXHRwcml2YXRlIGdldCBtb2RlbENvdW50cygpIHtcblx0XHRjb25zdCBjb3VudHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuXHRcdHRoaXMuY29udmVyc2F0aW9ucy5mb3JFYWNoKChjKSA9PiB7XG5cdFx0XHQvLyBDb3VudCBlYWNoIG1vZGVsIHVzZWQgaW4gY29udmVyc2F0aW9uc1xuXHRcdFx0QXJyYXkuZnJvbShjLm1vZGVscykuZm9yRWFjaCgobW9kZWwpID0+IHtcblx0XHRcdFx0Y291bnRzLnNldChtb2RlbCwgKGNvdW50cy5nZXQobW9kZWwpIHx8IDApICsgMSk7XG5cdFx0XHR9KTtcblx0XHR9KTtcblx0XHRyZXR1cm4gY291bnRzO1xuXHR9XG5cblx0cmVuZGVyKCkge1xuXHRcdGNvbnN0IG1vZGVsQ291bnRzID0gdGhpcy5tb2RlbENvdW50cztcblx0XHRjb25zdCBmaWx0ZXJlZENvbnZlcnNhdGlvbnMgPSB0aGlzLmZpbHRlcmVkQ29udmVyc2F0aW9ucztcblxuXHRcdHJldHVybiBodG1sYFxuXHRcdFx0PGRpdiBjbGFzcz1cIm1pbi1oLXNjcmVlbiBiZy12cy1iZyB0ZXh0LXZzLXRleHQgZm9udC1tb25vXCI+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJtYXgtdy1bNjBlbV0gbXgtYXV0byBwLTRcIj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwibWItOFwiPlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cIm1iLTQgdGV4dC1jZW50ZXJcIj5cblx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJ0ZXh0LXZzLWZ1bmN0aW9uXCI+fiBjbGF1ZGUtdHJhZmZpYzwvc3Bhbj5cblx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJ0ZXh0LXZzLW11dGVkIG1sLThcIj4ke3RoaXMuZGF0YS50aW1lc3RhbXAgfHwgbmV3IERhdGUoKS50b0lTT1N0cmluZygpfTwvc3Bhbj5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwibWItOCB0ZXh0LWNlbnRlclwiPlxuXHRcdFx0XHRcdFx0XHQ8c3BhblxuXHRcdFx0XHRcdFx0XHRcdEBjbGljaz0keygpID0+IHRoaXMuc3dpdGNoVmlldyhcImNvbnZlcnNhdGlvbnNcIil9XG5cdFx0XHRcdFx0XHRcdFx0Y2xhc3M9XCJjdXJzb3ItcG9pbnRlciBtci0xMiAke3RoaXMuY3VycmVudFZpZXcgPT09IFwiY29udmVyc2F0aW9uc1wiXG5cdFx0XHRcdFx0XHRcdFx0XHQ/IFwidGV4dC12cy1uYXYtYWN0aXZlXCJcblx0XHRcdFx0XHRcdFx0XHRcdDogXCJ0ZXh0LXZzLXRleHQgaG92ZXI6dGV4dC12cy1hY2NlbnRcIn1cIlxuXHRcdFx0XHRcdFx0XHQ+XG5cdFx0XHRcdFx0XHRcdFx0Y29udmVyc2F0aW9ucyAoJHtmaWx0ZXJlZENvbnZlcnNhdGlvbnMubGVuZ3RofSlcblx0XHRcdFx0XHRcdFx0PC9zcGFuPlxuXHRcdFx0XHRcdFx0XHQ8c3BhblxuXHRcdFx0XHRcdFx0XHRcdEBjbGljaz0keygpID0+IHRoaXMuc3dpdGNoVmlldyhcInJhd1wiKX1cblx0XHRcdFx0XHRcdFx0XHRjbGFzcz1cImN1cnNvci1wb2ludGVyIG1yLTEyICR7dGhpcy5jdXJyZW50VmlldyA9PT0gXCJyYXdcIlxuXHRcdFx0XHRcdFx0XHRcdFx0PyBcInRleHQtdnMtbmF2LWFjdGl2ZVwiXG5cdFx0XHRcdFx0XHRcdFx0XHQ6IFwidGV4dC12cy10ZXh0IGhvdmVyOnRleHQtdnMtYWNjZW50XCJ9XCJcblx0XHRcdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0XHRcdHJhdyBjYWxscyAoJHt0aGlzLmFsbFJhd1BhaXJzLmxlbmd0aH0pXG5cdFx0XHRcdFx0XHRcdDwvc3Bhbj5cblx0XHRcdFx0XHRcdFx0PHNwYW5cblx0XHRcdFx0XHRcdFx0XHRAY2xpY2s9JHsoKSA9PiB0aGlzLnN3aXRjaFZpZXcoXCJqc29uXCIpfVxuXHRcdFx0XHRcdFx0XHRcdGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgbXItMTIgJHt0aGlzLmN1cnJlbnRWaWV3ID09PSBcImpzb25cIlxuXHRcdFx0XHRcdFx0XHRcdFx0PyBcInRleHQtdnMtbmF2LWFjdGl2ZVwiXG5cdFx0XHRcdFx0XHRcdFx0XHQ6IFwidGV4dC12cy10ZXh0IGhvdmVyOnRleHQtdnMtYWNjZW50XCJ9XCJcblx0XHRcdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0XHRcdGpzb24gZGVidWcgKCR7dGhpcy5maWx0ZXJlZFByb2Nlc3NlZFBhaXJzLmxlbmd0aH0pXG5cdFx0XHRcdFx0XHRcdDwvc3Bhbj5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXG5cdFx0XHRcdFx0XHQke21vZGVsQ291bnRzLnNpemUgPiAxICYmIHRoaXMuY3VycmVudFZpZXcgIT09IFwicmF3XCJcblx0XHRcdFx0XHRcdFx0PyBodG1sYFxuXHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cIm1iLTQgdGV4dC1jZW50ZXJcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0JHtBcnJheS5mcm9tKG1vZGVsQ291bnRzLmVudHJpZXMoKSkubWFwKChbbW9kZWwsIF9jb3VudF0pID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gaHRtbGBcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdEBjbGljaz0keygpID0+IHRoaXMudG9nZ2xlTW9kZWwobW9kZWwpfVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjbGFzcz1cImN1cnNvci1wb2ludGVyIGhvdmVyOnRleHQtdnMtYWNjZW50IG1yLThcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQke3RoaXMuc2VsZWN0ZWRNb2RlbHMuaGFzKG1vZGVsKSA/IFwiW3hdXCIgOiBcIlsgXVwifSAke21vZGVsfVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9zcGFuPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGA7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0pfVxuXHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0YFxuXHRcdFx0XHRcdFx0XHQ6IFwiXCJ9XG5cdFx0XHRcdFx0PC9kaXY+XG5cblx0XHRcdFx0XHQ8ZGl2PlxuXHRcdFx0XHRcdFx0JHt0aGlzLmN1cnJlbnRWaWV3ID09PSBcImNvbnZlcnNhdGlvbnNcIlxuXHRcdFx0XHRcdFx0XHQ/IGh0bWxgXG5cdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGlkPVwiY29udmVyc2F0aW9ucy12aWV3XCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdCR7ZmlsdGVyZWRDb252ZXJzYXRpb25zLmxlbmd0aCA9PT0gMFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdD8gaHRtbGA8ZGl2Pk5vIGNvbnZlcnNhdGlvbnMgZm91bmQgZm9yIHNlbGVjdGVkIG1vZGVscy48L2Rpdj5gXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0OiBodG1sYDxzaW1wbGUtY29udmVyc2F0aW9uLXZpZXdcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LmNvbnZlcnNhdGlvbnM9JHtmaWx0ZXJlZENvbnZlcnNhdGlvbnN9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ+PC9zaW1wbGUtY29udmVyc2F0aW9uLXZpZXc+YH1cblx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdGBcblx0XHRcdFx0XHRcdFx0OiBcIlwifVxuXHRcdFx0XHRcdFx0JHt0aGlzLmN1cnJlbnRWaWV3ID09PSBcInJhd1wiXG5cdFx0XHRcdFx0XHRcdD8gaHRtbGBcblx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgaWQ9XCJyYXctdmlld1wiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQke3RoaXMuYWxsUmF3UGFpcnMubGVuZ3RoID09PSAwXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PyBodG1sYDxkaXY+Tm8gcmF3IHBhaXJzIGZvdW5kLjwvZGl2PmBcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ6IGh0bWxgPHJhdy1wYWlycy12aWV3IC5yYXdQYWlycz0ke3RoaXMuYWxsUmF3UGFpcnN9PjwvcmF3LXBhaXJzLXZpZXc+YH1cblx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdGBcblx0XHRcdFx0XHRcdFx0OiBcIlwifVxuXHRcdFx0XHRcdFx0JHt0aGlzLmN1cnJlbnRWaWV3ID09PSBcImpzb25cIlxuXHRcdFx0XHRcdFx0XHQ/IGh0bWxgXG5cdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGlkPVwianNvbi12aWV3XCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdCR7dGhpcy5maWx0ZXJlZFByb2Nlc3NlZFBhaXJzLmxlbmd0aCA9PT0gMFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdD8gaHRtbGA8ZGl2Pk5vIHByb2Nlc3NlZCBwYWlycyBmb3VuZCBmb3Igc2VsZWN0ZWQgbW9kZWxzLjwvZGl2PmBcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ6IGh0bWxgPGpzb24tdmlldyAucHJvY2Vzc2VkUGFpcnM9JHt0aGlzLmZpbHRlcmVkUHJvY2Vzc2VkUGFpcnN9PjwvanNvbi12aWV3PmB9XG5cdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHRgXG5cdFx0XHRcdFx0XHRcdDogXCJcIn1cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHQ8L2Rpdj5cblx0XHRgO1xuXHR9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZVxuICovXG5cbmltcG9ydCB7RGlzY29ubmVjdGFibGUsIFBhcnR9IGZyb20gJy4vbGl0LWh0bWwuanMnO1xuXG5leHBvcnQge1xuICBBdHRyaWJ1dGVQYXJ0LFxuICBCb29sZWFuQXR0cmlidXRlUGFydCxcbiAgQ2hpbGRQYXJ0LFxuICBFbGVtZW50UGFydCxcbiAgRXZlbnRQYXJ0LFxuICBQYXJ0LFxuICBQcm9wZXJ0eVBhcnQsXG59IGZyb20gJy4vbGl0LWh0bWwuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIERpcmVjdGl2ZUNsYXNzIHtcbiAgbmV3IChwYXJ0OiBQYXJ0SW5mbyk6IERpcmVjdGl2ZTtcbn1cblxuLyoqXG4gKiBUaGlzIHV0aWxpdHkgdHlwZSBleHRyYWN0cyB0aGUgc2lnbmF0dXJlIG9mIGEgZGlyZWN0aXZlIGNsYXNzJ3MgcmVuZGVyKClcbiAqIG1ldGhvZCBzbyB3ZSBjYW4gdXNlIGl0IGZvciB0aGUgdHlwZSBvZiB0aGUgZ2VuZXJhdGVkIGRpcmVjdGl2ZSBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IHR5cGUgRGlyZWN0aXZlUGFyYW1ldGVyczxDIGV4dGVuZHMgRGlyZWN0aXZlPiA9IFBhcmFtZXRlcnM8Q1sncmVuZGVyJ10+O1xuXG4vKipcbiAqIEEgZ2VuZXJhdGVkIGRpcmVjdGl2ZSBmdW5jdGlvbiBkb2Vzbid0IGV2YWx1YXRlIHRoZSBkaXJlY3RpdmUsIGJ1dCBqdXN0XG4gKiByZXR1cm5zIGEgRGlyZWN0aXZlUmVzdWx0IG9iamVjdCB0aGF0IGNhcHR1cmVzIHRoZSBhcmd1bWVudHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGlyZWN0aXZlUmVzdWx0PEMgZXh0ZW5kcyBEaXJlY3RpdmVDbGFzcyA9IERpcmVjdGl2ZUNsYXNzPiB7XG4gIC8qKlxuICAgKiBUaGlzIHByb3BlcnR5IG5lZWRzIHRvIHJlbWFpbiB1bm1pbmlmaWVkLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIFsnXyRsaXREaXJlY3RpdmUkJ106IEM7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgdmFsdWVzOiBEaXJlY3RpdmVQYXJhbWV0ZXJzPEluc3RhbmNlVHlwZTxDPj47XG59XG5cbmV4cG9ydCBjb25zdCBQYXJ0VHlwZSA9IHtcbiAgQVRUUklCVVRFOiAxLFxuICBDSElMRDogMixcbiAgUFJPUEVSVFk6IDMsXG4gIEJPT0xFQU5fQVRUUklCVVRFOiA0LFxuICBFVkVOVDogNSxcbiAgRUxFTUVOVDogNixcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFBhcnRUeXBlID0gKHR5cGVvZiBQYXJ0VHlwZSlba2V5b2YgdHlwZW9mIFBhcnRUeXBlXTtcblxuZXhwb3J0IGludGVyZmFjZSBDaGlsZFBhcnRJbmZvIHtcbiAgcmVhZG9ubHkgdHlwZTogdHlwZW9mIFBhcnRUeXBlLkNISUxEO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEF0dHJpYnV0ZVBhcnRJbmZvIHtcbiAgcmVhZG9ubHkgdHlwZTpcbiAgICB8IHR5cGVvZiBQYXJ0VHlwZS5BVFRSSUJVVEVcbiAgICB8IHR5cGVvZiBQYXJ0VHlwZS5QUk9QRVJUWVxuICAgIHwgdHlwZW9mIFBhcnRUeXBlLkJPT0xFQU5fQVRUUklCVVRFXG4gICAgfCB0eXBlb2YgUGFydFR5cGUuRVZFTlQ7XG4gIHJlYWRvbmx5IHN0cmluZ3M/OiBSZWFkb25seUFycmF5PHN0cmluZz47XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgdGFnTmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVsZW1lbnRQYXJ0SW5mbyB7XG4gIHJlYWRvbmx5IHR5cGU6IHR5cGVvZiBQYXJ0VHlwZS5FTEVNRU5UO1xufVxuXG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBwYXJ0IGEgZGlyZWN0aXZlIGlzIGJvdW5kIHRvLlxuICpcbiAqIFRoaXMgaXMgdXNlZnVsIGZvciBjaGVja2luZyB0aGF0IGEgZGlyZWN0aXZlIGlzIGF0dGFjaGVkIHRvIGEgdmFsaWQgcGFydCxcbiAqIHN1Y2ggYXMgd2l0aCBkaXJlY3RpdmUgdGhhdCBjYW4gb25seSBiZSB1c2VkIG9uIGF0dHJpYnV0ZSBiaW5kaW5ncy5cbiAqL1xuZXhwb3J0IHR5cGUgUGFydEluZm8gPSBDaGlsZFBhcnRJbmZvIHwgQXR0cmlidXRlUGFydEluZm8gfCBFbGVtZW50UGFydEluZm87XG5cbi8qKlxuICogQ3JlYXRlcyBhIHVzZXItZmFjaW5nIGRpcmVjdGl2ZSBmdW5jdGlvbiBmcm9tIGEgRGlyZWN0aXZlIGNsYXNzLiBUaGlzXG4gKiBmdW5jdGlvbiBoYXMgdGhlIHNhbWUgcGFyYW1ldGVycyBhcyB0aGUgZGlyZWN0aXZlJ3MgcmVuZGVyKCkgbWV0aG9kLlxuICovXG5leHBvcnQgY29uc3QgZGlyZWN0aXZlID1cbiAgPEMgZXh0ZW5kcyBEaXJlY3RpdmVDbGFzcz4oYzogQykgPT5cbiAgKC4uLnZhbHVlczogRGlyZWN0aXZlUGFyYW1ldGVyczxJbnN0YW5jZVR5cGU8Qz4+KTogRGlyZWN0aXZlUmVzdWx0PEM+ID0+ICh7XG4gICAgLy8gVGhpcyBwcm9wZXJ0eSBuZWVkcyB0byByZW1haW4gdW5taW5pZmllZC5cbiAgICBbJ18kbGl0RGlyZWN0aXZlJCddOiBjLFxuICAgIHZhbHVlcyxcbiAgfSk7XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgY3JlYXRpbmcgY3VzdG9tIGRpcmVjdGl2ZXMuIFVzZXJzIHNob3VsZCBleHRlbmQgdGhpcyBjbGFzcyxcbiAqIGltcGxlbWVudCBgcmVuZGVyYCBhbmQvb3IgYHVwZGF0ZWAsIGFuZCB0aGVuIHBhc3MgdGhlaXIgc3ViY2xhc3MgdG9cbiAqIGBkaXJlY3RpdmVgLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRGlyZWN0aXZlIGltcGxlbWVudHMgRGlzY29ubmVjdGFibGUge1xuICAvL0BpbnRlcm5hbFxuICBfX3BhcnQhOiBQYXJ0O1xuICAvL0BpbnRlcm5hbFxuICBfX2F0dHJpYnV0ZUluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIC8vQGludGVybmFsXG4gIF9fZGlyZWN0aXZlPzogRGlyZWN0aXZlO1xuXG4gIC8vQGludGVybmFsXG4gIF8kcGFyZW50ITogRGlzY29ubmVjdGFibGU7XG5cbiAgLy8gVGhlc2Ugd2lsbCBvbmx5IGV4aXN0IG9uIHRoZSBBc3luY0RpcmVjdGl2ZSBzdWJjbGFzc1xuICAvL0BpbnRlcm5hbFxuICBfJGRpc2Nvbm5lY3RhYmxlQ2hpbGRyZW4/OiBTZXQ8RGlzY29ubmVjdGFibGU+O1xuICAvLyBUaGlzIHByb3BlcnR5IG5lZWRzIHRvIHJlbWFpbiB1bm1pbmlmaWVkLlxuICAvL0BpbnRlcm5hbFxuICBbJ18kbm90aWZ5RGlyZWN0aXZlQ29ubmVjdGlvbkNoYW5nZWQnXT8oaXNDb25uZWN0ZWQ6IGJvb2xlYW4pOiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKF9wYXJ0SW5mbzogUGFydEluZm8pIHt9XG5cbiAgLy8gU2VlIGNvbW1lbnQgaW4gRGlzY29ubmVjdGFibGUgaW50ZXJmYWNlIGZvciB3aHkgdGhpcyBpcyBhIGdldHRlclxuICBnZXQgXyRpc0Nvbm5lY3RlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fJHBhcmVudC5fJGlzQ29ubmVjdGVkO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfJGluaXRpYWxpemUoXG4gICAgcGFydDogUGFydCxcbiAgICBwYXJlbnQ6IERpc2Nvbm5lY3RhYmxlLFxuICAgIGF0dHJpYnV0ZUluZGV4OiBudW1iZXIgfCB1bmRlZmluZWRcbiAgKSB7XG4gICAgdGhpcy5fX3BhcnQgPSBwYXJ0O1xuICAgIHRoaXMuXyRwYXJlbnQgPSBwYXJlbnQ7XG4gICAgdGhpcy5fX2F0dHJpYnV0ZUluZGV4ID0gYXR0cmlidXRlSW5kZXg7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfJHJlc29sdmUocGFydDogUGFydCwgcHJvcHM6IEFycmF5PHVua25vd24+KTogdW5rbm93biB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlKHBhcnQsIHByb3BzKTtcbiAgfVxuXG4gIGFic3RyYWN0IHJlbmRlciguLi5wcm9wczogQXJyYXk8dW5rbm93bj4pOiB1bmtub3duO1xuXG4gIHVwZGF0ZShfcGFydDogUGFydCwgcHJvcHM6IEFycmF5PHVua25vd24+KTogdW5rbm93biB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyKC4uLnByb3BzKTtcbiAgfVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2VcbiAqL1xuXG5pbXBvcnQge25vdGhpbmcsIFRlbXBsYXRlUmVzdWx0LCBub0NoYW5nZX0gZnJvbSAnLi4vbGl0LWh0bWwuanMnO1xuaW1wb3J0IHtkaXJlY3RpdmUsIERpcmVjdGl2ZSwgUGFydEluZm8sIFBhcnRUeXBlfSBmcm9tICcuLi9kaXJlY3RpdmUuanMnO1xuXG5jb25zdCBIVE1MX1JFU1VMVCA9IDE7XG5cbmV4cG9ydCBjbGFzcyBVbnNhZmVIVE1MRGlyZWN0aXZlIGV4dGVuZHMgRGlyZWN0aXZlIHtcbiAgc3RhdGljIGRpcmVjdGl2ZU5hbWUgPSAndW5zYWZlSFRNTCc7XG4gIHN0YXRpYyByZXN1bHRUeXBlID0gSFRNTF9SRVNVTFQ7XG5cbiAgcHJpdmF0ZSBfdmFsdWU6IHVua25vd24gPSBub3RoaW5nO1xuICBwcml2YXRlIF90ZW1wbGF0ZVJlc3VsdD86IFRlbXBsYXRlUmVzdWx0O1xuXG4gIGNvbnN0cnVjdG9yKHBhcnRJbmZvOiBQYXJ0SW5mbykge1xuICAgIHN1cGVyKHBhcnRJbmZvKTtcbiAgICBpZiAocGFydEluZm8udHlwZSAhPT0gUGFydFR5cGUuQ0hJTEQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYCR7XG4gICAgICAgICAgKHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIFVuc2FmZUhUTUxEaXJlY3RpdmUpLmRpcmVjdGl2ZU5hbWVcbiAgICAgICAgfSgpIGNhbiBvbmx5IGJlIHVzZWQgaW4gY2hpbGQgYmluZGluZ3NgXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlcih2YWx1ZTogc3RyaW5nIHwgdHlwZW9mIG5vdGhpbmcgfCB0eXBlb2Ygbm9DaGFuZ2UgfCB1bmRlZmluZWQgfCBudWxsKSB7XG4gICAgaWYgKHZhbHVlID09PSBub3RoaW5nIHx8IHZhbHVlID09IG51bGwpIHtcbiAgICAgIHRoaXMuX3RlbXBsYXRlUmVzdWx0ID0gdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuICh0aGlzLl92YWx1ZSA9IHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSBub0NoYW5nZSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGAke1xuICAgICAgICAgICh0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBVbnNhZmVIVE1MRGlyZWN0aXZlKS5kaXJlY3RpdmVOYW1lXG4gICAgICAgIH0oKSBjYWxsZWQgd2l0aCBhIG5vbi1zdHJpbmcgdmFsdWVgXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09IHRoaXMuX3ZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdGVtcGxhdGVSZXN1bHQ7XG4gICAgfVxuICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgY29uc3Qgc3RyaW5ncyA9IFt2YWx1ZV0gYXMgdW5rbm93biBhcyBUZW1wbGF0ZVN0cmluZ3NBcnJheTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIChzdHJpbmdzIGFzIGFueSkucmF3ID0gc3RyaW5ncztcbiAgICAvLyBXQVJOSU5HOiBpbXBlcnNvbmF0aW5nIGEgVGVtcGxhdGVSZXN1bHQgbGlrZSB0aGlzIGlzIGV4dHJlbWVseVxuICAgIC8vIGRhbmdlcm91cy4gVGhpcmQtcGFydHkgZGlyZWN0aXZlcyBzaG91bGQgbm90IGRvIHRoaXMuXG4gICAgcmV0dXJuICh0aGlzLl90ZW1wbGF0ZVJlc3VsdCA9IHtcbiAgICAgIC8vIENhc3QgdG8gYSBrbm93biBzZXQgb2YgaW50ZWdlcnMgdGhhdCBzYXRpc2Z5IFJlc3VsdFR5cGUgc28gdGhhdCB3ZVxuICAgICAgLy8gZG9uJ3QgaGF2ZSB0byBleHBvcnQgUmVzdWx0VHlwZSBhbmQgcG9zc2libHkgZW5jb3VyYWdlIHRoaXMgcGF0dGVybi5cbiAgICAgIC8vIFRoaXMgcHJvcGVydHkgbmVlZHMgdG8gcmVtYWluIHVubWluaWZpZWQuXG4gICAgICBbJ18kbGl0VHlwZSQnXTogKHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIFVuc2FmZUhUTUxEaXJlY3RpdmUpXG4gICAgICAgIC5yZXN1bHRUeXBlIGFzIDEgfCAyLFxuICAgICAgc3RyaW5ncyxcbiAgICAgIHZhbHVlczogW10sXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZW5kZXJzIHRoZSByZXN1bHQgYXMgSFRNTCwgcmF0aGVyIHRoYW4gdGV4dC5cbiAqXG4gKiBUaGUgdmFsdWVzIGB1bmRlZmluZWRgLCBgbnVsbGAsIGFuZCBgbm90aGluZ2AsIHdpbGwgYWxsIHJlc3VsdCBpbiBubyBjb250ZW50XG4gKiAoZW1wdHkgc3RyaW5nKSBiZWluZyByZW5kZXJlZC5cbiAqXG4gKiBOb3RlLCB0aGlzIGlzIHVuc2FmZSB0byB1c2Ugd2l0aCBhbnkgdXNlci1wcm92aWRlZCBpbnB1dCB0aGF0IGhhc24ndCBiZWVuXG4gKiBzYW5pdGl6ZWQgb3IgZXNjYXBlZCwgYXMgaXQgbWF5IGxlYWQgdG8gY3Jvc3Mtc2l0ZS1zY3JpcHRpbmdcbiAqIHZ1bG5lcmFiaWxpdGllcy5cbiAqL1xuZXhwb3J0IGNvbnN0IHVuc2FmZUhUTUwgPSBkaXJlY3RpdmUoVW5zYWZlSFRNTERpcmVjdGl2ZSk7XG4iLCAiZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGlmZiB7XG4gICAgZGlmZihvbGRTdHIsIG5ld1N0ciwgXG4gICAgLy8gVHlwZSBiZWxvdyBpcyBub3QgYWNjdXJhdGUvY29tcGxldGUgLSBzZWUgYWJvdmUgZm9yIGZ1bGwgcG9zc2liaWxpdGllcyAtIGJ1dCBpdCBjb21waWxlc1xuICAgIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBsZXQgY2FsbGJhY2s7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBvcHRpb25zO1xuICAgICAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCdjYWxsYmFjaycgaW4gb3B0aW9ucykge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBvcHRpb25zLmNhbGxiYWNrO1xuICAgICAgICB9XG4gICAgICAgIC8vIEFsbG93IHN1YmNsYXNzZXMgdG8gbWFzc2FnZSB0aGUgaW5wdXQgcHJpb3IgdG8gcnVubmluZ1xuICAgICAgICBjb25zdCBvbGRTdHJpbmcgPSB0aGlzLmNhc3RJbnB1dChvbGRTdHIsIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBuZXdTdHJpbmcgPSB0aGlzLmNhc3RJbnB1dChuZXdTdHIsIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBvbGRUb2tlbnMgPSB0aGlzLnJlbW92ZUVtcHR5KHRoaXMudG9rZW5pemUob2xkU3RyaW5nLCBvcHRpb25zKSk7XG4gICAgICAgIGNvbnN0IG5ld1Rva2VucyA9IHRoaXMucmVtb3ZlRW1wdHkodGhpcy50b2tlbml6ZShuZXdTdHJpbmcsIG9wdGlvbnMpKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlmZldpdGhPcHRpb25zT2JqKG9sZFRva2VucywgbmV3VG9rZW5zLCBvcHRpb25zLCBjYWxsYmFjayk7XG4gICAgfVxuICAgIGRpZmZXaXRoT3B0aW9uc09iaihvbGRUb2tlbnMsIG5ld1Rva2Vucywgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBkb25lID0gKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICB2YWx1ZSA9IHRoaXMucG9zdFByb2Nlc3ModmFsdWUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IGNhbGxiYWNrKHZhbHVlKTsgfSwgMCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgbmV3TGVuID0gbmV3VG9rZW5zLmxlbmd0aCwgb2xkTGVuID0gb2xkVG9rZW5zLmxlbmd0aDtcbiAgICAgICAgbGV0IGVkaXRMZW5ndGggPSAxO1xuICAgICAgICBsZXQgbWF4RWRpdExlbmd0aCA9IG5ld0xlbiArIG9sZExlbjtcbiAgICAgICAgaWYgKG9wdGlvbnMubWF4RWRpdExlbmd0aCAhPSBudWxsKSB7XG4gICAgICAgICAgICBtYXhFZGl0TGVuZ3RoID0gTWF0aC5taW4obWF4RWRpdExlbmd0aCwgb3B0aW9ucy5tYXhFZGl0TGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtYXhFeGVjdXRpb25UaW1lID0gKF9hID0gb3B0aW9ucy50aW1lb3V0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBJbmZpbml0eTtcbiAgICAgICAgY29uc3QgYWJvcnRBZnRlclRpbWVzdGFtcCA9IERhdGUubm93KCkgKyBtYXhFeGVjdXRpb25UaW1lO1xuICAgICAgICBjb25zdCBiZXN0UGF0aCA9IFt7IG9sZFBvczogLTEsIGxhc3RDb21wb25lbnQ6IHVuZGVmaW5lZCB9XTtcbiAgICAgICAgLy8gU2VlZCBlZGl0TGVuZ3RoID0gMCwgaS5lLiB0aGUgY29udGVudCBzdGFydHMgd2l0aCB0aGUgc2FtZSB2YWx1ZXNcbiAgICAgICAgbGV0IG5ld1BvcyA9IHRoaXMuZXh0cmFjdENvbW1vbihiZXN0UGF0aFswXSwgbmV3VG9rZW5zLCBvbGRUb2tlbnMsIDAsIG9wdGlvbnMpO1xuICAgICAgICBpZiAoYmVzdFBhdGhbMF0ub2xkUG9zICsgMSA+PSBvbGRMZW4gJiYgbmV3UG9zICsgMSA+PSBuZXdMZW4pIHtcbiAgICAgICAgICAgIC8vIElkZW50aXR5IHBlciB0aGUgZXF1YWxpdHkgYW5kIHRva2VuaXplclxuICAgICAgICAgICAgcmV0dXJuIGRvbmUodGhpcy5idWlsZFZhbHVlcyhiZXN0UGF0aFswXS5sYXN0Q29tcG9uZW50LCBuZXdUb2tlbnMsIG9sZFRva2VucykpO1xuICAgICAgICB9XG4gICAgICAgIC8vIE9uY2Ugd2UgaGl0IHRoZSByaWdodCBlZGdlIG9mIHRoZSBlZGl0IGdyYXBoIG9uIHNvbWUgZGlhZ29uYWwgaywgd2UgY2FuXG4gICAgICAgIC8vIGRlZmluaXRlbHkgcmVhY2ggdGhlIGVuZCBvZiB0aGUgZWRpdCBncmFwaCBpbiBubyBtb3JlIHRoYW4gayBlZGl0cywgc29cbiAgICAgICAgLy8gdGhlcmUncyBubyBwb2ludCBpbiBjb25zaWRlcmluZyBhbnkgbW92ZXMgdG8gZGlhZ29uYWwgaysxIGFueSBtb3JlIChmcm9tXG4gICAgICAgIC8vIHdoaWNoIHdlJ3JlIGd1YXJhbnRlZWQgdG8gbmVlZCBhdCBsZWFzdCBrKzEgbW9yZSBlZGl0cykuXG4gICAgICAgIC8vIFNpbWlsYXJseSwgb25jZSB3ZSd2ZSByZWFjaGVkIHRoZSBib3R0b20gb2YgdGhlIGVkaXQgZ3JhcGgsIHRoZXJlJ3Mgbm9cbiAgICAgICAgLy8gcG9pbnQgY29uc2lkZXJpbmcgbW92ZXMgdG8gbG93ZXIgZGlhZ29uYWxzLlxuICAgICAgICAvLyBXZSByZWNvcmQgdGhpcyBmYWN0IGJ5IHNldHRpbmcgbWluRGlhZ29uYWxUb0NvbnNpZGVyIGFuZFxuICAgICAgICAvLyBtYXhEaWFnb25hbFRvQ29uc2lkZXIgdG8gc29tZSBmaW5pdGUgdmFsdWUgb25jZSB3ZSd2ZSBoaXQgdGhlIGVkZ2Ugb2ZcbiAgICAgICAgLy8gdGhlIGVkaXQgZ3JhcGguXG4gICAgICAgIC8vIFRoaXMgb3B0aW1pemF0aW9uIGlzIG5vdCBmYWl0aGZ1bCB0byB0aGUgb3JpZ2luYWwgYWxnb3JpdGhtIHByZXNlbnRlZCBpblxuICAgICAgICAvLyBNeWVycydzIHBhcGVyLCB3aGljaCBpbnN0ZWFkIHBvaW50bGVzc2x5IGV4dGVuZHMgRC1wYXRocyBvZmYgdGhlIGVuZCBvZlxuICAgICAgICAvLyB0aGUgZWRpdCBncmFwaCAtIHNlZSBwYWdlIDcgb2YgTXllcnMncyBwYXBlciB3aGljaCBub3RlcyB0aGlzIHBvaW50XG4gICAgICAgIC8vIGV4cGxpY2l0bHkgYW5kIGlsbHVzdHJhdGVzIGl0IHdpdGggYSBkaWFncmFtLiBUaGlzIGhhcyBtYWpvciBwZXJmb3JtYW5jZVxuICAgICAgICAvLyBpbXBsaWNhdGlvbnMgZm9yIHNvbWUgY29tbW9uIHNjZW5hcmlvcy4gRm9yIGluc3RhbmNlLCB0byBjb21wdXRlIGEgZGlmZlxuICAgICAgICAvLyB3aGVyZSB0aGUgbmV3IHRleHQgc2ltcGx5IGFwcGVuZHMgZCBjaGFyYWN0ZXJzIG9uIHRoZSBlbmQgb2YgdGhlXG4gICAgICAgIC8vIG9yaWdpbmFsIHRleHQgb2YgbGVuZ3RoIG4sIHRoZSB0cnVlIE15ZXJzIGFsZ29yaXRobSB3aWxsIHRha2UgTyhuK2ReMilcbiAgICAgICAgLy8gdGltZSB3aGlsZSB0aGlzIG9wdGltaXphdGlvbiBuZWVkcyBvbmx5IE8obitkKSB0aW1lLlxuICAgICAgICBsZXQgbWluRGlhZ29uYWxUb0NvbnNpZGVyID0gLUluZmluaXR5LCBtYXhEaWFnb25hbFRvQ29uc2lkZXIgPSBJbmZpbml0eTtcbiAgICAgICAgLy8gTWFpbiB3b3JrZXIgbWV0aG9kLiBjaGVja3MgYWxsIHBlcm11dGF0aW9ucyBvZiBhIGdpdmVuIGVkaXQgbGVuZ3RoIGZvciBhY2NlcHRhbmNlLlxuICAgICAgICBjb25zdCBleGVjRWRpdExlbmd0aCA9ICgpID0+IHtcbiAgICAgICAgICAgIGZvciAobGV0IGRpYWdvbmFsUGF0aCA9IE1hdGgubWF4KG1pbkRpYWdvbmFsVG9Db25zaWRlciwgLWVkaXRMZW5ndGgpOyBkaWFnb25hbFBhdGggPD0gTWF0aC5taW4obWF4RGlhZ29uYWxUb0NvbnNpZGVyLCBlZGl0TGVuZ3RoKTsgZGlhZ29uYWxQYXRoICs9IDIpIHtcbiAgICAgICAgICAgICAgICBsZXQgYmFzZVBhdGg7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVtb3ZlUGF0aCA9IGJlc3RQYXRoW2RpYWdvbmFsUGF0aCAtIDFdLCBhZGRQYXRoID0gYmVzdFBhdGhbZGlhZ29uYWxQYXRoICsgMV07XG4gICAgICAgICAgICAgICAgaWYgKHJlbW92ZVBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTm8gb25lIGVsc2UgaXMgZ29pbmcgdG8gYXR0ZW1wdCB0byB1c2UgdGhpcyB2YWx1ZSwgY2xlYXIgaXRcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIHBlcmYgb3B0aW1pc2F0aW9uLiBUaGlzIHR5cGUtdmlvbGF0aW5nIHZhbHVlIHdpbGwgbmV2ZXIgYmUgcmVhZC5cbiAgICAgICAgICAgICAgICAgICAgYmVzdFBhdGhbZGlhZ29uYWxQYXRoIC0gMV0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBjYW5BZGQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAoYWRkUGF0aCkge1xuICAgICAgICAgICAgICAgICAgICAvLyB3aGF0IG5ld1BvcyB3aWxsIGJlIGFmdGVyIHdlIGRvIGFuIGluc2VydGlvbjpcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWRkUGF0aE5ld1BvcyA9IGFkZFBhdGgub2xkUG9zIC0gZGlhZ29uYWxQYXRoO1xuICAgICAgICAgICAgICAgICAgICBjYW5BZGQgPSBhZGRQYXRoICYmIDAgPD0gYWRkUGF0aE5ld1BvcyAmJiBhZGRQYXRoTmV3UG9zIDwgbmV3TGVuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBjYW5SZW1vdmUgPSByZW1vdmVQYXRoICYmIHJlbW92ZVBhdGgub2xkUG9zICsgMSA8IG9sZExlbjtcbiAgICAgICAgICAgICAgICBpZiAoIWNhbkFkZCAmJiAhY2FuUmVtb3ZlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgcGF0aCBpcyBhIHRlcm1pbmFsIHRoZW4gcHJ1bmVcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIHBlcmYgb3B0aW1pc2F0aW9uLiBUaGlzIHR5cGUtdmlvbGF0aW5nIHZhbHVlIHdpbGwgbmV2ZXIgYmUgcmVhZC5cbiAgICAgICAgICAgICAgICAgICAgYmVzdFBhdGhbZGlhZ29uYWxQYXRoXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFNlbGVjdCB0aGUgZGlhZ29uYWwgdGhhdCB3ZSB3YW50IHRvIGJyYW5jaCBmcm9tLiBXZSBzZWxlY3QgdGhlIHByaW9yXG4gICAgICAgICAgICAgICAgLy8gcGF0aCB3aG9zZSBwb3NpdGlvbiBpbiB0aGUgb2xkIHN0cmluZyBpcyB0aGUgZmFydGhlc3QgZnJvbSB0aGUgb3JpZ2luXG4gICAgICAgICAgICAgICAgLy8gYW5kIGRvZXMgbm90IHBhc3MgdGhlIGJvdW5kcyBvZiB0aGUgZGlmZiBncmFwaFxuICAgICAgICAgICAgICAgIGlmICghY2FuUmVtb3ZlIHx8IChjYW5BZGQgJiYgcmVtb3ZlUGF0aC5vbGRQb3MgPCBhZGRQYXRoLm9sZFBvcykpIHtcbiAgICAgICAgICAgICAgICAgICAgYmFzZVBhdGggPSB0aGlzLmFkZFRvUGF0aChhZGRQYXRoLCB0cnVlLCBmYWxzZSwgMCwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBiYXNlUGF0aCA9IHRoaXMuYWRkVG9QYXRoKHJlbW92ZVBhdGgsIGZhbHNlLCB0cnVlLCAxLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbmV3UG9zID0gdGhpcy5leHRyYWN0Q29tbW9uKGJhc2VQYXRoLCBuZXdUb2tlbnMsIG9sZFRva2VucywgZGlhZ29uYWxQYXRoLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBpZiAoYmFzZVBhdGgub2xkUG9zICsgMSA+PSBvbGRMZW4gJiYgbmV3UG9zICsgMSA+PSBuZXdMZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBoaXQgdGhlIGVuZCBvZiBib3RoIHN0cmluZ3MsIHRoZW4gd2UgYXJlIGRvbmVcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvbmUodGhpcy5idWlsZFZhbHVlcyhiYXNlUGF0aC5sYXN0Q29tcG9uZW50LCBuZXdUb2tlbnMsIG9sZFRva2VucykpIHx8IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBiZXN0UGF0aFtkaWFnb25hbFBhdGhdID0gYmFzZVBhdGg7XG4gICAgICAgICAgICAgICAgICAgIGlmIChiYXNlUGF0aC5vbGRQb3MgKyAxID49IG9sZExlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF4RGlhZ29uYWxUb0NvbnNpZGVyID0gTWF0aC5taW4obWF4RGlhZ29uYWxUb0NvbnNpZGVyLCBkaWFnb25hbFBhdGggLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAobmV3UG9zICsgMSA+PSBuZXdMZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbkRpYWdvbmFsVG9Db25zaWRlciA9IE1hdGgubWF4KG1pbkRpYWdvbmFsVG9Db25zaWRlciwgZGlhZ29uYWxQYXRoICsgMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlZGl0TGVuZ3RoKys7XG4gICAgICAgIH07XG4gICAgICAgIC8vIFBlcmZvcm1zIHRoZSBsZW5ndGggb2YgZWRpdCBpdGVyYXRpb24uIElzIGEgYml0IGZ1Z2x5IGFzIHRoaXMgaGFzIHRvIHN1cHBvcnQgdGhlXG4gICAgICAgIC8vIHN5bmMgYW5kIGFzeW5jIG1vZGUgd2hpY2ggaXMgbmV2ZXIgZnVuLiBMb29wcyBvdmVyIGV4ZWNFZGl0TGVuZ3RoIHVudGlsIGEgdmFsdWVcbiAgICAgICAgLy8gaXMgcHJvZHVjZWQsIG9yIHVudGlsIHRoZSBlZGl0IGxlbmd0aCBleGNlZWRzIG9wdGlvbnMubWF4RWRpdExlbmd0aCAoaWYgZ2l2ZW4pLFxuICAgICAgICAvLyBpbiB3aGljaCBjYXNlIGl0IHdpbGwgcmV0dXJuIHVuZGVmaW5lZC5cbiAgICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAoZnVuY3Rpb24gZXhlYygpIHtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVkaXRMZW5ndGggPiBtYXhFZGl0TGVuZ3RoIHx8IERhdGUubm93KCkgPiBhYm9ydEFmdGVyVGltZXN0YW1wKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWV4ZWNFZGl0TGVuZ3RoKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWMoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgfSgpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHdoaWxlIChlZGl0TGVuZ3RoIDw9IG1heEVkaXRMZW5ndGggJiYgRGF0ZS5ub3coKSA8PSBhYm9ydEFmdGVyVGltZXN0YW1wKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmV0ID0gZXhlY0VkaXRMZW5ndGgoKTtcbiAgICAgICAgICAgICAgICBpZiAocmV0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGFkZFRvUGF0aChwYXRoLCBhZGRlZCwgcmVtb3ZlZCwgb2xkUG9zSW5jLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGxhc3QgPSBwYXRoLmxhc3RDb21wb25lbnQ7XG4gICAgICAgIGlmIChsYXN0ICYmICFvcHRpb25zLm9uZUNoYW5nZVBlclRva2VuICYmIGxhc3QuYWRkZWQgPT09IGFkZGVkICYmIGxhc3QucmVtb3ZlZCA9PT0gcmVtb3ZlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBvbGRQb3M6IHBhdGgub2xkUG9zICsgb2xkUG9zSW5jLFxuICAgICAgICAgICAgICAgIGxhc3RDb21wb25lbnQ6IHsgY291bnQ6IGxhc3QuY291bnQgKyAxLCBhZGRlZDogYWRkZWQsIHJlbW92ZWQ6IHJlbW92ZWQsIHByZXZpb3VzQ29tcG9uZW50OiBsYXN0LnByZXZpb3VzQ29tcG9uZW50IH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG9sZFBvczogcGF0aC5vbGRQb3MgKyBvbGRQb3NJbmMsXG4gICAgICAgICAgICAgICAgbGFzdENvbXBvbmVudDogeyBjb3VudDogMSwgYWRkZWQ6IGFkZGVkLCByZW1vdmVkOiByZW1vdmVkLCBwcmV2aW91c0NvbXBvbmVudDogbGFzdCB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIGV4dHJhY3RDb21tb24oYmFzZVBhdGgsIG5ld1Rva2Vucywgb2xkVG9rZW5zLCBkaWFnb25hbFBhdGgsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgbmV3TGVuID0gbmV3VG9rZW5zLmxlbmd0aCwgb2xkTGVuID0gb2xkVG9rZW5zLmxlbmd0aDtcbiAgICAgICAgbGV0IG9sZFBvcyA9IGJhc2VQYXRoLm9sZFBvcywgbmV3UG9zID0gb2xkUG9zIC0gZGlhZ29uYWxQYXRoLCBjb21tb25Db3VudCA9IDA7XG4gICAgICAgIHdoaWxlIChuZXdQb3MgKyAxIDwgbmV3TGVuICYmIG9sZFBvcyArIDEgPCBvbGRMZW4gJiYgdGhpcy5lcXVhbHMob2xkVG9rZW5zW29sZFBvcyArIDFdLCBuZXdUb2tlbnNbbmV3UG9zICsgMV0sIG9wdGlvbnMpKSB7XG4gICAgICAgICAgICBuZXdQb3MrKztcbiAgICAgICAgICAgIG9sZFBvcysrO1xuICAgICAgICAgICAgY29tbW9uQ291bnQrKztcbiAgICAgICAgICAgIGlmIChvcHRpb25zLm9uZUNoYW5nZVBlclRva2VuKSB7XG4gICAgICAgICAgICAgICAgYmFzZVBhdGgubGFzdENvbXBvbmVudCA9IHsgY291bnQ6IDEsIHByZXZpb3VzQ29tcG9uZW50OiBiYXNlUGF0aC5sYXN0Q29tcG9uZW50LCBhZGRlZDogZmFsc2UsIHJlbW92ZWQ6IGZhbHNlIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbW1vbkNvdW50ICYmICFvcHRpb25zLm9uZUNoYW5nZVBlclRva2VuKSB7XG4gICAgICAgICAgICBiYXNlUGF0aC5sYXN0Q29tcG9uZW50ID0geyBjb3VudDogY29tbW9uQ291bnQsIHByZXZpb3VzQ29tcG9uZW50OiBiYXNlUGF0aC5sYXN0Q29tcG9uZW50LCBhZGRlZDogZmFsc2UsIHJlbW92ZWQ6IGZhbHNlIH07XG4gICAgICAgIH1cbiAgICAgICAgYmFzZVBhdGgub2xkUG9zID0gb2xkUG9zO1xuICAgICAgICByZXR1cm4gbmV3UG9zO1xuICAgIH1cbiAgICBlcXVhbHMobGVmdCwgcmlnaHQsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuY29tcGFyYXRvcikge1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuY29tcGFyYXRvcihsZWZ0LCByaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbGVmdCA9PT0gcmlnaHRcbiAgICAgICAgICAgICAgICB8fCAoISFvcHRpb25zLmlnbm9yZUNhc2UgJiYgbGVmdC50b0xvd2VyQ2FzZSgpID09PSByaWdodC50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZW1vdmVFbXB0eShhcnJheSkge1xuICAgICAgICBjb25zdCByZXQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGFycmF5W2ldKSB7XG4gICAgICAgICAgICAgICAgcmV0LnB1c2goYXJyYXlbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBjYXN0SW5wdXQodmFsdWUsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgdG9rZW5pemUodmFsdWUsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odmFsdWUpO1xuICAgIH1cbiAgICBqb2luKGNoYXJzKSB7XG4gICAgICAgIC8vIEFzc3VtZXMgVmFsdWVUIGlzIHN0cmluZywgd2hpY2ggaXMgdGhlIGNhc2UgZm9yIG1vc3Qgc3ViY2xhc3Nlcy5cbiAgICAgICAgLy8gV2hlbiBpdCdzIGZhbHNlLCBlLmcuIGluIGRpZmZBcnJheXMsIHRoaXMgbWV0aG9kIG5lZWRzIHRvIGJlIG92ZXJyaWRkZW4gKGUuZy4gd2l0aCBhIG5vLW9wKVxuICAgICAgICAvLyBZZXMsIHRoZSBjYXN0cyBhcmUgdmVyYm9zZSBhbmQgdWdseSwgYmVjYXVzZSB0aGlzIHBhdHRlcm4gLSBvZiBoYXZpbmcgdGhlIGJhc2UgY2xhc3MgU09SVCBPRlxuICAgICAgICAvLyBhc3N1bWUgdG9rZW5zIGFuZCB2YWx1ZXMgYXJlIHN0cmluZ3MsIGJ1dCBub3QgY29tcGxldGVseSAtIGlzIHdlaXJkIGFuZCBqYW5reS5cbiAgICAgICAgcmV0dXJuIGNoYXJzLmpvaW4oJycpO1xuICAgIH1cbiAgICBwb3N0UHJvY2VzcyhjaGFuZ2VPYmplY3RzLCBcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gY2hhbmdlT2JqZWN0cztcbiAgICB9XG4gICAgZ2V0IHVzZUxvbmdlc3RUb2tlbigpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBidWlsZFZhbHVlcyhsYXN0Q29tcG9uZW50LCBuZXdUb2tlbnMsIG9sZFRva2Vucykge1xuICAgICAgICAvLyBGaXJzdCB3ZSBjb252ZXJ0IG91ciBsaW5rZWQgbGlzdCBvZiBjb21wb25lbnRzIGluIHJldmVyc2Ugb3JkZXIgdG8gYW5cbiAgICAgICAgLy8gYXJyYXkgaW4gdGhlIHJpZ2h0IG9yZGVyOlxuICAgICAgICBjb25zdCBjb21wb25lbnRzID0gW107XG4gICAgICAgIGxldCBuZXh0Q29tcG9uZW50O1xuICAgICAgICB3aGlsZSAobGFzdENvbXBvbmVudCkge1xuICAgICAgICAgICAgY29tcG9uZW50cy5wdXNoKGxhc3RDb21wb25lbnQpO1xuICAgICAgICAgICAgbmV4dENvbXBvbmVudCA9IGxhc3RDb21wb25lbnQucHJldmlvdXNDb21wb25lbnQ7XG4gICAgICAgICAgICBkZWxldGUgbGFzdENvbXBvbmVudC5wcmV2aW91c0NvbXBvbmVudDtcbiAgICAgICAgICAgIGxhc3RDb21wb25lbnQgPSBuZXh0Q29tcG9uZW50O1xuICAgICAgICB9XG4gICAgICAgIGNvbXBvbmVudHMucmV2ZXJzZSgpO1xuICAgICAgICBjb25zdCBjb21wb25lbnRMZW4gPSBjb21wb25lbnRzLmxlbmd0aDtcbiAgICAgICAgbGV0IGNvbXBvbmVudFBvcyA9IDAsIG5ld1BvcyA9IDAsIG9sZFBvcyA9IDA7XG4gICAgICAgIGZvciAoOyBjb21wb25lbnRQb3MgPCBjb21wb25lbnRMZW47IGNvbXBvbmVudFBvcysrKSB7XG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSBjb21wb25lbnRzW2NvbXBvbmVudFBvc107XG4gICAgICAgICAgICBpZiAoIWNvbXBvbmVudC5yZW1vdmVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjb21wb25lbnQuYWRkZWQgJiYgdGhpcy51c2VMb25nZXN0VG9rZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gbmV3VG9rZW5zLnNsaWNlKG5ld1BvcywgbmV3UG9zICsgY29tcG9uZW50LmNvdW50KTtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5tYXAoZnVuY3Rpb24gKHZhbHVlLCBpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvbGRWYWx1ZSA9IG9sZFRva2Vuc1tvbGRQb3MgKyBpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvbGRWYWx1ZS5sZW5ndGggPiB2YWx1ZS5sZW5ndGggPyBvbGRWYWx1ZSA6IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnZhbHVlID0gdGhpcy5qb2luKHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC52YWx1ZSA9IHRoaXMuam9pbihuZXdUb2tlbnMuc2xpY2UobmV3UG9zLCBuZXdQb3MgKyBjb21wb25lbnQuY291bnQpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbmV3UG9zICs9IGNvbXBvbmVudC5jb3VudDtcbiAgICAgICAgICAgICAgICAvLyBDb21tb24gY2FzZVxuICAgICAgICAgICAgICAgIGlmICghY29tcG9uZW50LmFkZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG9sZFBvcyArPSBjb21wb25lbnQuY291bnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LnZhbHVlID0gdGhpcy5qb2luKG9sZFRva2Vucy5zbGljZShvbGRQb3MsIG9sZFBvcyArIGNvbXBvbmVudC5jb3VudCkpO1xuICAgICAgICAgICAgICAgIG9sZFBvcyArPSBjb21wb25lbnQuY291bnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudHM7XG4gICAgfVxufVxuIiwgImltcG9ydCBEaWZmIGZyb20gJy4vYmFzZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZU9wdGlvbnMgfSBmcm9tICcuLi91dGlsL3BhcmFtcy5qcyc7XG5jbGFzcyBMaW5lRGlmZiBleHRlbmRzIERpZmYge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLnRva2VuaXplID0gdG9rZW5pemU7XG4gICAgfVxuICAgIGVxdWFscyhsZWZ0LCByaWdodCwgb3B0aW9ucykge1xuICAgICAgICAvLyBJZiB3ZSdyZSBpZ25vcmluZyB3aGl0ZXNwYWNlLCB3ZSBuZWVkIHRvIG5vcm1hbGlzZSBsaW5lcyBieSBzdHJpcHBpbmdcbiAgICAgICAgLy8gd2hpdGVzcGFjZSBiZWZvcmUgY2hlY2tpbmcgZXF1YWxpdHkuIChUaGlzIGhhcyBhbiBhbm5veWluZyBpbnRlcmFjdGlvblxuICAgICAgICAvLyB3aXRoIG5ld2xpbmVJc1Rva2VuIHRoYXQgcmVxdWlyZXMgc3BlY2lhbCBoYW5kbGluZzogaWYgbmV3bGluZXMgZ2V0IHRoZWlyXG4gICAgICAgIC8vIG93biB0b2tlbiwgdGhlbiB3ZSBET04nVCB3YW50IHRvIHRyaW0gdGhlICpuZXdsaW5lKiB0b2tlbnMgZG93biB0byBlbXB0eVxuICAgICAgICAvLyBzdHJpbmdzLCBzaW5jZSB0aGlzIHdvdWxkIGNhdXNlIHVzIHRvIHRyZWF0IHdoaXRlc3BhY2Utb25seSBsaW5lIGNvbnRlbnRcbiAgICAgICAgLy8gYXMgZXF1YWwgdG8gYSBzZXBhcmF0b3IgYmV0d2VlbiBsaW5lcywgd2hpY2ggd291bGQgYmUgd2VpcmQgYW5kXG4gICAgICAgIC8vIGluY29uc2lzdGVudCB3aXRoIHRoZSBkb2N1bWVudGVkIGJlaGF2aW9yIG9mIHRoZSBvcHRpb25zLilcbiAgICAgICAgaWYgKG9wdGlvbnMuaWdub3JlV2hpdGVzcGFjZSkge1xuICAgICAgICAgICAgaWYgKCFvcHRpb25zLm5ld2xpbmVJc1Rva2VuIHx8ICFsZWZ0LmluY2x1ZGVzKCdcXG4nKSkge1xuICAgICAgICAgICAgICAgIGxlZnQgPSBsZWZ0LnRyaW0oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5uZXdsaW5lSXNUb2tlbiB8fCAhcmlnaHQuaW5jbHVkZXMoJ1xcbicpKSB7XG4gICAgICAgICAgICAgICAgcmlnaHQgPSByaWdodC50cmltKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob3B0aW9ucy5pZ25vcmVOZXdsaW5lQXRFb2YgJiYgIW9wdGlvbnMubmV3bGluZUlzVG9rZW4pIHtcbiAgICAgICAgICAgIGlmIChsZWZ0LmVuZHNXaXRoKCdcXG4nKSkge1xuICAgICAgICAgICAgICAgIGxlZnQgPSBsZWZ0LnNsaWNlKDAsIC0xKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyaWdodC5lbmRzV2l0aCgnXFxuJykpIHtcbiAgICAgICAgICAgICAgICByaWdodCA9IHJpZ2h0LnNsaWNlKDAsIC0xKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VwZXIuZXF1YWxzKGxlZnQsIHJpZ2h0LCBvcHRpb25zKTtcbiAgICB9XG59XG5leHBvcnQgY29uc3QgbGluZURpZmYgPSBuZXcgTGluZURpZmYoKTtcbmV4cG9ydCBmdW5jdGlvbiBkaWZmTGluZXMob2xkU3RyLCBuZXdTdHIsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbGluZURpZmYuZGlmZihvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucyk7XG59XG5leHBvcnQgZnVuY3Rpb24gZGlmZlRyaW1tZWRMaW5lcyhvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBnZW5lcmF0ZU9wdGlvbnMob3B0aW9ucywgeyBpZ25vcmVXaGl0ZXNwYWNlOiB0cnVlIH0pO1xuICAgIHJldHVybiBsaW5lRGlmZi5kaWZmKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKTtcbn1cbi8vIEV4cG9ydGVkIHN0YW5kYWxvbmUgc28gaXQgY2FuIGJlIHVzZWQgZnJvbSBqc29uRGlmZiB0b28uXG5leHBvcnQgZnVuY3Rpb24gdG9rZW5pemUodmFsdWUsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5zdHJpcFRyYWlsaW5nQ3IpIHtcbiAgICAgICAgLy8gcmVtb3ZlIG9uZSBcXHIgYmVmb3JlIFxcbiB0byBtYXRjaCBHTlUgZGlmZidzIC0tc3RyaXAtdHJhaWxpbmctY3IgYmVoYXZpb3JcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9cXHJcXG4vZywgJ1xcbicpO1xuICAgIH1cbiAgICBjb25zdCByZXRMaW5lcyA9IFtdLCBsaW5lc0FuZE5ld2xpbmVzID0gdmFsdWUuc3BsaXQoLyhcXG58XFxyXFxuKS8pO1xuICAgIC8vIElnbm9yZSB0aGUgZmluYWwgZW1wdHkgdG9rZW4gdGhhdCBvY2N1cnMgaWYgdGhlIHN0cmluZyBlbmRzIHdpdGggYSBuZXcgbGluZVxuICAgIGlmICghbGluZXNBbmROZXdsaW5lc1tsaW5lc0FuZE5ld2xpbmVzLmxlbmd0aCAtIDFdKSB7XG4gICAgICAgIGxpbmVzQW5kTmV3bGluZXMucG9wKCk7XG4gICAgfVxuICAgIC8vIE1lcmdlIHRoZSBjb250ZW50IGFuZCBsaW5lIHNlcGFyYXRvcnMgaW50byBzaW5nbGUgdG9rZW5zXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lc0FuZE5ld2xpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc0FuZE5ld2xpbmVzW2ldO1xuICAgICAgICBpZiAoaSAlIDIgJiYgIW9wdGlvbnMubmV3bGluZUlzVG9rZW4pIHtcbiAgICAgICAgICAgIHJldExpbmVzW3JldExpbmVzLmxlbmd0aCAtIDFdICs9IGxpbmU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXRMaW5lcy5wdXNoKGxpbmUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXRMaW5lcztcbn1cbiIsICIvKipcbiAqIEdldHMgdGhlIG9yaWdpbmFsIG1hcmtlZCBkZWZhdWx0IG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfZ2V0RGVmYXVsdHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYXN5bmM6IGZhbHNlLFxuICAgICAgICBicmVha3M6IGZhbHNlLFxuICAgICAgICBleHRlbnNpb25zOiBudWxsLFxuICAgICAgICBnZm06IHRydWUsXG4gICAgICAgIGhvb2tzOiBudWxsLFxuICAgICAgICBwZWRhbnRpYzogZmFsc2UsXG4gICAgICAgIHJlbmRlcmVyOiBudWxsLFxuICAgICAgICBzaWxlbnQ6IGZhbHNlLFxuICAgICAgICB0b2tlbml6ZXI6IG51bGwsXG4gICAgICAgIHdhbGtUb2tlbnM6IG51bGxcbiAgICB9O1xufVxuZXhwb3J0IGxldCBfZGVmYXVsdHMgPSBfZ2V0RGVmYXVsdHMoKTtcbmV4cG9ydCBmdW5jdGlvbiBjaGFuZ2VEZWZhdWx0cyhuZXdEZWZhdWx0cykge1xuICAgIF9kZWZhdWx0cyA9IG5ld0RlZmF1bHRzO1xufVxuIiwgIi8qKlxuICogSGVscGVyc1xuICovXG5jb25zdCBlc2NhcGVUZXN0ID0gL1smPD5cIiddLztcbmNvbnN0IGVzY2FwZVJlcGxhY2UgPSBuZXcgUmVnRXhwKGVzY2FwZVRlc3Quc291cmNlLCAnZycpO1xuY29uc3QgZXNjYXBlVGVzdE5vRW5jb2RlID0gL1s8PlwiJ118Jig/ISgjXFxkezEsN318I1tYeF1bYS1mQS1GMC05XXsxLDZ9fFxcdyspOykvO1xuY29uc3QgZXNjYXBlUmVwbGFjZU5vRW5jb2RlID0gbmV3IFJlZ0V4cChlc2NhcGVUZXN0Tm9FbmNvZGUuc291cmNlLCAnZycpO1xuY29uc3QgZXNjYXBlUmVwbGFjZW1lbnRzID0ge1xuICAgICcmJzogJyZhbXA7JyxcbiAgICAnPCc6ICcmbHQ7JyxcbiAgICAnPic6ICcmZ3Q7JyxcbiAgICAnXCInOiAnJnF1b3Q7JyxcbiAgICBcIidcIjogJyYjMzk7J1xufTtcbmNvbnN0IGdldEVzY2FwZVJlcGxhY2VtZW50ID0gKGNoKSA9PiBlc2NhcGVSZXBsYWNlbWVudHNbY2hdO1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZShodG1sLCBlbmNvZGUpIHtcbiAgICBpZiAoZW5jb2RlKSB7XG4gICAgICAgIGlmIChlc2NhcGVUZXN0LnRlc3QoaHRtbCkpIHtcbiAgICAgICAgICAgIHJldHVybiBodG1sLnJlcGxhY2UoZXNjYXBlUmVwbGFjZSwgZ2V0RXNjYXBlUmVwbGFjZW1lbnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAoZXNjYXBlVGVzdE5vRW5jb2RlLnRlc3QoaHRtbCkpIHtcbiAgICAgICAgICAgIHJldHVybiBodG1sLnJlcGxhY2UoZXNjYXBlUmVwbGFjZU5vRW5jb2RlLCBnZXRFc2NhcGVSZXBsYWNlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGh0bWw7XG59XG5jb25zdCB1bmVzY2FwZVRlc3QgPSAvJigjKD86XFxkKyl8KD86I3hbMC05QS1GYS1mXSspfCg/OlxcdyspKTs/L2lnO1xuZXhwb3J0IGZ1bmN0aW9uIHVuZXNjYXBlKGh0bWwpIHtcbiAgICAvLyBleHBsaWNpdGx5IG1hdGNoIGRlY2ltYWwsIGhleCwgYW5kIG5hbWVkIEhUTUwgZW50aXRpZXNcbiAgICByZXR1cm4gaHRtbC5yZXBsYWNlKHVuZXNjYXBlVGVzdCwgKF8sIG4pID0+IHtcbiAgICAgICAgbiA9IG4udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKG4gPT09ICdjb2xvbicpXG4gICAgICAgICAgICByZXR1cm4gJzonO1xuICAgICAgICBpZiAobi5jaGFyQXQoMCkgPT09ICcjJykge1xuICAgICAgICAgICAgcmV0dXJuIG4uY2hhckF0KDEpID09PSAneCdcbiAgICAgICAgICAgICAgICA/IFN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQobi5zdWJzdHJpbmcoMiksIDE2KSlcbiAgICAgICAgICAgICAgICA6IFN0cmluZy5mcm9tQ2hhckNvZGUoK24uc3Vic3RyaW5nKDEpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfSk7XG59XG5jb25zdCBjYXJldCA9IC8oXnxbXlxcW10pXFxeL2c7XG5leHBvcnQgZnVuY3Rpb24gZWRpdChyZWdleCwgb3B0KSB7XG4gICAgbGV0IHNvdXJjZSA9IHR5cGVvZiByZWdleCA9PT0gJ3N0cmluZycgPyByZWdleCA6IHJlZ2V4LnNvdXJjZTtcbiAgICBvcHQgPSBvcHQgfHwgJyc7XG4gICAgY29uc3Qgb2JqID0ge1xuICAgICAgICByZXBsYWNlOiAobmFtZSwgdmFsKSA9PiB7XG4gICAgICAgICAgICBsZXQgdmFsU291cmNlID0gdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgPyB2YWwgOiB2YWwuc291cmNlO1xuICAgICAgICAgICAgdmFsU291cmNlID0gdmFsU291cmNlLnJlcGxhY2UoY2FyZXQsICckMScpO1xuICAgICAgICAgICAgc291cmNlID0gc291cmNlLnJlcGxhY2UobmFtZSwgdmFsU291cmNlKTtcbiAgICAgICAgICAgIHJldHVybiBvYmo7XG4gICAgICAgIH0sXG4gICAgICAgIGdldFJlZ2V4OiAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChzb3VyY2UsIG9wdCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBvYmo7XG59XG5leHBvcnQgZnVuY3Rpb24gY2xlYW5VcmwoaHJlZikge1xuICAgIHRyeSB7XG4gICAgICAgIGhyZWYgPSBlbmNvZGVVUkkoaHJlZikucmVwbGFjZSgvJTI1L2csICclJyk7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gaHJlZjtcbn1cbmV4cG9ydCBjb25zdCBub29wVGVzdCA9IHsgZXhlYzogKCkgPT4gbnVsbCB9O1xuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0Q2VsbHModGFibGVSb3csIGNvdW50KSB7XG4gICAgLy8gZW5zdXJlIHRoYXQgZXZlcnkgY2VsbC1kZWxpbWl0aW5nIHBpcGUgaGFzIGEgc3BhY2VcbiAgICAvLyBiZWZvcmUgaXQgdG8gZGlzdGluZ3Vpc2ggaXQgZnJvbSBhbiBlc2NhcGVkIHBpcGVcbiAgICBjb25zdCByb3cgPSB0YWJsZVJvdy5yZXBsYWNlKC9cXHwvZywgKG1hdGNoLCBvZmZzZXQsIHN0cikgPT4ge1xuICAgICAgICBsZXQgZXNjYXBlZCA9IGZhbHNlO1xuICAgICAgICBsZXQgY3VyciA9IG9mZnNldDtcbiAgICAgICAgd2hpbGUgKC0tY3VyciA+PSAwICYmIHN0cltjdXJyXSA9PT0gJ1xcXFwnKVxuICAgICAgICAgICAgZXNjYXBlZCA9ICFlc2NhcGVkO1xuICAgICAgICBpZiAoZXNjYXBlZCkge1xuICAgICAgICAgICAgLy8gb2RkIG51bWJlciBvZiBzbGFzaGVzIG1lYW5zIHwgaXMgZXNjYXBlZFxuICAgICAgICAgICAgLy8gc28gd2UgbGVhdmUgaXQgYWxvbmVcbiAgICAgICAgICAgIHJldHVybiAnfCc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBhZGQgc3BhY2UgYmVmb3JlIHVuZXNjYXBlZCB8XG4gICAgICAgICAgICByZXR1cm4gJyB8JztcbiAgICAgICAgfVxuICAgIH0pLCBjZWxscyA9IHJvdy5zcGxpdCgvIFxcfC8pO1xuICAgIGxldCBpID0gMDtcbiAgICAvLyBGaXJzdC9sYXN0IGNlbGwgaW4gYSByb3cgY2Fubm90IGJlIGVtcHR5IGlmIGl0IGhhcyBubyBsZWFkaW5nL3RyYWlsaW5nIHBpcGVcbiAgICBpZiAoIWNlbGxzWzBdLnRyaW0oKSkge1xuICAgICAgICBjZWxscy5zaGlmdCgpO1xuICAgIH1cbiAgICBpZiAoY2VsbHMubGVuZ3RoID4gMCAmJiAhY2VsbHNbY2VsbHMubGVuZ3RoIC0gMV0udHJpbSgpKSB7XG4gICAgICAgIGNlbGxzLnBvcCgpO1xuICAgIH1cbiAgICBpZiAoY291bnQpIHtcbiAgICAgICAgaWYgKGNlbGxzLmxlbmd0aCA+IGNvdW50KSB7XG4gICAgICAgICAgICBjZWxscy5zcGxpY2UoY291bnQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgd2hpbGUgKGNlbGxzLmxlbmd0aCA8IGNvdW50KVxuICAgICAgICAgICAgICAgIGNlbGxzLnB1c2goJycpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAoOyBpIDwgY2VsbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLy8gbGVhZGluZyBvciB0cmFpbGluZyB3aGl0ZXNwYWNlIGlzIGlnbm9yZWQgcGVyIHRoZSBnZm0gc3BlY1xuICAgICAgICBjZWxsc1tpXSA9IGNlbGxzW2ldLnRyaW0oKS5yZXBsYWNlKC9cXFxcXFx8L2csICd8Jyk7XG4gICAgfVxuICAgIHJldHVybiBjZWxscztcbn1cbi8qKlxuICogUmVtb3ZlIHRyYWlsaW5nICdjJ3MuIEVxdWl2YWxlbnQgdG8gc3RyLnJlcGxhY2UoL2MqJC8sICcnKS5cbiAqIC9jKiQvIGlzIHZ1bG5lcmFibGUgdG8gUkVET1MuXG4gKlxuICogQHBhcmFtIHN0clxuICogQHBhcmFtIGNcbiAqIEBwYXJhbSBpbnZlcnQgUmVtb3ZlIHN1ZmZpeCBvZiBub24tYyBjaGFycyBpbnN0ZWFkLiBEZWZhdWx0IGZhbHNleS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ0cmltKHN0ciwgYywgaW52ZXJ0KSB7XG4gICAgY29uc3QgbCA9IHN0ci5sZW5ndGg7XG4gICAgaWYgKGwgPT09IDApIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICAvLyBMZW5ndGggb2Ygc3VmZml4IG1hdGNoaW5nIHRoZSBpbnZlcnQgY29uZGl0aW9uLlxuICAgIGxldCBzdWZmTGVuID0gMDtcbiAgICAvLyBTdGVwIGxlZnQgdW50aWwgd2UgZmFpbCB0byBtYXRjaCB0aGUgaW52ZXJ0IGNvbmRpdGlvbi5cbiAgICB3aGlsZSAoc3VmZkxlbiA8IGwpIHtcbiAgICAgICAgY29uc3QgY3VyckNoYXIgPSBzdHIuY2hhckF0KGwgLSBzdWZmTGVuIC0gMSk7XG4gICAgICAgIGlmIChjdXJyQ2hhciA9PT0gYyAmJiAhaW52ZXJ0KSB7XG4gICAgICAgICAgICBzdWZmTGVuKys7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY3VyckNoYXIgIT09IGMgJiYgaW52ZXJ0KSB7XG4gICAgICAgICAgICBzdWZmTGVuKys7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3RyLnNsaWNlKDAsIGwgLSBzdWZmTGVuKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBmaW5kQ2xvc2luZ0JyYWNrZXQoc3RyLCBiKSB7XG4gICAgaWYgKHN0ci5pbmRleE9mKGJbMV0pID09PSAtMSkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxuICAgIGxldCBsZXZlbCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHN0cltpXSA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc3RyW2ldID09PSBiWzBdKSB7XG4gICAgICAgICAgICBsZXZlbCsrO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHN0cltpXSA9PT0gYlsxXSkge1xuICAgICAgICAgICAgbGV2ZWwtLTtcbiAgICAgICAgICAgIGlmIChsZXZlbCA8IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gLTE7XG59XG4iLCAiaW1wb3J0IHsgX2RlZmF1bHRzIH0gZnJvbSAnLi9kZWZhdWx0cy50cyc7XG5pbXBvcnQgeyBydHJpbSwgc3BsaXRDZWxscywgZXNjYXBlLCBmaW5kQ2xvc2luZ0JyYWNrZXQgfSBmcm9tICcuL2hlbHBlcnMudHMnO1xuZnVuY3Rpb24gb3V0cHV0TGluayhjYXAsIGxpbmssIHJhdywgbGV4ZXIpIHtcbiAgICBjb25zdCBocmVmID0gbGluay5ocmVmO1xuICAgIGNvbnN0IHRpdGxlID0gbGluay50aXRsZSA/IGVzY2FwZShsaW5rLnRpdGxlKSA6IG51bGw7XG4gICAgY29uc3QgdGV4dCA9IGNhcFsxXS5yZXBsYWNlKC9cXFxcKFtcXFtcXF1dKS9nLCAnJDEnKTtcbiAgICBpZiAoY2FwWzBdLmNoYXJBdCgwKSAhPT0gJyEnKSB7XG4gICAgICAgIGxleGVyLnN0YXRlLmluTGluayA9IHRydWU7XG4gICAgICAgIGNvbnN0IHRva2VuID0ge1xuICAgICAgICAgICAgdHlwZTogJ2xpbmsnLFxuICAgICAgICAgICAgcmF3LFxuICAgICAgICAgICAgaHJlZixcbiAgICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgIHRva2VuczogbGV4ZXIuaW5saW5lVG9rZW5zKHRleHQpXG4gICAgICAgIH07XG4gICAgICAgIGxleGVyLnN0YXRlLmluTGluayA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gdG9rZW47XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdpbWFnZScsXG4gICAgICAgIHJhdyxcbiAgICAgICAgaHJlZixcbiAgICAgICAgdGl0bGUsXG4gICAgICAgIHRleHQ6IGVzY2FwZSh0ZXh0KVxuICAgIH07XG59XG5mdW5jdGlvbiBpbmRlbnRDb2RlQ29tcGVuc2F0aW9uKHJhdywgdGV4dCkge1xuICAgIGNvbnN0IG1hdGNoSW5kZW50VG9Db2RlID0gcmF3Lm1hdGNoKC9eKFxccyspKD86YGBgKS8pO1xuICAgIGlmIChtYXRjaEluZGVudFRvQ29kZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG4gICAgY29uc3QgaW5kZW50VG9Db2RlID0gbWF0Y2hJbmRlbnRUb0NvZGVbMV07XG4gICAgcmV0dXJuIHRleHRcbiAgICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgICAubWFwKG5vZGUgPT4ge1xuICAgICAgICBjb25zdCBtYXRjaEluZGVudEluTm9kZSA9IG5vZGUubWF0Y2goL15cXHMrLyk7XG4gICAgICAgIGlmIChtYXRjaEluZGVudEluTm9kZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgW2luZGVudEluTm9kZV0gPSBtYXRjaEluZGVudEluTm9kZTtcbiAgICAgICAgaWYgKGluZGVudEluTm9kZS5sZW5ndGggPj0gaW5kZW50VG9Db2RlLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIG5vZGUuc2xpY2UoaW5kZW50VG9Db2RlLmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfSlcbiAgICAgICAgLmpvaW4oJ1xcbicpO1xufVxuLyoqXG4gKiBUb2tlbml6ZXJcbiAqL1xuZXhwb3J0IGNsYXNzIF9Ub2tlbml6ZXIge1xuICAgIG9wdGlvbnM7XG4gICAgcnVsZXM7IC8vIHNldCBieSB0aGUgbGV4ZXJcbiAgICBsZXhlcjsgLy8gc2V0IGJ5IHRoZSBsZXhlclxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCBfZGVmYXVsdHM7XG4gICAgfVxuICAgIHNwYWNlKHNyYykge1xuICAgICAgICBjb25zdCBjYXAgPSB0aGlzLnJ1bGVzLmJsb2NrLm5ld2xpbmUuZXhlYyhzcmMpO1xuICAgICAgICBpZiAoY2FwICYmIGNhcFswXS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdzcGFjZScsXG4gICAgICAgICAgICAgICAgcmF3OiBjYXBbMF1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29kZShzcmMpIHtcbiAgICAgICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5ibG9jay5jb2RlLmV4ZWMoc3JjKTtcbiAgICAgICAgaWYgKGNhcCkge1xuICAgICAgICAgICAgY29uc3QgdGV4dCA9IGNhcFswXS5yZXBsYWNlKC9eIHsxLDR9L2dtLCAnJyk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdjb2RlJyxcbiAgICAgICAgICAgICAgICByYXc6IGNhcFswXSxcbiAgICAgICAgICAgICAgICBjb2RlQmxvY2tTdHlsZTogJ2luZGVudGVkJyxcbiAgICAgICAgICAgICAgICB0ZXh0OiAhdGhpcy5vcHRpb25zLnBlZGFudGljXG4gICAgICAgICAgICAgICAgICAgID8gcnRyaW0odGV4dCwgJ1xcbicpXG4gICAgICAgICAgICAgICAgICAgIDogdGV4dFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmZW5jZXMoc3JjKSB7XG4gICAgICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuYmxvY2suZmVuY2VzLmV4ZWMoc3JjKTtcbiAgICAgICAgaWYgKGNhcCkge1xuICAgICAgICAgICAgY29uc3QgcmF3ID0gY2FwWzBdO1xuICAgICAgICAgICAgY29uc3QgdGV4dCA9IGluZGVudENvZGVDb21wZW5zYXRpb24ocmF3LCBjYXBbM10gfHwgJycpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnY29kZScsXG4gICAgICAgICAgICAgICAgcmF3LFxuICAgICAgICAgICAgICAgIGxhbmc6IGNhcFsyXSA/IGNhcFsyXS50cmltKCkucmVwbGFjZSh0aGlzLnJ1bGVzLmlubGluZS5hbnlQdW5jdHVhdGlvbiwgJyQxJykgOiBjYXBbMl0sXG4gICAgICAgICAgICAgICAgdGV4dFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBoZWFkaW5nKHNyYykge1xuICAgICAgICBjb25zdCBjYXAgPSB0aGlzLnJ1bGVzLmJsb2NrLmhlYWRpbmcuZXhlYyhzcmMpO1xuICAgICAgICBpZiAoY2FwKSB7XG4gICAgICAgICAgICBsZXQgdGV4dCA9IGNhcFsyXS50cmltKCk7XG4gICAgICAgICAgICAvLyByZW1vdmUgdHJhaWxpbmcgI3NcbiAgICAgICAgICAgIGlmICgvIyQvLnRlc3QodGV4dCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0cmltbWVkID0gcnRyaW0odGV4dCwgJyMnKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnBlZGFudGljKSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHQgPSB0cmltbWVkLnRyaW0oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoIXRyaW1tZWQgfHwgLyAkLy50ZXN0KHRyaW1tZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENvbW1vbk1hcmsgcmVxdWlyZXMgc3BhY2UgYmVmb3JlIHRyYWlsaW5nICNzXG4gICAgICAgICAgICAgICAgICAgIHRleHQgPSB0cmltbWVkLnRyaW0oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdoZWFkaW5nJyxcbiAgICAgICAgICAgICAgICByYXc6IGNhcFswXSxcbiAgICAgICAgICAgICAgICBkZXB0aDogY2FwWzFdLmxlbmd0aCxcbiAgICAgICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgICAgICAgIHRva2VuczogdGhpcy5sZXhlci5pbmxpbmUodGV4dClcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgaHIoc3JjKSB7XG4gICAgICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuYmxvY2suaHIuZXhlYyhzcmMpO1xuICAgICAgICBpZiAoY2FwKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdocicsXG4gICAgICAgICAgICAgICAgcmF3OiBjYXBbMF1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgYmxvY2txdW90ZShzcmMpIHtcbiAgICAgICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5ibG9jay5ibG9ja3F1b3RlLmV4ZWMoc3JjKTtcbiAgICAgICAgaWYgKGNhcCkge1xuICAgICAgICAgICAgLy8gcHJlY2VkZSBzZXRleHQgY29udGludWF0aW9uIHdpdGggNCBzcGFjZXMgc28gaXQgaXNuJ3QgYSBzZXRleHRcbiAgICAgICAgICAgIGxldCB0ZXh0ID0gY2FwWzBdLnJlcGxhY2UoL1xcbiB7MCwzfSgoPzo9K3wtKykgKikoPz1cXG58JCkvZywgJ1xcbiAgICAkMScpO1xuICAgICAgICAgICAgdGV4dCA9IHJ0cmltKHRleHQucmVwbGFjZSgvXiAqPlsgXFx0XT8vZ20sICcnKSwgJ1xcbicpO1xuICAgICAgICAgICAgY29uc3QgdG9wID0gdGhpcy5sZXhlci5zdGF0ZS50b3A7XG4gICAgICAgICAgICB0aGlzLmxleGVyLnN0YXRlLnRvcCA9IHRydWU7XG4gICAgICAgICAgICBjb25zdCB0b2tlbnMgPSB0aGlzLmxleGVyLmJsb2NrVG9rZW5zKHRleHQpO1xuICAgICAgICAgICAgdGhpcy5sZXhlci5zdGF0ZS50b3AgPSB0b3A7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdibG9ja3F1b3RlJyxcbiAgICAgICAgICAgICAgICByYXc6IGNhcFswXSxcbiAgICAgICAgICAgICAgICB0b2tlbnMsXG4gICAgICAgICAgICAgICAgdGV4dFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsaXN0KHNyYykge1xuICAgICAgICBsZXQgY2FwID0gdGhpcy5ydWxlcy5ibG9jay5saXN0LmV4ZWMoc3JjKTtcbiAgICAgICAgaWYgKGNhcCkge1xuICAgICAgICAgICAgbGV0IGJ1bGwgPSBjYXBbMV0udHJpbSgpO1xuICAgICAgICAgICAgY29uc3QgaXNvcmRlcmVkID0gYnVsbC5sZW5ndGggPiAxO1xuICAgICAgICAgICAgY29uc3QgbGlzdCA9IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnbGlzdCcsXG4gICAgICAgICAgICAgICAgcmF3OiAnJyxcbiAgICAgICAgICAgICAgICBvcmRlcmVkOiBpc29yZGVyZWQsXG4gICAgICAgICAgICAgICAgc3RhcnQ6IGlzb3JkZXJlZCA/ICtidWxsLnNsaWNlKDAsIC0xKSA6ICcnLFxuICAgICAgICAgICAgICAgIGxvb3NlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpdGVtczogW11cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBidWxsID0gaXNvcmRlcmVkID8gYFxcXFxkezEsOX1cXFxcJHtidWxsLnNsaWNlKC0xKX1gIDogYFxcXFwke2J1bGx9YDtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucGVkYW50aWMpIHtcbiAgICAgICAgICAgICAgICBidWxsID0gaXNvcmRlcmVkID8gYnVsbCA6ICdbKistXSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBHZXQgbmV4dCBsaXN0IGl0ZW1cbiAgICAgICAgICAgIGNvbnN0IGl0ZW1SZWdleCA9IG5ldyBSZWdFeHAoYF4oIHswLDN9JHtidWxsfSkoKD86W1xcdCBdW15cXFxcbl0qKT8oPzpcXFxcbnwkKSlgKTtcbiAgICAgICAgICAgIGxldCByYXcgPSAnJztcbiAgICAgICAgICAgIGxldCBpdGVtQ29udGVudHMgPSAnJztcbiAgICAgICAgICAgIGxldCBlbmRzV2l0aEJsYW5rTGluZSA9IGZhbHNlO1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgY3VycmVudCBidWxsZXQgcG9pbnQgY2FuIHN0YXJ0IGEgbmV3IExpc3QgSXRlbVxuICAgICAgICAgICAgd2hpbGUgKHNyYykge1xuICAgICAgICAgICAgICAgIGxldCBlbmRFYXJseSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmICghKGNhcCA9IGl0ZW1SZWdleC5leGVjKHNyYykpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5ydWxlcy5ibG9jay5oci50ZXN0KHNyYykpIHsgLy8gRW5kIGxpc3QgaWYgYnVsbGV0IHdhcyBhY3R1YWxseSBIUiAocG9zc2libHkgbW92ZSBpbnRvIGl0ZW1SZWdleD8pXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByYXcgPSBjYXBbMF07XG4gICAgICAgICAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyhyYXcubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBsZXQgbGluZSA9IGNhcFsyXS5zcGxpdCgnXFxuJywgMSlbMF0ucmVwbGFjZSgvXlxcdCsvLCAodCkgPT4gJyAnLnJlcGVhdCgzICogdC5sZW5ndGgpKTtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dExpbmUgPSBzcmMuc3BsaXQoJ1xcbicsIDEpWzBdO1xuICAgICAgICAgICAgICAgIGxldCBpbmRlbnQgPSAwO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucGVkYW50aWMpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5kZW50ID0gMjtcbiAgICAgICAgICAgICAgICAgICAgaXRlbUNvbnRlbnRzID0gbGluZS50cmltU3RhcnQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGluZGVudCA9IGNhcFsyXS5zZWFyY2goL1teIF0vKTsgLy8gRmluZCBmaXJzdCBub24tc3BhY2UgY2hhclxuICAgICAgICAgICAgICAgICAgICBpbmRlbnQgPSBpbmRlbnQgPiA0ID8gMSA6IGluZGVudDsgLy8gVHJlYXQgaW5kZW50ZWQgY29kZSBibG9ja3MgKD4gNCBzcGFjZXMpIGFzIGhhdmluZyBvbmx5IDEgaW5kZW50XG4gICAgICAgICAgICAgICAgICAgIGl0ZW1Db250ZW50cyA9IGxpbmUuc2xpY2UoaW5kZW50KTtcbiAgICAgICAgICAgICAgICAgICAgaW5kZW50ICs9IGNhcFsxXS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBibGFua0xpbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAoIWxpbmUgJiYgL14gKiQvLnRlc3QobmV4dExpbmUpKSB7IC8vIEl0ZW1zIGJlZ2luIHdpdGggYXQgbW9zdCBvbmUgYmxhbmsgbGluZVxuICAgICAgICAgICAgICAgICAgICByYXcgKz0gbmV4dExpbmUgKyAnXFxuJztcbiAgICAgICAgICAgICAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyhuZXh0TGluZS5sZW5ndGggKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgZW5kRWFybHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWVuZEVhcmx5KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRCdWxsZXRSZWdleCA9IG5ldyBSZWdFeHAoYF4gezAsJHtNYXRoLm1pbigzLCBpbmRlbnQgLSAxKX19KD86WyorLV18XFxcXGR7MSw5fVsuKV0pKCg/OlsgXFx0XVteXFxcXG5dKik/KD86XFxcXG58JCkpYCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhyUmVnZXggPSBuZXcgUmVnRXhwKGBeIHswLCR7TWF0aC5taW4oMywgaW5kZW50IC0gMSl9fSgoPzotICopezMsfXwoPzpfICopezMsfXwoPzpcXFxcKiAqKXszLH0pKD86XFxcXG4rfCQpYCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZlbmNlc0JlZ2luUmVnZXggPSBuZXcgUmVnRXhwKGBeIHswLCR7TWF0aC5taW4oMywgaW5kZW50IC0gMSl9fSg/OlxcYFxcYFxcYHx+fn4pYCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRpbmdCZWdpblJlZ2V4ID0gbmV3IFJlZ0V4cChgXiB7MCwke01hdGgubWluKDMsIGluZGVudCAtIDEpfX0jYCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGZvbGxvd2luZyBsaW5lcyBzaG91bGQgYmUgaW5jbHVkZWQgaW4gTGlzdCBJdGVtXG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChzcmMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhd0xpbmUgPSBzcmMuc3BsaXQoJ1xcbicsIDEpWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dExpbmUgPSByYXdMaW5lO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmUtYWxpZ24gdG8gZm9sbG93IGNvbW1vbm1hcmsgbmVzdGluZyBydWxlc1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5wZWRhbnRpYykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRMaW5lID0gbmV4dExpbmUucmVwbGFjZSgvXiB7MSw0fSg/PSggezR9KSpbXiBdKS9nLCAnICAnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVuZCBsaXN0IGl0ZW0gaWYgZm91bmQgY29kZSBmZW5jZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmZW5jZXNCZWdpblJlZ2V4LnRlc3QobmV4dExpbmUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBFbmQgbGlzdCBpdGVtIGlmIGZvdW5kIHN0YXJ0IG9mIG5ldyBoZWFkaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGVhZGluZ0JlZ2luUmVnZXgudGVzdChuZXh0TGluZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVuZCBsaXN0IGl0ZW0gaWYgZm91bmQgc3RhcnQgb2YgbmV3IGJ1bGxldFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRCdWxsZXRSZWdleC50ZXN0KG5leHRMaW5lKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSG9yaXpvbnRhbCBydWxlIGZvdW5kXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaHJSZWdleC50ZXN0KHNyYykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0TGluZS5zZWFyY2goL1teIF0vKSA+PSBpbmRlbnQgfHwgIW5leHRMaW5lLnRyaW0oKSkgeyAvLyBEZWRlbnQgaWYgcG9zc2libGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtQ29udGVudHMgKz0gJ1xcbicgKyBuZXh0TGluZS5zbGljZShpbmRlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90IGVub3VnaCBpbmRlbnRhdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChibGFua0xpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhcmFncmFwaCBjb250aW51YXRpb24gdW5sZXNzIGxhc3QgbGluZSB3YXMgYSBkaWZmZXJlbnQgYmxvY2sgbGV2ZWwgZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lLnNlYXJjaCgvW14gXS8pID49IDQpIHsgLy8gaW5kZW50ZWQgY29kZSBibG9ja1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZlbmNlc0JlZ2luUmVnZXgudGVzdChsaW5lKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhlYWRpbmdCZWdpblJlZ2V4LnRlc3QobGluZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoclJlZ2V4LnRlc3QobGluZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1Db250ZW50cyArPSAnXFxuJyArIG5leHRMaW5lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFibGFua0xpbmUgJiYgIW5leHRMaW5lLnRyaW0oKSkgeyAvLyBDaGVjayBpZiBjdXJyZW50IGxpbmUgaXMgYmxhbmtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGFua0xpbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmF3ICs9IHJhd0xpbmUgKyAnXFxuJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcocmF3TGluZS5sZW5ndGggKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBuZXh0TGluZS5zbGljZShpbmRlbnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghbGlzdC5sb29zZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcHJldmlvdXMgaXRlbSBlbmRlZCB3aXRoIGEgYmxhbmsgbGluZSwgdGhlIGxpc3QgaXMgbG9vc2VcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVuZHNXaXRoQmxhbmtMaW5lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsaXN0Lmxvb3NlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgvXFxuICpcXG4gKiQvLnRlc3QocmF3KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW5kc1dpdGhCbGFua0xpbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBpc3Rhc2sgPSBudWxsO1xuICAgICAgICAgICAgICAgIGxldCBpc2NoZWNrZWQ7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIHRhc2sgbGlzdCBpdGVtc1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZ2ZtKSB7XG4gICAgICAgICAgICAgICAgICAgIGlzdGFzayA9IC9eXFxbWyB4WF1cXF0gLy5leGVjKGl0ZW1Db250ZW50cyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc3Rhc2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzY2hlY2tlZCA9IGlzdGFza1swXSAhPT0gJ1sgXSAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUNvbnRlbnRzID0gaXRlbUNvbnRlbnRzLnJlcGxhY2UoL15cXFtbIHhYXVxcXSArLywgJycpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxpc3QuaXRlbXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdsaXN0X2l0ZW0nLFxuICAgICAgICAgICAgICAgICAgICByYXcsXG4gICAgICAgICAgICAgICAgICAgIHRhc2s6ICEhaXN0YXNrLFxuICAgICAgICAgICAgICAgICAgICBjaGVja2VkOiBpc2NoZWNrZWQsXG4gICAgICAgICAgICAgICAgICAgIGxvb3NlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogaXRlbUNvbnRlbnRzLFxuICAgICAgICAgICAgICAgICAgICB0b2tlbnM6IFtdXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgbGlzdC5yYXcgKz0gcmF3O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRG8gbm90IGNvbnN1bWUgbmV3bGluZXMgYXQgZW5kIG9mIGZpbmFsIGl0ZW0uIEFsdGVybmF0aXZlbHksIG1ha2UgaXRlbVJlZ2V4ICpzdGFydCogd2l0aCBhbnkgbmV3bGluZXMgdG8gc2ltcGxpZnkvc3BlZWQgdXAgZW5kc1dpdGhCbGFua0xpbmUgbG9naWNcbiAgICAgICAgICAgIGxpc3QuaXRlbXNbbGlzdC5pdGVtcy5sZW5ndGggLSAxXS5yYXcgPSByYXcudHJpbUVuZCgpO1xuICAgICAgICAgICAgKGxpc3QuaXRlbXNbbGlzdC5pdGVtcy5sZW5ndGggLSAxXSkudGV4dCA9IGl0ZW1Db250ZW50cy50cmltRW5kKCk7XG4gICAgICAgICAgICBsaXN0LnJhdyA9IGxpc3QucmF3LnRyaW1FbmQoKTtcbiAgICAgICAgICAgIC8vIEl0ZW0gY2hpbGQgdG9rZW5zIGhhbmRsZWQgaGVyZSBhdCBlbmQgYmVjYXVzZSB3ZSBuZWVkZWQgdG8gaGF2ZSB0aGUgZmluYWwgaXRlbSB0byB0cmltIGl0IGZpcnN0XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3QuaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxleGVyLnN0YXRlLnRvcCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGxpc3QuaXRlbXNbaV0udG9rZW5zID0gdGhpcy5sZXhlci5ibG9ja1Rva2VucyhsaXN0Lml0ZW1zW2ldLnRleHQsIFtdKTtcbiAgICAgICAgICAgICAgICBpZiAoIWxpc3QubG9vc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgbGlzdCBzaG91bGQgYmUgbG9vc2VcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3BhY2VycyA9IGxpc3QuaXRlbXNbaV0udG9rZW5zLmZpbHRlcih0ID0+IHQudHlwZSA9PT0gJ3NwYWNlJyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhc011bHRpcGxlTGluZUJyZWFrcyA9IHNwYWNlcnMubGVuZ3RoID4gMCAmJiBzcGFjZXJzLnNvbWUodCA9PiAvXFxuLipcXG4vLnRlc3QodC5yYXcpKTtcbiAgICAgICAgICAgICAgICAgICAgbGlzdC5sb29zZSA9IGhhc011bHRpcGxlTGluZUJyZWFrcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBTZXQgYWxsIGl0ZW1zIHRvIGxvb3NlIGlmIGxpc3QgaXMgbG9vc2VcbiAgICAgICAgICAgIGlmIChsaXN0Lmxvb3NlKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lml0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3QuaXRlbXNbaV0ubG9vc2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBsaXN0O1xuICAgICAgICB9XG4gICAgfVxuICAgIGh0bWwoc3JjKSB7XG4gICAgICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuYmxvY2suaHRtbC5leGVjKHNyYyk7XG4gICAgICAgIGlmIChjYXApIHtcbiAgICAgICAgICAgIGNvbnN0IHRva2VuID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdodG1sJyxcbiAgICAgICAgICAgICAgICBibG9jazogdHJ1ZSxcbiAgICAgICAgICAgICAgICByYXc6IGNhcFswXSxcbiAgICAgICAgICAgICAgICBwcmU6IGNhcFsxXSA9PT0gJ3ByZScgfHwgY2FwWzFdID09PSAnc2NyaXB0JyB8fCBjYXBbMV0gPT09ICdzdHlsZScsXG4gICAgICAgICAgICAgICAgdGV4dDogY2FwWzBdXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIHRva2VuO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRlZihzcmMpIHtcbiAgICAgICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5ibG9jay5kZWYuZXhlYyhzcmMpO1xuICAgICAgICBpZiAoY2FwKSB7XG4gICAgICAgICAgICBjb25zdCB0YWcgPSBjYXBbMV0udG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXHMrL2csICcgJyk7XG4gICAgICAgICAgICBjb25zdCBocmVmID0gY2FwWzJdID8gY2FwWzJdLnJlcGxhY2UoL148KC4qKT4kLywgJyQxJykucmVwbGFjZSh0aGlzLnJ1bGVzLmlubGluZS5hbnlQdW5jdHVhdGlvbiwgJyQxJykgOiAnJztcbiAgICAgICAgICAgIGNvbnN0IHRpdGxlID0gY2FwWzNdID8gY2FwWzNdLnN1YnN0cmluZygxLCBjYXBbM10ubGVuZ3RoIC0gMSkucmVwbGFjZSh0aGlzLnJ1bGVzLmlubGluZS5hbnlQdW5jdHVhdGlvbiwgJyQxJykgOiBjYXBbM107XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdkZWYnLFxuICAgICAgICAgICAgICAgIHRhZyxcbiAgICAgICAgICAgICAgICByYXc6IGNhcFswXSxcbiAgICAgICAgICAgICAgICBocmVmLFxuICAgICAgICAgICAgICAgIHRpdGxlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIHRhYmxlKHNyYykge1xuICAgICAgICBjb25zdCBjYXAgPSB0aGlzLnJ1bGVzLmJsb2NrLnRhYmxlLmV4ZWMoc3JjKTtcbiAgICAgICAgaWYgKCFjYXApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIS9bOnxdLy50ZXN0KGNhcFsyXSkpIHtcbiAgICAgICAgICAgIC8vIGRlbGltaXRlciByb3cgbXVzdCBoYXZlIGEgcGlwZSAofCkgb3IgY29sb24gKDopIG90aGVyd2lzZSBpdCBpcyBhIHNldGV4dCBoZWFkaW5nXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHNwbGl0Q2VsbHMoY2FwWzFdKTtcbiAgICAgICAgY29uc3QgYWxpZ25zID0gY2FwWzJdLnJlcGxhY2UoL15cXHx8XFx8ICokL2csICcnKS5zcGxpdCgnfCcpO1xuICAgICAgICBjb25zdCByb3dzID0gY2FwWzNdICYmIGNhcFszXS50cmltKCkgPyBjYXBbM10ucmVwbGFjZSgvXFxuWyBcXHRdKiQvLCAnJykuc3BsaXQoJ1xcbicpIDogW107XG4gICAgICAgIGNvbnN0IGl0ZW0gPSB7XG4gICAgICAgICAgICB0eXBlOiAndGFibGUnLFxuICAgICAgICAgICAgcmF3OiBjYXBbMF0sXG4gICAgICAgICAgICBoZWFkZXI6IFtdLFxuICAgICAgICAgICAgYWxpZ246IFtdLFxuICAgICAgICAgICAgcm93czogW11cbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGhlYWRlcnMubGVuZ3RoICE9PSBhbGlnbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyBoZWFkZXIgYW5kIGFsaWduIGNvbHVtbnMgbXVzdCBiZSBlcXVhbCwgcm93cyBjYW4gYmUgZGlmZmVyZW50LlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgYWxpZ24gb2YgYWxpZ25zKSB7XG4gICAgICAgICAgICBpZiAoL14gKi0rOiAqJC8udGVzdChhbGlnbikpIHtcbiAgICAgICAgICAgICAgICBpdGVtLmFsaWduLnB1c2goJ3JpZ2h0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICgvXiAqOi0rOiAqJC8udGVzdChhbGlnbikpIHtcbiAgICAgICAgICAgICAgICBpdGVtLmFsaWduLnB1c2goJ2NlbnRlcicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoL14gKjotKyAqJC8udGVzdChhbGlnbikpIHtcbiAgICAgICAgICAgICAgICBpdGVtLmFsaWduLnB1c2goJ2xlZnQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGl0ZW0uYWxpZ24ucHVzaChudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGhlYWRlciBvZiBoZWFkZXJzKSB7XG4gICAgICAgICAgICBpdGVtLmhlYWRlci5wdXNoKHtcbiAgICAgICAgICAgICAgICB0ZXh0OiBoZWFkZXIsXG4gICAgICAgICAgICAgICAgdG9rZW5zOiB0aGlzLmxleGVyLmlubGluZShoZWFkZXIpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICAgICAgICBpdGVtLnJvd3MucHVzaChzcGxpdENlbGxzKHJvdywgaXRlbS5oZWFkZXIubGVuZ3RoKS5tYXAoY2VsbCA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogY2VsbCxcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5zOiB0aGlzLmxleGVyLmlubGluZShjZWxsKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgfVxuICAgIGxoZWFkaW5nKHNyYykge1xuICAgICAgICBjb25zdCBjYXAgPSB0aGlzLnJ1bGVzLmJsb2NrLmxoZWFkaW5nLmV4ZWMoc3JjKTtcbiAgICAgICAgaWYgKGNhcCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnaGVhZGluZycsXG4gICAgICAgICAgICAgICAgcmF3OiBjYXBbMF0sXG4gICAgICAgICAgICAgICAgZGVwdGg6IGNhcFsyXS5jaGFyQXQoMCkgPT09ICc9JyA/IDEgOiAyLFxuICAgICAgICAgICAgICAgIHRleHQ6IGNhcFsxXSxcbiAgICAgICAgICAgICAgICB0b2tlbnM6IHRoaXMubGV4ZXIuaW5saW5lKGNhcFsxXSlcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcGFyYWdyYXBoKHNyYykge1xuICAgICAgICBjb25zdCBjYXAgPSB0aGlzLnJ1bGVzLmJsb2NrLnBhcmFncmFwaC5leGVjKHNyYyk7XG4gICAgICAgIGlmIChjYXApIHtcbiAgICAgICAgICAgIGNvbnN0IHRleHQgPSBjYXBbMV0uY2hhckF0KGNhcFsxXS5sZW5ndGggLSAxKSA9PT0gJ1xcbidcbiAgICAgICAgICAgICAgICA/IGNhcFsxXS5zbGljZSgwLCAtMSlcbiAgICAgICAgICAgICAgICA6IGNhcFsxXTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ3BhcmFncmFwaCcsXG4gICAgICAgICAgICAgICAgcmF3OiBjYXBbMF0sXG4gICAgICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgICAgICB0b2tlbnM6IHRoaXMubGV4ZXIuaW5saW5lKHRleHQpXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIHRleHQoc3JjKSB7XG4gICAgICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuYmxvY2sudGV4dC5leGVjKHNyYyk7XG4gICAgICAgIGlmIChjYXApIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgICAgIHJhdzogY2FwWzBdLFxuICAgICAgICAgICAgICAgIHRleHQ6IGNhcFswXSxcbiAgICAgICAgICAgICAgICB0b2tlbnM6IHRoaXMubGV4ZXIuaW5saW5lKGNhcFswXSlcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgZXNjYXBlKHNyYykge1xuICAgICAgICBjb25zdCBjYXAgPSB0aGlzLnJ1bGVzLmlubGluZS5lc2NhcGUuZXhlYyhzcmMpO1xuICAgICAgICBpZiAoY2FwKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdlc2NhcGUnLFxuICAgICAgICAgICAgICAgIHJhdzogY2FwWzBdLFxuICAgICAgICAgICAgICAgIHRleHQ6IGVzY2FwZShjYXBbMV0pXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIHRhZyhzcmMpIHtcbiAgICAgICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5pbmxpbmUudGFnLmV4ZWMoc3JjKTtcbiAgICAgICAgaWYgKGNhcCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmxleGVyLnN0YXRlLmluTGluayAmJiAvXjxhIC9pLnRlc3QoY2FwWzBdKSkge1xuICAgICAgICAgICAgICAgIHRoaXMubGV4ZXIuc3RhdGUuaW5MaW5rID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMubGV4ZXIuc3RhdGUuaW5MaW5rICYmIC9ePFxcL2E+L2kudGVzdChjYXBbMF0pKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sZXhlci5zdGF0ZS5pbkxpbmsgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5sZXhlci5zdGF0ZS5pblJhd0Jsb2NrICYmIC9ePChwcmV8Y29kZXxrYmR8c2NyaXB0KShcXHN8PikvaS50ZXN0KGNhcFswXSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxleGVyLnN0YXRlLmluUmF3QmxvY2sgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5sZXhlci5zdGF0ZS5pblJhd0Jsb2NrICYmIC9ePFxcLyhwcmV8Y29kZXxrYmR8c2NyaXB0KShcXHN8PikvaS50ZXN0KGNhcFswXSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxleGVyLnN0YXRlLmluUmF3QmxvY2sgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2h0bWwnLFxuICAgICAgICAgICAgICAgIHJhdzogY2FwWzBdLFxuICAgICAgICAgICAgICAgIGluTGluazogdGhpcy5sZXhlci5zdGF0ZS5pbkxpbmssXG4gICAgICAgICAgICAgICAgaW5SYXdCbG9jazogdGhpcy5sZXhlci5zdGF0ZS5pblJhd0Jsb2NrLFxuICAgICAgICAgICAgICAgIGJsb2NrOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB0ZXh0OiBjYXBbMF1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGluayhzcmMpIHtcbiAgICAgICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5pbmxpbmUubGluay5leGVjKHNyYyk7XG4gICAgICAgIGlmIChjYXApIHtcbiAgICAgICAgICAgIGNvbnN0IHRyaW1tZWRVcmwgPSBjYXBbMl0udHJpbSgpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMucGVkYW50aWMgJiYgL148Ly50ZXN0KHRyaW1tZWRVcmwpKSB7XG4gICAgICAgICAgICAgICAgLy8gY29tbW9ubWFyayByZXF1aXJlcyBtYXRjaGluZyBhbmdsZSBicmFja2V0c1xuICAgICAgICAgICAgICAgIGlmICghKC8+JC8udGVzdCh0cmltbWVkVXJsKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBlbmRpbmcgYW5nbGUgYnJhY2tldCBjYW5ub3QgYmUgZXNjYXBlZFxuICAgICAgICAgICAgICAgIGNvbnN0IHJ0cmltU2xhc2ggPSBydHJpbSh0cmltbWVkVXJsLnNsaWNlKDAsIC0xKSwgJ1xcXFwnKTtcbiAgICAgICAgICAgICAgICBpZiAoKHRyaW1tZWRVcmwubGVuZ3RoIC0gcnRyaW1TbGFzaC5sZW5ndGgpICUgMiA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gZmluZCBjbG9zaW5nIHBhcmVudGhlc2lzXG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdFBhcmVuSW5kZXggPSBmaW5kQ2xvc2luZ0JyYWNrZXQoY2FwWzJdLCAnKCknKTtcbiAgICAgICAgICAgICAgICBpZiAobGFzdFBhcmVuSW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IGNhcFswXS5pbmRleE9mKCchJykgPT09IDAgPyA1IDogNDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGlua0xlbiA9IHN0YXJ0ICsgY2FwWzFdLmxlbmd0aCArIGxhc3RQYXJlbkluZGV4O1xuICAgICAgICAgICAgICAgICAgICBjYXBbMl0gPSBjYXBbMl0uc3Vic3RyaW5nKDAsIGxhc3RQYXJlbkluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgY2FwWzBdID0gY2FwWzBdLnN1YnN0cmluZygwLCBsaW5rTGVuKS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgIGNhcFszXSA9ICcnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBocmVmID0gY2FwWzJdO1xuICAgICAgICAgICAgbGV0IHRpdGxlID0gJyc7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnBlZGFudGljKSB7XG4gICAgICAgICAgICAgICAgLy8gc3BsaXQgcGVkYW50aWMgaHJlZiBhbmQgdGl0bGVcbiAgICAgICAgICAgICAgICBjb25zdCBsaW5rID0gL14oW14nXCJdKlteXFxzXSlcXHMrKFsnXCJdKSguKilcXDIvLmV4ZWMoaHJlZik7XG4gICAgICAgICAgICAgICAgaWYgKGxpbmspIHtcbiAgICAgICAgICAgICAgICAgICAgaHJlZiA9IGxpbmtbMV07XG4gICAgICAgICAgICAgICAgICAgIHRpdGxlID0gbGlua1szXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aXRsZSA9IGNhcFszXSA/IGNhcFszXS5zbGljZSgxLCAtMSkgOiAnJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhyZWYgPSBocmVmLnRyaW0oKTtcbiAgICAgICAgICAgIGlmICgvXjwvLnRlc3QoaHJlZikpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnBlZGFudGljICYmICEoLz4kLy50ZXN0KHRyaW1tZWRVcmwpKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBwZWRhbnRpYyBhbGxvd3Mgc3RhcnRpbmcgYW5nbGUgYnJhY2tldCB3aXRob3V0IGVuZGluZyBhbmdsZSBicmFja2V0XG4gICAgICAgICAgICAgICAgICAgIGhyZWYgPSBocmVmLnNsaWNlKDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaHJlZiA9IGhyZWYuc2xpY2UoMSwgLTEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvdXRwdXRMaW5rKGNhcCwge1xuICAgICAgICAgICAgICAgIGhyZWY6IGhyZWYgPyBocmVmLnJlcGxhY2UodGhpcy5ydWxlcy5pbmxpbmUuYW55UHVuY3R1YXRpb24sICckMScpIDogaHJlZixcbiAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGUgPyB0aXRsZS5yZXBsYWNlKHRoaXMucnVsZXMuaW5saW5lLmFueVB1bmN0dWF0aW9uLCAnJDEnKSA6IHRpdGxlXG4gICAgICAgICAgICB9LCBjYXBbMF0sIHRoaXMubGV4ZXIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlZmxpbmsoc3JjLCBsaW5rcykge1xuICAgICAgICBsZXQgY2FwO1xuICAgICAgICBpZiAoKGNhcCA9IHRoaXMucnVsZXMuaW5saW5lLnJlZmxpbmsuZXhlYyhzcmMpKVxuICAgICAgICAgICAgfHwgKGNhcCA9IHRoaXMucnVsZXMuaW5saW5lLm5vbGluay5leGVjKHNyYykpKSB7XG4gICAgICAgICAgICBjb25zdCBsaW5rU3RyaW5nID0gKGNhcFsyXSB8fCBjYXBbMV0pLnJlcGxhY2UoL1xccysvZywgJyAnKTtcbiAgICAgICAgICAgIGNvbnN0IGxpbmsgPSBsaW5rc1tsaW5rU3RyaW5nLnRvTG93ZXJDYXNlKCldO1xuICAgICAgICAgICAgaWYgKCFsaW5rKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dCA9IGNhcFswXS5jaGFyQXQoMCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgICAgICAgICByYXc6IHRleHQsXG4gICAgICAgICAgICAgICAgICAgIHRleHRcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG91dHB1dExpbmsoY2FwLCBsaW5rLCBjYXBbMF0sIHRoaXMubGV4ZXIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVtU3Ryb25nKHNyYywgbWFza2VkU3JjLCBwcmV2Q2hhciA9ICcnKSB7XG4gICAgICAgIGxldCBtYXRjaCA9IHRoaXMucnVsZXMuaW5saW5lLmVtU3Ryb25nTERlbGltLmV4ZWMoc3JjKTtcbiAgICAgICAgaWYgKCFtYXRjaClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgLy8gXyBjYW4ndCBiZSBiZXR3ZWVuIHR3byBhbHBoYW51bWVyaWNzLiBcXHB7TH1cXHB7Tn0gaW5jbHVkZXMgbm9uLWVuZ2xpc2ggYWxwaGFiZXQvbnVtYmVycyBhcyB3ZWxsXG4gICAgICAgIGlmIChtYXRjaFszXSAmJiBwcmV2Q2hhci5tYXRjaCgvW1xccHtMfVxccHtOfV0vdSkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNvbnN0IG5leHRDaGFyID0gbWF0Y2hbMV0gfHwgbWF0Y2hbMl0gfHwgJyc7XG4gICAgICAgIGlmICghbmV4dENoYXIgfHwgIXByZXZDaGFyIHx8IHRoaXMucnVsZXMuaW5saW5lLnB1bmN0dWF0aW9uLmV4ZWMocHJldkNoYXIpKSB7XG4gICAgICAgICAgICAvLyB1bmljb2RlIFJlZ2V4IGNvdW50cyBlbW9qaSBhcyAxIGNoYXI7IHNwcmVhZCBpbnRvIGFycmF5IGZvciBwcm9wZXIgY291bnQgKHVzZWQgbXVsdGlwbGUgdGltZXMgYmVsb3cpXG4gICAgICAgICAgICBjb25zdCBsTGVuZ3RoID0gWy4uLm1hdGNoWzBdXS5sZW5ndGggLSAxO1xuICAgICAgICAgICAgbGV0IHJEZWxpbSwgckxlbmd0aCwgZGVsaW1Ub3RhbCA9IGxMZW5ndGgsIG1pZERlbGltVG90YWwgPSAwO1xuICAgICAgICAgICAgY29uc3QgZW5kUmVnID0gbWF0Y2hbMF1bMF0gPT09ICcqJyA/IHRoaXMucnVsZXMuaW5saW5lLmVtU3Ryb25nUkRlbGltQXN0IDogdGhpcy5ydWxlcy5pbmxpbmUuZW1TdHJvbmdSRGVsaW1VbmQ7XG4gICAgICAgICAgICBlbmRSZWcubGFzdEluZGV4ID0gMDtcbiAgICAgICAgICAgIC8vIENsaXAgbWFza2VkU3JjIHRvIHNhbWUgc2VjdGlvbiBvZiBzdHJpbmcgYXMgc3JjIChtb3ZlIHRvIGxleGVyPylcbiAgICAgICAgICAgIG1hc2tlZFNyYyA9IG1hc2tlZFNyYy5zbGljZSgtMSAqIHNyYy5sZW5ndGggKyBsTGVuZ3RoKTtcbiAgICAgICAgICAgIHdoaWxlICgobWF0Y2ggPSBlbmRSZWcuZXhlYyhtYXNrZWRTcmMpKSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgckRlbGltID0gbWF0Y2hbMV0gfHwgbWF0Y2hbMl0gfHwgbWF0Y2hbM10gfHwgbWF0Y2hbNF0gfHwgbWF0Y2hbNV0gfHwgbWF0Y2hbNl07XG4gICAgICAgICAgICAgICAgaWYgKCFyRGVsaW0pXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBza2lwIHNpbmdsZSAqIGluIF9fYWJjKmFiY19fXG4gICAgICAgICAgICAgICAgckxlbmd0aCA9IFsuLi5yRGVsaW1dLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hbM10gfHwgbWF0Y2hbNF0pIHsgLy8gZm91bmQgYW5vdGhlciBMZWZ0IERlbGltXG4gICAgICAgICAgICAgICAgICAgIGRlbGltVG90YWwgKz0gckxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1hdGNoWzVdIHx8IG1hdGNoWzZdKSB7IC8vIGVpdGhlciBMZWZ0IG9yIFJpZ2h0IERlbGltXG4gICAgICAgICAgICAgICAgICAgIGlmIChsTGVuZ3RoICUgMyAmJiAhKChsTGVuZ3RoICsgckxlbmd0aCkgJSAzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWlkRGVsaW1Ub3RhbCArPSByTGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIENvbW1vbk1hcmsgRW1waGFzaXMgUnVsZXMgOS0xMFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlbGltVG90YWwgLT0gckxlbmd0aDtcbiAgICAgICAgICAgICAgICBpZiAoZGVsaW1Ub3RhbCA+IDApXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBIYXZlbid0IGZvdW5kIGVub3VnaCBjbG9zaW5nIGRlbGltaXRlcnNcbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgZXh0cmEgY2hhcmFjdGVycy4gKmEqKiogLT4gKmEqXG4gICAgICAgICAgICAgICAgckxlbmd0aCA9IE1hdGgubWluKHJMZW5ndGgsIHJMZW5ndGggKyBkZWxpbVRvdGFsICsgbWlkRGVsaW1Ub3RhbCk7XG4gICAgICAgICAgICAgICAgLy8gY2hhciBsZW5ndGggY2FuIGJlID4xIGZvciB1bmljb2RlIGNoYXJhY3RlcnM7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdENoYXJMZW5ndGggPSBbLi4ubWF0Y2hbMF1dWzBdLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBjb25zdCByYXcgPSBzcmMuc2xpY2UoMCwgbExlbmd0aCArIG1hdGNoLmluZGV4ICsgbGFzdENoYXJMZW5ndGggKyByTGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYGVtYCBpZiBzbWFsbGVzdCBkZWxpbWl0ZXIgaGFzIG9kZCBjaGFyIGNvdW50LiAqYSoqKlxuICAgICAgICAgICAgICAgIGlmIChNYXRoLm1pbihsTGVuZ3RoLCByTGVuZ3RoKSAlIDIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dCA9IHJhdy5zbGljZSgxLCAtMSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZW0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmF3LFxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuczogdGhpcy5sZXhlci5pbmxpbmVUb2tlbnModGV4dClcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQ3JlYXRlICdzdHJvbmcnIGlmIHNtYWxsZXN0IGRlbGltaXRlciBoYXMgZXZlbiBjaGFyIGNvdW50LiAqKmEqKipcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0ID0gcmF3LnNsaWNlKDIsIC0yKTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnc3Ryb25nJyxcbiAgICAgICAgICAgICAgICAgICAgcmF3LFxuICAgICAgICAgICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgICAgICAgICAgICB0b2tlbnM6IHRoaXMubGV4ZXIuaW5saW5lVG9rZW5zKHRleHQpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBjb2Rlc3BhbihzcmMpIHtcbiAgICAgICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5pbmxpbmUuY29kZS5leGVjKHNyYyk7XG4gICAgICAgIGlmIChjYXApIHtcbiAgICAgICAgICAgIGxldCB0ZXh0ID0gY2FwWzJdLnJlcGxhY2UoL1xcbi9nLCAnICcpO1xuICAgICAgICAgICAgY29uc3QgaGFzTm9uU3BhY2VDaGFycyA9IC9bXiBdLy50ZXN0KHRleHQpO1xuICAgICAgICAgICAgY29uc3QgaGFzU3BhY2VDaGFyc09uQm90aEVuZHMgPSAvXiAvLnRlc3QodGV4dCkgJiYgLyAkLy50ZXN0KHRleHQpO1xuICAgICAgICAgICAgaWYgKGhhc05vblNwYWNlQ2hhcnMgJiYgaGFzU3BhY2VDaGFyc09uQm90aEVuZHMpIHtcbiAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMSwgdGV4dC5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRleHQgPSBlc2NhcGUodGV4dCwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdjb2Rlc3BhbicsXG4gICAgICAgICAgICAgICAgcmF3OiBjYXBbMF0sXG4gICAgICAgICAgICAgICAgdGV4dFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBicihzcmMpIHtcbiAgICAgICAgY29uc3QgY2FwID0gdGhpcy5ydWxlcy5pbmxpbmUuYnIuZXhlYyhzcmMpO1xuICAgICAgICBpZiAoY2FwKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdicicsXG4gICAgICAgICAgICAgICAgcmF3OiBjYXBbMF1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVsKHNyYykge1xuICAgICAgICBjb25zdCBjYXAgPSB0aGlzLnJ1bGVzLmlubGluZS5kZWwuZXhlYyhzcmMpO1xuICAgICAgICBpZiAoY2FwKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdkZWwnLFxuICAgICAgICAgICAgICAgIHJhdzogY2FwWzBdLFxuICAgICAgICAgICAgICAgIHRleHQ6IGNhcFsyXSxcbiAgICAgICAgICAgICAgICB0b2tlbnM6IHRoaXMubGV4ZXIuaW5saW5lVG9rZW5zKGNhcFsyXSlcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXV0b2xpbmsoc3JjKSB7XG4gICAgICAgIGNvbnN0IGNhcCA9IHRoaXMucnVsZXMuaW5saW5lLmF1dG9saW5rLmV4ZWMoc3JjKTtcbiAgICAgICAgaWYgKGNhcCkge1xuICAgICAgICAgICAgbGV0IHRleHQsIGhyZWY7XG4gICAgICAgICAgICBpZiAoY2FwWzJdID09PSAnQCcpIHtcbiAgICAgICAgICAgICAgICB0ZXh0ID0gZXNjYXBlKGNhcFsxXSk7XG4gICAgICAgICAgICAgICAgaHJlZiA9ICdtYWlsdG86JyArIHRleHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0ZXh0ID0gZXNjYXBlKGNhcFsxXSk7XG4gICAgICAgICAgICAgICAgaHJlZiA9IHRleHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdsaW5rJyxcbiAgICAgICAgICAgICAgICByYXc6IGNhcFswXSxcbiAgICAgICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgICAgICAgIGhyZWYsXG4gICAgICAgICAgICAgICAgdG9rZW5zOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhdzogdGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgdXJsKHNyYykge1xuICAgICAgICBsZXQgY2FwO1xuICAgICAgICBpZiAoY2FwID0gdGhpcy5ydWxlcy5pbmxpbmUudXJsLmV4ZWMoc3JjKSkge1xuICAgICAgICAgICAgbGV0IHRleHQsIGhyZWY7XG4gICAgICAgICAgICBpZiAoY2FwWzJdID09PSAnQCcpIHtcbiAgICAgICAgICAgICAgICB0ZXh0ID0gZXNjYXBlKGNhcFswXSk7XG4gICAgICAgICAgICAgICAgaHJlZiA9ICdtYWlsdG86JyArIHRleHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBkbyBleHRlbmRlZCBhdXRvbGluayBwYXRoIHZhbGlkYXRpb25cbiAgICAgICAgICAgICAgICBsZXQgcHJldkNhcFplcm87XG4gICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICBwcmV2Q2FwWmVybyA9IGNhcFswXTtcbiAgICAgICAgICAgICAgICAgICAgY2FwWzBdID0gdGhpcy5ydWxlcy5pbmxpbmUuX2JhY2twZWRhbC5leGVjKGNhcFswXSk/LlswXSA/PyAnJztcbiAgICAgICAgICAgICAgICB9IHdoaWxlIChwcmV2Q2FwWmVybyAhPT0gY2FwWzBdKTtcbiAgICAgICAgICAgICAgICB0ZXh0ID0gZXNjYXBlKGNhcFswXSk7XG4gICAgICAgICAgICAgICAgaWYgKGNhcFsxXSA9PT0gJ3d3dy4nKSB7XG4gICAgICAgICAgICAgICAgICAgIGhyZWYgPSAnaHR0cDovLycgKyBjYXBbMF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBocmVmID0gY2FwWzBdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2xpbmsnLFxuICAgICAgICAgICAgICAgIHJhdzogY2FwWzBdLFxuICAgICAgICAgICAgICAgIHRleHQsXG4gICAgICAgICAgICAgICAgaHJlZixcbiAgICAgICAgICAgICAgICB0b2tlbnM6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmF3OiB0ZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpbmxpbmVUZXh0KHNyYykge1xuICAgICAgICBjb25zdCBjYXAgPSB0aGlzLnJ1bGVzLmlubGluZS50ZXh0LmV4ZWMoc3JjKTtcbiAgICAgICAgaWYgKGNhcCkge1xuICAgICAgICAgICAgbGV0IHRleHQ7XG4gICAgICAgICAgICBpZiAodGhpcy5sZXhlci5zdGF0ZS5pblJhd0Jsb2NrKSB7XG4gICAgICAgICAgICAgICAgdGV4dCA9IGNhcFswXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRleHQgPSBlc2NhcGUoY2FwWzBdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgICAgIHJhdzogY2FwWzBdLFxuICAgICAgICAgICAgICAgIHRleHRcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgZWRpdCwgbm9vcFRlc3QgfSBmcm9tICcuL2hlbHBlcnMudHMnO1xuLyoqXG4gKiBCbG9jay1MZXZlbCBHcmFtbWFyXG4gKi9cbmNvbnN0IG5ld2xpbmUgPSAvXig/OiAqKD86XFxufCQpKSsvO1xuY29uc3QgYmxvY2tDb2RlID0gL14oIHs0fVteXFxuXSsoPzpcXG4oPzogKig/OlxcbnwkKSkqKT8pKy87XG5jb25zdCBmZW5jZXMgPSAvXiB7MCwzfShgezMsfSg/PVteYFxcbl0qKD86XFxufCQpKXx+ezMsfSkoW15cXG5dKikoPzpcXG58JCkoPzp8KFtcXHNcXFNdKj8pKD86XFxufCQpKSg/OiB7MCwzfVxcMVt+YF0qICooPz1cXG58JCl8JCkvO1xuY29uc3QgaHIgPSAvXiB7MCwzfSgoPzotW1xcdCBdKil7Myx9fCg/Ol9bIFxcdF0qKXszLH18KD86XFwqWyBcXHRdKil7Myx9KSg/Olxcbit8JCkvO1xuY29uc3QgaGVhZGluZyA9IC9eIHswLDN9KCN7MSw2fSkoPz1cXHN8JCkoLiopKD86XFxuK3wkKS87XG5jb25zdCBidWxsZXQgPSAvKD86WyorLV18XFxkezEsOX1bLildKS87XG5jb25zdCBsaGVhZGluZyA9IGVkaXQoL14oPyFidWxsIHxibG9ja0NvZGV8ZmVuY2VzfGJsb2NrcXVvdGV8aGVhZGluZ3xodG1sKSgoPzoufFxcbig/IVxccyo/XFxufGJ1bGwgfGJsb2NrQ29kZXxmZW5jZXN8YmxvY2txdW90ZXxoZWFkaW5nfGh0bWwpKSs/KVxcbiB7MCwzfSg9K3wtKykgKig/Olxcbit8JCkvKVxuICAgIC5yZXBsYWNlKC9idWxsL2csIGJ1bGxldCkgLy8gbGlzdHMgY2FuIGludGVycnVwdFxuICAgIC5yZXBsYWNlKC9ibG9ja0NvZGUvZywgLyB7NH0vKSAvLyBpbmRlbnRlZCBjb2RlIGJsb2NrcyBjYW4gaW50ZXJydXB0XG4gICAgLnJlcGxhY2UoL2ZlbmNlcy9nLCAvIHswLDN9KD86YHszLH18fnszLH0pLykgLy8gZmVuY2VkIGNvZGUgYmxvY2tzIGNhbiBpbnRlcnJ1cHRcbiAgICAucmVwbGFjZSgvYmxvY2txdW90ZS9nLCAvIHswLDN9Pi8pIC8vIGJsb2NrcXVvdGUgY2FuIGludGVycnVwdFxuICAgIC5yZXBsYWNlKC9oZWFkaW5nL2csIC8gezAsM30jezEsNn0vKSAvLyBBVFggaGVhZGluZyBjYW4gaW50ZXJydXB0XG4gICAgLnJlcGxhY2UoL2h0bWwvZywgLyB7MCwzfTxbXlxcbj5dKz5cXG4vKSAvLyBibG9jayBodG1sIGNhbiBpbnRlcnJ1cHRcbiAgICAuZ2V0UmVnZXgoKTtcbmNvbnN0IF9wYXJhZ3JhcGggPSAvXihbXlxcbl0rKD86XFxuKD8haHJ8aGVhZGluZ3xsaGVhZGluZ3xibG9ja3F1b3RlfGZlbmNlc3xsaXN0fGh0bWx8dGFibGV8ICtcXG4pW15cXG5dKykqKS87XG5jb25zdCBibG9ja1RleHQgPSAvXlteXFxuXSsvO1xuY29uc3QgX2Jsb2NrTGFiZWwgPSAvKD8hXFxzKlxcXSkoPzpcXFxcLnxbXlxcW1xcXVxcXFxdKSsvO1xuY29uc3QgZGVmID0gZWRpdCgvXiB7MCwzfVxcWyhsYWJlbClcXF06ICooPzpcXG4gKik/KFtePFxcc11bXlxcc10qfDwuKj8+KSg/Oig/OiArKD86XFxuICopP3wgKlxcbiAqKSh0aXRsZSkpPyAqKD86XFxuK3wkKS8pXG4gICAgLnJlcGxhY2UoJ2xhYmVsJywgX2Jsb2NrTGFiZWwpXG4gICAgLnJlcGxhY2UoJ3RpdGxlJywgLyg/OlwiKD86XFxcXFwiP3xbXlwiXFxcXF0pKlwifCdbXidcXG5dKig/OlxcblteJ1xcbl0rKSpcXG4/J3xcXChbXigpXSpcXCkpLylcbiAgICAuZ2V0UmVnZXgoKTtcbmNvbnN0IGxpc3QgPSBlZGl0KC9eKCB7MCwzfWJ1bGwpKFsgXFx0XVteXFxuXSs/KT8oPzpcXG58JCkvKVxuICAgIC5yZXBsYWNlKC9idWxsL2csIGJ1bGxldClcbiAgICAuZ2V0UmVnZXgoKTtcbmNvbnN0IF90YWcgPSAnYWRkcmVzc3xhcnRpY2xlfGFzaWRlfGJhc2V8YmFzZWZvbnR8YmxvY2txdW90ZXxib2R5fGNhcHRpb24nXG4gICAgKyAnfGNlbnRlcnxjb2x8Y29sZ3JvdXB8ZGR8ZGV0YWlsc3xkaWFsb2d8ZGlyfGRpdnxkbHxkdHxmaWVsZHNldHxmaWdjYXB0aW9uJ1xuICAgICsgJ3xmaWd1cmV8Zm9vdGVyfGZvcm18ZnJhbWV8ZnJhbWVzZXR8aFsxLTZdfGhlYWR8aGVhZGVyfGhyfGh0bWx8aWZyYW1lJ1xuICAgICsgJ3xsZWdlbmR8bGl8bGlua3xtYWlufG1lbnV8bWVudWl0ZW18bWV0YXxuYXZ8bm9mcmFtZXN8b2x8b3B0Z3JvdXB8b3B0aW9uJ1xuICAgICsgJ3xwfHBhcmFtfHNlYXJjaHxzZWN0aW9ufHN1bW1hcnl8dGFibGV8dGJvZHl8dGR8dGZvb3R8dGh8dGhlYWR8dGl0bGUnXG4gICAgKyAnfHRyfHRyYWNrfHVsJztcbmNvbnN0IF9jb21tZW50ID0gLzwhLS0oPzotPz58W1xcc1xcU10qPyg/Oi0tPnwkKSkvO1xuY29uc3QgaHRtbCA9IGVkaXQoJ14gezAsM30oPzonIC8vIG9wdGlvbmFsIGluZGVudGF0aW9uXG4gICAgKyAnPChzY3JpcHR8cHJlfHN0eWxlfHRleHRhcmVhKVtcXFxccz5dW1xcXFxzXFxcXFNdKj8oPzo8L1xcXFwxPlteXFxcXG5dKlxcXFxuK3wkKScgLy8gKDEpXG4gICAgKyAnfGNvbW1lbnRbXlxcXFxuXSooXFxcXG4rfCQpJyAvLyAoMilcbiAgICArICd8PFxcXFw/W1xcXFxzXFxcXFNdKj8oPzpcXFxcPz5cXFxcbip8JCknIC8vICgzKVxuICAgICsgJ3w8IVtBLVpdW1xcXFxzXFxcXFNdKj8oPzo+XFxcXG4qfCQpJyAvLyAoNClcbiAgICArICd8PCFcXFxcW0NEQVRBXFxcXFtbXFxcXHNcXFxcU10qPyg/OlxcXFxdXFxcXF0+XFxcXG4qfCQpJyAvLyAoNSlcbiAgICArICd8PC8/KHRhZykoPzogK3xcXFxcbnwvPz4pW1xcXFxzXFxcXFNdKj8oPzooPzpcXFxcbiAqKStcXFxcbnwkKScgLy8gKDYpXG4gICAgKyAnfDwoPyFzY3JpcHR8cHJlfHN0eWxlfHRleHRhcmVhKShbYS16XVtcXFxcdy1dKikoPzphdHRyaWJ1dGUpKj8gKi8/Pig/PVsgXFxcXHRdKig/OlxcXFxufCQpKVtcXFxcc1xcXFxTXSo/KD86KD86XFxcXG4gKikrXFxcXG58JCknIC8vICg3KSBvcGVuIHRhZ1xuICAgICsgJ3w8Lyg/IXNjcmlwdHxwcmV8c3R5bGV8dGV4dGFyZWEpW2Etel1bXFxcXHctXSpcXFxccyo+KD89WyBcXFxcdF0qKD86XFxcXG58JCkpW1xcXFxzXFxcXFNdKj8oPzooPzpcXFxcbiAqKStcXFxcbnwkKScgLy8gKDcpIGNsb3NpbmcgdGFnXG4gICAgKyAnKScsICdpJylcbiAgICAucmVwbGFjZSgnY29tbWVudCcsIF9jb21tZW50KVxuICAgIC5yZXBsYWNlKCd0YWcnLCBfdGFnKVxuICAgIC5yZXBsYWNlKCdhdHRyaWJ1dGUnLCAvICtbYS16QS1aOl9dW1xcdy46LV0qKD86ICo9ICpcIlteXCJcXG5dKlwifCAqPSAqJ1teJ1xcbl0qJ3wgKj0gKlteXFxzXCInPTw+YF0rKT8vKVxuICAgIC5nZXRSZWdleCgpO1xuY29uc3QgcGFyYWdyYXBoID0gZWRpdChfcGFyYWdyYXBoKVxuICAgIC5yZXBsYWNlKCdocicsIGhyKVxuICAgIC5yZXBsYWNlKCdoZWFkaW5nJywgJyB7MCwzfSN7MSw2fSg/OlxcXFxzfCQpJylcbiAgICAucmVwbGFjZSgnfGxoZWFkaW5nJywgJycpIC8vIHNldGV4dCBoZWFkaW5ncyBkb24ndCBpbnRlcnJ1cHQgY29tbW9ubWFyayBwYXJhZ3JhcGhzXG4gICAgLnJlcGxhY2UoJ3x0YWJsZScsICcnKVxuICAgIC5yZXBsYWNlKCdibG9ja3F1b3RlJywgJyB7MCwzfT4nKVxuICAgIC5yZXBsYWNlKCdmZW5jZXMnLCAnIHswLDN9KD86YHszLH0oPz1bXmBcXFxcbl0qXFxcXG4pfH57Myx9KVteXFxcXG5dKlxcXFxuJylcbiAgICAucmVwbGFjZSgnbGlzdCcsICcgezAsM30oPzpbKistXXwxWy4pXSkgJykgLy8gb25seSBsaXN0cyBzdGFydGluZyBmcm9tIDEgY2FuIGludGVycnVwdFxuICAgIC5yZXBsYWNlKCdodG1sJywgJzwvPyg/OnRhZykoPzogK3xcXFxcbnwvPz4pfDwoPzpzY3JpcHR8cHJlfHN0eWxlfHRleHRhcmVhfCEtLSknKVxuICAgIC5yZXBsYWNlKCd0YWcnLCBfdGFnKSAvLyBwYXJzIGNhbiBiZSBpbnRlcnJ1cHRlZCBieSB0eXBlICg2KSBodG1sIGJsb2Nrc1xuICAgIC5nZXRSZWdleCgpO1xuY29uc3QgYmxvY2txdW90ZSA9IGVkaXQoL14oIHswLDN9PiA/KHBhcmFncmFwaHxbXlxcbl0qKSg/OlxcbnwkKSkrLylcbiAgICAucmVwbGFjZSgncGFyYWdyYXBoJywgcGFyYWdyYXBoKVxuICAgIC5nZXRSZWdleCgpO1xuLyoqXG4gKiBOb3JtYWwgQmxvY2sgR3JhbW1hclxuICovXG5jb25zdCBibG9ja05vcm1hbCA9IHtcbiAgICBibG9ja3F1b3RlLFxuICAgIGNvZGU6IGJsb2NrQ29kZSxcbiAgICBkZWYsXG4gICAgZmVuY2VzLFxuICAgIGhlYWRpbmcsXG4gICAgaHIsXG4gICAgaHRtbCxcbiAgICBsaGVhZGluZyxcbiAgICBsaXN0LFxuICAgIG5ld2xpbmUsXG4gICAgcGFyYWdyYXBoLFxuICAgIHRhYmxlOiBub29wVGVzdCxcbiAgICB0ZXh0OiBibG9ja1RleHRcbn07XG4vKipcbiAqIEdGTSBCbG9jayBHcmFtbWFyXG4gKi9cbmNvbnN0IGdmbVRhYmxlID0gZWRpdCgnXiAqKFteXFxcXG4gXS4qKVxcXFxuJyAvLyBIZWFkZXJcbiAgICArICcgezAsM30oKD86XFxcXHwgKik/Oj8tKzo/ICooPzpcXFxcfCAqOj8tKzo/ICopKig/OlxcXFx8ICopPyknIC8vIEFsaWduXG4gICAgKyAnKD86XFxcXG4oKD86KD8hICpcXFxcbnxocnxoZWFkaW5nfGJsb2NrcXVvdGV8Y29kZXxmZW5jZXN8bGlzdHxodG1sKS4qKD86XFxcXG58JCkpKilcXFxcbip8JCknKSAvLyBDZWxsc1xuICAgIC5yZXBsYWNlKCdocicsIGhyKVxuICAgIC5yZXBsYWNlKCdoZWFkaW5nJywgJyB7MCwzfSN7MSw2fSg/OlxcXFxzfCQpJylcbiAgICAucmVwbGFjZSgnYmxvY2txdW90ZScsICcgezAsM30+JylcbiAgICAucmVwbGFjZSgnY29kZScsICcgezR9W15cXFxcbl0nKVxuICAgIC5yZXBsYWNlKCdmZW5jZXMnLCAnIHswLDN9KD86YHszLH0oPz1bXmBcXFxcbl0qXFxcXG4pfH57Myx9KVteXFxcXG5dKlxcXFxuJylcbiAgICAucmVwbGFjZSgnbGlzdCcsICcgezAsM30oPzpbKistXXwxWy4pXSkgJykgLy8gb25seSBsaXN0cyBzdGFydGluZyBmcm9tIDEgY2FuIGludGVycnVwdFxuICAgIC5yZXBsYWNlKCdodG1sJywgJzwvPyg/OnRhZykoPzogK3xcXFxcbnwvPz4pfDwoPzpzY3JpcHR8cHJlfHN0eWxlfHRleHRhcmVhfCEtLSknKVxuICAgIC5yZXBsYWNlKCd0YWcnLCBfdGFnKSAvLyB0YWJsZXMgY2FuIGJlIGludGVycnVwdGVkIGJ5IHR5cGUgKDYpIGh0bWwgYmxvY2tzXG4gICAgLmdldFJlZ2V4KCk7XG5jb25zdCBibG9ja0dmbSA9IHtcbiAgICAuLi5ibG9ja05vcm1hbCxcbiAgICB0YWJsZTogZ2ZtVGFibGUsXG4gICAgcGFyYWdyYXBoOiBlZGl0KF9wYXJhZ3JhcGgpXG4gICAgICAgIC5yZXBsYWNlKCdocicsIGhyKVxuICAgICAgICAucmVwbGFjZSgnaGVhZGluZycsICcgezAsM30jezEsNn0oPzpcXFxcc3wkKScpXG4gICAgICAgIC5yZXBsYWNlKCd8bGhlYWRpbmcnLCAnJykgLy8gc2V0ZXh0IGhlYWRpbmdzIGRvbid0IGludGVycnVwdCBjb21tb25tYXJrIHBhcmFncmFwaHNcbiAgICAgICAgLnJlcGxhY2UoJ3RhYmxlJywgZ2ZtVGFibGUpIC8vIGludGVycnVwdCBwYXJhZ3JhcGhzIHdpdGggdGFibGVcbiAgICAgICAgLnJlcGxhY2UoJ2Jsb2NrcXVvdGUnLCAnIHswLDN9PicpXG4gICAgICAgIC5yZXBsYWNlKCdmZW5jZXMnLCAnIHswLDN9KD86YHszLH0oPz1bXmBcXFxcbl0qXFxcXG4pfH57Myx9KVteXFxcXG5dKlxcXFxuJylcbiAgICAgICAgLnJlcGxhY2UoJ2xpc3QnLCAnIHswLDN9KD86WyorLV18MVsuKV0pICcpIC8vIG9ubHkgbGlzdHMgc3RhcnRpbmcgZnJvbSAxIGNhbiBpbnRlcnJ1cHRcbiAgICAgICAgLnJlcGxhY2UoJ2h0bWwnLCAnPC8/KD86dGFnKSg/OiArfFxcXFxufC8/Pil8PCg/OnNjcmlwdHxwcmV8c3R5bGV8dGV4dGFyZWF8IS0tKScpXG4gICAgICAgIC5yZXBsYWNlKCd0YWcnLCBfdGFnKSAvLyBwYXJzIGNhbiBiZSBpbnRlcnJ1cHRlZCBieSB0eXBlICg2KSBodG1sIGJsb2Nrc1xuICAgICAgICAuZ2V0UmVnZXgoKVxufTtcbi8qKlxuICogUGVkYW50aWMgZ3JhbW1hciAob3JpZ2luYWwgSm9obiBHcnViZXIncyBsb29zZSBtYXJrZG93biBzcGVjaWZpY2F0aW9uKVxuICovXG5jb25zdCBibG9ja1BlZGFudGljID0ge1xuICAgIC4uLmJsb2NrTm9ybWFsLFxuICAgIGh0bWw6IGVkaXQoJ14gKig/OmNvbW1lbnQgKig/OlxcXFxufFxcXFxzKiQpJ1xuICAgICAgICArICd8PCh0YWcpW1xcXFxzXFxcXFNdKz88L1xcXFwxPiAqKD86XFxcXG57Mix9fFxcXFxzKiQpJyAvLyBjbG9zZWQgdGFnXG4gICAgICAgICsgJ3w8dGFnKD86XCJbXlwiXSpcInxcXCdbXlxcJ10qXFwnfFxcXFxzW15cXCdcIi8+XFxcXHNdKikqPy8/PiAqKD86XFxcXG57Mix9fFxcXFxzKiQpKScpXG4gICAgICAgIC5yZXBsYWNlKCdjb21tZW50JywgX2NvbW1lbnQpXG4gICAgICAgIC5yZXBsYWNlKC90YWcvZywgJyg/ISg/OidcbiAgICAgICAgKyAnYXxlbXxzdHJvbmd8c21hbGx8c3xjaXRlfHF8ZGZufGFiYnJ8ZGF0YXx0aW1lfGNvZGV8dmFyfHNhbXB8a2JkfHN1YidcbiAgICAgICAgKyAnfHN1cHxpfGJ8dXxtYXJrfHJ1Ynl8cnR8cnB8YmRpfGJkb3xzcGFufGJyfHdicnxpbnN8ZGVsfGltZyknXG4gICAgICAgICsgJ1xcXFxiKVxcXFx3Kyg/ITp8W15cXFxcd1xcXFxzQF0qQClcXFxcYicpXG4gICAgICAgIC5nZXRSZWdleCgpLFxuICAgIGRlZjogL14gKlxcWyhbXlxcXV0rKVxcXTogKjw/KFteXFxzPl0rKT4/KD86ICsoW1wiKF1bXlxcbl0rW1wiKV0pKT8gKig/Olxcbit8JCkvLFxuICAgIGhlYWRpbmc6IC9eKCN7MSw2fSkoLiopKD86XFxuK3wkKS8sXG4gICAgZmVuY2VzOiBub29wVGVzdCwgLy8gZmVuY2VzIG5vdCBzdXBwb3J0ZWRcbiAgICBsaGVhZGluZzogL14oLis/KVxcbiB7MCwzfSg9K3wtKykgKig/Olxcbit8JCkvLFxuICAgIHBhcmFncmFwaDogZWRpdChfcGFyYWdyYXBoKVxuICAgICAgICAucmVwbGFjZSgnaHInLCBocilcbiAgICAgICAgLnJlcGxhY2UoJ2hlYWRpbmcnLCAnICojezEsNn0gKlteXFxuXScpXG4gICAgICAgIC5yZXBsYWNlKCdsaGVhZGluZycsIGxoZWFkaW5nKVxuICAgICAgICAucmVwbGFjZSgnfHRhYmxlJywgJycpXG4gICAgICAgIC5yZXBsYWNlKCdibG9ja3F1b3RlJywgJyB7MCwzfT4nKVxuICAgICAgICAucmVwbGFjZSgnfGZlbmNlcycsICcnKVxuICAgICAgICAucmVwbGFjZSgnfGxpc3QnLCAnJylcbiAgICAgICAgLnJlcGxhY2UoJ3xodG1sJywgJycpXG4gICAgICAgIC5yZXBsYWNlKCd8dGFnJywgJycpXG4gICAgICAgIC5nZXRSZWdleCgpXG59O1xuLyoqXG4gKiBJbmxpbmUtTGV2ZWwgR3JhbW1hclxuICovXG5jb25zdCBlc2NhcGUgPSAvXlxcXFwoWyFcIiMkJSYnKCkqKyxcXC0uLzo7PD0+P0BcXFtcXF1cXFxcXl9ge3x9fl0pLztcbmNvbnN0IGlubGluZUNvZGUgPSAvXihgKykoW15gXXxbXmBdW1xcc1xcU10qP1teYF0pXFwxKD8hYCkvO1xuY29uc3QgYnIgPSAvXiggezIsfXxcXFxcKVxcbig/IVxccyokKS87XG5jb25zdCBpbmxpbmVUZXh0ID0gL14oYCt8W15gXSkoPzooPz0gezIsfVxcbil8W1xcc1xcU10qPyg/Oig/PVtcXFxcPCFcXFtgKl9dfFxcYl98JCl8W14gXSg/PSB7Mix9XFxuKSkpLztcbi8vIGxpc3Qgb2YgdW5pY29kZSBwdW5jdHVhdGlvbiBtYXJrcywgcGx1cyBhbnkgbWlzc2luZyBjaGFyYWN0ZXJzIGZyb20gQ29tbW9uTWFyayBzcGVjXG5jb25zdCBfcHVuY3R1YXRpb24gPSAnXFxcXHB7UH1cXFxccHtTfSc7XG5jb25zdCBwdW5jdHVhdGlvbiA9IGVkaXQoL14oKD8hWypfXSlbXFxzcHVuY3R1YXRpb25dKS8sICd1JylcbiAgICAucmVwbGFjZSgvcHVuY3R1YXRpb24vZywgX3B1bmN0dWF0aW9uKS5nZXRSZWdleCgpO1xuLy8gc2VxdWVuY2VzIGVtIHNob3VsZCBza2lwIG92ZXIgW3RpdGxlXShsaW5rKSwgYGNvZGVgLCA8aHRtbD5cbmNvbnN0IGJsb2NrU2tpcCA9IC9cXFtbXltcXF1dKj9cXF1cXChbXlxcKFxcKV0qP1xcKXxgW15gXSo/YHw8W148Pl0qPz4vZztcbmNvbnN0IGVtU3Ryb25nTERlbGltID0gZWRpdCgvXig/OlxcKisoPzooKD8hXFwqKVtwdW5jdF0pfFteXFxzKl0pKXxeXysoPzooKD8hXylbcHVuY3RdKXwoW15cXHNfXSkpLywgJ3UnKVxuICAgIC5yZXBsYWNlKC9wdW5jdC9nLCBfcHVuY3R1YXRpb24pXG4gICAgLmdldFJlZ2V4KCk7XG5jb25zdCBlbVN0cm9uZ1JEZWxpbUFzdCA9IGVkaXQoJ15bXl8qXSo/X19bXl8qXSo/XFxcXCpbXl8qXSo/KD89X18pJyAvLyBTa2lwIG9ycGhhbiBpbnNpZGUgc3Ryb25nXG4gICAgKyAnfFteKl0rKD89W14qXSknIC8vIENvbnN1bWUgdG8gZGVsaW1cbiAgICArICd8KD8hXFxcXCopW3B1bmN0XShcXFxcKispKD89W1xcXFxzXXwkKScgLy8gKDEpICMqKiogY2FuIG9ubHkgYmUgYSBSaWdodCBEZWxpbWl0ZXJcbiAgICArICd8W15wdW5jdFxcXFxzXShcXFxcKispKD8hXFxcXCopKD89W3B1bmN0XFxcXHNdfCQpJyAvLyAoMikgYSoqKiMsIGEqKiogY2FuIG9ubHkgYmUgYSBSaWdodCBEZWxpbWl0ZXJcbiAgICArICd8KD8hXFxcXCopW3B1bmN0XFxcXHNdKFxcXFwqKykoPz1bXnB1bmN0XFxcXHNdKScgLy8gKDMpICMqKiphLCAqKiphIGNhbiBvbmx5IGJlIExlZnQgRGVsaW1pdGVyXG4gICAgKyAnfFtcXFxcc10oXFxcXCorKSg/IVxcXFwqKSg/PVtwdW5jdF0pJyAvLyAoNCkgKioqIyBjYW4gb25seSBiZSBMZWZ0IERlbGltaXRlclxuICAgICsgJ3woPyFcXFxcKilbcHVuY3RdKFxcXFwqKykoPyFcXFxcKikoPz1bcHVuY3RdKScgLy8gKDUpICMqKiojIGNhbiBiZSBlaXRoZXIgTGVmdCBvciBSaWdodCBEZWxpbWl0ZXJcbiAgICArICd8W15wdW5jdFxcXFxzXShcXFxcKispKD89W15wdW5jdFxcXFxzXSknLCAnZ3UnKSAvLyAoNikgYSoqKmEgY2FuIGJlIGVpdGhlciBMZWZ0IG9yIFJpZ2h0IERlbGltaXRlclxuICAgIC5yZXBsYWNlKC9wdW5jdC9nLCBfcHVuY3R1YXRpb24pXG4gICAgLmdldFJlZ2V4KCk7XG4vLyAoNikgTm90IGFsbG93ZWQgZm9yIF9cbmNvbnN0IGVtU3Ryb25nUkRlbGltVW5kID0gZWRpdCgnXlteXypdKj9cXFxcKlxcXFwqW15fKl0qP19bXl8qXSo/KD89XFxcXCpcXFxcKiknIC8vIFNraXAgb3JwaGFuIGluc2lkZSBzdHJvbmdcbiAgICArICd8W15fXSsoPz1bXl9dKScgLy8gQ29uc3VtZSB0byBkZWxpbVxuICAgICsgJ3woPyFfKVtwdW5jdF0oXyspKD89W1xcXFxzXXwkKScgLy8gKDEpICNfX18gY2FuIG9ubHkgYmUgYSBSaWdodCBEZWxpbWl0ZXJcbiAgICArICd8W15wdW5jdFxcXFxzXShfKykoPyFfKSg/PVtwdW5jdFxcXFxzXXwkKScgLy8gKDIpIGFfX18jLCBhX19fIGNhbiBvbmx5IGJlIGEgUmlnaHQgRGVsaW1pdGVyXG4gICAgKyAnfCg/IV8pW3B1bmN0XFxcXHNdKF8rKSg/PVtecHVuY3RcXFxcc10pJyAvLyAoMykgI19fX2EsIF9fX2EgY2FuIG9ubHkgYmUgTGVmdCBEZWxpbWl0ZXJcbiAgICArICd8W1xcXFxzXShfKykoPyFfKSg/PVtwdW5jdF0pJyAvLyAoNCkgX19fIyBjYW4gb25seSBiZSBMZWZ0IERlbGltaXRlclxuICAgICsgJ3woPyFfKVtwdW5jdF0oXyspKD8hXykoPz1bcHVuY3RdKScsICdndScpIC8vICg1KSAjX19fIyBjYW4gYmUgZWl0aGVyIExlZnQgb3IgUmlnaHQgRGVsaW1pdGVyXG4gICAgLnJlcGxhY2UoL3B1bmN0L2csIF9wdW5jdHVhdGlvbilcbiAgICAuZ2V0UmVnZXgoKTtcbmNvbnN0IGFueVB1bmN0dWF0aW9uID0gZWRpdCgvXFxcXChbcHVuY3RdKS8sICdndScpXG4gICAgLnJlcGxhY2UoL3B1bmN0L2csIF9wdW5jdHVhdGlvbilcbiAgICAuZ2V0UmVnZXgoKTtcbmNvbnN0IGF1dG9saW5rID0gZWRpdCgvXjwoc2NoZW1lOlteXFxzXFx4MDAtXFx4MWY8Pl0qfGVtYWlsKT4vKVxuICAgIC5yZXBsYWNlKCdzY2hlbWUnLCAvW2EtekEtWl1bYS16QS1aMC05Ky4tXXsxLDMxfS8pXG4gICAgLnJlcGxhY2UoJ2VtYWlsJywgL1thLXpBLVowLTkuISMkJSYnKisvPT9eX2B7fH1+LV0rKEApW2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSk/KD86XFwuW2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSk/KSsoPyFbLV9dKS8pXG4gICAgLmdldFJlZ2V4KCk7XG5jb25zdCBfaW5saW5lQ29tbWVudCA9IGVkaXQoX2NvbW1lbnQpLnJlcGxhY2UoJyg/Oi0tPnwkKScsICctLT4nKS5nZXRSZWdleCgpO1xuY29uc3QgdGFnID0gZWRpdCgnXmNvbW1lbnQnXG4gICAgKyAnfF48L1thLXpBLVpdW1xcXFx3Oi1dKlxcXFxzKj4nIC8vIHNlbGYtY2xvc2luZyB0YWdcbiAgICArICd8XjxbYS16QS1aXVtcXFxcdy1dKig/OmF0dHJpYnV0ZSkqP1xcXFxzKi8/PicgLy8gb3BlbiB0YWdcbiAgICArICd8XjxcXFxcP1tcXFxcc1xcXFxTXSo/XFxcXD8+JyAvLyBwcm9jZXNzaW5nIGluc3RydWN0aW9uLCBlLmcuIDw/cGhwID8+XG4gICAgKyAnfF48IVthLXpBLVpdK1xcXFxzW1xcXFxzXFxcXFNdKj8+JyAvLyBkZWNsYXJhdGlvbiwgZS5nLiA8IURPQ1RZUEUgaHRtbD5cbiAgICArICd8XjwhXFxcXFtDREFUQVxcXFxbW1xcXFxzXFxcXFNdKj9cXFxcXVxcXFxdPicpIC8vIENEQVRBIHNlY3Rpb25cbiAgICAucmVwbGFjZSgnY29tbWVudCcsIF9pbmxpbmVDb21tZW50KVxuICAgIC5yZXBsYWNlKCdhdHRyaWJ1dGUnLCAvXFxzK1thLXpBLVo6X11bXFx3LjotXSooPzpcXHMqPVxccypcIlteXCJdKlwifFxccyo9XFxzKidbXiddKid8XFxzKj1cXHMqW15cXHNcIic9PD5gXSspPy8pXG4gICAgLmdldFJlZ2V4KCk7XG5jb25zdCBfaW5saW5lTGFiZWwgPSAvKD86XFxbKD86XFxcXC58W15cXFtcXF1cXFxcXSkqXFxdfFxcXFwufGBbXmBdKmB8W15cXFtcXF1cXFxcYF0pKj8vO1xuY29uc3QgbGluayA9IGVkaXQoL14hP1xcWyhsYWJlbClcXF1cXChcXHMqKGhyZWYpKD86XFxzKyh0aXRsZSkpP1xccypcXCkvKVxuICAgIC5yZXBsYWNlKCdsYWJlbCcsIF9pbmxpbmVMYWJlbClcbiAgICAucmVwbGFjZSgnaHJlZicsIC88KD86XFxcXC58W15cXG48PlxcXFxdKSs+fFteXFxzXFx4MDAtXFx4MWZdKi8pXG4gICAgLnJlcGxhY2UoJ3RpdGxlJywgL1wiKD86XFxcXFwiP3xbXlwiXFxcXF0pKlwifCcoPzpcXFxcJz98W14nXFxcXF0pKid8XFwoKD86XFxcXFxcKT98W14pXFxcXF0pKlxcKS8pXG4gICAgLmdldFJlZ2V4KCk7XG5jb25zdCByZWZsaW5rID0gZWRpdCgvXiE/XFxbKGxhYmVsKVxcXVxcWyhyZWYpXFxdLylcbiAgICAucmVwbGFjZSgnbGFiZWwnLCBfaW5saW5lTGFiZWwpXG4gICAgLnJlcGxhY2UoJ3JlZicsIF9ibG9ja0xhYmVsKVxuICAgIC5nZXRSZWdleCgpO1xuY29uc3Qgbm9saW5rID0gZWRpdCgvXiE/XFxbKHJlZilcXF0oPzpcXFtcXF0pPy8pXG4gICAgLnJlcGxhY2UoJ3JlZicsIF9ibG9ja0xhYmVsKVxuICAgIC5nZXRSZWdleCgpO1xuY29uc3QgcmVmbGlua1NlYXJjaCA9IGVkaXQoJ3JlZmxpbmt8bm9saW5rKD8hXFxcXCgpJywgJ2cnKVxuICAgIC5yZXBsYWNlKCdyZWZsaW5rJywgcmVmbGluaylcbiAgICAucmVwbGFjZSgnbm9saW5rJywgbm9saW5rKVxuICAgIC5nZXRSZWdleCgpO1xuLyoqXG4gKiBOb3JtYWwgSW5saW5lIEdyYW1tYXJcbiAqL1xuY29uc3QgaW5saW5lTm9ybWFsID0ge1xuICAgIF9iYWNrcGVkYWw6IG5vb3BUZXN0LCAvLyBvbmx5IHVzZWQgZm9yIEdGTSB1cmxcbiAgICBhbnlQdW5jdHVhdGlvbixcbiAgICBhdXRvbGluayxcbiAgICBibG9ja1NraXAsXG4gICAgYnIsXG4gICAgY29kZTogaW5saW5lQ29kZSxcbiAgICBkZWw6IG5vb3BUZXN0LFxuICAgIGVtU3Ryb25nTERlbGltLFxuICAgIGVtU3Ryb25nUkRlbGltQXN0LFxuICAgIGVtU3Ryb25nUkRlbGltVW5kLFxuICAgIGVzY2FwZSxcbiAgICBsaW5rLFxuICAgIG5vbGluayxcbiAgICBwdW5jdHVhdGlvbixcbiAgICByZWZsaW5rLFxuICAgIHJlZmxpbmtTZWFyY2gsXG4gICAgdGFnLFxuICAgIHRleHQ6IGlubGluZVRleHQsXG4gICAgdXJsOiBub29wVGVzdFxufTtcbi8qKlxuICogUGVkYW50aWMgSW5saW5lIEdyYW1tYXJcbiAqL1xuY29uc3QgaW5saW5lUGVkYW50aWMgPSB7XG4gICAgLi4uaW5saW5lTm9ybWFsLFxuICAgIGxpbms6IGVkaXQoL14hP1xcWyhsYWJlbClcXF1cXCgoLio/KVxcKS8pXG4gICAgICAgIC5yZXBsYWNlKCdsYWJlbCcsIF9pbmxpbmVMYWJlbClcbiAgICAgICAgLmdldFJlZ2V4KCksXG4gICAgcmVmbGluazogZWRpdCgvXiE/XFxbKGxhYmVsKVxcXVxccypcXFsoW15cXF1dKilcXF0vKVxuICAgICAgICAucmVwbGFjZSgnbGFiZWwnLCBfaW5saW5lTGFiZWwpXG4gICAgICAgIC5nZXRSZWdleCgpXG59O1xuLyoqXG4gKiBHRk0gSW5saW5lIEdyYW1tYXJcbiAqL1xuY29uc3QgaW5saW5lR2ZtID0ge1xuICAgIC4uLmlubGluZU5vcm1hbCxcbiAgICBlc2NhcGU6IGVkaXQoZXNjYXBlKS5yZXBsYWNlKCddKScsICd+fF0pJykuZ2V0UmVnZXgoKSxcbiAgICB1cmw6IGVkaXQoL14oKD86ZnRwfGh0dHBzPyk6XFwvXFwvfHd3d1xcLikoPzpbYS16QS1aMC05XFwtXStcXC4/KStbXlxcczxdKnxeZW1haWwvLCAnaScpXG4gICAgICAgIC5yZXBsYWNlKCdlbWFpbCcsIC9bQS1aYS16MC05Ll8rLV0rKEApW2EtekEtWjAtOS1fXSsoPzpcXC5bYS16QS1aMC05LV9dKlthLXpBLVowLTldKSsoPyFbLV9dKS8pXG4gICAgICAgIC5nZXRSZWdleCgpLFxuICAgIF9iYWNrcGVkYWw6IC8oPzpbXj8hLiw6OypfJ1wifigpJl0rfFxcKFteKV0qXFwpfCYoPyFbYS16QS1aMC05XSs7JCl8Wz8hLiw6OypfJ1wifildKyg/ISQpKSsvLFxuICAgIGRlbDogL14ofn4/KSg/PVteXFxzfl0pKFtcXHNcXFNdKj9bXlxcc35dKVxcMSg/PVtefl18JCkvLFxuICAgIHRleHQ6IC9eKFtgfl0rfFteYH5dKSg/Oig/PSB7Mix9XFxuKXwoPz1bYS16QS1aMC05LiEjJCUmJyorXFwvPT9fYHtcXHx9fi1dK0ApfFtcXHNcXFNdKj8oPzooPz1bXFxcXDwhXFxbYCp+X118XFxiX3xodHRwcz86XFwvXFwvfGZ0cDpcXC9cXC98d3d3XFwufCQpfFteIF0oPz0gezIsfVxcbil8W15hLXpBLVowLTkuISMkJSYnKitcXC89P19ge1xcfH1+LV0oPz1bYS16QS1aMC05LiEjJCUmJyorXFwvPT9fYHtcXHx9fi1dK0ApKSkvXG59O1xuLyoqXG4gKiBHRk0gKyBMaW5lIEJyZWFrcyBJbmxpbmUgR3JhbW1hclxuICovXG5jb25zdCBpbmxpbmVCcmVha3MgPSB7XG4gICAgLi4uaW5saW5lR2ZtLFxuICAgIGJyOiBlZGl0KGJyKS5yZXBsYWNlKCd7Mix9JywgJyonKS5nZXRSZWdleCgpLFxuICAgIHRleHQ6IGVkaXQoaW5saW5lR2ZtLnRleHQpXG4gICAgICAgIC5yZXBsYWNlKCdcXFxcYl8nLCAnXFxcXGJffCB7Mix9XFxcXG4nKVxuICAgICAgICAucmVwbGFjZSgvXFx7MixcXH0vZywgJyonKVxuICAgICAgICAuZ2V0UmVnZXgoKVxufTtcbi8qKlxuICogZXhwb3J0c1xuICovXG5leHBvcnQgY29uc3QgYmxvY2sgPSB7XG4gICAgbm9ybWFsOiBibG9ja05vcm1hbCxcbiAgICBnZm06IGJsb2NrR2ZtLFxuICAgIHBlZGFudGljOiBibG9ja1BlZGFudGljXG59O1xuZXhwb3J0IGNvbnN0IGlubGluZSA9IHtcbiAgICBub3JtYWw6IGlubGluZU5vcm1hbCxcbiAgICBnZm06IGlubGluZUdmbSxcbiAgICBicmVha3M6IGlubGluZUJyZWFrcyxcbiAgICBwZWRhbnRpYzogaW5saW5lUGVkYW50aWNcbn07XG4iLCAiaW1wb3J0IHsgX1Rva2VuaXplciB9IGZyb20gJy4vVG9rZW5pemVyLnRzJztcbmltcG9ydCB7IF9kZWZhdWx0cyB9IGZyb20gJy4vZGVmYXVsdHMudHMnO1xuaW1wb3J0IHsgYmxvY2ssIGlubGluZSB9IGZyb20gJy4vcnVsZXMudHMnO1xuLyoqXG4gKiBCbG9jayBMZXhlclxuICovXG5leHBvcnQgY2xhc3MgX0xleGVyIHtcbiAgICB0b2tlbnM7XG4gICAgb3B0aW9ucztcbiAgICBzdGF0ZTtcbiAgICB0b2tlbml6ZXI7XG4gICAgaW5saW5lUXVldWU7XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgICAvLyBUb2tlbkxpc3QgY2Fubm90IGJlIGNyZWF0ZWQgaW4gb25lIGdvXG4gICAgICAgIHRoaXMudG9rZW5zID0gW107XG4gICAgICAgIHRoaXMudG9rZW5zLmxpbmtzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCBfZGVmYXVsdHM7XG4gICAgICAgIHRoaXMub3B0aW9ucy50b2tlbml6ZXIgPSB0aGlzLm9wdGlvbnMudG9rZW5pemVyIHx8IG5ldyBfVG9rZW5pemVyKCk7XG4gICAgICAgIHRoaXMudG9rZW5pemVyID0gdGhpcy5vcHRpb25zLnRva2VuaXplcjtcbiAgICAgICAgdGhpcy50b2tlbml6ZXIub3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgdGhpcy50b2tlbml6ZXIubGV4ZXIgPSB0aGlzO1xuICAgICAgICB0aGlzLmlubGluZVF1ZXVlID0gW107XG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBpbkxpbms6IGZhbHNlLFxuICAgICAgICAgICAgaW5SYXdCbG9jazogZmFsc2UsXG4gICAgICAgICAgICB0b3A6IHRydWVcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcnVsZXMgPSB7XG4gICAgICAgICAgICBibG9jazogYmxvY2subm9ybWFsLFxuICAgICAgICAgICAgaW5saW5lOiBpbmxpbmUubm9ybWFsXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMucGVkYW50aWMpIHtcbiAgICAgICAgICAgIHJ1bGVzLmJsb2NrID0gYmxvY2sucGVkYW50aWM7XG4gICAgICAgICAgICBydWxlcy5pbmxpbmUgPSBpbmxpbmUucGVkYW50aWM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLmdmbSkge1xuICAgICAgICAgICAgcnVsZXMuYmxvY2sgPSBibG9jay5nZm07XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJyZWFrcykge1xuICAgICAgICAgICAgICAgIHJ1bGVzLmlubGluZSA9IGlubGluZS5icmVha3M7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBydWxlcy5pbmxpbmUgPSBpbmxpbmUuZ2ZtO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMudG9rZW5pemVyLnJ1bGVzID0gcnVsZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV4cG9zZSBSdWxlc1xuICAgICAqL1xuICAgIHN0YXRpYyBnZXQgcnVsZXMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBibG9jayxcbiAgICAgICAgICAgIGlubGluZVxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdGF0aWMgTGV4IE1ldGhvZFxuICAgICAqL1xuICAgIHN0YXRpYyBsZXgoc3JjLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGxleGVyID0gbmV3IF9MZXhlcihvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIGxleGVyLmxleChzcmMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdGF0aWMgTGV4IElubGluZSBNZXRob2RcbiAgICAgKi9cbiAgICBzdGF0aWMgbGV4SW5saW5lKHNyYywgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBsZXhlciA9IG5ldyBfTGV4ZXIob3B0aW9ucyk7XG4gICAgICAgIHJldHVybiBsZXhlci5pbmxpbmVUb2tlbnMoc3JjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUHJlcHJvY2Vzc2luZ1xuICAgICAqL1xuICAgIGxleChzcmMpIHtcbiAgICAgICAgc3JjID0gc3JjXG4gICAgICAgICAgICAucmVwbGFjZSgvXFxyXFxufFxcci9nLCAnXFxuJyk7XG4gICAgICAgIHRoaXMuYmxvY2tUb2tlbnMoc3JjLCB0aGlzLnRva2Vucyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5pbmxpbmVRdWV1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgbmV4dCA9IHRoaXMuaW5saW5lUXVldWVbaV07XG4gICAgICAgICAgICB0aGlzLmlubGluZVRva2VucyhuZXh0LnNyYywgbmV4dC50b2tlbnMpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5saW5lUXVldWUgPSBbXTtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9rZW5zO1xuICAgIH1cbiAgICBibG9ja1Rva2VucyhzcmMsIHRva2VucyA9IFtdKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMucGVkYW50aWMpIHtcbiAgICAgICAgICAgIHNyYyA9IHNyYy5yZXBsYWNlKC9cXHQvZywgJyAgICAnKS5yZXBsYWNlKC9eICskL2dtLCAnJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzcmMgPSBzcmMucmVwbGFjZSgvXiggKikoXFx0KykvZ20sIChfLCBsZWFkaW5nLCB0YWJzKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxlYWRpbmcgKyAnICAgICcucmVwZWF0KHRhYnMubGVuZ3RoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGxldCB0b2tlbjtcbiAgICAgICAgbGV0IGxhc3RUb2tlbjtcbiAgICAgICAgbGV0IGN1dFNyYztcbiAgICAgICAgbGV0IGxhc3RQYXJhZ3JhcGhDbGlwcGVkO1xuICAgICAgICB3aGlsZSAoc3JjKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmV4dGVuc2lvbnNcbiAgICAgICAgICAgICAgICAmJiB0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5ibG9ja1xuICAgICAgICAgICAgICAgICYmIHRoaXMub3B0aW9ucy5leHRlbnNpb25zLmJsb2NrLnNvbWUoKGV4dFRva2VuaXplcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4gPSBleHRUb2tlbml6ZXIuY2FsbCh7IGxleGVyOiB0aGlzIH0sIHNyYywgdG9rZW5zKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9KSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gbmV3bGluZVxuICAgICAgICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIuc3BhY2Uoc3JjKSkge1xuICAgICAgICAgICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgaWYgKHRva2VuLnJhdy5sZW5ndGggPT09IDEgJiYgdG9rZW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUncyBhIHNpbmdsZSBcXG4gYXMgYSBzcGFjZXIsIGl0J3MgdGVybWluYXRpbmcgdGhlIGxhc3QgbGluZSxcbiAgICAgICAgICAgICAgICAgICAgLy8gc28gbW92ZSBpdCB0aGVyZSBzbyB0aGF0IHdlIGRvbid0IGdldCB1bm5lY2Vzc2FyeSBwYXJhZ3JhcGggdGFnc1xuICAgICAgICAgICAgICAgICAgICB0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDFdLnJhdyArPSAnXFxuJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBjb2RlXG4gICAgICAgICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5jb2RlKHNyYykpIHtcbiAgICAgICAgICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIGxhc3RUb2tlbiA9IHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgLy8gQW4gaW5kZW50ZWQgY29kZSBibG9jayBjYW5ub3QgaW50ZXJydXB0IGEgcGFyYWdyYXBoLlxuICAgICAgICAgICAgICAgIGlmIChsYXN0VG9rZW4gJiYgKGxhc3RUb2tlbi50eXBlID09PSAncGFyYWdyYXBoJyB8fCBsYXN0VG9rZW4udHlwZSA9PT0gJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgICAgICBsYXN0VG9rZW4ucmF3ICs9ICdcXG4nICsgdG9rZW4ucmF3O1xuICAgICAgICAgICAgICAgICAgICBsYXN0VG9rZW4udGV4dCArPSAnXFxuJyArIHRva2VuLnRleHQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5saW5lUXVldWVbdGhpcy5pbmxpbmVRdWV1ZS5sZW5ndGggLSAxXS5zcmMgPSBsYXN0VG9rZW4udGV4dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBmZW5jZXNcbiAgICAgICAgICAgIGlmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLmZlbmNlcyhzcmMpKSB7XG4gICAgICAgICAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBoZWFkaW5nXG4gICAgICAgICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5oZWFkaW5nKHNyYykpIHtcbiAgICAgICAgICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGhyXG4gICAgICAgICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5ocihzcmMpKSB7XG4gICAgICAgICAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBibG9ja3F1b3RlXG4gICAgICAgICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5ibG9ja3F1b3RlKHNyYykpIHtcbiAgICAgICAgICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGxpc3RcbiAgICAgICAgICAgIGlmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLmxpc3Qoc3JjKSkge1xuICAgICAgICAgICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaHRtbFxuICAgICAgICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIuaHRtbChzcmMpKSB7XG4gICAgICAgICAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBkZWZcbiAgICAgICAgICAgIGlmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLmRlZihzcmMpKSB7XG4gICAgICAgICAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBsYXN0VG9rZW4gPSB0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgIGlmIChsYXN0VG9rZW4gJiYgKGxhc3RUb2tlbi50eXBlID09PSAncGFyYWdyYXBoJyB8fCBsYXN0VG9rZW4udHlwZSA9PT0gJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgICAgICBsYXN0VG9rZW4ucmF3ICs9ICdcXG4nICsgdG9rZW4ucmF3O1xuICAgICAgICAgICAgICAgICAgICBsYXN0VG9rZW4udGV4dCArPSAnXFxuJyArIHRva2VuLnJhdztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmxpbmVRdWV1ZVt0aGlzLmlubGluZVF1ZXVlLmxlbmd0aCAtIDFdLnNyYyA9IGxhc3RUb2tlbi50ZXh0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICghdGhpcy50b2tlbnMubGlua3NbdG9rZW4udGFnXSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRva2Vucy5saW5rc1t0b2tlbi50YWddID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaHJlZjogdG9rZW4uaHJlZixcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0b2tlbi50aXRsZVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHRhYmxlIChnZm0pXG4gICAgICAgICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci50YWJsZShzcmMpKSB7XG4gICAgICAgICAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBsaGVhZGluZ1xuICAgICAgICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIubGhlYWRpbmcoc3JjKSkge1xuICAgICAgICAgICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gdG9wLWxldmVsIHBhcmFncmFwaFxuICAgICAgICAgICAgLy8gcHJldmVudCBwYXJhZ3JhcGggY29uc3VtaW5nIGV4dGVuc2lvbnMgYnkgY2xpcHBpbmcgJ3NyYycgdG8gZXh0ZW5zaW9uIHN0YXJ0XG4gICAgICAgICAgICBjdXRTcmMgPSBzcmM7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmV4dGVuc2lvbnMgJiYgdGhpcy5vcHRpb25zLmV4dGVuc2lvbnMuc3RhcnRCbG9jaykge1xuICAgICAgICAgICAgICAgIGxldCBzdGFydEluZGV4ID0gSW5maW5pdHk7XG4gICAgICAgICAgICAgICAgY29uc3QgdGVtcFNyYyA9IHNyYy5zbGljZSgxKTtcbiAgICAgICAgICAgICAgICBsZXQgdGVtcFN0YXJ0O1xuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5leHRlbnNpb25zLnN0YXJ0QmxvY2suZm9yRWFjaCgoZ2V0U3RhcnRJbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0ZW1wU3RhcnQgPSBnZXRTdGFydEluZGV4LmNhbGwoeyBsZXhlcjogdGhpcyB9LCB0ZW1wU3JjKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0ZW1wU3RhcnQgPT09ICdudW1iZXInICYmIHRlbXBTdGFydCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydEluZGV4ID0gTWF0aC5taW4oc3RhcnRJbmRleCwgdGVtcFN0YXJ0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChzdGFydEluZGV4IDwgSW5maW5pdHkgJiYgc3RhcnRJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1dFNyYyA9IHNyYy5zdWJzdHJpbmcoMCwgc3RhcnRJbmRleCArIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnN0YXRlLnRvcCAmJiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5wYXJhZ3JhcGgoY3V0U3JjKSkpIHtcbiAgICAgICAgICAgICAgICBsYXN0VG9rZW4gPSB0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgIGlmIChsYXN0UGFyYWdyYXBoQ2xpcHBlZCAmJiBsYXN0VG9rZW4udHlwZSA9PT0gJ3BhcmFncmFwaCcpIHtcbiAgICAgICAgICAgICAgICAgICAgbGFzdFRva2VuLnJhdyArPSAnXFxuJyArIHRva2VuLnJhdztcbiAgICAgICAgICAgICAgICAgICAgbGFzdFRva2VuLnRleHQgKz0gJ1xcbicgKyB0b2tlbi50ZXh0O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlubGluZVF1ZXVlLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlubGluZVF1ZXVlW3RoaXMuaW5saW5lUXVldWUubGVuZ3RoIC0gMV0uc3JjID0gbGFzdFRva2VuLnRleHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxhc3RQYXJhZ3JhcGhDbGlwcGVkID0gKGN1dFNyYy5sZW5ndGggIT09IHNyYy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB0ZXh0XG4gICAgICAgICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci50ZXh0KHNyYykpIHtcbiAgICAgICAgICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIGxhc3RUb2tlbiA9IHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgaWYgKGxhc3RUb2tlbiAmJiBsYXN0VG9rZW4udHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGxhc3RUb2tlbi5yYXcgKz0gJ1xcbicgKyB0b2tlbi5yYXc7XG4gICAgICAgICAgICAgICAgICAgIGxhc3RUb2tlbi50ZXh0ICs9ICdcXG4nICsgdG9rZW4udGV4dDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmxpbmVRdWV1ZS5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmxpbmVRdWV1ZVt0aGlzLmlubGluZVF1ZXVlLmxlbmd0aCAtIDFdLnNyYyA9IGxhc3RUb2tlbi50ZXh0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzcmMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJNc2cgPSAnSW5maW5pdGUgbG9vcCBvbiBieXRlOiAnICsgc3JjLmNoYXJDb2RlQXQoMCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJNc2cpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJNc2cpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0YXRlLnRvcCA9IHRydWU7XG4gICAgICAgIHJldHVybiB0b2tlbnM7XG4gICAgfVxuICAgIGlubGluZShzcmMsIHRva2VucyA9IFtdKSB7XG4gICAgICAgIHRoaXMuaW5saW5lUXVldWUucHVzaCh7IHNyYywgdG9rZW5zIH0pO1xuICAgICAgICByZXR1cm4gdG9rZW5zO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBMZXhpbmcvQ29tcGlsaW5nXG4gICAgICovXG4gICAgaW5saW5lVG9rZW5zKHNyYywgdG9rZW5zID0gW10pIHtcbiAgICAgICAgbGV0IHRva2VuLCBsYXN0VG9rZW4sIGN1dFNyYztcbiAgICAgICAgLy8gU3RyaW5nIHdpdGggbGlua3MgbWFza2VkIHRvIGF2b2lkIGludGVyZmVyZW5jZSB3aXRoIGVtIGFuZCBzdHJvbmdcbiAgICAgICAgbGV0IG1hc2tlZFNyYyA9IHNyYztcbiAgICAgICAgbGV0IG1hdGNoO1xuICAgICAgICBsZXQga2VlcFByZXZDaGFyLCBwcmV2Q2hhcjtcbiAgICAgICAgLy8gTWFzayBvdXQgcmVmbGlua3NcbiAgICAgICAgaWYgKHRoaXMudG9rZW5zLmxpbmtzKSB7XG4gICAgICAgICAgICBjb25zdCBsaW5rcyA9IE9iamVjdC5rZXlzKHRoaXMudG9rZW5zLmxpbmtzKTtcbiAgICAgICAgICAgIGlmIChsaW5rcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKChtYXRjaCA9IHRoaXMudG9rZW5pemVyLnJ1bGVzLmlubGluZS5yZWZsaW5rU2VhcmNoLmV4ZWMobWFza2VkU3JjKSkgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobGlua3MuaW5jbHVkZXMobWF0Y2hbMF0uc2xpY2UobWF0Y2hbMF0ubGFzdEluZGV4T2YoJ1snKSArIDEsIC0xKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tlZFNyYyA9IG1hc2tlZFNyYy5zbGljZSgwLCBtYXRjaC5pbmRleCkgKyAnWycgKyAnYScucmVwZWF0KG1hdGNoWzBdLmxlbmd0aCAtIDIpICsgJ10nICsgbWFza2VkU3JjLnNsaWNlKHRoaXMudG9rZW5pemVyLnJ1bGVzLmlubGluZS5yZWZsaW5rU2VhcmNoLmxhc3RJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gTWFzayBvdXQgb3RoZXIgYmxvY2tzXG4gICAgICAgIHdoaWxlICgobWF0Y2ggPSB0aGlzLnRva2VuaXplci5ydWxlcy5pbmxpbmUuYmxvY2tTa2lwLmV4ZWMobWFza2VkU3JjKSkgIT0gbnVsbCkge1xuICAgICAgICAgICAgbWFza2VkU3JjID0gbWFza2VkU3JjLnNsaWNlKDAsIG1hdGNoLmluZGV4KSArICdbJyArICdhJy5yZXBlYXQobWF0Y2hbMF0ubGVuZ3RoIC0gMikgKyAnXScgKyBtYXNrZWRTcmMuc2xpY2UodGhpcy50b2tlbml6ZXIucnVsZXMuaW5saW5lLmJsb2NrU2tpcC5sYXN0SW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIE1hc2sgb3V0IGVzY2FwZWQgY2hhcmFjdGVyc1xuICAgICAgICB3aGlsZSAoKG1hdGNoID0gdGhpcy50b2tlbml6ZXIucnVsZXMuaW5saW5lLmFueVB1bmN0dWF0aW9uLmV4ZWMobWFza2VkU3JjKSkgIT0gbnVsbCkge1xuICAgICAgICAgICAgbWFza2VkU3JjID0gbWFza2VkU3JjLnNsaWNlKDAsIG1hdGNoLmluZGV4KSArICcrKycgKyBtYXNrZWRTcmMuc2xpY2UodGhpcy50b2tlbml6ZXIucnVsZXMuaW5saW5lLmFueVB1bmN0dWF0aW9uLmxhc3RJbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKHNyYykge1xuICAgICAgICAgICAgaWYgKCFrZWVwUHJldkNoYXIpIHtcbiAgICAgICAgICAgICAgICBwcmV2Q2hhciA9ICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAga2VlcFByZXZDaGFyID0gZmFsc2U7XG4gICAgICAgICAgICAvLyBleHRlbnNpb25zXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmV4dGVuc2lvbnNcbiAgICAgICAgICAgICAgICAmJiB0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5pbmxpbmVcbiAgICAgICAgICAgICAgICAmJiB0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5pbmxpbmUuc29tZSgoZXh0VG9rZW5pemVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbiA9IGV4dFRva2VuaXplci5jYWxsKHsgbGV4ZXI6IHRoaXMgfSwgc3JjLCB0b2tlbnMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH0pKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBlc2NhcGVcbiAgICAgICAgICAgIGlmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLmVzY2FwZShzcmMpKSB7XG4gICAgICAgICAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB0YWdcbiAgICAgICAgICAgIGlmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLnRhZyhzcmMpKSB7XG4gICAgICAgICAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBsYXN0VG9rZW4gPSB0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgIGlmIChsYXN0VG9rZW4gJiYgdG9rZW4udHlwZSA9PT0gJ3RleHQnICYmIGxhc3RUb2tlbi50eXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgICAgICAgICAgICAgbGFzdFRva2VuLnJhdyArPSB0b2tlbi5yYXc7XG4gICAgICAgICAgICAgICAgICAgIGxhc3RUb2tlbi50ZXh0ICs9IHRva2VuLnRleHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gbGlua1xuICAgICAgICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIubGluayhzcmMpKSB7XG4gICAgICAgICAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyByZWZsaW5rLCBub2xpbmtcbiAgICAgICAgICAgIGlmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLnJlZmxpbmsoc3JjLCB0aGlzLnRva2Vucy5saW5rcykpIHtcbiAgICAgICAgICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIGxhc3RUb2tlbiA9IHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgaWYgKGxhc3RUb2tlbiAmJiB0b2tlbi50eXBlID09PSAndGV4dCcgJiYgbGFzdFRva2VuLnR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgICAgICAgICAgICAgICBsYXN0VG9rZW4ucmF3ICs9IHRva2VuLnJhdztcbiAgICAgICAgICAgICAgICAgICAgbGFzdFRva2VuLnRleHQgKz0gdG9rZW4udGV4dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBlbSAmIHN0cm9uZ1xuICAgICAgICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIuZW1TdHJvbmcoc3JjLCBtYXNrZWRTcmMsIHByZXZDaGFyKSkge1xuICAgICAgICAgICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY29kZVxuICAgICAgICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIuY29kZXNwYW4oc3JjKSkge1xuICAgICAgICAgICAgICAgIHNyYyA9IHNyYy5zdWJzdHJpbmcodG9rZW4ucmF3Lmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gYnJcbiAgICAgICAgICAgIGlmICh0b2tlbiA9IHRoaXMudG9rZW5pemVyLmJyKHNyYykpIHtcbiAgICAgICAgICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGRlbCAoZ2ZtKVxuICAgICAgICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIuZGVsKHNyYykpIHtcbiAgICAgICAgICAgICAgICBzcmMgPSBzcmMuc3Vic3RyaW5nKHRva2VuLnJhdy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGF1dG9saW5rXG4gICAgICAgICAgICBpZiAodG9rZW4gPSB0aGlzLnRva2VuaXplci5hdXRvbGluayhzcmMpKSB7XG4gICAgICAgICAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB1cmwgKGdmbSlcbiAgICAgICAgICAgIGlmICghdGhpcy5zdGF0ZS5pbkxpbmsgJiYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIudXJsKHNyYykpKSB7XG4gICAgICAgICAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB0ZXh0XG4gICAgICAgICAgICAvLyBwcmV2ZW50IGlubGluZVRleHQgY29uc3VtaW5nIGV4dGVuc2lvbnMgYnkgY2xpcHBpbmcgJ3NyYycgdG8gZXh0ZW5zaW9uIHN0YXJ0XG4gICAgICAgICAgICBjdXRTcmMgPSBzcmM7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmV4dGVuc2lvbnMgJiYgdGhpcy5vcHRpb25zLmV4dGVuc2lvbnMuc3RhcnRJbmxpbmUpIHtcbiAgICAgICAgICAgICAgICBsZXQgc3RhcnRJbmRleCA9IEluZmluaXR5O1xuICAgICAgICAgICAgICAgIGNvbnN0IHRlbXBTcmMgPSBzcmMuc2xpY2UoMSk7XG4gICAgICAgICAgICAgICAgbGV0IHRlbXBTdGFydDtcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5zdGFydElubGluZS5mb3JFYWNoKChnZXRTdGFydEluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRlbXBTdGFydCA9IGdldFN0YXJ0SW5kZXguY2FsbCh7IGxleGVyOiB0aGlzIH0sIHRlbXBTcmMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRlbXBTdGFydCA9PT0gJ251bWJlcicgJiYgdGVtcFN0YXJ0ID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0SW5kZXggPSBNYXRoLm1pbihzdGFydEluZGV4LCB0ZW1wU3RhcnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXJ0SW5kZXggPCBJbmZpbml0eSAmJiBzdGFydEluZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY3V0U3JjID0gc3JjLnN1YnN0cmluZygwLCBzdGFydEluZGV4ICsgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRva2VuID0gdGhpcy50b2tlbml6ZXIuaW5saW5lVGV4dChjdXRTcmMpKSB7XG4gICAgICAgICAgICAgICAgc3JjID0gc3JjLnN1YnN0cmluZyh0b2tlbi5yYXcubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBpZiAodG9rZW4ucmF3LnNsaWNlKC0xKSAhPT0gJ18nKSB7IC8vIFRyYWNrIHByZXZDaGFyIGJlZm9yZSBzdHJpbmcgb2YgX19fXyBzdGFydGVkXG4gICAgICAgICAgICAgICAgICAgIHByZXZDaGFyID0gdG9rZW4ucmF3LnNsaWNlKC0xKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAga2VlcFByZXZDaGFyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBsYXN0VG9rZW4gPSB0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgIGlmIChsYXN0VG9rZW4gJiYgbGFzdFRva2VuLnR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgICAgICAgICAgICAgICBsYXN0VG9rZW4ucmF3ICs9IHRva2VuLnJhdztcbiAgICAgICAgICAgICAgICAgICAgbGFzdFRva2VuLnRleHQgKz0gdG9rZW4udGV4dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3JjKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyTXNnID0gJ0luZmluaXRlIGxvb3Agb24gYnl0ZTogJyArIHNyYy5jaGFyQ29kZUF0KDApO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyTXNnKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyTXNnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRva2VucztcbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgX2RlZmF1bHRzIH0gZnJvbSAnLi9kZWZhdWx0cy50cyc7XG5pbXBvcnQgeyBjbGVhblVybCwgZXNjYXBlIH0gZnJvbSAnLi9oZWxwZXJzLnRzJztcbi8qKlxuICogUmVuZGVyZXJcbiAqL1xuZXhwb3J0IGNsYXNzIF9SZW5kZXJlciB7XG4gICAgb3B0aW9ucztcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwgX2RlZmF1bHRzO1xuICAgIH1cbiAgICBjb2RlKGNvZGUsIGluZm9zdHJpbmcsIGVzY2FwZWQpIHtcbiAgICAgICAgY29uc3QgbGFuZyA9IChpbmZvc3RyaW5nIHx8ICcnKS5tYXRjaCgvXlxcUyovKT8uWzBdO1xuICAgICAgICBjb2RlID0gY29kZS5yZXBsYWNlKC9cXG4kLywgJycpICsgJ1xcbic7XG4gICAgICAgIGlmICghbGFuZykge1xuICAgICAgICAgICAgcmV0dXJuICc8cHJlPjxjb2RlPidcbiAgICAgICAgICAgICAgICArIChlc2NhcGVkID8gY29kZSA6IGVzY2FwZShjb2RlLCB0cnVlKSlcbiAgICAgICAgICAgICAgICArICc8L2NvZGU+PC9wcmU+XFxuJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJzxwcmU+PGNvZGUgY2xhc3M9XCJsYW5ndWFnZS0nXG4gICAgICAgICAgICArIGVzY2FwZShsYW5nKVxuICAgICAgICAgICAgKyAnXCI+J1xuICAgICAgICAgICAgKyAoZXNjYXBlZCA/IGNvZGUgOiBlc2NhcGUoY29kZSwgdHJ1ZSkpXG4gICAgICAgICAgICArICc8L2NvZGU+PC9wcmU+XFxuJztcbiAgICB9XG4gICAgYmxvY2txdW90ZShxdW90ZSkge1xuICAgICAgICByZXR1cm4gYDxibG9ja3F1b3RlPlxcbiR7cXVvdGV9PC9ibG9ja3F1b3RlPlxcbmA7XG4gICAgfVxuICAgIGh0bWwoaHRtbCwgYmxvY2spIHtcbiAgICAgICAgcmV0dXJuIGh0bWw7XG4gICAgfVxuICAgIGhlYWRpbmcodGV4dCwgbGV2ZWwsIHJhdykge1xuICAgICAgICAvLyBpZ25vcmUgSURzXG4gICAgICAgIHJldHVybiBgPGgke2xldmVsfT4ke3RleHR9PC9oJHtsZXZlbH0+XFxuYDtcbiAgICB9XG4gICAgaHIoKSB7XG4gICAgICAgIHJldHVybiAnPGhyPlxcbic7XG4gICAgfVxuICAgIGxpc3QoYm9keSwgb3JkZXJlZCwgc3RhcnQpIHtcbiAgICAgICAgY29uc3QgdHlwZSA9IG9yZGVyZWQgPyAnb2wnIDogJ3VsJztcbiAgICAgICAgY29uc3Qgc3RhcnRhdHQgPSAob3JkZXJlZCAmJiBzdGFydCAhPT0gMSkgPyAoJyBzdGFydD1cIicgKyBzdGFydCArICdcIicpIDogJyc7XG4gICAgICAgIHJldHVybiAnPCcgKyB0eXBlICsgc3RhcnRhdHQgKyAnPlxcbicgKyBib2R5ICsgJzwvJyArIHR5cGUgKyAnPlxcbic7XG4gICAgfVxuICAgIGxpc3RpdGVtKHRleHQsIHRhc2ssIGNoZWNrZWQpIHtcbiAgICAgICAgcmV0dXJuIGA8bGk+JHt0ZXh0fTwvbGk+XFxuYDtcbiAgICB9XG4gICAgY2hlY2tib3goY2hlY2tlZCkge1xuICAgICAgICByZXR1cm4gJzxpbnB1dCAnXG4gICAgICAgICAgICArIChjaGVja2VkID8gJ2NoZWNrZWQ9XCJcIiAnIDogJycpXG4gICAgICAgICAgICArICdkaXNhYmxlZD1cIlwiIHR5cGU9XCJjaGVja2JveFwiPic7XG4gICAgfVxuICAgIHBhcmFncmFwaCh0ZXh0KSB7XG4gICAgICAgIHJldHVybiBgPHA+JHt0ZXh0fTwvcD5cXG5gO1xuICAgIH1cbiAgICB0YWJsZShoZWFkZXIsIGJvZHkpIHtcbiAgICAgICAgaWYgKGJvZHkpXG4gICAgICAgICAgICBib2R5ID0gYDx0Ym9keT4ke2JvZHl9PC90Ym9keT5gO1xuICAgICAgICByZXR1cm4gJzx0YWJsZT5cXG4nXG4gICAgICAgICAgICArICc8dGhlYWQ+XFxuJ1xuICAgICAgICAgICAgKyBoZWFkZXJcbiAgICAgICAgICAgICsgJzwvdGhlYWQ+XFxuJ1xuICAgICAgICAgICAgKyBib2R5XG4gICAgICAgICAgICArICc8L3RhYmxlPlxcbic7XG4gICAgfVxuICAgIHRhYmxlcm93KGNvbnRlbnQpIHtcbiAgICAgICAgcmV0dXJuIGA8dHI+XFxuJHtjb250ZW50fTwvdHI+XFxuYDtcbiAgICB9XG4gICAgdGFibGVjZWxsKGNvbnRlbnQsIGZsYWdzKSB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBmbGFncy5oZWFkZXIgPyAndGgnIDogJ3RkJztcbiAgICAgICAgY29uc3QgdGFnID0gZmxhZ3MuYWxpZ25cbiAgICAgICAgICAgID8gYDwke3R5cGV9IGFsaWduPVwiJHtmbGFncy5hbGlnbn1cIj5gXG4gICAgICAgICAgICA6IGA8JHt0eXBlfT5gO1xuICAgICAgICByZXR1cm4gdGFnICsgY29udGVudCArIGA8LyR7dHlwZX0+XFxuYDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogc3BhbiBsZXZlbCByZW5kZXJlclxuICAgICAqL1xuICAgIHN0cm9uZyh0ZXh0KSB7XG4gICAgICAgIHJldHVybiBgPHN0cm9uZz4ke3RleHR9PC9zdHJvbmc+YDtcbiAgICB9XG4gICAgZW0odGV4dCkge1xuICAgICAgICByZXR1cm4gYDxlbT4ke3RleHR9PC9lbT5gO1xuICAgIH1cbiAgICBjb2Rlc3Bhbih0ZXh0KSB7XG4gICAgICAgIHJldHVybiBgPGNvZGU+JHt0ZXh0fTwvY29kZT5gO1xuICAgIH1cbiAgICBicigpIHtcbiAgICAgICAgcmV0dXJuICc8YnI+JztcbiAgICB9XG4gICAgZGVsKHRleHQpIHtcbiAgICAgICAgcmV0dXJuIGA8ZGVsPiR7dGV4dH08L2RlbD5gO1xuICAgIH1cbiAgICBsaW5rKGhyZWYsIHRpdGxlLCB0ZXh0KSB7XG4gICAgICAgIGNvbnN0IGNsZWFuSHJlZiA9IGNsZWFuVXJsKGhyZWYpO1xuICAgICAgICBpZiAoY2xlYW5IcmVmID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGV4dDtcbiAgICAgICAgfVxuICAgICAgICBocmVmID0gY2xlYW5IcmVmO1xuICAgICAgICBsZXQgb3V0ID0gJzxhIGhyZWY9XCInICsgaHJlZiArICdcIic7XG4gICAgICAgIGlmICh0aXRsZSkge1xuICAgICAgICAgICAgb3V0ICs9ICcgdGl0bGU9XCInICsgdGl0bGUgKyAnXCInO1xuICAgICAgICB9XG4gICAgICAgIG91dCArPSAnPicgKyB0ZXh0ICsgJzwvYT4nO1xuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cbiAgICBpbWFnZShocmVmLCB0aXRsZSwgdGV4dCkge1xuICAgICAgICBjb25zdCBjbGVhbkhyZWYgPSBjbGVhblVybChocmVmKTtcbiAgICAgICAgaWYgKGNsZWFuSHJlZiA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgaHJlZiA9IGNsZWFuSHJlZjtcbiAgICAgICAgbGV0IG91dCA9IGA8aW1nIHNyYz1cIiR7aHJlZn1cIiBhbHQ9XCIke3RleHR9XCJgO1xuICAgICAgICBpZiAodGl0bGUpIHtcbiAgICAgICAgICAgIG91dCArPSBgIHRpdGxlPVwiJHt0aXRsZX1cImA7XG4gICAgICAgIH1cbiAgICAgICAgb3V0ICs9ICc+JztcbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG4gICAgdGV4dCh0ZXh0KSB7XG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cbn1cbiIsICIvKipcbiAqIFRleHRSZW5kZXJlclxuICogcmV0dXJucyBvbmx5IHRoZSB0ZXh0dWFsIHBhcnQgb2YgdGhlIHRva2VuXG4gKi9cbmV4cG9ydCBjbGFzcyBfVGV4dFJlbmRlcmVyIHtcbiAgICAvLyBubyBuZWVkIGZvciBibG9jayBsZXZlbCByZW5kZXJlcnNcbiAgICBzdHJvbmcodGV4dCkge1xuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG4gICAgZW0odGV4dCkge1xuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG4gICAgY29kZXNwYW4odGV4dCkge1xuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG4gICAgZGVsKHRleHQpIHtcbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuICAgIGh0bWwodGV4dCkge1xuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG4gICAgdGV4dCh0ZXh0KSB7XG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cbiAgICBsaW5rKGhyZWYsIHRpdGxlLCB0ZXh0KSB7XG4gICAgICAgIHJldHVybiAnJyArIHRleHQ7XG4gICAgfVxuICAgIGltYWdlKGhyZWYsIHRpdGxlLCB0ZXh0KSB7XG4gICAgICAgIHJldHVybiAnJyArIHRleHQ7XG4gICAgfVxuICAgIGJyKCkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxufVxuIiwgImltcG9ydCB7IF9SZW5kZXJlciB9IGZyb20gJy4vUmVuZGVyZXIudHMnO1xuaW1wb3J0IHsgX1RleHRSZW5kZXJlciB9IGZyb20gJy4vVGV4dFJlbmRlcmVyLnRzJztcbmltcG9ydCB7IF9kZWZhdWx0cyB9IGZyb20gJy4vZGVmYXVsdHMudHMnO1xuaW1wb3J0IHsgdW5lc2NhcGUgfSBmcm9tICcuL2hlbHBlcnMudHMnO1xuLyoqXG4gKiBQYXJzaW5nICYgQ29tcGlsaW5nXG4gKi9cbmV4cG9ydCBjbGFzcyBfUGFyc2VyIHtcbiAgICBvcHRpb25zO1xuICAgIHJlbmRlcmVyO1xuICAgIHRleHRSZW5kZXJlcjtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwgX2RlZmF1bHRzO1xuICAgICAgICB0aGlzLm9wdGlvbnMucmVuZGVyZXIgPSB0aGlzLm9wdGlvbnMucmVuZGVyZXIgfHwgbmV3IF9SZW5kZXJlcigpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyID0gdGhpcy5vcHRpb25zLnJlbmRlcmVyO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLm9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIHRoaXMudGV4dFJlbmRlcmVyID0gbmV3IF9UZXh0UmVuZGVyZXIoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3RhdGljIFBhcnNlIE1ldGhvZFxuICAgICAqL1xuICAgIHN0YXRpYyBwYXJzZSh0b2tlbnMsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgcGFyc2VyID0gbmV3IF9QYXJzZXIob3B0aW9ucyk7XG4gICAgICAgIHJldHVybiBwYXJzZXIucGFyc2UodG9rZW5zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3RhdGljIFBhcnNlIElubGluZSBNZXRob2RcbiAgICAgKi9cbiAgICBzdGF0aWMgcGFyc2VJbmxpbmUodG9rZW5zLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBfUGFyc2VyKG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gcGFyc2VyLnBhcnNlSW5saW5lKHRva2Vucyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFBhcnNlIExvb3BcbiAgICAgKi9cbiAgICBwYXJzZSh0b2tlbnMsIHRvcCA9IHRydWUpIHtcbiAgICAgICAgbGV0IG91dCA9ICcnO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbaV07XG4gICAgICAgICAgICAvLyBSdW4gYW55IHJlbmRlcmVyIGV4dGVuc2lvbnNcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucyAmJiB0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5yZW5kZXJlcnMgJiYgdGhpcy5vcHRpb25zLmV4dGVuc2lvbnMucmVuZGVyZXJzW3Rva2VuLnR5cGVdKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZ2VuZXJpY1Rva2VuID0gdG9rZW47XG4gICAgICAgICAgICAgICAgY29uc3QgcmV0ID0gdGhpcy5vcHRpb25zLmV4dGVuc2lvbnMucmVuZGVyZXJzW2dlbmVyaWNUb2tlbi50eXBlXS5jYWxsKHsgcGFyc2VyOiB0aGlzIH0sIGdlbmVyaWNUb2tlbik7XG4gICAgICAgICAgICAgICAgaWYgKHJldCAhPT0gZmFsc2UgfHwgIVsnc3BhY2UnLCAnaHInLCAnaGVhZGluZycsICdjb2RlJywgJ3RhYmxlJywgJ2Jsb2NrcXVvdGUnLCAnbGlzdCcsICdodG1sJywgJ3BhcmFncmFwaCcsICd0ZXh0J10uaW5jbHVkZXMoZ2VuZXJpY1Rva2VuLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIG91dCArPSByZXQgfHwgJyc7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN3aXRjaCAodG9rZW4udHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ3NwYWNlJzoge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAnaHInOiB7XG4gICAgICAgICAgICAgICAgICAgIG91dCArPSB0aGlzLnJlbmRlcmVyLmhyKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlICdoZWFkaW5nJzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBoZWFkaW5nVG9rZW4gPSB0b2tlbjtcbiAgICAgICAgICAgICAgICAgICAgb3V0ICs9IHRoaXMucmVuZGVyZXIuaGVhZGluZyh0aGlzLnBhcnNlSW5saW5lKGhlYWRpbmdUb2tlbi50b2tlbnMpLCBoZWFkaW5nVG9rZW4uZGVwdGgsIHVuZXNjYXBlKHRoaXMucGFyc2VJbmxpbmUoaGVhZGluZ1Rva2VuLnRva2VucywgdGhpcy50ZXh0UmVuZGVyZXIpKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlICdjb2RlJzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb2RlVG9rZW4gPSB0b2tlbjtcbiAgICAgICAgICAgICAgICAgICAgb3V0ICs9IHRoaXMucmVuZGVyZXIuY29kZShjb2RlVG9rZW4udGV4dCwgY29kZVRva2VuLmxhbmcsICEhY29kZVRva2VuLmVzY2FwZWQpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAndGFibGUnOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhYmxlVG9rZW4gPSB0b2tlbjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGhlYWRlciA9ICcnO1xuICAgICAgICAgICAgICAgICAgICAvLyBoZWFkZXJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNlbGwgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0YWJsZVRva2VuLmhlYWRlci5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2VsbCArPSB0aGlzLnJlbmRlcmVyLnRhYmxlY2VsbCh0aGlzLnBhcnNlSW5saW5lKHRhYmxlVG9rZW4uaGVhZGVyW2pdLnRva2VucyksIHsgaGVhZGVyOiB0cnVlLCBhbGlnbjogdGFibGVUb2tlbi5hbGlnbltqXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBoZWFkZXIgKz0gdGhpcy5yZW5kZXJlci50YWJsZXJvdyhjZWxsKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJvZHkgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0YWJsZVRva2VuLnJvd3MubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvdyA9IHRhYmxlVG9rZW4ucm93c1tqXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgcm93Lmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbCArPSB0aGlzLnJlbmRlcmVyLnRhYmxlY2VsbCh0aGlzLnBhcnNlSW5saW5lKHJvd1trXS50b2tlbnMpLCB7IGhlYWRlcjogZmFsc2UsIGFsaWduOiB0YWJsZVRva2VuLmFsaWduW2tdIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keSArPSB0aGlzLnJlbmRlcmVyLnRhYmxlcm93KGNlbGwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG91dCArPSB0aGlzLnJlbmRlcmVyLnRhYmxlKGhlYWRlciwgYm9keSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlICdibG9ja3F1b3RlJzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBibG9ja3F1b3RlVG9rZW4gPSB0b2tlbjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IHRoaXMucGFyc2UoYmxvY2txdW90ZVRva2VuLnRva2Vucyk7XG4gICAgICAgICAgICAgICAgICAgIG91dCArPSB0aGlzLnJlbmRlcmVyLmJsb2NrcXVvdGUoYm9keSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlICdsaXN0Jzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsaXN0VG9rZW4gPSB0b2tlbjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3JkZXJlZCA9IGxpc3RUb2tlbi5vcmRlcmVkO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IGxpc3RUb2tlbi5zdGFydDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9vc2UgPSBsaXN0VG9rZW4ubG9vc2U7XG4gICAgICAgICAgICAgICAgICAgIGxldCBib2R5ID0gJyc7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbGlzdFRva2VuLml0ZW1zLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gbGlzdFRva2VuLml0ZW1zW2pdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hlY2tlZCA9IGl0ZW0uY2hlY2tlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhc2sgPSBpdGVtLnRhc2s7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaXRlbUJvZHkgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLnRhc2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGVja2JveCA9IHRoaXMucmVuZGVyZXIuY2hlY2tib3goISFjaGVja2VkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9vc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0udG9rZW5zLmxlbmd0aCA+IDAgJiYgaXRlbS50b2tlbnNbMF0udHlwZSA9PT0gJ3BhcmFncmFwaCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0udG9rZW5zWzBdLnRleHQgPSBjaGVja2JveCArICcgJyArIGl0ZW0udG9rZW5zWzBdLnRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS50b2tlbnNbMF0udG9rZW5zICYmIGl0ZW0udG9rZW5zWzBdLnRva2Vucy5sZW5ndGggPiAwICYmIGl0ZW0udG9rZW5zWzBdLnRva2Vuc1swXS50eXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnRva2Vuc1swXS50b2tlbnNbMF0udGV4dCA9IGNoZWNrYm94ICsgJyAnICsgaXRlbS50b2tlbnNbMF0udG9rZW5zWzBdLnRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnRva2Vucy51bnNoaWZ0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogY2hlY2tib3ggKyAnICdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtQm9keSArPSBjaGVja2JveCArICcgJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtQm9keSArPSB0aGlzLnBhcnNlKGl0ZW0udG9rZW5zLCBsb29zZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5ICs9IHRoaXMucmVuZGVyZXIubGlzdGl0ZW0oaXRlbUJvZHksIHRhc2ssICEhY2hlY2tlZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgb3V0ICs9IHRoaXMucmVuZGVyZXIubGlzdChib2R5LCBvcmRlcmVkLCBzdGFydCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlICdodG1sJzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBodG1sVG9rZW4gPSB0b2tlbjtcbiAgICAgICAgICAgICAgICAgICAgb3V0ICs9IHRoaXMucmVuZGVyZXIuaHRtbChodG1sVG9rZW4udGV4dCwgaHRtbFRva2VuLmJsb2NrKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgJ3BhcmFncmFwaCc6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyYWdyYXBoVG9rZW4gPSB0b2tlbjtcbiAgICAgICAgICAgICAgICAgICAgb3V0ICs9IHRoaXMucmVuZGVyZXIucGFyYWdyYXBoKHRoaXMucGFyc2VJbmxpbmUocGFyYWdyYXBoVG9rZW4udG9rZW5zKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlICd0ZXh0Jzoge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dFRva2VuID0gdG9rZW47XG4gICAgICAgICAgICAgICAgICAgIGxldCBib2R5ID0gdGV4dFRva2VuLnRva2VucyA/IHRoaXMucGFyc2VJbmxpbmUodGV4dFRva2VuLnRva2VucykgOiB0ZXh0VG9rZW4udGV4dDtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGkgKyAxIDwgdG9rZW5zLmxlbmd0aCAmJiB0b2tlbnNbaSArIDFdLnR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dFRva2VuID0gdG9rZW5zWysraV07XG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5ICs9ICdcXG4nICsgKHRleHRUb2tlbi50b2tlbnMgPyB0aGlzLnBhcnNlSW5saW5lKHRleHRUb2tlbi50b2tlbnMpIDogdGV4dFRva2VuLnRleHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG91dCArPSB0b3AgPyB0aGlzLnJlbmRlcmVyLnBhcmFncmFwaChib2R5KSA6IGJvZHk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVyck1zZyA9ICdUb2tlbiB3aXRoIFwiJyArIHRva2VuLnR5cGUgKyAnXCIgdHlwZSB3YXMgbm90IGZvdW5kLic7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVyck1zZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyTXNnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQYXJzZSBJbmxpbmUgVG9rZW5zXG4gICAgICovXG4gICAgcGFyc2VJbmxpbmUodG9rZW5zLCByZW5kZXJlcikge1xuICAgICAgICByZW5kZXJlciA9IHJlbmRlcmVyIHx8IHRoaXMucmVuZGVyZXI7XG4gICAgICAgIGxldCBvdXQgPSAnJztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHRva2VuID0gdG9rZW5zW2ldO1xuICAgICAgICAgICAgLy8gUnVuIGFueSByZW5kZXJlciBleHRlbnNpb25zXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmV4dGVuc2lvbnMgJiYgdGhpcy5vcHRpb25zLmV4dGVuc2lvbnMucmVuZGVyZXJzICYmIHRoaXMub3B0aW9ucy5leHRlbnNpb25zLnJlbmRlcmVyc1t0b2tlbi50eXBlXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJldCA9IHRoaXMub3B0aW9ucy5leHRlbnNpb25zLnJlbmRlcmVyc1t0b2tlbi50eXBlXS5jYWxsKHsgcGFyc2VyOiB0aGlzIH0sIHRva2VuKTtcbiAgICAgICAgICAgICAgICBpZiAocmV0ICE9PSBmYWxzZSB8fCAhWydlc2NhcGUnLCAnaHRtbCcsICdsaW5rJywgJ2ltYWdlJywgJ3N0cm9uZycsICdlbScsICdjb2Rlc3BhbicsICdicicsICdkZWwnLCAndGV4dCddLmluY2x1ZGVzKHRva2VuLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIG91dCArPSByZXQgfHwgJyc7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN3aXRjaCAodG9rZW4udHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2VzY2FwZSc6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXNjYXBlVG9rZW4gPSB0b2tlbjtcbiAgICAgICAgICAgICAgICAgICAgb3V0ICs9IHJlbmRlcmVyLnRleHQoZXNjYXBlVG9rZW4udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlICdodG1sJzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YWdUb2tlbiA9IHRva2VuO1xuICAgICAgICAgICAgICAgICAgICBvdXQgKz0gcmVuZGVyZXIuaHRtbCh0YWdUb2tlbi50ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgJ2xpbmsnOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpbmtUb2tlbiA9IHRva2VuO1xuICAgICAgICAgICAgICAgICAgICBvdXQgKz0gcmVuZGVyZXIubGluayhsaW5rVG9rZW4uaHJlZiwgbGlua1Rva2VuLnRpdGxlLCB0aGlzLnBhcnNlSW5saW5lKGxpbmtUb2tlbi50b2tlbnMsIHJlbmRlcmVyKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlICdpbWFnZSc6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW1hZ2VUb2tlbiA9IHRva2VuO1xuICAgICAgICAgICAgICAgICAgICBvdXQgKz0gcmVuZGVyZXIuaW1hZ2UoaW1hZ2VUb2tlbi5ocmVmLCBpbWFnZVRva2VuLnRpdGxlLCBpbWFnZVRva2VuLnRleHQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAnc3Ryb25nJzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJvbmdUb2tlbiA9IHRva2VuO1xuICAgICAgICAgICAgICAgICAgICBvdXQgKz0gcmVuZGVyZXIuc3Ryb25nKHRoaXMucGFyc2VJbmxpbmUoc3Ryb25nVG9rZW4udG9rZW5zLCByZW5kZXJlcikpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAnZW0nOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVtVG9rZW4gPSB0b2tlbjtcbiAgICAgICAgICAgICAgICAgICAgb3V0ICs9IHJlbmRlcmVyLmVtKHRoaXMucGFyc2VJbmxpbmUoZW1Ub2tlbi50b2tlbnMsIHJlbmRlcmVyKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlICdjb2Rlc3Bhbic6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29kZXNwYW5Ub2tlbiA9IHRva2VuO1xuICAgICAgICAgICAgICAgICAgICBvdXQgKz0gcmVuZGVyZXIuY29kZXNwYW4oY29kZXNwYW5Ub2tlbi50ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgJ2JyJzoge1xuICAgICAgICAgICAgICAgICAgICBvdXQgKz0gcmVuZGVyZXIuYnIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgJ2RlbCc6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVsVG9rZW4gPSB0b2tlbjtcbiAgICAgICAgICAgICAgICAgICAgb3V0ICs9IHJlbmRlcmVyLmRlbCh0aGlzLnBhcnNlSW5saW5lKGRlbFRva2VuLnRva2VucywgcmVuZGVyZXIpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgJ3RleHQnOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHRUb2tlbiA9IHRva2VuO1xuICAgICAgICAgICAgICAgICAgICBvdXQgKz0gcmVuZGVyZXIudGV4dCh0ZXh0VG9rZW4udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVyck1zZyA9ICdUb2tlbiB3aXRoIFwiJyArIHRva2VuLnR5cGUgKyAnXCIgdHlwZSB3YXMgbm90IGZvdW5kLic7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVyck1zZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyTXNnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBfZGVmYXVsdHMgfSBmcm9tICcuL2RlZmF1bHRzLnRzJztcbmV4cG9ydCBjbGFzcyBfSG9va3Mge1xuICAgIG9wdGlvbnM7XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IF9kZWZhdWx0cztcbiAgICB9XG4gICAgc3RhdGljIHBhc3NUaHJvdWdoSG9va3MgPSBuZXcgU2V0KFtcbiAgICAgICAgJ3ByZXByb2Nlc3MnLFxuICAgICAgICAncG9zdHByb2Nlc3MnLFxuICAgICAgICAncHJvY2Vzc0FsbFRva2VucydcbiAgICBdKTtcbiAgICAvKipcbiAgICAgKiBQcm9jZXNzIG1hcmtkb3duIGJlZm9yZSBtYXJrZWRcbiAgICAgKi9cbiAgICBwcmVwcm9jZXNzKG1hcmtkb3duKSB7XG4gICAgICAgIHJldHVybiBtYXJrZG93bjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUHJvY2VzcyBIVE1MIGFmdGVyIG1hcmtlZCBpcyBmaW5pc2hlZFxuICAgICAqL1xuICAgIHBvc3Rwcm9jZXNzKGh0bWwpIHtcbiAgICAgICAgcmV0dXJuIGh0bWw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByb2Nlc3MgYWxsIHRva2VucyBiZWZvcmUgd2FsayB0b2tlbnNcbiAgICAgKi9cbiAgICBwcm9jZXNzQWxsVG9rZW5zKHRva2Vucykge1xuICAgICAgICByZXR1cm4gdG9rZW5zO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgeyBfZ2V0RGVmYXVsdHMgfSBmcm9tICcuL2RlZmF1bHRzLnRzJztcbmltcG9ydCB7IF9MZXhlciB9IGZyb20gJy4vTGV4ZXIudHMnO1xuaW1wb3J0IHsgX1BhcnNlciB9IGZyb20gJy4vUGFyc2VyLnRzJztcbmltcG9ydCB7IF9Ib29rcyB9IGZyb20gJy4vSG9va3MudHMnO1xuaW1wb3J0IHsgX1JlbmRlcmVyIH0gZnJvbSAnLi9SZW5kZXJlci50cyc7XG5pbXBvcnQgeyBfVG9rZW5pemVyIH0gZnJvbSAnLi9Ub2tlbml6ZXIudHMnO1xuaW1wb3J0IHsgX1RleHRSZW5kZXJlciB9IGZyb20gJy4vVGV4dFJlbmRlcmVyLnRzJztcbmltcG9ydCB7IGVzY2FwZSB9IGZyb20gJy4vaGVscGVycy50cyc7XG5leHBvcnQgY2xhc3MgTWFya2VkIHtcbiAgICBkZWZhdWx0cyA9IF9nZXREZWZhdWx0cygpO1xuICAgIG9wdGlvbnMgPSB0aGlzLnNldE9wdGlvbnM7XG4gICAgcGFyc2UgPSB0aGlzLiNwYXJzZU1hcmtkb3duKF9MZXhlci5sZXgsIF9QYXJzZXIucGFyc2UpO1xuICAgIHBhcnNlSW5saW5lID0gdGhpcy4jcGFyc2VNYXJrZG93bihfTGV4ZXIubGV4SW5saW5lLCBfUGFyc2VyLnBhcnNlSW5saW5lKTtcbiAgICBQYXJzZXIgPSBfUGFyc2VyO1xuICAgIFJlbmRlcmVyID0gX1JlbmRlcmVyO1xuICAgIFRleHRSZW5kZXJlciA9IF9UZXh0UmVuZGVyZXI7XG4gICAgTGV4ZXIgPSBfTGV4ZXI7XG4gICAgVG9rZW5pemVyID0gX1Rva2VuaXplcjtcbiAgICBIb29rcyA9IF9Ib29rcztcbiAgICBjb25zdHJ1Y3RvciguLi5hcmdzKSB7XG4gICAgICAgIHRoaXMudXNlKC4uLmFyZ3MpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSdW4gY2FsbGJhY2sgZm9yIGV2ZXJ5IHRva2VuXG4gICAgICovXG4gICAgd2Fsa1Rva2Vucyh0b2tlbnMsIGNhbGxiYWNrKSB7XG4gICAgICAgIGxldCB2YWx1ZXMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCB0b2tlbiBvZiB0b2tlbnMpIHtcbiAgICAgICAgICAgIHZhbHVlcyA9IHZhbHVlcy5jb25jYXQoY2FsbGJhY2suY2FsbCh0aGlzLCB0b2tlbikpO1xuICAgICAgICAgICAgc3dpdGNoICh0b2tlbi50eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAndGFibGUnOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhYmxlVG9rZW4gPSB0b2tlbjtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBjZWxsIG9mIHRhYmxlVG9rZW4uaGVhZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSB2YWx1ZXMuY29uY2F0KHRoaXMud2Fsa1Rva2VucyhjZWxsLnRva2VucywgY2FsbGJhY2spKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHJvdyBvZiB0YWJsZVRva2VuLnJvd3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY2VsbCBvZiByb3cpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSB2YWx1ZXMuY29uY2F0KHRoaXMud2Fsa1Rva2VucyhjZWxsLnRva2VucywgY2FsbGJhY2spKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAnbGlzdCc6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGlzdFRva2VuID0gdG9rZW47XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IHZhbHVlcy5jb25jYXQodGhpcy53YWxrVG9rZW5zKGxpc3RUb2tlbi5pdGVtcywgY2FsbGJhY2spKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2VuZXJpY1Rva2VuID0gdG9rZW47XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlZmF1bHRzLmV4dGVuc2lvbnM/LmNoaWxkVG9rZW5zPy5bZ2VuZXJpY1Rva2VuLnR5cGVdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRzLmV4dGVuc2lvbnMuY2hpbGRUb2tlbnNbZ2VuZXJpY1Rva2VuLnR5cGVdLmZvckVhY2goKGNoaWxkVG9rZW5zKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9rZW5zID0gZ2VuZXJpY1Rva2VuW2NoaWxkVG9rZW5zXS5mbGF0KEluZmluaXR5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSB2YWx1ZXMuY29uY2F0KHRoaXMud2Fsa1Rva2Vucyh0b2tlbnMsIGNhbGxiYWNrKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChnZW5lcmljVG9rZW4udG9rZW5zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSB2YWx1ZXMuY29uY2F0KHRoaXMud2Fsa1Rva2VucyhnZW5lcmljVG9rZW4udG9rZW5zLCBjYWxsYmFjaykpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZXM7XG4gICAgfVxuICAgIHVzZSguLi5hcmdzKSB7XG4gICAgICAgIGNvbnN0IGV4dGVuc2lvbnMgPSB0aGlzLmRlZmF1bHRzLmV4dGVuc2lvbnMgfHwgeyByZW5kZXJlcnM6IHt9LCBjaGlsZFRva2Vuczoge30gfTtcbiAgICAgICAgYXJncy5mb3JFYWNoKChwYWNrKSA9PiB7XG4gICAgICAgICAgICAvLyBjb3B5IG9wdGlvbnMgdG8gbmV3IG9iamVjdFxuICAgICAgICAgICAgY29uc3Qgb3B0cyA9IHsgLi4ucGFjayB9O1xuICAgICAgICAgICAgLy8gc2V0IGFzeW5jIHRvIHRydWUgaWYgaXQgd2FzIHNldCB0byB0cnVlIGJlZm9yZVxuICAgICAgICAgICAgb3B0cy5hc3luYyA9IHRoaXMuZGVmYXVsdHMuYXN5bmMgfHwgb3B0cy5hc3luYyB8fCBmYWxzZTtcbiAgICAgICAgICAgIC8vID09LS0gUGFyc2UgXCJhZGRvblwiIGV4dGVuc2lvbnMgLS09PSAvL1xuICAgICAgICAgICAgaWYgKHBhY2suZXh0ZW5zaW9ucykge1xuICAgICAgICAgICAgICAgIHBhY2suZXh0ZW5zaW9ucy5mb3JFYWNoKChleHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFleHQubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHRlbnNpb24gbmFtZSByZXF1aXJlZCcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICgncmVuZGVyZXInIGluIGV4dCkgeyAvLyBSZW5kZXJlciBleHRlbnNpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcmV2UmVuZGVyZXIgPSBleHRlbnNpb25zLnJlbmRlcmVyc1tleHQubmFtZV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldlJlbmRlcmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVwbGFjZSBleHRlbnNpb24gd2l0aCBmdW5jIHRvIHJ1biBuZXcgZXh0ZW5zaW9uIGJ1dCBmYWxsIGJhY2sgaWYgZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25zLnJlbmRlcmVyc1tleHQubmFtZV0gPSBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmV0ID0gZXh0LnJlbmRlcmVyLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gcHJldlJlbmRlcmVyLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMucmVuZGVyZXJzW2V4dC5uYW1lXSA9IGV4dC5yZW5kZXJlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoJ3Rva2VuaXplcicgaW4gZXh0KSB7IC8vIFRva2VuaXplciBFeHRlbnNpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWV4dC5sZXZlbCB8fCAoZXh0LmxldmVsICE9PSAnYmxvY2snICYmIGV4dC5sZXZlbCAhPT0gJ2lubGluZScpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZXh0ZW5zaW9uIGxldmVsIG11c3QgYmUgJ2Jsb2NrJyBvciAnaW5saW5lJ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4dExldmVsID0gZXh0ZW5zaW9uc1tleHQubGV2ZWxdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4dExldmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0TGV2ZWwudW5zaGlmdChleHQudG9rZW5pemVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbnNbZXh0LmxldmVsXSA9IFtleHQudG9rZW5pemVyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleHQuc3RhcnQpIHsgLy8gRnVuY3Rpb24gdG8gY2hlY2sgZm9yIHN0YXJ0IG9mIHRva2VuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4dC5sZXZlbCA9PT0gJ2Jsb2NrJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXh0ZW5zaW9ucy5zdGFydEJsb2NrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25zLnN0YXJ0QmxvY2sucHVzaChleHQuc3RhcnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9ucy5zdGFydEJsb2NrID0gW2V4dC5zdGFydF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXh0LmxldmVsID09PSAnaW5saW5lJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXh0ZW5zaW9ucy5zdGFydElubGluZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9ucy5zdGFydElubGluZS5wdXNoKGV4dC5zdGFydCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25zLnN0YXJ0SW5saW5lID0gW2V4dC5zdGFydF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCdjaGlsZFRva2VucycgaW4gZXh0ICYmIGV4dC5jaGlsZFRva2VucykgeyAvLyBDaGlsZCB0b2tlbnMgdG8gYmUgdmlzaXRlZCBieSB3YWxrVG9rZW5zXG4gICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25zLmNoaWxkVG9rZW5zW2V4dC5uYW1lXSA9IGV4dC5jaGlsZFRva2VucztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIG9wdHMuZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyA9PS0tIFBhcnNlIFwib3ZlcndyaXRlXCIgZXh0ZW5zaW9ucyAtLT09IC8vXG4gICAgICAgICAgICBpZiAocGFjay5yZW5kZXJlcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlbmRlcmVyID0gdGhpcy5kZWZhdWx0cy5yZW5kZXJlciB8fCBuZXcgX1JlbmRlcmVyKHRoaXMuZGVmYXVsdHMpO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBwYWNrLnJlbmRlcmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghKHByb3AgaW4gcmVuZGVyZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHJlbmRlcmVyICcke3Byb3B9JyBkb2VzIG5vdCBleGlzdGApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wID09PSAnb3B0aW9ucycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBvcHRpb25zIHByb3BlcnR5XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZW5kZXJlclByb3AgPSBwcm9wO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZW5kZXJlckZ1bmMgPSBwYWNrLnJlbmRlcmVyW3JlbmRlcmVyUHJvcF07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZXZSZW5kZXJlciA9IHJlbmRlcmVyW3JlbmRlcmVyUHJvcF07XG4gICAgICAgICAgICAgICAgICAgIC8vIFJlcGxhY2UgcmVuZGVyZXIgd2l0aCBmdW5jIHRvIHJ1biBleHRlbnNpb24sIGJ1dCBmYWxsIGJhY2sgaWYgZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXJbcmVuZGVyZXJQcm9wXSA9ICguLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmV0ID0gcmVuZGVyZXJGdW5jLmFwcGx5KHJlbmRlcmVyLCBhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gcHJldlJlbmRlcmVyLmFwcGx5KHJlbmRlcmVyLCBhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQgfHwgJyc7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG9wdHMucmVuZGVyZXIgPSByZW5kZXJlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYWNrLnRva2VuaXplcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRva2VuaXplciA9IHRoaXMuZGVmYXVsdHMudG9rZW5pemVyIHx8IG5ldyBfVG9rZW5pemVyKHRoaXMuZGVmYXVsdHMpO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBwYWNrLnRva2VuaXplcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIShwcm9wIGluIHRva2VuaXplcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgdG9rZW5pemVyICcke3Byb3B9JyBkb2VzIG5vdCBleGlzdGApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChbJ29wdGlvbnMnLCAncnVsZXMnLCAnbGV4ZXInXS5pbmNsdWRlcyhwcm9wKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIG9wdGlvbnMsIHJ1bGVzLCBhbmQgbGV4ZXIgcHJvcGVydGllc1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9rZW5pemVyUHJvcCA9IHByb3A7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRva2VuaXplckZ1bmMgPSBwYWNrLnRva2VuaXplclt0b2tlbml6ZXJQcm9wXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJldlRva2VuaXplciA9IHRva2VuaXplclt0b2tlbml6ZXJQcm9wXTtcbiAgICAgICAgICAgICAgICAgICAgLy8gUmVwbGFjZSB0b2tlbml6ZXIgd2l0aCBmdW5jIHRvIHJ1biBleHRlbnNpb24sIGJ1dCBmYWxsIGJhY2sgaWYgZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBjYW5ub3QgdHlwZSB0b2tlbml6ZXIgZnVuY3Rpb24gZHluYW1pY2FsbHlcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5pemVyW3Rva2VuaXplclByb3BdID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXQgPSB0b2tlbml6ZXJGdW5jLmFwcGx5KHRva2VuaXplciwgYXJncyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHByZXZUb2tlbml6ZXIuYXBwbHkodG9rZW5pemVyLCBhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG9wdHMudG9rZW5pemVyID0gdG9rZW5pemVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gPT0tLSBQYXJzZSBIb29rcyBleHRlbnNpb25zIC0tPT0gLy9cbiAgICAgICAgICAgIGlmIChwYWNrLmhvb2tzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaG9va3MgPSB0aGlzLmRlZmF1bHRzLmhvb2tzIHx8IG5ldyBfSG9va3MoKTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHByb3AgaW4gcGFjay5ob29rcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIShwcm9wIGluIGhvb2tzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBob29rICcke3Byb3B9JyBkb2VzIG5vdCBleGlzdGApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wID09PSAnb3B0aW9ucycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBvcHRpb25zIHByb3BlcnR5XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBob29rc1Byb3AgPSBwcm9wO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBob29rc0Z1bmMgPSBwYWNrLmhvb2tzW2hvb2tzUHJvcF07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZXZIb29rID0gaG9va3NbaG9va3NQcm9wXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF9Ib29rcy5wYXNzVGhyb3VnaEhvb2tzLmhhcyhwcm9wKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBjYW5ub3QgdHlwZSBob29rIGZ1bmN0aW9uIGR5bmFtaWNhbGx5XG4gICAgICAgICAgICAgICAgICAgICAgICBob29rc1tob29rc1Byb3BdID0gKGFyZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlZmF1bHRzLmFzeW5jKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoaG9va3NGdW5jLmNhbGwoaG9va3MsIGFyZykpLnRoZW4ocmV0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcmV2SG9vay5jYWxsKGhvb2tzLCByZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmV0ID0gaG9va3NGdW5jLmNhbGwoaG9va3MsIGFyZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByZXZIb29rLmNhbGwoaG9va3MsIHJldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBjYW5ub3QgdHlwZSBob29rIGZ1bmN0aW9uIGR5bmFtaWNhbGx5XG4gICAgICAgICAgICAgICAgICAgICAgICBob29rc1tob29rc1Byb3BdID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmV0ID0gaG9va3NGdW5jLmFwcGx5KGhvb2tzLCBhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBwcmV2SG9vay5hcHBseShob29rcywgYXJncyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG9wdHMuaG9va3MgPSBob29rcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vID09LS0gUGFyc2UgV2Fsa1Rva2VucyBleHRlbnNpb25zIC0tPT0gLy9cbiAgICAgICAgICAgIGlmIChwYWNrLndhbGtUb2tlbnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB3YWxrVG9rZW5zID0gdGhpcy5kZWZhdWx0cy53YWxrVG9rZW5zO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhY2tXYWxrdG9rZW5zID0gcGFjay53YWxrVG9rZW5zO1xuICAgICAgICAgICAgICAgIG9wdHMud2Fsa1Rva2VucyA9IGZ1bmN0aW9uICh0b2tlbikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWVzID0gW107XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXNoKHBhY2tXYWxrdG9rZW5zLmNhbGwodGhpcywgdG9rZW4pKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdhbGtUb2tlbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IHZhbHVlcy5jb25jYXQod2Fsa1Rva2Vucy5jYWxsKHRoaXMsIHRva2VuKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlcztcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5kZWZhdWx0cyA9IHsgLi4udGhpcy5kZWZhdWx0cywgLi4ub3B0cyB9O1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHNldE9wdGlvbnMob3B0KSB7XG4gICAgICAgIHRoaXMuZGVmYXVsdHMgPSB7IC4uLnRoaXMuZGVmYXVsdHMsIC4uLm9wdCB9O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgbGV4ZXIoc3JjLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBfTGV4ZXIubGV4KHNyYywgb3B0aW9ucyA/PyB0aGlzLmRlZmF1bHRzKTtcbiAgICB9XG4gICAgcGFyc2VyKHRva2Vucywgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gX1BhcnNlci5wYXJzZSh0b2tlbnMsIG9wdGlvbnMgPz8gdGhpcy5kZWZhdWx0cyk7XG4gICAgfVxuICAgICNwYXJzZU1hcmtkb3duKGxleGVyLCBwYXJzZXIpIHtcbiAgICAgICAgcmV0dXJuIChzcmMsIG9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG9yaWdPcHQgPSB7IC4uLm9wdGlvbnMgfTtcbiAgICAgICAgICAgIGNvbnN0IG9wdCA9IHsgLi4udGhpcy5kZWZhdWx0cywgLi4ub3JpZ09wdCB9O1xuICAgICAgICAgICAgLy8gU2hvdyB3YXJuaW5nIGlmIGFuIGV4dGVuc2lvbiBzZXQgYXN5bmMgdG8gdHJ1ZSBidXQgdGhlIHBhcnNlIHdhcyBjYWxsZWQgd2l0aCBhc3luYzogZmFsc2VcbiAgICAgICAgICAgIGlmICh0aGlzLmRlZmF1bHRzLmFzeW5jID09PSB0cnVlICYmIG9yaWdPcHQuYXN5bmMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFvcHQuc2lsZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignbWFya2VkKCk6IFRoZSBhc3luYyBvcHRpb24gd2FzIHNldCB0byB0cnVlIGJ5IGFuIGV4dGVuc2lvbi4gVGhlIGFzeW5jOiBmYWxzZSBvcHRpb24gc2VudCB0byBwYXJzZSB3aWxsIGJlIGlnbm9yZWQuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG9wdC5hc3luYyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB0aHJvd0Vycm9yID0gdGhpcy4jb25FcnJvcighIW9wdC5zaWxlbnQsICEhb3B0LmFzeW5jKTtcbiAgICAgICAgICAgIC8vIHRocm93IGVycm9yIGluIGNhc2Ugb2Ygbm9uIHN0cmluZyBpbnB1dFxuICAgICAgICAgICAgaWYgKHR5cGVvZiBzcmMgPT09ICd1bmRlZmluZWQnIHx8IHNyYyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKG5ldyBFcnJvcignbWFya2VkKCk6IGlucHV0IHBhcmFtZXRlciBpcyB1bmRlZmluZWQgb3IgbnVsbCcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc3JjICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKG5ldyBFcnJvcignbWFya2VkKCk6IGlucHV0IHBhcmFtZXRlciBpcyBvZiB0eXBlICdcbiAgICAgICAgICAgICAgICAgICAgKyBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoc3JjKSArICcsIHN0cmluZyBleHBlY3RlZCcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcHQuaG9va3MpIHtcbiAgICAgICAgICAgICAgICBvcHQuaG9va3Mub3B0aW9ucyA9IG9wdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcHQuYXN5bmMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG9wdC5ob29rcyA/IG9wdC5ob29rcy5wcmVwcm9jZXNzKHNyYykgOiBzcmMpXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKHNyYyA9PiBsZXhlcihzcmMsIG9wdCkpXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKHRva2VucyA9PiBvcHQuaG9va3MgPyBvcHQuaG9va3MucHJvY2Vzc0FsbFRva2Vucyh0b2tlbnMpIDogdG9rZW5zKVxuICAgICAgICAgICAgICAgICAgICAudGhlbih0b2tlbnMgPT4gb3B0LndhbGtUb2tlbnMgPyBQcm9taXNlLmFsbCh0aGlzLndhbGtUb2tlbnModG9rZW5zLCBvcHQud2Fsa1Rva2VucykpLnRoZW4oKCkgPT4gdG9rZW5zKSA6IHRva2VucylcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4odG9rZW5zID0+IHBhcnNlcih0b2tlbnMsIG9wdCkpXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKGh0bWwgPT4gb3B0Lmhvb2tzID8gb3B0Lmhvb2tzLnBvc3Rwcm9jZXNzKGh0bWwpIDogaHRtbClcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKHRocm93RXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAob3B0Lmhvb2tzKSB7XG4gICAgICAgICAgICAgICAgICAgIHNyYyA9IG9wdC5ob29rcy5wcmVwcm9jZXNzKHNyYyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCB0b2tlbnMgPSBsZXhlcihzcmMsIG9wdCk7XG4gICAgICAgICAgICAgICAgaWYgKG9wdC5ob29rcykge1xuICAgICAgICAgICAgICAgICAgICB0b2tlbnMgPSBvcHQuaG9va3MucHJvY2Vzc0FsbFRva2Vucyh0b2tlbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAob3B0LndhbGtUb2tlbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53YWxrVG9rZW5zKHRva2Vucywgb3B0LndhbGtUb2tlbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgaHRtbCA9IHBhcnNlcih0b2tlbnMsIG9wdCk7XG4gICAgICAgICAgICAgICAgaWYgKG9wdC5ob29rcykge1xuICAgICAgICAgICAgICAgICAgICBodG1sID0gb3B0Lmhvb2tzLnBvc3Rwcm9jZXNzKGh0bWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gaHRtbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuICAgICNvbkVycm9yKHNpbGVudCwgYXN5bmMpIHtcbiAgICAgICAgcmV0dXJuIChlKSA9PiB7XG4gICAgICAgICAgICBlLm1lc3NhZ2UgKz0gJ1xcblBsZWFzZSByZXBvcnQgdGhpcyB0byBodHRwczovL2dpdGh1Yi5jb20vbWFya2VkanMvbWFya2VkLic7XG4gICAgICAgICAgICBpZiAoc2lsZW50KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbXNnID0gJzxwPkFuIGVycm9yIG9jY3VycmVkOjwvcD48cHJlPidcbiAgICAgICAgICAgICAgICAgICAgKyBlc2NhcGUoZS5tZXNzYWdlICsgJycsIHRydWUpXG4gICAgICAgICAgICAgICAgICAgICsgJzwvcHJlPic7XG4gICAgICAgICAgICAgICAgaWYgKGFzeW5jKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobXNnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1zZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhc3luYykge1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH07XG4gICAgfVxufVxuIiwgImltcG9ydCB7IF9MZXhlciB9IGZyb20gJy4vTGV4ZXIudHMnO1xuaW1wb3J0IHsgX1BhcnNlciB9IGZyb20gJy4vUGFyc2VyLnRzJztcbmltcG9ydCB7IF9Ub2tlbml6ZXIgfSBmcm9tICcuL1Rva2VuaXplci50cyc7XG5pbXBvcnQgeyBfUmVuZGVyZXIgfSBmcm9tICcuL1JlbmRlcmVyLnRzJztcbmltcG9ydCB7IF9UZXh0UmVuZGVyZXIgfSBmcm9tICcuL1RleHRSZW5kZXJlci50cyc7XG5pbXBvcnQgeyBfSG9va3MgfSBmcm9tICcuL0hvb2tzLnRzJztcbmltcG9ydCB7IE1hcmtlZCB9IGZyb20gJy4vSW5zdGFuY2UudHMnO1xuaW1wb3J0IHsgX2dldERlZmF1bHRzLCBjaGFuZ2VEZWZhdWx0cywgX2RlZmF1bHRzIH0gZnJvbSAnLi9kZWZhdWx0cy50cyc7XG5jb25zdCBtYXJrZWRJbnN0YW5jZSA9IG5ldyBNYXJrZWQoKTtcbmV4cG9ydCBmdW5jdGlvbiBtYXJrZWQoc3JjLCBvcHQpIHtcbiAgICByZXR1cm4gbWFya2VkSW5zdGFuY2UucGFyc2Uoc3JjLCBvcHQpO1xufVxuLyoqXG4gKiBTZXRzIHRoZSBkZWZhdWx0IG9wdGlvbnMuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgSGFzaCBvZiBvcHRpb25zXG4gKi9cbm1hcmtlZC5vcHRpb25zID1cbiAgICBtYXJrZWQuc2V0T3B0aW9ucyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIG1hcmtlZEluc3RhbmNlLnNldE9wdGlvbnMob3B0aW9ucyk7XG4gICAgICAgIG1hcmtlZC5kZWZhdWx0cyA9IG1hcmtlZEluc3RhbmNlLmRlZmF1bHRzO1xuICAgICAgICBjaGFuZ2VEZWZhdWx0cyhtYXJrZWQuZGVmYXVsdHMpO1xuICAgICAgICByZXR1cm4gbWFya2VkO1xuICAgIH07XG4vKipcbiAqIEdldHMgdGhlIG9yaWdpbmFsIG1hcmtlZCBkZWZhdWx0IG9wdGlvbnMuXG4gKi9cbm1hcmtlZC5nZXREZWZhdWx0cyA9IF9nZXREZWZhdWx0cztcbm1hcmtlZC5kZWZhdWx0cyA9IF9kZWZhdWx0cztcbi8qKlxuICogVXNlIEV4dGVuc2lvblxuICovXG5tYXJrZWQudXNlID0gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICBtYXJrZWRJbnN0YW5jZS51c2UoLi4uYXJncyk7XG4gICAgbWFya2VkLmRlZmF1bHRzID0gbWFya2VkSW5zdGFuY2UuZGVmYXVsdHM7XG4gICAgY2hhbmdlRGVmYXVsdHMobWFya2VkLmRlZmF1bHRzKTtcbiAgICByZXR1cm4gbWFya2VkO1xufTtcbi8qKlxuICogUnVuIGNhbGxiYWNrIGZvciBldmVyeSB0b2tlblxuICovXG5tYXJrZWQud2Fsa1Rva2VucyA9IGZ1bmN0aW9uICh0b2tlbnMsIGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIG1hcmtlZEluc3RhbmNlLndhbGtUb2tlbnModG9rZW5zLCBjYWxsYmFjayk7XG59O1xuLyoqXG4gKiBDb21waWxlcyBtYXJrZG93biB0byBIVE1MIHdpdGhvdXQgZW5jbG9zaW5nIGBwYCB0YWcuXG4gKlxuICogQHBhcmFtIHNyYyBTdHJpbmcgb2YgbWFya2Rvd24gc291cmNlIHRvIGJlIGNvbXBpbGVkXG4gKiBAcGFyYW0gb3B0aW9ucyBIYXNoIG9mIG9wdGlvbnNcbiAqIEByZXR1cm4gU3RyaW5nIG9mIGNvbXBpbGVkIEhUTUxcbiAqL1xubWFya2VkLnBhcnNlSW5saW5lID0gbWFya2VkSW5zdGFuY2UucGFyc2VJbmxpbmU7XG4vKipcbiAqIEV4cG9zZVxuICovXG5tYXJrZWQuUGFyc2VyID0gX1BhcnNlcjtcbm1hcmtlZC5wYXJzZXIgPSBfUGFyc2VyLnBhcnNlO1xubWFya2VkLlJlbmRlcmVyID0gX1JlbmRlcmVyO1xubWFya2VkLlRleHRSZW5kZXJlciA9IF9UZXh0UmVuZGVyZXI7XG5tYXJrZWQuTGV4ZXIgPSBfTGV4ZXI7XG5tYXJrZWQubGV4ZXIgPSBfTGV4ZXIubGV4O1xubWFya2VkLlRva2VuaXplciA9IF9Ub2tlbml6ZXI7XG5tYXJrZWQuSG9va3MgPSBfSG9va3M7XG5tYXJrZWQucGFyc2UgPSBtYXJrZWQ7XG5leHBvcnQgY29uc3Qgb3B0aW9ucyA9IG1hcmtlZC5vcHRpb25zO1xuZXhwb3J0IGNvbnN0IHNldE9wdGlvbnMgPSBtYXJrZWQuc2V0T3B0aW9ucztcbmV4cG9ydCBjb25zdCB1c2UgPSBtYXJrZWQudXNlO1xuZXhwb3J0IGNvbnN0IHdhbGtUb2tlbnMgPSBtYXJrZWQud2Fsa1Rva2VucztcbmV4cG9ydCBjb25zdCBwYXJzZUlubGluZSA9IG1hcmtlZC5wYXJzZUlubGluZTtcbmV4cG9ydCBjb25zdCBwYXJzZSA9IG1hcmtlZDtcbmV4cG9ydCBjb25zdCBwYXJzZXIgPSBfUGFyc2VyLnBhcnNlO1xuZXhwb3J0IGNvbnN0IGxleGVyID0gX0xleGVyLmxleDtcbmV4cG9ydCB7IF9kZWZhdWx0cyBhcyBkZWZhdWx0cywgX2dldERlZmF1bHRzIGFzIGdldERlZmF1bHRzIH0gZnJvbSAnLi9kZWZhdWx0cy50cyc7XG5leHBvcnQgeyBfTGV4ZXIgYXMgTGV4ZXIgfSBmcm9tICcuL0xleGVyLnRzJztcbmV4cG9ydCB7IF9QYXJzZXIgYXMgUGFyc2VyIH0gZnJvbSAnLi9QYXJzZXIudHMnO1xuZXhwb3J0IHsgX1Rva2VuaXplciBhcyBUb2tlbml6ZXIgfSBmcm9tICcuL1Rva2VuaXplci50cyc7XG5leHBvcnQgeyBfUmVuZGVyZXIgYXMgUmVuZGVyZXIgfSBmcm9tICcuL1JlbmRlcmVyLnRzJztcbmV4cG9ydCB7IF9UZXh0UmVuZGVyZXIgYXMgVGV4dFJlbmRlcmVyIH0gZnJvbSAnLi9UZXh0UmVuZGVyZXIudHMnO1xuZXhwb3J0IHsgX0hvb2tzIGFzIEhvb2tzIH0gZnJvbSAnLi9Ib29rcy50cyc7XG5leHBvcnQgeyBNYXJrZWQgfSBmcm9tICcuL0luc3RhbmNlLnRzJztcbiIsICJpbXBvcnQgeyBtYXJrZWQgfSBmcm9tIFwibWFya2VkXCI7XG5cbi8vIENvbmZpZ3VyZSBtYXJrZWQgZm9yIHNhZmUgSFRNTCByZW5kZXJpbmdcbm1hcmtlZC5zZXRPcHRpb25zKHtcblx0Z2ZtOiB0cnVlLCAvLyBHaXRIdWIgRmxhdm9yZWQgTWFya2Rvd25cblx0YnJlYWtzOiB0cnVlLCAvLyBDb252ZXJ0IFxcbiB0byA8YnI+XG59KTtcblxuLyoqXG4gKiBFc2NhcGUgSFRNTCBlbnRpdGllcyB0byBwcmV2ZW50IFhTU1xuICovXG5mdW5jdGlvbiBlc2NhcGVIdG1sKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG5cdHJldHVybiB0ZXh0XG5cdFx0LnJlcGxhY2UoLyYvZywgXCImYW1wO1wiKVxuXHRcdC5yZXBsYWNlKC88L2csIFwiJmx0O1wiKVxuXHRcdC5yZXBsYWNlKC8+L2csIFwiJmd0O1wiKVxuXHRcdC5yZXBsYWNlKC9cIi9nLCBcIiZxdW90O1wiKVxuXHRcdC5yZXBsYWNlKC8nL2csIFwiJiMzOTtcIik7XG59XG5cbi8qKlxuICogQ29udmVydCBtYXJrZG93biB0ZXh0IHRvIEhUTUwgc3RyaW5nIHdpdGggcHJvcGVyIGVzY2FwaW5nXG4gKiBAcGFyYW0gbWFya2Rvd24gLSBUaGUgbWFya2Rvd24gdGV4dCB0byBjb252ZXJ0XG4gKiBAcmV0dXJucyBIVE1MIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWFya2Rvd25Ub0h0bWwobWFya2Rvd246IHN0cmluZyk6IHN0cmluZyB7XG5cdGlmICghbWFya2Rvd24pIHJldHVybiBcIlwiO1xuXG5cdHRyeSB7XG5cdFx0Ly8gRmlyc3QgZXNjYXBlIGFueSBleGlzdGluZyBIVE1MIGVudGl0aWVzIHRvIHByZXZlbnQgWFNTXG5cdFx0Y29uc3QgZXNjYXBlZE1hcmtkb3duID0gZXNjYXBlSHRtbChtYXJrZG93bik7XG5cdFx0cmV0dXJuIG1hcmtlZChlc2NhcGVkTWFya2Rvd24pIGFzIHN0cmluZztcblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRjb25zb2xlLndhcm4oXCJGYWlsZWQgdG8gcGFyc2UgbWFya2Rvd246XCIsIGVycm9yKTtcblx0XHQvLyBGYWxsYmFjayB0byBwbGFpbiB0ZXh0IHdpdGggYmFzaWMgbGluZSBicmVhayBoYW5kbGluZyBhbmQgSFRNTCBlc2NhcGluZ1xuXHRcdHJldHVybiBlc2NhcGVIdG1sKG1hcmtkb3duKS5yZXBsYWNlKC9cXG4vZywgXCI8YnI+XCIpO1xuXHR9XG59XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCwgaHRtbCwgVGVtcGxhdGVSZXN1bHQgfSBmcm9tIFwibGl0XCI7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSB9IGZyb20gXCJsaXQvZGVjb3JhdG9ycy5qc1wiO1xuaW1wb3J0IHsgdW5zYWZlSFRNTCB9IGZyb20gXCJsaXQvZGlyZWN0aXZlcy91bnNhZmUtaHRtbC5qc1wiO1xuaW1wb3J0ICogYXMgRGlmZiBmcm9tIFwiZGlmZlwiO1xuaW1wb3J0IHR5cGUge1xuXHRNZXNzYWdlUGFyYW0sXG5cdFRleHRCbG9ja1BhcmFtLFxuXHRDb250ZW50QmxvY2ssXG5cdENvbnRlbnRCbG9ja1BhcmFtLFxuXHRNZXNzYWdlLFxuXHRUb29sVW5pb24sXG59IGZyb20gXCJAYW50aHJvcGljLWFpL3Nkay9yZXNvdXJjZXMvbWVzc2FnZXNcIjtcbmltcG9ydCB7IFNpbXBsZUNvbnZlcnNhdGlvbiwgRW5oYW5jZWRNZXNzYWdlUGFyYW0gfSBmcm9tIFwiLi4vLi4vLi4vc3JjL3NoYXJlZC1jb252ZXJzYXRpb24tcHJvY2Vzc29yXCI7XG5pbXBvcnQgeyBtYXJrZG93blRvSHRtbCB9IGZyb20gXCIuLi91dGlscy9tYXJrZG93blwiO1xuXG5AY3VzdG9tRWxlbWVudChcInNpbXBsZS1jb252ZXJzYXRpb24tdmlld1wiKVxuZXhwb3J0IGNsYXNzIFNpbXBsZUNvbnZlcnNhdGlvblZpZXcgZXh0ZW5kcyBMaXRFbGVtZW50IHtcblx0QHByb3BlcnR5KHsgdHlwZTogQXJyYXkgfSkgY29udmVyc2F0aW9uczogU2ltcGxlQ29udmVyc2F0aW9uW10gPSBbXTtcblxuXHQvLyBEaXNhYmxlIHNoYWRvdyBET00gdG8gdXNlIGdsb2JhbCBDU1Ncblx0Y3JlYXRlUmVuZGVyUm9vdCgpIHtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdHByaXZhdGUgaGFuZGxlVG9nZ2xlKFxuXHRcdGU6IEV2ZW50LFxuXHRcdG9wdGlvbnM6IHtcblx0XHRcdHR5cGU/OiBcImNvbnRlbnRcIiB8IFwid3JpdGVcIiB8IFwiY3VzdG9tXCI7XG5cdFx0XHR0YXJnZXRTZWxlY3Rvcj86IHN0cmluZztcblx0XHRcdHRvZ2dsZVNlbGVjdG9yPzogc3RyaW5nO1xuXHRcdFx0Y3VzdG9tSGFuZGxlcj86IChlbGVtZW50OiBIVE1MRWxlbWVudCwgaXNIaWRkZW46IGJvb2xlYW4pID0+IHZvaWQ7XG5cdFx0fSA9IHt9LFxuXHQpIHtcblx0XHRjb25zdCB7IHR5cGUgPSBcImNvbnRlbnRcIiwgdGFyZ2V0U2VsZWN0b3IsIHRvZ2dsZVNlbGVjdG9yLCBjdXN0b21IYW5kbGVyIH0gPSBvcHRpb25zO1xuXHRcdGNvbnN0IGN1cnJlbnRFbGVtZW50ID0gZS5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuXG5cdFx0aWYgKHR5cGUgPT09IFwid3JpdGVcIikge1xuXHRcdFx0Y29uc3QgZnVsbENvbnRlbnQgPSBjdXJyZW50RWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nIGFzIEhUTUxFbGVtZW50O1xuXHRcdFx0aWYgKGZ1bGxDb250ZW50KSB7XG5cdFx0XHRcdGNvbnN0IGlzRXhwYW5kZWQgPSAhZnVsbENvbnRlbnQuY2xhc3NMaXN0LmNvbnRhaW5zKFwiaGlkZGVuXCIpO1xuXHRcdFx0XHRpZiAoaXNFeHBhbmRlZCkge1xuXHRcdFx0XHRcdGZ1bGxDb250ZW50LmNsYXNzTGlzdC5hZGQoXCJoaWRkZW5cIik7XG5cdFx0XHRcdFx0Y3VycmVudEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShcImhpZGRlblwiKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRmdWxsQ29udGVudC5jbGFzc0xpc3QucmVtb3ZlKFwiaGlkZGVuXCIpO1xuXHRcdFx0XHRcdGN1cnJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJoaWRkZW5cIik7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBEZWZhdWx0IGNvbnRlbnQgdG9nZ2xlIGJlaGF2aW9yXG5cdFx0Y29uc3QgdGFyZ2V0ID0gdGFyZ2V0U2VsZWN0b3Jcblx0XHRcdD8gKGN1cnJlbnRFbGVtZW50LnF1ZXJ5U2VsZWN0b3IodGFyZ2V0U2VsZWN0b3IpIGFzIEhUTUxFbGVtZW50KVxuXHRcdFx0OiAoY3VycmVudEVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nIGFzIEhUTUxFbGVtZW50KTtcblx0XHRjb25zdCB0b2dnbGUgPSB0b2dnbGVTZWxlY3RvclxuXHRcdFx0PyAoY3VycmVudEVsZW1lbnQucXVlcnlTZWxlY3Rvcih0b2dnbGVTZWxlY3RvcikgYXMgSFRNTEVsZW1lbnQpXG5cdFx0XHQ6IChjdXJyZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yKFwic3BhbjpmaXJzdC1jaGlsZFwiKSBhcyBIVE1MRWxlbWVudCk7XG5cblx0XHRpZiAodGFyZ2V0KSB7XG5cdFx0XHRjb25zdCBpc0hpZGRlbiA9IHRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoXCJoaWRkZW5cIik7XG5cblx0XHRcdGlmIChjdXN0b21IYW5kbGVyKSB7XG5cdFx0XHRcdGN1c3RvbUhhbmRsZXIodGFyZ2V0LCBpc0hpZGRlbik7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0YXJnZXQuY2xhc3NMaXN0LnRvZ2dsZShcImhpZGRlblwiLCAhaXNIaWRkZW4pO1xuXHRcdFx0XHRpZiAodG9nZ2xlKSB7XG5cdFx0XHRcdFx0dG9nZ2xlLnRleHRDb250ZW50ID0gaXNIaWRkZW4gPyBcIlstXVwiIDogXCJbK11cIjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgdG9nZ2xlQ29udGVudChlOiBFdmVudCkge1xuXHRcdHRoaXMuaGFuZGxlVG9nZ2xlKGUpO1xuXHR9XG5cblx0cHJpdmF0ZSB0b2dnbGVXcml0ZUNvbnRlbnQoZTogRXZlbnQpIHtcblx0XHR0aGlzLmhhbmRsZVRvZ2dsZShlLCB7IHR5cGU6IFwid3JpdGVcIiB9KTtcblx0fVxuXG5cdHByaXZhdGUgZm9ybWF0Q29udGVudChjb250ZW50OiBzdHJpbmcgfCBDb250ZW50QmxvY2tQYXJhbVtdLCB0b29sUmVzdWx0cz86IFJlY29yZDxzdHJpbmcsIGFueT4pOiBUZW1wbGF0ZVJlc3VsdCB7XG5cdFx0aWYgKHR5cGVvZiBjb250ZW50ID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5mb3JtYXRTdHJpbmdDb250ZW50KGNvbnRlbnQpO1xuXHRcdH1cblxuXHRcdGlmIChBcnJheS5pc0FycmF5KGNvbnRlbnQpKSB7XG5cdFx0XHRyZXR1cm4gaHRtbGBcblx0XHRcdFx0JHtjb250ZW50Lm1hcCgoYmxvY2spID0+IHtcblx0XHRcdFx0XHRpZiAoYmxvY2sudHlwZSA9PT0gXCJ0ZXh0XCIpIHtcblx0XHRcdFx0XHRcdHJldHVybiB0aGlzLmZvcm1hdFN0cmluZ0NvbnRlbnQoYmxvY2sudGV4dCk7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChibG9jay50eXBlID09PSBcInRoaW5raW5nXCIpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHRoaW5raW5nQmxvY2sgPSBibG9jayBhcyBhbnk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gaHRtbGBcblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cIm10LTQgbWItNFwiPlxuXHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ0ZXh0LWdyYXktNTAwIGl0YWxpY1wiPlxuXHRcdFx0XHRcdFx0XHRcdFx0PGVtPlRoaW5raW5nPC9lbT5cblx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwidGV4dC1ncmF5LTQwMCBtdC0yIG1hcmtkb3duLWNvbnRlbnRcIj5cblx0XHRcdFx0XHRcdFx0XHRcdCR7dW5zYWZlSFRNTChtYXJrZG93blRvSHRtbCh0aGlua2luZ0Jsb2NrLnRoaW5raW5nIHx8IFwiXCIpKX1cblx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRgO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoYmxvY2sudHlwZSA9PT0gXCJ0b29sX3Jlc3VsdFwiKSB7XG5cdFx0XHRcdFx0XHQvLyBTa2lwIHN0YW5kYWxvbmUgdG9vbF9yZXN1bHQgYmxvY2tzIC0gdGhleSB3aWxsIGJlIHBhaXJlZCB3aXRoIHRvb2xfdXNlXG5cdFx0XHRcdFx0XHRyZXR1cm4gaHRtbGBgO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoYmxvY2sudHlwZSA9PT0gXCJ0b29sX3VzZVwiKSB7XG5cdFx0XHRcdFx0XHRjb25zdCB0b29sVXNlID0gYmxvY2sgYXMgYW55O1xuXHRcdFx0XHRcdFx0Y29uc3QgdG9vbFJlc3VsdCA9IHRvb2xSZXN1bHRzPy5bdG9vbFVzZS5pZF07XG5cblx0XHRcdFx0XHRcdGlmIChibG9jay5uYW1lID09PSBcIlRvZG9Xcml0ZVwiIHx8IGJsb2NrLm5hbWUgPT09IFwiRWRpdFwiIHx8IGJsb2NrLm5hbWUgPT09IFwiTXVsdGlFZGl0XCIpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMucmVuZGVyVG9vbENvbnRhaW5lcihibG9jaywgdG9vbFJlc3VsdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoYmxvY2submFtZSA9PT0gXCJXcml0ZVwiKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGN1c3RvbUNvbnRlbnQgPSBodG1sYFxuXHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJiZy12cy1iZy1zZWNvbmRhcnkgcC00IHRleHQtdnMtdGV4dCBoaWRkZW5cIj5cblx0XHRcdFx0XHRcdFx0XHRcdCR7dGhpcy5yZW5kZXJUb29sVXNlQ29udGVudChibG9jayl9XG5cdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0PGRpdlxuXHRcdFx0XHRcdFx0XHRcdFx0Y2xhc3M9XCJiZy12cy1iZy1zZWNvbmRhcnkgbXgtNCBwLTQgdGV4dC12cy10ZXh0IGN1cnNvci1wb2ludGVyIGhvdmVyOmJnLXZzLWJvcmRlciB0cmFuc2l0aW9uLWNvbG9yc1wiXG5cdFx0XHRcdFx0XHRcdFx0XHRAY2xpY2s9JHt0aGlzLnRvZ2dsZVdyaXRlQ29udGVudH1cblx0XHRcdFx0XHRcdFx0XHQ+XG5cdFx0XHRcdFx0XHRcdFx0XHQke3RoaXMucmVuZGVyV3JpdGVQcmV2aWV3KGJsb2NrKX1cblx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0YDtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGh0bWxgXG5cdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cIm10LTQgbWItNFwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInRleHQtdnMtdHlwZSBweC00IGJyZWFrLWFsbFwiPiR7dGhpcy5nZXRUb29sRGlzcGxheU5hbWUoYmxvY2spfTwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0JHtjdXN0b21Db250ZW50fSAke3Rvb2xSZXN1bHQgPyB0aGlzLnJlbmRlclRvb2xSZXN1bHQodG9vbFJlc3VsdCwgYmxvY2spIDogXCJcIn1cblx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0YDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHJldHVybiB0aGlzLnJlbmRlclRvb2xDb250YWluZXIoYmxvY2ssIHRvb2xSZXN1bHQsIHtcblx0XHRcdFx0XHRcdFx0aXNDb2xsYXBzaWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0aXNDb2xsYXBzZWQ6IHRydWUsXG5cdFx0XHRcdFx0XHRcdGlzQ2xpY2tUb0V4cGFuZDogdHJ1ZSxcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gaHRtbGA8cHJlIGNsYXNzPVwibWItNFwiPiR7SlNPTi5zdHJpbmdpZnkoYmxvY2ssIG51bGwsIDIpfTwvcHJlPmA7XG5cdFx0XHRcdH0pfVxuXHRcdFx0YDtcblx0XHR9XG5cblx0XHRyZXR1cm4gaHRtbGA8cHJlPiR7SlNPTi5zdHJpbmdpZnkoY29udGVudCwgbnVsbCwgMil9PC9wcmU+YDtcblx0fVxuXG5cdHByaXZhdGUgZm9ybWF0U3RyaW5nQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBUZW1wbGF0ZVJlc3VsdCB7XG5cdFx0Ly8gQ2hlY2sgZm9yIHN5c3RlbSByZW1pbmRlciBibG9ja3MgKGhhbmRsaW5nIGJvdGggcmF3IGFuZCBIVE1MLWVzY2FwZWQgZGVsaW1pdGVycylcblx0XHRjb25zdCBzeXN0ZW1SZW1pbmRlclJlZ2V4RXNjYXBlZCA9IC8mbHQ7c3lzdGVtLXJlbWluZGVyJmd0OyhbXFxzXFxTXSo/KSZsdDtcXC9zeXN0ZW0tcmVtaW5kZXImZ3Q7L2c7XG5cdFx0Y29uc3Qgc3lzdGVtUmVtaW5kZXJSZWdleFJhdyA9IC88c3lzdGVtLXJlbWluZGVyPihbXFxzXFxTXSo/KTxcXC9zeXN0ZW0tcmVtaW5kZXI+L2c7XG5cdFx0Y29uc3Qgc3lzdGVtUmVtaW5kZXJzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGxldCBtYXRjaDtcblxuXHRcdC8vIEV4dHJhY3QgYWxsIHN5c3RlbSByZW1pbmRlciBibG9ja3MgKGVzY2FwZWQpXG5cdFx0d2hpbGUgKChtYXRjaCA9IHN5c3RlbVJlbWluZGVyUmVnZXhFc2NhcGVkLmV4ZWMoY29udGVudCkpICE9PSBudWxsKSB7XG5cdFx0XHRzeXN0ZW1SZW1pbmRlcnMucHVzaChtYXRjaFsxXS50cmltKCkpO1xuXHRcdH1cblxuXHRcdC8vIEV4dHJhY3QgYWxsIHN5c3RlbSByZW1pbmRlciBibG9ja3MgKHJhdylcblx0XHR3aGlsZSAoKG1hdGNoID0gc3lzdGVtUmVtaW5kZXJSZWdleFJhdy5leGVjKGNvbnRlbnQpKSAhPT0gbnVsbCkge1xuXHRcdFx0c3lzdGVtUmVtaW5kZXJzLnB1c2gobWF0Y2hbMV0udHJpbSgpKTtcblx0XHR9XG5cblx0XHQvLyBSZW1vdmUgc3lzdGVtIHJlbWluZGVyIGJsb2NrcyBmcm9tIG1haW4gY29udGVudFxuXHRcdGxldCBtYWluQ29udGVudCA9IGNvbnRlbnQucmVwbGFjZShzeXN0ZW1SZW1pbmRlclJlZ2V4RXNjYXBlZCwgXCJcIikucmVwbGFjZShzeXN0ZW1SZW1pbmRlclJlZ2V4UmF3LCBcIlwiKS50cmltKCk7XG5cblx0XHRyZXR1cm4gaHRtbGBcblx0XHRcdCR7bWFpbkNvbnRlbnQgPyBodG1sYDxkaXYgY2xhc3M9XCJtdC00IG1hcmtkb3duLWNvbnRlbnRcIj4ke3Vuc2FmZUhUTUwobWFya2Rvd25Ub0h0bWwobWFpbkNvbnRlbnQpKX08L2Rpdj5gIDogXCJcIn1cblx0XHRcdCR7c3lzdGVtUmVtaW5kZXJzLmxlbmd0aCA+IDBcblx0XHRcdFx0PyB0aGlzLnJlbmRlckNvbGxhcHNpYmxlU2VjdGlvbihcblx0XHRcdFx0XHRcdFwiU3lzdGVtIFJlbWluZGVyXCIsXG5cdFx0XHRcdFx0XHRodG1sYDxkaXYgY2xhc3M9XCJ0ZXh0LXZzLW11dGVkXCI+XG5cdFx0XHRcdFx0XHRcdCR7c3lzdGVtUmVtaW5kZXJzLm1hcChcblx0XHRcdFx0XHRcdFx0XHQocmVtaW5kZXIsIGluZGV4KSA9PiBodG1sYFxuXHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cIm1iLTRcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0JHtzeXN0ZW1SZW1pbmRlcnMubGVuZ3RoID4gMVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdD8gaHRtbGA8ZGl2IGNsYXNzPVwidGV4dC12cy1mdW5jdGlvbiBmb250LWJvbGQgbWItMlwiPlJlbWluZGVyICR7aW5kZXggKyAxfTo8L2Rpdj5gXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0OiBcIlwifVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwibWFya2Rvd24tY29udGVudFwiPiR7dW5zYWZlSFRNTChtYXJrZG93blRvSHRtbChyZW1pbmRlcikpfTwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0YCxcblx0XHRcdFx0XHRcdFx0KX1cblx0XHRcdFx0XHRcdDwvZGl2PmAsXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRpdGxlQ2xhc3NlczogXCJ0ZXh0LXZzLW11dGVkXCIsXG5cdFx0XHRcdFx0XHRcdGNvbnRhaW5lckNsYXNzZXM6IFwibXQtNCBtYi00XCIsXG5cdFx0XHRcdFx0XHRcdGNvdW50OiBzeXN0ZW1SZW1pbmRlcnMubGVuZ3RoID4gMSA/IHN5c3RlbVJlbWluZGVycy5sZW5ndGggOiB1bmRlZmluZWQsXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdClcblx0XHRcdFx0OiBcIlwifVxuXHRcdGA7XG5cdH1cblxuXHRwcml2YXRlIGZvcm1hdFN5c3RlbShzeXN0ZW06IHN0cmluZyB8IFRleHRCbG9ja1BhcmFtW10gfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuXHRcdGlmICghc3lzdGVtKSByZXR1cm4gXCJcIjtcblxuXHRcdGlmICh0eXBlb2Ygc3lzdGVtID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRyZXR1cm4gbWFya2Rvd25Ub0h0bWwoc3lzdGVtKTtcblx0XHR9XG5cblx0XHRpZiAoQXJyYXkuaXNBcnJheShzeXN0ZW0pKSB7XG5cdFx0XHRjb25zdCB0ZXh0Q29udGVudCA9IHN5c3RlbVxuXHRcdFx0XHQubWFwKChibG9jaykgPT4ge1xuXHRcdFx0XHRcdGlmIChibG9jay50eXBlID09PSBcInRleHRcIikge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGJsb2NrLnRleHQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBKU09OLnN0cmluZ2lmeShibG9jaywgbnVsbCwgMik7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5qb2luKFwiXFxuXCIpO1xuXHRcdFx0cmV0dXJuIG1hcmtkb3duVG9IdG1sKHRleHRDb250ZW50KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkoc3lzdGVtLCBudWxsLCAyKTtcblx0fVxuXG5cdHByaXZhdGUgZm9ybWF0UmVzcG9uc2VDb250ZW50KHJlc3BvbnNlOiBNZXNzYWdlKTogVGVtcGxhdGVSZXN1bHQge1xuXHRcdGlmICghcmVzcG9uc2UpIHJldHVybiBodG1sYGA7XG5cblx0XHRpZiAocmVzcG9uc2UuY29udGVudCAmJiBBcnJheS5pc0FycmF5KHJlc3BvbnNlLmNvbnRlbnQpKSB7XG5cdFx0XHRyZXR1cm4gaHRtbGBcblx0XHRcdFx0JHtyZXNwb25zZS5jb250ZW50Lm1hcCgoYmxvY2spID0+IHtcblx0XHRcdFx0XHRpZiAoYmxvY2sudHlwZSA9PT0gXCJ0ZXh0XCIpIHtcblx0XHRcdFx0XHRcdHJldHVybiBodG1sYDxkaXYgY2xhc3M9XCJtdC00IG1hcmtkb3duLWNvbnRlbnRcIj4ke3Vuc2FmZUhUTUwobWFya2Rvd25Ub0h0bWwoYmxvY2sudGV4dCkpfTwvZGl2PmA7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChibG9jay50eXBlID09PSBcInRoaW5raW5nXCIpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHRoaW5raW5nQmxvY2sgPSBibG9jayBhcyBhbnk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gaHRtbGBcblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cIm10LTQgbWItNFwiPlxuXHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ0ZXh0LWdyYXktNTAwIGl0YWxpY1wiPlxuXHRcdFx0XHRcdFx0XHRcdFx0PGVtPlRoaW5raW5nPC9lbT5cblx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwidGV4dC1ncmF5LTQwMCBtdC0yIG1hcmtkb3duLWNvbnRlbnRcIj5cblx0XHRcdFx0XHRcdFx0XHRcdCR7dW5zYWZlSFRNTChtYXJrZG93blRvSHRtbCh0aGlua2luZ0Jsb2NrLnRoaW5raW5nIHx8IFwiXCIpKX1cblx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRgO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoYmxvY2sudHlwZSA9PT0gXCJ0b29sX3VzZVwiKSB7XG5cdFx0XHRcdFx0XHRpZiAoYmxvY2submFtZSA9PT0gXCJUb2RvV3JpdGVcIikge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gaHRtbGBcblx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwibXQtNCBtYi00XCI+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwidGV4dC12cy10eXBlIHB4LTQgYnJlYWstYWxsXCI+JHt0aGlzLmdldFRvb2xEaXNwbGF5TmFtZShibG9jayl9PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiYmctdnMtYmctc2Vjb25kYXJ5IG14LTQgcC00IHRleHQtdnMtdGV4dFwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQke3RoaXMucmVuZGVyVG9vbFVzZUNvbnRlbnQoYmxvY2spfVxuXHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdGA7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRyZXR1cm4gaHRtbGBcblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cIm10LTQgbWItNFwiPlxuXHRcdFx0XHRcdFx0XHRcdDxkaXZcblx0XHRcdFx0XHRcdFx0XHRcdGNsYXNzPVwidGV4dC12cy10eXBlIHB4LTQgcHktMiBicmVhay1hbGwgY3Vyc29yLXBvaW50ZXIgaG92ZXI6dGV4dC13aGl0ZSB0cmFuc2l0aW9uLWNvbG9yc1wiXG5cdFx0XHRcdFx0XHRcdFx0XHRAY2xpY2s9JHt0aGlzLnRvZ2dsZUNvbnRlbnR9XG5cdFx0XHRcdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJtci0yXCI+WytdPC9zcGFuPlxuXHRcdFx0XHRcdFx0XHRcdFx0JHt0aGlzLmdldFRvb2xEaXNwbGF5TmFtZShibG9jayl9XG5cdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImJnLXZzLWJnLXNlY29uZGFyeSBteC00IHAtNCB0ZXh0LXZzLXRleHQgaGlkZGVuXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHQke3RoaXMucmVuZGVyVG9vbFVzZUNvbnRlbnQoYmxvY2spfVxuXHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdGA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBodG1sYDxwcmUgY2xhc3M9XCJtYi00XCI+JHtKU09OLnN0cmluZ2lmeShibG9jaywgbnVsbCwgMil9PC9wcmU+YDtcblx0XHRcdFx0fSl9XG5cdFx0XHRgO1xuXHRcdH1cblxuXHRcdHJldHVybiBodG1sYDxwcmU+JHtKU09OLnN0cmluZ2lmeShyZXNwb25zZSwgbnVsbCwgMil9PC9wcmU+YDtcblx0fVxuXG5cdHByaXZhdGUgZm9ybWF0U2luZ2xlUGFyYW0odG9vbE5hbWU6IHN0cmluZywgcGFyYW1WYWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBwYXJhbU5hbWU6IHN0cmluZyA9IFwiXCIpOiBUZW1wbGF0ZVJlc3VsdCB7XG5cdFx0cmV0dXJuIHBhcmFtVmFsdWVcblx0XHRcdD8gaHRtbGAke3Rvb2xOYW1lfSg8c3BhbiBjbGFzcz1cInRleHQtdnMtdGV4dFwiPiR7dGhpcy51bmVzY2FwZUh0bWwocGFyYW1WYWx1ZSl9PC9zcGFuPilgXG5cdFx0XHQ6IGh0bWxgJHt0b29sTmFtZX1gO1xuXHR9XG5cblx0cHJpdmF0ZSBmb3JtYXRNdWx0aVBhcmFtKHRvb2xOYW1lOiBzdHJpbmcsIHBhcmFtczogc3RyaW5nW10pOiBUZW1wbGF0ZVJlc3VsdCB7XG5cdFx0cmV0dXJuIHBhcmFtcy5sZW5ndGggPiAwXG5cdFx0XHQ/IGh0bWxgJHt0b29sTmFtZX0oPHNwYW4gY2xhc3M9XCJ0ZXh0LXZzLXRleHRcIj4ke3BhcmFtcy5qb2luKFwiLCBcIil9PC9zcGFuPilgXG5cdFx0XHQ6IGh0bWxgJHt0b29sTmFtZX1gO1xuXHR9XG5cblx0cHJpdmF0ZSB1bmVzY2FwZUh0bWwoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cdFx0ZGl2LmlubmVySFRNTCA9IHN0cjtcblx0XHRyZXR1cm4gZGl2LnRleHRDb250ZW50IHx8IGRpdi5pbm5lclRleHQgfHwgXCJcIjtcblx0fVxuXG5cdHByaXZhdGUgd3JhcEluU2Nyb2xsYWJsZShjb250ZW50OiBUZW1wbGF0ZVJlc3VsdCB8IHN0cmluZywgdXNlUHJlRm9ybWF0dGluZzogYm9vbGVhbiA9IHRydWUpOiBUZW1wbGF0ZVJlc3VsdCB7XG5cdFx0aWYgKHVzZVByZUZvcm1hdHRpbmcgJiYgdHlwZW9mIGNvbnRlbnQgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdHJldHVybiBodG1sYFxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwib3ZlcmZsb3cteC1hdXRvXCI+XG5cdFx0XHRcdFx0PHByZSBjbGFzcz1cInRleHQtdnMtdGV4dCBtLTBcIiBzdHlsZT1cIndoaXRlLXNwYWNlOiBwcmU7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7XCI+JHtjb250ZW50fTwvcHJlPlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdGA7XG5cdFx0fVxuXHRcdHJldHVybiBodG1sYCA8ZGl2IGNsYXNzPVwib3ZlcmZsb3cteC1hdXRvXCI+JHtjb250ZW50fTwvZGl2PiBgO1xuXHR9XG5cblx0cHJpdmF0ZSByZW5kZXJDb2xsYXBzaWJsZVNlY3Rpb24oXG5cdFx0dGl0bGU6IHN0cmluZyxcblx0XHRjb250ZW50OiBUZW1wbGF0ZVJlc3VsdCxcblx0XHRvcHRpb25zOiB7XG5cdFx0XHRpc0V4cGFuZGVkPzogYm9vbGVhbjtcblx0XHRcdHRpdGxlQ2xhc3Nlcz86IHN0cmluZztcblx0XHRcdGNvbnRhaW5lckNsYXNzZXM/OiBzdHJpbmc7XG5cdFx0XHRjb3VudD86IG51bWJlcjtcblx0XHR9ID0ge30sXG5cdCk6IFRlbXBsYXRlUmVzdWx0IHtcblx0XHRjb25zdCB7IGlzRXhwYW5kZWQgPSBmYWxzZSwgdGl0bGVDbGFzc2VzID0gXCJcIiwgY29udGFpbmVyQ2xhc3NlcyA9IFwiXCIsIGNvdW50IH0gPSBvcHRpb25zO1xuXHRcdGNvbnN0IGV4cGFuZGVkQ2xhc3MgPSBpc0V4cGFuZGVkID8gXCJcIiA6IFwiaGlkZGVuXCI7XG5cdFx0Y29uc3QgdG9nZ2xlU3ltYm9sID0gaXNFeHBhbmRlZCA/IFwiWy1dXCIgOiBcIlsrXVwiO1xuXHRcdGNvbnN0IGRpc3BsYXlUaXRsZSA9IGNvdW50ICE9PSB1bmRlZmluZWQgPyBgJHt0aXRsZX0gKCR7Y291bnR9KWAgOiB0aXRsZTtcblxuXHRcdHJldHVybiBodG1sYFxuXHRcdFx0PGRpdiBjbGFzcz1cIiR7Y29udGFpbmVyQ2xhc3Nlc31cIj5cblx0XHRcdFx0PGRpdiBjbGFzcz1cImN1cnNvci1wb2ludGVyIGhvdmVyOnRleHQtd2hpdGUgdHJhbnNpdGlvbi1jb2xvcnMgJHt0aXRsZUNsYXNzZXN9XCIgQGNsaWNrPSR7dGhpcy50b2dnbGVDb250ZW50fT5cblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cIm1yLTJcIj4ke3RvZ2dsZVN5bWJvbH08L3NwYW4+XG5cdFx0XHRcdFx0PHNwYW4+JHtkaXNwbGF5VGl0bGV9PC9zcGFuPlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PGRpdiBjbGFzcz1cIiR7ZXhwYW5kZWRDbGFzc30gbXQtNFwiPiR7Y29udGVudH08L2Rpdj5cblx0XHRcdDwvZGl2PlxuXHRcdGA7XG5cdH1cblxuXHRwcml2YXRlIGdldFRvb2xEaXNwbGF5TmFtZSh0b29sVXNlOiBhbnksIHRvb2xSZXN1bHQ/OiBhbnkpOiBUZW1wbGF0ZVJlc3VsdCB7XG5cdFx0Y29uc3QgdG9vbE5hbWUgPSB0b29sVXNlLm5hbWU7XG5cdFx0Y29uc3QgaW5wdXQgPSB0b29sVXNlLmlucHV0O1xuXG5cdFx0c3dpdGNoICh0b29sTmFtZSkge1xuXHRcdFx0Y2FzZSBcIlJlYWRcIjpcblx0XHRcdFx0cmV0dXJuIHRoaXMuZm9ybWF0U2luZ2xlUGFyYW0odG9vbE5hbWUsIGlucHV0Py5maWxlX3BhdGgpO1xuXHRcdFx0Y2FzZSBcIkJhc2hcIjpcblx0XHRcdFx0cmV0dXJuIHRoaXMuZm9ybWF0U2luZ2xlUGFyYW0odG9vbE5hbWUsIGlucHV0Py5jb21tYW5kKTtcblx0XHRcdGNhc2UgXCJXcml0ZVwiOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5mb3JtYXRTaW5nbGVQYXJhbSh0b29sTmFtZSwgaW5wdXQ/LmZpbGVfcGF0aCk7XG5cdFx0XHRjYXNlIFwiR2xvYlwiOlxuXHRcdFx0XHRpZiAoaW5wdXQ/LnBhdHRlcm4pIHtcblx0XHRcdFx0XHRjb25zdCBwYXJhbXMgPSBbdGhpcy51bmVzY2FwZUh0bWwoaW5wdXQucGF0dGVybildO1xuXHRcdFx0XHRcdGlmIChpbnB1dD8ucGF0aCkgcGFyYW1zLnB1c2godGhpcy51bmVzY2FwZUh0bWwoaW5wdXQucGF0aCkpO1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLmZvcm1hdE11bHRpUGFyYW0odG9vbE5hbWUsIHBhcmFtcyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGh0bWxgJHt0b29sTmFtZX1gO1xuXHRcdFx0Y2FzZSBcIkdyZXBcIjpcblx0XHRcdFx0aWYgKGlucHV0Py5wYXR0ZXJuKSB7XG5cdFx0XHRcdFx0Y29uc3QgcGFyYW1zID0gW3RoaXMudW5lc2NhcGVIdG1sKGlucHV0LnBhdHRlcm4pXTtcblx0XHRcdFx0XHRpZiAoaW5wdXQ/LmluY2x1ZGUpIHBhcmFtcy5wdXNoKHRoaXMudW5lc2NhcGVIdG1sKGlucHV0LmluY2x1ZGUpKTtcblx0XHRcdFx0XHRpZiAoaW5wdXQ/LnBhdGgpIHBhcmFtcy5wdXNoKHRoaXMudW5lc2NhcGVIdG1sKGlucHV0LnBhdGgpKTtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5mb3JtYXRNdWx0aVBhcmFtKHRvb2xOYW1lLCBwYXJhbXMpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBodG1sYCR7dG9vbE5hbWV9YDtcblx0XHRcdGNhc2UgXCJMU1wiOlxuXHRcdFx0XHRpZiAoaW5wdXQ/LnBhdGgpIHtcblx0XHRcdFx0XHRjb25zdCBwYXJhbXMgPSBbdGhpcy51bmVzY2FwZUh0bWwoaW5wdXQucGF0aCldO1xuXHRcdFx0XHRcdGlmIChpbnB1dD8uaWdub3JlKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBpZ25vcmVTdHIgPSBpbnB1dC5pZ25vcmUubWFwKChwOiBzdHJpbmcpID0+IHRoaXMudW5lc2NhcGVIdG1sKHApKS5qb2luKFwiLCBcIik7XG5cdFx0XHRcdFx0XHRwYXJhbXMucHVzaChgaWdub3JlOiAke2lnbm9yZVN0cn1gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuZm9ybWF0TXVsdGlQYXJhbSh0b29sTmFtZSwgcGFyYW1zKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gaHRtbGAke3Rvb2xOYW1lfWA7XG5cdFx0XHRjYXNlIFwiRWRpdFwiOlxuXHRcdFx0XHRyZXR1cm4gaW5wdXQ/LmZpbGVfcGF0aFxuXHRcdFx0XHRcdD8gdGhpcy5mb3JtYXRTaW5nbGVQYXJhbSh0b29sTmFtZSwgdGhpcy51bmVzY2FwZUh0bWwoaW5wdXQuZmlsZV9wYXRoKS5zcGxpdChcIi9cIikucG9wKCkpXG5cdFx0XHRcdFx0OiBodG1sYCR7dG9vbE5hbWV9YDtcblx0XHRcdGNhc2UgXCJNdWx0aUVkaXRcIjpcblx0XHRcdFx0aWYgKGlucHV0Py5maWxlX3BhdGgpIHtcblx0XHRcdFx0XHRjb25zdCBmaWxlTmFtZSA9IHRoaXMudW5lc2NhcGVIdG1sKGlucHV0LmZpbGVfcGF0aCkuc3BsaXQoXCIvXCIpLnBvcCgpIHx8IGlucHV0LmZpbGVfcGF0aDtcblx0XHRcdFx0XHRjb25zdCBlZGl0Q291bnQgPSBpbnB1dD8uZWRpdHMgPyBpbnB1dC5lZGl0cy5sZW5ndGggOiAwO1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLmZvcm1hdE11bHRpUGFyYW0odG9vbE5hbWUsIFtmaWxlTmFtZSwgYCR7ZWRpdENvdW50fSBlZGl0c2BdKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gaHRtbGAke3Rvb2xOYW1lfWA7XG5cdFx0XHRjYXNlIFwiTm90ZWJvb2tSZWFkXCI6XG5cdFx0XHRcdHJldHVybiBpbnB1dD8ubm90ZWJvb2tfcGF0aFxuXHRcdFx0XHRcdD8gdGhpcy5mb3JtYXRTaW5nbGVQYXJhbSh0b29sTmFtZSwgdGhpcy51bmVzY2FwZUh0bWwoaW5wdXQubm90ZWJvb2tfcGF0aCkuc3BsaXQoXCIvXCIpLnBvcCgpKVxuXHRcdFx0XHRcdDogaHRtbGAke3Rvb2xOYW1lfWA7XG5cdFx0XHRjYXNlIFwiTm90ZWJvb2tFZGl0XCI6XG5cdFx0XHRcdGlmIChpbnB1dD8ubm90ZWJvb2tfcGF0aCAmJiBpbnB1dD8uY2VsbF9udW1iZXIgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdGNvbnN0IGZpbGVOYW1lID0gdGhpcy51bmVzY2FwZUh0bWwoaW5wdXQubm90ZWJvb2tfcGF0aCkuc3BsaXQoXCIvXCIpLnBvcCgpO1xuXHRcdFx0XHRcdGNvbnN0IGNlbGxOdW0gPSBpbnB1dC5jZWxsX251bWJlcjtcblx0XHRcdFx0XHRjb25zdCBtb2RlID0gaW5wdXQ/LmVkaXRfbW9kZSB8fCBcInJlcGxhY2VcIjtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5mb3JtYXRNdWx0aVBhcmFtKHRvb2xOYW1lLCBbZmlsZU5hbWUsIGBjZWxsICR7Y2VsbE51bX1gLCBtb2RlXSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGh0bWxgJHt0b29sTmFtZX1gO1xuXHRcdFx0Y2FzZSBcIldlYkZldGNoXCI6XG5cdFx0XHRcdHJldHVybiBpbnB1dD8udXJsID8gdGhpcy5mb3JtYXRTaW5nbGVQYXJhbSh0b29sTmFtZSwgaW5wdXQudXJsKSA6IGh0bWxgJHt0b29sTmFtZX1gO1xuXHRcdFx0Y2FzZSBcIldlYlNlYXJjaFwiOlxuXHRcdFx0XHRyZXR1cm4gaW5wdXQ/LnF1ZXJ5ID8gdGhpcy5mb3JtYXRTaW5nbGVQYXJhbSh0b29sTmFtZSwgaW5wdXQucXVlcnkpIDogaHRtbGAke3Rvb2xOYW1lfWA7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gaHRtbGAke3Rvb2xOYW1lfWA7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSByZW5kZXJUb29sVXNlQ29udGVudCh0b29sVXNlOiBhbnkpOiBUZW1wbGF0ZVJlc3VsdCB7XG5cdFx0Y29uc3QgdG9vbE5hbWUgPSB0b29sVXNlLm5hbWU7XG5cdFx0Y29uc3QgaW5wdXQgPSB0b29sVXNlLmlucHV0O1xuXG5cdFx0aWYgKHRvb2xOYW1lID09PSBcIlRvZG9Xcml0ZVwiICYmIGlucHV0Py50b2Rvcykge1xuXHRcdFx0Y29uc3QgdG9kb3MgPSBpbnB1dC50b2RvcztcblxuXHRcdFx0cmV0dXJuIHRoaXMud3JhcEluU2Nyb2xsYWJsZShcblx0XHRcdFx0aHRtbGAke3RvZG9zLm1hcCgodG9kbzogYW55KSA9PiB7XG5cdFx0XHRcdFx0Y29uc3Qgc3RhdHVzQ2xhc3MgPVxuXHRcdFx0XHRcdFx0dG9kby5zdGF0dXMgPT09IFwiY29tcGxldGVkXCJcblx0XHRcdFx0XHRcdFx0PyBcImxpbmUtdGhyb3VnaCB0ZXh0LXZzLXRleHRcIlxuXHRcdFx0XHRcdFx0XHQ6IHRvZG8uc3RhdHVzID09PSBcImluX3Byb2dyZXNzXCJcblx0XHRcdFx0XHRcdFx0XHQ/IFwidGV4dC1ncmVlbi00MDBcIlxuXHRcdFx0XHRcdFx0XHRcdDogXCJ0ZXh0LXZzLW11dGVkXCI7XG5cblx0XHRcdFx0XHRyZXR1cm4gaHRtbGBcblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJvdmVyZmxvdy1oaWRkZW4gd2hpdGVzcGFjZS1ub3dyYXAgdGV4dC1lbGxpcHNpcyAke3N0YXR1c0NsYXNzfVwiPlx1MjAyMiAke3RvZG8uY29udGVudH08L2Rpdj5cblx0XHRcdFx0XHRgO1xuXHRcdFx0XHR9KX1gLFxuXHRcdFx0XHRmYWxzZSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0aWYgKHRvb2xOYW1lID09PSBcIk5vdGVib29rRWRpdFwiICYmIGlucHV0Py5uZXdfc291cmNlKSB7XG5cdFx0XHRjb25zdCBjb250ZW50ID0gaW5wdXQubmV3X3NvdXJjZTtcblxuXHRcdFx0cmV0dXJuIHRoaXMud3JhcEluU2Nyb2xsYWJsZShjb250ZW50KTtcblx0XHR9XG5cblx0XHRpZiAodG9vbE5hbWUgPT09IFwiV3JpdGVcIiAmJiBpbnB1dD8uY29udGVudCkge1xuXHRcdFx0Y29uc3QgY29udGVudCA9IGlucHV0LmNvbnRlbnQ7XG5cblx0XHRcdHJldHVybiB0aGlzLndyYXBJblNjcm9sbGFibGUoY29udGVudCk7XG5cdFx0fVxuXG5cdFx0aWYgKHRvb2xOYW1lID09PSBcIk11bHRpRWRpdFwiICYmIGlucHV0Py5lZGl0cykge1xuXHRcdFx0Y29uc3QgZWRpdHMgPSBpbnB1dC5lZGl0cztcblxuXHRcdFx0cmV0dXJuIHRoaXMud3JhcEluU2Nyb2xsYWJsZShcblx0XHRcdFx0aHRtbGAke2VkaXRzLm1hcCgoZWRpdDogYW55LCBpbmRleDogbnVtYmVyKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3Qgb2xkU3RyID0gZWRpdC5vbGRfc3RyaW5nO1xuXHRcdFx0XHRcdGNvbnN0IG5ld1N0ciA9IGVkaXQubmV3X3N0cmluZztcblxuXHRcdFx0XHRcdGNvbnN0IGRpZmZMaW5lcyA9IHRoaXMucmVuZGVyRGlmZihvbGRTdHIsIG5ld1N0cik7XG5cblx0XHRcdFx0XHRyZXR1cm4gaHRtbGBcblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJtYi00XCI+XG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ0ZXh0LXZzLW11dGVkIG1iLTJcIj5FZGl0ICR7aW5kZXggKyAxfTo8L2Rpdj5cblx0XHRcdFx0XHRcdFx0PGRpdj4ke2RpZmZMaW5lc308L2Rpdj5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdGA7XG5cdFx0XHRcdH0pfWAsXG5cdFx0XHRcdGZhbHNlLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRpZiAodG9vbE5hbWUgPT09IFwiRWRpdFwiICYmIGlucHV0Py5vbGRfc3RyaW5nICYmIGlucHV0Py5uZXdfc3RyaW5nKSB7XG5cdFx0XHRjb25zdCBvbGRTdHIgPSBpbnB1dC5vbGRfc3RyaW5nO1xuXHRcdFx0Y29uc3QgbmV3U3RyID0gaW5wdXQubmV3X3N0cmluZztcblxuXHRcdFx0Y29uc3QgZGlmZkxpbmVzID0gdGhpcy5yZW5kZXJEaWZmKG9sZFN0ciwgbmV3U3RyKTtcblxuXHRcdFx0cmV0dXJuIHRoaXMud3JhcEluU2Nyb2xsYWJsZShodG1sYCR7ZGlmZkxpbmVzfWAsIGZhbHNlKTtcblx0XHR9XG5cblx0XHRpZiAodG9vbE5hbWUgPT09IFwiV2ViRmV0Y2hcIiAmJiBpbnB1dD8udXJsICYmIGlucHV0Py5wcm9tcHQpIHtcblx0XHRcdHJldHVybiB0aGlzLndyYXBJblNjcm9sbGFibGUoXG5cdFx0XHRcdGh0bWxgXG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cIm1iLTNcIj5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ0ZXh0LXZzLW11dGVkIG1iLTFcIj5VUkw6PC9kaXY+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwidGV4dC12cy10ZXh0XCI+JHtpbnB1dC51cmx9PC9kaXY+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0PGRpdj5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ0ZXh0LXZzLW11dGVkIG1iLTFcIj5Qcm9tcHQ6PC9kaXY+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwidGV4dC12cy10ZXh0XCI+JHtpbnB1dC5wcm9tcHR9PC9kaXY+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdGAsXG5cdFx0XHRcdGZhbHNlLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRpZiAodG9vbE5hbWUgPT09IFwiV2ViU2VhcmNoXCIgJiYgaW5wdXQ/LnF1ZXJ5KSB7XG5cdFx0XHRjb25zdCBwYXJhbXMgPSBbXTtcblx0XHRcdHBhcmFtcy5wdXNoKGh0bWxgXG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJtYi0zXCI+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cInRleHQtdnMtbXV0ZWQgbWItMVwiPlF1ZXJ5OjwvZGl2PlxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ0ZXh0LXZzLXRleHRcIj4ke2lucHV0LnF1ZXJ5fTwvZGl2PlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdGApO1xuXG5cdFx0XHRpZiAoaW5wdXQ/LmFsbG93ZWRfZG9tYWlucykge1xuXHRcdFx0XHRwYXJhbXMucHVzaChodG1sYFxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJtYi0zXCI+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwidGV4dC12cy1tdXRlZCBtYi0xXCI+QWxsb3dlZCBEb21haW5zOjwvZGl2PlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInRleHQtdnMtdGV4dFwiPiR7aW5wdXQuYWxsb3dlZF9kb21haW5zLmpvaW4oXCIsIFwiKX08L2Rpdj5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0YCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChpbnB1dD8uYmxvY2tlZF9kb21haW5zKSB7XG5cdFx0XHRcdHBhcmFtcy5wdXNoKGh0bWxgXG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cIm1iLTNcIj5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ0ZXh0LXZzLW11dGVkIG1iLTFcIj5CbG9ja2VkIERvbWFpbnM6PC9kaXY+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwidGV4dC12cy10ZXh0XCI+JHtpbnB1dC5ibG9ja2VkX2RvbWFpbnMuam9pbihcIiwgXCIpfTwvZGl2PlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRgKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRoaXMud3JhcEluU2Nyb2xsYWJsZShodG1sYCR7cGFyYW1zfWAsIGZhbHNlKTtcblx0XHR9XG5cblx0XHQvLyBEZWZhdWx0OiBzaG93IEpTT04gcGFyYW1ldGVyc1xuXHRcdHJldHVybiB0aGlzLndyYXBJblNjcm9sbGFibGUoSlNPTi5zdHJpbmdpZnkoaW5wdXQsIG51bGwsIDIpKTtcblx0fVxuXG5cdHByaXZhdGUgcmVuZGVyVG9vbFJlc3VsdCh0b29sUmVzdWx0OiBhbnksIHRvb2xVc2U/OiBhbnkpOiBUZW1wbGF0ZVJlc3VsdCB7XG5cdFx0cmV0dXJuIGh0bWxgXG5cdFx0XHQ8ZGl2IGNsYXNzPVwibWItNFwiPlxuXHRcdFx0XHQ8ZGl2XG5cdFx0XHRcdFx0Y2xhc3M9XCJ0ZXh0LXZzLW11dGVkIHB4LTQgcGItMCBjdXJzb3ItcG9pbnRlciBob3Zlcjp0ZXh0LXdoaXRlIHRyYW5zaXRpb24tY29sb3JzXCJcblx0XHRcdFx0XHRAY2xpY2s9JHt0aGlzLnRvZ2dsZUNvbnRlbnR9XG5cdFx0XHRcdD5cblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cIm1yLTJcIj5bK108L3NwYW4+XG5cdFx0XHRcdFx0VG9vbCBSZXN1bHQgJHt0b29sUmVzdWx0Py5pc19lcnJvciA/IFwiXHUyNzRDXCIgOiBcIlx1MjcwNVwifVxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PGRpdiBjbGFzcz1cImJnLXZzLWJnLXNlY29uZGFyeSBteC00IHAtNCB0ZXh0LXZzLXRleHQgaGlkZGVuIG92ZXJmbG93LXgtYXV0b1wiPlxuXHRcdFx0XHRcdDxwcmUgY2xhc3M9XCJ3aGl0ZXNwYWNlLXByZSBvdmVyZmxvdy14LWF1dG9cIiBzdHlsZT1cIndoaXRlLXNwYWNlOiBwcmU7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7XCI+XG4ke3R5cGVvZiB0b29sUmVzdWx0LmNvbnRlbnQgPT09IFwic3RyaW5nXCIgPyB0b29sUmVzdWx0LmNvbnRlbnQgOiBKU09OLnN0cmluZ2lmeSh0b29sUmVzdWx0LmNvbnRlbnQsIG51bGwsIDIpfTwvcHJlXG5cdFx0XHRcdFx0PlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0JHt0b29sVXNlXG5cdFx0XHRcdFx0PyBodG1sYFxuXHRcdFx0XHRcdFx0XHQ8ZGl2PlxuXHRcdFx0XHRcdFx0XHRcdDxkaXZcblx0XHRcdFx0XHRcdFx0XHRcdGNsYXNzPVwidGV4dC12cy1tdXRlZCBweC00IGN1cnNvci1wb2ludGVyIGhvdmVyOnRleHQtd2hpdGUgdHJhbnNpdGlvbi1jb2xvcnNcIlxuXHRcdFx0XHRcdFx0XHRcdFx0QGNsaWNrPSR7dGhpcy50b2dnbGVDb250ZW50fVxuXHRcdFx0XHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwibXItMlwiPlsrXTwvc3Bhbj5cblx0XHRcdFx0XHRcdFx0XHRcdFJhdyBUb29sIENhbGxcblx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiYmctdnMtYmctc2Vjb25kYXJ5IG14LTQgcC00IHRleHQtdnMtdGV4dCBoaWRkZW5cIj5cblx0XHRcdFx0XHRcdFx0XHRcdCR7dGhpcy53cmFwSW5TY3JvbGxhYmxlKEpTT04uc3RyaW5naWZ5KHRvb2xVc2UsIG51bGwsIDIpKX1cblx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRgXG5cdFx0XHRcdFx0OiBcIlwifVxuXHRcdFx0PC9kaXY+XG5cdFx0YDtcblx0fVxuXG5cdHByaXZhdGUgcmVuZGVyVG9vbENvbnRhaW5lcihcblx0XHR0b29sVXNlOiBhbnksXG5cdFx0dG9vbFJlc3VsdD86IGFueSxcblx0XHRvcHRpb25zOiB7XG5cdFx0XHRpc0NvbGxhcHNpYmxlPzogYm9vbGVhbjtcblx0XHRcdGlzQ29sbGFwc2VkPzogYm9vbGVhbjtcblx0XHRcdGlzQ2xpY2tUb0V4cGFuZD86IGJvb2xlYW47XG5cdFx0XHRjdXN0b21Db250ZW50PzogVGVtcGxhdGVSZXN1bHQ7XG5cdFx0fSA9IHt9LFxuXHQpOiBUZW1wbGF0ZVJlc3VsdCB7XG5cdFx0Y29uc3QgeyBpc0NvbGxhcHNpYmxlID0gZmFsc2UsIGlzQ29sbGFwc2VkID0gZmFsc2UsIGlzQ2xpY2tUb0V4cGFuZCA9IGZhbHNlLCBjdXN0b21Db250ZW50IH0gPSBvcHRpb25zO1xuXG5cdFx0Y29uc3QgY29udGVudERpdiA9IGN1c3RvbUNvbnRlbnQgfHwgaHRtbGAke3RoaXMucmVuZGVyVG9vbFVzZUNvbnRlbnQodG9vbFVzZSl9YDtcblx0XHRjb25zdCBoZWFkZXJDbGFzc2VzID0gaXNDbGlja1RvRXhwYW5kXG5cdFx0XHQ/IFwidGV4dC12cy10eXBlIHB4LTQgYnJlYWstYWxsIGN1cnNvci1wb2ludGVyIGhvdmVyOnRleHQtd2hpdGUgdHJhbnNpdGlvbi1jb2xvcnNcIlxuXHRcdFx0OiBcInRleHQtdnMtdHlwZSBweC00IGJyZWFrLWFsbFwiO1xuXHRcdGNvbnN0IGNvbnRlbnRDbGFzc2VzID0gaXNDb2xsYXBzZWRcblx0XHRcdD8gXCJiZy12cy1iZy1zZWNvbmRhcnkgbXgtNCBwLTQgdGV4dC12cy10ZXh0IGhpZGRlblwiXG5cdFx0XHQ6IFwiYmctdnMtYmctc2Vjb25kYXJ5IG14LTQgcC00IHRleHQtdnMtdGV4dFwiO1xuXG5cdFx0cmV0dXJuIGh0bWxgXG5cdFx0XHQ8ZGl2IGNsYXNzPVwibXQtNCBtYi00XCI+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCIke2hlYWRlckNsYXNzZXN9XCIgQGNsaWNrPSR7aXNDbGlja1RvRXhwYW5kID8gdGhpcy50b2dnbGVDb250ZW50IDogdW5kZWZpbmVkfT5cblx0XHRcdFx0XHQke2lzQ29sbGFwc2libGUgPyBodG1sYDxzcGFuIGNsYXNzPVwibXItMlwiPlske2lzQ29sbGFwc2VkID8gXCIrXCIgOiBcIi1cIn1dPC9zcGFuPmAgOiBcIlwifVxuXHRcdFx0XHRcdCR7dGhpcy5nZXRUb29sRGlzcGxheU5hbWUodG9vbFVzZSl9XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwiJHtjb250ZW50Q2xhc3Nlc31cIj4ke2NvbnRlbnREaXZ9PC9kaXY+XG5cdFx0XHRcdCR7dG9vbFJlc3VsdCA/IHRoaXMucmVuZGVyVG9vbFJlc3VsdCh0b29sUmVzdWx0LCB0b29sVXNlKSA6IFwiXCJ9XG5cdFx0XHQ8L2Rpdj5cblx0XHRgO1xuXHR9XG5cblx0cHJpdmF0ZSByZW5kZXJXcml0ZVByZXZpZXcodG9vbFVzZTogYW55KTogVGVtcGxhdGVSZXN1bHQge1xuXHRcdGNvbnN0IGlucHV0ID0gdG9vbFVzZS5pbnB1dDtcblx0XHRpZiAoIWlucHV0Py5jb250ZW50KSB7XG5cdFx0XHRyZXR1cm4gaHRtbGA8ZGl2IGNsYXNzPVwidGV4dC12cy1tdXRlZFwiPk5vIGNvbnRlbnQ8L2Rpdj5gO1xuXHRcdH1cblxuXHRcdGNvbnN0IGNvbnRlbnQgPSBpbnB1dC5jb250ZW50O1xuXHRcdGNvbnN0IGxpbmVzID0gY29udGVudC5zcGxpdChcIlxcblwiKTtcblx0XHRjb25zdCBwcmV2aWV3ID0gbGluZXMuc2xpY2UoMCwgMTApO1xuXHRcdGNvbnN0IGhhc01vcmUgPSBsaW5lcy5sZW5ndGggPiAxMDtcblxuXHRcdHJldHVybiBodG1sYFxuXHRcdFx0JHt0aGlzLndyYXBJblNjcm9sbGFibGUocHJldmlldy5qb2luKFwiXFxuXCIpKX1cblx0XHRcdCR7aGFzTW9yZSA/IGh0bWxgPGRpdiBjbGFzcz1cInRleHQtdnMtbXV0ZWRcIj4uLi4gJHtsaW5lcy5sZW5ndGggLSAxMH0gbW9yZSBsaW5lcyAoY2xpY2sgdG8gZXhwYW5kKTwvZGl2PmAgOiBcIlwifVxuXHRcdGA7XG5cdH1cblxuXHRwcml2YXRlIHJlbmRlckRpZmYob2xkU3RyOiBzdHJpbmcsIG5ld1N0cjogc3RyaW5nKTogVGVtcGxhdGVSZXN1bHRbXSB7XG5cdFx0Y29uc3QgZGlmZiA9IERpZmYuZGlmZkxpbmVzKG9sZFN0ciwgbmV3U3RyKTtcblx0XHRjb25zdCBkaWZmTGluZXMgPSBbXTtcblxuXHRcdGZvciAoY29uc3QgcGFydCBvZiBkaWZmKSB7XG5cdFx0XHRjb25zdCBsaW5lcyA9IHBhcnQudmFsdWUuc3BsaXQoXCJcXG5cIik7XG5cdFx0XHQvLyBSZW1vdmUgZW1wdHkgbGFzdCBsaW5lIGZyb20gc3BsaXQgaWYgaXQgZXhpc3RzXG5cdFx0XHRpZiAobGluZXNbbGluZXMubGVuZ3RoIC0gMV0gPT09IFwiXCIpIHtcblx0XHRcdFx0bGluZXMucG9wKCk7XG5cdFx0XHR9XG5cblx0XHRcdGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuXHRcdFx0XHRpZiAocGFydC5hZGRlZCkge1xuXHRcdFx0XHRcdGRpZmZMaW5lcy5wdXNoKGh0bWxgPGRpdiBjbGFzcz1cImJnLWdyZWVuLTYwMC8yMFwiPjxwcmUgY2xhc3M9XCJ0ZXh0LXZzLXRleHQgbS0wXCI+KyAke2xpbmV9PC9wcmU+PC9kaXY+YCk7XG5cdFx0XHRcdH0gZWxzZSBpZiAocGFydC5yZW1vdmVkKSB7XG5cdFx0XHRcdFx0ZGlmZkxpbmVzLnB1c2goaHRtbGA8ZGl2IGNsYXNzPVwiYmctcmVkLTYwMC8yMFwiPjxwcmUgY2xhc3M9XCJ0ZXh0LXZzLXRleHQgbS0wXCI+LSAke2xpbmV9PC9wcmU+PC9kaXY+YCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZGlmZkxpbmVzLnB1c2goaHRtbGA8ZGl2PjxwcmUgY2xhc3M9XCJ0ZXh0LXZzLXRleHQgbS0wXCI+ICAke2xpbmV9PC9wcmU+PC9kaXY+YCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gZGlmZkxpbmVzO1xuXHR9XG5cblx0cHJpdmF0ZSBoYXNUb29scyhjb252ZXJzYXRpb246IFNpbXBsZUNvbnZlcnNhdGlvbik6IGJvb2xlYW4ge1xuXHRcdHJldHVybiAhIShjb252ZXJzYXRpb24uZmluYWxQYWlyLnJlcXVlc3QudG9vbHMgJiYgY29udmVyc2F0aW9uLmZpbmFsUGFpci5yZXF1ZXN0LnRvb2xzLmxlbmd0aCA+IDApO1xuXHR9XG5cblx0cHJpdmF0ZSByZW5kZXJUb29scyh0b29sczogVG9vbFVuaW9uW10pOiBUZW1wbGF0ZVJlc3VsdCB7XG5cdFx0cmV0dXJuIGh0bWxgXG5cdFx0XHQke3Rvb2xzLm1hcCgodG9vbCkgPT4ge1xuXHRcdFx0XHRpZiAoXCJuYW1lXCIgaW4gdG9vbCAmJiB0b29sLm5hbWUpIHtcblx0XHRcdFx0XHRjb25zdCBkZXNjcmlwdGlvbiA9IChcImRlc2NyaXB0aW9uXCIgaW4gdG9vbCAmJiB0b29sLmRlc2NyaXB0aW9uKSB8fCBcIk5vIGRlc2NyaXB0aW9uXCI7XG5cblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5yZW5kZXJDb2xsYXBzaWJsZVNlY3Rpb24oXG5cdFx0XHRcdFx0XHR0b29sLm5hbWUsXG5cdFx0XHRcdFx0XHRodG1sYFxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwidGV4dC12cy10ZXh0IG1sLTQgbWItMyBtYXJrZG93bi1jb250ZW50XCI+XG5cdFx0XHRcdFx0XHRcdFx0JHt1bnNhZmVIVE1MKG1hcmtkb3duVG9IdG1sKGRlc2NyaXB0aW9uKSl9XG5cdFx0XHRcdFx0XHRcdDwvZGl2PlxuXG5cdFx0XHRcdFx0XHRcdCR7XCJpbnB1dF9zY2hlbWFcIiBpbiB0b29sICYmIHRvb2wuaW5wdXRfc2NoZW1hICYmIHR5cGVvZiB0b29sLmlucHV0X3NjaGVtYSA9PT0gXCJvYmplY3RcIlxuXHRcdFx0XHRcdFx0XHRcdD8gKCgpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgc2NoZW1hID0gdG9vbC5pbnB1dF9zY2hlbWEgYXMgYW55O1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoc2NoZW1hLnByb3BlcnRpZXMpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gaHRtbGBcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ0ZXh0LXZzLW11dGVkIG1iLTJcIj5QYXJhbWV0ZXJzOjwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0JHtPYmplY3QuZW50cmllcyhzY2hlbWEucHJvcGVydGllcykubWFwKChbcGFyYW1OYW1lLCBwYXJhbURlZl0pID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgZGVmID0gcGFyYW1EZWYgYXMgYW55O1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCByZXF1aXJlZCA9IHNjaGVtYS5yZXF1aXJlZD8uaW5jbHVkZXMocGFyYW1OYW1lKSA/IFwiIChyZXF1aXJlZClcIiA6IFwiXCI7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IHR5cGUgPSBkZWYudHlwZSA/IGAgWyR7ZGVmLnR5cGV9XWAgOiBcIlwiO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBkZXNjID0gZGVmLmRlc2NyaXB0aW9uID8gYCAtICR7ZGVmLmRlc2NyaXB0aW9ufWAgOiBcIlwiO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gaHRtbGBcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwibWwtNCBtYi0xXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cInRleHQtdnMtdXNlclwiPiR7cGFyYW1OYW1lfTwvc3Bhbj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwidGV4dC12cy1tdXRlZFwiPiR7dHlwZX0ke3JlcXVpcmVkfSR7ZGVzY308L3NwYW4+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGA7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KX1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRgO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBodG1sYGA7XG5cdFx0XHRcdFx0XHRcdFx0XHR9KSgpXG5cdFx0XHRcdFx0XHRcdFx0OiBodG1sYGB9XG5cdFx0XHRcdFx0XHRgLFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0aXRsZUNsYXNzZXM6IFwidGV4dC12cy10eXBlIGZvbnQtYm9sZFwiLFxuXHRcdFx0XHRcdFx0XHRjb250YWluZXJDbGFzc2VzOiBcIm1iLTRcIixcblx0XHRcdFx0XHRcdFx0aXNFeHBhbmRlZDogdHJ1ZSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gaHRtbGA8cHJlIGNsYXNzPVwibWItNFwiPiR7SlNPTi5zdHJpbmdpZnkodG9vbCwgbnVsbCwgMil9PC9wcmU+YDtcblx0XHRcdH0pfVxuXHRcdGA7XG5cdH1cblxuXHRwcml2YXRlIHJlbmRlckNvbnZlcnNhdGlvbkNvbnRlbnQoY29udmVyc2F0aW9uOiBTaW1wbGVDb252ZXJzYXRpb24pOiBUZW1wbGF0ZVJlc3VsdCB7XG5cdFx0cmV0dXJuIGh0bWxgXG5cdFx0XHQ8IS0tIFN5c3RlbSBQcm9tcHQgKEV4cGFuZGFibGUpIC0tPlxuXHRcdFx0JHtjb252ZXJzYXRpb24uc3lzdGVtXG5cdFx0XHRcdD8gdGhpcy5yZW5kZXJDb2xsYXBzaWJsZVNlY3Rpb24oXG5cdFx0XHRcdFx0XHRcIlN5c3RlbSBQcm9tcHRcIixcblx0XHRcdFx0XHRcdGh0bWxgPGRpdiBjbGFzcz1cInRleHQtdnMtdGV4dCBtYXJrZG93bi1jb250ZW50IG1iLTRcIj5cblx0XHRcdFx0XHRcdFx0JHt1bnNhZmVIVE1MKHRoaXMuZm9ybWF0U3lzdGVtKGNvbnZlcnNhdGlvbi5zeXN0ZW0pKX1cblx0XHRcdFx0XHRcdDwvZGl2PmAsXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRpdGxlQ2xhc3NlczogXCJ0ZXh0LXZzLWZ1bmN0aW9uXCIsXG5cdFx0XHRcdFx0XHRcdGNvbnRhaW5lckNsYXNzZXM6IFwicHgtNCBtdC00XCIsXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdClcblx0XHRcdFx0OiBcIlwifVxuXG5cdFx0XHQ8IS0tIFRvb2xzIChFeHBhbmRhYmxlKSAtLT5cblx0XHRcdCR7dGhpcy5oYXNUb29scyhjb252ZXJzYXRpb24pXG5cdFx0XHRcdD8gdGhpcy5yZW5kZXJDb2xsYXBzaWJsZVNlY3Rpb24oXG5cdFx0XHRcdFx0XHRcIlRvb2xzXCIsXG5cdFx0XHRcdFx0XHRodG1sYDxkaXYgY2xhc3M9XCJtbC00XCI+XG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ0ZXh0LXZzLXRleHRcIj4ke3RoaXMucmVuZGVyVG9vbHMoY29udmVyc2F0aW9uLmZpbmFsUGFpci5yZXF1ZXN0LnRvb2xzIHx8IFtdKX08L2Rpdj5cblx0XHRcdFx0XHRcdDwvZGl2PmAsXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRpdGxlQ2xhc3NlczogXCJ0ZXh0LXZzLXR5cGVcIixcblx0XHRcdFx0XHRcdFx0Y29udGFpbmVyQ2xhc3NlczogXCJweC00XCIsXG5cdFx0XHRcdFx0XHRcdGNvdW50OiBjb252ZXJzYXRpb24uZmluYWxQYWlyLnJlcXVlc3QudG9vbHM/Lmxlbmd0aCB8fCAwLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQpXG5cdFx0XHRcdDogXCJcIn1cblxuXHRcdFx0PCEtLSBDb252ZXJzYXRpb24gTWVzc2FnZXMgLS0+XG5cdFx0XHQ8ZGl2IGNsYXNzPVwicHgtNCBtdC00XCI+XG5cdFx0XHRcdCR7Y29udmVyc2F0aW9uLm1lc3NhZ2VzXG5cdFx0XHRcdFx0LmZpbHRlcigobWVzc2FnZSkgPT4gIShtZXNzYWdlIGFzIEVuaGFuY2VkTWVzc2FnZVBhcmFtKS5oaWRlKVxuXHRcdFx0XHRcdC5tYXAoXG5cdFx0XHRcdFx0XHQobWVzc2FnZSwgbXNnSW5kZXgpID0+IGh0bWxgXG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJtYi00XCI+XG5cdFx0XHRcdFx0XHRcdFx0PGRpdlxuXHRcdFx0XHRcdFx0XHRcdFx0Y2xhc3M9XCJmb250LWJvbGQgdXBwZXJjYXNlICR7bWVzc2FnZS5yb2xlID09PSBcInVzZXJcIiA/IFwidGV4dC12cy11c2VyXCIgOiBcInRleHQtdnMtYXNzaXN0YW50XCJ9XCJcblx0XHRcdFx0XHRcdFx0XHQ+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8c3Bhbj4ke21lc3NhZ2Uucm9sZX08L3NwYW4+XG5cdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInRleHQtdnMtdGV4dFwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0JHt0aGlzLmZvcm1hdENvbnRlbnQobWVzc2FnZS5jb250ZW50LCAobWVzc2FnZSBhcyBFbmhhbmNlZE1lc3NhZ2VQYXJhbSkudG9vbFJlc3VsdHMpfVxuXHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdGAsXG5cdFx0XHRcdFx0KX1cblxuXHRcdFx0XHQ8IS0tIEFzc2lzdGFudCBSZXNwb25zZSAtLT5cblx0XHRcdFx0PGRpdiBjbGFzcz1cIm1iLTRcIj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZm9udC1ib2xkIHVwcGVyY2FzZSB0ZXh0LXZzLWFzc2lzdGFudFwiPlxuXHRcdFx0XHRcdFx0PHNwYW4+YXNzaXN0YW50PC9zcGFuPlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ0ZXh0LXZzLXRleHRcIj4ke3RoaXMuZm9ybWF0UmVzcG9uc2VDb250ZW50KGNvbnZlcnNhdGlvbi5yZXNwb25zZSl9PC9kaXY+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0PC9kaXY+XG5cdFx0YDtcblx0fVxuXG5cdHJlbmRlcigpIHtcblx0XHRpZiAodGhpcy5jb252ZXJzYXRpb25zLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIGh0bWxgPGRpdj5ObyBjb252ZXJzYXRpb25zIGZvdW5kLjwvZGl2PmA7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGh0bWxgXG5cdFx0XHQ8ZGl2IGNsYXNzPVwibWF4LXctWzYwZW1dIG14LWF1dG9cIj5cblx0XHRcdFx0JHt0aGlzLmNvbnZlcnNhdGlvbnMubWFwKFxuXHRcdFx0XHRcdChjb252ZXJzYXRpb24pID0+IGh0bWxgXG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwibXQtOCBmaXJzdDptdC0wXCI+XG5cdFx0XHRcdFx0XHRcdCR7Y29udmVyc2F0aW9uLmNvbXBhY3RlZFxuXHRcdFx0XHRcdFx0XHRcdD8gaHRtbGBcblx0XHRcdFx0XHRcdFx0XHRcdFx0PCEtLSBDb21wYWN0ZWQgQ29udmVyc2F0aW9uIChDb2xsYXBzZWQpIC0tPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y2xhc3M9XCJjdXJzb3ItcG9pbnRlciB0ZXh0LXJlZC00MDAgaG92ZXI6dGV4dC1yZWQtMzAwIHRyYW5zaXRpb24tY29sb3JzIGJvcmRlciBib3JkZXItcmVkLTcwMCBwLTRcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdEBjbGljaz0ke3RoaXMudG9nZ2xlQ29udGVudH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwibXItMlwiPlsrXTwvc3Bhbj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8c3Bhbj5Db21wYWN0ZWQgKGNsaWNrIHRvIHZpZXcgZGV0YWlscyk8L3NwYW4+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiaGlkZGVuIG10LThcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8IS0tIENvbnZlcnNhdGlvbiBIZWFkZXIgLS0+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImJvcmRlciBib3JkZXItcmVkLTcwMCBwLTQgbWItMFwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInRleHQtcmVkLTQwMFwiPiR7QXJyYXkuZnJvbShjb252ZXJzYXRpb24ubW9kZWxzKS5qb2luKFwiLCBcIil9PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwidGV4dC12cy1tdXRlZFwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQke25ldyBEYXRlKGNvbnZlcnNhdGlvbi5tZXRhZGF0YS5zdGFydFRpbWUpLnRvTG9jYWxlU3RyaW5nKCl9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwibWwtNFwiPiR7Y29udmVyc2F0aW9uLm1lc3NhZ2VzLmxlbmd0aCArIDF9IG1lc3NhZ2VzPC9zcGFuPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0JHt0aGlzLnJlbmRlckNvbnZlcnNhdGlvbkNvbnRlbnQoY29udmVyc2F0aW9uKX1cblx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHRgXG5cdFx0XHRcdFx0XHRcdFx0OiBodG1sYFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8IS0tIFJlZ3VsYXIgQ29udmVyc2F0aW9uIC0tPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8IS0tIENvbnZlcnNhdGlvbiBIZWFkZXIgLS0+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJib3JkZXIgYm9yZGVyLXZzLWhpZ2hsaWdodCBwLTQgbWItMFwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ0ZXh0LXZzLWFzc2lzdGFudFwiPiR7QXJyYXkuZnJvbShjb252ZXJzYXRpb24ubW9kZWxzKS5qb2luKFwiLCBcIil9PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInRleHQtdnMtbXV0ZWRcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCR7bmV3IERhdGUoY29udmVyc2F0aW9uLm1ldGFkYXRhLnN0YXJ0VGltZSkudG9Mb2NhbGVTdHJpbmcoKX1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwibWwtNFwiPiR7Y29udmVyc2F0aW9uLm1lc3NhZ2VzLmxlbmd0aCArIDF9IG1lc3NhZ2VzPC9zcGFuPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0JHt0aGlzLnJlbmRlckNvbnZlcnNhdGlvbkNvbnRlbnQoY29udmVyc2F0aW9uKX1cblx0XHRcdFx0XHRcdFx0XHRcdGB9XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRgLFxuXHRcdFx0XHQpfVxuXHRcdFx0PC9kaXY+XG5cdFx0YDtcblx0fVxufVxuIiwgImltcG9ydCB7IExpdEVsZW1lbnQsIGh0bWwgfSBmcm9tIFwibGl0XCI7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSB9IGZyb20gXCJsaXQvZGVjb3JhdG9ycy5qc1wiO1xuaW1wb3J0IHsgUmF3UGFpciB9IGZyb20gXCIuLi8uLi8uLi9zcmMvdHlwZXNcIjtcblxuQGN1c3RvbUVsZW1lbnQoXCJyYXctcGFpcnMtdmlld1wiKVxuZXhwb3J0IGNsYXNzIFJhd1BhaXJzVmlldyBleHRlbmRzIExpdEVsZW1lbnQge1xuXHRAcHJvcGVydHkoeyB0eXBlOiBBcnJheSB9KSByYXdQYWlyczogUmF3UGFpcltdID0gW107XG5cblx0Ly8gRGlzYWJsZSBzaGFkb3cgRE9NIHRvIHVzZSBnbG9iYWwgVGFpbHdpbmQgc3R5bGVzXG5cdGNyZWF0ZVJlbmRlclJvb3QoKSB7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRyZW5kZXIoKSB7XG5cdFx0aWYgKHRoaXMucmF3UGFpcnMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gaHRtbGA8ZGl2IGNsYXNzPVwidGV4dC12cy1tdXRlZFwiPk5vIHJhdyBwYWlycyBmb3VuZC48L2Rpdj5gO1xuXHRcdH1cblxuXHRcdC8vIEZpbHRlciBvdXQgcGFpcnMgd2l0aCBudWxsIHJlc3BvbnNlcyBmb3IgZGlzcGxheVxuXHRcdGNvbnN0IHZhbGlkUGFpcnMgPSB0aGlzLnJhd1BhaXJzLmZpbHRlcigocGFpcikgPT4gcGFpci5yZXNwb25zZSAhPT0gbnVsbCk7XG5cblx0XHRyZXR1cm4gaHRtbGBcblx0XHRcdDxkaXY+XG5cdFx0XHRcdCR7dmFsaWRQYWlycy5tYXAoXG5cdFx0XHRcdFx0KHBhaXIsIGluZGV4KSA9PiBodG1sYFxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cIm10LTggZmlyc3Q6bXQtMFwiPlxuXHRcdFx0XHRcdFx0XHQ8IS0tIFBhaXIgSGVhZGVyIC0tPlxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiYm9yZGVyIGJvcmRlci12cy1oaWdobGlnaHQgcC00IG1iLTBcIj5cblx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwidGV4dC12cy1hc3Npc3RhbnQgZm9udC1ib2xkXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHQke3BhaXIucmVxdWVzdC5tZXRob2R9ICR7dGhpcy5nZXRVcmxQYXRoKHBhaXIucmVxdWVzdC51cmwpfVxuXHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ0ZXh0LXZzLW11dGVkXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRSYXcgUGFpciAke2luZGV4ICsgMX0gXHUyMDIyICR7dGhpcy5nZXRNb2RlbE5hbWUocGFpcil9IFx1MjAyMiBTdGF0dXMgJHtwYWlyLnJlc3BvbnNlIS5zdGF0dXNfY29kZX0gXHUyMDIyXG5cdFx0XHRcdFx0XHRcdFx0XHQke25ldyBEYXRlKHBhaXIubG9nZ2VkX2F0KS50b0xvY2FsZVN0cmluZygpfVxuXHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblxuXHRcdFx0XHRcdFx0XHQ8IS0tIFJlcXVlc3QgU2VjdGlvbiAtLT5cblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInB4LTQgbXQtNFwiPlxuXHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJtYi00XCI+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgdGV4dC12cy11c2VyIGZvbnQtYm9sZCBob3Zlcjp0ZXh0LXdoaXRlIHRyYW5zaXRpb24tY29sb3JzXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0QGNsaWNrPSR7KGU6IEV2ZW50KSA9PiB0aGlzLnRvZ2dsZUNvbnRlbnQoZSl9XG5cdFx0XHRcdFx0XHRcdFx0XHQ+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwibXItMlwiPlsrXTwvc3Bhbj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PHNwYW4+UmVxdWVzdDwvc3Bhbj5cblx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImhpZGRlbiBtdC0yXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJiZy12cy1iZy1zZWNvbmRhcnkgcC00IHRleHQtdnMtdGV4dCBvdmVyZmxvdy14LWF1dG9cIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8cHJlIGNsYXNzPVwid2hpdGVzcGFjZS1wcmUgdGV4dC12cy10ZXh0IG0tMFwiPiR7dGhpcy5mb3JtYXRKc29uKHBhaXIucmVxdWVzdCl9PC9wcmU+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cblx0XHRcdFx0XHRcdFx0XHQ8IS0tIFJlc3BvbnNlIFNlY3Rpb24gLS0+XG5cdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cIm1iLTRcIj5cblx0XHRcdFx0XHRcdFx0XHRcdDxkaXZcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y2xhc3M9XCJjdXJzb3ItcG9pbnRlciB0ZXh0LXZzLWFzc2lzdGFudCBmb250LWJvbGQgaG92ZXI6dGV4dC13aGl0ZSB0cmFuc2l0aW9uLWNvbG9yc1wiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdEBjbGljaz0keyhlOiBFdmVudCkgPT4gdGhpcy50b2dnbGVDb250ZW50KGUpfVxuXHRcdFx0XHRcdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cIm1yLTJcIj5bK108L3NwYW4+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuPlJlc3BvbnNlPC9zcGFuPlxuXHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiaGlkZGVuIG10LTJcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImJnLXZzLWJnLXNlY29uZGFyeSBwLTQgdGV4dC12cy10ZXh0IG92ZXJmbG93LXgtYXV0b1wiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxwcmUgY2xhc3M9XCJ3aGl0ZXNwYWNlLXByZSB0ZXh0LXZzLXRleHQgbS0wXCI+JHt0aGlzLmZvcm1hdEpzb24ocGFpci5yZXNwb25zZSl9PC9wcmU+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cblx0XHRcdFx0XHRcdFx0XHQ8IS0tIFNTRSBFdmVudHMgU2VjdGlvbiAtLT5cblx0XHRcdFx0XHRcdFx0XHQke3BhaXIucmVzcG9uc2UhLmV2ZW50cyAmJiBwYWlyLnJlc3BvbnNlIS5ldmVudHMubGVuZ3RoID4gMFxuXHRcdFx0XHRcdFx0XHRcdFx0PyBodG1sYFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJtYi00XCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgdGV4dC12cy10eXBlIGZvbnQtYm9sZCBob3Zlcjp0ZXh0LXdoaXRlIHRyYW5zaXRpb24tY29sb3JzXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0QGNsaWNrPSR7KGU6IEV2ZW50KSA9PiB0aGlzLnRvZ2dsZUNvbnRlbnQoZSl9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwibXItMlwiPlsrXTwvc3Bhbj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PHNwYW4+U1NFIEV2ZW50cyAoJHtwYWlyLnJlc3BvbnNlIS5ldmVudHMubGVuZ3RofSk8L3NwYW4+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJoaWRkZW4gbXQtMlwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiYmctdnMtYmctc2Vjb25kYXJ5IHAtNCB0ZXh0LXZzLXRleHQgb3ZlcmZsb3cteC1hdXRvXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PHByZSBjbGFzcz1cIndoaXRlc3BhY2UtcHJlIHRleHQtdnMtdGV4dCBtLTBcIj5cbiR7dGhpcy5mb3JtYXRKc29uKHBhaXIucmVzcG9uc2UhLmV2ZW50cyl9PC9wcmVcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGBcblx0XHRcdFx0XHRcdFx0XHRcdDogXCJcIn1cblx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRgLFxuXHRcdFx0XHQpfVxuXHRcdFx0PC9kaXY+XG5cdFx0YDtcblx0fVxuXG5cdHByaXZhdGUgZ2V0VXJsUGF0aCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG5cdFx0dHJ5IHtcblx0XHRcdHJldHVybiBuZXcgVVJMKHVybCkucGF0aG5hbWU7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRyZXR1cm4gdXJsO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgZ2V0TW9kZWxOYW1lKHBhaXI6IFJhd1BhaXIpOiBzdHJpbmcge1xuXHRcdC8vIFRyeSB0byBleHRyYWN0IGZyb20gQmVkcm9jayBVUkwgZmlyc3Rcblx0XHRpZiAocGFpci5yZXF1ZXN0LnVybCAmJiBwYWlyLnJlcXVlc3QudXJsLmluY2x1ZGVzKFwiYmVkcm9jay1ydW50aW1lXCIpKSB7XG5cdFx0XHRjb25zdCB1cmxNYXRjaCA9IHBhaXIucmVxdWVzdC51cmwubWF0Y2goL1xcL21vZGVsXFwvKFteXFwvXSspLyk7XG5cdFx0XHRpZiAodXJsTWF0Y2ggJiYgdXJsTWF0Y2hbMV0pIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMubm9ybWFsaXplTW9kZWxOYW1lKHVybE1hdGNoWzFdKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBUcnkgdG8gZ2V0IG1vZGVsIGZyb20gcmVxdWVzdCBib2R5XG5cdFx0aWYgKHBhaXIucmVxdWVzdC5ib2R5ICYmIHBhaXIucmVxdWVzdC5ib2R5Lm1vZGVsKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5ub3JtYWxpemVNb2RlbE5hbWUocGFpci5yZXF1ZXN0LmJvZHkubW9kZWwpO1xuXHRcdH1cblxuXHRcdC8vIERlZmF1bHQgZmFsbGJhY2tcblx0XHRyZXR1cm4gXCJ1bmtub3duXCI7XG5cdH1cblxuXHRwcml2YXRlIG5vcm1hbGl6ZU1vZGVsTmFtZShtb2RlbE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG5cdFx0aWYgKCFtb2RlbE5hbWUpIHJldHVybiBcInVua25vd25cIjtcblxuXHRcdC8vIEhhbmRsZSBCZWRyb2NrIG1vZGVsIG5hbWVzXG5cdFx0aWYgKG1vZGVsTmFtZS5zdGFydHNXaXRoKFwidXMuYW50aHJvcGljLlwiKSkge1xuXHRcdFx0Ly8gQ29udmVydCBcInVzLmFudGhyb3BpYy5jbGF1ZGUtMy01LXNvbm5ldC0yMDI0MTAyMi12MTowXCIgdG8gXCJjbGF1ZGUtMy01LXNvbm5ldC0yMDI0MTAyMlwiXG5cdFx0XHRjb25zdCBtYXRjaCA9IG1vZGVsTmFtZS5tYXRjaCgvdXNcXC5hbnRocm9waWNcXC4oW146XSspLyk7XG5cdFx0XHRpZiAobWF0Y2ggJiYgbWF0Y2hbMV0pIHtcblx0XHRcdFx0cmV0dXJuIG1hdGNoWzFdO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFJldHVybiBhcy1pcyBmb3Igb3RoZXIgZm9ybWF0c1xuXHRcdHJldHVybiBtb2RlbE5hbWU7XG5cdH1cblxuXHRwcml2YXRlIGZvcm1hdEpzb24ob2JqOiBhbnkpOiBzdHJpbmcge1xuXHRcdHRyeSB7XG5cdFx0XHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkob2JqLCBudWxsLCAyKTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdHJldHVybiBTdHJpbmcob2JqKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIHRvZ2dsZUNvbnRlbnQoZTogRXZlbnQpIHtcblx0XHRjb25zdCBoZWFkZXIgPSBlLmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG5cdFx0Y29uc3QgY29udGVudCA9IGhlYWRlci5uZXh0RWxlbWVudFNpYmxpbmcgYXMgSFRNTEVsZW1lbnQ7XG5cdFx0Y29uc3QgdG9nZ2xlID0gaGVhZGVyLnF1ZXJ5U2VsZWN0b3IoXCJzcGFuOmZpcnN0LWNoaWxkXCIpIGFzIEhUTUxFbGVtZW50O1xuXG5cdFx0aWYgKGNvbnRlbnQgJiYgdG9nZ2xlKSB7XG5cdFx0XHRjb25zdCBpc0hpZGRlbiA9IGNvbnRlbnQuY2xhc3NMaXN0LmNvbnRhaW5zKFwiaGlkZGVuXCIpO1xuXHRcdFx0Y29udGVudC5jbGFzc0xpc3QudG9nZ2xlKFwiaGlkZGVuXCIsICFpc0hpZGRlbik7XG5cdFx0XHR0b2dnbGUudGV4dENvbnRlbnQgPSBpc0hpZGRlbiA/IFwiWy1dXCIgOiBcIlsrXVwiO1xuXHRcdH1cblx0fVxufVxuIiwgImltcG9ydCB7IExpdEVsZW1lbnQsIGh0bWwgfSBmcm9tIFwibGl0XCI7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSB9IGZyb20gXCJsaXQvZGVjb3JhdG9ycy5qc1wiO1xuaW1wb3J0IHsgUHJvY2Vzc2VkUGFpciB9IGZyb20gXCIuLi8uLi8uLi9zcmMvc2hhcmVkLWNvbnZlcnNhdGlvbi1wcm9jZXNzb3JcIjtcblxuQGN1c3RvbUVsZW1lbnQoXCJqc29uLXZpZXdcIilcbmV4cG9ydCBjbGFzcyBKc29uVmlldyBleHRlbmRzIExpdEVsZW1lbnQge1xuXHRAcHJvcGVydHkoeyB0eXBlOiBBcnJheSB9KSBwcm9jZXNzZWRQYWlyczogUHJvY2Vzc2VkUGFpcltdID0gW107XG5cblx0Ly8gRGlzYWJsZSBzaGFkb3cgRE9NIHRvIHVzZSBnbG9iYWwgQ1NTXG5cdGNyZWF0ZVJlbmRlclJvb3QoKSB7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRyZW5kZXIoKSB7XG5cdFx0aWYgKHRoaXMucHJvY2Vzc2VkUGFpcnMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gaHRtbGA8ZGl2IGNsYXNzPVwidGV4dC12cy1tdXRlZFwiPk5vIHByb2Nlc3NlZCBwYWlycyBmb3VuZC48L2Rpdj5gO1xuXHRcdH1cblxuXHRcdHJldHVybiBodG1sYFxuXHRcdFx0PGRpdj5cblx0XHRcdFx0JHt0aGlzLnByb2Nlc3NlZFBhaXJzLm1hcChcblx0XHRcdFx0XHQocGFpciwgaW5kZXgpID0+IGh0bWxgXG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwibXQtOCBmaXJzdDptdC0wXCI+XG5cdFx0XHRcdFx0XHRcdDwhLS0gUGFpciBIZWFkZXIgLS0+XG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJib3JkZXIgYm9yZGVyLXZzLWhpZ2hsaWdodCBwLTQgbWItMFwiPlxuXHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ0ZXh0LXZzLWFzc2lzdGFudCBmb250LWJvbGRcIj4ke3BhaXIubW9kZWx9PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInRleHQtdnMtbXV0ZWRcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFBhaXIgJHtpbmRleCArIDF9IFx1MjAyMiAke3BhaXIuaXNTdHJlYW1pbmcgPyBcInN0cmVhbWluZ1wiIDogXCJub24tc3RyZWFtaW5nXCJ9IFx1MjAyMlxuXHRcdFx0XHRcdFx0XHRcdFx0JHtuZXcgRGF0ZShwYWlyLnRpbWVzdGFtcCkudG9Mb2NhbGVTdHJpbmcoKX1cblx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cblx0XHRcdFx0XHRcdFx0PCEtLSBSZXF1ZXN0IFNlY3Rpb24gLS0+XG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJweC00IG10LTRcIj5cblx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwibWItNFwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0PGRpdlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRjbGFzcz1cImN1cnNvci1wb2ludGVyIHRleHQtdnMtdXNlciBmb250LWJvbGQgaG92ZXI6dGV4dC13aGl0ZSB0cmFuc2l0aW9uLWNvbG9yc1wiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdEBjbGljaz0keyhlOiBFdmVudCkgPT4gdGhpcy50b2dnbGVDb250ZW50KGUpfVxuXHRcdFx0XHRcdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cIm1yLTJcIj5bK108L3NwYW4+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuPlJlcXVlc3QgKE1lc3NhZ2VDcmVhdGVQYXJhbXMpPC9zcGFuPlxuXHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiaGlkZGVuIG10LTJcIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImJnLXZzLWJnLXNlY29uZGFyeSBwLTQgdGV4dC12cy10ZXh0IG92ZXJmbG93LXgtYXV0b1wiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxwcmUgY2xhc3M9XCJ3aGl0ZXNwYWNlLXByZSB0ZXh0LXZzLXRleHQgbS0wXCI+JHt0aGlzLmZvcm1hdEpzb24ocGFpci5yZXF1ZXN0KX08L3ByZT5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblxuXHRcdFx0XHRcdFx0XHRcdDwhLS0gUmVzcG9uc2UgU2VjdGlvbiAtLT5cblx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwibWItNFwiPlxuXHRcdFx0XHRcdFx0XHRcdFx0PGRpdlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRjbGFzcz1cImN1cnNvci1wb2ludGVyIHRleHQtdnMtYXNzaXN0YW50IGZvbnQtYm9sZCBob3Zlcjp0ZXh0LXdoaXRlIHRyYW5zaXRpb24tY29sb3JzXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0QGNsaWNrPSR7KGU6IEV2ZW50KSA9PiB0aGlzLnRvZ2dsZUNvbnRlbnQoZSl9XG5cdFx0XHRcdFx0XHRcdFx0XHQ+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwibXItMlwiPlsrXTwvc3Bhbj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PHNwYW4+UmVzcG9uc2UgKE1lc3NhZ2UpJHtwYWlyLmlzU3RyZWFtaW5nID8gXCIgLSBSZWNvbnN0cnVjdGVkIGZyb20gU1NFXCIgOiBcIlwifTwvc3Bhbj5cblx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImhpZGRlbiBtdC0yXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJiZy12cy1iZy1zZWNvbmRhcnkgcC00IHRleHQtdnMtdGV4dCBvdmVyZmxvdy14LWF1dG9cIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8cHJlIGNsYXNzPVwid2hpdGVzcGFjZS1wcmUgdGV4dC12cy10ZXh0IG0tMFwiPiR7dGhpcy5mb3JtYXRKc29uKHBhaXIucmVzcG9uc2UpfTwvcHJlPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdGAsXG5cdFx0XHRcdCl9XG5cdFx0XHQ8L2Rpdj5cblx0XHRgO1xuXHR9XG5cblx0cHJpdmF0ZSBmb3JtYXRKc29uKG9iajogYW55KTogc3RyaW5nIHtcblx0XHR0cnkge1xuXHRcdFx0cmV0dXJuIEpTT04uc3RyaW5naWZ5KG9iaiwgbnVsbCwgMik7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0cmV0dXJuIGBFcnJvciBmb3JtYXR0aW5nIEpTT046ICR7ZX1gO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgdG9nZ2xlQ29udGVudChlOiBFdmVudCkge1xuXHRcdGNvbnN0IGhlYWRlciA9IGUuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudDtcblx0XHRjb25zdCBjb250ZW50ID0gaGVhZGVyLm5leHRFbGVtZW50U2libGluZyBhcyBIVE1MRWxlbWVudDtcblx0XHRjb25zdCB0b2dnbGUgPSBoZWFkZXIucXVlcnlTZWxlY3RvcihcInNwYW46Zmlyc3QtY2hpbGRcIikgYXMgSFRNTEVsZW1lbnQ7XG5cblx0XHRpZiAoY29udGVudCAmJiB0b2dnbGUpIHtcblx0XHRcdGNvbnN0IGlzSGlkZGVuID0gY29udGVudC5jbGFzc0xpc3QuY29udGFpbnMoXCJoaWRkZW5cIik7XG5cdFx0XHRjb250ZW50LmNsYXNzTGlzdC50b2dnbGUoXCJoaWRkZW5cIiwgIWlzSGlkZGVuKTtcblx0XHRcdHRvZ2dsZS50ZXh0Q29udGVudCA9IGlzSGlkZGVuID8gXCJbLV1cIiA6IFwiWytdXCI7XG5cdFx0fVxuXHR9XG59XG4iLCAiaW1wb3J0IHsgQ2xhdWRlQXBwIH0gZnJvbSBcIi4vYXBwXCI7XG5pbXBvcnQgXCIuL2NvbXBvbmVudHMvc2ltcGxlLWNvbnZlcnNhdGlvbi12aWV3XCI7XG5pbXBvcnQgXCIuL2NvbXBvbmVudHMvcmF3LXBhaXJzLXZpZXdcIjtcbmltcG9ydCBcIi4vY29tcG9uZW50cy9qc29uLXZpZXdcIjtcblxuLy8gSW5qZWN0IENTUyBzdHlsZXMgaW50byB0aGUgcGFnZVxuZGVjbGFyZSBjb25zdCBfX0NTU19DT05URU5UX186IHN0cmluZztcbmNvbnN0IGNzcyA9IF9fQ1NTX0NPTlRFTlRfXztcbmlmIChjc3MgJiYgY3NzICE9PSBcIl9fQ1NTX0NPTlRFTlRfX1wiKSB7XG5cdGNvbnN0IHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xuXHRzdHlsZS50ZXh0Q29udGVudCA9IGNzcztcblx0ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7XG59XG5cbi8vIEluaXRpYWxpemUgdGhlIGFwcGxpY2F0aW9uIHdoZW4gRE9NIGlzIHJlYWR5XG5pZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gXCJsb2FkaW5nXCIpIHtcblx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTUNvbnRlbnRMb2FkZWRcIiwgaW5pdEFwcCk7XG59IGVsc2Uge1xuXHRpbml0QXBwKCk7XG59XG5cbmZ1bmN0aW9uIGluaXRBcHAoKSB7XG5cdGNvbnN0IGFwcCA9IG5ldyBDbGF1ZGVBcHAoKTtcblx0Y29uc3QgYXBwRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYXBwXCIpO1xuXHRpZiAoYXBwRWxlbWVudCkge1xuXHRcdGFwcEVsZW1lbnQuYXBwZW5kQ2hpbGQoYXBwKTtcblx0fSBlbHNlIHtcblx0XHRjb25zb2xlLmVycm9yKFwiQXBwIG1vdW50IHBvaW50IG5vdCBmb3VuZFwiKTtcblx0fVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs2T0E4RE8sSUFBTUEsR0FBdUIsS0FBc0IsQ0E2Q3hELElBQUksWUFBVSxDQUlaLE9BQVEsS0FBSyxPQUNWLFlBQ0wsQ0FDQSxZQUFZQyxFQUFrQixDQWpEOUIsS0FBQSxXQUFhLEdBQ2IsS0FBQSxpQkFB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QTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUNaLEdBQUlBLElBQU9BLEtBQVEsa0JBQW1CLENBQ3JDLElBQU1DLEVBQVEsU0FBUyxjQUFjLE9BQU8sRUFDNUNBLEVBQU0sWUFBY0QsR0FDcEIsU0FBUyxLQUFLLFlBQVlDLENBQUssQ0FDaEMsQ0FHSSxTQUFTLGFBQWUsVUFDM0IsU0FBUyxpQkFBaUIsbUJBQW9CQyxFQUFPLEVBRXJEQSxHQUFRLEVBR1QsU0FBU0EsSUFBVSxDQUNsQixJQUFNQyxFQUFNLElBQUlDLEVBQ1ZDLEVBQWEsU0FBUyxlQUFlLEtBQUssRUFDNUNBLEVBQ0hBLEVBQVcsWUFBWUYsQ0FBRyxFQUUxQixRQUFRLE1BQU0sMkJBQTJCLENBRTNDIiwKICAibmFtZXMiOiBbIkVsZW1lbnRJbnRlcm5hbHNTaGltIiwgIl9ob3N0IiwgImlzQ2FwdHVyZUV2ZW50TGlzdGVuZXIiLCAib3B0aW9ucyIsICJFdmVudFRhcmdldFNoaW0iLCAidHlwZSIsICJjYWxsYmFjayIsICJvcHRpb25zIiwgImV2ZW50TGlzdGVuZXJzTWFwIiwgImlzQ2FwdHVyZUV2ZW50TGlzdGVuZXIiLCAiZXZlbnRMaXN0ZW5lcnMiLCAibm9ybWFsaXplZE9wdGlvbnMiLCAiZXZlbnQiLCAiY29tcG9zZWRQYXRoIiwgInBhcmVudCIsICJzdG9wUHJvcGFnYXRpb24iLCAic3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uIiwgImV2ZW50UGhhc2UiLCAidGFyZ2V0IiwgInRtcFRhcmdldCIsICJjdXJyZW50VGFyZ2V0IiwgIm9yaWdpbmFsU3RvcFByb3BhZ2F0aW9uIiwgIm9yaWdpbmFsU3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uIiwgImVudW1lcmFibGVQcm9wZXJ0eSIsICJpbnZva2VFdmVudExpc3RlbmVyIiwgImxpc3RlbmVyIiwgImV2ZW50TGlzdGVuZXJNYXAiLCAiZmluaXNoRGlzcGF0Y2giLCAiY2FwdHVyZUV2ZW50UGF0aCIsICJyZXRhcmdldCIsICJldmVudFRhcmdldHMiLCAiZXZlbnRUYXJnZXQiLCAiY2FwdHVyZUV2ZW50TGlzdGVuZXJzIiwgImJ1YmJsZUV2ZW50UGF0aCIsICJFdmVudFRhcmdldFNoaW1XaXRoUmVhbFR5cGUiLCAiZW51bWVyYWJsZVByb3BlcnR5IiwgIkV2ZW50U2hpbSIsICJfYSIsICJ0eXBlIiwgIm9wdGlvbnMiLCAiX0V2ZW50X2NhbmNlbGFibGUiLCAiX0V2ZW50X2J1YmJsZXMiLCAiX0V2ZW50X2NvbXBvc2VkIiwgIl9FdmVudF9kZWZhdWx0UHJldmVudGVkIiwgIl9FdmVudF90aW1lc3RhbXAiLCAiX0V2ZW50X3Byb3BhZ2F0aW9uU3RvcHBlZCIsICJfRXZlbnRfdHlwZSIsICJfRXZlbnRfdGFyZ2V0IiwgIl9FdmVudF9pc0JlaW5nRGlzcGF0Y2hlZCIsICJidWJibGVzIiwgImNhbmNlbGFibGUiLCAiY29tcG9zZWQiLCAiX19jbGFzc1ByaXZhdGVGaWVsZFNldCIsICJfdHlwZSIsICJfYnViYmxlcyIsICJfY2FuY2VsYWJsZSIsICJfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0IiwgInZhbHVlIiwgIkN1c3RvbUV2ZW50U2hpbSIsICJfYiIsICJfQ3VzdG9tRXZlbnRfZGV0YWlsIiwgIl9kZXRhaWwiLCAiRXZlbnRTaGltV2l0aFJlYWxUeXBlIiwgIkN1c3RvbUV2ZW50U2hpbVdpdGhSZWFsVHlwZSIsICJFdmVudFNoaW1XaXRoUmVhbFR5cGUiLCAiQ3VzdG9tRXZlbnRTaGltV2l0aFJlYWxUeXBlIiwgImF0dHJpYnV0ZXMiLCAiYXR0cmlidXRlc0ZvckVsZW1lbnQiLCAiZWxlbWVudCIsICJhdHRycyIsICJFbGVtZW50U2hpbSIsICJFdmVudFRhcmdldFNoaW1XaXRoUmVhbFR5cGUiLCAibmFtZSIsICJ2YWx1ZSIsICJmb3JjZSIsICJpbml0IiwgInNoYWRvd1Jvb3QiLCAiaW50ZXJuYWxzIiwgIkVsZW1lbnRJbnRlcm5hbHNTaGltIiwgIkhUTUxFbGVtZW50U2hpbSIsICJFbGVtZW50U2hpbSIsICJIVE1MRWxlbWVudFNoaW1XaXRoUmVhbFR5cGUiLCAiSFRNTEVsZW1lbnRTaGltV2l0aFJlYWxUeXBlIiwgIkN1c3RvbUVsZW1lbnRSZWdpc3RyeVNoaW0iLCAibmFtZSIsICJjdG9yIiwgIkN1c3RvbUVsZW1lbnRSZWdpc3RyeVNoaW1XaXRoUmVhbFR5cGUiLCAiY3VzdG9tRWxlbWVudHMiLCAiQ3VzdG9tRWxlbWVudFJlZ2lzdHJ5U2hpbVdpdGhSZWFsVHlwZSIsICJnbG9iYWwiLCAiZ2xvYmFsVGhpcyIsICJzdXBwb3J0c0Fkb3B0aW5nU3R5bGVTaGVldHMiLCAiU2hhZG93Um9vdCIsICJTaGFkeUNTUyIsICJuYXRpdmVTaGFkb3ciLCAiRG9jdW1lbnQiLCAicHJvdG90eXBlIiwgIkNTU1N0eWxlU2hlZXQiLCAiY29uc3RydWN0aW9uVG9rZW4iLCAiU3ltYm9sIiwgImNzc1RhZ0NhY2hlIiwgIldlYWtNYXAiLCAiQ1NTUmVzdWx0IiwgImNzc1RleHQiLCAic3RyaW5ncyIsICJzYWZlVG9rZW4iLCAidGhpcyIsICJFcnJvciIsICJfc3RyaW5ncyIsICJzdHlsZVNoZWV0IiwgIl9zdHlsZVNoZWV0IiwgImNhY2hlYWJsZSIsICJsZW5ndGgiLCAiZ2V0IiwgInJlcGxhY2VTeW5jIiwgInNldCIsICJ0b1N0cmluZyIsICJ1bnNhZmVDU1MiLCAidmFsdWUiLCAiU3RyaW5nIiwgImFkb3B0U3R5bGVzIiwgInJlbmRlclJvb3QiLCAic3R5bGVzIiwgInN1cHBvcnRzQWRvcHRpbmdTdHlsZVNoZWV0cyIsICJhZG9wdGVkU3R5bGVTaGVldHMiLCAibWFwIiwgInMiLCAiQ1NTU3R5bGVTaGVldCIsICJzdHlsZVNoZWV0IiwgInN0eWxlIiwgImRvY3VtZW50IiwgImNyZWF0ZUVsZW1lbnQiLCAibm9uY2UiLCAiZ2xvYmFsIiwgInNldEF0dHJpYnV0ZSIsICJ0ZXh0Q29udGVudCIsICJjc3NUZXh0IiwgImFwcGVuZENoaWxkIiwgImdldENvbXBhdGlibGVTdHlsZSIsICJzaGVldCIsICJydWxlIiwgImNzc1J1bGVzIiwgInVuc2FmZUNTUyIsICJpcyIsICJkZWZpbmVQcm9wZXJ0eSIsICJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCAiZ2V0T3duUHJvcGVydHlOYW1lcyIsICJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCAiZ2V0UHJvdG90eXBlT2YiLCAiT2JqZWN0IiwgImdsb2JhbCIsICJnbG9iYWxUaGlzIiwgImN1c3RvbUVsZW1lbnRzIiwgInRydXN0ZWRUeXBlcyIsICJlbXB0eVN0cmluZ0ZvckJvb2xlYW5BdHRyaWJ1dGUiLCAiZW1wdHlTY3JpcHQiLCAicG9seWZpbGxTdXBwb3J0IiwgInJlYWN0aXZlRWxlbWVudFBvbHlmaWxsU3VwcG9ydCIsICJKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5IiwgInByb3AiLCAiX29iaiIsICJkZWZhdWx0Q29udmVydGVyIiwgInZhbHVlIiwgInR5cGUiLCAiQm9vbGVhbiIsICJBcnJheSIsICJKU09OIiwgInN0cmluZ2lmeSIsICJmcm9tVmFsdWUiLCAiTnVtYmVyIiwgInBhcnNlIiwgImUiLCAibm90RXF1YWwiLCAib2xkIiwgImRlZmF1bHRQcm9wZXJ0eURlY2xhcmF0aW9uIiwgImF0dHJpYnV0ZSIsICJTdHJpbmciLCAiY29udmVydGVyIiwgInJlZmxlY3QiLCAidXNlRGVmYXVsdCIsICJoYXNDaGFuZ2VkIiwgIlN5bWJvbCIsICJtZXRhZGF0YSIsICJsaXRQcm9wZXJ0eU1ldGFkYXRhIiwgIldlYWtNYXAiLCAiUmVhY3RpdmVFbGVtZW50IiwgIkhUTUxFbGVtZW50IiwgImluaXRpYWxpemVyIiwgInRoaXMiLCAiX19wcmVwYXJlIiwgIl9pbml0aWFsaXplcnMiLCAicHVzaCIsICJvYnNlcnZlZEF0dHJpYnV0ZXMiLCAiZmluYWxpemUiLCAiX19hdHRyaWJ1dGVUb1Byb3BlcnR5TWFwIiwgImtleXMiLCAibmFtZSIsICJvcHRpb25zIiwgInN0YXRlIiwgInByb3RvdHlwZSIsICJoYXNPd25Qcm9wZXJ0eSIsICJjcmVhdGUiLCAid3JhcHBlZCIsICJlbGVtZW50UHJvcGVydGllcyIsICJzZXQiLCAibm9BY2Nlc3NvciIsICJrZXkiLCAiZGVzY3JpcHRvciIsICJnZXRQcm9wZXJ0eURlc2NyaXB0b3IiLCAiZ2V0IiwgInYiLCAib2xkVmFsdWUiLCAiY2FsbCIsICJyZXF1ZXN0VXBkYXRlIiwgImNvbmZpZ3VyYWJsZSIsICJlbnVtZXJhYmxlIiwgInN1cGVyQ3RvciIsICJNYXAiLCAiZmluYWxpemVkIiwgInByb3BzIiwgInByb3BlcnRpZXMiLCAicHJvcEtleXMiLCAicCIsICJjcmVhdGVQcm9wZXJ0eSIsICJhdHRyIiwgIl9fYXR0cmlidXRlTmFtZUZvclByb3BlcnR5IiwgImVsZW1lbnRTdHlsZXMiLCAiZmluYWxpemVTdHlsZXMiLCAic3R5bGVzIiwgImlzQXJyYXkiLCAiU2V0IiwgImZsYXQiLCAiSW5maW5pdHkiLCAicmV2ZXJzZSIsICJzIiwgInVuc2hpZnQiLCAiZ2V0Q29tcGF0aWJsZVN0eWxlIiwgInRvTG93ZXJDYXNlIiwgImNvbnN0cnVjdG9yIiwgInN1cGVyIiwgIl9faW5zdGFuY2VQcm9wZXJ0aWVzIiwgImlzVXBkYXRlUGVuZGluZyIsICJoYXNVcGRhdGVkIiwgIl9fcmVmbGVjdGluZ1Byb3BlcnR5IiwgIl9faW5pdGlhbGl6ZSIsICJfX3VwZGF0ZVByb21pc2UiLCAiUHJvbWlzZSIsICJyZXMiLCAiZW5hYmxlVXBkYXRpbmciLCAiXyRjaGFuZ2VkUHJvcGVydGllcyIsICJfX3NhdmVJbnN0YW5jZVByb3BlcnRpZXMiLCAiZm9yRWFjaCIsICJpIiwgImNvbnRyb2xsZXIiLCAiX19jb250cm9sbGVycyIsICJhZGQiLCAicmVuZGVyUm9vdCIsICJpc0Nvbm5lY3RlZCIsICJob3N0Q29ubmVjdGVkIiwgImRlbGV0ZSIsICJpbnN0YW5jZVByb3BlcnRpZXMiLCAic2l6ZSIsICJjcmVhdGVSZW5kZXJSb290IiwgInNoYWRvd1Jvb3QiLCAiYXR0YWNoU2hhZG93IiwgInNoYWRvd1Jvb3RPcHRpb25zIiwgImFkb3B0U3R5bGVzIiwgImNvbm5lY3RlZENhbGxiYWNrIiwgImMiLCAiX3JlcXVlc3RlZFVwZGF0ZSIsICJkaXNjb25uZWN0ZWRDYWxsYmFjayIsICJob3N0RGlzY29ubmVjdGVkIiwgIl9vbGQiLCAiXyRhdHRyaWJ1dGVUb1Byb3BlcnR5IiwgImF0dHJWYWx1ZSIsICJ0b0F0dHJpYnV0ZSIsICJyZW1vdmVBdHRyaWJ1dGUiLCAic2V0QXR0cmlidXRlIiwgImN0b3IiLCAicHJvcE5hbWUiLCAiZ2V0UHJvcGVydHlPcHRpb25zIiwgImZyb21BdHRyaWJ1dGUiLCAiX19kZWZhdWx0VmFsdWVzIiwgIm5ld1ZhbHVlIiwgImhhc0F0dHJpYnV0ZSIsICJfJGNoYW5nZVByb3BlcnR5IiwgIl9fZW5xdWV1ZVVwZGF0ZSIsICJpbml0aWFsaXplVmFsdWUiLCAiaGFzIiwgIl9fcmVmbGVjdGluZ1Byb3BlcnRpZXMiLCAicmVqZWN0IiwgInJlc3VsdCIsICJzY2hlZHVsZVVwZGF0ZSIsICJwZXJmb3JtVXBkYXRlIiwgInNob3VsZFVwZGF0ZSIsICJjaGFuZ2VkUHJvcGVydGllcyIsICJ3aWxsVXBkYXRlIiwgImhvc3RVcGRhdGUiLCAidXBkYXRlIiwgIl9fbWFya1VwZGF0ZWQiLCAiXyRkaWRVcGRhdGUiLCAiX2NoYW5nZWRQcm9wZXJ0aWVzIiwgImhvc3RVcGRhdGVkIiwgImZpcnN0VXBkYXRlZCIsICJ1cGRhdGVkIiwgInVwZGF0ZUNvbXBsZXRlIiwgImdldFVwZGF0ZUNvbXBsZXRlIiwgIl9fcHJvcGVydHlUb0F0dHJpYnV0ZSIsICJtb2RlIiwgInJlYWN0aXZlRWxlbWVudFZlcnNpb25zIiwgImdsb2JhbCIsICJnbG9iYWxUaGlzIiwgInRydXN0ZWRUeXBlcyIsICJwb2xpY3kiLCAiY3JlYXRlUG9saWN5IiwgImNyZWF0ZUhUTUwiLCAicyIsICJib3VuZEF0dHJpYnV0ZVN1ZmZpeCIsICJtYXJrZXIiLCAiTWF0aCIsICJyYW5kb20iLCAidG9GaXhlZCIsICJzbGljZSIsICJtYXJrZXJNYXRjaCIsICJub2RlTWFya2VyIiwgImQiLCAiZG9jdW1lbnQiLCAiY3JlYXRlVHJlZVdhbGtlciIsICJjcmVhdGVNYXJrZXIiLCAiY3JlYXRlQ29tbWVudCIsICJpc1ByaW1pdGl2ZSIsICJ2YWx1ZSIsICJpc0FycmF5IiwgIkFycmF5IiwgImlzSXRlcmFibGUiLCAiU3ltYm9sIiwgIml0ZXJhdG9yIiwgIlNQQUNFX0NIQVIiLCAidGV4dEVuZFJlZ2V4IiwgImNvbW1lbnRFbmRSZWdleCIsICJjb21tZW50MkVuZFJlZ2V4IiwgInRhZ0VuZFJlZ2V4IiwgIlJlZ0V4cCIsICJzaW5nbGVRdW90ZUF0dHJFbmRSZWdleCIsICJkb3VibGVRdW90ZUF0dHJFbmRSZWdleCIsICJyYXdUZXh0RWxlbWVudCIsICJ0YWciLCAidHlwZSIsICJzdHJpbmdzIiwgInZhbHVlcyIsICJfJGxpdFR5cGUkIiwgImh0bWwiLCAic3ZnIiwgIm1hdGhtbCIsICJub0NoYW5nZSIsICJmb3IiLCAibm90aGluZyIsICJ0ZW1wbGF0ZUNhY2hlIiwgIldlYWtNYXAiLCAid2Fsa2VyIiwgInRydXN0RnJvbVRlbXBsYXRlU3RyaW5nIiwgInRzYSIsICJzdHJpbmdGcm9tVFNBIiwgImhhc093blByb3BlcnR5IiwgIkVycm9yIiwgImdldFRlbXBsYXRlSHRtbCIsICJsIiwgImxlbmd0aCIsICJhdHRyTmFtZXMiLCAicmF3VGV4dEVuZFJlZ2V4IiwgInJlZ2V4IiwgImkiLCAiYXR0ck5hbWUiLCAibWF0Y2giLCAiYXR0ck5hbWVFbmRJbmRleCIsICJsYXN0SW5kZXgiLCAiZXhlYyIsICJ0ZXN0IiwgImVuZCIsICJzdGFydHNXaXRoIiwgInB1c2giLCAiVGVtcGxhdGUiLCAiY29uc3RydWN0b3IiLCAib3B0aW9ucyIsICJub2RlIiwgInRoaXMiLCAicGFydHMiLCAibm9kZUluZGV4IiwgImF0dHJOYW1lSW5kZXgiLCAicGFydENvdW50IiwgImVsIiwgImNyZWF0ZUVsZW1lbnQiLCAiY3VycmVudE5vZGUiLCAiY29udGVudCIsICJ3cmFwcGVyIiwgImZpcnN0Q2hpbGQiLCAicmVwbGFjZVdpdGgiLCAiY2hpbGROb2RlcyIsICJuZXh0Tm9kZSIsICJub2RlVHlwZSIsICJoYXNBdHRyaWJ1dGVzIiwgIm5hbWUiLCAiZ2V0QXR0cmlidXRlTmFtZXMiLCAiZW5kc1dpdGgiLCAicmVhbE5hbWUiLCAic3RhdGljcyIsICJnZXRBdHRyaWJ1dGUiLCAic3BsaXQiLCAibSIsICJpbmRleCIsICJjdG9yIiwgIlByb3BlcnR5UGFydCIsICJCb29sZWFuQXR0cmlidXRlUGFydCIsICJFdmVudFBhcnQiLCAiQXR0cmlidXRlUGFydCIsICJyZW1vdmVBdHRyaWJ1dGUiLCAidGFnTmFtZSIsICJ0ZXh0Q29udGVudCIsICJlbXB0eVNjcmlwdCIsICJhcHBlbmQiLCAiZGF0YSIsICJpbmRleE9mIiwgIl9vcHRpb25zIiwgImlubmVySFRNTCIsICJyZXNvbHZlRGlyZWN0aXZlIiwgInBhcnQiLCAicGFyZW50IiwgImF0dHJpYnV0ZUluZGV4IiwgImN1cnJlbnREaXJlY3RpdmUiLCAiX19kaXJlY3RpdmVzIiwgIl9fZGlyZWN0aXZlIiwgIm5leHREaXJlY3RpdmVDb25zdHJ1Y3RvciIsICJfJGluaXRpYWxpemUiLCAiXyRyZXNvbHZlIiwgIlRlbXBsYXRlSW5zdGFuY2UiLCAidGVtcGxhdGUiLCAiXyRwYXJ0cyIsICJfJGRpc2Nvbm5lY3RhYmxlQ2hpbGRyZW4iLCAiXyR0ZW1wbGF0ZSIsICJfJHBhcmVudCIsICJwYXJlbnROb2RlIiwgIl8kaXNDb25uZWN0ZWQiLCAiZnJhZ21lbnQiLCAiY3JlYXRpb25TY29wZSIsICJpbXBvcnROb2RlIiwgInBhcnRJbmRleCIsICJ0ZW1wbGF0ZVBhcnQiLCAiQ2hpbGRQYXJ0IiwgIm5leHRTaWJsaW5nIiwgIkVsZW1lbnRQYXJ0IiwgIl8kc2V0VmFsdWUiLCAiX19pc0Nvbm5lY3RlZCIsICJzdGFydE5vZGUiLCAiZW5kTm9kZSIsICJfJGNvbW1pdHRlZFZhbHVlIiwgIl8kc3RhcnROb2RlIiwgIl8kZW5kTm9kZSIsICJpc0Nvbm5lY3RlZCIsICJkaXJlY3RpdmVQYXJlbnQiLCAiXyRjbGVhciIsICJfY29tbWl0VGV4dCIsICJfY29tbWl0VGVtcGxhdGVSZXN1bHQiLCAiX2NvbW1pdE5vZGUiLCAiX2NvbW1pdEl0ZXJhYmxlIiwgImluc2VydEJlZm9yZSIsICJfaW5zZXJ0IiwgImNyZWF0ZVRleHROb2RlIiwgInJlc3VsdCIsICJfJGdldFRlbXBsYXRlIiwgImgiLCAiX3VwZGF0ZSIsICJpbnN0YW5jZSIsICJfY2xvbmUiLCAiZ2V0IiwgInNldCIsICJpdGVtUGFydHMiLCAiaXRlbVBhcnQiLCAiaXRlbSIsICJzdGFydCIsICJmcm9tIiwgIl8kbm90aWZ5Q29ubmVjdGlvbkNoYW5nZWQiLCAibiIsICJyZW1vdmUiLCAiZWxlbWVudCIsICJmaWxsIiwgIlN0cmluZyIsICJ2YWx1ZUluZGV4IiwgIm5vQ29tbWl0IiwgImNoYW5nZSIsICJ2IiwgIl9jb21taXRWYWx1ZSIsICJzZXRBdHRyaWJ1dGUiLCAidG9nZ2xlQXR0cmlidXRlIiwgInN1cGVyIiwgIm5ld0xpc3RlbmVyIiwgIm9sZExpc3RlbmVyIiwgInNob3VsZFJlbW92ZUxpc3RlbmVyIiwgImNhcHR1cmUiLCAib25jZSIsICJwYXNzaXZlIiwgInNob3VsZEFkZExpc3RlbmVyIiwgInJlbW92ZUV2ZW50TGlzdGVuZXIiLCAiYWRkRXZlbnRMaXN0ZW5lciIsICJldmVudCIsICJjYWxsIiwgImhvc3QiLCAiaGFuZGxlRXZlbnQiLCAicG9seWZpbGxTdXBwb3J0IiwgImdsb2JhbCIsICJsaXRIdG1sUG9seWZpbGxTdXBwb3J0IiwgIlRlbXBsYXRlIiwgIkNoaWxkUGFydCIsICJsaXRIdG1sVmVyc2lvbnMiLCAicHVzaCIsICJyZW5kZXIiLCAidmFsdWUiLCAiY29udGFpbmVyIiwgIm9wdGlvbnMiLCAicGFydE93bmVyTm9kZSIsICJyZW5kZXJCZWZvcmUiLCAicGFydCIsICJlbmROb2RlIiwgImluc2VydEJlZm9yZSIsICJjcmVhdGVNYXJrZXIiLCAiXyRzZXRWYWx1ZSIsICJnbG9iYWwiLCAiZ2xvYmFsVGhpcyIsICJMaXRFbGVtZW50IiwgIlJlYWN0aXZlRWxlbWVudCIsICJjb25zdHJ1Y3RvciIsICJ0aGlzIiwgInJlbmRlck9wdGlvbnMiLCAiaG9zdCIsICJfX2NoaWxkUGFydCIsICJjcmVhdGVSZW5kZXJSb290IiwgInJlbmRlclJvb3QiLCAic3VwZXIiLCAicmVuZGVyQmVmb3JlIiwgImZpcnN0Q2hpbGQiLCAiY2hhbmdlZFByb3BlcnRpZXMiLCAidmFsdWUiLCAicmVuZGVyIiwgImhhc1VwZGF0ZWQiLCAiaXNDb25uZWN0ZWQiLCAidXBkYXRlIiwgImNvbm5lY3RlZENhbGxiYWNrIiwgInNldENvbm5lY3RlZCIsICJkaXNjb25uZWN0ZWRDYWxsYmFjayIsICJub0NoYW5nZSIsICJsaXRFbGVtZW50SHlkcmF0ZVN1cHBvcnQiLCAicG9seWZpbGxTdXBwb3J0IiwgImxpdEVsZW1lbnRQb2x5ZmlsbFN1cHBvcnQiLCAiZ2xvYmFsIiwgImxpdEVsZW1lbnRWZXJzaW9ucyIsICJwdXNoIiwgImN1c3RvbUVsZW1lbnQiLCAidGFnTmFtZSIsICJjbGFzc09yVGFyZ2V0IiwgImNvbnRleHQiLCAiYWRkSW5pdGlhbGl6ZXIiLCAiY3VzdG9tRWxlbWVudHMiLCAiZGVmaW5lIiwgImRlZmF1bHRQcm9wZXJ0eURlY2xhcmF0aW9uIiwgImF0dHJpYnV0ZSIsICJ0eXBlIiwgIlN0cmluZyIsICJjb252ZXJ0ZXIiLCAiZGVmYXVsdENvbnZlcnRlciIsICJyZWZsZWN0IiwgImhhc0NoYW5nZWQiLCAibm90RXF1YWwiLCAic3RhbmRhcmRQcm9wZXJ0eSIsICJvcHRpb25zIiwgInRhcmdldCIsICJjb250ZXh0IiwgImtpbmQiLCAibWV0YWRhdGEiLCAicHJvcGVydGllcyIsICJnbG9iYWxUaGlzIiwgImxpdFByb3BlcnR5TWV0YWRhdGEiLCAiZ2V0IiwgInNldCIsICJNYXAiLCAiT2JqZWN0IiwgImNyZWF0ZSIsICJ3cmFwcGVkIiwgIm5hbWUiLCAidiIsICJvbGRWYWx1ZSIsICJjYWxsIiwgInRoaXMiLCAicmVxdWVzdFVwZGF0ZSIsICJfJGNoYW5nZVByb3BlcnR5IiwgInZhbHVlIiwgIkVycm9yIiwgInByb3BlcnR5IiwgInByb3RvT3JUYXJnZXQiLCAibmFtZU9yQ29udGV4dCIsICJwcm90byIsICJoYXNPd25Qcm9wZXJ0eSIsICJjb25zdHJ1Y3RvciIsICJjcmVhdGVQcm9wZXJ0eSIsICJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCAic3RhdGUiLCAib3B0aW9ucyIsICJwcm9wZXJ0eSIsICJhdHRyaWJ1dGUiLCAiU2hhcmVkQ29udmVyc2F0aW9uUHJvY2Vzc29yIiwgInJhd1BhaXJzIiwgInByb2Nlc3NlZFBhaXJzIiwgImkiLCAicGFpciIsICJpc1N0cmVhbWluZyIsICJyZXNwb25zZSIsICJzdHJlYW1Gb3JtYXQiLCAibW9kZWwiLCAiZXJyb3IiLCAiYm9keVJhdyIsICJldmVudHMiLCAiYmVkcm9ja01ldHJpY3MiLCAianNvbkNodW5rcyIsICJqc29uQ2h1bmsiLCAiZXZlbnRQYXlsb2FkIiwgImJhc2U2NERhdGEiLCAiZGVjb2RlZEpzb24iLCAiZXZlbnQiLCAiY2h1bmtFcnJvciIsICJwYXR0ZXJuIiwgInNlYXJjaEluZGV4IiwgInBhdHRlcm5JbmRleCIsICJqc29uU3RhcnRJbmRleCIsICJicmFjZUNvdW50IiwgImpzb25FbmRJbmRleCIsICJjaGFyIiwgIm1ldHJpY3NNYXRjaCIsICJsaW5lcyIsICJsaW5lIiwgImRhdGEiLCAiZSIsICJtZXNzYWdlIiwgImNvbnRlbnRCbG9ja3MiLCAiY3VycmVudEJsb2NrSW5kZXgiLCAiYmxvY2siLCAiZGVsdGEiLCAidG9vbEJsb2NrIiwgImN1cnJlbnRJbnB1dFRva2VucyIsICJ1cmxNYXRjaCIsICJtb2RlbE5hbWUiLCAibWF0Y2giLCAicGFpcnMiLCAib3B0aW9ucyIsICJwYWlyc0J5U3lzdGVtIiwgInN5c3RlbSIsICJzeXN0ZW1LZXkiLCAiYWxsQ29udmVyc2F0aW9ucyIsICJzeXN0ZW1QYWlycyIsICJzb3J0ZWRQYWlycyIsICJhIiwgImIiLCAiY29udmVyc2F0aW9uVGhyZWFkcyIsICJtZXNzYWdlcyIsICJmaXJzdFVzZXJNZXNzYWdlIiwgIm5vcm1hbGl6ZWRGaXJzdE1lc3NhZ2UiLCAiY29udmVyc2F0aW9uS2V5IiwgImtleUhhc2giLCAidGhyZWFkUGFpcnMiLCAic29ydGVkVGhyZWFkUGFpcnMiLCAiZmluYWxQYWlyIiwgImxvbmdlc3QiLCAiY3VycmVudCIsICJjdXJyZW50TWVzc2FnZXMiLCAibG9uZ2VzdE1lc3NhZ2VzIiwgIm1vZGVsc1VzZWQiLCAiZW5oYW5jZWRNZXNzYWdlcyIsICJjb252ZXJzYXRpb24iLCAibWVyZ2VkQ29udmVyc2F0aW9ucyIsICJjb252IiwgInBlbmRpbmdUb29sVXNlcyIsICJlbmhhbmNlZE1lc3NhZ2UiLCAiaGFzT25seVRvb2xSZXN1bHRzIiwgImhhc1RleHRDb250ZW50IiwgImoiLCAidG9vbFVzZSIsICJ0b29sUmVzdWx0IiwgInRvb2xVc2VJZCIsICJtZXNzYWdlSW5kZXgiLCAiY29udmVyc2F0aW9ucyIsICJzb3J0ZWRDb252ZXJzYXRpb25zIiwgInVzZWRDb252ZXJzYXRpb25zIiwgImN1cnJlbnRDb252IiwgIm9yaWdpbmFsQ29udiIsICJvcmlnaW5hbEluZGV4IiwgIm90aGVyQ29udiIsICJtZXNzYWdlc01hdGNoIiwgImsiLCAibWVyZ2VkQ29udiIsICJjb21wYWN0Q29udiIsICJvcmlnaW5hbE1lc3NhZ2VzIiwgIm1lcmdlZE1lc3NhZ2VzIiwgImFsbFBhaXJzIiwgImFsbE1vZGVscyIsICJzdGFydFRpbWUiLCAiZW5kVGltZSIsICJtc2cxIiwgIm1zZzIiLCAiY29udGVudDEiLCAiY29udGVudDIiLCAibm9ybWFsaXplZENvbnRlbnQiLCAidGV4dCIsICJzdHIiLCAiaGFzaCIsICJDbGF1ZGVBcHAiLCAiaSIsICJzdGFydCIsICJwcm9jZXNzb3IiLCAiU2hhcmVkQ29udmVyc2F0aW9uUHJvY2Vzc29yIiwgImluY2x1ZGVBbGxSZXF1ZXN0cyIsICJjb252ZXJzYXRpb25Nb2RlbHMiLCAicHJvY2Vzc2VkUGFpck1vZGVscyIsICJwIiwgInJhd1BhaXJNb2RlbHMiLCAicGFpciIsICJhbGxNb2RlbHMiLCAidmlldyIsICJtb2RlbCIsICJuZXdTZWxlY3RlZE1vZGVscyIsICJjIiwgImNvdW50cyIsICJtb2RlbENvdW50cyIsICJmaWx0ZXJlZENvbnZlcnNhdGlvbnMiLCAieCIsICJfY291bnQiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInIiLCAidCIsICJQYXJ0VHlwZSIsICJBVFRSSUJVVEUiLCAiQ0hJTEQiLCAiUFJPUEVSVFkiLCAiQk9PTEVBTl9BVFRSSUJVVEUiLCAiRVZFTlQiLCAiRUxFTUVOVCIsICJkaXJlY3RpdmUiLCAiYyIsICJ2YWx1ZXMiLCAiXyRsaXREaXJlY3RpdmUkIiwgIkRpcmVjdGl2ZSIsICJfcGFydEluZm8iLCAiXyRpc0Nvbm5lY3RlZCIsICJ0aGlzIiwgIl8kcGFyZW50IiwgInBhcnQiLCAicGFyZW50IiwgImF0dHJpYnV0ZUluZGV4IiwgIl9fcGFydCIsICJfX2F0dHJpYnV0ZUluZGV4IiwgInByb3BzIiwgInVwZGF0ZSIsICJfcGFydCIsICJyZW5kZXIiLCAiVW5zYWZlSFRNTERpcmVjdGl2ZSIsICJEaXJlY3RpdmUiLCAicGFydEluZm8iLCAic3VwZXIiLCAidGhpcyIsICJfdmFsdWUiLCAibm90aGluZyIsICJ0eXBlIiwgIlBhcnRUeXBlIiwgIkNISUxEIiwgIkVycm9yIiwgImNvbnN0cnVjdG9yIiwgImRpcmVjdGl2ZU5hbWUiLCAidmFsdWUiLCAiX3RlbXBsYXRlUmVzdWx0IiwgIm5vQ2hhbmdlIiwgInN0cmluZ3MiLCAicmF3IiwgIl8kbGl0VHlwZSQiLCAicmVzdWx0VHlwZSIsICJ2YWx1ZXMiLCAidW5zYWZlSFRNTCIsICJkaXJlY3RpdmUiLCAiRGlmZiIsICJvbGRTdHIiLCAibmV3U3RyIiwgIm9wdGlvbnMiLCAiY2FsbGJhY2siLCAib2xkU3RyaW5nIiwgIm5ld1N0cmluZyIsICJvbGRUb2tlbnMiLCAibmV3VG9rZW5zIiwgIl9hIiwgImRvbmUiLCAidmFsdWUiLCAibmV3TGVuIiwgIm9sZExlbiIsICJlZGl0TGVuZ3RoIiwgIm1heEVkaXRMZW5ndGgiLCAibWF4RXhlY3V0aW9uVGltZSIsICJhYm9ydEFmdGVyVGltZXN0YW1wIiwgImJlc3RQYXRoIiwgIm5ld1BvcyIsICJtaW5EaWFnb25hbFRvQ29uc2lkZXIiLCAibWF4RGlhZ29uYWxUb0NvbnNpZGVyIiwgImV4ZWNFZGl0TGVuZ3RoIiwgImRpYWdvbmFsUGF0aCIsICJiYXNlUGF0aCIsICJyZW1vdmVQYXRoIiwgImFkZFBhdGgiLCAiY2FuQWRkIiwgImFkZFBhdGhOZXdQb3MiLCAiY2FuUmVtb3ZlIiwgImV4ZWMiLCAicmV0IiwgInBhdGgiLCAiYWRkZWQiLCAicmVtb3ZlZCIsICJvbGRQb3NJbmMiLCAibGFzdCIsICJvbGRQb3MiLCAiY29tbW9uQ291bnQiLCAibGVmdCIsICJyaWdodCIsICJhcnJheSIsICJpIiwgImNoYXJzIiwgImNoYW5nZU9iamVjdHMiLCAibGFzdENvbXBvbmVudCIsICJjb21wb25lbnRzIiwgIm5leHRDb21wb25lbnQiLCAiY29tcG9uZW50TGVuIiwgImNvbXBvbmVudFBvcyIsICJjb21wb25lbnQiLCAib2xkVmFsdWUiLCAiTGluZURpZmYiLCAiRGlmZiIsICJ0b2tlbml6ZSIsICJsZWZ0IiwgInJpZ2h0IiwgIm9wdGlvbnMiLCAibGluZURpZmYiLCAiZGlmZkxpbmVzIiwgIm9sZFN0ciIsICJuZXdTdHIiLCAidG9rZW5pemUiLCAidmFsdWUiLCAib3B0aW9ucyIsICJyZXRMaW5lcyIsICJsaW5lc0FuZE5ld2xpbmVzIiwgImkiLCAibGluZSIsICJfZ2V0RGVmYXVsdHMiLCAiX2RlZmF1bHRzIiwgImNoYW5nZURlZmF1bHRzIiwgIm5ld0RlZmF1bHRzIiwgImVzY2FwZVRlc3QiLCAiZXNjYXBlUmVwbGFjZSIsICJlc2NhcGVUZXN0Tm9FbmNvZGUiLCAiZXNjYXBlUmVwbGFjZU5vRW5jb2RlIiwgImVzY2FwZVJlcGxhY2VtZW50cyIsICJnZXRFc2NhcGVSZXBsYWNlbWVudCIsICJjaCIsICJlc2NhcGUiLCAiaHRtbCIsICJlbmNvZGUiLCAidW5lc2NhcGVUZXN0IiwgInVuZXNjYXBlIiwgIl8iLCAibiIsICJjYXJldCIsICJlZGl0IiwgInJlZ2V4IiwgIm9wdCIsICJzb3VyY2UiLCAib2JqIiwgIm5hbWUiLCAidmFsIiwgInZhbFNvdXJjZSIsICJjbGVhblVybCIsICJocmVmIiwgIm5vb3BUZXN0IiwgInNwbGl0Q2VsbHMiLCAidGFibGVSb3ciLCAiY291bnQiLCAicm93IiwgIm1hdGNoIiwgIm9mZnNldCIsICJzdHIiLCAiZXNjYXBlZCIsICJjdXJyIiwgImNlbGxzIiwgImkiLCAicnRyaW0iLCAiYyIsICJpbnZlcnQiLCAibCIsICJzdWZmTGVuIiwgImN1cnJDaGFyIiwgImZpbmRDbG9zaW5nQnJhY2tldCIsICJiIiwgImxldmVsIiwgIm91dHB1dExpbmsiLCAiY2FwIiwgImxpbmsiLCAicmF3IiwgImxleGVyIiwgInRpdGxlIiwgInRleHQiLCAidG9rZW4iLCAiaW5kZW50Q29kZUNvbXBlbnNhdGlvbiIsICJtYXRjaEluZGVudFRvQ29kZSIsICJpbmRlbnRUb0NvZGUiLCAibm9kZSIsICJtYXRjaEluZGVudEluTm9kZSIsICJpbmRlbnRJbk5vZGUiLCAiX1Rva2VuaXplciIsICJvcHRpb25zIiwgInNyYyIsICJ0cmltbWVkIiwgInRvcCIsICJ0b2tlbnMiLCAiYnVsbCIsICJpc29yZGVyZWQiLCAibGlzdCIsICJpdGVtUmVnZXgiLCAiaXRlbUNvbnRlbnRzIiwgImVuZHNXaXRoQmxhbmtMaW5lIiwgImVuZEVhcmx5IiwgImxpbmUiLCAidCIsICJuZXh0TGluZSIsICJpbmRlbnQiLCAiYmxhbmtMaW5lIiwgIm5leHRCdWxsZXRSZWdleCIsICJoclJlZ2V4IiwgImZlbmNlc0JlZ2luUmVnZXgiLCAiaGVhZGluZ0JlZ2luUmVnZXgiLCAicmF3TGluZSIsICJpc3Rhc2siLCAiaXNjaGVja2VkIiwgInNwYWNlcnMiLCAiaGFzTXVsdGlwbGVMaW5lQnJlYWtzIiwgInRhZyIsICJoZWFkZXJzIiwgImFsaWducyIsICJyb3dzIiwgIml0ZW0iLCAiYWxpZ24iLCAiaGVhZGVyIiwgImNlbGwiLCAidHJpbW1lZFVybCIsICJydHJpbVNsYXNoIiwgImxhc3RQYXJlbkluZGV4IiwgImxpbmtMZW4iLCAibGlua3MiLCAibGlua1N0cmluZyIsICJtYXNrZWRTcmMiLCAicHJldkNoYXIiLCAibExlbmd0aCIsICJyRGVsaW0iLCAickxlbmd0aCIsICJkZWxpbVRvdGFsIiwgIm1pZERlbGltVG90YWwiLCAiZW5kUmVnIiwgImxhc3RDaGFyTGVuZ3RoIiwgImhhc05vblNwYWNlQ2hhcnMiLCAiaGFzU3BhY2VDaGFyc09uQm90aEVuZHMiLCAicHJldkNhcFplcm8iLCAibmV3bGluZSIsICJibG9ja0NvZGUiLCAiZmVuY2VzIiwgImhyIiwgImhlYWRpbmciLCAiYnVsbGV0IiwgImxoZWFkaW5nIiwgIl9wYXJhZ3JhcGgiLCAiYmxvY2tUZXh0IiwgIl9ibG9ja0xhYmVsIiwgImRlZiIsICJfdGFnIiwgIl9jb21tZW50IiwgInBhcmFncmFwaCIsICJibG9ja3F1b3RlIiwgImJsb2NrTm9ybWFsIiwgImdmbVRhYmxlIiwgImJsb2NrR2ZtIiwgImJsb2NrUGVkYW50aWMiLCAiaW5saW5lQ29kZSIsICJiciIsICJpbmxpbmVUZXh0IiwgIl9wdW5jdHVhdGlvbiIsICJwdW5jdHVhdGlvbiIsICJibG9ja1NraXAiLCAiZW1TdHJvbmdMRGVsaW0iLCAiZW1TdHJvbmdSRGVsaW1Bc3QiLCAiZW1TdHJvbmdSRGVsaW1VbmQiLCAiYW55UHVuY3R1YXRpb24iLCAiYXV0b2xpbmsiLCAiX2lubGluZUNvbW1lbnQiLCAiX2lubGluZUxhYmVsIiwgInJlZmxpbmsiLCAibm9saW5rIiwgInJlZmxpbmtTZWFyY2giLCAiaW5saW5lTm9ybWFsIiwgImlubGluZVBlZGFudGljIiwgImlubGluZUdmbSIsICJpbmxpbmVCcmVha3MiLCAiYmxvY2siLCAiaW5saW5lIiwgIl9MZXhlciIsICJfX0xleGVyIiwgInJ1bGVzIiwgIm5leHQiLCAibGVhZGluZyIsICJ0YWJzIiwgImxhc3RUb2tlbiIsICJjdXRTcmMiLCAibGFzdFBhcmFncmFwaENsaXBwZWQiLCAiZXh0VG9rZW5pemVyIiwgInN0YXJ0SW5kZXgiLCAidGVtcFNyYyIsICJ0ZW1wU3RhcnQiLCAiZ2V0U3RhcnRJbmRleCIsICJlcnJNc2ciLCAia2VlcFByZXZDaGFyIiwgIl9SZW5kZXJlciIsICJjb2RlIiwgImluZm9zdHJpbmciLCAibGFuZyIsICJxdW90ZSIsICJib2R5IiwgIm9yZGVyZWQiLCAic3RhcnQiLCAidHlwZSIsICJzdGFydGF0dCIsICJ0YXNrIiwgImNoZWNrZWQiLCAiY29udGVudCIsICJmbGFncyIsICJjbGVhbkhyZWYiLCAib3V0IiwgIl9UZXh0UmVuZGVyZXIiLCAiX1BhcnNlciIsICJfX1BhcnNlciIsICJnZW5lcmljVG9rZW4iLCAicmV0IiwgImhlYWRpbmdUb2tlbiIsICJjb2RlVG9rZW4iLCAidGFibGVUb2tlbiIsICJqIiwgImsiLCAiYmxvY2txdW90ZVRva2VuIiwgImxpc3RUb2tlbiIsICJsb29zZSIsICJpdGVtQm9keSIsICJjaGVja2JveCIsICJodG1sVG9rZW4iLCAicGFyYWdyYXBoVG9rZW4iLCAidGV4dFRva2VuIiwgInJlbmRlcmVyIiwgImVzY2FwZVRva2VuIiwgInRhZ1Rva2VuIiwgImxpbmtUb2tlbiIsICJpbWFnZVRva2VuIiwgInN0cm9uZ1Rva2VuIiwgImVtVG9rZW4iLCAiY29kZXNwYW5Ub2tlbiIsICJkZWxUb2tlbiIsICJfSG9va3MiLCAibWFya2Rvd24iLCAiTWFya2VkIiwgIiNwYXJzZU1hcmtkb3duIiwgImFyZ3MiLCAiY2FsbGJhY2siLCAidmFsdWVzIiwgImNoaWxkVG9rZW5zIiwgImV4dGVuc2lvbnMiLCAicGFjayIsICJvcHRzIiwgImV4dCIsICJwcmV2UmVuZGVyZXIiLCAiZXh0TGV2ZWwiLCAicHJvcCIsICJyZW5kZXJlclByb3AiLCAicmVuZGVyZXJGdW5jIiwgInRva2VuaXplciIsICJ0b2tlbml6ZXJQcm9wIiwgInRva2VuaXplckZ1bmMiLCAicHJldlRva2VuaXplciIsICJob29rcyIsICJob29rc1Byb3AiLCAiaG9va3NGdW5jIiwgInByZXZIb29rIiwgImFyZyIsICJ3YWxrVG9rZW5zIiwgInBhY2tXYWxrdG9rZW5zIiwgInBhcnNlciIsICJvcmlnT3B0IiwgInRocm93RXJyb3IiLCAiI29uRXJyb3IiLCAiZSIsICJzaWxlbnQiLCAiYXN5bmMiLCAibXNnIiwgIm1hcmtlZEluc3RhbmNlIiwgIm1hcmtlZCIsICJzZXRPcHRpb25zIiwgInVzZSIsICJwYXJzZUlubGluZSIsICJwYXJzZXIiLCAiX1BhcnNlciIsICJsZXhlciIsICJfTGV4ZXIiLCAibWFya2VkIiwgImVzY2FwZUh0bWwiLCAidGV4dCIsICJtYXJrZG93blRvSHRtbCIsICJtYXJrZG93biIsICJlc2NhcGVkTWFya2Rvd24iLCAiZXJyb3IiLCAiU2ltcGxlQ29udmVyc2F0aW9uVmlldyIsICJpIiwgImUiLCAib3B0aW9ucyIsICJ0eXBlIiwgInRhcmdldFNlbGVjdG9yIiwgInRvZ2dsZVNlbGVjdG9yIiwgImN1c3RvbUhhbmRsZXIiLCAiY3VycmVudEVsZW1lbnQiLCAiZnVsbENvbnRlbnQiLCAidGFyZ2V0IiwgInRvZ2dsZSIsICJpc0hpZGRlbiIsICJjb250ZW50IiwgInRvb2xSZXN1bHRzIiwgIngiLCAiYmxvY2siLCAibyIsICJtYXJrZG93blRvSHRtbCIsICJ0b29sUmVzdWx0IiwgImN1c3RvbUNvbnRlbnQiLCAic3lzdGVtUmVtaW5kZXJSZWdleEVzY2FwZWQiLCAic3lzdGVtUmVtaW5kZXJSZWdleFJhdyIsICJzeXN0ZW1SZW1pbmRlcnMiLCAibWF0Y2giLCAibWFpbkNvbnRlbnQiLCAicmVtaW5kZXIiLCAiaW5kZXgiLCAic3lzdGVtIiwgInRleHRDb250ZW50IiwgInJlc3BvbnNlIiwgInRvb2xOYW1lIiwgInBhcmFtVmFsdWUiLCAicGFyYW1OYW1lIiwgInBhcmFtcyIsICJzdHIiLCAiZGl2IiwgInVzZVByZUZvcm1hdHRpbmciLCAidGl0bGUiLCAiaXNFeHBhbmRlZCIsICJ0aXRsZUNsYXNzZXMiLCAiY29udGFpbmVyQ2xhc3NlcyIsICJjb3VudCIsICJleHBhbmRlZENsYXNzIiwgInRvZ2dsZVN5bWJvbCIsICJkaXNwbGF5VGl0bGUiLCAidG9vbFVzZSIsICJpbnB1dCIsICJpZ25vcmVTdHIiLCAicCIsICJmaWxlTmFtZSIsICJlZGl0Q291bnQiLCAiY2VsbE51bSIsICJtb2RlIiwgInRvZG9zIiwgInRvZG8iLCAic3RhdHVzQ2xhc3MiLCAiZWRpdHMiLCAiZWRpdCIsICJvbGRTdHIiLCAibmV3U3RyIiwgImRpZmZMaW5lcyIsICJpc0NvbGxhcHNpYmxlIiwgImlzQ29sbGFwc2VkIiwgImlzQ2xpY2tUb0V4cGFuZCIsICJjb250ZW50RGl2IiwgImhlYWRlckNsYXNzZXMiLCAiY29udGVudENsYXNzZXMiLCAibGluZXMiLCAicHJldmlldyIsICJoYXNNb3JlIiwgImRpZmYiLCAicGFydCIsICJsaW5lIiwgImNvbnZlcnNhdGlvbiIsICJ0b29scyIsICJ0b29sIiwgImRlc2NyaXB0aW9uIiwgInNjaGVtYSIsICJwYXJhbURlZiIsICJkZWYiLCAicmVxdWlyZWQiLCAiZGVzYyIsICJtZXNzYWdlIiwgIm1zZ0luZGV4IiwgIl9fZGVjb3JhdGVDbGFzcyIsICJuIiwgInQiLCAiUmF3UGFpcnNWaWV3IiwgImkiLCAieCIsICJ2YWxpZFBhaXJzIiwgInBhaXIiLCAiaW5kZXgiLCAiZSIsICJ1cmwiLCAidXJsTWF0Y2giLCAibW9kZWxOYW1lIiwgIm1hdGNoIiwgIm9iaiIsICJoZWFkZXIiLCAiY29udGVudCIsICJ0b2dnbGUiLCAiaXNIaWRkZW4iLCAiX19kZWNvcmF0ZUNsYXNzIiwgIm4iLCAidCIsICJKc29uVmlldyIsICJpIiwgIngiLCAicGFpciIsICJpbmRleCIsICJlIiwgIm9iaiIsICJoZWFkZXIiLCAiY29udGVudCIsICJ0b2dnbGUiLCAiaXNIaWRkZW4iLCAiX19kZWNvcmF0ZUNsYXNzIiwgIm4iLCAidCIsICJjc3MiLCAic3R5bGUiLCAiaW5pdEFwcCIsICJhcHAiLCAiQ2xhdWRlQXBwIiwgImFwcEVsZW1lbnQiXQp9Cg==