@getopenpay/openpay-js 0.1.11-alpha.6e4e361 → 0.1.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.umd.js CHANGED
@@ -17,5 +17,5 @@ ${n.message}`),n.message)}else return B(n.message);if(typeof n=="object")try{ret
17
17
  Details: got ${n.required_user_actions.length} required user actions`);return St.parse(n.required_user_actions[0])},Ie=(n,e,r)=>{const o=n.filter(s=>s.provider===e);if(o.length===0)throw console.error("CPMs list",n),new Error(`No CPMs found with provider '${e}' and processor '${r}'`);if(o.length!==1)throw console.error("CPMs list",n),new Error(`More than one CPM found with provider '${e}' and processor '${r}'`);return o[0]},O={commonCC:{run:kn},stripePR:{init:jn,run:Fn},stripeLink:{init:_n,run:gn}};function xn(n){return n&&n.__esModule&&Object.prototype.hasOwnProperty.call(n,"default")?n.default:n}var $={};Object.defineProperty($,"__esModule",{value:!0}),$.Observable=void 0;const Te=n=>!!Symbol[n],W=n=>Te(n)?Symbol[n]:"@@"+n,Un=W("iterator"),Q=W("observable"),Me=W("species");function q(n,e){let r=n[e];if(r!=null){if(typeof r!="function")throw new TypeError(r+" is not a function");return r}}function j(n){let e=n.constructor;return e!==void 0&&(e=e[Me],e===null&&(e=void 0)),e!==void 0?e:V}function $n(n){return n instanceof V}function R(n){R.log?R.log(n):setTimeout(()=>{throw n})}function z(n){Promise.resolve().then(()=>{try{n()}catch(e){R(e)}})}function je(n){let e=n._cleanup;if(e!==void 0&&(n._cleanup=void 0,!!e))try{if(typeof e=="function")e();else{let r=q(e,"unsubscribe");r&&r.call(e)}}catch(r){R(r)}}function X(n){n._observer=void 0,n._queue=void 0,n._state="closed"}function qn(n){let e=n._queue;if(e){n._queue=void 0,n._state="ready";for(let r=0;r<e.length&&(Fe(n,e[r].type,e[r].value),n._state!=="closed");++r);}}function Fe(n,e,r){n._state="running";let o=n._observer;try{let s=q(o,e);switch(e){case"next":s&&s.call(o,r);break;case"error":if(X(n),s)s.call(o,r);else throw r;break;case"complete":X(n),s&&s.call(o);break}}catch(s){R(s)}n._state==="closed"?je(n):n._state==="running"&&(n._state="ready")}function ee(n,e,r){if(n._state!=="closed"){if(n._state==="buffering"){n._queue.push({type:e,value:r});return}if(n._state!=="ready"){n._state="buffering",n._queue=[{type:e,value:r}],z(()=>qn(n));return}Fe(n,e,r)}}class zn{constructor(e,r){this._cleanup=void 0,this._observer=e,this._queue=void 0,this._state="initializing";let o=this,s={get closed(){return o._state==="closed"},next(i){ee(o,"next",i)},error(i){ee(o,"error",i)},complete(){ee(o,"complete")}};try{this._cleanup=r.call(void 0,s)}catch(i){s.error(i)}this._state==="initializing"&&(this._state="ready")}get closed(){return this._state==="closed"}unsubscribe(){this._state!=="closed"&&(X(this),je(this))}}let V=class H{constructor(e){if(!(this instanceof H))throw new TypeError("Observable cannot be called as a function");if(typeof e!="function")throw new TypeError("Observable initializer must be a function");this._subscriber=e}subscribe(e){return(typeof e!="object"||e===null)&&(e={next:e,error:arguments[1],complete:arguments[2]}),new zn(e,this._subscriber)}forEach(e){return new Promise((r,o)=>{if(typeof e!="function"){o(new TypeError(e+" is not a function"));return}function s(){i.unsubscribe(),r()}let i=this.subscribe({next(a){try{e(a,s)}catch(c){o(c),i.unsubscribe()}},error:o,complete:r})})}map(e){if(typeof e!="function")throw new TypeError(e+" is not a function");let r=j(this);return new r(o=>this.subscribe({next(s){try{s=e(s)}catch(i){return o.error(i)}o.next(s)},error(s){o.error(s)},complete(){o.complete()}}))}filter(e){if(typeof e!="function")throw new TypeError(e+" is not a function");let r=j(this);return new r(o=>this.subscribe({next(s){try{if(!e(s))return}catch(i){return o.error(i)}o.next(s)},error(s){o.error(s)},complete(){o.complete()}}))}reduce(e){if(typeof e!="function")throw new TypeError(e+" is not a function");let r=j(this),o=arguments.length>1,s=!1,a=arguments[1];return new r(c=>this.subscribe({next(l){let u=!s;if(s=!0,!u||o)try{a=e(a,l)}catch(m){return c.error(m)}else a=l},error(l){c.error(l)},complete(){if(!s&&!o)return c.error(new TypeError("Cannot reduce an empty sequence"));c.next(a),c.complete()}}))}async all(){let e=[];return await this.forEach(r=>e.push(r)),e}concat(...e){let r=j(this);return new r(o=>{let s,i=0;function a(c){s=c.subscribe({next(l){o.next(l)},error(l){o.error(l)},complete(){i===e.length?(s=void 0,o.complete()):a(r.from(e[i++]))}})}return a(this),()=>{s&&(s.unsubscribe(),s=void 0)}})}flatMap(e){if(typeof e!="function")throw new TypeError(e+" is not a function");let r=j(this);return new r(o=>{let s=[],i=this.subscribe({next(c){if(e)try{c=e(c)}catch(u){return o.error(u)}let l=r.from(c).subscribe({next(u){o.next(u)},error(u){o.error(u)},complete(){let u=s.indexOf(l);u>=0&&s.splice(u,1),a()}});s.push(l)},error(c){o.error(c)},complete(){a()}});function a(){i.closed&&s.length===0&&o.complete()}return()=>{s.forEach(c=>c.unsubscribe()),i.unsubscribe()}})}[Q](){return this}static from(e){let r=typeof this=="function"?this:H;if(e==null)throw new TypeError(e+" is not an object");let o=q(e,Q);if(o){let s=o.call(e);if(Object(s)!==s)throw new TypeError(s+" is not an object");return $n(s)&&s.constructor===r?s:new r(i=>s.subscribe(i))}if(Te("iterator")&&(o=q(e,Un),o))return new r(s=>{z(()=>{if(!s.closed){for(let i of o.call(e))if(s.next(i),s.closed)return;s.complete()}})});if(Array.isArray(e))return new r(s=>{z(()=>{if(!s.closed){for(let i=0;i<e.length;++i)if(s.next(e[i]),s.closed)return;s.complete()}})});throw new TypeError(e+" is not observable")}static of(...e){let r=typeof this=="function"?this:H;return new r(o=>{z(()=>{if(!o.closed){for(let s=0;s<e.length;++s)if(o.next(e[s]),o.closed)return;o.complete()}})})}static get[Me](){return this}};$.Observable=V,Object.defineProperty(V,Symbol("extensions"),{value:{symbol:Q,hostReportError:R},configurable:!0});var Vn=$.Observable;const Hn=xn(Vn),{log__:Bn,err__:Kn}=k("init-flows"),Yn=()=>("ojs_init_results"in window||(window.ojs_init_results={}),window.ojs_init_results),Jn=(n,e)=>{const r={context:n,flowCallbacks:e};return console.log("[OJS] initializing OJS flows..."),{stripePR:Le("stripePR",O.stripePR.init(r)),stripeLink:Le("stripeLink",O.stripeLink.init(r))}},Le=(n,e)=>{const r=new Hn(o=>{o.next({status:"loading"}),e.then(s=>{o.next({status:"loaded",result:s})}).catch(s=>{o.next({status:"error",message:s.message})})});return r.subscribe({next:o=>{Bn(`${n} flow result`,o),Yn()[n]=o},error:o=>{throw Kn(`${n} flow initialization error:
18
18
  ${JSON.stringify(o)}`),o}}),r},Ne={isLoading:!0,isAvailable:!1,startFlow:async()=>{console.warn(`startFlow triggered while payment request is still not ready.
19
19
  You can check the ".isLoading" param to know when a payment request is still loading,
20
- and ".isAvailable" to know if a payment request is available.`)}},De={isLoading:!1,isAvailable:!1,startFlow:async()=>{console.error("startFlow triggered when payment request is not available.")}};class Zn{constructor(e){this.formInstance=e,this.config=e.config,this.formId=e.formId,this.eventTargets={},this.nonces=new Set}handleMessage(e){var c;if(!e.source)throw new Error("No source found");if(e.origin!==((c=this.formInstance.config._frameUrl)==null?void 0:c.origin)||typeof e.data=="object"&&e.data.penpal)return;const r=Mt(JSON.parse(e.data));if(!this.validateEvent(r))return;const{elementId:s,payload:i}=r,a=i.type;switch(a){case"LAYOUT":this.handleLayoutEvent(i);break;case"FOCUS":this.handleFocusEvent(s,i.elementType);break;case"BLUR":this.handleBlurEvent(s,i.elementType);break;case"CHANGE":this.handleChangeEvent(s,i.elementType,i.errors);break;case"LOADED":this.handleLoadedEvent(e.source,s,i);break;case"LOAD_ERROR":this.handleLoadErrorEvent(i);break;case"VALIDATION_ERROR":this.handleValidationErrorEvent(i,s);break;default:console.warn("[form] Unhandled event type:",a)}}validateEvent(e){return e.formId!==this.formInstance.formId||!e.elementId?(console.warn("[form] Ignoring unknown event:",e),!1):this.nonces.has(e.nonce)?(console.warn("[form] Ignoring duplicate event:",e),!1):(this.nonces.add(e.nonce),!0)}handleLayoutEvent(e){const r=e.height?`${e.height}px`:"100%";this.formInstance.setFormHeight(r)}handleFocusEvent(e,r){this.config.onFocus&&this.config.onFocus(e,r)}handleBlurEvent(e,r){this.config.onBlur&&this.config.onBlur(e,r)}handleChangeEvent(e,r,o){this.config.onChange&&this.config.onChange(e,r,o)}async handleLoadedEvent(e,r,o){console.log("handleLoadedEvent is deprecated:",e,r,o),this.eventTargets[r]=e,this.formInstance.onCdeLoaded(o),this.config.onLoad&&this.config.onLoad(o.totalAmountAtoms,o.currency)}handleLoadErrorEvent(e){this.formInstance.config.onLoadError&&this.formInstance.config.onLoadError(e.message)}handleValidationErrorEvent(e,r){this.formInstance.config.onValidationError&&this.formInstance.config.onValidationError(e.elementType,e.errors,r)}postEventToFrame(e,r,o){jt(e,this.formId,r,o,this.config.baseUrl)}}async function Gn(n,e){const o=await ne.connectToChild({iframe:n,debug:!1,childOrigin:e}).promise,s=await Ft(o);if(!Lt(o,s))throw new Error("Got invalid CDE connection object");return o}class Wn{constructor(){this.connections=new Map}addConnection(e,r){this.connections.set(e,r)}getConnection(){const e=this.connections.values().next().value;if(!e)throw new Error("Connection not found");return e}getAllConnections(){return this.connections}}const F=class F{constructor(e){this.tryInitOjsFlows=()=>{this.ojsFlowsInitialization===null&&this.cdeLoadedPayload&&this.connectionManager.getAllConnections().size!==0&&(this.ojsFlowsInitialization=Jn(this.createOjsFlowContext(),this.createOjsFlowCallbacks()),this.ojsFlowsInitialization.stripePR.subscribe(r=>this.onStripePRStatusChange(r)))},this.onCdeLoaded=r=>{this.cdeLoadedPayload||(this.cdeLoadedPayload=r,this.tryInitOjsFlows())},this.onStripePRStatusChange=r=>{var o,s,i,a,c,l;if(r.status==="loading")(s=(o=this.config).onPaymentRequestLoad)==null||s.call(o,{apple_pay:Ne,google_pay:Ne});else if(r.status==="error")(a=(i=this.config).onPaymentRequestLoad)==null||a.call(i,{apple_pay:De,google_pay:De});else if(r.status==="loaded"){const u=r.result,m=u.isAvailable&&u.availableProviders.applePay,y=u.isAvailable&&u.availableProviders.googlePay;(l=(c=this.config).onPaymentRequestLoad)==null||l.call(c,{apple_pay:{isLoading:!1,isAvailable:m,startFlow:async h=>m?this.submitPaymentRequest("apple_pay",u,h):void 0},google_pay:{isLoading:!1,isAvailable:y,startFlow:async h=>y?this.submitPaymentRequest("google_pay",u,h):void 0}})}},this.submitPaymentRequest=(r,o,s)=>{const i=this.createOjsFlowContext();return O.stripePR.run({context:i,checkoutPaymentMethod:Ie(i.checkoutPaymentMethods,r),nonCdeFormInputs:K(i.formDiv),flowCallbacks:this.createOjsFlowCallbacks(),customParams:{provider:r,overridePaymentRequest:s==null?void 0:s.overridePaymentRequest},initResult:o})},F.assignAsSingleton(this),this.config={...e,baseUrl:e.baseUrl??"https://cde.getopenpay.com"},this.elements=null,this.formId=`opjs-form-${window.crypto.randomUUID()}`,this.referer=window.location.origin,this.formTarget=e.formTarget??"body",this.formProperties={height:"1px"},this.cdeLoadedPayload=null,this.ojsFlowsInitialization=null,this.checkoutFired=!1,this.connectionManager=new Wn,this.eventHandler=new Zn(this),this.ojsVersion="0.1.11",this.ojsReleaseVersion="0.1.11-alpha.6e4e361",window.addEventListener("message",this.eventHandler.handleMessage.bind(this.eventHandler))}static assignAsSingleton(e){if(F.getInstance())throw new Error("OpenPay instance already exists. Only one instance is allowed.");window.ojs=e}static getInstance(){return window.ojs??null}getConnectionManager(){return this.connectionManager}setFormHeight(e){this.formProperties.height=e,this.elements&&Object.values(this.elements).forEach(r=>{r.node.style.height=e})}createElement(e,r={}){if(!this.config)throw new Error("OpenPay form not initialized");const o=Je.parse(e),s=document.createElement("iframe"),i=this.buildQueryString(r);s.name=`${o}-element`;const a=new URL(`/app/v1/${s.name}`,this.config.baseUrl);a.search=i.toString(),s.src=a.href,this.config._frameUrl=a,s.style.border="none",s.style.width="100%";const c={type:o,node:s,mount:l=>{var u;return(u=document.querySelector(l))==null?void 0:u.appendChild(s)}};return this.connectToElement(c),this.elements?this.elements[o]=c:this.elements={[o]:c},c}buildQueryString(e){const r=new URLSearchParams;return r.append("referer",this.referer),r.append("formId",this.formId),e.styles&&r.append("styles",Tt(e.styles)),r.append("secureToken",this.config.checkoutSecureToken),r}connectToElement(e){Gn(e.node).then(r=>{this.connectionManager.addConnection(e.type,r),this.tryInitOjsFlows()}).catch(r=>console.error("[FORM] Error connecting to CDE iframe",r))}getFormDiv(){return document.querySelector(this.formTarget)??document.body}createOjsFlowContext(){const e=this.connectionManager.getAllConnections();if(!this.cdeLoadedPayload)throw new Error("Requested context while CDE not yet loaded");if(e.size===0)throw new Error("No CDE connections found");return{baseUrl:new URL(this.config.baseUrl??Ue).origin,formDiv:this.getFormDiv(),elementsSessionId:this.cdeLoadedPayload.sessionId,checkoutPaymentMethods:this.cdeLoadedPayload.checkoutPaymentMethods,cdeConnections:e,customInitParams:this.config.customInitParams??{}}}createOjsFlowCallbacks(){const e=()=>{};return{onCheckoutError:A("onCheckoutError",this.config.onCheckoutError??e),onCheckoutStarted:A("onCheckoutStarted",this.config.onCheckoutStarted??e),onCheckoutSuccess:A("onCheckoutSuccess",this.config.onCheckoutSuccess??e),onSetupPaymentMethodSuccess:A("onSetupPaymentMethodSuccess",this.config.onSetupPaymentMethodSuccess??e),onValidationError:A("onValidationError",this.config.onValidationError??e)}}submit(){const e=this.createOjsFlowContext();O.commonCC.run({context:e,checkoutPaymentMethod:Ie(e.checkoutPaymentMethods,"credit_card"),nonCdeFormInputs:K(e.formDiv),flowCallbacks:this.createOjsFlowCallbacks(),customParams:void 0,initResult:void 0})}onPaymentRequestError(e){console.error("[form] Error from payment request:",e),this.checkoutFired=!1,this.config.onCheckoutError&&this.config.onCheckoutError(e)}destroy(){for(const e of Object.values(this.elements??{}))e.node.remove();window.removeEventListener("message",this.eventHandler.handleMessage.bind(this.eventHandler))}};F.ojsFlows=O;let te=F;S.FieldName=p,S.OpenPayForm=te,Object.defineProperty(S,Symbol.toStringTag,{value:"Module"})});
21
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiaW5kZXgudW1kLmpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBmYWN0b3J5KGV4cG9ydHMsIHJlcXVpcmUoJ3pvZCcpLCByZXF1aXJlKCd1dWlkJyksIHJlcXVpcmUoJ3BlbnBhbCcpLCByZXF1aXJlKCdjaGFsaycpKSA6XG4gIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJ2V4cG9ydHMnLCAnem9kJywgJ3V1aWQnLCAncGVucGFsJywgJ2NoYWxrJ10sIGZhY3RvcnkpIDpcbiAgKGdsb2JhbCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiBnbG9iYWwgfHwgc2VsZiwgZmFjdG9yeShnbG9iYWwuT3BlblBheSA9IHt9LCBnbG9iYWwuem9kLCBnbG9iYWwudXVpZCwgZ2xvYmFsLnBlbnBhbCwgZ2xvYmFsLmNoYWxrKSk7XG59KSh0aGlzLCAoZnVuY3Rpb24gKGV4cG9ydHMsIHpvZCwgdXVpZCwgcGVucGFsLCBjaGFsaykgeyAndXNlIHN0cmljdCc7XG5cbiAgY29uc3QgRlJBTUVfQkFTRV9VUkwgPSBcImh0dHBzOi8vY2RlLmdldG9wZW5wYXkuY29tXCI7XG5cbiAgY29uc3QgUHlkYW50aWNWYWxpZGF0aW9uRXJyb3IkMSA9IHpvZC56Lm9iamVjdCh7XG4gICAgdHlwZTogem9kLnouc3RyaW5nKCksXG4gICAgbG9jOiB6b2Quei5hcnJheSh6b2Quei5zdHJpbmcoKSksXG4gICAgbXNnOiB6b2Quei5zdHJpbmcoKSxcbiAgICB1cmw6IHpvZC56LnN0cmluZygpXG4gIH0pO1xuICBjb25zdCBQeWRhbnRpY1ZhbGlkYXRpb25FcnJvclJlc3BvbnNlID0gem9kLnouYXJyYXkoUHlkYW50aWNWYWxpZGF0aW9uRXJyb3IkMSk7XG4gIGNvbnN0IFpvZEZpZWxkRXJyb3IgPSB6b2Quei5vYmplY3Qoe1xuICAgIGNvZGU6IHpvZC56LnN0cmluZygpLFxuICAgIG1lc3NhZ2U6IHpvZC56LnN0cmluZygpLFxuICAgIHBhdGg6IHpvZC56LmFycmF5KHpvZC56LnN0cmluZygpKVxuICB9KTtcbiAgY29uc3QgWm9kRmllbGRFcnJvcnMgPSB6b2Quei5hcnJheShab2RGaWVsZEVycm9yKTtcbiAgY29uc3QgTUFQX1RPX0hVTUFOX0ZSSUVORExZX0xPV0VSQ0FTRSA9IHtcbiAgICBcImZhaWxlZCB0byBmZXRjaFwiOiBgQ29ubmVjdGlvbiBlcnJvcjogcGxlYXNlIGRvdWJsZSBjaGVjayBpZiB5b3UgYXJlIGNvbm5lY3RlZCB0byB0aGUgaW50ZXJuZXQsIHRoZW4gdHJ5IGFnYWluYFxuICB9O1xuICBjb25zdCBnZXRIdW1hbkZyaWVuZGx5TWVzc2FnZSA9IChvZ0Vycm9yTWVzc2FnZSkgPT4ge1xuICAgIGNvbnN0IGtleSA9IG9nRXJyb3JNZXNzYWdlLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgIHJldHVybiBNQVBfVE9fSFVNQU5fRlJJRU5ETFlfTE9XRVJDQVNFW2tleV0gPz8gb2dFcnJvck1lc3NhZ2U7XG4gIH07XG4gIGNvbnN0IGlzU3RyaW5naWZpZWRKc29uT2JqZWN0ID0gKHN0cikgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHN0cik7XG4gICAgICByZXR1cm4gdHlwZW9mIHBhcnNlZCA9PT0gXCJvYmplY3RcIjtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9O1xuICBjb25zdCBjcmVhdGVNZXNzYWdlRnJvbVB5ZGFudGljVmFsaWRhdGlvbkVycm9yID0gKHJlc3BvbnNlKSA9PiB7XG4gICAgaWYgKHJlc3BvbnNlLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIGdldEh1bWFuRnJpZW5kbHlNZXNzYWdlKHJlc3BvbnNlWzBdLm1zZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGJ1bGxldGVkID0gcmVzcG9uc2UubWFwKChlcnIpID0+IGDigKIgJHtnZXRIdW1hbkZyaWVuZGx5TWVzc2FnZShlcnIubXNnKX1gKS5qb2luKFwiXFxuXCIpO1xuICAgICAgcmV0dXJuIGAke2BQbGVhc2UgZml4IHRoZSBmb2xsb3dpbmcgZXJyb3JzOmB9XG4ke2J1bGxldGVkfWA7XG4gICAgfVxuICB9O1xuICBjb25zdCBjcmVhdGVNZXNzYWdlRnJvbVpvZEZpZWxkRXJyb3JzID0gKGVycm9ycykgPT4ge1xuICAgIGNvbnN0IGxpc3RPZkVycm9ycyA9IGVycm9ycy5tYXAoKGVycikgPT4gYC0gJHtlcnIucGF0aC5qb2luKFwiL1wiKX06ICR7ZXJyLm1lc3NhZ2V9YCkuam9pbihcIlxcblwiKTtcbiAgICByZXR1cm4gYEVuY291bnRlcmVkIHRoZSBmb2xsb3dpbmcgZXJyb3JzOlxuJHtsaXN0T2ZFcnJvcnN9YDtcbiAgfTtcbiAgY29uc3QgZ2V0RXJyb3JNZXNzYWdlID0gKGUpID0+IHtcbiAgICBpZiAoZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBpZiAoaXNTdHJpbmdpZmllZEpzb25PYmplY3QoZS5tZXNzYWdlKSkge1xuICAgICAgICBjb25zdCBvYmogPSBKU09OLnBhcnNlKGUubWVzc2FnZSk7XG4gICAgICAgIGlmIChQeWRhbnRpY1ZhbGlkYXRpb25FcnJvclJlc3BvbnNlLnNhZmVQYXJzZShvYmopLnN1Y2Nlc3MpIHtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlTWVzc2FnZUZyb21QeWRhbnRpY1ZhbGlkYXRpb25FcnJvcihvYmopO1xuICAgICAgICB9IGVsc2UgaWYgKFpvZEZpZWxkRXJyb3JzLnNhZmVQYXJzZShvYmopLnN1Y2Nlc3MpIHtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlTWVzc2FnZUZyb21ab2RGaWVsZEVycm9ycyhvYmopO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgRW5jb3VudGVyZWQgdW5rbm93biBzdHJpbmdpZmllZCBKU09OIG9iamVjdDpcbiR7ZS5tZXNzYWdlfWApO1xuICAgICAgICAgIHJldHVybiBlLm1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBnZXRIdW1hbkZyaWVuZGx5TWVzc2FnZShlLm1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShlKTtcbiAgICAgIH0gY2F0Y2ggKGUyKSB7XG4gICAgICAgIHJldHVybiBlMiArIFwiXCI7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBlICsgXCJcIjtcbiAgICB9XG4gIH07XG4gIGNvbnN0IG1ha2VDYWxsYmFja1NhZmUgPSAoY2FsbGJhY2tOYW1lLCBmbikgPT4ge1xuICAgIHJldHVybiAoLi4uYXJncykgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGZuKC4uLmFyZ3MpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgW2Zvcm1dIEVycm9yIHJ1bm5pbmcgY2FsbGJhY2sgKCR7Y2FsbGJhY2tOYW1lfSk6YCwgZXJyb3IpO1xuICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgfVxuICAgIH07XG4gIH07XG5cbiAgY29uc3QgUmVxdWlyZWRTdHJpbmcgPSB6b2Quei5zdHJpbmcoKS50cmltKCkubWluKDEsIHsgbWVzc2FnZTogYENhbm5vdCBiZSBibGFua2AgfSk7XG4gIGNvbnN0IE9wdGlvbmFsU3RyaW5nID0gem9kLnouc3RyaW5nKCkudHJpbSgpLm9wdGlvbmFsKCk7XG4gIGNvbnN0IG51bGxPclVuZGVmT3IkMSA9ICh6VHlwZSkgPT4gem9kLnoubnVsbGFibGUoelR5cGUub3B0aW9uYWwoKSk7XG4gIHZhciBGaWVsZE5hbWUgPSAvKiBAX19QVVJFX18gKi8gKChGaWVsZE5hbWUyKSA9PiB7XG4gICAgRmllbGROYW1lMltcIkZJUlNUX05BTUVcIl0gPSBcImZpcnN0TmFtZVwiO1xuICAgIEZpZWxkTmFtZTJbXCJMQVNUX05BTUVcIl0gPSBcImxhc3ROYW1lXCI7XG4gICAgRmllbGROYW1lMltcIkVNQUlMXCJdID0gXCJlbWFpbFwiO1xuICAgIEZpZWxkTmFtZTJbXCJaSVBfQ09ERVwiXSA9IFwiemlwQ29kZVwiO1xuICAgIEZpZWxkTmFtZTJbXCJDSVRZXCJdID0gXCJjaXR5XCI7XG4gICAgRmllbGROYW1lMltcIlNUQVRFXCJdID0gXCJzdGF0ZVwiO1xuICAgIEZpZWxkTmFtZTJbXCJDT1VOVFJZXCJdID0gXCJjb3VudHJ5XCI7XG4gICAgRmllbGROYW1lMltcIkFERFJFU1NcIl0gPSBcImFkZHJlc3NcIjtcbiAgICBGaWVsZE5hbWUyW1wiUEhPTkVcIl0gPSBcInBob25lXCI7XG4gICAgRmllbGROYW1lMltcIlBST01PVElPTl9DT0RFXCJdID0gXCJwcm9tb3Rpb25Db2RlXCI7XG4gICAgcmV0dXJuIEZpZWxkTmFtZTI7XG4gIH0pKEZpZWxkTmFtZSB8fCB7fSk7XG4gIGNvbnN0IEZpZWxkTmFtZUVudW0gPSB6b2Quei5uYXRpdmVFbnVtKEZpZWxkTmFtZSk7XG4gIHZhciBQcml2YXRlRmllbGROYW1lID0gLyogQF9fUFVSRV9fICovICgoUHJpdmF0ZUZpZWxkTmFtZTIpID0+IHtcbiAgICBQcml2YXRlRmllbGROYW1lMltcIkNBUkRfTlVNQkVSXCJdID0gXCJjYXJkTnVtYmVyXCI7XG4gICAgUHJpdmF0ZUZpZWxkTmFtZTJbXCJDQVJEX0VYUElSWVwiXSA9IFwiY2FyZEV4cGlyeVwiO1xuICAgIFByaXZhdGVGaWVsZE5hbWUyW1wiQ0FSRF9DVkNcIl0gPSBcImNhcmRDdmNcIjtcbiAgICByZXR1cm4gUHJpdmF0ZUZpZWxkTmFtZTI7XG4gIH0pKFByaXZhdGVGaWVsZE5hbWUgfHwge30pO1xuICBjb25zdCBQcml2YXRlRmllbGROYW1lRW51bSA9IHpvZC56Lm5hdGl2ZUVudW0oUHJpdmF0ZUZpZWxkTmFtZSk7XG4gIGNvbnN0IEFsbEZpZWxkTmFtZXMgPSB6b2Quei51bmlvbihbRmllbGROYW1lRW51bSwgUHJpdmF0ZUZpZWxkTmFtZUVudW1dKTtcbiAgdmFyIEVsZW1lbnRUeXBlRW51bSA9IC8qIEBfX1BVUkVfXyAqLyAoKEVsZW1lbnRUeXBlRW51bTIpID0+IHtcbiAgICBFbGVtZW50VHlwZUVudW0yW1wiQ0FSRFwiXSA9IFwiY2FyZFwiO1xuICAgIEVsZW1lbnRUeXBlRW51bTJbXCJDQVJEX05VTUJFUlwiXSA9IFwiY2FyZC1udW1iZXJcIjtcbiAgICBFbGVtZW50VHlwZUVudW0yW1wiQ0FSRF9FWFBJUllcIl0gPSBcImNhcmQtZXhwaXJ5XCI7XG4gICAgRWxlbWVudFR5cGVFbnVtMltcIkNBUkRfQ1ZDXCJdID0gXCJjYXJkLWN2Y1wiO1xuICAgIHJldHVybiBFbGVtZW50VHlwZUVudW0yO1xuICB9KShFbGVtZW50VHlwZUVudW0gfHwge30pO1xuICBjb25zdCBFbGVtZW50VHlwZSA9IHpvZC56Lm5hdGl2ZUVudW0oRWxlbWVudFR5cGVFbnVtKTtcbiAgY29uc3QgQ2hlY2tvdXRQYXltZW50TWV0aG9kJDEgPSB6b2Quei5vYmplY3Qoe1xuICAgIHByb3ZpZGVyOiB6b2Quei5zdHJpbmcoKSxcbiAgICBwcm9jZXNzb3JfbmFtZTogbnVsbE9yVW5kZWZPciQxKHpvZC56LnN0cmluZygpKSxcbiAgICBtZXRhZGF0YTogbnVsbE9yVW5kZWZPciQxKHpvZC56LnJlY29yZCh6b2Quei5zdHJpbmcoKSwgem9kLnouYW55KCkpKVxuICB9KTtcbiAgY29uc3QgUGF5bWVudE1ldGhvZE1pbmltYWwgPSB6b2Quei5vYmplY3Qoe1xuICAgIGlkOiB6b2Quei5zdHJpbmcoKVxuICB9KTtcbiAgem9kLnoub2JqZWN0KHtcbiAgICBjYXJkTnVtYmVyOiBPcHRpb25hbFN0cmluZyxcbiAgICBleHBpcnk6IE9wdGlvbmFsU3RyaW5nLFxuICAgIGN2YzogT3B0aW9uYWxTdHJpbmdcbiAgfSk7XG4gIHpvZC56Lm9iamVjdCh7XG4gICAgYmFja2dyb3VuZENvbG9yOiBPcHRpb25hbFN0cmluZyxcbiAgICBjb2xvcjogT3B0aW9uYWxTdHJpbmcsXG4gICAgZm9udEZhbWlseTogT3B0aW9uYWxTdHJpbmcsXG4gICAgZm9udFNpemU6IE9wdGlvbmFsU3RyaW5nLFxuICAgIGZvbnRXZWlnaHQ6IE9wdGlvbmFsU3RyaW5nLFxuICAgIG1hcmdpbjogT3B0aW9uYWxTdHJpbmcsXG4gICAgcGFkZGluZzogT3B0aW9uYWxTdHJpbmcsXG4gICAgbGV0dGVyU3BhY2luZzogT3B0aW9uYWxTdHJpbmcsXG4gICAgbGluZUhlaWdodDogT3B0aW9uYWxTdHJpbmdcbiAgfSk7XG4gIGNvbnN0IEV2ZW50VHlwZSA9IHpvZC56LmVudW0oW1xuICAgIC8vIEVsZW1lbnQgLT4gRm9ybVxuICAgIFwiTEFZT1VUXCIsXG4gICAgXCJMT0FERURcIixcbiAgICBcIkJMVVJcIixcbiAgICBcIkZPQ1VTXCIsXG4gICAgXCJDSEFOR0VcIixcbiAgICBcIlRPS0VOSVpFX1NUQVJURURcIixcbiAgICBcIkNIRUNLT1VUX1NUQVJURURcIixcbiAgICBcIlBBWU1FTlRfRkxPV19TVEFSVEVEXCIsXG4gICAgXCJUT0tFTklaRV9TVUNDRVNTXCIsXG4gICAgXCJDSEVDS09VVF9TVUNDRVNTXCIsXG4gICAgXCJMT0FEX0VSUk9SXCIsXG4gICAgXCJWQUxJREFUSU9OX0VSUk9SXCIsXG4gICAgXCJUT0tFTklaRV9FUlJPUlwiLFxuICAgIFwiQ0hFQ0tPVVRfRVJST1JcIixcbiAgICBcIlNFVFVQX1BBWU1FTlRfTUVUSE9EX1NVQ0NFU1NcIixcbiAgICAvLyBGb3JtIC0+IEVsZW1lbnRcbiAgICBcIlRPS0VOSVpFXCIsXG4gICAgXCJDSEVDS09VVFwiLFxuICAgIFwiU1RBUlRfUEFZTUVOVF9GTE9XXCJcbiAgXSk7XG4gIGNvbnN0IEdlbmVyaWNFdmVudFR5cGUgPSBFdmVudFR5cGUuZXh0cmFjdChbXCJUT0tFTklaRV9TVEFSVEVEXCIsIFwiQ0hFQ0tPVVRfU1RBUlRFRFwiXSk7XG4gIGNvbnN0IEdlbmVyaWNFdmVudFBheWxvYWQgPSB6b2Quei5vYmplY3QoeyB0eXBlOiBHZW5lcmljRXZlbnRUeXBlIH0pO1xuICBjb25zdCBJbnB1dEV2ZW50VHlwZSA9IEV2ZW50VHlwZS5leHRyYWN0KFtcIkJMVVJcIiwgXCJGT0NVU1wiLCBcIkNIQU5HRVwiXSk7XG4gIGNvbnN0IElucHV0RXZlbnRQYXlsb2FkID0gem9kLnoub2JqZWN0KHtcbiAgICB0eXBlOiBJbnB1dEV2ZW50VHlwZSxcbiAgICBlbGVtZW50VHlwZTogUHJpdmF0ZUZpZWxkTmFtZUVudW0sXG4gICAgZXJyb3JzOiB6b2Quei5hcnJheSh6b2Quei5zdHJpbmcoKSkub3B0aW9uYWwoKVxuICB9KTtcbiAgY29uc3QgRXJyb3JFdmVudFR5cGUgPSBFdmVudFR5cGUuZXh0cmFjdChbXCJMT0FEX0VSUk9SXCIsIFwiVE9LRU5JWkVfRVJST1JcIiwgXCJDSEVDS09VVF9FUlJPUlwiXSk7XG4gIGNvbnN0IEVycm9yRXZlbnRQYXlsb2FkID0gem9kLnoub2JqZWN0KHtcbiAgICB0eXBlOiBFcnJvckV2ZW50VHlwZSxcbiAgICBtZXNzYWdlOiBSZXF1aXJlZFN0cmluZyxcbiAgICBoZWFkZXJzOiB6b2Quei5yZWNvcmQoem9kLnouc3RyaW5nKCksIHpvZC56LnN0cmluZygpKS5vcHRpb25hbCgpXG4gIH0pO1xuICBjb25zdCBWYWxpZGF0aW9uRXJyb3JFdmVudFR5cGUgPSBFdmVudFR5cGUuZXh0cmFjdChbXCJWQUxJREFUSU9OX0VSUk9SXCJdKTtcbiAgY29uc3QgVmFsaWRhdGlvbkVycm9yRXZlbnRQYXlsb2FkID0gem9kLnoub2JqZWN0KHtcbiAgICB0eXBlOiBWYWxpZGF0aW9uRXJyb3JFdmVudFR5cGUsXG4gICAgZWxlbWVudFR5cGU6IEFsbEZpZWxkTmFtZXMsXG4gICAgZXJyb3JzOiB6b2Quei5hcnJheSh6b2Quei5zdHJpbmcoKSlcbiAgfSk7XG4gIGNvbnN0IExheW91dEV2ZW50UGF5bG9hZCA9IHpvZC56Lm9iamVjdCh7XG4gICAgdHlwZTogem9kLnoubGl0ZXJhbChFdmVudFR5cGUuZW51bS5MQVlPVVQpLFxuICAgIGhlaWdodDogUmVxdWlyZWRTdHJpbmdcbiAgfSk7XG4gIGNvbnN0IExvYWRlZEV2ZW50UGF5bG9hZCA9IHpvZC56Lm9iamVjdCh7XG4gICAgdHlwZTogem9kLnoubGl0ZXJhbChFdmVudFR5cGUuZW51bS5MT0FERUQpLFxuICAgIHNlc3Npb25JZDogUmVxdWlyZWRTdHJpbmcsXG4gICAgdG90YWxBbW91bnRBdG9tczogem9kLnoubnVtYmVyKCksXG4gICAgY3VycmVuY3k6IE9wdGlvbmFsU3RyaW5nLFxuICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZHM6IHpvZC56LmFycmF5KENoZWNrb3V0UGF5bWVudE1ldGhvZCQxKVxuICB9KTtcbiAgY29uc3QgUGF5bWVudEZsb3dTdGFydGVkRXZlbnRQYXlsb2FkID0gem9kLnoub2JqZWN0KHtcbiAgICB0eXBlOiB6b2Quei5saXRlcmFsKEV2ZW50VHlwZS5lbnVtLlBBWU1FTlRfRkxPV19TVEFSVEVEKSxcbiAgICBuZXh0QWN0aW9uTWV0YWRhdGE6IHpvZC56LnJlY29yZCh6b2Quei5zdHJpbmcoKSwgem9kLnouYW55KCkpLFxuICAgIHBheW1lbnRGbG93TWV0YWRhdGE6IHpvZC56LmFueSgpLm9wdGlvbmFsKCksXG4gICAgc3RhcnRQRk1ldGFkYXRhOiB6b2Quei5vcHRpb25hbCh6b2Quei5yZWNvcmQoem9kLnouc3RyaW5nKCksIHpvZC56LmFueSgpKSlcbiAgfSk7XG4gIGNvbnN0IFNldHVwQ2hlY2tvdXRTdWNjZXNzRXZlbnRQYXlsb2FkID0gem9kLnoub2JqZWN0KHtcbiAgICB0eXBlOiB6b2Quei5saXRlcmFsKEV2ZW50VHlwZS5lbnVtLlNFVFVQX1BBWU1FTlRfTUVUSE9EX1NVQ0NFU1MpLFxuICAgIHBheW1lbnRNZXRob2RJZDogem9kLnouc3RyaW5nKClcbiAgfSk7XG4gIGNvbnN0IFJlcXVpcmVkRm9ybUZpZWxkcyA9IHpvZC56Lm9iamVjdCh7XG4gICAgW1wiZmlyc3ROYW1lXCIgLyogRklSU1RfTkFNRSAqL106IFJlcXVpcmVkU3RyaW5nLFxuICAgIFtcImxhc3ROYW1lXCIgLyogTEFTVF9OQU1FICovXTogUmVxdWlyZWRTdHJpbmcsXG4gICAgW1wiZW1haWxcIiAvKiBFTUFJTCAqL106IFJlcXVpcmVkU3RyaW5nLFxuICAgIFtcInppcENvZGVcIiAvKiBaSVBfQ09ERSAqL106IFJlcXVpcmVkU3RyaW5nLFxuICAgIFtcImNvdW50cnlcIiAvKiBDT1VOVFJZICovXTogUmVxdWlyZWRTdHJpbmcsXG4gICAgW1wicHJvbW90aW9uQ29kZVwiIC8qIFBST01PVElPTl9DT0RFICovXTogT3B0aW9uYWxTdHJpbmdcbiAgfSk7XG4gIGNvbnN0IFBSRm9ybUZpZWxkcyA9IHpvZC56Lm9iamVjdCh7XG4gICAgW1wiZW1haWxcIiAvKiBFTUFJTCAqL106IFJlcXVpcmVkU3RyaW5nLFxuICAgIFtcInppcENvZGVcIiAvKiBaSVBfQ09ERSAqL106IFJlcXVpcmVkU3RyaW5nLFxuICAgIFtcImNvdW50cnlcIiAvKiBDT1VOVFJZICovXTogUmVxdWlyZWRTdHJpbmcsXG4gICAgW1wicHJvbW90aW9uQ29kZVwiIC8qIFBST01PVElPTl9DT0RFICovXTogT3B0aW9uYWxTdHJpbmdcbiAgfSk7XG4gIGNvbnN0IFN1Ym1pdEV2ZW50VHlwZSA9IEV2ZW50VHlwZS5leHRyYWN0KFtcIlRPS0VOSVpFXCIsIFwiQ0hFQ0tPVVRcIiwgXCJTVEFSVF9QQVlNRU5UX0ZMT1dcIl0pO1xuICBjb25zdCBTdWJtaXRFdmVudFBheWxvYWQgPSB6b2Quei5vYmplY3Qoe1xuICAgIHR5cGU6IFN1Ym1pdEV2ZW50VHlwZSxcbiAgICBzZXNzaW9uSWQ6IFJlcXVpcmVkU3RyaW5nLFxuICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZDogQ2hlY2tvdXRQYXltZW50TWV0aG9kJDEsXG4gICAgcGF5bWVudEZsb3dNZXRhZGF0YTogem9kLnouYW55KCkub3B0aW9uYWwoKSxcbiAgICBkb05vdFVzZUxlZ2FjeUNDRmxvdzogem9kLnouYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gICAgZXhpc3RpbmdDQ1BNSWQ6IE9wdGlvbmFsU3RyaW5nXG4gIH0pLmV4dGVuZChSZXF1aXJlZEZvcm1GaWVsZHMuc2hhcGUpO1xuICBjb25zdCBUb2tlbml6ZVN1Y2Nlc3NFdmVudFBheWxvYWQgPSB6b2Quei5vYmplY3Qoe1xuICAgIHR5cGU6IHpvZC56LmxpdGVyYWwoRXZlbnRUeXBlLmVudW0uVE9LRU5JWkVfU1VDQ0VTUyksXG4gICAgaXNSZWFkeUZvckNoZWNrb3V0OiB6b2Quei5ib29sZWFuKClcbiAgfSk7XG4gIGNvbnN0IENoZWNrb3V0U3VjY2Vzc0V2ZW50UGF5bG9hZCA9IHpvZC56Lm9iamVjdCh7XG4gICAgdHlwZTogem9kLnoubGl0ZXJhbChFdmVudFR5cGUuZW51bS5DSEVDS09VVF9TVUNDRVNTKSxcbiAgICBpbnZvaWNlVXJsczogem9kLnouYXJyYXkoem9kLnouc3RyaW5nKCkpLFxuICAgIHN1YnNjcmlwdGlvbklkczogem9kLnouYXJyYXkoem9kLnouc3RyaW5nKCkpLFxuICAgIGN1c3RvbWVySWQ6IHpvZC56LnN0cmluZygpXG4gIH0pO1xuICBjb25zdCBFdmVudFBheWxvYWQgPSB6b2Quei5kaXNjcmltaW5hdGVkVW5pb24oXCJ0eXBlXCIsIFtcbiAgICBHZW5lcmljRXZlbnRQYXlsb2FkLFxuICAgIElucHV0RXZlbnRQYXlsb2FkLFxuICAgIEVycm9yRXZlbnRQYXlsb2FkLFxuICAgIFZhbGlkYXRpb25FcnJvckV2ZW50UGF5bG9hZCxcbiAgICBMYXlvdXRFdmVudFBheWxvYWQsXG4gICAgTG9hZGVkRXZlbnRQYXlsb2FkLFxuICAgIFN1Ym1pdEV2ZW50UGF5bG9hZCxcbiAgICBUb2tlbml6ZVN1Y2Nlc3NFdmVudFBheWxvYWQsXG4gICAgQ2hlY2tvdXRTdWNjZXNzRXZlbnRQYXlsb2FkLFxuICAgIFBheW1lbnRGbG93U3RhcnRlZEV2ZW50UGF5bG9hZCxcbiAgICBTZXR1cENoZWNrb3V0U3VjY2Vzc0V2ZW50UGF5bG9hZFxuICBdKTtcbiAgY29uc3QgRWxlbWVudEV2ZW50ID0gem9kLnoub2JqZWN0KHtcbiAgICBwYXlsb2FkOiBFdmVudFBheWxvYWQsXG4gICAgbm9uY2U6IFJlcXVpcmVkU3RyaW5nLFxuICAgIGZvcm1JZDogUmVxdWlyZWRTdHJpbmcsXG4gICAgZWxlbWVudElkOiBSZXF1aXJlZFN0cmluZ1xuICB9KTtcbiAgem9kLnoub2JqZWN0KHtcbiAgICBhbW91bnRBdG9tOiB6b2Quei5udW1iZXIoKSxcbiAgICBjdXJyZW5jeTogUmVxdWlyZWRTdHJpbmdcbiAgfSk7XG4gIHpvZC56Lm9iamVjdCh7XG4gICAgc2VjdXJlX3Rva2VuOiB6b2Quei5zdHJpbmcoKSxcbiAgICBwcm9tb3Rpb25fY29kZTogem9kLnouc3RyaW5nKCkub3B0aW9uYWwoKVxuICB9KTtcbiAgem9kLnoub2JqZWN0KHtcbiAgICBzZWN1cmVfdG9rZW46IHpvZC56LnN0cmluZygpLFxuICAgIGV4aXN0aW5nX2NjX3BtX2lkOiBudWxsT3JVbmRlZk9yJDEoem9kLnouc3RyaW5nKCkpXG4gIH0pO1xuICBjb25zdCBDb25maXJtUGF5bWVudEZsb3dSZXNwb25zZSA9IHpvZC56Lm9iamVjdCh7XG4gICAgcGF5bWVudF9tZXRob2RzOiB6b2Quei5hcnJheShQYXltZW50TWV0aG9kTWluaW1hbClcbiAgfSk7XG4gIGNvbnN0IEZpZWxkVmFsaWRhdGlvbkVycm9yID0gem9kLnoub2JqZWN0KHtcbiAgICBlbGVtZW50VHlwZTogem9kLnouc3RyaW5nKCksXG4gICAgZXJyb3JzOiB6b2Quei5hcnJheSh6b2Quei5zdHJpbmcoKSlcbiAgfSk7XG4gIHpvZC56Lm9iamVjdCh7XG4gICAgc2Vzc2lvbl9pZDogem9kLnouc3RyaW5nKClcbiAgfSk7XG4gIGNvbnN0IFRva2VuaXplQ2FyZEVycm9yUmVzcG9uc2UgPSB6b2Quei5vYmplY3Qoe1xuICAgIHN1Y2Nlc3M6IHpvZC56LmxpdGVyYWwoZmFsc2UpLFxuICAgIGVycm9yX3R5cGU6IHpvZC56LmxpdGVyYWwoXCJ2YWxpZGF0aW9uX2Vycm9yXCIpLFxuICAgIGVycm9yczogem9kLnouYXJyYXkoRmllbGRWYWxpZGF0aW9uRXJyb3IpXG4gIH0pO1xuICBjb25zdCBUb2tlbml6ZUNhcmRSZXNwb25zZSA9IHpvZC56LmRpc2NyaW1pbmF0ZWRVbmlvbihcInN1Y2Nlc3NcIiwgW1xuICAgIHpvZC56Lm9iamVjdCh7IHN1Y2Nlc3M6IHpvZC56LmxpdGVyYWwodHJ1ZSkgfSksXG4gICAgVG9rZW5pemVDYXJkRXJyb3JSZXNwb25zZVxuICBdKTtcbiAgem9kLnoub2JqZWN0KHtcbiAgICBzZXNzaW9uX2lkOiB6b2Quei5zdHJpbmcoKSxcbiAgICBjaGVja291dF9wYXltZW50X21ldGhvZDogQ2hlY2tvdXRQYXltZW50TWV0aG9kJDEsXG4gICAgbm9uX2NkZV9mb3JtX2ZpZWxkczogUmVxdWlyZWRGb3JtRmllbGRzLFxuICAgIGRvX25vdF91c2VfbGVnYWN5X2NjX2Zsb3c6IHpvZC56LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICAgIGV4aXN0aW5nX2NjX3BtX2lkOiBudWxsT3JVbmRlZk9yJDEoem9kLnouc3RyaW5nKCkpXG4gIH0pO1xuICB6b2Quei5vYmplY3Qoe1xuICAgIHNlc3Npb25faWQ6IHpvZC56LnN0cmluZygpLFxuICAgIGNoZWNrb3V0X3BheW1lbnRfbWV0aG9kOiBDaGVja291dFBheW1lbnRNZXRob2QkMSxcbiAgICBub25fY2RlX2Zvcm1fZmllbGRzOiBSZXF1aXJlZEZvcm1GaWVsZHNcbiAgfSk7XG4gIHZhciBUaHJlZURTU3RhdHVzID0gLyogQF9fUFVSRV9fICovICgoVGhyZWVEU1N0YXR1czIpID0+IHtcbiAgICBUaHJlZURTU3RhdHVzMltcIlNVQ0NFU1NcIl0gPSBcInN1Y2Nlc3NcIjtcbiAgICBUaHJlZURTU3RhdHVzMltcIkZBSUxVUkVcIl0gPSBcImZhaWx1cmVcIjtcbiAgICBUaHJlZURTU3RhdHVzMltcIkNBTkNFTExFRFwiXSA9IFwiY2FuY2VsbGVkXCI7XG4gICAgcmV0dXJuIFRocmVlRFNTdGF0dXMyO1xuICB9KShUaHJlZURTU3RhdHVzIHx8IHt9KTtcbiAgY29uc3QgUGluZzNEU1N0YXR1c1Jlc3BvbnNlID0gem9kLnoub2JqZWN0KHtcbiAgICBzdGF0dXM6IHpvZC56LmVudW0oW1wic3VjY2Vzc1wiIC8qIFNVQ0NFU1MgKi8sIFwiZmFpbHVyZVwiIC8qIEZBSUxVUkUgKi8sIFwiY2FuY2VsbGVkXCIgLyogQ0FOQ0VMTEVEICovXSlcbiAgfSk7XG4gIGNvbnN0IENvbW1vbjNEU05leHRBY3Rpb25NZXRhZGF0YSA9IHpvZC56Lm9iamVjdCh7XG4gICAgdHlwZTogem9kLnouc3RyaW5nKCksXG4gICAgcmVkaXJlY3RfdXJsOiB6b2Quei5zdHJpbmcoKSxcbiAgICBpbml0aWFsX2ludGVudF9pZDogem9kLnouc3RyaW5nKCksXG4gICAgY29uc2VudF9pZDogem9kLnouc3RyaW5nKClcbiAgfSk7XG5cbiAgY29uc3QgZXh0cmFjdElzc3Vlc1BlckZpZWxkID0gKGVycm9yKSA9PiB7XG4gICAgY29uc3QgaXNzdWVzUGVyRmllbGQgPSB7fTtcbiAgICBPYmplY3QuZW50cmllcyhlcnJvcikuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBmaWVsZE5hbWUgPSBGaWVsZE5hbWVFbnVtLnBhcnNlKGtleSk7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgIGlzc3Vlc1BlckZpZWxkW2ZpZWxkTmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlLl9lcnJvcnMpKSB7XG4gICAgICAgICAgaXNzdWVzUGVyRmllbGRbZmllbGROYW1lXSA9IHZhbHVlLl9lcnJvcnM7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGlzc3Vlc1BlckZpZWxkO1xuICB9O1xuXG4gIGNvbnN0IFN0cmlwZTNEU05leHRBY3Rpb25NZXRhZGF0YSA9IHpvZC56Lm9iamVjdCh7XG4gICAgc3RyaXBlX3BrOiB6b2Quei5zdHJpbmcoKSxcbiAgICBjbGllbnRfc2VjcmV0OiB6b2Quei5zdHJpbmcoKSxcbiAgICBzdHJpcGVfcG1faWQ6IHpvZC56LnN0cmluZygpXG4gIH0pO1xuICBjb25zdCBQYXltZW50UmVxdWVzdE5leHRBY3Rpb25NZXRhZGF0YSA9IHpvZC56Lm9iamVjdCh7XG4gICAgdHlwZTogem9kLnouc3RyaW5nKCksXG4gICAgY2xpZW50X3NlY3JldDogem9kLnouc3RyaW5nKCksXG4gICAgc3RyaXBlX3BrOiB6b2Quei5zdHJpbmcoKVxuICB9KTtcbiAgY29uc3Qgb3VyQ3VycmVuY3lUb1RoZWlycyA9IHtcbiAgICB1c2Q6IFwidXNkXCIsXG4gICAgYnJsOiBcImJybFwiXG4gIH07XG4gIGNvbnN0IGdldExvYWRlZFN0cmlwZSA9IGFzeW5jIChwdWJsaXNoYWJsZUtleSkgPT4ge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTA7IGkrKykge1xuICAgICAgaWYgKCFpc1N0cmlwZUpzUHJlc2VudCgpKSB7XG4gICAgICAgIGF3YWl0IHNsZWVwKDUwMCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghaXNTdHJpcGVKc1ByZXNlbnQoKSkge1xuICAgICAgY29uc29sZS5sb2coXCJTdHJpcGUgSlMgbm90IGZvdW5kLlwiKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU3RyaXBlIEpTIG5vdCBmb3VuZC5gKTtcbiAgICB9XG4gICAgY29uc3Qgc3RyaXBlID0gbmV3IFN0cmlwZShwdWJsaXNoYWJsZUtleSk7XG4gICAgcmV0dXJuIHN0cmlwZTtcbiAgfTtcbiAgY29uc3QgY3JlYXRlU3RyaXBlRWxlbWVudHMgPSBhc3luYyAoc3RyaXBlUHViS2V5LCBlbGVtZW50c09wdGlvbnMpID0+IHtcbiAgICBjb25zdCBzdHJpcGUgPSBhd2FpdCBnZXRMb2FkZWRTdHJpcGUoc3RyaXBlUHViS2V5KTtcbiAgICByZXR1cm4ge1xuICAgICAgZWxlbWVudHM6IHN0cmlwZS5lbGVtZW50cyhlbGVtZW50c09wdGlvbnMpLFxuICAgICAgc3RyaXBlXG4gICAgfTtcbiAgfTtcbiAgY29uc3QgY3JlYXRlU3RyaXBlUGF5bWVudFJlcXVlc3QgPSBhc3luYyAoc3RyaXBlUHViS2V5LCB0b3RhbEFtb3VudEF0b20sIGN1cnJlbmN5LCBpc0Ftb3VudFBlbmRpbmcsIGlzTGlua09ubHkpID0+IHtcbiAgICBjb25zb2xlLmxvZyhpc0xpbmtPbmx5KTtcbiAgICBjb25zdCBzdHJpcGUgPSBhd2FpdCBnZXRMb2FkZWRTdHJpcGUoc3RyaXBlUHViS2V5KTtcbiAgICBjb25zdCBzdHJpcGVDdXJyZW5jeSA9IG91ckN1cnJlbmN5VG9UaGVpcnNbY3VycmVuY3kudG9Mb3dlckNhc2UoKS50cmltKCldO1xuICAgIGNvbnN0IHBheW1lbnRSZXF1ZXN0ID0gc3RyaXBlLnBheW1lbnRSZXF1ZXN0KHtcbiAgICAgIC8vIFRPRE86IHJlcGxhY2UgdGhpcyB3aXRoIHN0cmlwZSBhY2NvdW50IGNvdW50cnkgYXMgc29vbiBhcyB3ZSBzdXBwb3J0IGl0XG4gICAgICBjb3VudHJ5OiBcIlVTXCIsXG4gICAgICBjdXJyZW5jeTogc3RyaXBlQ3VycmVuY3ksXG4gICAgICB0b3RhbDoge1xuICAgICAgICBsYWJlbDogXCJUb3RhbFwiLFxuICAgICAgICBhbW91bnQ6IHRvdGFsQW1vdW50QXRvbSxcbiAgICAgICAgcGVuZGluZzogaXNBbW91bnRQZW5kaW5nXG4gICAgICB9LFxuICAgICAgcmVxdWVzdFBheWVyTmFtZTogdHJ1ZSxcbiAgICAgIHJlcXVlc3RQYXllckVtYWlsOiB0cnVlLFxuICAgICAgZGlzYWJsZVdhbGxldHM6IFtdIFxuICAgIH0pO1xuICAgIHJldHVybiBwYXltZW50UmVxdWVzdDtcbiAgfTtcbiAgY29uc3Qgc2xlZXAgPSAodGltZW91dE1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIHRpbWVvdXRNcyk7XG4gICAgfSk7XG4gIH07XG4gIGNvbnN0IGlzU3RyaXBlSnNQcmVzZW50ID0gKCkgPT4ge1xuICAgIHJldHVybiBcIlN0cmlwZVwiIGluIHdpbmRvdztcbiAgfTtcbiAgY29uc3Qgd2FpdEZvclVzZXJUb0FkZFBheW1lbnRNZXRob2QgPSBhc3luYyAocGF5bWVudFJlcXVlc3QpID0+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcGF5bWVudFJlcXVlc3Qub24oXCJwYXltZW50bWV0aG9kXCIsIGFzeW5jIChldnQpID0+IHtcbiAgICAgICAgICByZXNvbHZlKGV2dCk7XG4gICAgICAgIH0pO1xuICAgICAgICBwYXltZW50UmVxdWVzdC5vbihcImNhbmNlbFwiLCAoKSA9PiB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgUGF5bWVudCBjYW5jZWxsZWQsIHBsZWFzZSBjbGljayBTdWJtaXQgYWdhaW4gdG8gcGF5YCkpO1xuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuICBjb25zdCBjb25maXJtU3RyaXBlUHJQTSA9IGFzeW5jIChuZXh0QWN0aW9uTWV0YWRhdGEsIHN0cmlwZVBtKSA9PiB7XG4gICAgaWYgKCFuZXh0QWN0aW9uTWV0YWRhdGEuc3RyaXBlX3BrIHx8ICFuZXh0QWN0aW9uTWV0YWRhdGEuY2xpZW50X3NlY3JldCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG5leHQgYWN0aW9uIG1ldGFkYXRhIGZvcm1hdDogJHtKU09OLnN0cmluZ2lmeShuZXh0QWN0aW9uTWV0YWRhdGEpfWApO1xuICAgIH1cbiAgICBjb25zdCBzdHJpcGUgPSBhd2FpdCBnZXRMb2FkZWRTdHJpcGUobmV4dEFjdGlvbk1ldGFkYXRhLnN0cmlwZV9wayk7XG4gICAgY29uc3QgY29uZmlybVJlc3VsdCA9IGF3YWl0IHN0cmlwZS5jb25maXJtQ2FyZFNldHVwKG5leHRBY3Rpb25NZXRhZGF0YS5jbGllbnRfc2VjcmV0LCB7XG4gICAgICBwYXltZW50X21ldGhvZDogc3RyaXBlUG0ucGF5bWVudE1ldGhvZC5pZFxuICAgIH0pO1xuICAgIGlmIChjb25maXJtUmVzdWx0LmVycm9yKSB7XG4gICAgICBzdHJpcGVQbS5jb21wbGV0ZShcImZhaWxcIik7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFBheW1lbnQgZmFpbGVkOiAke2NvbmZpcm1SZXN1bHQuZXJyb3IubWVzc2FnZSA/PyBgdW5rbm93bmB9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0cmlwZVBtLmNvbXBsZXRlKFwic3VjY2Vzc1wiKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbmZpcm1SZXN1bHQ7XG4gIH07XG4gIGNvbnN0IGxhdW5jaFN0cmlwZTNEU0RpYWxvZ0Zsb3cgPSBhc3luYyAobmV4dEFjdGlvbk1ldGFkYXRhKSA9PiB7XG4gICAgY29uc3Qgc3RyaXBlID0gYXdhaXQgZ2V0TG9hZGVkU3RyaXBlKG5leHRBY3Rpb25NZXRhZGF0YS5zdHJpcGVfcGspO1xuICAgIGNvbnN0IGNvbmZpcm1SZXN1bHQgPSBhd2FpdCBzdHJpcGUuY29uZmlybUNhcmRTZXR1cChuZXh0QWN0aW9uTWV0YWRhdGEuY2xpZW50X3NlY3JldCwge1xuICAgICAgcGF5bWVudF9tZXRob2Q6IG5leHRBY3Rpb25NZXRhZGF0YS5zdHJpcGVfcG1faWRcbiAgICB9KTtcbiAgICBjb25zdCByZXN1bHRTdGF0dXMgPSBjb25maXJtUmVzdWx0LnNldHVwSW50ZW50Py5zdGF0dXM7XG4gICAgaWYgKHJlc3VsdFN0YXR1cyA9PT0gXCJzdWNjZWVkZWRcIikge1xuICAgICAgY29uc29sZS5sb2coXCJbM0RTXSBDT05GSVJNSU5HIFBNOlwiLCBuZXh0QWN0aW9uTWV0YWRhdGEuc3RyaXBlX3BtX2lkKTtcbiAgICAgIGNvbnNvbGUubG9nKFwiWzNEU10gU2V0dXAgaW50ZW50IGNyZWF0ZWQ6XCIsIGNvbmZpcm1SZXN1bHQuc2V0dXBJbnRlbnQpO1xuICAgIH0gZWxzZSBpZiAocmVzdWx0U3RhdHVzID09PSBcImNhbmNlbGVkXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUGF5bWVudCBjYW5jZWxsZWQsIHBsZWFzZSBjbGljayBTdWJtaXQgYWdhaW4gdG8gcGF5YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYCR7Y29uZmlybVJlc3VsdC5lcnJvcj8ubWVzc2FnZSA/PyBjb25maXJtUmVzdWx0LnNldHVwSW50ZW50Py5sYXN0X3NldHVwX2Vycm9yPy5tZXNzYWdlID8/IFwiUGF5bWVudCBmYWlsZWQsIHBsZWFzZSBjbGljayBzdWJtaXQgYWdhaW4gdG8gcGF5LlwifWBcbiAgICAgICk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGNvbnZlcnRTdHlsZXNUb1F1ZXJ5U3RyaW5nID0gKHN0eWxlcykgPT4ge1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRTdHlsZXMgPSBKU09OLnN0cmluZ2lmeShzdHlsZXMpO1xuICAgIHJldHVybiBzZXJpYWxpemVkU3R5bGVzO1xuICB9O1xuXG4gIGNvbnN0IGNyZWF0ZUlucHV0c0RpY3RGcm9tRm9ybSA9IChmb3JtRGl2LCBpbml0aWFsRGljdCkgPT4ge1xuICAgIGNvbnN0IGluY2x1ZGVkSW5wdXRzID0gQXJyYXkuZnJvbShmb3JtRGl2LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbZGF0YS1vcGlkXVwiKSA/PyBbXSk7XG4gICAgY29uc3QgZXh0cmFEYXRhID0gaW5jbHVkZWRJbnB1dHMucmVkdWNlKChhY2MsIGlucHV0KSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBpbnB1dC5nZXRBdHRyaWJ1dGUoXCJkYXRhLW9waWRcIik7XG4gICAgICBpZiAoIWtleSkgcmV0dXJuIGFjYztcbiAgICAgIHJldHVybiB7IC4uLmFjYywgW2tleV06IGlucHV0LnZhbHVlIH07XG4gICAgfSwge30pO1xuICAgIHJldHVybiBleHRyYURhdGE7XG4gIH07XG4gIGNvbnN0IHBhcnNlRXZlbnRQYXlsb2FkID0gKGV2ZW50RGF0YSkgPT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gRWxlbWVudEV2ZW50LnBhcnNlKGV2ZW50RGF0YSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBwYXJzaW5nIGV2ZW50IHBheWxvYWQ6XCIsIGV2ZW50RGF0YSwgZXJyb3IpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9O1xuICBjb25zdCBlbWl0RXZlbnQgPSAodGFyZ2V0LCBmb3JtSWQsIGVsZW1lbnRJZCwgcGF5bG9hZCwgYmFzZVVybCkgPT4ge1xuICAgIGNvbnN0IGV2ZW50ID0ge1xuICAgICAgcGF5bG9hZCxcbiAgICAgIG5vbmNlOiB1dWlkLnY0KCksXG4gICAgICBmb3JtSWQsXG4gICAgICBlbGVtZW50SWRcbiAgICB9O1xuICAgIGNvbnNvbGUubG9nKGBbZm9ybSAke2Zvcm1JZH1dIFNlbmRpbmcgZXZlbnQgdG8gY2hpbGQgJHtlbGVtZW50SWR9OmAsIGV2ZW50KTtcbiAgICB0YXJnZXQucG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoZXZlbnQpLCBiYXNlVXJsKTtcbiAgfTtcblxuICBjb25zdCBjaGVja0lmVmFsaWRDZGVDb25uZWN0aW9uT2JqZWN0ID0gYXN5bmMgKG9iaikgPT4ge1xuICAgIGlmICh0eXBlb2Ygb2JqICE9PSBcIm9iamVjdFwiIHx8ICFvYmopIHJldHVybiBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGluZyA9IHsgdHlwZTogXCJwaW5nXCIgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG9iai5zZW5kKHBpbmcpO1xuICAgICAgaWYgKHJlc3VsdCAhPT0gdHJ1ZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICd0cnVlJyBhZnRlciBwaW5nLCBnb3QgJHtKU09OLnN0cmluZ2lmeShyZXN1bHQpfWApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcihgSW52YWxpZCBDREUgY29ubmVjdGlvbiBjaGVjazpgLCBlKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IGlzUmVzdWx0VmFsaWQgPSAob2JqLCBpc1ZhbGlkKSA9PiB7XG4gICAgcmV0dXJuICEhb2JqICYmIGlzVmFsaWQ7XG4gIH07XG5cbiAgY29uc3QgbnVsbE9yVW5kZWZPciA9ICh6VHlwZSkgPT4gem9kLnoubnVsbGFibGUoelR5cGUub3B0aW9uYWwoKSk7XG4gIHpvZC56LnN0cmluZygpLnRyaW0oKS5taW4oMSwgeyBtZXNzYWdlOiBgQ2Fubm90IGJlIGJsYW5rYCB9KTtcbiAgY29uc3QgQ0RFUmVzcG9uc2VFcnJvciA9IHpvZC56Lm9iamVjdCh7XG4gICAgY2RlX3Jlc3BvbnNlX3R5cGU6IHpvZC56LmxpdGVyYWwoXCJlcnJvclwiKSxcbiAgICBtZXNzYWdlOiB6b2Quei5zdHJpbmcoKSxcbiAgICBoZWFkZXJzOiB6b2Quei5yZWNvcmQoem9kLnouc3RyaW5nKCksIHpvZC56LnN0cmluZygpKS5vcHRpb25hbCgpXG4gIH0pO1xuICB6b2Quei5lbnVtKFtcInVzZFwiLCBcImJybFwiXSk7XG4gIGNvbnN0IENvdXBvbk1pbmltYWwgPSB6b2Quei5vYmplY3Qoe1xuICAgIG5hbWU6IHpvZC56LnN0cmluZygpLFxuICAgIGFtb3VudF9hdG9tX29mZjogbnVsbE9yVW5kZWZPcih6b2Quei5udW1iZXIoKSksXG4gICAgcGVyY2VudF9vZmY6IG51bGxPclVuZGVmT3Ioem9kLnoubnVtYmVyKCkpLFxuICAgIGN1cnJlbmN5OiBudWxsT3JVbmRlZk9yKHpvZC56LnN0cmluZygpKSxcbiAgICBkdXJhdGlvbjogem9kLnouc3RyaW5nKCksXG4gICAgZHVyYXRpb25faW5fbW9udGhzOiBudWxsT3JVbmRlZk9yKHpvZC56Lm51bWJlcigpKVxuICB9KTtcbiAgY29uc3QgTGluZUl0ZW0gPSB6b2Quei5vYmplY3Qoe1xuICAgIGFtb3VudF9zdWJ0b3RhbF9hdG9tOiB6b2Quei5udW1iZXIoKS5pbnQoKSxcbiAgICBhbW91bnRfdG90YWxfYXRvbTogem9kLnoubnVtYmVyKCkuaW50KCksXG4gICAgY3VycmVuY3k6IHpvZC56LnN0cmluZygpLFxuICAgIGRlc2NyaXB0aW9uOiBudWxsT3JVbmRlZk9yKHpvZC56LnN0cmluZygpKSxcbiAgICBwcmljZV9pZDogem9kLnouc3RyaW5nKCksXG4gICAgYmlsbGluZ19pbnRlcnZhbDogbnVsbE9yVW5kZWZPcih6b2Quei5zdHJpbmcoKSksXG4gICAgYmlsbGluZ19pbnRlcnZhbF9jb3VudDogbnVsbE9yVW5kZWZPcih6b2Quei5udW1iZXIoKS5pbnQoKSksXG4gICAgcXVhbnRpdHk6IHpvZC56Lm51bWJlcigpLmludCgpXG4gIH0pO1xuICBjb25zdCBCcmFuZFNldHRpbmdzID0gem9kLnoucmVjb3JkKHpvZC56LnN0cmluZygpLCB6b2Quei5hbnkoKSk7XG4gIGNvbnN0IEJyYW5kID0gem9kLnoub2JqZWN0KHtcbiAgICBuYW1lOiB6b2Quei5zdHJpbmcoKSxcbiAgICBzZXR0aW5nczogbnVsbE9yVW5kZWZPcihCcmFuZFNldHRpbmdzKVxuICB9KTtcbiAgY29uc3QgQ2hlY2tvdXRQYXltZW50TWV0aG9kID0gem9kLnoub2JqZWN0KHtcbiAgICBwcm92aWRlcjogem9kLnouc3RyaW5nKCksXG4gICAgcHJvY2Vzc29yX25hbWU6IG51bGxPclVuZGVmT3Ioem9kLnouc3RyaW5nKCkpLFxuICAgIG1ldGFkYXRhOiBudWxsT3JVbmRlZk9yKHpvZC56LnJlY29yZCh6b2Quei5zdHJpbmcoKSwgem9kLnouYW55KCkpKVxuICB9KTtcbiAgY29uc3QgU3Vic2NyaXB0aW9uSXRlbU1pbmltYWwgPSB6b2Quei5vYmplY3Qoe1xuICAgIHF1YW50aXR5OiB6b2Quei5udW1iZXIoKVxuICB9KTtcbiAgY29uc3QgU3Vic2NyaXB0aW9uTWluaW1hbCA9IHpvZC56Lm9iamVjdCh7XG4gICAgaWQ6IG51bGxPclVuZGVmT3Ioem9kLnouc3RyaW5nKCkpLFxuICAgIGJpbGxpbmdfaW50ZXJ2YWw6IG51bGxPclVuZGVmT3Ioem9kLnouc3RyaW5nKCkpLFxuICAgIGJpbGxpbmdfaW50ZXJ2YWxfY291bnQ6IG51bGxPclVuZGVmT3Ioem9kLnoubnVtYmVyKCkuaW50KCkpLFxuICAgIHN1YnNjcmlwdGlvbl9pdGVtczogem9kLnouYXJyYXkoU3Vic2NyaXB0aW9uSXRlbU1pbmltYWwpLFxuICAgIHRyaWFsX3N0YXJ0OiBudWxsT3JVbmRlZk9yKHpvZC56LnN0cmluZygpKSxcbiAgICB0cmlhbF9lbmQ6IG51bGxPclVuZGVmT3Ioem9kLnouc3RyaW5nKCkpXG4gIH0pO1xuICBjb25zdCBJbnZvaWNlSXRlbURpc2NvdW50QW1vdW50c01pbmltYWwgPSB6b2Quei5vYmplY3Qoe1xuICAgIGFtb3VudF9hdG9tOiB6b2Quei5udW1iZXIoKVxuICB9KTtcbiAgY29uc3QgSW52b2ljZUxpbmVJdGVtTWluaW1hbCA9IHpvZC56Lm9iamVjdCh7XG4gICAgYW1vdW50X2F0b206IHpvZC56Lm51bWJlcigpLFxuICAgIGFtb3VudF9hdG9tX2NvbnNpZGVyaW5nX2Rpc2NvdW50X2FwcGxpZWQ6IHpvZC56Lm51bWJlcigpLFxuICAgIGN1cnJlbmN5OiB6b2Quei5zdHJpbmcoKSxcbiAgICBkaXNjb3VudF9hbW91bnRfYXRvbXM6IHpvZC56LmFycmF5KEludm9pY2VJdGVtRGlzY291bnRBbW91bnRzTWluaW1hbCksXG4gICAgc3Vic2NyaXB0aW9uX2l0ZW1faWQ6IHpvZC56LnN0cmluZygpXG4gIH0pO1xuICBjb25zdCBEaXNjb3VudE1pbmltYWwgPSB6b2Quei5vYmplY3Qoe1xuICAgIGNvdXBvbjogQ291cG9uTWluaW1hbFxuICB9KTtcbiAgY29uc3QgSW52b2ljZU1pbmltYWwgPSB6b2Quei5vYmplY3Qoe1xuICAgIGN1cnJlbmN5OiB6b2Quei5zdHJpbmcoKSxcbiAgICBkaXNjb3VudHM6IHpvZC56LmFycmF5KERpc2NvdW50TWluaW1hbCksXG4gICAgaG9zdGVkX2ludm9pY2VfdXJsOiBudWxsT3JVbmRlZk9yKHpvZC56LnN0cmluZygpKSxcbiAgICBsaW5lczogem9kLnouYXJyYXkoSW52b2ljZUxpbmVJdGVtTWluaW1hbCksXG4gICAgcmVtYWluaW5nX2Ftb3VudF9hdG9tOiB6b2Quei5udW1iZXIoKSxcbiAgICB0YXhfYW1vdW50X2F0b206IHpvZC56Lm51bWJlcigpLFxuICAgIHRvdGFsX2Ftb3VudF9hdG9tOiB6b2Quei5udW1iZXIoKSxcbiAgICB0b3RhbF9kaXNjb3VudF9hbW91bnRfYXRvbXM6IHpvZC56LmFycmF5KEludm9pY2VJdGVtRGlzY291bnRBbW91bnRzTWluaW1hbClcbiAgfSk7XG4gIGNvbnN0IENyZWF0ZVN1YnNjcmlwdGlvblJlc3BvbnNlTWluaW1hbCA9IHpvZC56Lm9iamVjdCh7XG4gICAgY3JlYXRlZDogem9kLnouYXJyYXkoU3Vic2NyaXB0aW9uTWluaW1hbCksXG4gICAgaW52b2ljZXM6IHpvZC56LmFycmF5KEludm9pY2VNaW5pbWFsKVxuICB9KTtcbiAgY29uc3QgUHJldmlld0NoZWNrb3V0UmVzcG9uc2UgPSB6b2Quei5vYmplY3Qoe1xuICAgIHByZXZpZXc6IENyZWF0ZVN1YnNjcmlwdGlvblJlc3BvbnNlTWluaW1hbCxcbiAgICBwcmV2aWV3X3Bvc3RfdHJpYWw6IG51bGxPclVuZGVmT3IoQ3JlYXRlU3Vic2NyaXB0aW9uUmVzcG9uc2VNaW5pbWFsKSxcbiAgICBjb3Vwb25zOiB6b2Quei5hcnJheShDb3Vwb25NaW5pbWFsKVxuICB9KTtcbiAgY29uc3QgX1BheW1lbnRGb3JtUHJlZmlsbENvbW1vbiA9IHpvZC56Lm9iamVjdCh7XG4gICAgc3RhdHVzOiB6b2Quei5saXRlcmFsKFwib3BlblwiKSxcbiAgICB0b2tlbjogem9kLnouc3RyaW5nKCksXG4gICAgZW1haWw6IG51bGxPclVuZGVmT3Ioem9kLnouc3RyaW5nKCkpLFxuICAgIGxpbmVfaXRlbXM6IHpvZC56LmFycmF5KExpbmVJdGVtKSxcbiAgICBhbW91bnRfc3VidG90YWxfYXRvbTogem9kLnoubnVtYmVyKCkuaW50KCksXG4gICAgYW1vdW50X3RvdGFsX2F0b206IHpvZC56Lm51bWJlcigpLmludCgpLFxuICAgIGJyYW5kOiBCcmFuZCxcbiAgICBzdWJzX3ByZXZpZXc6IG51bGxPclVuZGVmT3IoUHJldmlld0NoZWNrb3V0UmVzcG9uc2UpLFxuICAgIC8vIE51bGwgaW4gc2V0dXAgbW9kZVxuICAgIG1ldGhvZHNfYXZhaWxhYmxlOiB6b2Quei5hcnJheShDaGVja291dFBheW1lbnRNZXRob2QpXG4gIH0pO1xuICBjb25zdCBQYXltZW50Rm9ybVByZWZpbGwgPSB6b2Quei5kaXNjcmltaW5hdGVkVW5pb24oXCJtb2RlXCIsIFtcbiAgICB6b2Quei5vYmplY3Qoe1xuICAgICAgbW9kZTogem9kLnoubGl0ZXJhbChcInNldHVwXCIpLFxuICAgICAgY3VycmVuY3k6IHpvZC56Lm51bGxhYmxlKHpvZC56LnVuZGVmaW5lZCgpKVxuICAgIH0pLmV4dGVuZChfUGF5bWVudEZvcm1QcmVmaWxsQ29tbW9uLnNoYXBlKSxcbiAgICB6b2Quei5vYmplY3Qoe1xuICAgICAgbW9kZTogem9kLnouZW51bShbXCJwYXltZW50XCIsIFwic3Vic2NyaXB0aW9uXCJdKSxcbiAgICAgIGN1cnJlbmN5OiB6b2Quei5zdHJpbmcoKVxuICAgIH0pLmV4dGVuZChfUGF5bWVudEZvcm1QcmVmaWxsQ29tbW9uLnNoYXBlKVxuICBdKTtcbiAgY29uc3QgQ29tcGxldGVkRm9ybVByZWZpbGwgPSB6b2Quei5vYmplY3Qoe1xuICAgIHN0YXR1czogem9kLnoubGl0ZXJhbChcImNvbXBsZXRlXCIpXG4gIH0pO1xuICBjb25zdCBFeHBpcmVkRm9ybVByZWZpbGwgPSB6b2Quei5vYmplY3Qoe1xuICAgIHN0YXR1czogem9kLnoubGl0ZXJhbChcImV4cGlyZWRcIilcbiAgfSk7XG4gIHpvZC56LnVuaW9uKFtQYXltZW50Rm9ybVByZWZpbGwsIENvbXBsZXRlZEZvcm1QcmVmaWxsLCBFeHBpcmVkRm9ybVByZWZpbGxdKTtcbiAgem9kLnoub2JqZWN0KHtcbiAgICBsb2dvOiB6b2Quei5zdHJpbmcoKSxcbiAgICBpY29uOiB6b2Quei5zdHJpbmcoKSxcbiAgICBwcmltYXJ5X2NvbG9yOiB6b2Quei5zdHJpbmcoKSxcbiAgICBzZWNvbmRhcnlfY29sb3I6IHpvZC56LnN0cmluZygpXG4gIH0pO1xuICBjb25zdCBDaGVja291dFN1Y2Nlc3NSZXNwb25zZSA9IHpvZC56Lm9iamVjdCh7XG4gICAgaW52b2ljZV91cmxzOiB6b2Quei5hcnJheSh6b2Quei5zdHJpbmcoKSksXG4gICAgc3Vic2NyaXB0aW9uX2lkczogem9kLnouYXJyYXkoem9kLnouc3RyaW5nKCkpLFxuICAgIGN1c3RvbWVyX2lkOiB6b2Quei5zdHJpbmcoKVxuICB9KTtcbiAgem9kLnoub2JqZWN0KHtcbiAgICBzZWN1cmVfdG9rZW46IHpvZC56LnN0cmluZygpLFxuICAgIHBheW1lbnRfaW5wdXQ6IHpvZC56LmFueSgpLFxuICAgIC8vIFNob3VsZCBmb2xsb3cgQW55UGF5bWVudElucHV0IGZyb20gQ0RFXG4gICAgY3VzdG9tZXJfZW1haWw6IHpvZC56LnN0cmluZygpLFxuICAgIGN1c3RvbWVyX3ppcF9jb2RlOiB6b2Quei5zdHJpbmcoKSxcbiAgICBjdXN0b21lcl9jb3VudHJ5OiB6b2Quei5zdHJpbmcoKSxcbiAgICBsaW5lX2l0ZW1zOiB6b2Quei5hcnJheShMaW5lSXRlbSksXG4gICAgdG90YWxfYW1vdW50X2F0b206IHpvZC56Lm51bWJlcigpLmludCgpLFxuICAgIGNhbmNlbF9hdF9lbmQ6IHpvZC56LmJvb2xlYW4oKSxcbiAgICBjaGVja291dF9wYXltZW50X21ldGhvZDogQ2hlY2tvdXRQYXltZW50TWV0aG9kLFxuICAgIHByb21vdGlvbl9jb2RlOiB6b2Quei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIGRvX25vdF91c2VfbGVnYWN5X2NjX2Zsb3c6IHpvZC56LmJvb2xlYW4oKS5vcHRpb25hbCgpXG4gIH0pO1xuICBjb25zdCBTZXR1cENoZWNrb3V0UmVzcG9uc2UgPSB6b2Quei5vYmplY3Qoe1xuICAgIHBheW1lbnRfbWV0aG9kX2lkOiB6b2Quei5zdHJpbmcoKVxuICB9KTtcbiAgem9kLnoub2JqZWN0KHtcbiAgICBpZDogem9kLnouc3RyaW5nKCksXG4gICAgcmV0dXJuX3VybDogem9kLnouc3RyaW5nKClcbiAgfSk7XG4gIGNvbnN0IFB5ZGFudGljVmFsaWRhdGlvbkVycm9yID0gem9kLnoub2JqZWN0KHtcbiAgICB0eXBlOiB6b2Quei5zdHJpbmcoKSxcbiAgICBsb2M6IHpvZC56LmFycmF5KHpvZC56LnN0cmluZygpKSxcbiAgICBtc2c6IHpvZC56LnN0cmluZygpLFxuICAgIHVybDogem9kLnouc3RyaW5nKClcbiAgfSk7XG4gIHpvZC56LmFycmF5KFB5ZGFudGljVmFsaWRhdGlvbkVycm9yKTtcbiAgem9kLnoub2JqZWN0KHtcbiAgICBuZXdfY3VzdG9tZXJfZW1haWw6IHpvZC56LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgbmV3X2N1c3RvbWVyX2FkZHJlc3M6IHpvZC56LnJlY29yZCh6b2Quei5zdHJpbmcoKSwgem9kLnouYW55KCkpLm9wdGlvbmFsKCksXG4gICAgcGF5bWVudF9wcm92aWRlcjogem9kLnouc3RyaW5nKCksXG4gICAgY2hlY2tvdXRfcGF5bWVudF9tZXRob2Q6IENoZWNrb3V0UGF5bWVudE1ldGhvZCxcbiAgICBleGlzdGluZ19jY19wbV9pZDogem9kLnouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICB0aGVpcl9leGlzdGluZ19wbV9pZDogem9kLnouc3RyaW5nKCkub3B0aW9uYWwoKVxuICB9KTtcbiAgY29uc3QgU3RhcnRQYXltZW50Rmxvd1Jlc3BvbnNlID0gem9kLnoub2JqZWN0KHtcbiAgICByZXF1aXJlZF91c2VyX2FjdGlvbnM6IHpvZC56LmFycmF5KHpvZC56LnJlY29yZCh6b2Quei5zdHJpbmcoKSwgem9kLnouYW55KCkpKVxuICB9KTtcbiAgem9kLnoub2JqZWN0KHtcbiAgICBmaWVsZHM6IFBSRm9ybUZpZWxkcyxcbiAgICBjaGVja291dFBheW1lbnRNZXRob2Q6IENoZWNrb3V0UGF5bWVudE1ldGhvZFxuICB9KTtcbiAgem9kLnoub2JqZWN0KHtcbiAgICBzZXNzaW9uX2lkOiB6b2Quei5zdHJpbmcoKSxcbiAgICBub25fY2RlX2Zvcm1fZmllbGRzOiBSZXF1aXJlZEZvcm1GaWVsZHMsXG4gICAgY2hlY2tvdXRfcGF5bWVudF9tZXRob2Q6IENoZWNrb3V0UGF5bWVudE1ldGhvZFxuICB9KTtcbiAgY29uc3QgU3RhcnRQYXltZW50Rmxvd0ZvckNDUmVzcG9uc2UgPSB6b2Quei5vYmplY3Qoe1xuICAgIHJlcXVpcmVkX3VzZXJfYWN0aW9uczogem9kLnouYXJyYXkoem9kLnoucmVjb3JkKHpvZC56LnN0cmluZygpLCB6b2Quei5hbnkoKSkpLFxuICAgIGNjX3BtX2lkOiB6b2Quei5zdHJpbmcoKVxuICB9KTtcbiAgem9kLnoucmVjb3JkKHpvZC56LmFueSgpKTtcblxuICBjb25zdCBzdW0gPSAoYXJyKSA9PiB7XG4gICAgcmV0dXJuIGFyci5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcbiAgfTtcblxuICBmdW5jdGlvbiBmaXhQcm90byh0YXJnZXQsIHByb3RvdHlwZSkge1xuICAgIHZhciBzZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZjtcbiAgICBzZXRQcm90b3R5cGVPZiA/IHNldFByb3RvdHlwZU9mKHRhcmdldCwgcHJvdG90eXBlKSA6IHRhcmdldC5fX3Byb3RvX18gPSBwcm90b3R5cGU7XG4gIH1cbiAgZnVuY3Rpb24gZml4U3RhY2sodGFyZ2V0LCBmbikge1xuICAgIGlmIChmbiA9PT0gdm9pZCAwKSB7XG4gICAgICBmbiA9IHRhcmdldC5jb25zdHJ1Y3RvcjtcbiAgICB9XG5cbiAgICB2YXIgY2FwdHVyZVN0YWNrVHJhY2UgPSBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZTtcbiAgICBjYXB0dXJlU3RhY2tUcmFjZSAmJiBjYXB0dXJlU3RhY2tUcmFjZSh0YXJnZXQsIGZuKTtcbiAgfVxuXG4gIHZhciBfX2V4dGVuZHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF9leHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gZXh0ZW5kU3RhdGljcyhkLCBiKSB7XG4gICAgICBfZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCB7XG4gICAgICAgIF9fcHJvdG9fXzogW11cbiAgICAgIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBkLl9fcHJvdG9fXyA9IGI7XG4gICAgICB9IHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGZvciAodmFyIHAgaW4gYikge1xuICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gX2V4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgfTtcblxuICAgIHJldHVybiBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbCkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xuXG4gICAgICBfZXh0ZW5kU3RhdGljcyhkLCBiKTtcblxuICAgICAgZnVuY3Rpb24gX18oKSB7XG4gICAgICAgIHRoaXMuY29uc3RydWN0b3IgPSBkO1xuICAgICAgfVxuXG4gICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gICAgfTtcbiAgfSgpO1xuXG4gIHZhciBDdXN0b21FcnJvciA9IGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQ3VzdG9tRXJyb3IsIF9zdXBlcik7XG5cbiAgICBmdW5jdGlvbiBDdXN0b21FcnJvcihtZXNzYWdlLCBvcHRpb25zKSB7XG4gICAgICB2YXIgX25ld1RhcmdldCA9IHRoaXMuY29uc3RydWN0b3I7XG5cbiAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1lc3NhZ2UsIG9wdGlvbnMpIHx8IHRoaXM7XG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfdGhpcywgJ25hbWUnLCB7XG4gICAgICAgIHZhbHVlOiBfbmV3VGFyZ2V0Lm5hbWUsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgZml4UHJvdG8oX3RoaXMsIF9uZXdUYXJnZXQucHJvdG90eXBlKTtcbiAgICAgIGZpeFN0YWNrKF90aGlzKTtcbiAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG5cbiAgICByZXR1cm4gQ3VzdG9tRXJyb3I7XG4gIH0oRXJyb3IpO1xuXG4gIGNsYXNzIENkZUVycm9yIGV4dGVuZHMgQ3VzdG9tRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKHJlc3BvbnNlKSB7XG4gICAgICBjb25zdCBmcmllbmRseU1lc3NhZ2UgPSBgW2NkZS1jbGllbnRdIEVycm9yIHF1ZXJ5aW5nIENERTogJHtyZXNwb25zZS5tZXNzYWdlfWA7XG4gICAgICBzdXBlcihmcmllbmRseU1lc3NhZ2UpO1xuICAgICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlO1xuICAgIH1cbiAgICBnZXQgb3JpZ2luYWxFcnJvck1lc3NhZ2UoKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXNwb25zZS5tZXNzYWdlO1xuICAgIH1cbiAgfVxuICBjb25zdCBxdWVyeUNERSA9IGFzeW5jIChjZGVDb25uLCBkYXRhLCByZXNwb25zZVNjaGVtYSkgPT4ge1xuICAgIGNvbnNvbGUubG9nKFwiW2NkZS1jbGllbnRdIFF1ZXJ5aW5nIENERSB3aXRoIHBhdGggYW5kIGNvbm5lY3Rpb246XCIsIGRhdGEudHlwZSwgY2RlQ29ubik7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjZGVDb25uLnNlbmQoZGF0YSk7XG4gICAgY29uc29sZS5sb2coXCJbY2RlLWNsaWVudF0gR290IHJlc3BvbnNlIGZyb20gQ0RFOlwiLCByZXNwb25zZSk7XG4gICAgaWYgKGlzQ0RFUmVzcG9uc2VFcnJvcihyZXNwb25zZSkpIHtcbiAgICAgIHRocm93IG5ldyBDZGVFcnJvcihyZXNwb25zZSk7XG4gICAgfVxuICAgIGlmICghY2hlY2tJZkNvbmZvcm1zVG9TY2hlbWEocmVzcG9uc2UsIHJlc3BvbnNlU2NoZW1hKSkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gcmVzcG9uc2VTY2hlbWEuc2FmZVBhcnNlKHJlc3BvbnNlKTtcbiAgICAgIGlmIChyZXN1bHQuc3VjY2VzcykgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBzdGF0ZVwiKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJPSlMgcXVlcnlBcGkgZ290IGEgc2NoZW1hIGVycm9yLiBFeHBlY3RlZCBzY2hlbWE6XCIsIHJlc3BvbnNlU2NoZW1hLCBcIkFjdHVhbDpcIiwgcmVzcG9uc2UpO1xuICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgIH1cbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH07XG4gIGNvbnN0IGNoZWNrSWZDb25mb3Jtc1RvU2NoZW1hID0gKHZhbHVlLCBzY2hlbWEpID0+IHtcbiAgICByZXR1cm4gc2NoZW1hLnNhZmVQYXJzZSh2YWx1ZSkuc3VjY2VzcztcbiAgfTtcbiAgY29uc3QgaXNDREVSZXNwb25zZUVycm9yID0gKHJlc3BvbnNlKSA9PiB7XG4gICAgcmV0dXJuIENERVJlc3BvbnNlRXJyb3Iuc2FmZVBhcnNlKHJlc3BvbnNlKS5zdWNjZXNzO1xuICB9O1xuICBjb25zdCBnZXRDaGVja291dFByZXZpZXcgPSBhc3luYyAoY2RlQ29ubiwgcmVxdWVzdCkgPT4ge1xuICAgIHJldHVybiBhd2FpdCBxdWVyeUNERShjZGVDb25uLCB7IHR5cGU6IFwiZ2V0X2NoZWNrb3V0X3ByZXZpZXdcIiwgcGF5bG9hZDogcmVxdWVzdCB9LCBQcmV2aWV3Q2hlY2tvdXRSZXNwb25zZSk7XG4gIH07XG4gIGNvbnN0IGdldFByZWZpbGwgPSBhc3luYyAoY2RlQ29ubikgPT4ge1xuICAgIHJldHVybiBhd2FpdCBxdWVyeUNERShjZGVDb25uLCB7IHR5cGU6IFwiZ2V0X3ByZWZpbGxcIiwgcGF5bG9hZDoge30gfSwgUGF5bWVudEZvcm1QcmVmaWxsKTtcbiAgfTtcbiAgY29uc3Qgc3RhcnRQYXltZW50RmxvdyA9IGFzeW5jIChjZGVDb25uLCBwYXlsb2FkKSA9PiB7XG4gICAgcmV0dXJuIGF3YWl0IHF1ZXJ5Q0RFKGNkZUNvbm4sIHsgdHlwZTogXCJ2Ml9zdGFydF9wYXltZW50X2Zsb3dcIiwgcGF5bG9hZCB9LCBTdGFydFBheW1lbnRGbG93UmVzcG9uc2UpO1xuICB9O1xuICBjb25zdCBzdGFydFBheW1lbnRGbG93Rm9yQ0MgPSBhc3luYyAoY2RlQ29ubiwgcGF5bG9hZCkgPT4ge1xuICAgIHJldHVybiBhd2FpdCBxdWVyeUNERShjZGVDb25uLCB7IHR5cGU6IFwic3RhcnRfcGF5bWVudF9mbG93X2Zvcl9jY1wiLCBwYXlsb2FkIH0sIFN0YXJ0UGF5bWVudEZsb3dGb3JDQ1Jlc3BvbnNlKTtcbiAgfTtcbiAgY29uc3Qgc3RhcnRQYXltZW50Rmxvd0ZvclBSID0gYXN5bmMgKGNkZUNvbm4sIHBheWxvYWQpID0+IHtcbiAgICByZXR1cm4gYXdhaXQgcXVlcnlDREUoY2RlQ29ubiwgeyB0eXBlOiBcInN0YXJ0X3BheW1lbnRfZmxvd19mb3JfcHJcIiwgcGF5bG9hZCB9LCBTdGFydFBheW1lbnRGbG93UmVzcG9uc2UpO1xuICB9O1xuICBjb25zdCBjb25maXJtUGF5bWVudEZsb3cgPSBhc3luYyAoY2RlQ29ubiwgcGF5bG9hZCkgPT4ge1xuICAgIHJldHVybiBhd2FpdCBxdWVyeUNERShjZGVDb25uLCB7IHR5cGU6IFwiY29uZmlybV9wYXltZW50X2Zsb3dcIiwgcGF5bG9hZCB9LCBDb25maXJtUGF5bWVudEZsb3dSZXNwb25zZSk7XG4gIH07XG4gIGNvbnN0IGdldENoZWNrb3V0VmFsdWUgPSBhc3luYyAoY2RlQ29ubiwgc2VjdXJlVG9rZW4sIHByb21vQ29kZSkgPT4ge1xuICAgIGNvbnN0IGNoZWNrb3V0UHJldmlldyA9IGF3YWl0IGdldENoZWNrb3V0UHJldmlldyhjZGVDb25uLCB7XG4gICAgICBzZWN1cmVfdG9rZW46IHNlY3VyZVRva2VuLFxuICAgICAgcHJvbW90aW9uX2NvZGU6IHByb21vQ29kZVxuICAgIH0pO1xuICAgIGNvbnN0IGN1cnJlbmNpZXMgPSBuZXcgU2V0KGNoZWNrb3V0UHJldmlldy5wcmV2aWV3Lmludm9pY2VzLm1hcCgoaW52KSA9PiBpbnYuY3VycmVuY3kpKTtcbiAgICBpZiAoY3VycmVuY2llcy5zaXplICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGV4YWN0bHkgb25lIGN1cnJlbmN5LCBnb3QgJHtjdXJyZW5jaWVzLnNpemV9YCk7XG4gICAgfVxuICAgIGNvbnN0IGN1cnJlbmN5ID0gY3VycmVuY2llcy52YWx1ZXMoKS5uZXh0KCkudmFsdWUgPz8gXCJ1c2RcIjtcbiAgICBjb25zdCBhbW91bnRBdG9tID0gc3VtKGNoZWNrb3V0UHJldmlldy5wcmV2aWV3Lmludm9pY2VzLm1hcCgoaW52KSA9PiBpbnYucmVtYWluaW5nX2Ftb3VudF9hdG9tKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGN1cnJlbmN5LFxuICAgICAgYW1vdW50QXRvbVxuICAgIH07XG4gIH07XG4gIGNvbnN0IGdldENoZWNrb3V0UHJldmlld0Ftb3VudCA9IGFzeW5jIChjZGVDb25uLCBzZWN1cmVUb2tlbiwgaXNTZXR1cE1vZGUsIHByb21vQ29kZSkgPT4ge1xuICAgIGlmIChpc1NldHVwTW9kZSkge1xuICAgICAgcmV0dXJuIHsgYW1vdW50QXRvbTogMCwgY3VycmVuY3k6IFwidXNkXCIgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvbW9Db2RlID0gIXByb21vQ29kZSA/IHZvaWQgMCA6IHByb21vQ29kZTtcbiAgICAgIGNvbnN0IGNoZWNrb3V0UHJldmlldyA9IGF3YWl0IGdldENoZWNrb3V0VmFsdWUoY2RlQ29ubiwgc2VjdXJlVG9rZW4sIHByb21vQ29kZSk7XG4gICAgICByZXR1cm4geyBhbW91bnRBdG9tOiBjaGVja291dFByZXZpZXcuYW1vdW50QXRvbSwgY3VycmVuY3k6IGNoZWNrb3V0UHJldmlldy5jdXJyZW5jeSB9O1xuICAgIH1cbiAgfTtcbiAgY29uc3QgdG9rZW5pemVDYXJkT25BbGxDb25uZWN0aW9ucyA9IGFzeW5jIChhbGxDZGVDb25uZWN0aW9ucywgcGF5bG9hZCkgPT4ge1xuICAgIGlmIChhbGxDZGVDb25uZWN0aW9ucy5zaXplID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBDREUgY29ubmVjdGlvbnMgZm91bmRcIik7XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgQXJyYXkuZnJvbShhbGxDZGVDb25uZWN0aW9ucy52YWx1ZXMoKSkubWFwKFxuICAgICAgICAoY2RlQ29ubikgPT4gcXVlcnlDREUoY2RlQ29ubiwgeyB0eXBlOiBcInRva2VuaXplX2NhcmRcIiwgcGF5bG9hZCB9LCBUb2tlbml6ZUNhcmRSZXNwb25zZSlcbiAgICAgIClcbiAgICApO1xuICAgIHJldHVybiByZXNwb25zZXM7XG4gIH07XG4gIGNvbnN0IGNoZWNrb3V0Q2FyZEVsZW1lbnRzID0gYXN5bmMgKGNkZUNvbm4sIHBheWxvYWQpID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHF1ZXJ5Q0RFKGNkZUNvbm4sIHsgdHlwZTogXCJjaGVja291dF9jYXJkX2VsZW1lbnRzXCIsIHBheWxvYWQgfSwgQ2hlY2tvdXRTdWNjZXNzUmVzcG9uc2UpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiW2NkZS1jbGllbnRdIEVycm9yIGR1cmluZyBjaGVja291dENhcmRFbGVtZW50czpcIiwgZXJyb3IsIEpTT04uc3RyaW5naWZ5KGVycm9yKSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHNldHVwQ2hlY2tvdXQgPSBhc3luYyAoY2RlQ29ubiwgcGF5bG9hZCkgPT4ge1xuICAgIHJldHVybiBhd2FpdCBxdWVyeUNERShjZGVDb25uLCB7IHR5cGU6IFwic2V0dXBfcGF5bWVudF9tZXRob2RcIiwgcGF5bG9hZCB9LCBTZXR1cENoZWNrb3V0UmVzcG9uc2UpO1xuICB9O1xuICBjb25zdCBwZXJmb3JtQ2hlY2tvdXQgPSBhc3luYyAoY2RlQ29ubiwgcGF5bG9hZCkgPT4ge1xuICAgIHJldHVybiBhd2FpdCBxdWVyeUNERShjZGVDb25uLCB7IHR5cGU6IFwiY2hlY2tvdXRcIiwgcGF5bG9hZCB9LCBDaGVja291dFN1Y2Nlc3NSZXNwb25zZSk7XG4gIH07XG4gIGNvbnN0IENERV9QT0xMSU5HX0lOVEVSVkFMID0gMWUzO1xuICBjb25zdCBwaW5nQ2RlRm9yM2RzU3RhdHVzID0gYXN5bmMgKGlmcmFtZSwgY2hpbGRPcmlnaW4pID0+IHtcbiAgICBjb25zb2xlLmxvZyhjaGlsZE9yaWdpbik7XG4gICAgY29uc3QgY29ubmVjdGlvbiA9IHBlbnBhbC5jb25uZWN0VG9DaGlsZCh7XG4gICAgICBpZnJhbWUsXG4gICAgICBkZWJ1ZzogdHJ1ZSxcbiAgICAgIHRpbWVvdXQ6IENERV9QT0xMSU5HX0lOVEVSVkFMLFxuICAgICAgY2hpbGRPcmlnaW46IFwiKlwiXG4gICAgICAvLyBUT0RPOiB1c2Ugd2l0aCBwcm9wZXIgY2hpbGRPcmlnaW5cbiAgICB9KTtcbiAgICBjb25zdCBjb25uZWN0aW9uT2JqID0gYXdhaXQgY29ubmVjdGlvbi5wcm9taXNlO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHF1ZXJ5Q0RFKGNvbm5lY3Rpb25PYmosIHsgdHlwZTogXCJwaW5nLTNkcy1zdGF0dXNcIiB9LCBQaW5nM0RTU3RhdHVzUmVzcG9uc2UpO1xuICAgIHJldHVybiByZXN1bHQuc3RhdHVzO1xuICB9O1xuXG4gIGNvbnN0IGFkZEJhc2ljQ2hlY2tvdXRDYWxsYmFja0hhbmRsZXJzID0gKHNpbXBsZU9qc0Zsb3cpID0+IHtcbiAgICByZXR1cm4gYXN5bmMgKHBhcmFtcykgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcGFyYW1zLmZsb3dDYWxsYmFja3Mub25DaGVja291dFN0YXJ0ZWQoKTtcbiAgICAgICAgY29uc3QgZmxvd1Jlc3VsdCA9IGF3YWl0IHNpbXBsZU9qc0Zsb3cocGFyYW1zKTtcbiAgICAgICAgaWYgKGZsb3dSZXN1bHQubW9kZSA9PT0gXCJzZXR1cFwiKSB7XG4gICAgICAgICAgcGFyYW1zLmZsb3dDYWxsYmFja3Mub25TZXR1cFBheW1lbnRNZXRob2RTdWNjZXNzKGZsb3dSZXN1bHQucmVzdWx0LnBheW1lbnRfbWV0aG9kX2lkKTtcbiAgICAgICAgfSBlbHNlIGlmIChmbG93UmVzdWx0Lm1vZGUgPT09IFwiY2hlY2tvdXRcIikge1xuICAgICAgICAgIHBhcmFtcy5mbG93Q2FsbGJhY2tzLm9uQ2hlY2tvdXRTdWNjZXNzKFxuICAgICAgICAgICAgZmxvd1Jlc3VsdC5yZXN1bHQuaW52b2ljZV91cmxzLFxuICAgICAgICAgICAgZmxvd1Jlc3VsdC5yZXN1bHQuc3Vic2NyaXB0aW9uX2lkcyxcbiAgICAgICAgICAgIGZsb3dSZXN1bHQucmVzdWx0LmN1c3RvbWVyX2lkXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuaGFuZGxlZCBtb2RlOiAke2Zsb3dSZXN1bHR9YCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHBhcmFtcy5mbG93Q2FsbGJhY2tzLm9uQ2hlY2tvdXRFcnJvcihnZXRFcnJvck1lc3NhZ2UoZXJyb3IpKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcbiAgY29uc3QgYWRkRXJyb3JDYXRjaGVyRm9ySW5pdCA9IChpbml0KSA9PiB7XG4gICAgcmV0dXJuIGFzeW5jIChwYXJhbXMpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBpbml0KHBhcmFtcyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCB7IGVycl9fIH0gPSBjcmVhdGVPanNGbG93TG9nZ2VycyhcImluaXQtZXJyb3ItY2F0Y2hlclwiKTtcbiAgICAgICAgZXJyX18oZXJyb3IpO1xuICAgICAgICByZXR1cm4geyBpc0F2YWlsYWJsZTogZmFsc2UsIHJlYXNvbjogZ2V0RXJyb3JNZXNzYWdlKGVycm9yKSB9O1xuICAgICAgfVxuICAgIH07XG4gIH07XG4gIGNvbnN0IGNyZWF0ZU9qc0Zsb3dMb2dnZXJzID0gKHByZWZpeCkgPT4ge1xuICAgIGNvbnN0IGxvZyA9ICguLi5hcmdzKSA9PiB7XG4gICAgICB3aW5kb3dbXCJjb25zb2xlXCJdLmxvZyhgJHtjaGFsay5ncmVlbi5ib2xkKFwib2pzL1wiKX0ke2NoYWxrLmJvbGQuZ3JheShgJHtwcmVmaXh9YCl9XHRgLCAuLi5hcmdzKTtcbiAgICB9O1xuICAgIGNvbnN0IGVyciA9ICguLi5hcmdzKSA9PiB7XG4gICAgICB3aW5kb3dbXCJjb25zb2xlXCJdLmVycm9yKGAke2NoYWxrLnJlZC5ib2xkKFwib2pzL1wiKX0ke2NoYWxrLmJvbGQuZ3JheShgJHtwcmVmaXh9YCl9XHRgLCAuLi5hcmdzKTtcbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICBsb2csXG4gICAgICBlcnIsXG4gICAgICBsb2dfXzogbG9nLFxuICAgICAgZXJyX186IGVyclxuICAgIH07XG4gIH07XG5cbiAgY29uc3QgeyBsb2dfXzogbG9nX18kNSwgZXJyX186IGVycl9fJDUgfSA9IGNyZWF0ZU9qc0Zsb3dMb2dnZXJzKFwiY29tbW9uXCIpO1xuICBjb25zdCBwYXJzZUNvbmZpcm1QYXltZW50Rmxvd1Jlc3BvbnNlID0gKHJlc3BvbnNlKSA9PiB7XG4gICAgaWYgKHJlc3BvbnNlLnBheW1lbnRfbWV0aG9kcy5sZW5ndGggIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgZXhhY3RseSBvbmUgcGF5bWVudCBtZXRob2QsIGdvdCAke3Jlc3BvbnNlLnBheW1lbnRfbWV0aG9kcy5sZW5ndGh9YCk7XG4gICAgfVxuICAgIHJldHVybiB7IHBheW1lbnRfbWV0aG9kX2lkOiByZXNwb25zZS5wYXltZW50X21ldGhvZHNbMF0uaWQgfTtcbiAgfTtcbiAgY29uc3QgZmluZENwbU1hdGNoaW5nVHlwZSA9IChhbGxDUE1zLCB6b2RNb2RlbCkgPT4ge1xuICAgIGNvbnN0IGNwbSA9IGFsbENQTXMuZmluZCgoY3BtMikgPT4gem9kTW9kZWwuc2FmZVBhcnNlKGNwbTIpLnN1Y2Nlc3MpO1xuICAgIGlmICghY3BtKSB7XG4gICAgICBlcnJfXyQ1KGBObyBDUE1zIGZvdW5kIGZvciBtb2RlbC4gQWxsIG1vZGVsczpgLCBhbGxDUE1zKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gQ1BNcyBmb3VuZCBmb3IgbW9kZWxgKTtcbiAgICB9XG4gICAgcmV0dXJuIHpvZE1vZGVsLnBhcnNlKGNwbSk7XG4gIH07XG5cbiAgY29uc3QgeyBsb2dfXzogbG9nX18kNCwgZXJyX186IGVycl9fJDQgfSA9IGNyZWF0ZU9qc0Zsb3dMb2dnZXJzKFwiY29tbW9uLWNjXCIpO1xuICBjb25zdCB2YWxpZGF0ZU5vbkNkZUZvcm1GaWVsZHNGb3JDQyA9IChub25DZGVGb3JtSW5wdXRzLCBvblZhbGlkYXRpb25FcnJvcikgPT4ge1xuICAgIGNvbnN0IHBheWxvYWQgPSBSZXF1aXJlZEZvcm1GaWVsZHMuc2FmZVBhcnNlKG5vbkNkZUZvcm1JbnB1dHMpO1xuICAgIGlmICghcGF5bG9hZC5zdWNjZXNzKSB7XG4gICAgICBjb25zdCBmb3JtYXR0ZWQgPSBwYXlsb2FkLmVycm9yLmZvcm1hdCgpO1xuICAgICAgY29uc3QgaXNzdWVzID0gZXh0cmFjdElzc3Vlc1BlckZpZWxkKGZvcm1hdHRlZCk7XG4gICAgICBmb3IgKGNvbnN0IFtmaWVsZE5hbWUsIGVycm9yc10gb2YgT2JqZWN0LmVudHJpZXMoaXNzdWVzKSkge1xuICAgICAgICBvblZhbGlkYXRpb25FcnJvcihmaWVsZE5hbWUsIGVycm9ycywgZmllbGROYW1lKTtcbiAgICAgIH1cbiAgICAgIGVycl9fJDQoYEdvdCB2YWxpZGF0aW9uIGVycm9ycyBpbiBub24tQ0RFIGZvcm0gZmllbGRzYCwgaXNzdWVzKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkdvdCB2YWxpZGF0aW9uIGVycm9ycyBpbiBub24tQ0RFIGZvcm0gZmllbGRzXCIpO1xuICAgIH1cbiAgICByZXR1cm4gcGF5bG9hZC5kYXRhO1xuICB9O1xuICBjb25zdCB2YWxpZGF0ZVRva2VuaXplQ2FyZFJlc3VsdHMgPSAodG9rZW5pemVSZXN1bHRzLCBvblZhbGlkYXRpb25FcnJvcikgPT4ge1xuICAgIGZvciAoY29uc3QgdG9rZW5pemVSZXN1bHQgb2YgdG9rZW5pemVSZXN1bHRzKSB7XG4gICAgICBpZiAodG9rZW5pemVSZXN1bHQuc3VjY2VzcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgdG9rZW5pemVSZXN1bHQuZXJyb3JzLmZvckVhY2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgY29uc3QgcGFyc2VkID0gQWxsRmllbGROYW1lcy5zYWZlUGFyc2UoZXJyb3IuZWxlbWVudFR5cGUpO1xuICAgICAgICAgIGlmICghcGFyc2VkLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIGVycl9fJDQoYFVua25vd24gZmllbGQgbmFtZSBpbiBvblZhbGlkYXRpb25FcnJvcjogJHtlcnJvci5lbGVtZW50VHlwZX1gKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZmllbGROYW1lID0gcGFyc2VkLmRhdGE7XG4gICAgICAgICAgICBvblZhbGlkYXRpb25FcnJvcihmaWVsZE5hbWUsIGVycm9yLmVycm9ycyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgbG9nX18kNChgRXJyb3IgdG9rZW5pemluZyBjYXJkOiBnb3QgdmFsaWRhdGlvbiBlcnJvcnM6ICR7SlNPTi5zdHJpbmdpZnkodG9rZW5pemVSZXN1bHQuZXJyb3JzKX1gKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiR290IHZhbGlkYXRpb24gZXJyb3JzIHdoaWxlIHRva2VuaXppbmcgY2FyZFwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgY29uc3QgT0pTX1NUUklQRV9MSU5LX0JUTl9JRCA9IFwib2pzLXN0cmlwZS1saW5rLWJ0blwiO1xuICBjb25zdCB7IGxvZ19fOiBsb2dfXyQzLCBlcnJfXzogZXJyX18kMyB9ID0gY3JlYXRlT2pzRmxvd0xvZ2dlcnMoXCJzdHJpcGUtbGlua1wiKTtcbiAgY29uc3QgU3RyaXBlTGlua0NwbSA9IHpvZC56Lm9iamVjdCh7XG4gICAgcHJvdmlkZXI6IHpvZC56LmxpdGVyYWwoXCJzdHJpcGVfbGlua1wiKSxcbiAgICBwcm9jZXNzb3JfbmFtZTogem9kLnoubGl0ZXJhbChcInN0cmlwZVwiKSxcbiAgICBtZXRhZGF0YTogem9kLnoub2JqZWN0KHtcbiAgICAgIHN0cmlwZV9wazogem9kLnouc3RyaW5nKClcbiAgICB9KVxuICB9KTtcbiAgY29uc3QgU3RyaXBlTGlua1JlcXVpcmVkVXNlckFjdGlvbnMgPSB6b2Quei5hcnJheShcbiAgICB6b2Quei5vYmplY3Qoe1xuICAgICAgb3VyX2V4aXN0aW5nX3BtX2lkOiB6b2Quei5zdHJpbmcoKVxuICAgIH0pXG4gICkubGVuZ3RoKDEpO1xuICBjb25zdCBpbml0U3RyaXBlTGlua0Zsb3cgPSBhZGRFcnJvckNhdGNoZXJGb3JJbml0KFxuICAgIGFzeW5jICh7IGNvbnRleHQsIGZsb3dDYWxsYmFja3MgfSkgPT4ge1xuICAgICAgY29uc3QgaW5pdFBhcmFtcyA9IGNvbnRleHQuY3VzdG9tSW5pdFBhcmFtcy5zdHJpcGVMaW5rO1xuICAgICAgbG9nX18kMyhgQ2hlY2tpbmcgaWYgdGhlcmUgYXJlIGFueSBDUE1zIGZvciBTdHJpcGUgUFIuLi5gKTtcbiAgICAgIGNvbnN0IHN0cmlwZUxpbmtDcG0gPSBmaW5kQ3BtTWF0Y2hpbmdUeXBlKGNvbnRleHQuY2hlY2tvdXRQYXltZW50TWV0aG9kcywgU3RyaXBlTGlua0NwbSk7XG4gICAgICBsb2dfXyQzKGBTdGFydGluZyBzdHJpcGUgbGluayBmbG93Li4uYCk7XG4gICAgICBjb25zdCBhbnlDZGVDb25uZWN0aW9uID0gQXJyYXkuZnJvbShjb250ZXh0LmNkZUNvbm5lY3Rpb25zLnZhbHVlcygpKVswXTtcbiAgICAgIGNvbnN0IHByZWZpbGwgPSBhd2FpdCBnZXRQcmVmaWxsKGFueUNkZUNvbm5lY3Rpb24pO1xuICAgICAgY29uc3QgaXNTZXR1cE1vZGUgPSBwcmVmaWxsLm1vZGUgPT09IFwic2V0dXBcIjtcbiAgICAgIGxvZ19fJDMoYENyZWF0aW5nIHN0cmlwZSBlbGVtZW50cy4uLmApO1xuICAgICAgY29uc3QgaW5pdGlhbFByZXZpZXcgPSBhd2FpdCBnZXRDaGVja291dFByZXZpZXdBbW91bnQoYW55Q2RlQ29ubmVjdGlvbiwgcHJlZmlsbC50b2tlbiwgaXNTZXR1cE1vZGUsIHZvaWQgMCk7XG4gICAgICBjb25zdCB7IGVsZW1lbnRzLCBzdHJpcGUgfSA9IGF3YWl0IGNyZWF0ZVN0cmlwZUVsZW1lbnRzKHN0cmlwZUxpbmtDcG0ubWV0YWRhdGEuc3RyaXBlX3BrLCB7XG4gICAgICAgIG1vZGU6IFwic2V0dXBcIixcbiAgICAgICAgY3VycmVuY3k6IGluaXRpYWxQcmV2aWV3LmN1cnJlbmN5LFxuICAgICAgICBzZXR1cF9mdXR1cmVfdXNhZ2U6IFwib2ZmX3Nlc3Npb25cIixcbiAgICAgICAgcGF5bWVudE1ldGhvZENyZWF0aW9uOiBcIm1hbnVhbFwiXG4gICAgICB9KTtcbiAgICAgIGxvZ19fJDMoYENyZWF0aW5nIGV4cHJlc3MgY2hlY2tvdXQuLi5gKTtcbiAgICAgIGNvbnN0IGV4cHJlc3NDaGVja291dEVsZW1lbnQgPSBlbGVtZW50cy5jcmVhdGUoXCJleHByZXNzQ2hlY2tvdXRcIiwge1xuICAgICAgICBidXR0b25IZWlnaHQ6IGluaXRQYXJhbXM/LmJ1dHRvbkhlaWdodCxcbiAgICAgICAgcGF5bWVudE1ldGhvZHM6IHtcbiAgICAgICAgICBhbWF6b25QYXk6IFwibmV2ZXJcIixcbiAgICAgICAgICBhcHBsZVBheTogXCJuZXZlclwiLFxuICAgICAgICAgIGdvb2dsZVBheTogXCJuZXZlclwiLFxuICAgICAgICAgIHBheXBhbDogXCJuZXZlclwiXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY29uc3QgbW91bnRCdXR0b24gPSAoKSA9PiB7XG4gICAgICAgIGV4cHJlc3NDaGVja291dEVsZW1lbnQubW91bnQoYCMke09KU19TVFJJUEVfTElOS19CVE5fSUR9YCk7XG4gICAgICB9O1xuICAgICAgY29uc3QgZGlzbW91bnRCdXR0b24gPSAoKSA9PiB7XG4gICAgICAgIGV4cHJlc3NDaGVja291dEVsZW1lbnQudW5tb3VudCgpO1xuICAgICAgfTtcbiAgICAgIGlmIChpbml0UGFyYW1zPy5kb05vdE1vdW50T25Jbml0KSB7XG4gICAgICAgIGxvZ19fJDMoYE5PVCBtb3VudGluZyBzdHJpcGUgbGluayBidXR0b24gKGRvTm90TW91bnRPbkluaXQgaXMgdHJ1ZSlgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ19fJDMoYE1vdW50aW5nIHN0cmlwZSBsaW5rIGJ1dHRvbi4uLmApO1xuICAgICAgICBtb3VudEJ1dHRvbigpO1xuICAgICAgfVxuICAgICAgZXhwcmVzc0NoZWNrb3V0RWxlbWVudC5vbihcImNsaWNrXCIsIGFzeW5jIChldmVudCkgPT4ge1xuICAgICAgICBsb2dfXyQzKFwiU3RyaXBlIExpbmsgYnV0dG9uIGNsaWNrZWRcIik7XG4gICAgICAgIGlmIChpbml0UGFyYW1zPy5vdmVycmlkZUxpbmtTdWJtaXQpIHtcbiAgICAgICAgICBjb25zdCBzaG91bGRTdWJtaXQgPSBhd2FpdCBpbml0UGFyYW1zLm92ZXJyaWRlTGlua1N1Ym1pdCgpO1xuICAgICAgICAgIGlmICghc2hvdWxkU3VibWl0KSB7XG4gICAgICAgICAgICBsb2dfXyQzKFwiU3RyaXBlIExpbmsgc3VibWl0IGFib3J0ZWQgYnkgb3ZlcnJpZGVMaW5rU3VibWl0XCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBldmVudC5yZXNvbHZlKCk7XG4gICAgICB9KTtcbiAgICAgIGV4cHJlc3NDaGVja291dEVsZW1lbnQub24oXCJjb25maXJtXCIsIGFzeW5jIChldmVudCkgPT4ge1xuICAgICAgICBsb2dfXyQzKFwiU3RyaXBlIExpbmsgd2luZG93IGNvbmZpcm1lZFwiLCBldmVudCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0cmlwZS5jcmVhdGVQYXltZW50TWV0aG9kKHtcbiAgICAgICAgICBlbGVtZW50cyxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIGJpbGxpbmdfZGV0YWlsczogZXZlbnQuYmlsbGluZ0RldGFpbHNcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVzdWx0LmVycm9yKSB7XG4gICAgICAgICAgZXJyX18kMyhcImVycm9yXCIsIHJlc3VsdC5lcnJvcik7XG4gICAgICAgICAgZmxvd0NhbGxiYWNrcy5vbkNoZWNrb3V0RXJyb3IocmVzdWx0LmVycm9yLm1lc3NhZ2UgPz8gXCJTdHJpcGUgTGluayB1bmtub3duIGVycm9yXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvZ19fJDMoXCJwYXltZW50TWV0aG9kXCIsIHJlc3VsdC5wYXltZW50TWV0aG9kKTtcbiAgICAgICAgICBPanNGbG93cy5zdHJpcGVMaW5rLnJ1bih7XG4gICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgY2hlY2tvdXRQYXltZW50TWV0aG9kOiBzdHJpcGVMaW5rQ3BtLFxuICAgICAgICAgICAgbm9uQ2RlRm9ybUlucHV0czogY3JlYXRlSW5wdXRzRGljdEZyb21Gb3JtKGNvbnRleHQuZm9ybURpdiksXG4gICAgICAgICAgICBmbG93Q2FsbGJhY2tzLFxuICAgICAgICAgICAgY3VzdG9tUGFyYW1zOiB7IHN0cmlwZVBNOiByZXN1bHQucGF5bWVudE1ldGhvZCB9LFxuICAgICAgICAgICAgaW5pdFJlc3VsdDogeyBpc0F2YWlsYWJsZTogdHJ1ZSB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNBdmFpbGFibGU6IHRydWUsXG4gICAgICAgIGNvbnRyb2xsZXI6IHtcbiAgICAgICAgICBtb3VudEJ1dHRvbixcbiAgICAgICAgICBkaXNtb3VudEJ1dHRvbixcbiAgICAgICAgICB3YWl0Rm9yQnV0dG9uVG9Nb3VudDogYXN5bmMgKCkgPT4gYXdhaXQgZ2V0RWxlbWVudEJ5SWRBc3luYyhPSlNfU1RSSVBFX0xJTktfQlROX0lEKVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgKTtcbiAgY29uc3QgcnVuU3RyaXBlTGlua0Zsb3cgPSBhZGRCYXNpY0NoZWNrb3V0Q2FsbGJhY2tIYW5kbGVycyhcbiAgICBhc3luYyAoe1xuICAgICAgY29udGV4dCxcbiAgICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZCxcbiAgICAgIG5vbkNkZUZvcm1JbnB1dHMsXG4gICAgICBmbG93Q2FsbGJhY2tzLFxuICAgICAgY3VzdG9tUGFyYW1zXG4gICAgfSkgPT4ge1xuICAgICAgbG9nX18kMyhgUnVubmluZyBTdHJpcGUgUFIgZmxvdy4uLmApO1xuICAgICAgY29uc3QgYW55Q2RlQ29ubmVjdGlvbiA9IEFycmF5LmZyb20oY29udGV4dC5jZGVDb25uZWN0aW9ucy52YWx1ZXMoKSlbMF07XG4gICAgICBsb2dfXyQzKGBNZXJnaW5nIFBNIGZpZWxkcyB3aXRoIGZvcm0gZmllbGRzLi4uYCk7XG4gICAgICBjb25zdCBtZXJnZWRJbnB1dHMgPSBmaWxsRW1wdHlGb3JtSW5wdXRzV2l0aFN0cmlwZVBNKG5vbkNkZUZvcm1JbnB1dHMsIGN1c3RvbVBhcmFtcy5zdHJpcGVQTSk7XG4gICAgICBjb25zdCBub25DZGVGb3JtRmllbGRzID0gdmFsaWRhdGVOb25DZGVGb3JtRmllbGRzRm9yQ0MobWVyZ2VkSW5wdXRzLCBmbG93Q2FsbGJhY2tzLm9uVmFsaWRhdGlvbkVycm9yKTtcbiAgICAgIGxvZ19fJDMoYFN0YXJ0aW5nIHBheW1lbnQgZmxvdy4uLmApO1xuICAgICAgY29uc3Qgc3RhcnRQYXltZW50Rmxvd1Jlc3BvbnNlID0gYXdhaXQgc3RhcnRQYXltZW50RmxvdyhhbnlDZGVDb25uZWN0aW9uLCB7XG4gICAgICAgIHBheW1lbnRfcHJvdmlkZXI6IGNoZWNrb3V0UGF5bWVudE1ldGhvZC5wcm92aWRlcixcbiAgICAgICAgY2hlY2tvdXRfcGF5bWVudF9tZXRob2Q6IGNoZWNrb3V0UGF5bWVudE1ldGhvZCxcbiAgICAgICAgdGhlaXJfZXhpc3RpbmdfcG1faWQ6IGN1c3RvbVBhcmFtcy5zdHJpcGVQTS5pZFxuICAgICAgfSk7XG4gICAgICBsb2dfXyQzKFwiU3RhcnQgcGF5bWVudCBmbG93IHJlc3BvbnNlXCIsIHN0YXJ0UGF5bWVudEZsb3dSZXNwb25zZSk7XG4gICAgICBjb25zdCBuZXh0QWN0aW9uTWV0YWRhdGEgPSBTdHJpcGVMaW5rUmVxdWlyZWRVc2VyQWN0aW9ucy5wYXJzZShzdGFydFBheW1lbnRGbG93UmVzcG9uc2UucmVxdWlyZWRfdXNlcl9hY3Rpb25zKTtcbiAgICAgIGNvbnN0IG91ckV4aXN0aW5nUG1JZCA9IG5leHRBY3Rpb25NZXRhZGF0YVswXS5vdXJfZXhpc3RpbmdfcG1faWQ7XG4gICAgICBjb25zdCBwcmVmaWxsID0gYXdhaXQgZ2V0UHJlZmlsbChhbnlDZGVDb25uZWN0aW9uKTtcbiAgICAgIGlmIChwcmVmaWxsLm1vZGUgPT09IFwic2V0dXBcIikge1xuICAgICAgICBsb2dfXyQzKGBEb2luZyBwYXltZW50IHNldHVwLi4uYCk7XG4gICAgICAgIGNvbnN0IGNvbmZpcm1SZXN1bHQgPSBhd2FpdCBjb25maXJtUGF5bWVudEZsb3coYW55Q2RlQ29ubmVjdGlvbiwge1xuICAgICAgICAgIHNlY3VyZV90b2tlbjogcHJlZmlsbC50b2tlbixcbiAgICAgICAgICBleGlzdGluZ19jY19wbV9pZDogb3VyRXhpc3RpbmdQbUlkXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBjcmVhdGVkUGF5bWVudE1ldGhvZCA9IHBhcnNlQ29uZmlybVBheW1lbnRGbG93UmVzcG9uc2UoY29uZmlybVJlc3VsdCk7XG4gICAgICAgIHJldHVybiB7IG1vZGU6IFwic2V0dXBcIiwgcmVzdWx0OiBjcmVhdGVkUGF5bWVudE1ldGhvZCB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nX18kMyhgRG9pbmcgY2hlY2tvdXQuLi5gKTtcbiAgICAgICAgY29uc3QgY2hlY2tvdXRSZXF1ZXN0ID0ge1xuICAgICAgICAgIHNlY3VyZV90b2tlbjogcHJlZmlsbC50b2tlbixcbiAgICAgICAgICBwYXltZW50X2lucHV0OiB7XG4gICAgICAgICAgICBwcm92aWRlcl90eXBlOiBjaGVja291dFBheW1lbnRNZXRob2QucHJvdmlkZXJcbiAgICAgICAgICB9LFxuICAgICAgICAgIGN1c3RvbWVyX2VtYWlsOiBub25DZGVGb3JtRmllbGRzW0ZpZWxkTmFtZS5FTUFJTF0sXG4gICAgICAgICAgY3VzdG9tZXJfemlwX2NvZGU6IG5vbkNkZUZvcm1GaWVsZHNbRmllbGROYW1lLlpJUF9DT0RFXSxcbiAgICAgICAgICBjdXN0b21lcl9jb3VudHJ5OiBub25DZGVGb3JtRmllbGRzW0ZpZWxkTmFtZS5DT1VOVFJZXSxcbiAgICAgICAgICBwcm9tb3Rpb25fY29kZTogbm9uQ2RlRm9ybUZpZWxkc1tGaWVsZE5hbWUuUFJPTU9USU9OX0NPREVdLFxuICAgICAgICAgIGxpbmVfaXRlbXM6IHByZWZpbGwubGluZV9pdGVtcyxcbiAgICAgICAgICB0b3RhbF9hbW91bnRfYXRvbTogcHJlZmlsbC5hbW91bnRfdG90YWxfYXRvbSxcbiAgICAgICAgICBjYW5jZWxfYXRfZW5kOiBmYWxzZSxcbiAgICAgICAgICBjaGVja291dF9wYXltZW50X21ldGhvZDogY2hlY2tvdXRQYXltZW50TWV0aG9kXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBlcmZvcm1DaGVja291dChhbnlDZGVDb25uZWN0aW9uLCBjaGVja291dFJlcXVlc3QpO1xuICAgICAgICByZXR1cm4geyBtb2RlOiBcImNoZWNrb3V0XCIsIHJlc3VsdCB9O1xuICAgICAgfVxuICAgIH1cbiAgKTtcbiAgY29uc3QgZmlsbEVtcHR5Rm9ybUlucHV0c1dpdGhTdHJpcGVQTSA9IChmb3JtSW5wdXRzLCBzdHJpcGVQbSkgPT4ge1xuICAgIGNvbnN0IGlucHV0cyA9IHsgLi4uZm9ybUlucHV0cyB9O1xuICAgIGNvbnN0IFtwYXllckZpcnN0TmFtZSwgLi4ucGF5ZXJMYXN0TmFtZVBhcnRzXSA9IHN0cmlwZVBtLmJpbGxpbmdfZGV0YWlscy5uYW1lPy50cmltKCk/LnNwbGl0KC9cXHMrLykgPz8gW107XG4gICAgY29uc3QgcGF5ZXJMYXN0TmFtZSA9IHBheWVyTGFzdE5hbWVQYXJ0cy5qb2luKFwiIFwiKSB8fCB2b2lkIDA7XG4gICAgaW5wdXRzW0ZpZWxkTmFtZS5GSVJTVF9OQU1FXSA9IGlucHV0c1tGaWVsZE5hbWUuRklSU1RfTkFNRV0gfHwgcGF5ZXJGaXJzdE5hbWUgfHwgXCJfT1BfVU5LTk9XTlwiO1xuICAgIGlucHV0c1tGaWVsZE5hbWUuTEFTVF9OQU1FXSA9IGlucHV0c1tGaWVsZE5hbWUuTEFTVF9OQU1FXSB8fCBwYXllckxhc3ROYW1lIHx8IFwiX09QX1VOS05PV05cIjtcbiAgICBpbnB1dHNbRmllbGROYW1lLkVNQUlMXSA9IGlucHV0c1tGaWVsZE5hbWUuRU1BSUxdIHx8IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgc3RyaXBlUG1bXCJsaW5rXCJdPy5lbWFpbCB8fCBzdHJpcGVQbS5iaWxsaW5nX2RldGFpbHMuZW1haWwgfHwgXCJvcF91bmZpbGxlZEBnZXRvcGVucGF5LmNvbVwiO1xuICAgIGlucHV0c1tGaWVsZE5hbWUuWklQX0NPREVdID0gaW5wdXRzW0ZpZWxkTmFtZS5aSVBfQ09ERV0gfHwgc3RyaXBlUG0uYmlsbGluZ19kZXRhaWxzLmFkZHJlc3M/LnBvc3RhbF9jb2RlIHx8IFwiMDAwMDBcIjtcbiAgICBpbnB1dHNbRmllbGROYW1lLkNPVU5UUlldID0gaW5wdXRzW0ZpZWxkTmFtZS5DT1VOVFJZXSB8fCBzdHJpcGVQbS5iaWxsaW5nX2RldGFpbHMuYWRkcmVzcz8uY291bnRyeSB8fCBcIlVTXCI7XG4gICAgbG9nX18kMyhgRmluYWwgZm9ybSBpbnB1dHM6YCwgaW5wdXRzKTtcbiAgICByZXR1cm4gaW5wdXRzO1xuICB9O1xuICBjb25zdCBnZXRFbGVtZW50QnlJZEFzeW5jID0gKGlkKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IGdldEVsZW1lbnQgPSAoKSA9PiB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgcmVzb2x2ZShlbGVtZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShnZXRFbGVtZW50KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGdldEVsZW1lbnQoKTtcbiAgfSk7XG5cbiAgY29uc3Qgc3R5bGVzID0gXCJAa2V5ZnJhbWVzIGZhZGVJbnswJXtvcGFjaXR5OjA7dHJhbnNmb3JtOnNjYWxlKC45KX10b3tvcGFjaXR5OjE7dHJhbnNmb3JtOnNjYWxlKDEpfX0ub3ZlcmxheXtwb3NpdGlvbjpmaXhlZDt0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTt6LWluZGV4OjIxNDc0ODM2NDghaW1wb3J0YW50O2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcjtiYWNrZ3JvdW5kLWNvbG9yOiMwMDAwMDA4MH0uY29udGFpbmVye21heC13aWR0aDo1MDBweDttYXgtaGVpZ2h0OjYwMHB4O3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7YmFja2dyb3VuZC1jb2xvcjojZmZmO3Bvc2l0aW9uOnJlbGF0aXZlO2FuaW1hdGlvbjpmYWRlSW4gLjNzIGVhc2Utb3V0fS5mcmFtZXttYXgtd2lkdGg6NTAwcHg7bWF4LWhlaWdodDo2MDBweDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2JvcmRlcjpub25lfS5jYW5jZWwtYnV0dG9ue3Bvc2l0aW9uOmFic29sdXRlO2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Ym9yZGVyOm5vbmU7Zm9udC1zaXplOjFyZW07Y29sb3I6I2ZmZjtjdXJzb3I6cG9pbnRlcjt0b3A6LTEuNXJlbTtwYWRkaW5nOjA7cmlnaHQ6MH1cIjtcblxuICBjb25zdCBjcmVhdGVBbmRPcGVuRnJhbWUgPSAodXJsKSA9PiB7XG4gICAgY29uc3QgdGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIik7XG4gICAgdGVtcGxhdGUuaW5uZXJIVE1MID0gYFxuICAgIDxzdHlsZT5cbiAgICAgICR7c3R5bGVzfVxuICAgIDwvc3R5bGU+XG4gICAgPGRpdiBjbGFzcz1cIm92ZXJsYXlcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXJcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNhbmNlbC1idXR0b25cIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgPGlmcmFtZSBzcmM9XCIke3VybH1cIiBjbGFzcz1cImZyYW1lXCIgaWQ9XCJ0aHJlZS1kcy1pZnJhbWVcIiB0aXRsZT1cIjNEIFNlY3VyZSB2ZXJpZmljYXRpb25cIiBhbGxvdz1cInBheW1lbnRcIj48L2lmcmFtZT5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgO1xuICAgIGNvbnN0IGhvc3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIGNvbnN0IHNoYWRvd1Jvb3QgPSBob3N0LmF0dGFjaFNoYWRvdyh7IG1vZGU6IFwib3BlblwiIH0pO1xuICAgIHNoYWRvd1Jvb3QuYXBwZW5kQ2hpbGQodGVtcGxhdGUuY29udGVudC5jbG9uZU5vZGUodHJ1ZSkpO1xuICAgIGNvbnN0IGlmcmFtZSA9IHNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcihcIiN0aHJlZS1kcy1pZnJhbWVcIik7XG4gICAgY29uc3QgY2FuY2VsQnV0dG9uID0gc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKFwiLmNhbmNlbC1idXR0b25cIik7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChob3N0KTtcbiAgICByZXR1cm4geyBob3N0LCBpZnJhbWUsIGNhbmNlbEJ1dHRvbiB9O1xuICB9O1xuXG4gIGZ1bmN0aW9uIHN0YXJ0UG9sbGluZyhpZnJhbWUsIG9uU3VjY2VzcywgY2hpbGRPcmlnaW4pIHtcbiAgICBjb25zdCBoYW5kbGVQb2xsaW5nID0gYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc29sZS5sb2coXCLwn5SEIFBvbGxpbmcgQ0RFIGNvbm5lY3Rpb24uLi5cIik7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IHBpbmdDZGVGb3IzZHNTdGF0dXMoaWZyYW1lLCBjaGlsZE9yaWdpbik7XG4gICAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIvCfn6IgQ0RFIGNvbm5lY3Rpb24gc3VjY2Vzc2Z1bCEgU3RvcHBpbmcgcG9sbGluZy4uLlwiKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIuKeoe+4jyBHb3Qgc3RhdHVzOlwiLCBzdGF0dXMpO1xuICAgICAgICAgIGNsZWFySW50ZXJ2YWwocG9sbGluZ0ludGVydmFsKTtcbiAgICAgICAgICBvblN1Y2Nlc3Moc3RhdHVzKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIH1cbiAgICB9O1xuICAgIGhhbmRsZVBvbGxpbmcoKTtcbiAgICBjb25zdCBwb2xsaW5nSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChoYW5kbGVQb2xsaW5nLCBDREVfUE9MTElOR19JTlRFUlZBTCk7XG4gICAgcmV0dXJuIHBvbGxpbmdJbnRlcnZhbDtcbiAgfVxuICBmdW5jdGlvbiBoYW5kbGVFdmVudHMoe1xuICAgIGVsZW1lbnRzLFxuICAgIHBvbGxpbmdJbnRlcnZhbCxcbiAgICByZXNvbHZlXG4gIH0pIHtcbiAgICBjb25zdCBoYW5kbGVDYW5jZWwgPSAoKSA9PiB7XG4gICAgICBjbGVhckludGVydmFsKHBvbGxpbmdJbnRlcnZhbCk7XG4gICAgICBlbGVtZW50cy5ob3N0LnJlbW92ZSgpO1xuICAgICAgcmVzb2x2ZShUaHJlZURTU3RhdHVzLkNBTkNFTExFRCk7XG4gICAgfTtcbiAgICBlbGVtZW50cy5jYW5jZWxCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGhhbmRsZUNhbmNlbCk7XG4gICAgY29uc3QgY2xlYW51cEV2ZW50TGlzdGVuZXJzID0gKCkgPT4ge1xuICAgICAgZWxlbWVudHMuY2FuY2VsQnV0dG9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBoYW5kbGVDYW5jZWwpO1xuICAgIH07XG4gICAgcmV0dXJuIGNsZWFudXBFdmVudExpc3RlbmVycztcbiAgfVxuICBhc3luYyBmdW5jdGlvbiBzdGFydDNkc1ZlcmlmaWNhdGlvbih7XG4gICAgdXJsLFxuICAgIGJhc2VVcmxcbiAgfSkge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gY3JlYXRlQW5kT3BlbkZyYW1lKHVybCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBjb25zdCBvblN1Y2Nlc3MgPSAoc3RhdHVzKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGVsZW1lbnRzLmhvc3QucmVtb3ZlKCk7XG4gICAgICAgIH0sIDFlMyk7XG4gICAgICAgIHJlc29sdmUoc3RhdHVzKTtcbiAgICAgICAgY2xlYW51cEV2ZW50TGlzdGVuZXJzPy4oKTtcbiAgICAgIH07XG4gICAgICBjb25zdCBwb2xsaW5nSW50ZXJ2YWwgPSBzdGFydFBvbGxpbmcoZWxlbWVudHMuaWZyYW1lLCBvblN1Y2Nlc3MsIG5ldyBVUkwoYmFzZVVybCkub3JpZ2luKTtcbiAgICAgIGNvbnN0IGNsZWFudXBFdmVudExpc3RlbmVycyA9IGhhbmRsZUV2ZW50cyh7XG4gICAgICAgIGVsZW1lbnRzLFxuICAgICAgICBwb2xsaW5nSW50ZXJ2YWwsXG4gICAgICAgIHJlc29sdmVcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgeyBsb2dfXzogbG9nX18kMiwgZXJyX186IGVycl9fJDIgfSA9IGNyZWF0ZU9qc0Zsb3dMb2dnZXJzKFwiY29tbW9uLWNjXCIpO1xuICBjb25zdCB7IGxvZ19fOiBzdHJpcGVMb2dfXyB9ID0gY3JlYXRlT2pzRmxvd0xvZ2dlcnMoXCJzdHJpcGUtY2NcIik7XG4gIGNvbnN0IHJ1bkNvbW1vbkNjRmxvdyA9IGFkZEJhc2ljQ2hlY2tvdXRDYWxsYmFja0hhbmRsZXJzKFxuICAgIGFzeW5jICh7IGNvbnRleHQsIGNoZWNrb3V0UGF5bWVudE1ldGhvZCwgbm9uQ2RlRm9ybUlucHV0cywgZmxvd0NhbGxiYWNrcyB9KSA9PiB7XG4gICAgICBsb2dfXyQyKGDilJwgUnVubmluZyBjb21tb24gQ0MgZmxvdy4uLmAsIHsgY2hlY2tvdXRQYXltZW50TWV0aG9kIH0pO1xuICAgICAgY29uc3QgYW55Q2RlQ29ubmVjdGlvbiA9IEFycmF5LmZyb20oY29udGV4dC5jZGVDb25uZWN0aW9ucy52YWx1ZXMoKSlbMF07XG4gICAgICBjb25zdCBwcmVmaWxsID0gYXdhaXQgZ2V0UHJlZmlsbChhbnlDZGVDb25uZWN0aW9uKTtcbiAgICAgIGxvZ19fJDIoYOKUnCBWYWxpZGF0aW5nIG5vbi1DREUgZm9ybSBmaWVsZHMgW01vZGU6ICR7cHJlZmlsbC5tb2RlfV1gKTtcbiAgICAgIGNvbnN0IG5vbkNkZUZvcm1GaWVsZHMgPSB2YWxpZGF0ZU5vbkNkZUZvcm1GaWVsZHNGb3JDQyhub25DZGVGb3JtSW5wdXRzLCBmbG93Q2FsbGJhY2tzLm9uVmFsaWRhdGlvbkVycm9yKTtcbiAgICAgIGxvZ19fJDIoYOKUnCBUb2tlbml6aW5nIGNhcmQgaW5mbyBpbiBDREUgW1Nlc3Npb246ICR7Y29udGV4dC5lbGVtZW50c1Nlc3Npb25JZH1dYCk7XG4gICAgICBjb25zdCB0b2tlbml6ZUNhcmRSZXN1bHRzID0gYXdhaXQgdG9rZW5pemVDYXJkT25BbGxDb25uZWN0aW9ucyhjb250ZXh0LmNkZUNvbm5lY3Rpb25zLCB7XG4gICAgICAgIHNlc3Npb25faWQ6IGNvbnRleHQuZWxlbWVudHNTZXNzaW9uSWRcbiAgICAgIH0pO1xuICAgICAgdmFsaWRhdGVUb2tlbml6ZUNhcmRSZXN1bHRzKHRva2VuaXplQ2FyZFJlc3VsdHMsIGZsb3dDYWxsYmFja3Mub25WYWxpZGF0aW9uRXJyb3IpO1xuICAgICAgY29uc3QgY29tbW9uQ2hlY2tvdXRQYXJhbXMgPSB7XG4gICAgICAgIHNlc3Npb25faWQ6IGNvbnRleHQuZWxlbWVudHNTZXNzaW9uSWQsXG4gICAgICAgIGNoZWNrb3V0X3BheW1lbnRfbWV0aG9kOiBjaGVja291dFBheW1lbnRNZXRob2QsXG4gICAgICAgIG5vbl9jZGVfZm9ybV9maWVsZHM6IG5vbkNkZUZvcm1GaWVsZHNcbiAgICAgIH07XG4gICAgICB0cnkge1xuICAgICAgICBpZiAocHJlZmlsbC5tb2RlID09PSBcInNldHVwXCIpIHtcbiAgICAgICAgICBsb2dfXyQyKGDilJwgU2V0dGluZyB1cCBwYXltZW50IG1ldGhvZCBpbiBDREUgW1Rva2VuOiAke3ByZWZpbGwudG9rZW59XWApO1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNldHVwQ2hlY2tvdXQoYW55Q2RlQ29ubmVjdGlvbiwgY29tbW9uQ2hlY2tvdXRQYXJhbXMpO1xuICAgICAgICAgIGxvZ19fJDIoYOKVsCBTZXR1cCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IFtQTSBJRDogJHtyZXN1bHQucGF5bWVudF9tZXRob2RfaWR9XWApO1xuICAgICAgICAgIHJldHVybiB7IG1vZGU6IFwic2V0dXBcIiwgcmVzdWx0IH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG9nX18kMihg4pScIEluaXRpYWwgY2hlY2tvdXQgZmxvdy4gQ2hlY2tpbmcgb3V0IGNhcmQgaW5mbyBpbiBDREUgW1Nlc3Npb246ICR7Y29udGV4dC5lbGVtZW50c1Nlc3Npb25JZH1dYCk7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2hlY2tvdXRDYXJkRWxlbWVudHMoYW55Q2RlQ29ubmVjdGlvbiwgY29tbW9uQ2hlY2tvdXRQYXJhbXMpO1xuICAgICAgICAgIGxvZ19fJDIoYOKVsCBDaGVja291dCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LmApO1xuICAgICAgICAgIHJldHVybiB7IG1vZGU6IFwiY2hlY2tvdXRcIiwgcmVzdWx0IH07XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIENkZUVycm9yKSB7XG4gICAgICAgICAgaWYgKGVycm9yLm9yaWdpbmFsRXJyb3JNZXNzYWdlID09PSBcIjNEU19SRVFVSVJFRFwiKSB7XG4gICAgICAgICAgICBsb2dfXyQyKGDilJwgQ2FyZCByZXF1aXJlcyAzRFMsIHN0YXJ0aW5nIG5vbi1sZWdhY3kgcGF5bWVudCBmbG93YCk7XG4gICAgICAgICAgICBsb2dfXyQyKFwiZXJyb3IucmVzcG9uc2UuaGVhZGVyc1wiLCBlcnJvci5yZXNwb25zZS5oZWFkZXJzKTtcbiAgICAgICAgICAgIGNvbnN0IHNob3VsZFVzZU5ld0Zsb3cgPSBlcnJvci5yZXNwb25zZS5oZWFkZXJzPy5bXCJvcC1zaG91bGQtdXNlLW5ldy1mbG93XCJdID09PSBcInRydWVcIjtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0UGZSZXN1bHQgPSBhd2FpdCBzdGFydFBheW1lbnRGbG93Rm9yQ0MoYW55Q2RlQ29ubmVjdGlvbiwgY29tbW9uQ2hlY2tvdXRQYXJhbXMpO1xuICAgICAgICAgICAgbG9nX18kMihg4pScIG9wLXNob3VsZC11c2UtbmV3LWZsb3c6ICR7c2hvdWxkVXNlTmV3Rmxvd31gKTtcbiAgICAgICAgICAgIGxvZ19fJDIoYOKUnCBQYXltZW50IGZsb3cgcmVzdWx0OmAsIHN0YXJ0UGZSZXN1bHQpO1xuICAgICAgICAgICAgaWYgKHNob3VsZFVzZU5ld0Zsb3cpIHtcbiAgICAgICAgICAgICAgYXdhaXQgY29tbW9uQ0MzRFNGbG93KHN0YXJ0UGZSZXN1bHQsIGNvbnRleHQuYmFzZVVybCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBhd2FpdCBzdHJpcGVDQzNEU0Zsb3coc3RhcnRQZlJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocHJlZmlsbC5tb2RlID09PSBcInNldHVwXCIpIHtcbiAgICAgICAgICAgICAgbG9nX18kMihg4pScIENvbmZpcm1pbmcgcGF5bWVudCBmbG93IFtjY19wbV9pZDogJHtzdGFydFBmUmVzdWx0LmNjX3BtX2lkfV1gKTtcbiAgICAgICAgICAgICAgY29uc3QgY29uZmlybVJlc3VsdCA9IGF3YWl0IGNvbmZpcm1QYXltZW50RmxvdyhhbnlDZGVDb25uZWN0aW9uLCB7XG4gICAgICAgICAgICAgICAgc2VjdXJlX3Rva2VuOiBwcmVmaWxsLnRva2VuLFxuICAgICAgICAgICAgICAgIGV4aXN0aW5nX2NjX3BtX2lkOiBzdGFydFBmUmVzdWx0LmNjX3BtX2lkXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBsb2dfXyQyKGDilJwgQ29uZmlybSBwYXltZW50IGZsb3cgcmVzdWx0IHJlY2VpdmVkIFJlc3VsdDpgLCBjb25maXJtUmVzdWx0KTtcbiAgICAgICAgICAgICAgY29uc3QgY3JlYXRlZFBheW1lbnRNZXRob2QgPSBwYXJzZUNvbmZpcm1QYXltZW50Rmxvd1Jlc3BvbnNlKGNvbmZpcm1SZXN1bHQpO1xuICAgICAgICAgICAgICBsb2dfXyQyKGDilbAgU2V0dXAgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBbUE0gSUQ6ICR7Y3JlYXRlZFBheW1lbnRNZXRob2QucGF5bWVudF9tZXRob2RfaWR9XWApO1xuICAgICAgICAgICAgICByZXR1cm4geyBtb2RlOiBcInNldHVwXCIsIHJlc3VsdDogY3JlYXRlZFBheW1lbnRNZXRob2QgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGxvZ19fJDIoYOKUnCBDaGVja2luZyBvdXQgYWZ0ZXIgM0RTIGZsb3cgW0Zsb3c6ICR7c2hvdWxkVXNlTmV3RmxvdyA/IFwibmV3XCIgOiBcImxlZ2FjeVwifV1gKTtcbiAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2hlY2tvdXRDYXJkRWxlbWVudHMoYW55Q2RlQ29ubmVjdGlvbiwge1xuICAgICAgICAgICAgICAgIC4uLmNvbW1vbkNoZWNrb3V0UGFyYW1zLFxuICAgICAgICAgICAgICAgIGV4aXN0aW5nX2NjX3BtX2lkOiBzdGFydFBmUmVzdWx0LmNjX3BtX2lkLFxuICAgICAgICAgICAgICAgIGRvX25vdF91c2VfbGVnYWN5X2NjX2Zsb3c6ICFzaG91bGRVc2VOZXdGbG93XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBsb2dfXyQyKGDilbAgQ2hlY2tvdXQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS5gKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgbW9kZTogXCJjaGVja291dFwiLCByZXN1bHQgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZXJyX18kMihg4pWwIEVycm9yIGNoZWNraW5nIG91dCBjYXJkIGluZm8gaW4gQ0RFYCk7XG4gICAgICAgIGVycl9fJDIoZXJyb3IpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gICk7XG4gIGNvbnN0IHBhcnNlU3RyaXBlM0RTTmV4dEFjdGlvbk1ldGFkYXRhID0gKHJlc3BvbnNlKSA9PiB7XG4gICAgY29uc3Qgc3RyaXBlQWN0aW9uID0gcmVzcG9uc2UucmVxdWlyZWRfdXNlcl9hY3Rpb25zLmZpbmQoKGFjdGlvbikgPT4gYWN0aW9uLnR5cGUgPT09IFwic3RyaXBlXzNkc1wiKTtcbiAgICBpZiAoIXN0cmlwZUFjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gc3RyaXBlIDNEUyBhY3Rpb24gZm91bmRcIik7XG4gICAgfVxuICAgIHJldHVybiBTdHJpcGUzRFNOZXh0QWN0aW9uTWV0YWRhdGEucGFyc2Uoc3RyaXBlQWN0aW9uKTtcbiAgfTtcbiAgY29uc3QgcGFyc2VDb21tb24zRFNOZXh0QWN0aW9uTWV0YWRhdGEgPSAocmVzcG9uc2UpID0+IHtcbiAgICBjb25zdCBjb21tb25BY3Rpb24gPSByZXNwb25zZS5yZXF1aXJlZF91c2VyX2FjdGlvbnMuZmluZCgoYWN0aW9uKSA9PiBhY3Rpb24udHlwZSA9PT0gXCJhaXJ3YWxsZXhfcGF5bWVudF9jb25zZW50XCIpO1xuICAgIGlmICghY29tbW9uQWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBjb21tb24gM0RTIGFjdGlvbiBmb3VuZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIENvbW1vbjNEU05leHRBY3Rpb25NZXRhZGF0YS5wYXJzZShjb21tb25BY3Rpb24pO1xuICB9O1xuICBjb25zdCBjb21tb25DQzNEU0Zsb3cgPSBhc3luYyAoc3RhcnRQZlJlc3VsdCwgYmFzZVVybCkgPT4ge1xuICAgIGNvbnN0IG5leHRBY3Rpb25NZXRhZGF0YSA9IHBhcnNlQ29tbW9uM0RTTmV4dEFjdGlvbk1ldGFkYXRhKHN0YXJ0UGZSZXN1bHQpO1xuICAgIGxvZ19fJDIoYOKUnCBVc2luZyBjb21tb24gM0RTIGZsb3cgW1VSTDogJHtuZXh0QWN0aW9uTWV0YWRhdGEucmVkaXJlY3RfdXJsfV1gKTtcbiAgICBjb25zdCBzdGF0dXMgPSBhd2FpdCBzdGFydDNkc1ZlcmlmaWNhdGlvbih7IHVybDogbmV4dEFjdGlvbk1ldGFkYXRhLnJlZGlyZWN0X3VybCwgYmFzZVVybCB9KTtcbiAgICBsb2dfXyQyKGDilbAgM0RTIHZlcmlmaWNhdGlvbiBjb21wbGV0ZWQgW1N0YXR1czogJHtzdGF0dXN9XWApO1xuICAgIGlmIChzdGF0dXMgPT09IFRocmVlRFNTdGF0dXMuQ0FOQ0VMTEVEKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCIzRFMgdmVyaWZpY2F0aW9uIGNhbmNlbGxlZFwiKTtcbiAgICB9XG4gICAgaWYgKHN0YXR1cyA9PT0gVGhyZWVEU1N0YXR1cy5GQUlMVVJFKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCIzRFMgdmVyaWZpY2F0aW9uIGZhaWxlZFwiKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHN0cmlwZUNDM0RTRmxvdyA9IGFzeW5jIChzdGFydFBmUmVzdWx0KSA9PiB7XG4gICAgY29uc3QgbmV4dEFjdGlvbk1ldGFkYXRhID0gcGFyc2VTdHJpcGUzRFNOZXh0QWN0aW9uTWV0YWRhdGEoc3RhcnRQZlJlc3VsdCk7XG4gICAgc3RyaXBlTG9nX18oYOKUnCBVc2luZyBzdHJpcGUgM0RTIGZsb3cgW0NsaWVudCBTZWNyZXQ6ICR7bmV4dEFjdGlvbk1ldGFkYXRhLmNsaWVudF9zZWNyZXQuc3Vic3RyaW5nKDAsIDgpfS4uLl1gKTtcbiAgICBhd2FpdCBsYXVuY2hTdHJpcGUzRFNEaWFsb2dGbG93KG5leHRBY3Rpb25NZXRhZGF0YSk7XG4gICAgc3RyaXBlTG9nX18oXCLilbAgU3RyaXBlIDNEUyBmbG93IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHlcIik7XG4gIH07XG5cbiAgY29uc3QgeyBsb2dfXzogbG9nX18kMSwgZXJyX186IGVycl9fJDEgfSA9IGNyZWF0ZU9qc0Zsb3dMb2dnZXJzKFwic3RyaXBlLXByXCIpO1xuICBjb25zdCBTdHJpcGVQckNwbSA9IHpvZC56Lm9iamVjdCh7XG4gICAgcHJvdmlkZXI6IHpvZC56LnVuaW9uKFt6b2Quei5saXRlcmFsKFwiYXBwbGVfcGF5XCIpLCB6b2Quei5saXRlcmFsKFwiZ29vZ2xlX3BheVwiKV0pLFxuICAgIHByb2Nlc3Nvcl9uYW1lOiB6b2Quei5saXRlcmFsKFwic3RyaXBlXCIpLFxuICAgIG1ldGFkYXRhOiB6b2Quei5vYmplY3Qoe1xuICAgICAgc3RyaXBlX3BrOiB6b2Quei5zdHJpbmcoKVxuICAgIH0pXG4gIH0pO1xuICBjb25zdCBpbml0U3RyaXBlUHJGbG93ID0gYWRkRXJyb3JDYXRjaGVyRm9ySW5pdChcbiAgICBhc3luYyAoeyBjb250ZXh0IH0pID0+IHtcbiAgICAgIGxvZ19fJDEoYENoZWNraW5nIGlmIHRoZXJlIGFyZSBhbnkgQ1BNcyBmb3IgU3RyaXBlIFBSLi4uYCk7XG4gICAgICBjb25zdCBjaGVja291dFBheW1lbnRNZXRob2QgPSBmaW5kQ3BtTWF0Y2hpbmdUeXBlKGNvbnRleHQuY2hlY2tvdXRQYXltZW50TWV0aG9kcywgU3RyaXBlUHJDcG0pO1xuICAgICAgbG9nX18kMShgSW5pdGlhbGl6aW5nIFN0cmlwZSBQUiBmbG93Li4uYCk7XG4gICAgICBjb25zdCBhbnlDZGVDb25uZWN0aW9uID0gQXJyYXkuZnJvbShjb250ZXh0LmNkZUNvbm5lY3Rpb25zLnZhbHVlcygpKVswXTtcbiAgICAgIGNvbnN0IHByZWZpbGwgPSBhd2FpdCBnZXRQcmVmaWxsKGFueUNkZUNvbm5lY3Rpb24pO1xuICAgICAgY29uc3QgaXNTZXR1cE1vZGUgPSBwcmVmaWxsLm1vZGUgPT09IFwic2V0dXBcIjtcbiAgICAgIGxvZ19fJDEoYEdldHRpbmcgaW5pdGlhbCBwcmV2aWV3IGFtb3VudGApO1xuICAgICAgY29uc3QgaW5pdGlhbFByZXZpZXcgPSBhd2FpdCBnZXRDaGVja291dFByZXZpZXdBbW91bnQoYW55Q2RlQ29ubmVjdGlvbiwgcHJlZmlsbC50b2tlbiwgaXNTZXR1cE1vZGUsIHZvaWQgMCk7XG4gICAgICBjb25zdCBwciA9IGF3YWl0IGNyZWF0ZVN0cmlwZVBheW1lbnRSZXF1ZXN0KFxuICAgICAgICBjaGVja291dFBheW1lbnRNZXRob2QubWV0YWRhdGEuc3RyaXBlX3BrLFxuICAgICAgICBpbml0aWFsUHJldmlldy5hbW91bnRBdG9tLFxuICAgICAgICBpbml0aWFsUHJldmlldy5jdXJyZW5jeSxcbiAgICAgICAgaXNTZXR1cE1vZGVcbiAgICAgICk7XG4gICAgICBsb2dfXyQxKGBDaGVja2luZyBpZiBjYW4gbWFrZSBwYXltZW50YCk7XG4gICAgICBjb25zdCBjYW5NYWtlUGF5bWVudCA9IGF3YWl0IHByLmNhbk1ha2VQYXltZW50KCk7XG4gICAgICBpZiAoY2FuTWFrZVBheW1lbnQgPT09IG51bGwpIHtcbiAgICAgICAgZXJyX18kMShgY2FuTWFrZVBheW1lbnQgcmV0dXJuZWQgbnVsbGApO1xuICAgICAgICByZXR1cm4geyBpc0F2YWlsYWJsZTogZmFsc2UsIHJlYXNvbjogXCJjYW5NYWtlUGF5bWVudCByZXR1cm5lZCBudWxsXCIgfTtcbiAgICAgIH1cbiAgICAgIGxvZ19fJDEoYFN0cmlwZSBQUiBmbG93IGluaXRpYWxpemVkIHN1Y2Nlc3NmdWxseS4gQ2FuIG1ha2UgcGF5bWVudGAsIGNhbk1ha2VQYXltZW50KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzQXZhaWxhYmxlOiB0cnVlLFxuICAgICAgICBwcixcbiAgICAgICAgYXZhaWxhYmxlUHJvdmlkZXJzOiB7XG4gICAgICAgICAgYXBwbGVQYXk6IGNhbk1ha2VQYXltZW50LmFwcGxlUGF5LFxuICAgICAgICAgIGdvb2dsZVBheTogY2FuTWFrZVBheW1lbnQuZ29vZ2xlUGF5XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICApO1xuICBjb25zdCBydW5TdHJpcGVQckZsb3cgPSBhZGRCYXNpY0NoZWNrb3V0Q2FsbGJhY2tIYW5kbGVycyhcbiAgICBhc3luYyAoe1xuICAgICAgY29udGV4dCxcbiAgICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZCxcbiAgICAgIG5vbkNkZUZvcm1JbnB1dHMsXG4gICAgICBmbG93Q2FsbGJhY2tzLFxuICAgICAgY3VzdG9tUGFyYW1zLFxuICAgICAgaW5pdFJlc3VsdFxuICAgIH0pID0+IHtcbiAgICAgIGxvZ19fJDEoYFJ1bm5pbmcgU3RyaXBlIFBSIGZsb3cuLi5gKTtcbiAgICAgIGlmIChjdXN0b21QYXJhbXMucHJvdmlkZXIgIT09IGNoZWNrb3V0UGF5bWVudE1ldGhvZC5wcm92aWRlcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFByb3ZpZGVyIG1pc21hdGNoLiBFeHBlY3RlZCAke2N1c3RvbVBhcmFtcy5wcm92aWRlcn0sIGdvdCAke2NoZWNrb3V0UGF5bWVudE1ldGhvZC5wcm92aWRlcn1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFueUNkZUNvbm5lY3Rpb24gPSBBcnJheS5mcm9tKGNvbnRleHQuY2RlQ29ubmVjdGlvbnMudmFsdWVzKCkpWzBdO1xuICAgICAgY29uc3QgcHIgPSBpbml0UmVzdWx0LnByO1xuICAgICAgaWYgKGN1c3RvbVBhcmFtcz8ub3ZlcnJpZGVQYXltZW50UmVxdWVzdCkge1xuICAgICAgICBjb25zdCBvdmVycmlkZSA9IGN1c3RvbVBhcmFtcy5vdmVycmlkZVBheW1lbnRSZXF1ZXN0O1xuICAgICAgICBsb2dfXyQxKGBPdmVycmlkaW5nIFBSIGFtb3VudCB3aXRoYCwgb3ZlcnJpZGUpO1xuICAgICAgICB1cGRhdGVQcldpdGhBbW91bnQocHIsIG92ZXJyaWRlLmFtb3VudCwgb3ZlcnJpZGUucGVuZGluZyk7XG4gICAgICB9XG4gICAgICBsb2dfXyQxKGBTaG93aW5nIFBSIGRpYWxvZy4uLmApO1xuICAgICAgcHIuc2hvdygpO1xuICAgICAgY29uc3Qgc3RyaXBlUG1BZGRlZEV2ZW50ID0gYXdhaXQgd2FpdEZvclVzZXJUb0FkZFBheW1lbnRNZXRob2QocHIpO1xuICAgICAgbG9nX18kMShgU3RyaXBlIFBNIGFkZGVkIGV2ZW50OmAsIHN0cmlwZVBtQWRkZWRFdmVudCk7XG4gICAgICBsb2dfXyQxKGBNZXJnaW5nIFBNIGZpZWxkcyB3aXRoIGZvcm0gZmllbGRzLi4uYCk7XG4gICAgICBjb25zdCBtZXJnZWRJbnB1dHMgPSBmaWxsRW1wdHlGb3JtSW5wdXRzV2l0aFN0cmlwZVBtKG5vbkNkZUZvcm1JbnB1dHMsIHN0cmlwZVBtQWRkZWRFdmVudCk7XG4gICAgICBjb25zdCBub25DZGVGb3JtRmllbGRzID0gdmFsaWRhdGVOb25DZGVGb3JtRmllbGRzRm9yQ0MobWVyZ2VkSW5wdXRzLCBmbG93Q2FsbGJhY2tzLm9uVmFsaWRhdGlvbkVycm9yKTtcbiAgICAgIGxvZ19fJDEoYFBSIGRpYWxvZyBmaW5pc2hlZC4gU3RhcnRpbmcgcGF5bWVudCBmbG93Li4uYCk7XG4gICAgICBjb25zdCBzdGFydFBheW1lbnRGbG93UmVzcG9uc2UgPSBhd2FpdCBzdGFydFBheW1lbnRGbG93Rm9yUFIoYW55Q2RlQ29ubmVjdGlvbiwge1xuICAgICAgICBmaWVsZHM6IG5vbkNkZUZvcm1GaWVsZHMsXG4gICAgICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZFxuICAgICAgfSk7XG4gICAgICBjb25zdCBuZXh0QWN0aW9uTWV0YWRhdGEgPSBwYXJzZVBSTmV4dEFjdGlvbk1ldGFkYXRhKHN0YXJ0UGF5bWVudEZsb3dSZXNwb25zZSk7XG4gICAgICBsb2dfXyQxKGBDb25maXJtaW5nIFBSIHdpdGggU3RyaXBlLi4uYCk7XG4gICAgICBhd2FpdCBjb25maXJtU3RyaXBlUHJQTShuZXh0QWN0aW9uTWV0YWRhdGEsIHN0cmlwZVBtQWRkZWRFdmVudCk7XG4gICAgICBjb25zdCBwcmVmaWxsID0gYXdhaXQgZ2V0UHJlZmlsbChhbnlDZGVDb25uZWN0aW9uKTtcbiAgICAgIGlmIChwcmVmaWxsLm1vZGUgPT09IFwic2V0dXBcIikge1xuICAgICAgICBsb2dfXyQxKGBDb25maXJtaW5nIHBheW1lbnQgZmxvdyBmb3Igc2V0dXAuLi5gKTtcbiAgICAgICAgY29uc3QgY29uZmlybVJlc3VsdCA9IGF3YWl0IGNvbmZpcm1QYXltZW50RmxvdyhhbnlDZGVDb25uZWN0aW9uLCB7XG4gICAgICAgICAgc2VjdXJlX3Rva2VuOiBwcmVmaWxsLnRva2VuXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBjcmVhdGVkUGF5bWVudE1ldGhvZCA9IHBhcnNlQ29uZmlybVBheW1lbnRGbG93UmVzcG9uc2UoY29uZmlybVJlc3VsdCk7XG4gICAgICAgIHJldHVybiB7IG1vZGU6IFwic2V0dXBcIiwgcmVzdWx0OiBjcmVhdGVkUGF5bWVudE1ldGhvZCB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nX18kMShgUGVyZm9ybWluZyBjaGVja291dC4uLmApO1xuICAgICAgICBjb25zdCBjaGVja291dFJlcXVlc3QgPSB7XG4gICAgICAgICAgc2VjdXJlX3Rva2VuOiBwcmVmaWxsLnRva2VuLFxuICAgICAgICAgIHBheW1lbnRfaW5wdXQ6IHtcbiAgICAgICAgICAgIHByb3ZpZGVyX3R5cGU6IGNoZWNrb3V0UGF5bWVudE1ldGhvZC5wcm92aWRlclxuICAgICAgICAgIH0sXG4gICAgICAgICAgY3VzdG9tZXJfZW1haWw6IG5vbkNkZUZvcm1GaWVsZHNbRmllbGROYW1lLkVNQUlMXSxcbiAgICAgICAgICBjdXN0b21lcl96aXBfY29kZTogbm9uQ2RlRm9ybUZpZWxkc1tGaWVsZE5hbWUuWklQX0NPREVdLFxuICAgICAgICAgIGN1c3RvbWVyX2NvdW50cnk6IG5vbkNkZUZvcm1GaWVsZHNbRmllbGROYW1lLkNPVU5UUlldLFxuICAgICAgICAgIHByb21vdGlvbl9jb2RlOiBub25DZGVGb3JtRmllbGRzW0ZpZWxkTmFtZS5QUk9NT1RJT05fQ09ERV0sXG4gICAgICAgICAgbGluZV9pdGVtczogcHJlZmlsbC5saW5lX2l0ZW1zLFxuICAgICAgICAgIHRvdGFsX2Ftb3VudF9hdG9tOiBwcmVmaWxsLmFtb3VudF90b3RhbF9hdG9tLFxuICAgICAgICAgIGNhbmNlbF9hdF9lbmQ6IGZhbHNlLFxuICAgICAgICAgIGNoZWNrb3V0X3BheW1lbnRfbWV0aG9kOiBjaGVja291dFBheW1lbnRNZXRob2RcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGVyZm9ybUNoZWNrb3V0KGFueUNkZUNvbm5lY3Rpb24sIGNoZWNrb3V0UmVxdWVzdCk7XG4gICAgICAgIHJldHVybiB7IG1vZGU6IFwiY2hlY2tvdXRcIiwgcmVzdWx0IH07XG4gICAgICB9XG4gICAgfVxuICApO1xuICBjb25zdCBmaWxsRW1wdHlGb3JtSW5wdXRzV2l0aFN0cmlwZVBtID0gKGZvcm1JbnB1dHMsIHN0cmlwZVBtRXZ0KSA9PiB7XG4gICAgY29uc3QgaW5wdXRzID0geyAuLi5mb3JtSW5wdXRzIH07XG4gICAgY29uc3QgW3BheWVyRmlyc3ROYW1lLCAuLi5wYXllckxhc3ROYW1lUGFydHNdID0gc3RyaXBlUG1FdnQucGF5ZXJOYW1lPy50cmltKCk/LnNwbGl0KC9cXHMrLykgPz8gW107XG4gICAgY29uc3QgcGF5ZXJMYXN0TmFtZSA9IHBheWVyTGFzdE5hbWVQYXJ0cy5qb2luKFwiIFwiKSB8fCB2b2lkIDA7XG4gICAgaW5wdXRzW0ZpZWxkTmFtZS5GSVJTVF9OQU1FXSA9IGlucHV0c1tGaWVsZE5hbWUuRklSU1RfTkFNRV0gfHwgcGF5ZXJGaXJzdE5hbWUgfHwgXCJfT1BfVU5LTk9XTlwiO1xuICAgIGlucHV0c1tGaWVsZE5hbWUuTEFTVF9OQU1FXSA9IGlucHV0c1tGaWVsZE5hbWUuTEFTVF9OQU1FXSB8fCBwYXllckxhc3ROYW1lIHx8IFwiX09QX1VOS05PV05cIjtcbiAgICBpbnB1dHNbRmllbGROYW1lLkVNQUlMXSA9IGlucHV0c1tGaWVsZE5hbWUuRU1BSUxdIHx8IHN0cmlwZVBtRXZ0LnBheWVyRW1haWwgfHwgXCJvcF91bmZpbGxlZEBnZXRvcGVucGF5LmNvbVwiO1xuICAgIGlucHV0c1tGaWVsZE5hbWUuWklQX0NPREVdID0gaW5wdXRzW0ZpZWxkTmFtZS5aSVBfQ09ERV0gfHwgc3RyaXBlUG1FdnQuc2hpcHBpbmdBZGRyZXNzPy5wb3N0YWxDb2RlIHx8IFwiMDAwMDBcIjtcbiAgICBpbnB1dHNbRmllbGROYW1lLkNPVU5UUlldID0gaW5wdXRzW0ZpZWxkTmFtZS5DT1VOVFJZXSB8fCBzdHJpcGVQbUV2dC5zaGlwcGluZ0FkZHJlc3M/LmNvdW50cnkgfHwgXCJVU1wiO1xuICAgIGxvZ19fJDEoYEZpbmFsIGZvcm0gaW5wdXRzOmAsIGlucHV0cyk7XG4gICAgcmV0dXJuIGlucHV0cztcbiAgfTtcbiAgY29uc3QgdXBkYXRlUHJXaXRoQW1vdW50ID0gKHByLCBhbW91bnQsIGlzUGVuZGluZykgPT4ge1xuICAgIHByLnVwZGF0ZSh7XG4gICAgICB0b3RhbDoge1xuICAgICAgICBhbW91bnQ6IGFtb3VudC5hbW91bnRBdG9tLFxuICAgICAgICBsYWJlbDogXCJUb3RhbFwiLFxuICAgICAgICBwZW5kaW5nOiBpc1BlbmRpbmdcbiAgICAgIH0sXG4gICAgICBjdXJyZW5jeTogYW1vdW50LmN1cnJlbmN5XG4gICAgfSk7XG4gIH07XG4gIGNvbnN0IHBhcnNlUFJOZXh0QWN0aW9uTWV0YWRhdGEgPSAocmVzcG9uc2UpID0+IHtcbiAgICBpZiAocmVzcG9uc2UucmVxdWlyZWRfdXNlcl9hY3Rpb25zLmxlbmd0aCAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBvY2N1cnJlZC5cbkRldGFpbHM6IGdvdCAke3Jlc3BvbnNlLnJlcXVpcmVkX3VzZXJfYWN0aW9ucy5sZW5ndGh9IHJlcXVpcmVkIHVzZXIgYWN0aW9uc2ApO1xuICAgIH1cbiAgICByZXR1cm4gUGF5bWVudFJlcXVlc3ROZXh0QWN0aW9uTWV0YWRhdGEucGFyc2UocmVzcG9uc2UucmVxdWlyZWRfdXNlcl9hY3Rpb25zWzBdKTtcbiAgfTtcblxuICBjb25zdCBmaW5kQ2hlY2tvdXRQYXltZW50TWV0aG9kU3RyaWN0ID0gKGNwbXMsIHdpdGhQcm92aWRlciwgd2l0aFByb2Nlc3NvcikgPT4ge1xuICAgIGNvbnN0IG1hdGNoZXMgPSBjcG1zLmZpbHRlcigoY3BtKSA9PiB7XG4gICAgICBjb25zdCBtYXRjaGVzUHJvY2Vzc29yID0gdHJ1ZSA7XG4gICAgICBjb25zdCBtYXRjaGVzUHJvdmlkZXIgPSBjcG0ucHJvdmlkZXIgPT09IHdpdGhQcm92aWRlcjtcbiAgICAgIHJldHVybiBtYXRjaGVzUHJvY2Vzc29yICYmIG1hdGNoZXNQcm92aWRlcjtcbiAgICB9KTtcbiAgICBpZiAobWF0Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJDUE1zIGxpc3RcIiwgY3Btcyk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIENQTXMgZm91bmQgd2l0aCBwcm92aWRlciAnJHt3aXRoUHJvdmlkZXJ9JyBhbmQgcHJvY2Vzc29yICcke3dpdGhQcm9jZXNzb3J9J2ApO1xuICAgIH1cbiAgICBpZiAobWF0Y2hlcy5sZW5ndGggIT09IDEpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJDUE1zIGxpc3RcIiwgY3Btcyk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1vcmUgdGhhbiBvbmUgQ1BNIGZvdW5kIHdpdGggcHJvdmlkZXIgJyR7d2l0aFByb3ZpZGVyfScgYW5kIHByb2Nlc3NvciAnJHt3aXRoUHJvY2Vzc29yfSdgKTtcbiAgICB9XG4gICAgcmV0dXJuIG1hdGNoZXNbMF07XG4gIH07XG4gIGNvbnN0IE9qc0Zsb3dzID0ge1xuICAgIC8vIOKciyBOb3RlOiBGb3IgZmxvd3MgdGhhdCByZXF1aXJlIGluaXRpYWxpemF0aW9uLCBwbGVhc2UgYWRkIHRoZW0gdG8gYGluaXQtZmxvd3MudHNgXG4gICAgLy8gQ29tbW9uXG4gICAgY29tbW9uQ0M6IHtcbiAgICAgIHJ1bjogcnVuQ29tbW9uQ2NGbG93XG4gICAgfSxcbiAgICAvLyBTdHJpcGVcbiAgICBzdHJpcGVQUjoge1xuICAgICAgaW5pdDogaW5pdFN0cmlwZVByRmxvdyxcbiAgICAgIHJ1bjogcnVuU3RyaXBlUHJGbG93XG4gICAgfSxcbiAgICBzdHJpcGVMaW5rOiB7XG4gICAgICBpbml0OiBpbml0U3RyaXBlTGlua0Zsb3csXG4gICAgICBydW46IHJ1blN0cmlwZUxpbmtGbG93XG4gICAgfVxuICAgIC8vIPCfkYkgQWRkIG1vcmUgZmxvd3MgaGVyZVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIH07XG5cbiAgZnVuY3Rpb24gZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMgKHgpIHtcbiAgXHRyZXR1cm4geCAmJiB4Ll9fZXNNb2R1bGUgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHgsICdkZWZhdWx0JykgPyB4WydkZWZhdWx0J10gOiB4O1xuICB9XG5cbiAgdmFyIE9ic2VydmFibGUkMiA9IHt9O1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPYnNlcnZhYmxlJDIsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgdmFsdWU6IHRydWVcbiAgfSk7XG4gIE9ic2VydmFibGUkMi5PYnNlcnZhYmxlID0gdm9pZCAwO1xuXG4gIC8vID09PSBTeW1ib2wgU3VwcG9ydCA9PT1cbiAgY29uc3QgaGFzU3ltYm9sID0gbmFtZSA9PiBCb29sZWFuKFN5bWJvbFtuYW1lXSk7XG5cbiAgY29uc3QgZ2V0U3ltYm9sID0gbmFtZSA9PiBoYXNTeW1ib2wobmFtZSkgPyBTeW1ib2xbbmFtZV0gOiAnQEAnICsgbmFtZTtcblxuICBjb25zdCBTeW1ib2xJdGVyYXRvciA9IGdldFN5bWJvbCgnaXRlcmF0b3InKTtcbiAgY29uc3QgU3ltYm9sT2JzZXJ2YWJsZSA9IGdldFN5bWJvbCgnb2JzZXJ2YWJsZScpO1xuICBjb25zdCBTeW1ib2xTcGVjaWVzID0gZ2V0U3ltYm9sKCdzcGVjaWVzJyk7IC8vID09PSBBYnN0cmFjdCBPcGVyYXRpb25zID09PVxuXG4gIGZ1bmN0aW9uIGdldE1ldGhvZChvYmosIGtleSkge1xuICAgIGxldCB2YWx1ZSA9IG9ialtrZXldO1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBUeXBlRXJyb3IodmFsdWUgKyAnIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0U3BlY2llcyhvYmopIHtcbiAgICBsZXQgY3RvciA9IG9iai5jb25zdHJ1Y3RvcjtcblxuICAgIGlmIChjdG9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGN0b3IgPSBjdG9yW1N5bWJvbFNwZWNpZXNdO1xuXG4gICAgICBpZiAoY3RvciA9PT0gbnVsbCkge1xuICAgICAgICBjdG9yID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjdG9yICE9PSB1bmRlZmluZWQgPyBjdG9yIDogT2JzZXJ2YWJsZSQxO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNPYnNlcnZhYmxlKHgpIHtcbiAgICByZXR1cm4geCBpbnN0YW5jZW9mIE9ic2VydmFibGUkMTsgLy8gU1BFQzogQnJhbmQgY2hlY2tcbiAgfVxuXG4gIGZ1bmN0aW9uIGhvc3RSZXBvcnRFcnJvcihlKSB7XG4gICAgaWYgKGhvc3RSZXBvcnRFcnJvci5sb2cpIHtcbiAgICAgIGhvc3RSZXBvcnRFcnJvci5sb2coZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZW5xdWV1ZShmbikge1xuICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm4oKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaG9zdFJlcG9ydEVycm9yKGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gY2xlYW51cFN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pIHtcbiAgICBsZXQgY2xlYW51cCA9IHN1YnNjcmlwdGlvbi5fY2xlYW51cDtcbiAgICBpZiAoY2xlYW51cCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgc3Vic2NyaXB0aW9uLl9jbGVhbnVwID0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKCFjbGVhbnVwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGlmICh0eXBlb2YgY2xlYW51cCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjbGVhbnVwKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgdW5zdWJzY3JpYmUgPSBnZXRNZXRob2QoY2xlYW51cCwgJ3Vuc3Vic2NyaWJlJyk7XG5cbiAgICAgICAgaWYgKHVuc3Vic2NyaWJlKSB7XG4gICAgICAgICAgdW5zdWJzY3JpYmUuY2FsbChjbGVhbnVwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGhvc3RSZXBvcnRFcnJvcihlKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjbG9zZVN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pIHtcbiAgICBzdWJzY3JpcHRpb24uX29ic2VydmVyID0gdW5kZWZpbmVkO1xuICAgIHN1YnNjcmlwdGlvbi5fcXVldWUgPSB1bmRlZmluZWQ7XG4gICAgc3Vic2NyaXB0aW9uLl9zdGF0ZSA9ICdjbG9zZWQnO1xuICB9XG5cbiAgZnVuY3Rpb24gZmx1c2hTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKSB7XG4gICAgbGV0IHF1ZXVlID0gc3Vic2NyaXB0aW9uLl9xdWV1ZTtcblxuICAgIGlmICghcXVldWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzdWJzY3JpcHRpb24uX3F1ZXVlID0gdW5kZWZpbmVkO1xuICAgIHN1YnNjcmlwdGlvbi5fc3RhdGUgPSAncmVhZHknO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBxdWV1ZS5sZW5ndGg7ICsraSkge1xuICAgICAgbm90aWZ5U3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbiwgcXVldWVbaV0udHlwZSwgcXVldWVbaV0udmFsdWUpO1xuICAgICAgaWYgKHN1YnNjcmlwdGlvbi5fc3RhdGUgPT09ICdjbG9zZWQnKSBicmVhaztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBub3RpZnlTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uLCB0eXBlLCB2YWx1ZSkge1xuICAgIHN1YnNjcmlwdGlvbi5fc3RhdGUgPSAncnVubmluZyc7XG4gICAgbGV0IG9ic2VydmVyID0gc3Vic2NyaXB0aW9uLl9vYnNlcnZlcjtcblxuICAgIHRyeSB7XG4gICAgICBsZXQgbSA9IGdldE1ldGhvZChvYnNlcnZlciwgdHlwZSk7XG5cbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlICduZXh0JzpcbiAgICAgICAgICBpZiAobSkgbS5jYWxsKG9ic2VydmVyLCB2YWx1ZSk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgICAgIGNsb3NlU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbik7XG4gICAgICAgICAgaWYgKG0pIG0uY2FsbChvYnNlcnZlciwgdmFsdWUpO2Vsc2UgdGhyb3cgdmFsdWU7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnY29tcGxldGUnOlxuICAgICAgICAgIGNsb3NlU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbik7XG4gICAgICAgICAgaWYgKG0pIG0uY2FsbChvYnNlcnZlcik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaG9zdFJlcG9ydEVycm9yKGUpO1xuICAgIH1cblxuICAgIGlmIChzdWJzY3JpcHRpb24uX3N0YXRlID09PSAnY2xvc2VkJykgY2xlYW51cFN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pO2Vsc2UgaWYgKHN1YnNjcmlwdGlvbi5fc3RhdGUgPT09ICdydW5uaW5nJykgc3Vic2NyaXB0aW9uLl9zdGF0ZSA9ICdyZWFkeSc7XG4gIH1cblxuICBmdW5jdGlvbiBvbk5vdGlmeShzdWJzY3JpcHRpb24sIHR5cGUsIHZhbHVlKSB7XG4gICAgaWYgKHN1YnNjcmlwdGlvbi5fc3RhdGUgPT09ICdjbG9zZWQnKSByZXR1cm47XG5cbiAgICBpZiAoc3Vic2NyaXB0aW9uLl9zdGF0ZSA9PT0gJ2J1ZmZlcmluZycpIHtcbiAgICAgIHN1YnNjcmlwdGlvbi5fcXVldWUucHVzaCh7XG4gICAgICAgIHR5cGUsXG4gICAgICAgIHZhbHVlXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChzdWJzY3JpcHRpb24uX3N0YXRlICE9PSAncmVhZHknKSB7XG4gICAgICBzdWJzY3JpcHRpb24uX3N0YXRlID0gJ2J1ZmZlcmluZyc7XG4gICAgICBzdWJzY3JpcHRpb24uX3F1ZXVlID0gW3tcbiAgICAgICAgdHlwZSxcbiAgICAgICAgdmFsdWVcbiAgICAgIH1dO1xuICAgICAgZW5xdWV1ZSgoKSA9PiBmbHVzaFN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBub3RpZnlTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uLCB0eXBlLCB2YWx1ZSk7XG4gIH1cblxuICBjbGFzcyBTdWJzY3JpcHRpb24ge1xuICAgIGNvbnN0cnVjdG9yKG9ic2VydmVyLCBzdWJzY3JpYmVyKSB7XG4gICAgICAvLyBBU1NFUlQ6IG9ic2VydmVyIGlzIGFuIG9iamVjdFxuICAgICAgLy8gQVNTRVJUOiBzdWJzY3JpYmVyIGlzIGNhbGxhYmxlXG4gICAgICB0aGlzLl9jbGVhbnVwID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fb2JzZXJ2ZXIgPSBvYnNlcnZlcjtcbiAgICAgIHRoaXMuX3F1ZXVlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fc3RhdGUgPSAnaW5pdGlhbGl6aW5nJztcbiAgICAgIGxldCBzZWxmID0gdGhpcztcbiAgICAgIGxldCBzdWJzY3JpcHRpb25PYnNlcnZlciA9IHtcbiAgICAgICAgZ2V0IGNsb3NlZCgpIHtcbiAgICAgICAgICByZXR1cm4gc2VsZi5fc3RhdGUgPT09ICdjbG9zZWQnO1xuICAgICAgICB9LFxuXG4gICAgICAgIG5leHQodmFsdWUpIHtcbiAgICAgICAgICBvbk5vdGlmeShzZWxmLCAnbmV4dCcsIHZhbHVlKTtcbiAgICAgICAgfSxcblxuICAgICAgICBlcnJvcih2YWx1ZSkge1xuICAgICAgICAgIG9uTm90aWZ5KHNlbGYsICdlcnJvcicsIHZhbHVlKTtcbiAgICAgICAgfSxcblxuICAgICAgICBjb21wbGV0ZSgpIHtcbiAgICAgICAgICBvbk5vdGlmeShzZWxmLCAnY29tcGxldGUnKTtcbiAgICAgICAgfVxuXG4gICAgICB9O1xuXG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLl9jbGVhbnVwID0gc3Vic2NyaWJlci5jYWxsKHVuZGVmaW5lZCwgc3Vic2NyaXB0aW9uT2JzZXJ2ZXIpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBzdWJzY3JpcHRpb25PYnNlcnZlci5lcnJvcihlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX3N0YXRlID09PSAnaW5pdGlhbGl6aW5nJykgdGhpcy5fc3RhdGUgPSAncmVhZHknO1xuICAgIH1cblxuICAgIGdldCBjbG9zZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc3RhdGUgPT09ICdjbG9zZWQnO1xuICAgIH1cblxuICAgIHVuc3Vic2NyaWJlKCkge1xuICAgICAgaWYgKHRoaXMuX3N0YXRlICE9PSAnY2xvc2VkJykge1xuICAgICAgICBjbG9zZVN1YnNjcmlwdGlvbih0aGlzKTtcbiAgICAgICAgY2xlYW51cFN1YnNjcmlwdGlvbih0aGlzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgfVxuXG4gIGxldCBPYnNlcnZhYmxlJDEgPSBjbGFzcyBPYnNlcnZhYmxlIHtcbiAgICBjb25zdHJ1Y3RvcihzdWJzY3JpYmVyKSB7XG4gICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgT2JzZXJ2YWJsZSkpIHRocm93IG5ldyBUeXBlRXJyb3IoJ09ic2VydmFibGUgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uJyk7XG4gICAgICBpZiAodHlwZW9mIHN1YnNjcmliZXIgIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBUeXBlRXJyb3IoJ09ic2VydmFibGUgaW5pdGlhbGl6ZXIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgICB0aGlzLl9zdWJzY3JpYmVyID0gc3Vic2NyaWJlcjtcbiAgICB9XG5cbiAgICBzdWJzY3JpYmUob2JzZXJ2ZXIpIHtcbiAgICAgIGlmICh0eXBlb2Ygb2JzZXJ2ZXIgIT09ICdvYmplY3QnIHx8IG9ic2VydmVyID09PSBudWxsKSB7XG4gICAgICAgIG9ic2VydmVyID0ge1xuICAgICAgICAgIG5leHQ6IG9ic2VydmVyLFxuICAgICAgICAgIGVycm9yOiBhcmd1bWVudHNbMV0sXG4gICAgICAgICAgY29tcGxldGU6IGFyZ3VtZW50c1syXVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IFN1YnNjcmlwdGlvbihvYnNlcnZlciwgdGhpcy5fc3Vic2NyaWJlcik7XG4gICAgfVxuXG4gICAgZm9yRWFjaChmbikge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJlamVjdChuZXcgVHlwZUVycm9yKGZuICsgJyBpcyBub3QgYSBmdW5jdGlvbicpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBkb25lKCkge1xuICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzdWJzY3JpcHRpb24gPSB0aGlzLnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dCh2YWx1ZSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgZm4odmFsdWUsIGRvbmUpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBlcnJvcjogcmVqZWN0LFxuICAgICAgICAgIGNvbXBsZXRlOiByZXNvbHZlXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgbWFwKGZuKSB7XG4gICAgICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB0aHJvdyBuZXcgVHlwZUVycm9yKGZuICsgJyBpcyBub3QgYSBmdW5jdGlvbicpO1xuICAgICAgbGV0IEMgPSBnZXRTcGVjaWVzKHRoaXMpO1xuICAgICAgcmV0dXJuIG5ldyBDKG9ic2VydmVyID0+IHRoaXMuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dCh2YWx1ZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YWx1ZSA9IGZuKHZhbHVlKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JzZXJ2ZXIuZXJyb3IoZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgb2JzZXJ2ZXIubmV4dCh2YWx1ZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZXJyb3IoZSkge1xuICAgICAgICAgIG9ic2VydmVyLmVycm9yKGUpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGNvbXBsZXRlKCkge1xuICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIGZpbHRlcihmbikge1xuICAgICAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IFR5cGVFcnJvcihmbiArICcgaXMgbm90IGEgZnVuY3Rpb24nKTtcbiAgICAgIGxldCBDID0gZ2V0U3BlY2llcyh0aGlzKTtcbiAgICAgIHJldHVybiBuZXcgQyhvYnNlcnZlciA9PiB0aGlzLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQodmFsdWUpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCFmbih2YWx1ZSkpIHJldHVybjtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JzZXJ2ZXIuZXJyb3IoZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgb2JzZXJ2ZXIubmV4dCh2YWx1ZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZXJyb3IoZSkge1xuICAgICAgICAgIG9ic2VydmVyLmVycm9yKGUpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGNvbXBsZXRlKCkge1xuICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIHJlZHVjZShmbikge1xuICAgICAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IFR5cGVFcnJvcihmbiArICcgaXMgbm90IGEgZnVuY3Rpb24nKTtcbiAgICAgIGxldCBDID0gZ2V0U3BlY2llcyh0aGlzKTtcbiAgICAgIGxldCBoYXNTZWVkID0gYXJndW1lbnRzLmxlbmd0aCA+IDE7XG4gICAgICBsZXQgaGFzVmFsdWUgPSBmYWxzZTtcbiAgICAgIGxldCBzZWVkID0gYXJndW1lbnRzWzFdO1xuICAgICAgbGV0IGFjYyA9IHNlZWQ7XG4gICAgICByZXR1cm4gbmV3IEMob2JzZXJ2ZXIgPT4gdGhpcy5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0KHZhbHVlKSB7XG4gICAgICAgICAgbGV0IGZpcnN0ID0gIWhhc1ZhbHVlO1xuICAgICAgICAgIGhhc1ZhbHVlID0gdHJ1ZTtcblxuICAgICAgICAgIGlmICghZmlyc3QgfHwgaGFzU2VlZCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgYWNjID0gZm4oYWNjLCB2YWx1ZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBvYnNlcnZlci5lcnJvcihlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWNjID0gdmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIGVycm9yKGUpIHtcbiAgICAgICAgICBvYnNlcnZlci5lcnJvcihlKTtcbiAgICAgICAgfSxcblxuICAgICAgICBjb21wbGV0ZSgpIHtcbiAgICAgICAgICBpZiAoIWhhc1ZhbHVlICYmICFoYXNTZWVkKSByZXR1cm4gb2JzZXJ2ZXIuZXJyb3IobmV3IFR5cGVFcnJvcignQ2Fubm90IHJlZHVjZSBhbiBlbXB0eSBzZXF1ZW5jZScpKTtcbiAgICAgICAgICBvYnNlcnZlci5uZXh0KGFjYyk7XG4gICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgfVxuXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgYXN5bmMgYWxsKCkge1xuICAgICAgbGV0IHZhbHVlcyA9IFtdO1xuICAgICAgYXdhaXQgdGhpcy5mb3JFYWNoKHZhbHVlID0+IHZhbHVlcy5wdXNoKHZhbHVlKSk7XG4gICAgICByZXR1cm4gdmFsdWVzO1xuICAgIH1cblxuICAgIGNvbmNhdCguLi5zb3VyY2VzKSB7XG4gICAgICBsZXQgQyA9IGdldFNwZWNpZXModGhpcyk7XG4gICAgICByZXR1cm4gbmV3IEMob2JzZXJ2ZXIgPT4ge1xuICAgICAgICBsZXQgc3Vic2NyaXB0aW9uO1xuICAgICAgICBsZXQgaW5kZXggPSAwO1xuXG4gICAgICAgIGZ1bmN0aW9uIHN0YXJ0TmV4dChuZXh0KSB7XG4gICAgICAgICAgc3Vic2NyaXB0aW9uID0gbmV4dC5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgbmV4dCh2KSB7XG4gICAgICAgICAgICAgIG9ic2VydmVyLm5leHQodik7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBlcnJvcihlKSB7XG4gICAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKGUpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgY29tcGxldGUoKSB7XG4gICAgICAgICAgICAgIGlmIChpbmRleCA9PT0gc291cmNlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdGFydE5leHQoQy5mcm9tKHNvdXJjZXNbaW5kZXgrK10pKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBzdGFydE5leHQodGhpcyk7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgaWYgKHN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICBzdWJzY3JpcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZmxhdE1hcChmbikge1xuICAgICAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IFR5cGVFcnJvcihmbiArICcgaXMgbm90IGEgZnVuY3Rpb24nKTtcbiAgICAgIGxldCBDID0gZ2V0U3BlY2llcyh0aGlzKTtcbiAgICAgIHJldHVybiBuZXcgQyhvYnNlcnZlciA9PiB7XG4gICAgICAgIGxldCBzdWJzY3JpcHRpb25zID0gW107XG4gICAgICAgIGxldCBvdXRlciA9IHRoaXMuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0KHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoZm4pIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGZuKHZhbHVlKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvYnNlcnZlci5lcnJvcihlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgaW5uZXIgPSBDLmZyb20odmFsdWUpLnN1YnNjcmliZSh7XG4gICAgICAgICAgICAgIG5leHQodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KHZhbHVlKTtcbiAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICBlcnJvcihlKSB7XG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZSk7XG4gICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgY29tcGxldGUoKSB7XG4gICAgICAgICAgICAgICAgbGV0IGkgPSBzdWJzY3JpcHRpb25zLmluZGV4T2YoaW5uZXIpO1xuICAgICAgICAgICAgICAgIGlmIChpID49IDApIHN1YnNjcmlwdGlvbnMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgIGNvbXBsZXRlSWZEb25lKCk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzdWJzY3JpcHRpb25zLnB1c2goaW5uZXIpO1xuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBlcnJvcihlKSB7XG4gICAgICAgICAgICBvYnNlcnZlci5lcnJvcihlKTtcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgY29tcGxldGUoKSB7XG4gICAgICAgICAgICBjb21wbGV0ZUlmRG9uZSgpO1xuICAgICAgICAgIH1cblxuICAgICAgICB9KTtcblxuICAgICAgICBmdW5jdGlvbiBjb21wbGV0ZUlmRG9uZSgpIHtcbiAgICAgICAgICBpZiAob3V0ZXIuY2xvc2VkICYmIHN1YnNjcmlwdGlvbnMubGVuZ3RoID09PSAwKSBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICBzdWJzY3JpcHRpb25zLmZvckVhY2gocyA9PiBzLnVuc3Vic2NyaWJlKCkpO1xuICAgICAgICAgIG91dGVyLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBbU3ltYm9sT2JzZXJ2YWJsZV0oKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBzdGF0aWMgZnJvbSh4KSB7XG4gICAgICBsZXQgQyA9IHR5cGVvZiB0aGlzID09PSAnZnVuY3Rpb24nID8gdGhpcyA6IE9ic2VydmFibGU7XG4gICAgICBpZiAoeCA9PSBudWxsKSB0aHJvdyBuZXcgVHlwZUVycm9yKHggKyAnIGlzIG5vdCBhbiBvYmplY3QnKTtcbiAgICAgIGxldCBtZXRob2QgPSBnZXRNZXRob2QoeCwgU3ltYm9sT2JzZXJ2YWJsZSk7XG5cbiAgICAgIGlmIChtZXRob2QpIHtcbiAgICAgICAgbGV0IG9ic2VydmFibGUgPSBtZXRob2QuY2FsbCh4KTtcbiAgICAgICAgaWYgKE9iamVjdChvYnNlcnZhYmxlKSAhPT0gb2JzZXJ2YWJsZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihvYnNlcnZhYmxlICsgJyBpcyBub3QgYW4gb2JqZWN0Jyk7XG4gICAgICAgIGlmIChpc09ic2VydmFibGUob2JzZXJ2YWJsZSkgJiYgb2JzZXJ2YWJsZS5jb25zdHJ1Y3RvciA9PT0gQykgcmV0dXJuIG9ic2VydmFibGU7XG4gICAgICAgIHJldHVybiBuZXcgQyhvYnNlcnZlciA9PiBvYnNlcnZhYmxlLnN1YnNjcmliZShvYnNlcnZlcikpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaGFzU3ltYm9sKCdpdGVyYXRvcicpKSB7XG4gICAgICAgIG1ldGhvZCA9IGdldE1ldGhvZCh4LCBTeW1ib2xJdGVyYXRvcik7XG5cbiAgICAgICAgaWYgKG1ldGhvZCkge1xuICAgICAgICAgIHJldHVybiBuZXcgQyhvYnNlcnZlciA9PiB7XG4gICAgICAgICAgICBlbnF1ZXVlKCgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKG9ic2VydmVyLmNsb3NlZCkgcmV0dXJuO1xuXG4gICAgICAgICAgICAgIGZvciAobGV0IGl0ZW0gb2YgbWV0aG9kLmNhbGwoeCkpIHtcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KGl0ZW0pO1xuICAgICAgICAgICAgICAgIGlmIChvYnNlcnZlci5jbG9zZWQpIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh4KSkge1xuICAgICAgICByZXR1cm4gbmV3IEMob2JzZXJ2ZXIgPT4ge1xuICAgICAgICAgIGVucXVldWUoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKG9ic2VydmVyLmNsb3NlZCkgcmV0dXJuO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHgubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCh4W2ldKTtcbiAgICAgICAgICAgICAgaWYgKG9ic2VydmVyLmNsb3NlZCkgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcih4ICsgJyBpcyBub3Qgb2JzZXJ2YWJsZScpO1xuICAgIH1cblxuICAgIHN0YXRpYyBvZiguLi5pdGVtcykge1xuICAgICAgbGV0IEMgPSB0eXBlb2YgdGhpcyA9PT0gJ2Z1bmN0aW9uJyA/IHRoaXMgOiBPYnNlcnZhYmxlO1xuICAgICAgcmV0dXJuIG5ldyBDKG9ic2VydmVyID0+IHtcbiAgICAgICAgZW5xdWV1ZSgoKSA9PiB7XG4gICAgICAgICAgaWYgKG9ic2VydmVyLmNsb3NlZCkgcmV0dXJuO1xuXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChpdGVtc1tpXSk7XG4gICAgICAgICAgICBpZiAob2JzZXJ2ZXIuY2xvc2VkKSByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0IFtTeW1ib2xTcGVjaWVzXSgpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICB9O1xuXG4gIE9ic2VydmFibGUkMi5PYnNlcnZhYmxlID0gT2JzZXJ2YWJsZSQxO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoT2JzZXJ2YWJsZSQxLCBTeW1ib2woJ2V4dGVuc2lvbnMnKSwge1xuICAgIHZhbHVlOiB7XG4gICAgICBzeW1ib2w6IFN5bWJvbE9ic2VydmFibGUsXG4gICAgICBob3N0UmVwb3J0RXJyb3JcbiAgICB9LFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcblxuICB2YXIgemVuT2JzZXJ2YWJsZSA9IE9ic2VydmFibGUkMi5PYnNlcnZhYmxlO1xuXG4gIGNvbnN0IE9ic2VydmFibGUgPSAvKkBfX1BVUkVfXyovZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMoemVuT2JzZXJ2YWJsZSk7XG5cbiAgY29uc3QgeyBsb2dfXywgZXJyX18gfSA9IGNyZWF0ZU9qc0Zsb3dMb2dnZXJzKFwiaW5pdC1mbG93c1wiKTtcbiAgY29uc3QgZ2V0T2pzSW5pdFJlc3VsdHNEZWJ1Z09iamVjdCA9ICgpID0+IHtcbiAgICBpZiAoIShcIm9qc19pbml0X3Jlc3VsdHNcIiBpbiB3aW5kb3cpKSB7XG4gICAgICB3aW5kb3dbXCJvanNfaW5pdF9yZXN1bHRzXCJdID0ge307XG4gICAgfVxuICAgIHJldHVybiB3aW5kb3dbXCJvanNfaW5pdF9yZXN1bHRzXCJdO1xuICB9O1xuICBjb25zdCBpbml0aWFsaXplT2pzRmxvd3MgPSAoY29udGV4dCwgZmxvd0NhbGxiYWNrcykgPT4ge1xuICAgIGNvbnN0IGluaXRQYXJhbXMgPSB7IGNvbnRleHQsIGZsb3dDYWxsYmFja3MgfTtcbiAgICBjb25zb2xlLmxvZyhcIltPSlNdIGluaXRpYWxpemluZyBPSlMgZmxvd3MuLi5cIik7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIFN0cmlwZSBQUlxuICAgICAgc3RyaXBlUFI6IHJ1bkluaXRGbG93QXNPYnNlcnZhYmxlKFwic3RyaXBlUFJcIiwgT2pzRmxvd3Muc3RyaXBlUFIuaW5pdChpbml0UGFyYW1zKSksXG4gICAgICAvLyBTdHJpcGUgTGlua1xuICAgICAgc3RyaXBlTGluazogcnVuSW5pdEZsb3dBc09ic2VydmFibGUoXCJzdHJpcGVMaW5rXCIsIE9qc0Zsb3dzLnN0cmlwZUxpbmsuaW5pdChpbml0UGFyYW1zKSlcbiAgICAgIC8vIPCfkYkgQWRkIGluaXRpYWxpemF0aW9uIGZsb3dzIGhlcmVcbiAgICB9O1xuICB9O1xuICBjb25zdCBydW5Jbml0Rmxvd0FzT2JzZXJ2YWJsZSA9IChmbG93TmFtZSwgaW5pdEZsb3cpID0+IHtcbiAgICBjb25zdCBvYnNlcnZhYmxlID0gbmV3IE9ic2VydmFibGUoKG9ic2VydmVyKSA9PiB7XG4gICAgICBvYnNlcnZlci5uZXh0KHsgc3RhdHVzOiBcImxvYWRpbmdcIiB9KTtcbiAgICAgIGluaXRGbG93LnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICBvYnNlcnZlci5uZXh0KHsgc3RhdHVzOiBcImxvYWRlZFwiLCByZXN1bHQgfSk7XG4gICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgb2JzZXJ2ZXIubmV4dCh7IHN0YXR1czogXCJlcnJvclwiLCBtZXNzYWdlOiBlcnJvci5tZXNzYWdlIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgb2JzZXJ2YWJsZS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlc3VsdCkgPT4ge1xuICAgICAgICBsb2dfXyhgJHtmbG93TmFtZX0gZmxvdyByZXN1bHRgLCByZXN1bHQpO1xuICAgICAgICBnZXRPanNJbml0UmVzdWx0c0RlYnVnT2JqZWN0KClbZmxvd05hbWVdID0gcmVzdWx0O1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgZXJyX18oYCR7Zmxvd05hbWV9IGZsb3cgaW5pdGlhbGl6YXRpb24gZXJyb3I6XG4ke0pTT04uc3RyaW5naWZ5KGVycm9yKX1gKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG9ic2VydmFibGU7XG4gIH07XG5cbiAgY29uc3QgUFJfTE9BRElORyA9IHtcbiAgICBpc0xvYWRpbmc6IHRydWUsXG4gICAgaXNBdmFpbGFibGU6IGZhbHNlLFxuICAgIHN0YXJ0RmxvdzogYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgc3RhcnRGbG93IHRyaWdnZXJlZCB3aGlsZSBwYXltZW50IHJlcXVlc3QgaXMgc3RpbGwgbm90IHJlYWR5LiBcbiAgICAgIFlvdSBjYW4gY2hlY2sgdGhlIFwiLmlzTG9hZGluZ1wiIHBhcmFtIHRvIGtub3cgd2hlbiBhIHBheW1lbnQgcmVxdWVzdCBpcyBzdGlsbCBsb2FkaW5nLCBcbiAgICAgIGFuZCBcIi5pc0F2YWlsYWJsZVwiIHRvIGtub3cgaWYgYSBwYXltZW50IHJlcXVlc3QgaXMgYXZhaWxhYmxlLmBcbiAgICAgICk7XG4gICAgfVxuICB9O1xuICBjb25zdCBQUl9FUlJPUiA9IHtcbiAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgIGlzQXZhaWxhYmxlOiBmYWxzZSxcbiAgICBzdGFydEZsb3c6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYHN0YXJ0RmxvdyB0cmlnZ2VyZWQgd2hlbiBwYXltZW50IHJlcXVlc3QgaXMgbm90IGF2YWlsYWJsZS5gKTtcbiAgICB9XG4gIH07XG5cbiAgY2xhc3MgT3BlblBheUZvcm1FdmVudEhhbmRsZXIge1xuICAgIGNvbnN0cnVjdG9yKGZvcm1JbnN0YW5jZSkge1xuICAgICAgdGhpcy5mb3JtSW5zdGFuY2UgPSBmb3JtSW5zdGFuY2U7XG4gICAgICB0aGlzLmNvbmZpZyA9IGZvcm1JbnN0YW5jZS5jb25maWc7XG4gICAgICB0aGlzLmZvcm1JZCA9IGZvcm1JbnN0YW5jZS5mb3JtSWQ7XG4gICAgICB0aGlzLmV2ZW50VGFyZ2V0cyA9IHt9O1xuICAgICAgdGhpcy5ub25jZXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICAgIH1cbiAgICBoYW5kbGVNZXNzYWdlKGV2ZW50KSB7XG4gICAgICBpZiAoIWV2ZW50LnNvdXJjZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHNvdXJjZSBmb3VuZGApO1xuICAgICAgfVxuICAgICAgaWYgKGV2ZW50Lm9yaWdpbiAhPT0gdGhpcy5mb3JtSW5zdGFuY2UuY29uZmlnLl9mcmFtZVVybD8ub3JpZ2luKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgZXZlbnQuZGF0YSA9PT0gXCJvYmplY3RcIiAmJiBldmVudC5kYXRhW1wicGVucGFsXCJdKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IHBhcnNlRXZlbnRQYXlsb2FkKEpTT04ucGFyc2UoZXZlbnQuZGF0YSkpO1xuICAgICAgY29uc3QgaXNWYWxpZCA9IHRoaXMudmFsaWRhdGVFdmVudChldmVudERhdGEpO1xuICAgICAgaWYgKCFpc1ZhbGlkKSByZXR1cm47XG4gICAgICBjb25zdCB7IGVsZW1lbnRJZCwgcGF5bG9hZCB9ID0gZXZlbnREYXRhO1xuICAgICAgY29uc3QgZXZlbnRUeXBlID0gcGF5bG9hZC50eXBlO1xuICAgICAgc3dpdGNoIChldmVudFR5cGUpIHtcbiAgICAgICAgY2FzZSBcIkxBWU9VVFwiOlxuICAgICAgICAgIHRoaXMuaGFuZGxlTGF5b3V0RXZlbnQocGF5bG9hZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJGT0NVU1wiOlxuICAgICAgICAgIHRoaXMuaGFuZGxlRm9jdXNFdmVudChlbGVtZW50SWQsIHBheWxvYWQuZWxlbWVudFR5cGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiQkxVUlwiOlxuICAgICAgICAgIHRoaXMuaGFuZGxlQmx1ckV2ZW50KGVsZW1lbnRJZCwgcGF5bG9hZC5lbGVtZW50VHlwZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJDSEFOR0VcIjpcbiAgICAgICAgICB0aGlzLmhhbmRsZUNoYW5nZUV2ZW50KGVsZW1lbnRJZCwgcGF5bG9hZC5lbGVtZW50VHlwZSwgcGF5bG9hZC5lcnJvcnMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiTE9BREVEXCI6XG4gICAgICAgICAgdGhpcy5oYW5kbGVMb2FkZWRFdmVudChldmVudC5zb3VyY2UsIGVsZW1lbnRJZCwgcGF5bG9hZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJMT0FEX0VSUk9SXCI6XG4gICAgICAgICAgdGhpcy5oYW5kbGVMb2FkRXJyb3JFdmVudChwYXlsb2FkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIlZBTElEQVRJT05fRVJST1JcIjpcbiAgICAgICAgICB0aGlzLmhhbmRsZVZhbGlkYXRpb25FcnJvckV2ZW50KHBheWxvYWQsIGVsZW1lbnRJZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgY29uc29sZS53YXJuKFwiW2Zvcm1dIFVuaGFuZGxlZCBldmVudCB0eXBlOlwiLCBldmVudFR5cGUpO1xuICAgICAgfVxuICAgIH1cbiAgICB2YWxpZGF0ZUV2ZW50KGV2ZW50RGF0YSkge1xuICAgICAgaWYgKGV2ZW50RGF0YS5mb3JtSWQgIT09IHRoaXMuZm9ybUluc3RhbmNlLmZvcm1JZCB8fCAhZXZlbnREYXRhLmVsZW1lbnRJZCkge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJbZm9ybV0gSWdub3JpbmcgdW5rbm93biBldmVudDpcIiwgZXZlbnREYXRhKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMubm9uY2VzLmhhcyhldmVudERhdGEubm9uY2UpKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcIltmb3JtXSBJZ25vcmluZyBkdXBsaWNhdGUgZXZlbnQ6XCIsIGV2ZW50RGF0YSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHRoaXMubm9uY2VzLmFkZChldmVudERhdGEubm9uY2UpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGhhbmRsZUxheW91dEV2ZW50KHBheWxvYWQpIHtcbiAgICAgIGNvbnN0IGhlaWdodCA9IHBheWxvYWQuaGVpZ2h0ID8gYCR7cGF5bG9hZC5oZWlnaHR9cHhgIDogXCIxMDAlXCI7XG4gICAgICB0aGlzLmZvcm1JbnN0YW5jZS5zZXRGb3JtSGVpZ2h0KGhlaWdodCk7XG4gICAgfVxuICAgIGhhbmRsZUZvY3VzRXZlbnQoZWxlbWVudElkLCBmaWVsZCkge1xuICAgICAgaWYgKHRoaXMuY29uZmlnLm9uRm9jdXMpIHRoaXMuY29uZmlnLm9uRm9jdXMoZWxlbWVudElkLCBmaWVsZCk7XG4gICAgfVxuICAgIGhhbmRsZUJsdXJFdmVudChlbGVtZW50SWQsIGZpZWxkKSB7XG4gICAgICBpZiAodGhpcy5jb25maWcub25CbHVyKSB0aGlzLmNvbmZpZy5vbkJsdXIoZWxlbWVudElkLCBmaWVsZCk7XG4gICAgfVxuICAgIGhhbmRsZUNoYW5nZUV2ZW50KGVsZW1lbnRJZCwgZmllbGQsIGVycm9ycykge1xuICAgICAgaWYgKHRoaXMuY29uZmlnLm9uQ2hhbmdlKSB0aGlzLmNvbmZpZy5vbkNoYW5nZShlbGVtZW50SWQsIGZpZWxkLCBlcnJvcnMpO1xuICAgIH1cbiAgICBhc3luYyBoYW5kbGVMb2FkZWRFdmVudChzb3VyY2UsIGVsZW1lbnRJZCwgcGF5bG9hZCkge1xuICAgICAgY29uc29sZS5sb2coXCJoYW5kbGVMb2FkZWRFdmVudCBpcyBkZXByZWNhdGVkOlwiLCBzb3VyY2UsIGVsZW1lbnRJZCwgcGF5bG9hZCk7XG4gICAgICB0aGlzLmV2ZW50VGFyZ2V0c1tlbGVtZW50SWRdID0gc291cmNlO1xuICAgICAgdGhpcy5mb3JtSW5zdGFuY2Uub25DZGVMb2FkZWQocGF5bG9hZCk7XG4gICAgICBpZiAodGhpcy5jb25maWcub25Mb2FkKSB7XG4gICAgICAgIHRoaXMuY29uZmlnLm9uTG9hZChwYXlsb2FkLnRvdGFsQW1vdW50QXRvbXMsIHBheWxvYWQuY3VycmVuY3kpO1xuICAgICAgfVxuICAgIH1cbiAgICBoYW5kbGVMb2FkRXJyb3JFdmVudChwYXlsb2FkKSB7XG4gICAgICBpZiAodGhpcy5mb3JtSW5zdGFuY2UuY29uZmlnLm9uTG9hZEVycm9yKSB0aGlzLmZvcm1JbnN0YW5jZS5jb25maWcub25Mb2FkRXJyb3IocGF5bG9hZC5tZXNzYWdlKTtcbiAgICB9XG4gICAgaGFuZGxlVmFsaWRhdGlvbkVycm9yRXZlbnQocGF5bG9hZCwgZWxlbWVudElkKSB7XG4gICAgICBpZiAodGhpcy5mb3JtSW5zdGFuY2UuY29uZmlnLm9uVmFsaWRhdGlvbkVycm9yKSB7XG4gICAgICAgIHRoaXMuZm9ybUluc3RhbmNlLmNvbmZpZy5vblZhbGlkYXRpb25FcnJvcihwYXlsb2FkLmVsZW1lbnRUeXBlLCBwYXlsb2FkLmVycm9ycywgZWxlbWVudElkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gYXN5bmMgaGFuZGxlRXJyb3JFdmVudChwYXlsb2FkOiBFcnJvckV2ZW50UGF5bG9hZCkge1xuICAgIC8vICAgaWYgKHBheWxvYWQubWVzc2FnZSA9PT0gJzNEU19SRVFVSVJFRCcpIHtcbiAgICAvLyAgICAgY29uc3QgdGhyZWVEU1VybCA9IHBheWxvYWQuaGVhZGVycz8uWyd4LTNkcy1hdXRoLXVybCddID8/IFNJTVVMQVRFXzNEU19VUkw7XG4gICAgLy8gICAgIC8vIFRoaXMgd2lsbCBvcGVuIGEgcG9wdXAgYW5kIHByb2Nlc3MgdGhlIDNEUyBmbG93XG4gICAgLy8gICAgIC8vIHdpbGwgcmV0dXJuIGEgc3RhdHVzIGBzdWNjZXNzYCB8IGBmYWlsdXJlYCB8IGBjYW5jZWxsZWRgIHdoaWNoIHdlIGNhbiBjb250aW51ZSB3aXRoXG4gICAgLy8gICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IHN0YXJ0M2RzVmVyaWZpY2F0aW9uKHsgdXJsOiB0aHJlZURTVXJsLCBiYXNlVXJsOiB0aGlzLmNvbmZpZy5iYXNlVXJsISB9KTtcbiAgICAvLyAgICAgY29uc29sZS5sb2coJ/CflJAgM0RTIHN0YXR1czonLCBzdGF0dXMpO1xuICAgIC8vICAgICAvLyBUT0RPOiBjb250aW51ZSB3aXRoIHN0YXR1c1xuICAgIC8vICAgICBjb25zdCBjYXJkQ3BtID0gdGhpcy5mb3JtSW5zdGFuY2UuY2hlY2tvdXRQYXltZW50TWV0aG9kcz8uZmluZCgoY3BtKSA9PiBjcG0ucHJvdmlkZXIgPT09ICdjcmVkaXRfY2FyZCcpO1xuICAgIC8vICAgICBpZiAoIXRoaXMuZm9ybUluc3RhbmNlLnNlc3Npb25JZCB8fCAhdGhpcy5mb3JtSW5zdGFuY2UuZm9ybVRhcmdldCB8fCAhdGhpcy5jb25maWcub25WYWxpZGF0aW9uRXJyb3IgfHwgIWNhcmRDcG0pXG4gICAgLy8gICAgICAgcmV0dXJuO1xuICAgIC8vICAgICBmb3IgKGNvbnN0IFtlbGVtZW50SWQsIHRhcmdldF0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5ldmVudFRhcmdldHMpKSB7XG4gICAgLy8gICAgICAgaWYgKCF0YXJnZXQpIGNvbnRpbnVlO1xuICAgIC8vICAgICAgIGNvbnN0IHN0YXJ0UGF5bWVudEZsb3dFdmVudCA9IGNvbnN0cnVjdFN1Ym1pdEV2ZW50UGF5bG9hZChcbiAgICAvLyAgICAgICAgIEV2ZW50VHlwZS5lbnVtLlNUQVJUX1BBWU1FTlRfRkxPVyxcbiAgICAvLyAgICAgICAgIHRoaXMuZm9ybUluc3RhbmNlLnNlc3Npb25JZCxcbiAgICAvLyAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy5mb3JtSW5zdGFuY2UuZm9ybVRhcmdldCkgPz8gZG9jdW1lbnQuYm9keSxcbiAgICAvLyAgICAgICAgIHRoaXMuY29uZmlnLm9uVmFsaWRhdGlvbkVycm9yLFxuICAgIC8vICAgICAgICAgeyAuLi5jYXJkQ3BtLCBwcm9jZXNzb3JfbmFtZTogJ3N0cmlwZScgfSxcbiAgICAvLyAgICAgICAgIGZhbHNlXG4gICAgLy8gICAgICAgKTtcbiAgICAvLyAgICAgICBpZiAoIXN0YXJ0UGF5bWVudEZsb3dFdmVudCkgY29udGludWU7XG4gICAgLy8gICAgICAgdGhpcy5mb3JtSW5zdGFuY2UuY2hlY2tvdXRGaXJlZCA9IHRydWU7XG4gICAgLy8gICAgICAgdGhpcy50b2tlbml6ZWREYXRhID0gc3RhcnRQYXltZW50Rmxvd0V2ZW50O1xuICAgIC8vICAgICAgIHRoaXMucG9zdEV2ZW50VG9GcmFtZSh0YXJnZXQsIGVsZW1lbnRJZCwgc3RhcnRQYXltZW50Rmxvd0V2ZW50KTtcbiAgICAvLyAgICAgICBicmVhaztcbiAgICAvLyAgICAgfVxuICAgIC8vICAgfSBlbHNlIHtcbiAgICAvLyAgICAgdGhpcy5mb3JtSW5zdGFuY2UuY2hlY2tvdXRGaXJlZCA9IGZhbHNlO1xuICAgIC8vICAgICBpZiAodGhpcy5mb3JtSW5zdGFuY2UuY29uZmlnLm9uQ2hlY2tvdXRFcnJvcikgdGhpcy5mb3JtSW5zdGFuY2UuY29uZmlnLm9uQ2hlY2tvdXRFcnJvcihwYXlsb2FkLm1lc3NhZ2UpO1xuICAgIC8vICAgfVxuICAgIC8vIH1cbiAgICAvLyBoYW5kbGVGb3JtU3VibWl0KCkge1xuICAgIC8vICAgaWYgKFxuICAgIC8vICAgICAhdGhpcy5mb3JtSW5zdGFuY2Uuc2Vzc2lvbklkIHx8XG4gICAgLy8gICAgICF0aGlzLmZvcm1JbnN0YW5jZS5jaGVja291dFBheW1lbnRNZXRob2RzPy5sZW5ndGggfHxcbiAgICAvLyAgICAgIXRoaXMuY29uZmlnLm9uVmFsaWRhdGlvbkVycm9yXG4gICAgLy8gICApIHtcbiAgICAvLyAgICAgcmV0dXJuO1xuICAgIC8vICAgfVxuICAgIC8vICAgY29uc3QgY2FyZENwbSA9IHRoaXMuZm9ybUluc3RhbmNlLmNoZWNrb3V0UGF5bWVudE1ldGhvZHMuZmluZCgoY3BtKSA9PiBjcG0ucHJvdmlkZXIgPT09ICdjcmVkaXRfY2FyZCcpO1xuICAgIC8vICAgaWYgKCFjYXJkQ3BtKSB7XG4gICAgLy8gICAgIHRocm93IG5ldyBFcnJvcignQ2FyZCBub3QgYXZhaWxhYmxlIGFzIGEgcGF5bWVudCBtZXRob2QgaW4gY2hlY2tvdXQnKTtcbiAgICAvLyAgIH1cbiAgICAvLyAgIGNvbnN0IHRva2VuaXplRGF0YSA9IGNvbnN0cnVjdFN1Ym1pdEV2ZW50UGF5bG9hZChcbiAgICAvLyAgICAgRXZlbnRUeXBlLmVudW0uVE9LRU5JWkUsXG4gICAgLy8gICAgIHRoaXMuZm9ybUluc3RhbmNlLnNlc3Npb25JZCEsXG4gICAgLy8gICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy5mb3JtSW5zdGFuY2UuZm9ybVRhcmdldCkgPz8gZG9jdW1lbnQuYm9keSxcbiAgICAvLyAgICAgdGhpcy5jb25maWcub25WYWxpZGF0aW9uRXJyb3IsXG4gICAgLy8gICAgIGNhcmRDcG0sXG4gICAgLy8gICAgIGZhbHNlXG4gICAgLy8gICApO1xuICAgIC8vICAgaWYgKCF0b2tlbml6ZURhdGEpIHtcbiAgICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKCdFcnJvciBjb25zdHJ1Y3RpbmcgdG9rZW5pemUgZGF0YScpO1xuICAgIC8vICAgfVxuICAgIC8vICAgZm9yIChjb25zdCBbZWxlbWVudElkLCB0YXJnZXRdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuZXZlbnRUYXJnZXRzKSkge1xuICAgIC8vICAgICBpZiAoIXRhcmdldCkgY29udGludWU7XG4gICAgLy8gICAgIHRoaXMucG9zdEV2ZW50VG9GcmFtZSh0YXJnZXQsIGVsZW1lbnRJZCwgdG9rZW5pemVEYXRhKTtcbiAgICAvLyAgIH1cbiAgICAvLyAgIHRoaXMudG9rZW5pemVkRGF0YSA9IHRva2VuaXplRGF0YTtcbiAgICAvLyB9XG4gICAgLy8gYXN5bmMgb25Vc2VyQ29tcGxldGVQYXltZW50UmVxdWVzdFVJKFxuICAgIC8vICAgc3RyaXBlUG06IFBheW1lbnRSZXF1ZXN0UGF5bWVudE1ldGhvZEV2ZW50LFxuICAgIC8vICAgY2hlY2tvdXRQYXltZW50TWV0aG9kOiBDaGVja291dFBheW1lbnRNZXRob2RcbiAgICAvLyApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyAgIGlmICghdGhpcy5jb25maWcub25WYWxpZGF0aW9uRXJyb3IgfHwgIXRoaXMuZm9ybUluc3RhbmNlLnNlc3Npb25JZCB8fCAhdGhpcy5mb3JtSW5zdGFuY2UuY2hlY2tvdXRQYXltZW50TWV0aG9kcylcbiAgICAvLyAgICAgcmV0dXJuO1xuICAgIC8vICAgZm9yIChjb25zdCBbZWxlbWVudElkLCBlbGVtZW50XSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmV2ZW50VGFyZ2V0cyA/PyB7fSkpIHtcbiAgICAvLyAgICAgY29uc3QgcGF5bWVudEZsb3dNZXRhZGF0YSA9IHsgc3RyaXBlUG1JZDogc3RyaXBlUG0ucGF5bWVudE1ldGhvZC5pZCB9O1xuICAgIC8vICAgICBjb25zdCBzdGFydFBheW1lbnRGbG93RXZlbnQgPSBjb25zdHJ1Y3RTdWJtaXRFdmVudFBheWxvYWQoXG4gICAgLy8gICAgICAgRXZlbnRUeXBlLmVudW0uU1RBUlRfUEFZTUVOVF9GTE9XLFxuICAgIC8vICAgICAgIHRoaXMuZm9ybUluc3RhbmNlLnNlc3Npb25JZCxcbiAgICAvLyAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMuZm9ybUluc3RhbmNlLmZvcm1UYXJnZXQpID8/IGRvY3VtZW50LmJvZHksXG4gICAgLy8gICAgICAgdGhpcy5jb25maWcub25WYWxpZGF0aW9uRXJyb3IsXG4gICAgLy8gICAgICAgY2hlY2tvdXRQYXltZW50TWV0aG9kLFxuICAgIC8vICAgICAgIGZhbHNlLFxuICAgIC8vICAgICAgIHBheW1lbnRGbG93TWV0YWRhdGFcbiAgICAvLyAgICAgKTtcbiAgICAvLyAgICAgaWYgKCFzdGFydFBheW1lbnRGbG93RXZlbnQpIGNvbnRpbnVlO1xuICAgIC8vICAgICB0aGlzLnN0cmlwZVBtID0gc3RyaXBlUG07XG4gICAgLy8gICAgIHRoaXMuZm9ybUluc3RhbmNlLmNoZWNrb3V0RmlyZWQgPSB0cnVlO1xuICAgIC8vICAgICB0aGlzLnNldFRva2VuaXplZERhdGEoc3RhcnRQYXltZW50Rmxvd0V2ZW50KTtcbiAgICAvLyAgICAgdGhpcy5wb3N0RXZlbnRUb0ZyYW1lKGVsZW1lbnQsIGVsZW1lbnRJZCwgc3RhcnRQYXltZW50Rmxvd0V2ZW50KTtcbiAgICAvLyAgICAgLy8gZW1pdEV2ZW50KGVsZW1lbnQubm9kZS5jb250ZW50V2luZG93ISwgdGhpcy5mb3JtSWQsIGVsZW1lbnRJZCwgc3RhcnRQYXltZW50Rmxvd0V2ZW50LCB0aGlzLmNvbmZpZy5iYXNlVXJsISk7XG4gICAgLy8gICAgIGJyZWFrO1xuICAgIC8vICAgfVxuICAgIC8vIH1cbiAgICBwb3N0RXZlbnRUb0ZyYW1lKHNvdXJjZSwgZWxlbWVudElkLCBkYXRhKSB7XG4gICAgICBlbWl0RXZlbnQoc291cmNlLCB0aGlzLmZvcm1JZCwgZWxlbWVudElkLCBkYXRhLCB0aGlzLmNvbmZpZy5iYXNlVXJsKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBjcmVhdGVDb25uZWN0aW9uKGlmcmFtZSwgY2hpbGRPcmlnaW4pIHtcbiAgICBjb25zdCBjb25uZWN0aW9uID0gcGVucGFsLmNvbm5lY3RUb0NoaWxkKHtcbiAgICAgIGlmcmFtZSxcbiAgICAgIGRlYnVnOiBmYWxzZSxcbiAgICAgIGNoaWxkT3JpZ2luXG4gICAgfSk7XG4gICAgY29uc3QgY29ubmVjdGlvbk9iaiA9IGF3YWl0IGNvbm5lY3Rpb24ucHJvbWlzZTtcbiAgICBjb25zdCBpc1ZhbGlkT2JqZWN0ID0gYXdhaXQgY2hlY2tJZlZhbGlkQ2RlQ29ubmVjdGlvbk9iamVjdChjb25uZWN0aW9uT2JqKTtcbiAgICBpZiAoIWlzUmVzdWx0VmFsaWQoY29ubmVjdGlvbk9iaiwgaXNWYWxpZE9iamVjdCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgR290IGludmFsaWQgQ0RFIGNvbm5lY3Rpb24gb2JqZWN0YCk7XG4gICAgfVxuICAgIHJldHVybiBjb25uZWN0aW9uT2JqO1xuICB9XG4gIGNsYXNzIENvbm5lY3Rpb25NYW5hZ2VyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgIHRoaXMuY29ubmVjdGlvbnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICAgIH1cbiAgICBhZGRDb25uZWN0aW9uKGlkLCBjb25uZWN0aW9uKSB7XG4gICAgICB0aGlzLmNvbm5lY3Rpb25zLnNldChpZCwgY29ubmVjdGlvbik7XG4gICAgfVxuICAgIGdldENvbm5lY3Rpb24oKSB7XG4gICAgICBjb25zdCBjb25uZWN0aW9uID0gdGhpcy5jb25uZWN0aW9ucy52YWx1ZXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICBpZiAoIWNvbm5lY3Rpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29ubmVjdGlvbiBub3QgZm91bmRcIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29ubmVjdGlvbjtcbiAgICB9XG4gICAgZ2V0QWxsQ29ubmVjdGlvbnMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9ucztcbiAgICB9XG4gIH1cblxuICBjbGFzcyBPcGVuUGF5Rm9ybSB7XG4gICAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgICB0aGlzLnRyeUluaXRPanNGbG93cyA9ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMub2pzRmxvd3NJbml0aWFsaXphdGlvbiAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuY2RlTG9hZGVkUGF5bG9hZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uTWFuYWdlci5nZXRBbGxDb25uZWN0aW9ucygpLnNpemUgPT09IDApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vanNGbG93c0luaXRpYWxpemF0aW9uID0gaW5pdGlhbGl6ZU9qc0Zsb3dzKHRoaXMuY3JlYXRlT2pzRmxvd0NvbnRleHQoKSwgdGhpcy5jcmVhdGVPanNGbG93Q2FsbGJhY2tzKCkpO1xuICAgICAgICB0aGlzLm9qc0Zsb3dzSW5pdGlhbGl6YXRpb24uc3RyaXBlUFIuc3Vic2NyaWJlKChzdGF0dXMpID0+IHRoaXMub25TdHJpcGVQUlN0YXR1c0NoYW5nZShzdGF0dXMpKTtcbiAgICAgIH07XG4gICAgICB0aGlzLm9uQ2RlTG9hZGVkID0gKHBheWxvYWQpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY2RlTG9hZGVkUGF5bG9hZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNkZUxvYWRlZFBheWxvYWQgPSBwYXlsb2FkO1xuICAgICAgICB0aGlzLnRyeUluaXRPanNGbG93cygpO1xuICAgICAgfTtcbiAgICAgIHRoaXMub25TdHJpcGVQUlN0YXR1c0NoYW5nZSA9IChpbml0U3RhdHVzKSA9PiB7XG4gICAgICAgIGlmIChpbml0U3RhdHVzLnN0YXR1cyA9PT0gXCJsb2FkaW5nXCIpIHtcbiAgICAgICAgICB0aGlzLmNvbmZpZy5vblBheW1lbnRSZXF1ZXN0TG9hZD8uKHsgYXBwbGVfcGF5OiBQUl9MT0FESU5HLCBnb29nbGVfcGF5OiBQUl9MT0FESU5HIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKGluaXRTdGF0dXMuc3RhdHVzID09PSBcImVycm9yXCIpIHtcbiAgICAgICAgICB0aGlzLmNvbmZpZy5vblBheW1lbnRSZXF1ZXN0TG9hZD8uKHsgYXBwbGVfcGF5OiBQUl9FUlJPUiwgZ29vZ2xlX3BheTogUFJfRVJST1IgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaW5pdFN0YXR1cy5zdGF0dXMgPT09IFwibG9hZGVkXCIpIHtcbiAgICAgICAgICBjb25zdCBpbml0UmVzdWx0ID0gaW5pdFN0YXR1cy5yZXN1bHQ7XG4gICAgICAgICAgY29uc3QgY2FuQXBwbGVQYXkgPSBpbml0UmVzdWx0LmlzQXZhaWxhYmxlICYmIGluaXRSZXN1bHQuYXZhaWxhYmxlUHJvdmlkZXJzLmFwcGxlUGF5O1xuICAgICAgICAgIGNvbnN0IGNhbkdvb2dsZVBheSA9IGluaXRSZXN1bHQuaXNBdmFpbGFibGUgJiYgaW5pdFJlc3VsdC5hdmFpbGFibGVQcm92aWRlcnMuZ29vZ2xlUGF5O1xuICAgICAgICAgIHRoaXMuY29uZmlnLm9uUGF5bWVudFJlcXVlc3RMb2FkPy4oe1xuICAgICAgICAgICAgYXBwbGVfcGF5OiB7XG4gICAgICAgICAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgICAgIGlzQXZhaWxhYmxlOiBjYW5BcHBsZVBheSxcbiAgICAgICAgICAgICAgc3RhcnRGbG93OiBhc3luYyAodXNlclBhcmFtcykgPT4gY2FuQXBwbGVQYXkgPyB0aGlzLnN1Ym1pdFBheW1lbnRSZXF1ZXN0KFwiYXBwbGVfcGF5XCIsIGluaXRSZXN1bHQsIHVzZXJQYXJhbXMpIDogdm9pZCAwXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ29vZ2xlX3BheToge1xuICAgICAgICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgICAgICAgICBpc0F2YWlsYWJsZTogY2FuR29vZ2xlUGF5LFxuICAgICAgICAgICAgICBzdGFydEZsb3c6IGFzeW5jICh1c2VyUGFyYW1zKSA9PiBjYW5Hb29nbGVQYXkgPyB0aGlzLnN1Ym1pdFBheW1lbnRSZXF1ZXN0KFwiZ29vZ2xlX3BheVwiLCBpbml0UmVzdWx0LCB1c2VyUGFyYW1zKSA6IHZvaWQgMFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgdGhpcy5zdWJtaXRQYXltZW50UmVxdWVzdCA9IChwcm92aWRlciwgaW5pdFJlc3VsdCwgcGFyYW1zKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmNyZWF0ZU9qc0Zsb3dDb250ZXh0KCk7XG4gICAgICAgIHJldHVybiBPanNGbG93cy5zdHJpcGVQUi5ydW4oe1xuICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgY2hlY2tvdXRQYXltZW50TWV0aG9kOiBmaW5kQ2hlY2tvdXRQYXltZW50TWV0aG9kU3RyaWN0KGNvbnRleHQuY2hlY2tvdXRQYXltZW50TWV0aG9kcywgcHJvdmlkZXIpLFxuICAgICAgICAgIG5vbkNkZUZvcm1JbnB1dHM6IGNyZWF0ZUlucHV0c0RpY3RGcm9tRm9ybShjb250ZXh0LmZvcm1EaXYpLFxuICAgICAgICAgIGZsb3dDYWxsYmFja3M6IHRoaXMuY3JlYXRlT2pzRmxvd0NhbGxiYWNrcygpLFxuICAgICAgICAgIGN1c3RvbVBhcmFtczogeyBwcm92aWRlciwgb3ZlcnJpZGVQYXltZW50UmVxdWVzdDogcGFyYW1zPy5vdmVycmlkZVBheW1lbnRSZXF1ZXN0IH0sXG4gICAgICAgICAgaW5pdFJlc3VsdFxuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgICBPcGVuUGF5Rm9ybS5hc3NpZ25Bc1NpbmdsZXRvbih0aGlzKTtcbiAgICAgIHRoaXMuY29uZmlnID0geyAuLi5jb25maWcsIGJhc2VVcmw6IGNvbmZpZy5iYXNlVXJsID8/IFwiaHR0cHM6Ly9jZGUuZ2V0b3BlbnBheS5jb21cIiB9O1xuICAgICAgdGhpcy5lbGVtZW50cyA9IG51bGw7XG4gICAgICB0aGlzLmZvcm1JZCA9IGBvcGpzLWZvcm0tJHt3aW5kb3cuY3J5cHRvLnJhbmRvbVVVSUQoKX1gO1xuICAgICAgdGhpcy5yZWZlcmVyID0gd2luZG93LmxvY2F0aW9uLm9yaWdpbjtcbiAgICAgIHRoaXMuZm9ybVRhcmdldCA9IGNvbmZpZy5mb3JtVGFyZ2V0ID8/IFwiYm9keVwiO1xuICAgICAgdGhpcy5mb3JtUHJvcGVydGllcyA9IHsgaGVpZ2h0OiBcIjFweFwiIH07XG4gICAgICB0aGlzLmNkZUxvYWRlZFBheWxvYWQgPSBudWxsO1xuICAgICAgdGhpcy5vanNGbG93c0luaXRpYWxpemF0aW9uID0gbnVsbDtcbiAgICAgIHRoaXMuY2hlY2tvdXRGaXJlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5jb25uZWN0aW9uTWFuYWdlciA9IG5ldyBDb25uZWN0aW9uTWFuYWdlcigpO1xuICAgICAgdGhpcy5ldmVudEhhbmRsZXIgPSBuZXcgT3BlblBheUZvcm1FdmVudEhhbmRsZXIodGhpcyk7XG4gICAgICB0aGlzLm9qc1ZlcnNpb24gPSBcIjAuMS4xMVwiO1xuICAgICAgdGhpcy5vanNSZWxlYXNlVmVyc2lvbiA9IFwiMC4xLjExLWFscGhhLjZlNGUzNjFcIjtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCB0aGlzLmV2ZW50SGFuZGxlci5oYW5kbGVNZXNzYWdlLmJpbmQodGhpcy5ldmVudEhhbmRsZXIpKTtcbiAgICB9XG4gICAgc3RhdGljIHtcbiAgICAgIHRoaXMub2pzRmxvd3MgPSBPanNGbG93cztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQXNzaWduIHRoZSBpbnN0YW5jZSB0byB0aGUgd2luZG93IGFzIGEgc2luZ2xldG9uXG4gICAgICogQHBhcmFtIGZvcm0gLSBUaGUgT3BlblBheUZvcm0gaW5zdGFuY2VcbiAgICAgKi9cbiAgICBzdGF0aWMgYXNzaWduQXNTaW5nbGV0b24oZm9ybSkge1xuICAgICAgaWYgKE9wZW5QYXlGb3JtLmdldEluc3RhbmNlKCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiT3BlblBheSBpbnN0YW5jZSBhbHJlYWR5IGV4aXN0cy4gT25seSBvbmUgaW5zdGFuY2UgaXMgYWxsb3dlZC5cIik7XG4gICAgICB9XG4gICAgICB3aW5kb3dbXCJvanNcIl0gPSBmb3JtO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiBPcGVuUGF5Rm9ybVxuICAgICAqIEByZXR1cm5zIFRoZSBPcGVuUGF5Rm9ybSBpbnN0YW5jZVxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRJbnN0YW5jZSgpIHtcbiAgICAgIHJldHVybiB3aW5kb3dbXCJvanNcIl0gPz8gbnVsbDtcbiAgICB9XG4gICAgZ2V0Q29ubmVjdGlvbk1hbmFnZXIoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uTWFuYWdlcjtcbiAgICB9XG4gICAgc2V0Rm9ybUhlaWdodChoZWlnaHQpIHtcbiAgICAgIHRoaXMuZm9ybVByb3BlcnRpZXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgaWYgKHRoaXMuZWxlbWVudHMpIHtcbiAgICAgICAgT2JqZWN0LnZhbHVlcyh0aGlzLmVsZW1lbnRzKS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgZWxlbWVudC5ub2RlLnN0eWxlLmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNyZWF0ZUVsZW1lbnQoZWxlbWVudFZhbHVlLCBvcHRpb25zID0ge30pIHtcbiAgICAgIGlmICghdGhpcy5jb25maWcpIHRocm93IG5ldyBFcnJvcihcIk9wZW5QYXkgZm9ybSBub3QgaW5pdGlhbGl6ZWRcIik7XG4gICAgICBjb25zdCB0eXBlID0gRWxlbWVudFR5cGUucGFyc2UoZWxlbWVudFZhbHVlKTtcbiAgICAgIGNvbnN0IGZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlmcmFtZVwiKTtcbiAgICAgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gdGhpcy5idWlsZFF1ZXJ5U3RyaW5nKG9wdGlvbnMpO1xuICAgICAgZnJhbWUubmFtZSA9IGAke3R5cGV9LWVsZW1lbnRgO1xuICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChgL2FwcC92MS8ke2ZyYW1lLm5hbWV9YCwgdGhpcy5jb25maWcuYmFzZVVybCk7XG4gICAgICB1cmwuc2VhcmNoID0gcXVlcnlTdHJpbmcudG9TdHJpbmcoKTtcbiAgICAgIGZyYW1lLnNyYyA9IHVybC5ocmVmO1xuICAgICAgdGhpcy5jb25maWcuX2ZyYW1lVXJsID0gdXJsO1xuICAgICAgZnJhbWUuc3R5bGUuYm9yZGVyID0gXCJub25lXCI7XG4gICAgICBmcmFtZS5zdHlsZS53aWR0aCA9IFwiMTAwJVwiO1xuICAgICAgY29uc3QgZWxlbWVudCA9IHtcbiAgICAgICAgdHlwZSxcbiAgICAgICAgbm9kZTogZnJhbWUsXG4gICAgICAgIG1vdW50OiAoc2VsZWN0b3IpID0+IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpPy5hcHBlbmRDaGlsZChmcmFtZSlcbiAgICAgIH07XG4gICAgICB0aGlzLmNvbm5lY3RUb0VsZW1lbnQoZWxlbWVudCk7XG4gICAgICBpZiAodGhpcy5lbGVtZW50cykge1xuICAgICAgICB0aGlzLmVsZW1lbnRzW3R5cGVdID0gZWxlbWVudDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZWxlbWVudHMgPSB7IFt0eXBlXTogZWxlbWVudCB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfVxuICAgIGJ1aWxkUXVlcnlTdHJpbmcob3B0aW9ucykge1xuICAgICAgY29uc3QgcXVlcnlTdHJpbmcgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG4gICAgICBxdWVyeVN0cmluZy5hcHBlbmQoXCJyZWZlcmVyXCIsIHRoaXMucmVmZXJlcik7XG4gICAgICBxdWVyeVN0cmluZy5hcHBlbmQoXCJmb3JtSWRcIiwgdGhpcy5mb3JtSWQpO1xuICAgICAgaWYgKG9wdGlvbnMuc3R5bGVzKSB7XG4gICAgICAgIHF1ZXJ5U3RyaW5nLmFwcGVuZChcInN0eWxlc1wiLCBjb252ZXJ0U3R5bGVzVG9RdWVyeVN0cmluZyhvcHRpb25zLnN0eWxlcykpO1xuICAgICAgfVxuICAgICAgcXVlcnlTdHJpbmcuYXBwZW5kKFwic2VjdXJlVG9rZW5cIiwgdGhpcy5jb25maWcuY2hlY2tvdXRTZWN1cmVUb2tlbik7XG4gICAgICByZXR1cm4gcXVlcnlTdHJpbmc7XG4gICAgfVxuICAgIGNvbm5lY3RUb0VsZW1lbnQoZWxlbWVudCkge1xuICAgICAgY3JlYXRlQ29ubmVjdGlvbihlbGVtZW50Lm5vZGUpLnRoZW4oKGNvbm4pID0+IHtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uTWFuYWdlci5hZGRDb25uZWN0aW9uKGVsZW1lbnQudHlwZSwgY29ubik7XG4gICAgICAgIHRoaXMudHJ5SW5pdE9qc0Zsb3dzKCk7XG4gICAgICB9KS5jYXRjaCgoZXJyKSA9PiBjb25zb2xlLmVycm9yKFwiW0ZPUk1dIEVycm9yIGNvbm5lY3RpbmcgdG8gQ0RFIGlmcmFtZVwiLCBlcnIpKTtcbiAgICB9XG4gICAgZ2V0Rm9ybURpdigpIHtcbiAgICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMuZm9ybVRhcmdldCkgPz8gZG9jdW1lbnQuYm9keTtcbiAgICB9XG4gICAgY3JlYXRlT2pzRmxvd0NvbnRleHQoKSB7XG4gICAgICBjb25zdCBjZGVDb25uZWN0aW9ucyA9IHRoaXMuY29ubmVjdGlvbk1hbmFnZXIuZ2V0QWxsQ29ubmVjdGlvbnMoKTtcbiAgICAgIGlmICghdGhpcy5jZGVMb2FkZWRQYXlsb2FkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJlcXVlc3RlZCBjb250ZXh0IHdoaWxlIENERSBub3QgeWV0IGxvYWRlZFwiKTtcbiAgICAgIH1cbiAgICAgIGlmIChjZGVDb25uZWN0aW9ucy5zaXplID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIENERSBjb25uZWN0aW9ucyBmb3VuZFwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGJhc2VVcmw6IG5ldyBVUkwodGhpcy5jb25maWcuYmFzZVVybCA/PyBGUkFNRV9CQVNFX1VSTCkub3JpZ2luLFxuICAgICAgICBmb3JtRGl2OiB0aGlzLmdldEZvcm1EaXYoKSxcbiAgICAgICAgZWxlbWVudHNTZXNzaW9uSWQ6IHRoaXMuY2RlTG9hZGVkUGF5bG9hZC5zZXNzaW9uSWQsXG4gICAgICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZHM6IHRoaXMuY2RlTG9hZGVkUGF5bG9hZC5jaGVja291dFBheW1lbnRNZXRob2RzLFxuICAgICAgICBjZGVDb25uZWN0aW9ucyxcbiAgICAgICAgY3VzdG9tSW5pdFBhcmFtczogdGhpcy5jb25maWcuY3VzdG9tSW5pdFBhcmFtcyA/PyB7fVxuICAgICAgfTtcbiAgICB9XG4gICAgY3JlYXRlT2pzRmxvd0NhbGxiYWNrcygpIHtcbiAgICAgIGNvbnN0IG5vT3AgPSAoKSA9PiB7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb25DaGVja291dEVycm9yOiBtYWtlQ2FsbGJhY2tTYWZlKFwib25DaGVja291dEVycm9yXCIsIHRoaXMuY29uZmlnLm9uQ2hlY2tvdXRFcnJvciA/PyBub09wKSxcbiAgICAgICAgb25DaGVja291dFN0YXJ0ZWQ6IG1ha2VDYWxsYmFja1NhZmUoXCJvbkNoZWNrb3V0U3RhcnRlZFwiLCB0aGlzLmNvbmZpZy5vbkNoZWNrb3V0U3RhcnRlZCA/PyBub09wKSxcbiAgICAgICAgb25DaGVja291dFN1Y2Nlc3M6IG1ha2VDYWxsYmFja1NhZmUoXCJvbkNoZWNrb3V0U3VjY2Vzc1wiLCB0aGlzLmNvbmZpZy5vbkNoZWNrb3V0U3VjY2VzcyA/PyBub09wKSxcbiAgICAgICAgb25TZXR1cFBheW1lbnRNZXRob2RTdWNjZXNzOiBtYWtlQ2FsbGJhY2tTYWZlKFxuICAgICAgICAgIFwib25TZXR1cFBheW1lbnRNZXRob2RTdWNjZXNzXCIsXG4gICAgICAgICAgdGhpcy5jb25maWcub25TZXR1cFBheW1lbnRNZXRob2RTdWNjZXNzID8/IG5vT3BcbiAgICAgICAgKSxcbiAgICAgICAgb25WYWxpZGF0aW9uRXJyb3I6IG1ha2VDYWxsYmFja1NhZmUoXCJvblZhbGlkYXRpb25FcnJvclwiLCB0aGlzLmNvbmZpZy5vblZhbGlkYXRpb25FcnJvciA/PyBub09wKVxuICAgICAgfTtcbiAgICB9XG4gICAgc3VibWl0KCkge1xuICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuY3JlYXRlT2pzRmxvd0NvbnRleHQoKTtcbiAgICAgIE9qc0Zsb3dzLmNvbW1vbkNDLnJ1bih7XG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZDogZmluZENoZWNrb3V0UGF5bWVudE1ldGhvZFN0cmljdChjb250ZXh0LmNoZWNrb3V0UGF5bWVudE1ldGhvZHMsIFwiY3JlZGl0X2NhcmRcIiksXG4gICAgICAgIG5vbkNkZUZvcm1JbnB1dHM6IGNyZWF0ZUlucHV0c0RpY3RGcm9tRm9ybShjb250ZXh0LmZvcm1EaXYpLFxuICAgICAgICBmbG93Q2FsbGJhY2tzOiB0aGlzLmNyZWF0ZU9qc0Zsb3dDYWxsYmFja3MoKSxcbiAgICAgICAgY3VzdG9tUGFyYW1zOiB2b2lkIDAsXG4gICAgICAgIC8vIFRoaXMgZmxvdyByZXF1aXJlcyBubyBjdXN0b20gcGFyYW1zXG4gICAgICAgIGluaXRSZXN1bHQ6IHZvaWQgMFxuICAgICAgICAvLyBUaGlzIGZsb3cgcmVxdWlyZXMgbm8gaW5pdGlhbGl6YXRpb25cbiAgICAgIH0pO1xuICAgIH1cbiAgICBvblBheW1lbnRSZXF1ZXN0RXJyb3IoZXJyTXNnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiW2Zvcm1dIEVycm9yIGZyb20gcGF5bWVudCByZXF1ZXN0OlwiLCBlcnJNc2cpO1xuICAgICAgdGhpcy5jaGVja291dEZpcmVkID0gZmFsc2U7XG4gICAgICBpZiAodGhpcy5jb25maWcub25DaGVja291dEVycm9yKSB0aGlzLmNvbmZpZy5vbkNoZWNrb3V0RXJyb3IoZXJyTXNnKTtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBPYmplY3QudmFsdWVzKHRoaXMuZWxlbWVudHMgPz8ge30pKSB7XG4gICAgICAgIGVsZW1lbnQubm9kZS5yZW1vdmUoKTtcbiAgICAgIH1cbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCB0aGlzLmV2ZW50SGFuZGxlci5oYW5kbGVNZXNzYWdlLmJpbmQodGhpcy5ldmVudEhhbmRsZXIpKTtcbiAgICB9XG4gIH1cblxuICBleHBvcnRzLkZpZWxkTmFtZSA9IEZpZWxkTmFtZTtcbiAgZXhwb3J0cy5PcGVuUGF5Rm9ybSA9IE9wZW5QYXlGb3JtO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXG59KSk7Il0sCiAgIm1hcHBpbmdzIjogIkNBQUMsU0FBVUEsRUFBUUMsRUFBUyxDQUMxQixPQUFPLFNBQVksVUFBWSxPQUFPLE9BQVcsSUFBY0EsRUFBUSxRQUFTLFFBQVEsS0FBSyxFQUFHLFFBQVEsTUFBTSxFQUFHLFFBQVEsUUFBUSxFQUFHLFFBQVEsT0FBTyxDQUFDLEVBQ3BKLE9BQU8sUUFBVyxZQUFjLE9BQU8sSUFBTSxPQUFPLENBQUMsVUFBVyxNQUFPLE9BQVEsU0FBVSxPQUFPLEVBQUdBLENBQU8sR0FDekdELEVBQVMsT0FBTyxXQUFlLElBQWMsV0FBYUEsR0FBVSxLQUFNQyxFQUFRRCxFQUFPLFFBQVUsQ0FBQyxFQUFHQSxFQUFPLElBQUtBLEVBQU8sS0FBTUEsRUFBTyxPQUFRQSxFQUFPLEtBQUssRUFDOUosR0FBRyxLQUFPLFNBQVVFLEVBQVNDLEVBQUtDLEdBQU1DLEdB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QUNQLE1BQU0xSyxFQUFVLEtBQUsscUJBQXFCLEVBQzFDVyxFQUFTLFNBQVMsSUFBSSxDQUNwQixRQUFBWCxFQUNBLHNCQUF1QjhFLEdBQWdDOUUsRUFBUSx1QkFBd0IsYUFBYSxFQUNwRyxpQkFBa0JySSxFQUF5QnFJLEVBQVEsT0FBTyxFQUMxRCxjQUFlLEtBQUssdUJBQXVCLEVBQzNDLGFBQWMsT0FFZCxXQUFZLE1BRWQsQ0FBQyxDQUNILENBQ0Esc0JBQXNCMkssRUFBUSxDQUM1QixRQUFRLE1BQU0scUNBQXNDQSxDQUFNLEVBQzFELEtBQUssY0FBZ0IsR0FDakIsS0FBSyxPQUFPLGlCQUFpQixLQUFLLE9BQU8sZ0JBQWdCQSxDQUFNLENBQ3JFLENBQ0EsU0FBVSxDQUNSLFVBQVc3SSxLQUFXLE9BQU8sT0FBTyxLQUFLLFVBQVksQ0FBQyxDQUFDLEVBQ3JEQSxFQUFRLEtBQUssT0FBTyxFQUV0QixPQUFPLG9CQUFvQixVQUFXLEtBQUssYUFBYSxjQUFjLEtBQUssS0FBSyxZQUFZLENBQUMsQ0FDL0YsQ0FDRixFQWpJSTZILEVBQUssU0FBV2hKLEVBekVwQixJQUFNaUssR0FBTmpCLEVBNE1BblosRUFBUSxVQUFZa0MsRUFDcEJsQyxFQUFRLFlBQWNvYSxHQUV0QixPQUFPLGVBQWVwYSxFQUFTLE9BQU8sWUFBYSxDQUFFLE1BQU8sUUFBUyxDQUFDLENBRXhFLENBQUUiLAogICJuYW1lcyI6IFsiZ2xvYmFsIiwgImZhY3RvcnkiLCAiZXhwb3J0cyIsICJ6b2QiLCAidXVpZCIsICJwZW5wYWwiLCAiY2hhbGsiLCAiRlJBTUVfQkFTRV9VUkwiLCAiUHlkYW50aWNWYWxpZGF0aW9uRXJyb3IkMSIsICJQeWRhbnRpY1ZhbGlkYXRpb25FcnJvclJlc3BvbnNlIiwgIlpvZEZpZWxkRXJyb3IiLCAiWm9kRmllbGRFcnJvcnMiLCAiTUFQX1RPX0hVTUFOX0ZSSUVORExZX0xPV0VSQ0FTRSIsICJnZXRIdW1hbkZyaWVuZGx5TWVzc2FnZSIsICJvZ0Vycm9yTWVzc2FnZSIsICJrZXkiLCAiaXNTdHJpbmdpZmllZEpzb25PYmplY3QiLCAic3RyIiwgImNyZWF0ZU1lc3NhZ2VGcm9tUHlkYW50aWNWYWxpZGF0aW9uRXJyb3IiLCAicmVzcG9uc2UiLCAiZXJyIiwgImNyZWF0ZU1lc3NhZ2VGcm9tWm9kRmllbGRFcnJvcnMiLCAiZXJyb3JzIiwgImdldEVycm9yTWVzc2FnZSIsICJlIiwgIm9iaiIsICJlMiIsICJtYWtlQ2FsbGJhY2tTYWZlIiwgImNhbGxiYWNrTmFtZSIsICJmbiIsICJhcmdzIiwgImVycm9yIiwgIlJlcXVpcmVkU3RyaW5nIiwgIk9wdGlvbmFsU3RyaW5nIiwgIm51bGxPclVuZGVmT3IkMSIsICJ6VHlwZSIsICJGaWVsZE5hbWUiLCAiRmllbGROYW1lMiIsICJGaWVsZE5hbWVFbnVtIiwgIlByaXZhdGVGaWVsZE5hbWUiLCAiUHJpdmF0ZUZpZWxkTmFtZTIiLCAiUHJpdmF0ZUZpZWxkTmFtZUVudW0iLCAiQWxsRmllbGROYW1lcyIsICJFbGVtZW50VHlwZUVudW0iLCAiRWxlbWVudFR5cGVFbnVtMiIsICJFbGVtZW50VHlwZSIsICJDaGVja291dFBheW1lbnRNZXRob2QkMSIsICJQYXltZW50TWV0aG9kTWluaW1hbCIsICJFdmVudFR5cGUiLCAiR2VuZXJpY0V2ZW50VHlwZSIsICJHZW5lcmljRXZlbnRQYXlsb2FkIiwgIklucHV0RXZlbnRUeXBlIiwgIklucHV0RXZlbnRQYXlsb2FkIiwgIkVycm9yRXZlbnRUeXBlIiwgIkVycm9yRXZlbnRQYXlsb2FkIiwgIlZhbGlkYXRpb25FcnJvckV2ZW50VHlwZSIsICJWYWxpZGF0aW9uRXJyb3JFdmVudFBheWxvYWQiLCAiTGF5b3V0RXZlbnRQYXlsb2FkIiwgIkxvYWRlZEV2ZW50UGF5bG9hZCIsICJQYXltZW50Rmxvd1N0YXJ0ZWRFdmVudFBheWxvYWQiLCAiU2V0dXBDaGVja291dFN1Y2Nlc3NFdmVudFBheWxvYWQiLCAiUmVxdWlyZWRGb3JtRmllbGRzIiwgIlBSRm9ybUZpZWxkcyIsICJTdWJtaXRFdmVudFR5cGUiLCAiU3VibWl0RXZlbnRQYXlsb2FkIiwgIlRva2VuaXplU3VjY2Vzc0V2ZW50UGF5bG9hZCIsICJDaGVja291dFN1Y2Nlc3NFdmVudFBheWxvYWQiLCAiRXZlbnRQYXlsb2FkIiwgIkVsZW1lbnRFdmVudCIsICJDb25maXJtUGF5bWVudEZsb3dSZXNwb25zZSIsICJGaWVsZFZhbGlkYXRpb25FcnJvciIsICJUb2tlbml6ZUNhcmRFcnJvclJlc3BvbnNlIiwgIlRva2VuaXplQ2FyZFJlc3BvbnNlIiwgIlRocmVlRFNTdGF0dXMiLCAiVGhyZWVEU1N0YXR1czIiLCAiUGluZzNEU1N0YXR1c1Jlc3BvbnNlIiwgIkNvbW1vbjNEU05leHRBY3Rpb25NZXRhZGF0YSIsICJleHRyYWN0SXNzdWVzUGVyRmllbGQiLCAiaXNzdWVzUGVyRmllbGQiLCAidmFsdWUiLCAiZmllbGROYW1lIiwgIlN0cmlwZTNEU05leHRBY3Rpb25NZXRhZGF0YSIsICJQYXltZW50UmVxdWVzdE5leHRBY3Rpb25NZXRhZGF0YSIsICJvdXJDdXJyZW5jeVRvVGhlaXJzIiwgImdldExvYWRlZFN0cmlwZSIsICJwdWJsaXNoYWJsZUtleSIsICJpIiwgImlzU3RyaXBlSnNQcmVzZW50IiwgInNsZWVwIiwgImNyZWF0ZVN0cmlwZUVsZW1lbnRzIiwgInN0cmlwZVB1YktleSIsICJlbGVtZW50c09wdGlvbnMiLCAic3RyaXBlIiwgImNyZWF0ZVN0cmlwZVBheW1lbnRSZXF1ZXN0IiwgInRvdGFsQW1vdW50QXRvbSIsICJjdXJyZW5jeSIsICJpc0Ftb3VudFBlbmRpbmciLCAiaXNMaW5rT25seSIsICJzdHJpcGVDdXJyZW5jeSIsICJ0aW1lb3V0TXMiLCAicmVzb2x2ZSIsICJ3YWl0Rm9yVXNlclRvQWRkUGF5bWVudE1ldGhvZCIsICJwYXltZW50UmVxdWVzdCIsICJyZWplY3QiLCAiZXZ0IiwgImNvbmZpcm1TdHJpcGVQclBNIiwgIm5leHRBY3Rpb25NZXRhZGF0YSIsICJzdHJpcGVQbSIsICJjb25maXJtUmVzdWx0IiwgImxhdW5jaFN0cmlwZTNEU0RpYWxvZ0Zsb3ciLCAiX2EiLCAiX2IiLCAiX2MiLCAiX2QiLCAicmVzdWx0U3RhdHVzIiwgImNvbnZlcnRTdHlsZXNUb1F1ZXJ5U3RyaW5nIiwgInN0eWxlcyIsICJjcmVhdGVJbnB1dHNEaWN0RnJvbUZvcm0iLCAiZm9ybURpdiIsICJpbml0aWFsRGljdCIsICJhY2MiLCAiaW5wdXQiLCAicGFyc2VFdmVudFBheWxvYWQiLCAiZXZlbnREYXRhIiwgImVtaXRFdmVudCIsICJ0YXJnZXQiLCAiZm9ybUlkIiwgImVsZW1lbnRJZCIsICJwYXlsb2FkIiwgImJhc2VVcmwiLCAiZXZlbnQiLCAiY2hlY2tJZlZhbGlkQ2RlQ29ubmVjdGlvbk9iamVjdCIsICJwaW5nIiwgInJlc3VsdCIsICJpc1Jlc3VsdFZhbGlkIiwgImlzVmFsaWQiLCAibnVsbE9yVW5kZWZPciIsICJDREVSZXNwb25zZUVycm9yIiwgIkNvdXBvbk1pbmltYWwiLCAiTGluZUl0ZW0iLCAiQnJhbmRTZXR0aW5ncyIsICJCcmFuZCIsICJDaGVja291dFBheW1lbnRNZXRob2QiLCAiU3Vic2NyaXB0aW9uSXRlbU1pbmltYWwiLCAiU3Vic2NyaXB0aW9uTWluaW1hbCIsICJJbnZvaWNlSXRlbURpc2NvdW50QW1vdW50c01pbmltYWwiLCAiSW52b2ljZUxpbmVJdGVtTWluaW1hbCIsICJEaXNjb3VudE1pbmltYWwiLCAiSW52b2ljZU1pbmltYWwiLCAiQ3JlYXRlU3Vic2NyaXB0aW9uUmVzcG9uc2VNaW5pbWFsIiwgIlByZXZpZXdDaGVja291dFJlc3BvbnNlIiwgIl9QYXltZW50Rm9ybVByZWZpbGxDb21tb24iLCAiUGF5bWVudEZvcm1QcmVmaWxsIiwgIkNvbXBsZXRlZEZvcm1QcmVmaWxsIiwgIkV4cGlyZWRGb3JtUHJlZmlsbCIsICJDaGVja291dFN1Y2Nlc3NSZXNwb25zZSIsICJTZXR1cENoZWNrb3V0UmVzcG9uc2UiLCAiUHlkYW50aWNWYWxpZGF0aW9uRXJyb3IiLCAiU3RhcnRQYXltZW50Rmxvd1Jlc3BvbnNlIiwgIlN0YXJ0UGF5bWVudEZsb3dGb3JDQ1Jlc3BvbnNlIiwgInN1bSIsICJhcnIiLCAiYSIsICJiIiwgImZpeFByb3RvIiwgInByb3RvdHlwZSIsICJzZXRQcm90b3R5cGVPZiIsICJmaXhTdGFjayIsICJjYXB0dXJlU3RhY2tUcmFjZSIsICJfX2V4dGVuZHMiLCAiX2V4dGVuZFN0YXRpY3MiLCAiZCIsICJwIiwgIl9fIiwgIkN1c3RvbUVycm9yIiwgIl9zdXBlciIsICJtZXNzYWdlIiwgIm9wdGlvbnMiLCAiX25ld1RhcmdldCIsICJfdGhpcyIsICJDZGVFcnJvciIsICJmcmllbmRseU1lc3NhZ2UiLCAicXVlcnlDREUiLCAiY2RlQ29ubiIsICJkYXRhIiwgInJlc3BvbnNlU2NoZW1hIiwgImlzQ0RFUmVzcG9uc2VFcnJvciIsICJjaGVja0lmQ29uZm9ybXNUb1NjaGVtYSIsICJzY2hlbWEiLCAiZ2V0Q2hlY2tvdXRQcmV2aWV3IiwgInJlcXVlc3QiLCAiZ2V0UHJlZmlsbCIsICJzdGFydFBheW1lbnRGbG93IiwgInN0YXJ0UGF5bWVudEZsb3dGb3JDQyIsICJzdGFydFBheW1lbnRGbG93Rm9yUFIiLCAiY29uZmlybVBheW1lbnRGbG93IiwgImdldENoZWNrb3V0VmFsdWUiLCAic2VjdXJlVG9rZW4iLCAicHJvbW9Db2RlIiwgImNoZWNrb3V0UHJldmlldyIsICJjdXJyZW5jaWVzIiwgImludiIsICJhbW91bnRBdG9tIiwgImdldENoZWNrb3V0UHJldmlld0Ftb3VudCIsICJpc1NldHVwTW9kZSIsICJ0b2tlbml6ZUNhcmRPbkFsbENvbm5lY3Rpb25zIiwgImFsbENkZUNvbm5lY3Rpb25zIiwgImNoZWNrb3V0Q2FyZEVsZW1lbnRzIiwgInNldHVwQ2hlY2tvdXQiLCAicGVyZm9ybUNoZWNrb3V0IiwgIkNERV9QT0xMSU5HX0lOVEVSVkFMIiwgInBpbmdDZGVGb3IzZHNTdGF0dXMiLCAiaWZyYW1lIiwgImNoaWxkT3JpZ2luIiwgImNvbm5lY3Rpb25PYmoiLCAiYWRkQmFzaWNDaGVja291dENhbGxiYWNrSGFuZGxlcnMiLCAic2ltcGxlT2pzRmxvdyIsICJwYXJhbXMiLCAiZmxvd1Jlc3VsdCIsICJhZGRFcnJvckNhdGNoZXJGb3JJbml0IiwgImluaXQiLCAiZXJyX18iLCAiY3JlYXRlT2pzRmxvd0xvZ2dlcnMiLCAicHJlZml4IiwgImxvZyIsICJsb2dfXyQ1IiwgImVycl9fJDUiLCAicGFyc2VDb25maXJtUGF5bWVudEZsb3dSZXNwb25zZSIsICJmaW5kQ3BtTWF0Y2hpbmdUeXBlIiwgImFsbENQTXMiLCAiem9kTW9kZWwiLCAiY3BtIiwgImNwbTIiLCAibG9nX18kNCIsICJlcnJfXyQ0IiwgInZhbGlkYXRlTm9uQ2RlRm9ybUZpZWxkc0ZvckNDIiwgIm5vbkNkZUZvcm1JbnB1dHMiLCAib25WYWxpZGF0aW9uRXJyb3IiLCAiZm9ybWF0dGVkIiwgImlzc3VlcyIsICJ2YWxpZGF0ZVRva2VuaXplQ2FyZFJlc3VsdHMiLCAidG9rZW5pemVSZXN1bHRzIiwgInRva2VuaXplUmVzdWx0IiwgInBhcnNlZCIsICJPSlNfU1RSSVBFX0xJTktfQlROX0lEIiwgImxvZ19fJDMiLCAiZXJyX18kMyIsICJTdHJpcGVMaW5rQ3BtIiwgIlN0cmlwZUxpbmtSZXF1aXJlZFVzZXJBY3Rpb25zIiwgImluaXRTdHJpcGVMaW5rRmxvdyIsICJjb250ZXh0IiwgImZsb3dDYWxsYmFja3MiLCAiaW5pdFBhcmFtcyIsICJzdHJpcGVMaW5rQ3BtIiwgImFueUNkZUNvbm5lY3Rpb24iLCAicHJlZmlsbCIsICJpbml0aWFsUHJldmlldyIsICJlbGVtZW50cyIsICJleHByZXNzQ2hlY2tvdXRFbGVtZW50IiwgIm1vdW50QnV0dG9uIiwgImRpc21vdW50QnV0dG9uIiwgIk9qc0Zsb3dzIiwgImdldEVsZW1lbnRCeUlkQXN5bmMiLCAicnVuU3RyaXBlTGlua0Zsb3ciLCAiY2hlY2tvdXRQYXltZW50TWV0aG9kIiwgImN1c3RvbVBhcmFtcyIsICJtZXJnZWRJbnB1dHMiLCAiZmlsbEVtcHR5Rm9ybUlucHV0c1dpdGhTdHJpcGVQTSIsICJub25DZGVGb3JtRmllbGRzIiwgInN0YXJ0UGF5bWVudEZsb3dSZXNwb25zZSIsICJvdXJFeGlzdGluZ1BtSWQiLCAiY2hlY2tvdXRSZXF1ZXN0IiwgImZvcm1JbnB1dHMiLCAiX2UiLCAiaW5wdXRzIiwgInBheWVyRmlyc3ROYW1lIiwgInBheWVyTGFzdE5hbWVQYXJ0cyIsICJwYXllckxhc3ROYW1lIiwgImlkIiwgImdldEVsZW1lbnQiLCAiZWxlbWVudCIsICJjcmVhdGVBbmRPcGVuRnJhbWUiLCAidXJsIiwgInRlbXBsYXRlIiwgImhvc3QiLCAic2hhZG93Um9vdCIsICJjYW5jZWxCdXR0b24iLCAic3RhcnRQb2xsaW5nIiwgIm9uU3VjY2VzcyIsICJoYW5kbGVQb2xsaW5nIiwgInN0YXR1cyIsICJwb2xsaW5nSW50ZXJ2YWwiLCAiaGFuZGxlRXZlbnRzIiwgImhhbmRsZUNhbmNlbCIsICJzdGFydDNkc1ZlcmlmaWNhdGlvbiIsICJjbGVhbnVwRXZlbnRMaXN0ZW5lcnMiLCAibG9nX18kMiIsICJlcnJfXyQyIiwgInN0cmlwZUxvZ19fIiwgInJ1bkNvbW1vbkNjRmxvdyIsICJ0b2tlbml6ZUNhcmRSZXN1bHRzIiwgImNvbW1vbkNoZWNrb3V0UGFyYW1zIiwgInNob3VsZFVzZU5ld0Zsb3ciLCAic3RhcnRQZlJlc3VsdCIsICJjb21tb25DQzNEU0Zsb3ciLCAic3RyaXBlQ0MzRFNGbG93IiwgImNyZWF0ZWRQYXltZW50TWV0aG9kIiwgInBhcnNlU3RyaXBlM0RTTmV4dEFjdGlvbk1ldGFkYXRhIiwgInN0cmlwZUFjdGlvbiIsICJhY3Rpb24iLCAicGFyc2VDb21tb24zRFNOZXh0QWN0aW9uTWV0YWRhdGEiLCAiY29tbW9uQWN0aW9uIiwgImxvZ19fJDEiLCAiZXJyX18kMSIsICJTdHJpcGVQckNwbSIsICJpbml0U3RyaXBlUHJGbG93IiwgInByIiwgImNhbk1ha2VQYXltZW50IiwgInJ1blN0cmlwZVByRmxvdyIsICJpbml0UmVzdWx0IiwgIm92ZXJyaWRlIiwgInVwZGF0ZVByV2l0aEFtb3VudCIsICJzdHJpcGVQbUFkZGVkRXZlbnQiLCAiZmlsbEVtcHR5Rm9ybUlucHV0c1dpdGhTdHJpcGVQbSIsICJwYXJzZVBSTmV4dEFjdGlvbk1ldGFkYXRhIiwgInN0cmlwZVBtRXZ0IiwgImFtb3VudCIsICJpc1BlbmRpbmciLCAiZmluZENoZWNrb3V0UGF5bWVudE1ldGhvZFN0cmljdCIsICJjcG1zIiwgIndpdGhQcm92aWRlciIsICJ3aXRoUHJvY2Vzc29yIiwgIm1hdGNoZXMiLCAiZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMiLCAieCIsICJPYnNlcnZhYmxlJDIiLCAiaGFzU3ltYm9sIiwgIm5hbWUiLCAiZ2V0U3ltYm9sIiwgIlN5bWJvbEl0ZXJhdG9yIiwgIlN5bWJvbE9ic2VydmFibGUiLCAiU3ltYm9sU3BlY2llcyIsICJnZXRNZXRob2QiLCAiZ2V0U3BlY2llcyIsICJjdG9yIiwgIk9ic2VydmFibGUkMSIsICJpc09ic2VydmFibGUiLCAiaG9zdFJlcG9ydEVycm9yIiwgImVucXVldWUiLCAiY2xlYW51cFN1YnNjcmlwdGlvbiIsICJzdWJzY3JpcHRpb24iLCAiY2xlYW51cCIsICJ1bnN1YnNjcmliZSIsICJjbG9zZVN1YnNjcmlwdGlvbiIsICJmbHVzaFN1YnNjcmlwdGlvbiIsICJxdWV1ZSIsICJub3RpZnlTdWJzY3JpcHRpb24iLCAidHlwZSIsICJvYnNlcnZlciIsICJtIiwgIm9uTm90aWZ5IiwgIlN1YnNjcmlwdGlvbiIsICJzdWJzY3JpYmVyIiwgInNlbGYiLCAic3Vic2NyaXB0aW9uT2JzZXJ2ZXIiLCAiT2JzZXJ2YWJsZSIsICJkb25lIiwgIkMiLCAiaGFzU2VlZCIsICJoYXNWYWx1ZSIsICJmaXJzdCIsICJ2YWx1ZXMiLCAic291cmNlcyIsICJpbmRleCIsICJzdGFydE5leHQiLCAibmV4dCIsICJ2IiwgInN1YnNjcmlwdGlvbnMiLCAib3V0ZXIiLCAiaW5uZXIiLCAiY29tcGxldGVJZkRvbmUiLCAicyIsICJtZXRob2QiLCAib2JzZXJ2YWJsZSIsICJpdGVtIiwgIml0ZW1zIiwgInplbk9ic2VydmFibGUiLCAibG9nX18iLCAiZ2V0T2pzSW5pdFJlc3VsdHNEZWJ1Z09iamVjdCIsICJpbml0aWFsaXplT2pzRmxvd3MiLCAicnVuSW5pdEZsb3dBc09ic2VydmFibGUiLCAiZmxvd05hbWUiLCAiaW5pdEZsb3ciLCAiUFJfTE9BRElORyIsICJQUl9FUlJPUiIsICJPcGVuUGF5Rm9ybUV2ZW50SGFuZGxlciIsICJmb3JtSW5zdGFuY2UiLCAiZXZlbnRUeXBlIiwgImhlaWdodCIsICJmaWVsZCIsICJzb3VyY2UiLCAiY3JlYXRlQ29ubmVjdGlvbiIsICJpc1ZhbGlkT2JqZWN0IiwgIkNvbm5lY3Rpb25NYW5hZ2VyIiwgImNvbm5lY3Rpb24iLCAiX09wZW5QYXlGb3JtIiwgImNvbmZpZyIsICJpbml0U3RhdHVzIiwgIl9mIiwgImNhbkFwcGxlUGF5IiwgImNhbkdvb2dsZVBheSIsICJ1c2VyUGFyYW1zIiwgInByb3ZpZGVyIiwgImZvcm0iLCAiZWxlbWVudFZhbHVlIiwgImZyYW1lIiwgInF1ZXJ5U3RyaW5nIiwgInNlbGVjdG9yIiwgImNvbm4iLCAiY2RlQ29ubmVjdGlvbnMiLCAibm9PcCIsICJlcnJNc2ciLCAiT3BlblBheUZvcm0iXQp9Cg==
20
+ and ".isAvailable" to know if a payment request is available.`)}},De={isLoading:!1,isAvailable:!1,startFlow:async()=>{console.error("startFlow triggered when payment request is not available.")}};class Zn{constructor(e){this.formInstance=e,this.config=e.config,this.formId=e.formId,this.eventTargets={},this.nonces=new Set}handleMessage(e){var c;if(!e.source)throw new Error("No source found");if(e.origin!==((c=this.formInstance.config._frameUrl)==null?void 0:c.origin)||typeof e.data=="object"&&e.data.penpal)return;const r=Mt(JSON.parse(e.data));if(!this.validateEvent(r))return;const{elementId:s,payload:i}=r,a=i.type;switch(a){case"LAYOUT":this.handleLayoutEvent(i);break;case"FOCUS":this.handleFocusEvent(s,i.elementType);break;case"BLUR":this.handleBlurEvent(s,i.elementType);break;case"CHANGE":this.handleChangeEvent(s,i.elementType,i.errors);break;case"LOADED":this.handleLoadedEvent(e.source,s,i);break;case"LOAD_ERROR":this.handleLoadErrorEvent(i);break;case"VALIDATION_ERROR":this.handleValidationErrorEvent(i,s);break;default:console.warn("[form] Unhandled event type:",a)}}validateEvent(e){return e.formId!==this.formInstance.formId||!e.elementId?(console.warn("[form] Ignoring unknown event:",e),!1):this.nonces.has(e.nonce)?(console.warn("[form] Ignoring duplicate event:",e),!1):(this.nonces.add(e.nonce),!0)}handleLayoutEvent(e){const r=e.height?`${e.height}px`:"100%";this.formInstance.setFormHeight(r)}handleFocusEvent(e,r){this.config.onFocus&&this.config.onFocus(e,r)}handleBlurEvent(e,r){this.config.onBlur&&this.config.onBlur(e,r)}handleChangeEvent(e,r,o){this.config.onChange&&this.config.onChange(e,r,o)}async handleLoadedEvent(e,r,o){console.log("handleLoadedEvent is deprecated:",e,r,o),this.eventTargets[r]=e,this.formInstance.onCdeLoaded(o),this.config.onLoad&&this.config.onLoad(o.totalAmountAtoms,o.currency)}handleLoadErrorEvent(e){this.formInstance.config.onLoadError&&this.formInstance.config.onLoadError(e.message)}handleValidationErrorEvent(e,r){this.formInstance.config.onValidationError&&this.formInstance.config.onValidationError(e.elementType,e.errors,r)}postEventToFrame(e,r,o){jt(e,this.formId,r,o,this.config.baseUrl)}}async function Gn(n,e){const o=await ne.connectToChild({iframe:n,debug:!1,childOrigin:e}).promise,s=await Ft(o);if(!Lt(o,s))throw new Error("Got invalid CDE connection object");return o}class Wn{constructor(){this.connections=new Map}addConnection(e,r){this.connections.set(e,r)}getConnection(){const e=this.connections.values().next().value;if(!e)throw new Error("Connection not found");return e}getAllConnections(){return this.connections}}const F=class F{constructor(e){this.tryInitOjsFlows=()=>{this.ojsFlowsInitialization===null&&this.cdeLoadedPayload&&this.connectionManager.getAllConnections().size!==0&&(this.ojsFlowsInitialization=Jn(this.createOjsFlowContext(),this.createOjsFlowCallbacks()),this.ojsFlowsInitialization.stripePR.subscribe(r=>this.onStripePRStatusChange(r)))},this.onCdeLoaded=r=>{this.cdeLoadedPayload||(this.cdeLoadedPayload=r,this.tryInitOjsFlows())},this.onStripePRStatusChange=r=>{var o,s,i,a,c,l;if(r.status==="loading")(s=(o=this.config).onPaymentRequestLoad)==null||s.call(o,{apple_pay:Ne,google_pay:Ne});else if(r.status==="error")(a=(i=this.config).onPaymentRequestLoad)==null||a.call(i,{apple_pay:De,google_pay:De});else if(r.status==="loaded"){const u=r.result,m=u.isAvailable&&u.availableProviders.applePay,y=u.isAvailable&&u.availableProviders.googlePay;(l=(c=this.config).onPaymentRequestLoad)==null||l.call(c,{apple_pay:{isLoading:!1,isAvailable:m,startFlow:async h=>m?this.submitPaymentRequest("apple_pay",u,h):void 0},google_pay:{isLoading:!1,isAvailable:y,startFlow:async h=>y?this.submitPaymentRequest("google_pay",u,h):void 0}})}},this.submitPaymentRequest=(r,o,s)=>{const i=this.createOjsFlowContext();return O.stripePR.run({context:i,checkoutPaymentMethod:Ie(i.checkoutPaymentMethods,r),nonCdeFormInputs:K(i.formDiv),flowCallbacks:this.createOjsFlowCallbacks(),customParams:{provider:r,overridePaymentRequest:s==null?void 0:s.overridePaymentRequest},initResult:o})},F.assignAsSingleton(this),this.config={...e,baseUrl:e.baseUrl??"https://cde.getopenpay.com"},this.elements=null,this.formId=`opjs-form-${window.crypto.randomUUID()}`,this.referer=window.location.origin,this.formTarget=e.formTarget??"body",this.formProperties={height:"1px"},this.cdeLoadedPayload=null,this.ojsFlowsInitialization=null,this.checkoutFired=!1,this.connectionManager=new Wn,this.eventHandler=new Zn(this),this.ojsVersion="0.1.11",this.ojsReleaseVersion="0.1.11",window.addEventListener("message",this.eventHandler.handleMessage.bind(this.eventHandler))}static assignAsSingleton(e){if(F.getInstance())throw new Error("OpenPay instance already exists. Only one instance is allowed.");window.ojs=e}static getInstance(){return window.ojs??null}getConnectionManager(){return this.connectionManager}setFormHeight(e){this.formProperties.height=e,this.elements&&Object.values(this.elements).forEach(r=>{r.node.style.height=e})}createElement(e,r={}){if(!this.config)throw new Error("OpenPay form not initialized");const o=Je.parse(e),s=document.createElement("iframe"),i=this.buildQueryString(r);s.name=`${o}-element`;const a=new URL(`/app/v1/${s.name}`,this.config.baseUrl);a.search=i.toString(),s.src=a.href,this.config._frameUrl=a,s.style.border="none",s.style.width="100%";const c={type:o,node:s,mount:l=>{var u;return(u=document.querySelector(l))==null?void 0:u.appendChild(s)}};return this.connectToElement(c),this.elements?this.elements[o]=c:this.elements={[o]:c},c}buildQueryString(e){const r=new URLSearchParams;return r.append("referer",this.referer),r.append("formId",this.formId),e.styles&&r.append("styles",Tt(e.styles)),r.append("secureToken",this.config.checkoutSecureToken),r}connectToElement(e){Gn(e.node).then(r=>{this.connectionManager.addConnection(e.type,r),this.tryInitOjsFlows()}).catch(r=>console.error("[FORM] Error connecting to CDE iframe",r))}getFormDiv(){return document.querySelector(this.formTarget)??document.body}createOjsFlowContext(){const e=this.connectionManager.getAllConnections();if(!this.cdeLoadedPayload)throw new Error("Requested context while CDE not yet loaded");if(e.size===0)throw new Error("No CDE connections found");return{baseUrl:new URL(this.config.baseUrl??Ue).origin,formDiv:this.getFormDiv(),elementsSessionId:this.cdeLoadedPayload.sessionId,checkoutPaymentMethods:this.cdeLoadedPayload.checkoutPaymentMethods,cdeConnections:e,customInitParams:this.config.customInitParams??{}}}createOjsFlowCallbacks(){const e=()=>{};return{onCheckoutError:A("onCheckoutError",this.config.onCheckoutError??e),onCheckoutStarted:A("onCheckoutStarted",this.config.onCheckoutStarted??e),onCheckoutSuccess:A("onCheckoutSuccess",this.config.onCheckoutSuccess??e),onSetupPaymentMethodSuccess:A("onSetupPaymentMethodSuccess",this.config.onSetupPaymentMethodSuccess??e),onValidationError:A("onValidationError",this.config.onValidationError??e)}}submit(){const e=this.createOjsFlowContext();O.commonCC.run({context:e,checkoutPaymentMethod:Ie(e.checkoutPaymentMethods,"credit_card"),nonCdeFormInputs:K(e.formDiv),flowCallbacks:this.createOjsFlowCallbacks(),customParams:void 0,initResult:void 0})}onPaymentRequestError(e){console.error("[form] Error from payment request:",e),this.checkoutFired=!1,this.config.onCheckoutError&&this.config.onCheckoutError(e)}destroy(){for(const e of Object.values(this.elements??{}))e.node.remove();window.removeEventListener("message",this.eventHandler.handleMessage.bind(this.eventHandler))}};F.ojsFlows=O;let te=F;S.FieldName=p,S.OpenPayForm=te,Object.defineProperty(S,Symbol.toStringTag,{value:"Module"})});
21
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiaW5kZXgudW1kLmpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBmYWN0b3J5KGV4cG9ydHMsIHJlcXVpcmUoJ3pvZCcpLCByZXF1aXJlKCd1dWlkJyksIHJlcXVpcmUoJ3BlbnBhbCcpLCByZXF1aXJlKCdjaGFsaycpKSA6XG4gIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJ2V4cG9ydHMnLCAnem9kJywgJ3V1aWQnLCAncGVucGFsJywgJ2NoYWxrJ10sIGZhY3RvcnkpIDpcbiAgKGdsb2JhbCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiBnbG9iYWwgfHwgc2VsZiwgZmFjdG9yeShnbG9iYWwuT3BlblBheSA9IHt9LCBnbG9iYWwuem9kLCBnbG9iYWwudXVpZCwgZ2xvYmFsLnBlbnBhbCwgZ2xvYmFsLmNoYWxrKSk7XG59KSh0aGlzLCAoZnVuY3Rpb24gKGV4cG9ydHMsIHpvZCwgdXVpZCwgcGVucGFsLCBjaGFsaykgeyAndXNlIHN0cmljdCc7XG5cbiAgY29uc3QgRlJBTUVfQkFTRV9VUkwgPSBcImh0dHBzOi8vY2RlLmdldG9wZW5wYXkuY29tXCI7XG5cbiAgY29uc3QgUHlkYW50aWNWYWxpZGF0aW9uRXJyb3IkMSA9IHpvZC56Lm9iamVjdCh7XG4gICAgdHlwZTogem9kLnouc3RyaW5nKCksXG4gICAgbG9jOiB6b2Quei5hcnJheSh6b2Quei5zdHJpbmcoKSksXG4gICAgbXNnOiB6b2Quei5zdHJpbmcoKSxcbiAgICB1cmw6IHpvZC56LnN0cmluZygpXG4gIH0pO1xuICBjb25zdCBQeWRhbnRpY1ZhbGlkYXRpb25FcnJvclJlc3BvbnNlID0gem9kLnouYXJyYXkoUHlkYW50aWNWYWxpZGF0aW9uRXJyb3IkMSk7XG4gIGNvbnN0IFpvZEZpZWxkRXJyb3IgPSB6b2Quei5vYmplY3Qoe1xuICAgIGNvZGU6IHpvZC56LnN0cmluZygpLFxuICAgIG1lc3NhZ2U6IHpvZC56LnN0cmluZygpLFxuICAgIHBhdGg6IHpvZC56LmFycmF5KHpvZC56LnN0cmluZygpKVxuICB9KTtcbiAgY29uc3QgWm9kRmllbGRFcnJvcnMgPSB6b2Quei5hcnJheShab2RGaWVsZEVycm9yKTtcbiAgY29uc3QgTUFQX1RPX0hVTUFOX0ZSSUVORExZX0xPV0VSQ0FTRSA9IHtcbiAgICBcImZhaWxlZCB0byBmZXRjaFwiOiBgQ29ubmVjdGlvbiBlcnJvcjogcGxlYXNlIGRvdWJsZSBjaGVjayBpZiB5b3UgYXJlIGNvbm5lY3RlZCB0byB0aGUgaW50ZXJuZXQsIHRoZW4gdHJ5IGFnYWluYFxuICB9O1xuICBjb25zdCBnZXRIdW1hbkZyaWVuZGx5TWVzc2FnZSA9IChvZ0Vycm9yTWVzc2FnZSkgPT4ge1xuICAgIGNvbnN0IGtleSA9IG9nRXJyb3JNZXNzYWdlLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgIHJldHVybiBNQVBfVE9fSFVNQU5fRlJJRU5ETFlfTE9XRVJDQVNFW2tleV0gPz8gb2dFcnJvck1lc3NhZ2U7XG4gIH07XG4gIGNvbnN0IGlzU3RyaW5naWZpZWRKc29uT2JqZWN0ID0gKHN0cikgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHN0cik7XG4gICAgICByZXR1cm4gdHlwZW9mIHBhcnNlZCA9PT0gXCJvYmplY3RcIjtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9O1xuICBjb25zdCBjcmVhdGVNZXNzYWdlRnJvbVB5ZGFudGljVmFsaWRhdGlvbkVycm9yID0gKHJlc3BvbnNlKSA9PiB7XG4gICAgaWYgKHJlc3BvbnNlLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIGdldEh1bWFuRnJpZW5kbHlNZXNzYWdlKHJlc3BvbnNlWzBdLm1zZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGJ1bGxldGVkID0gcmVzcG9uc2UubWFwKChlcnIpID0+IGDigKIgJHtnZXRIdW1hbkZyaWVuZGx5TWVzc2FnZShlcnIubXNnKX1gKS5qb2luKFwiXFxuXCIpO1xuICAgICAgcmV0dXJuIGAke2BQbGVhc2UgZml4IHRoZSBmb2xsb3dpbmcgZXJyb3JzOmB9XG4ke2J1bGxldGVkfWA7XG4gICAgfVxuICB9O1xuICBjb25zdCBjcmVhdGVNZXNzYWdlRnJvbVpvZEZpZWxkRXJyb3JzID0gKGVycm9ycykgPT4ge1xuICAgIGNvbnN0IGxpc3RPZkVycm9ycyA9IGVycm9ycy5tYXAoKGVycikgPT4gYC0gJHtlcnIucGF0aC5qb2luKFwiL1wiKX06ICR7ZXJyLm1lc3NhZ2V9YCkuam9pbihcIlxcblwiKTtcbiAgICByZXR1cm4gYEVuY291bnRlcmVkIHRoZSBmb2xsb3dpbmcgZXJyb3JzOlxuJHtsaXN0T2ZFcnJvcnN9YDtcbiAgfTtcbiAgY29uc3QgZ2V0RXJyb3JNZXNzYWdlID0gKGUpID0+IHtcbiAgICBpZiAoZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBpZiAoaXNTdHJpbmdpZmllZEpzb25PYmplY3QoZS5tZXNzYWdlKSkge1xuICAgICAgICBjb25zdCBvYmogPSBKU09OLnBhcnNlKGUubWVzc2FnZSk7XG4gICAgICAgIGlmIChQeWRhbnRpY1ZhbGlkYXRpb25FcnJvclJlc3BvbnNlLnNhZmVQYXJzZShvYmopLnN1Y2Nlc3MpIHtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlTWVzc2FnZUZyb21QeWRhbnRpY1ZhbGlkYXRpb25FcnJvcihvYmopO1xuICAgICAgICB9IGVsc2UgaWYgKFpvZEZpZWxkRXJyb3JzLnNhZmVQYXJzZShvYmopLnN1Y2Nlc3MpIHtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlTWVzc2FnZUZyb21ab2RGaWVsZEVycm9ycyhvYmopO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgRW5jb3VudGVyZWQgdW5rbm93biBzdHJpbmdpZmllZCBKU09OIG9iamVjdDpcbiR7ZS5tZXNzYWdlfWApO1xuICAgICAgICAgIHJldHVybiBlLm1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBnZXRIdW1hbkZyaWVuZGx5TWVzc2FnZShlLm1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShlKTtcbiAgICAgIH0gY2F0Y2ggKGUyKSB7XG4gICAgICAgIHJldHVybiBlMiArIFwiXCI7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBlICsgXCJcIjtcbiAgICB9XG4gIH07XG4gIGNvbnN0IG1ha2VDYWxsYmFja1NhZmUgPSAoY2FsbGJhY2tOYW1lLCBmbikgPT4ge1xuICAgIHJldHVybiAoLi4uYXJncykgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGZuKC4uLmFyZ3MpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgW2Zvcm1dIEVycm9yIHJ1bm5pbmcgY2FsbGJhY2sgKCR7Y2FsbGJhY2tOYW1lfSk6YCwgZXJyb3IpO1xuICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgfVxuICAgIH07XG4gIH07XG5cbiAgY29uc3QgUmVxdWlyZWRTdHJpbmcgPSB6b2Quei5zdHJpbmcoKS50cmltKCkubWluKDEsIHsgbWVzc2FnZTogYENhbm5vdCBiZSBibGFua2AgfSk7XG4gIGNvbnN0IE9wdGlvbmFsU3RyaW5nID0gem9kLnouc3RyaW5nKCkudHJpbSgpLm9wdGlvbmFsKCk7XG4gIGNvbnN0IG51bGxPclVuZGVmT3IkMSA9ICh6VHlwZSkgPT4gem9kLnoubnVsbGFibGUoelR5cGUub3B0aW9uYWwoKSk7XG4gIHZhciBGaWVsZE5hbWUgPSAvKiBAX19QVVJFX18gKi8gKChGaWVsZE5hbWUyKSA9PiB7XG4gICAgRmllbGROYW1lMltcIkZJUlNUX05BTUVcIl0gPSBcImZpcnN0TmFtZVwiO1xuICAgIEZpZWxkTmFtZTJbXCJMQVNUX05BTUVcIl0gPSBcImxhc3ROYW1lXCI7XG4gICAgRmllbGROYW1lMltcIkVNQUlMXCJdID0gXCJlbWFpbFwiO1xuICAgIEZpZWxkTmFtZTJbXCJaSVBfQ09ERVwiXSA9IFwiemlwQ29kZVwiO1xuICAgIEZpZWxkTmFtZTJbXCJDSVRZXCJdID0gXCJjaXR5XCI7XG4gICAgRmllbGROYW1lMltcIlNUQVRFXCJdID0gXCJzdGF0ZVwiO1xuICAgIEZpZWxkTmFtZTJbXCJDT1VOVFJZXCJdID0gXCJjb3VudHJ5XCI7XG4gICAgRmllbGROYW1lMltcIkFERFJFU1NcIl0gPSBcImFkZHJlc3NcIjtcbiAgICBGaWVsZE5hbWUyW1wiUEhPTkVcIl0gPSBcInBob25lXCI7XG4gICAgRmllbGROYW1lMltcIlBST01PVElPTl9DT0RFXCJdID0gXCJwcm9tb3Rpb25Db2RlXCI7XG4gICAgcmV0dXJuIEZpZWxkTmFtZTI7XG4gIH0pKEZpZWxkTmFtZSB8fCB7fSk7XG4gIGNvbnN0IEZpZWxkTmFtZUVudW0gPSB6b2Quei5uYXRpdmVFbnVtKEZpZWxkTmFtZSk7XG4gIHZhciBQcml2YXRlRmllbGROYW1lID0gLyogQF9fUFVSRV9fICovICgoUHJpdmF0ZUZpZWxkTmFtZTIpID0+IHtcbiAgICBQcml2YXRlRmllbGROYW1lMltcIkNBUkRfTlVNQkVSXCJdID0gXCJjYXJkTnVtYmVyXCI7XG4gICAgUHJpdmF0ZUZpZWxkTmFtZTJbXCJDQVJEX0VYUElSWVwiXSA9IFwiY2FyZEV4cGlyeVwiO1xuICAgIFByaXZhdGVGaWVsZE5hbWUyW1wiQ0FSRF9DVkNcIl0gPSBcImNhcmRDdmNcIjtcbiAgICByZXR1cm4gUHJpdmF0ZUZpZWxkTmFtZTI7XG4gIH0pKFByaXZhdGVGaWVsZE5hbWUgfHwge30pO1xuICBjb25zdCBQcml2YXRlRmllbGROYW1lRW51bSA9IHpvZC56Lm5hdGl2ZUVudW0oUHJpdmF0ZUZpZWxkTmFtZSk7XG4gIGNvbnN0IEFsbEZpZWxkTmFtZXMgPSB6b2Quei51bmlvbihbRmllbGROYW1lRW51bSwgUHJpdmF0ZUZpZWxkTmFtZUVudW1dKTtcbiAgdmFyIEVsZW1lbnRUeXBlRW51bSA9IC8qIEBfX1BVUkVfXyAqLyAoKEVsZW1lbnRUeXBlRW51bTIpID0+IHtcbiAgICBFbGVtZW50VHlwZUVudW0yW1wiQ0FSRFwiXSA9IFwiY2FyZFwiO1xuICAgIEVsZW1lbnRUeXBlRW51bTJbXCJDQVJEX05VTUJFUlwiXSA9IFwiY2FyZC1udW1iZXJcIjtcbiAgICBFbGVtZW50VHlwZUVudW0yW1wiQ0FSRF9FWFBJUllcIl0gPSBcImNhcmQtZXhwaXJ5XCI7XG4gICAgRWxlbWVudFR5cGVFbnVtMltcIkNBUkRfQ1ZDXCJdID0gXCJjYXJkLWN2Y1wiO1xuICAgIHJldHVybiBFbGVtZW50VHlwZUVudW0yO1xuICB9KShFbGVtZW50VHlwZUVudW0gfHwge30pO1xuICBjb25zdCBFbGVtZW50VHlwZSA9IHpvZC56Lm5hdGl2ZUVudW0oRWxlbWVudFR5cGVFbnVtKTtcbiAgY29uc3QgQ2hlY2tvdXRQYXltZW50TWV0aG9kJDEgPSB6b2Quei5vYmplY3Qoe1xuICAgIHByb3ZpZGVyOiB6b2Quei5zdHJpbmcoKSxcbiAgICBwcm9jZXNzb3JfbmFtZTogbnVsbE9yVW5kZWZPciQxKHpvZC56LnN0cmluZygpKSxcbiAgICBtZXRhZGF0YTogbnVsbE9yVW5kZWZPciQxKHpvZC56LnJlY29yZCh6b2Quei5zdHJpbmcoKSwgem9kLnouYW55KCkpKVxuICB9KTtcbiAgY29uc3QgUGF5bWVudE1ldGhvZE1pbmltYWwgPSB6b2Quei5vYmplY3Qoe1xuICAgIGlkOiB6b2Quei5zdHJpbmcoKVxuICB9KTtcbiAgem9kLnoub2JqZWN0KHtcbiAgICBjYXJkTnVtYmVyOiBPcHRpb25hbFN0cmluZyxcbiAgICBleHBpcnk6IE9wdGlvbmFsU3RyaW5nLFxuICAgIGN2YzogT3B0aW9uYWxTdHJpbmdcbiAgfSk7XG4gIHpvZC56Lm9iamVjdCh7XG4gICAgYmFja2dyb3VuZENvbG9yOiBPcHRpb25hbFN0cmluZyxcbiAgICBjb2xvcjogT3B0aW9uYWxTdHJpbmcsXG4gICAgZm9udEZhbWlseTogT3B0aW9uYWxTdHJpbmcsXG4gICAgZm9udFNpemU6IE9wdGlvbmFsU3RyaW5nLFxuICAgIGZvbnRXZWlnaHQ6IE9wdGlvbmFsU3RyaW5nLFxuICAgIG1hcmdpbjogT3B0aW9uYWxTdHJpbmcsXG4gICAgcGFkZGluZzogT3B0aW9uYWxTdHJpbmcsXG4gICAgbGV0dGVyU3BhY2luZzogT3B0aW9uYWxTdHJpbmcsXG4gICAgbGluZUhlaWdodDogT3B0aW9uYWxTdHJpbmdcbiAgfSk7XG4gIGNvbnN0IEV2ZW50VHlwZSA9IHpvZC56LmVudW0oW1xuICAgIC8vIEVsZW1lbnQgLT4gRm9ybVxuICAgIFwiTEFZT1VUXCIsXG4gICAgXCJMT0FERURcIixcbiAgICBcIkJMVVJcIixcbiAgICBcIkZPQ1VTXCIsXG4gICAgXCJDSEFOR0VcIixcbiAgICBcIlRPS0VOSVpFX1NUQVJURURcIixcbiAgICBcIkNIRUNLT1VUX1NUQVJURURcIixcbiAgICBcIlBBWU1FTlRfRkxPV19TVEFSVEVEXCIsXG4gICAgXCJUT0tFTklaRV9TVUNDRVNTXCIsXG4gICAgXCJDSEVDS09VVF9TVUNDRVNTXCIsXG4gICAgXCJMT0FEX0VSUk9SXCIsXG4gICAgXCJWQUxJREFUSU9OX0VSUk9SXCIsXG4gICAgXCJUT0tFTklaRV9FUlJPUlwiLFxuICAgIFwiQ0hFQ0tPVVRfRVJST1JcIixcbiAgICBcIlNFVFVQX1BBWU1FTlRfTUVUSE9EX1NVQ0NFU1NcIixcbiAgICAvLyBGb3JtIC0+IEVsZW1lbnRcbiAgICBcIlRPS0VOSVpFXCIsXG4gICAgXCJDSEVDS09VVFwiLFxuICAgIFwiU1RBUlRfUEFZTUVOVF9GTE9XXCJcbiAgXSk7XG4gIGNvbnN0IEdlbmVyaWNFdmVudFR5cGUgPSBFdmVudFR5cGUuZXh0cmFjdChbXCJUT0tFTklaRV9TVEFSVEVEXCIsIFwiQ0hFQ0tPVVRfU1RBUlRFRFwiXSk7XG4gIGNvbnN0IEdlbmVyaWNFdmVudFBheWxvYWQgPSB6b2Quei5vYmplY3QoeyB0eXBlOiBHZW5lcmljRXZlbnRUeXBlIH0pO1xuICBjb25zdCBJbnB1dEV2ZW50VHlwZSA9IEV2ZW50VHlwZS5leHRyYWN0KFtcIkJMVVJcIiwgXCJGT0NVU1wiLCBcIkNIQU5HRVwiXSk7XG4gIGNvbnN0IElucHV0RXZlbnRQYXlsb2FkID0gem9kLnoub2JqZWN0KHtcbiAgICB0eXBlOiBJbnB1dEV2ZW50VHlwZSxcbiAgICBlbGVtZW50VHlwZTogUHJpdmF0ZUZpZWxkTmFtZUVudW0sXG4gICAgZXJyb3JzOiB6b2Quei5hcnJheSh6b2Quei5zdHJpbmcoKSkub3B0aW9uYWwoKVxuICB9KTtcbiAgY29uc3QgRXJyb3JFdmVudFR5cGUgPSBFdmVudFR5cGUuZXh0cmFjdChbXCJMT0FEX0VSUk9SXCIsIFwiVE9LRU5JWkVfRVJST1JcIiwgXCJDSEVDS09VVF9FUlJPUlwiXSk7XG4gIGNvbnN0IEVycm9yRXZlbnRQYXlsb2FkID0gem9kLnoub2JqZWN0KHtcbiAgICB0eXBlOiBFcnJvckV2ZW50VHlwZSxcbiAgICBtZXNzYWdlOiBSZXF1aXJlZFN0cmluZyxcbiAgICBoZWFkZXJzOiB6b2Quei5yZWNvcmQoem9kLnouc3RyaW5nKCksIHpvZC56LnN0cmluZygpKS5vcHRpb25hbCgpXG4gIH0pO1xuICBjb25zdCBWYWxpZGF0aW9uRXJyb3JFdmVudFR5cGUgPSBFdmVudFR5cGUuZXh0cmFjdChbXCJWQUxJREFUSU9OX0VSUk9SXCJdKTtcbiAgY29uc3QgVmFsaWRhdGlvbkVycm9yRXZlbnRQYXlsb2FkID0gem9kLnoub2JqZWN0KHtcbiAgICB0eXBlOiBWYWxpZGF0aW9uRXJyb3JFdmVudFR5cGUsXG4gICAgZWxlbWVudFR5cGU6IEFsbEZpZWxkTmFtZXMsXG4gICAgZXJyb3JzOiB6b2Quei5hcnJheSh6b2Quei5zdHJpbmcoKSlcbiAgfSk7XG4gIGNvbnN0IExheW91dEV2ZW50UGF5bG9hZCA9IHpvZC56Lm9iamVjdCh7XG4gICAgdHlwZTogem9kLnoubGl0ZXJhbChFdmVudFR5cGUuZW51bS5MQVlPVVQpLFxuICAgIGhlaWdodDogUmVxdWlyZWRTdHJpbmdcbiAgfSk7XG4gIGNvbnN0IExvYWRlZEV2ZW50UGF5bG9hZCA9IHpvZC56Lm9iamVjdCh7XG4gICAgdHlwZTogem9kLnoubGl0ZXJhbChFdmVudFR5cGUuZW51bS5MT0FERUQpLFxuICAgIHNlc3Npb25JZDogUmVxdWlyZWRTdHJpbmcsXG4gICAgdG90YWxBbW91bnRBdG9tczogem9kLnoubnVtYmVyKCksXG4gICAgY3VycmVuY3k6IE9wdGlvbmFsU3RyaW5nLFxuICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZHM6IHpvZC56LmFycmF5KENoZWNrb3V0UGF5bWVudE1ldGhvZCQxKVxuICB9KTtcbiAgY29uc3QgUGF5bWVudEZsb3dTdGFydGVkRXZlbnRQYXlsb2FkID0gem9kLnoub2JqZWN0KHtcbiAgICB0eXBlOiB6b2Quei5saXRlcmFsKEV2ZW50VHlwZS5lbnVtLlBBWU1FTlRfRkxPV19TVEFSVEVEKSxcbiAgICBuZXh0QWN0aW9uTWV0YWRhdGE6IHpvZC56LnJlY29yZCh6b2Quei5zdHJpbmcoKSwgem9kLnouYW55KCkpLFxuICAgIHBheW1lbnRGbG93TWV0YWRhdGE6IHpvZC56LmFueSgpLm9wdGlvbmFsKCksXG4gICAgc3RhcnRQRk1ldGFkYXRhOiB6b2Quei5vcHRpb25hbCh6b2Quei5yZWNvcmQoem9kLnouc3RyaW5nKCksIHpvZC56LmFueSgpKSlcbiAgfSk7XG4gIGNvbnN0IFNldHVwQ2hlY2tvdXRTdWNjZXNzRXZlbnRQYXlsb2FkID0gem9kLnoub2JqZWN0KHtcbiAgICB0eXBlOiB6b2Quei5saXRlcmFsKEV2ZW50VHlwZS5lbnVtLlNFVFVQX1BBWU1FTlRfTUVUSE9EX1NVQ0NFU1MpLFxuICAgIHBheW1lbnRNZXRob2RJZDogem9kLnouc3RyaW5nKClcbiAgfSk7XG4gIGNvbnN0IFJlcXVpcmVkRm9ybUZpZWxkcyA9IHpvZC56Lm9iamVjdCh7XG4gICAgW1wiZmlyc3ROYW1lXCIgLyogRklSU1RfTkFNRSAqL106IFJlcXVpcmVkU3RyaW5nLFxuICAgIFtcImxhc3ROYW1lXCIgLyogTEFTVF9OQU1FICovXTogUmVxdWlyZWRTdHJpbmcsXG4gICAgW1wiZW1haWxcIiAvKiBFTUFJTCAqL106IFJlcXVpcmVkU3RyaW5nLFxuICAgIFtcInppcENvZGVcIiAvKiBaSVBfQ09ERSAqL106IFJlcXVpcmVkU3RyaW5nLFxuICAgIFtcImNvdW50cnlcIiAvKiBDT1VOVFJZICovXTogUmVxdWlyZWRTdHJpbmcsXG4gICAgW1wicHJvbW90aW9uQ29kZVwiIC8qIFBST01PVElPTl9DT0RFICovXTogT3B0aW9uYWxTdHJpbmdcbiAgfSk7XG4gIGNvbnN0IFBSRm9ybUZpZWxkcyA9IHpvZC56Lm9iamVjdCh7XG4gICAgW1wiZW1haWxcIiAvKiBFTUFJTCAqL106IFJlcXVpcmVkU3RyaW5nLFxuICAgIFtcInppcENvZGVcIiAvKiBaSVBfQ09ERSAqL106IFJlcXVpcmVkU3RyaW5nLFxuICAgIFtcImNvdW50cnlcIiAvKiBDT1VOVFJZICovXTogUmVxdWlyZWRTdHJpbmcsXG4gICAgW1wicHJvbW90aW9uQ29kZVwiIC8qIFBST01PVElPTl9DT0RFICovXTogT3B0aW9uYWxTdHJpbmdcbiAgfSk7XG4gIGNvbnN0IFN1Ym1pdEV2ZW50VHlwZSA9IEV2ZW50VHlwZS5leHRyYWN0KFtcIlRPS0VOSVpFXCIsIFwiQ0hFQ0tPVVRcIiwgXCJTVEFSVF9QQVlNRU5UX0ZMT1dcIl0pO1xuICBjb25zdCBTdWJtaXRFdmVudFBheWxvYWQgPSB6b2Quei5vYmplY3Qoe1xuICAgIHR5cGU6IFN1Ym1pdEV2ZW50VHlwZSxcbiAgICBzZXNzaW9uSWQ6IFJlcXVpcmVkU3RyaW5nLFxuICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZDogQ2hlY2tvdXRQYXltZW50TWV0aG9kJDEsXG4gICAgcGF5bWVudEZsb3dNZXRhZGF0YTogem9kLnouYW55KCkub3B0aW9uYWwoKSxcbiAgICBkb05vdFVzZUxlZ2FjeUNDRmxvdzogem9kLnouYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gICAgZXhpc3RpbmdDQ1BNSWQ6IE9wdGlvbmFsU3RyaW5nXG4gIH0pLmV4dGVuZChSZXF1aXJlZEZvcm1GaWVsZHMuc2hhcGUpO1xuICBjb25zdCBUb2tlbml6ZVN1Y2Nlc3NFdmVudFBheWxvYWQgPSB6b2Quei5vYmplY3Qoe1xuICAgIHR5cGU6IHpvZC56LmxpdGVyYWwoRXZlbnRUeXBlLmVudW0uVE9LRU5JWkVfU1VDQ0VTUyksXG4gICAgaXNSZWFkeUZvckNoZWNrb3V0OiB6b2Quei5ib29sZWFuKClcbiAgfSk7XG4gIGNvbnN0IENoZWNrb3V0U3VjY2Vzc0V2ZW50UGF5bG9hZCA9IHpvZC56Lm9iamVjdCh7XG4gICAgdHlwZTogem9kLnoubGl0ZXJhbChFdmVudFR5cGUuZW51bS5DSEVDS09VVF9TVUNDRVNTKSxcbiAgICBpbnZvaWNlVXJsczogem9kLnouYXJyYXkoem9kLnouc3RyaW5nKCkpLFxuICAgIHN1YnNjcmlwdGlvbklkczogem9kLnouYXJyYXkoem9kLnouc3RyaW5nKCkpLFxuICAgIGN1c3RvbWVySWQ6IHpvZC56LnN0cmluZygpXG4gIH0pO1xuICBjb25zdCBFdmVudFBheWxvYWQgPSB6b2Quei5kaXNjcmltaW5hdGVkVW5pb24oXCJ0eXBlXCIsIFtcbiAgICBHZW5lcmljRXZlbnRQYXlsb2FkLFxuICAgIElucHV0RXZlbnRQYXlsb2FkLFxuICAgIEVycm9yRXZlbnRQYXlsb2FkLFxuICAgIFZhbGlkYXRpb25FcnJvckV2ZW50UGF5bG9hZCxcbiAgICBMYXlvdXRFdmVudFBheWxvYWQsXG4gICAgTG9hZGVkRXZlbnRQYXlsb2FkLFxuICAgIFN1Ym1pdEV2ZW50UGF5bG9hZCxcbiAgICBUb2tlbml6ZVN1Y2Nlc3NFdmVudFBheWxvYWQsXG4gICAgQ2hlY2tvdXRTdWNjZXNzRXZlbnRQYXlsb2FkLFxuICAgIFBheW1lbnRGbG93U3RhcnRlZEV2ZW50UGF5bG9hZCxcbiAgICBTZXR1cENoZWNrb3V0U3VjY2Vzc0V2ZW50UGF5bG9hZFxuICBdKTtcbiAgY29uc3QgRWxlbWVudEV2ZW50ID0gem9kLnoub2JqZWN0KHtcbiAgICBwYXlsb2FkOiBFdmVudFBheWxvYWQsXG4gICAgbm9uY2U6IFJlcXVpcmVkU3RyaW5nLFxuICAgIGZvcm1JZDogUmVxdWlyZWRTdHJpbmcsXG4gICAgZWxlbWVudElkOiBSZXF1aXJlZFN0cmluZ1xuICB9KTtcbiAgem9kLnoub2JqZWN0KHtcbiAgICBhbW91bnRBdG9tOiB6b2Quei5udW1iZXIoKSxcbiAgICBjdXJyZW5jeTogUmVxdWlyZWRTdHJpbmdcbiAgfSk7XG4gIHpvZC56Lm9iamVjdCh7XG4gICAgc2VjdXJlX3Rva2VuOiB6b2Quei5zdHJpbmcoKSxcbiAgICBwcm9tb3Rpb25fY29kZTogem9kLnouc3RyaW5nKCkub3B0aW9uYWwoKVxuICB9KTtcbiAgem9kLnoub2JqZWN0KHtcbiAgICBzZWN1cmVfdG9rZW46IHpvZC56LnN0cmluZygpLFxuICAgIGV4aXN0aW5nX2NjX3BtX2lkOiBudWxsT3JVbmRlZk9yJDEoem9kLnouc3RyaW5nKCkpXG4gIH0pO1xuICBjb25zdCBDb25maXJtUGF5bWVudEZsb3dSZXNwb25zZSA9IHpvZC56Lm9iamVjdCh7XG4gICAgcGF5bWVudF9tZXRob2RzOiB6b2Quei5hcnJheShQYXltZW50TWV0aG9kTWluaW1hbClcbiAgfSk7XG4gIGNvbnN0IEZpZWxkVmFsaWRhdGlvbkVycm9yID0gem9kLnoub2JqZWN0KHtcbiAgICBlbGVtZW50VHlwZTogem9kLnouc3RyaW5nKCksXG4gICAgZXJyb3JzOiB6b2Quei5hcnJheSh6b2Quei5zdHJpbmcoKSlcbiAgfSk7XG4gIHpvZC56Lm9iamVjdCh7XG4gICAgc2Vzc2lvbl9pZDogem9kLnouc3RyaW5nKClcbiAgfSk7XG4gIGNvbnN0IFRva2VuaXplQ2FyZEVycm9yUmVzcG9uc2UgPSB6b2Quei5vYmplY3Qoe1xuICAgIHN1Y2Nlc3M6IHpvZC56LmxpdGVyYWwoZmFsc2UpLFxuICAgIGVycm9yX3R5cGU6IHpvZC56LmxpdGVyYWwoXCJ2YWxpZGF0aW9uX2Vycm9yXCIpLFxuICAgIGVycm9yczogem9kLnouYXJyYXkoRmllbGRWYWxpZGF0aW9uRXJyb3IpXG4gIH0pO1xuICBjb25zdCBUb2tlbml6ZUNhcmRSZXNwb25zZSA9IHpvZC56LmRpc2NyaW1pbmF0ZWRVbmlvbihcInN1Y2Nlc3NcIiwgW1xuICAgIHpvZC56Lm9iamVjdCh7IHN1Y2Nlc3M6IHpvZC56LmxpdGVyYWwodHJ1ZSkgfSksXG4gICAgVG9rZW5pemVDYXJkRXJyb3JSZXNwb25zZVxuICBdKTtcbiAgem9kLnoub2JqZWN0KHtcbiAgICBzZXNzaW9uX2lkOiB6b2Quei5zdHJpbmcoKSxcbiAgICBjaGVja291dF9wYXltZW50X21ldGhvZDogQ2hlY2tvdXRQYXltZW50TWV0aG9kJDEsXG4gICAgbm9uX2NkZV9mb3JtX2ZpZWxkczogUmVxdWlyZWRGb3JtRmllbGRzLFxuICAgIGRvX25vdF91c2VfbGVnYWN5X2NjX2Zsb3c6IHpvZC56LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICAgIGV4aXN0aW5nX2NjX3BtX2lkOiBudWxsT3JVbmRlZk9yJDEoem9kLnouc3RyaW5nKCkpXG4gIH0pO1xuICB6b2Quei5vYmplY3Qoe1xuICAgIHNlc3Npb25faWQ6IHpvZC56LnN0cmluZygpLFxuICAgIGNoZWNrb3V0X3BheW1lbnRfbWV0aG9kOiBDaGVja291dFBheW1lbnRNZXRob2QkMSxcbiAgICBub25fY2RlX2Zvcm1fZmllbGRzOiBSZXF1aXJlZEZvcm1GaWVsZHNcbiAgfSk7XG4gIHZhciBUaHJlZURTU3RhdHVzID0gLyogQF9fUFVSRV9fICovICgoVGhyZWVEU1N0YXR1czIpID0+IHtcbiAgICBUaHJlZURTU3RhdHVzMltcIlNVQ0NFU1NcIl0gPSBcInN1Y2Nlc3NcIjtcbiAgICBUaHJlZURTU3RhdHVzMltcIkZBSUxVUkVcIl0gPSBcImZhaWx1cmVcIjtcbiAgICBUaHJlZURTU3RhdHVzMltcIkNBTkNFTExFRFwiXSA9IFwiY2FuY2VsbGVkXCI7XG4gICAgcmV0dXJuIFRocmVlRFNTdGF0dXMyO1xuICB9KShUaHJlZURTU3RhdHVzIHx8IHt9KTtcbiAgY29uc3QgUGluZzNEU1N0YXR1c1Jlc3BvbnNlID0gem9kLnoub2JqZWN0KHtcbiAgICBzdGF0dXM6IHpvZC56LmVudW0oW1wic3VjY2Vzc1wiIC8qIFNVQ0NFU1MgKi8sIFwiZmFpbHVyZVwiIC8qIEZBSUxVUkUgKi8sIFwiY2FuY2VsbGVkXCIgLyogQ0FOQ0VMTEVEICovXSlcbiAgfSk7XG4gIGNvbnN0IENvbW1vbjNEU05leHRBY3Rpb25NZXRhZGF0YSA9IHpvZC56Lm9iamVjdCh7XG4gICAgdHlwZTogem9kLnouc3RyaW5nKCksXG4gICAgcmVkaXJlY3RfdXJsOiB6b2Quei5zdHJpbmcoKSxcbiAgICBpbml0aWFsX2ludGVudF9pZDogem9kLnouc3RyaW5nKCksXG4gICAgY29uc2VudF9pZDogem9kLnouc3RyaW5nKClcbiAgfSk7XG5cbiAgY29uc3QgZXh0cmFjdElzc3Vlc1BlckZpZWxkID0gKGVycm9yKSA9PiB7XG4gICAgY29uc3QgaXNzdWVzUGVyRmllbGQgPSB7fTtcbiAgICBPYmplY3QuZW50cmllcyhlcnJvcikuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBmaWVsZE5hbWUgPSBGaWVsZE5hbWVFbnVtLnBhcnNlKGtleSk7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgIGlzc3Vlc1BlckZpZWxkW2ZpZWxkTmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlLl9lcnJvcnMpKSB7XG4gICAgICAgICAgaXNzdWVzUGVyRmllbGRbZmllbGROYW1lXSA9IHZhbHVlLl9lcnJvcnM7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGlzc3Vlc1BlckZpZWxkO1xuICB9O1xuXG4gIGNvbnN0IFN0cmlwZTNEU05leHRBY3Rpb25NZXRhZGF0YSA9IHpvZC56Lm9iamVjdCh7XG4gICAgc3RyaXBlX3BrOiB6b2Quei5zdHJpbmcoKSxcbiAgICBjbGllbnRfc2VjcmV0OiB6b2Quei5zdHJpbmcoKSxcbiAgICBzdHJpcGVfcG1faWQ6IHpvZC56LnN0cmluZygpXG4gIH0pO1xuICBjb25zdCBQYXltZW50UmVxdWVzdE5leHRBY3Rpb25NZXRhZGF0YSA9IHpvZC56Lm9iamVjdCh7XG4gICAgdHlwZTogem9kLnouc3RyaW5nKCksXG4gICAgY2xpZW50X3NlY3JldDogem9kLnouc3RyaW5nKCksXG4gICAgc3RyaXBlX3BrOiB6b2Quei5zdHJpbmcoKVxuICB9KTtcbiAgY29uc3Qgb3VyQ3VycmVuY3lUb1RoZWlycyA9IHtcbiAgICB1c2Q6IFwidXNkXCIsXG4gICAgYnJsOiBcImJybFwiXG4gIH07XG4gIGNvbnN0IGdldExvYWRlZFN0cmlwZSA9IGFzeW5jIChwdWJsaXNoYWJsZUtleSkgPT4ge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTA7IGkrKykge1xuICAgICAgaWYgKCFpc1N0cmlwZUpzUHJlc2VudCgpKSB7XG4gICAgICAgIGF3YWl0IHNsZWVwKDUwMCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghaXNTdHJpcGVKc1ByZXNlbnQoKSkge1xuICAgICAgY29uc29sZS5sb2coXCJTdHJpcGUgSlMgbm90IGZvdW5kLlwiKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU3RyaXBlIEpTIG5vdCBmb3VuZC5gKTtcbiAgICB9XG4gICAgY29uc3Qgc3RyaXBlID0gbmV3IFN0cmlwZShwdWJsaXNoYWJsZUtleSk7XG4gICAgcmV0dXJuIHN0cmlwZTtcbiAgfTtcbiAgY29uc3QgY3JlYXRlU3RyaXBlRWxlbWVudHMgPSBhc3luYyAoc3RyaXBlUHViS2V5LCBlbGVtZW50c09wdGlvbnMpID0+IHtcbiAgICBjb25zdCBzdHJpcGUgPSBhd2FpdCBnZXRMb2FkZWRTdHJpcGUoc3RyaXBlUHViS2V5KTtcbiAgICByZXR1cm4ge1xuICAgICAgZWxlbWVudHM6IHN0cmlwZS5lbGVtZW50cyhlbGVtZW50c09wdGlvbnMpLFxuICAgICAgc3RyaXBlXG4gICAgfTtcbiAgfTtcbiAgY29uc3QgY3JlYXRlU3RyaXBlUGF5bWVudFJlcXVlc3QgPSBhc3luYyAoc3RyaXBlUHViS2V5LCB0b3RhbEFtb3VudEF0b20sIGN1cnJlbmN5LCBpc0Ftb3VudFBlbmRpbmcsIGlzTGlua09ubHkpID0+IHtcbiAgICBjb25zb2xlLmxvZyhpc0xpbmtPbmx5KTtcbiAgICBjb25zdCBzdHJpcGUgPSBhd2FpdCBnZXRMb2FkZWRTdHJpcGUoc3RyaXBlUHViS2V5KTtcbiAgICBjb25zdCBzdHJpcGVDdXJyZW5jeSA9IG91ckN1cnJlbmN5VG9UaGVpcnNbY3VycmVuY3kudG9Mb3dlckNhc2UoKS50cmltKCldO1xuICAgIGNvbnN0IHBheW1lbnRSZXF1ZXN0ID0gc3RyaXBlLnBheW1lbnRSZXF1ZXN0KHtcbiAgICAgIC8vIFRPRE86IHJlcGxhY2UgdGhpcyB3aXRoIHN0cmlwZSBhY2NvdW50IGNvdW50cnkgYXMgc29vbiBhcyB3ZSBzdXBwb3J0IGl0XG4gICAgICBjb3VudHJ5OiBcIlVTXCIsXG4gICAgICBjdXJyZW5jeTogc3RyaXBlQ3VycmVuY3ksXG4gICAgICB0b3RhbDoge1xuICAgICAgICBsYWJlbDogXCJUb3RhbFwiLFxuICAgICAgICBhbW91bnQ6IHRvdGFsQW1vdW50QXRvbSxcbiAgICAgICAgcGVuZGluZzogaXNBbW91bnRQZW5kaW5nXG4gICAgICB9LFxuICAgICAgcmVxdWVzdFBheWVyTmFtZTogdHJ1ZSxcbiAgICAgIHJlcXVlc3RQYXllckVtYWlsOiB0cnVlLFxuICAgICAgZGlzYWJsZVdhbGxldHM6IFtdIFxuICAgIH0pO1xuICAgIHJldHVybiBwYXltZW50UmVxdWVzdDtcbiAgfTtcbiAgY29uc3Qgc2xlZXAgPSAodGltZW91dE1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIHRpbWVvdXRNcyk7XG4gICAgfSk7XG4gIH07XG4gIGNvbnN0IGlzU3RyaXBlSnNQcmVzZW50ID0gKCkgPT4ge1xuICAgIHJldHVybiBcIlN0cmlwZVwiIGluIHdpbmRvdztcbiAgfTtcbiAgY29uc3Qgd2FpdEZvclVzZXJUb0FkZFBheW1lbnRNZXRob2QgPSBhc3luYyAocGF5bWVudFJlcXVlc3QpID0+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcGF5bWVudFJlcXVlc3Qub24oXCJwYXltZW50bWV0aG9kXCIsIGFzeW5jIChldnQpID0+IHtcbiAgICAgICAgICByZXNvbHZlKGV2dCk7XG4gICAgICAgIH0pO1xuICAgICAgICBwYXltZW50UmVxdWVzdC5vbihcImNhbmNlbFwiLCAoKSA9PiB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgUGF5bWVudCBjYW5jZWxsZWQsIHBsZWFzZSBjbGljayBTdWJtaXQgYWdhaW4gdG8gcGF5YCkpO1xuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuICBjb25zdCBjb25maXJtU3RyaXBlUHJQTSA9IGFzeW5jIChuZXh0QWN0aW9uTWV0YWRhdGEsIHN0cmlwZVBtKSA9PiB7XG4gICAgaWYgKCFuZXh0QWN0aW9uTWV0YWRhdGEuc3RyaXBlX3BrIHx8ICFuZXh0QWN0aW9uTWV0YWRhdGEuY2xpZW50X3NlY3JldCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG5leHQgYWN0aW9uIG1ldGFkYXRhIGZvcm1hdDogJHtKU09OLnN0cmluZ2lmeShuZXh0QWN0aW9uTWV0YWRhdGEpfWApO1xuICAgIH1cbiAgICBjb25zdCBzdHJpcGUgPSBhd2FpdCBnZXRMb2FkZWRTdHJpcGUobmV4dEFjdGlvbk1ldGFkYXRhLnN0cmlwZV9wayk7XG4gICAgY29uc3QgY29uZmlybVJlc3VsdCA9IGF3YWl0IHN0cmlwZS5jb25maXJtQ2FyZFNldHVwKG5leHRBY3Rpb25NZXRhZGF0YS5jbGllbnRfc2VjcmV0LCB7XG4gICAgICBwYXltZW50X21ldGhvZDogc3RyaXBlUG0ucGF5bWVudE1ldGhvZC5pZFxuICAgIH0pO1xuICAgIGlmIChjb25maXJtUmVzdWx0LmVycm9yKSB7XG4gICAgICBzdHJpcGVQbS5jb21wbGV0ZShcImZhaWxcIik7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFBheW1lbnQgZmFpbGVkOiAke2NvbmZpcm1SZXN1bHQuZXJyb3IubWVzc2FnZSA/PyBgdW5rbm93bmB9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0cmlwZVBtLmNvbXBsZXRlKFwic3VjY2Vzc1wiKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbmZpcm1SZXN1bHQ7XG4gIH07XG4gIGNvbnN0IGxhdW5jaFN0cmlwZTNEU0RpYWxvZ0Zsb3cgPSBhc3luYyAobmV4dEFjdGlvbk1ldGFkYXRhKSA9PiB7XG4gICAgY29uc3Qgc3RyaXBlID0gYXdhaXQgZ2V0TG9hZGVkU3RyaXBlKG5leHRBY3Rpb25NZXRhZGF0YS5zdHJpcGVfcGspO1xuICAgIGNvbnN0IGNvbmZpcm1SZXN1bHQgPSBhd2FpdCBzdHJpcGUuY29uZmlybUNhcmRTZXR1cChuZXh0QWN0aW9uTWV0YWRhdGEuY2xpZW50X3NlY3JldCwge1xuICAgICAgcGF5bWVudF9tZXRob2Q6IG5leHRBY3Rpb25NZXRhZGF0YS5zdHJpcGVfcG1faWRcbiAgICB9KTtcbiAgICBjb25zdCByZXN1bHRTdGF0dXMgPSBjb25maXJtUmVzdWx0LnNldHVwSW50ZW50Py5zdGF0dXM7XG4gICAgaWYgKHJlc3VsdFN0YXR1cyA9PT0gXCJzdWNjZWVkZWRcIikge1xuICAgICAgY29uc29sZS5sb2coXCJbM0RTXSBDT05GSVJNSU5HIFBNOlwiLCBuZXh0QWN0aW9uTWV0YWRhdGEuc3RyaXBlX3BtX2lkKTtcbiAgICAgIGNvbnNvbGUubG9nKFwiWzNEU10gU2V0dXAgaW50ZW50IGNyZWF0ZWQ6XCIsIGNvbmZpcm1SZXN1bHQuc2V0dXBJbnRlbnQpO1xuICAgIH0gZWxzZSBpZiAocmVzdWx0U3RhdHVzID09PSBcImNhbmNlbGVkXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUGF5bWVudCBjYW5jZWxsZWQsIHBsZWFzZSBjbGljayBTdWJtaXQgYWdhaW4gdG8gcGF5YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYCR7Y29uZmlybVJlc3VsdC5lcnJvcj8ubWVzc2FnZSA/PyBjb25maXJtUmVzdWx0LnNldHVwSW50ZW50Py5sYXN0X3NldHVwX2Vycm9yPy5tZXNzYWdlID8/IFwiUGF5bWVudCBmYWlsZWQsIHBsZWFzZSBjbGljayBzdWJtaXQgYWdhaW4gdG8gcGF5LlwifWBcbiAgICAgICk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGNvbnZlcnRTdHlsZXNUb1F1ZXJ5U3RyaW5nID0gKHN0eWxlcykgPT4ge1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRTdHlsZXMgPSBKU09OLnN0cmluZ2lmeShzdHlsZXMpO1xuICAgIHJldHVybiBzZXJpYWxpemVkU3R5bGVzO1xuICB9O1xuXG4gIGNvbnN0IGNyZWF0ZUlucHV0c0RpY3RGcm9tRm9ybSA9IChmb3JtRGl2LCBpbml0aWFsRGljdCkgPT4ge1xuICAgIGNvbnN0IGluY2x1ZGVkSW5wdXRzID0gQXJyYXkuZnJvbShmb3JtRGl2LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbZGF0YS1vcGlkXVwiKSA/PyBbXSk7XG4gICAgY29uc3QgZXh0cmFEYXRhID0gaW5jbHVkZWRJbnB1dHMucmVkdWNlKChhY2MsIGlucHV0KSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBpbnB1dC5nZXRBdHRyaWJ1dGUoXCJkYXRhLW9waWRcIik7XG4gICAgICBpZiAoIWtleSkgcmV0dXJuIGFjYztcbiAgICAgIHJldHVybiB7IC4uLmFjYywgW2tleV06IGlucHV0LnZhbHVlIH07XG4gICAgfSwge30pO1xuICAgIHJldHVybiBleHRyYURhdGE7XG4gIH07XG4gIGNvbnN0IHBhcnNlRXZlbnRQYXlsb2FkID0gKGV2ZW50RGF0YSkgPT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gRWxlbWVudEV2ZW50LnBhcnNlKGV2ZW50RGF0YSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBwYXJzaW5nIGV2ZW50IHBheWxvYWQ6XCIsIGV2ZW50RGF0YSwgZXJyb3IpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9O1xuICBjb25zdCBlbWl0RXZlbnQgPSAodGFyZ2V0LCBmb3JtSWQsIGVsZW1lbnRJZCwgcGF5bG9hZCwgYmFzZVVybCkgPT4ge1xuICAgIGNvbnN0IGV2ZW50ID0ge1xuICAgICAgcGF5bG9hZCxcbiAgICAgIG5vbmNlOiB1dWlkLnY0KCksXG4gICAgICBmb3JtSWQsXG4gICAgICBlbGVtZW50SWRcbiAgICB9O1xuICAgIGNvbnNvbGUubG9nKGBbZm9ybSAke2Zvcm1JZH1dIFNlbmRpbmcgZXZlbnQgdG8gY2hpbGQgJHtlbGVtZW50SWR9OmAsIGV2ZW50KTtcbiAgICB0YXJnZXQucG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoZXZlbnQpLCBiYXNlVXJsKTtcbiAgfTtcblxuICBjb25zdCBjaGVja0lmVmFsaWRDZGVDb25uZWN0aW9uT2JqZWN0ID0gYXN5bmMgKG9iaikgPT4ge1xuICAgIGlmICh0eXBlb2Ygb2JqICE9PSBcIm9iamVjdFwiIHx8ICFvYmopIHJldHVybiBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGluZyA9IHsgdHlwZTogXCJwaW5nXCIgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG9iai5zZW5kKHBpbmcpO1xuICAgICAgaWYgKHJlc3VsdCAhPT0gdHJ1ZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICd0cnVlJyBhZnRlciBwaW5nLCBnb3QgJHtKU09OLnN0cmluZ2lmeShyZXN1bHQpfWApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcihgSW52YWxpZCBDREUgY29ubmVjdGlvbiBjaGVjazpgLCBlKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IGlzUmVzdWx0VmFsaWQgPSAob2JqLCBpc1ZhbGlkKSA9PiB7XG4gICAgcmV0dXJuICEhb2JqICYmIGlzVmFsaWQ7XG4gIH07XG5cbiAgY29uc3QgbnVsbE9yVW5kZWZPciA9ICh6VHlwZSkgPT4gem9kLnoubnVsbGFibGUoelR5cGUub3B0aW9uYWwoKSk7XG4gIHpvZC56LnN0cmluZygpLnRyaW0oKS5taW4oMSwgeyBtZXNzYWdlOiBgQ2Fubm90IGJlIGJsYW5rYCB9KTtcbiAgY29uc3QgQ0RFUmVzcG9uc2VFcnJvciA9IHpvZC56Lm9iamVjdCh7XG4gICAgY2RlX3Jlc3BvbnNlX3R5cGU6IHpvZC56LmxpdGVyYWwoXCJlcnJvclwiKSxcbiAgICBtZXNzYWdlOiB6b2Quei5zdHJpbmcoKSxcbiAgICBoZWFkZXJzOiB6b2Quei5yZWNvcmQoem9kLnouc3RyaW5nKCksIHpvZC56LnN0cmluZygpKS5vcHRpb25hbCgpXG4gIH0pO1xuICB6b2Quei5lbnVtKFtcInVzZFwiLCBcImJybFwiXSk7XG4gIGNvbnN0IENvdXBvbk1pbmltYWwgPSB6b2Quei5vYmplY3Qoe1xuICAgIG5hbWU6IHpvZC56LnN0cmluZygpLFxuICAgIGFtb3VudF9hdG9tX29mZjogbnVsbE9yVW5kZWZPcih6b2Quei5udW1iZXIoKSksXG4gICAgcGVyY2VudF9vZmY6IG51bGxPclVuZGVmT3Ioem9kLnoubnVtYmVyKCkpLFxuICAgIGN1cnJlbmN5OiBudWxsT3JVbmRlZk9yKHpvZC56LnN0cmluZygpKSxcbiAgICBkdXJhdGlvbjogem9kLnouc3RyaW5nKCksXG4gICAgZHVyYXRpb25faW5fbW9udGhzOiBudWxsT3JVbmRlZk9yKHpvZC56Lm51bWJlcigpKVxuICB9KTtcbiAgY29uc3QgTGluZUl0ZW0gPSB6b2Quei5vYmplY3Qoe1xuICAgIGFtb3VudF9zdWJ0b3RhbF9hdG9tOiB6b2Quei5udW1iZXIoKS5pbnQoKSxcbiAgICBhbW91bnRfdG90YWxfYXRvbTogem9kLnoubnVtYmVyKCkuaW50KCksXG4gICAgY3VycmVuY3k6IHpvZC56LnN0cmluZygpLFxuICAgIGRlc2NyaXB0aW9uOiBudWxsT3JVbmRlZk9yKHpvZC56LnN0cmluZygpKSxcbiAgICBwcmljZV9pZDogem9kLnouc3RyaW5nKCksXG4gICAgYmlsbGluZ19pbnRlcnZhbDogbnVsbE9yVW5kZWZPcih6b2Quei5zdHJpbmcoKSksXG4gICAgYmlsbGluZ19pbnRlcnZhbF9jb3VudDogbnVsbE9yVW5kZWZPcih6b2Quei5udW1iZXIoKS5pbnQoKSksXG4gICAgcXVhbnRpdHk6IHpvZC56Lm51bWJlcigpLmludCgpXG4gIH0pO1xuICBjb25zdCBCcmFuZFNldHRpbmdzID0gem9kLnoucmVjb3JkKHpvZC56LnN0cmluZygpLCB6b2Quei5hbnkoKSk7XG4gIGNvbnN0IEJyYW5kID0gem9kLnoub2JqZWN0KHtcbiAgICBuYW1lOiB6b2Quei5zdHJpbmcoKSxcbiAgICBzZXR0aW5nczogbnVsbE9yVW5kZWZPcihCcmFuZFNldHRpbmdzKVxuICB9KTtcbiAgY29uc3QgQ2hlY2tvdXRQYXltZW50TWV0aG9kID0gem9kLnoub2JqZWN0KHtcbiAgICBwcm92aWRlcjogem9kLnouc3RyaW5nKCksXG4gICAgcHJvY2Vzc29yX25hbWU6IG51bGxPclVuZGVmT3Ioem9kLnouc3RyaW5nKCkpLFxuICAgIG1ldGFkYXRhOiBudWxsT3JVbmRlZk9yKHpvZC56LnJlY29yZCh6b2Quei5zdHJpbmcoKSwgem9kLnouYW55KCkpKVxuICB9KTtcbiAgY29uc3QgU3Vic2NyaXB0aW9uSXRlbU1pbmltYWwgPSB6b2Quei5vYmplY3Qoe1xuICAgIHF1YW50aXR5OiB6b2Quei5udW1iZXIoKVxuICB9KTtcbiAgY29uc3QgU3Vic2NyaXB0aW9uTWluaW1hbCA9IHpvZC56Lm9iamVjdCh7XG4gICAgaWQ6IG51bGxPclVuZGVmT3Ioem9kLnouc3RyaW5nKCkpLFxuICAgIGJpbGxpbmdfaW50ZXJ2YWw6IG51bGxPclVuZGVmT3Ioem9kLnouc3RyaW5nKCkpLFxuICAgIGJpbGxpbmdfaW50ZXJ2YWxfY291bnQ6IG51bGxPclVuZGVmT3Ioem9kLnoubnVtYmVyKCkuaW50KCkpLFxuICAgIHN1YnNjcmlwdGlvbl9pdGVtczogem9kLnouYXJyYXkoU3Vic2NyaXB0aW9uSXRlbU1pbmltYWwpLFxuICAgIHRyaWFsX3N0YXJ0OiBudWxsT3JVbmRlZk9yKHpvZC56LnN0cmluZygpKSxcbiAgICB0cmlhbF9lbmQ6IG51bGxPclVuZGVmT3Ioem9kLnouc3RyaW5nKCkpXG4gIH0pO1xuICBjb25zdCBJbnZvaWNlSXRlbURpc2NvdW50QW1vdW50c01pbmltYWwgPSB6b2Quei5vYmplY3Qoe1xuICAgIGFtb3VudF9hdG9tOiB6b2Quei5udW1iZXIoKVxuICB9KTtcbiAgY29uc3QgSW52b2ljZUxpbmVJdGVtTWluaW1hbCA9IHpvZC56Lm9iamVjdCh7XG4gICAgYW1vdW50X2F0b206IHpvZC56Lm51bWJlcigpLFxuICAgIGFtb3VudF9hdG9tX2NvbnNpZGVyaW5nX2Rpc2NvdW50X2FwcGxpZWQ6IHpvZC56Lm51bWJlcigpLFxuICAgIGN1cnJlbmN5OiB6b2Quei5zdHJpbmcoKSxcbiAgICBkaXNjb3VudF9hbW91bnRfYXRvbXM6IHpvZC56LmFycmF5KEludm9pY2VJdGVtRGlzY291bnRBbW91bnRzTWluaW1hbCksXG4gICAgc3Vic2NyaXB0aW9uX2l0ZW1faWQ6IHpvZC56LnN0cmluZygpXG4gIH0pO1xuICBjb25zdCBEaXNjb3VudE1pbmltYWwgPSB6b2Quei5vYmplY3Qoe1xuICAgIGNvdXBvbjogQ291cG9uTWluaW1hbFxuICB9KTtcbiAgY29uc3QgSW52b2ljZU1pbmltYWwgPSB6b2Quei5vYmplY3Qoe1xuICAgIGN1cnJlbmN5OiB6b2Quei5zdHJpbmcoKSxcbiAgICBkaXNjb3VudHM6IHpvZC56LmFycmF5KERpc2NvdW50TWluaW1hbCksXG4gICAgaG9zdGVkX2ludm9pY2VfdXJsOiBudWxsT3JVbmRlZk9yKHpvZC56LnN0cmluZygpKSxcbiAgICBsaW5lczogem9kLnouYXJyYXkoSW52b2ljZUxpbmVJdGVtTWluaW1hbCksXG4gICAgcmVtYWluaW5nX2Ftb3VudF9hdG9tOiB6b2Quei5udW1iZXIoKSxcbiAgICB0YXhfYW1vdW50X2F0b206IHpvZC56Lm51bWJlcigpLFxuICAgIHRvdGFsX2Ftb3VudF9hdG9tOiB6b2Quei5udW1iZXIoKSxcbiAgICB0b3RhbF9kaXNjb3VudF9hbW91bnRfYXRvbXM6IHpvZC56LmFycmF5KEludm9pY2VJdGVtRGlzY291bnRBbW91bnRzTWluaW1hbClcbiAgfSk7XG4gIGNvbnN0IENyZWF0ZVN1YnNjcmlwdGlvblJlc3BvbnNlTWluaW1hbCA9IHpvZC56Lm9iamVjdCh7XG4gICAgY3JlYXRlZDogem9kLnouYXJyYXkoU3Vic2NyaXB0aW9uTWluaW1hbCksXG4gICAgaW52b2ljZXM6IHpvZC56LmFycmF5KEludm9pY2VNaW5pbWFsKVxuICB9KTtcbiAgY29uc3QgUHJldmlld0NoZWNrb3V0UmVzcG9uc2UgPSB6b2Quei5vYmplY3Qoe1xuICAgIHByZXZpZXc6IENyZWF0ZVN1YnNjcmlwdGlvblJlc3BvbnNlTWluaW1hbCxcbiAgICBwcmV2aWV3X3Bvc3RfdHJpYWw6IG51bGxPclVuZGVmT3IoQ3JlYXRlU3Vic2NyaXB0aW9uUmVzcG9uc2VNaW5pbWFsKSxcbiAgICBjb3Vwb25zOiB6b2Quei5hcnJheShDb3Vwb25NaW5pbWFsKVxuICB9KTtcbiAgY29uc3QgX1BheW1lbnRGb3JtUHJlZmlsbENvbW1vbiA9IHpvZC56Lm9iamVjdCh7XG4gICAgc3RhdHVzOiB6b2Quei5saXRlcmFsKFwib3BlblwiKSxcbiAgICB0b2tlbjogem9kLnouc3RyaW5nKCksXG4gICAgZW1haWw6IG51bGxPclVuZGVmT3Ioem9kLnouc3RyaW5nKCkpLFxuICAgIGxpbmVfaXRlbXM6IHpvZC56LmFycmF5KExpbmVJdGVtKSxcbiAgICBhbW91bnRfc3VidG90YWxfYXRvbTogem9kLnoubnVtYmVyKCkuaW50KCksXG4gICAgYW1vdW50X3RvdGFsX2F0b206IHpvZC56Lm51bWJlcigpLmludCgpLFxuICAgIGJyYW5kOiBCcmFuZCxcbiAgICBzdWJzX3ByZXZpZXc6IG51bGxPclVuZGVmT3IoUHJldmlld0NoZWNrb3V0UmVzcG9uc2UpLFxuICAgIC8vIE51bGwgaW4gc2V0dXAgbW9kZVxuICAgIG1ldGhvZHNfYXZhaWxhYmxlOiB6b2Quei5hcnJheShDaGVja291dFBheW1lbnRNZXRob2QpXG4gIH0pO1xuICBjb25zdCBQYXltZW50Rm9ybVByZWZpbGwgPSB6b2Quei5kaXNjcmltaW5hdGVkVW5pb24oXCJtb2RlXCIsIFtcbiAgICB6b2Quei5vYmplY3Qoe1xuICAgICAgbW9kZTogem9kLnoubGl0ZXJhbChcInNldHVwXCIpLFxuICAgICAgY3VycmVuY3k6IHpvZC56Lm51bGxhYmxlKHpvZC56LnVuZGVmaW5lZCgpKVxuICAgIH0pLmV4dGVuZChfUGF5bWVudEZvcm1QcmVmaWxsQ29tbW9uLnNoYXBlKSxcbiAgICB6b2Quei5vYmplY3Qoe1xuICAgICAgbW9kZTogem9kLnouZW51bShbXCJwYXltZW50XCIsIFwic3Vic2NyaXB0aW9uXCJdKSxcbiAgICAgIGN1cnJlbmN5OiB6b2Quei5zdHJpbmcoKVxuICAgIH0pLmV4dGVuZChfUGF5bWVudEZvcm1QcmVmaWxsQ29tbW9uLnNoYXBlKVxuICBdKTtcbiAgY29uc3QgQ29tcGxldGVkRm9ybVByZWZpbGwgPSB6b2Quei5vYmplY3Qoe1xuICAgIHN0YXR1czogem9kLnoubGl0ZXJhbChcImNvbXBsZXRlXCIpXG4gIH0pO1xuICBjb25zdCBFeHBpcmVkRm9ybVByZWZpbGwgPSB6b2Quei5vYmplY3Qoe1xuICAgIHN0YXR1czogem9kLnoubGl0ZXJhbChcImV4cGlyZWRcIilcbiAgfSk7XG4gIHpvZC56LnVuaW9uKFtQYXltZW50Rm9ybVByZWZpbGwsIENvbXBsZXRlZEZvcm1QcmVmaWxsLCBFeHBpcmVkRm9ybVByZWZpbGxdKTtcbiAgem9kLnoub2JqZWN0KHtcbiAgICBsb2dvOiB6b2Quei5zdHJpbmcoKSxcbiAgICBpY29uOiB6b2Quei5zdHJpbmcoKSxcbiAgICBwcmltYXJ5X2NvbG9yOiB6b2Quei5zdHJpbmcoKSxcbiAgICBzZWNvbmRhcnlfY29sb3I6IHpvZC56LnN0cmluZygpXG4gIH0pO1xuICBjb25zdCBDaGVja291dFN1Y2Nlc3NSZXNwb25zZSA9IHpvZC56Lm9iamVjdCh7XG4gICAgaW52b2ljZV91cmxzOiB6b2Quei5hcnJheSh6b2Quei5zdHJpbmcoKSksXG4gICAgc3Vic2NyaXB0aW9uX2lkczogem9kLnouYXJyYXkoem9kLnouc3RyaW5nKCkpLFxuICAgIGN1c3RvbWVyX2lkOiB6b2Quei5zdHJpbmcoKVxuICB9KTtcbiAgem9kLnoub2JqZWN0KHtcbiAgICBzZWN1cmVfdG9rZW46IHpvZC56LnN0cmluZygpLFxuICAgIHBheW1lbnRfaW5wdXQ6IHpvZC56LmFueSgpLFxuICAgIC8vIFNob3VsZCBmb2xsb3cgQW55UGF5bWVudElucHV0IGZyb20gQ0RFXG4gICAgY3VzdG9tZXJfZW1haWw6IHpvZC56LnN0cmluZygpLFxuICAgIGN1c3RvbWVyX3ppcF9jb2RlOiB6b2Quei5zdHJpbmcoKSxcbiAgICBjdXN0b21lcl9jb3VudHJ5OiB6b2Quei5zdHJpbmcoKSxcbiAgICBsaW5lX2l0ZW1zOiB6b2Quei5hcnJheShMaW5lSXRlbSksXG4gICAgdG90YWxfYW1vdW50X2F0b206IHpvZC56Lm51bWJlcigpLmludCgpLFxuICAgIGNhbmNlbF9hdF9lbmQ6IHpvZC56LmJvb2xlYW4oKSxcbiAgICBjaGVja291dF9wYXltZW50X21ldGhvZDogQ2hlY2tvdXRQYXltZW50TWV0aG9kLFxuICAgIHByb21vdGlvbl9jb2RlOiB6b2Quei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIGRvX25vdF91c2VfbGVnYWN5X2NjX2Zsb3c6IHpvZC56LmJvb2xlYW4oKS5vcHRpb25hbCgpXG4gIH0pO1xuICBjb25zdCBTZXR1cENoZWNrb3V0UmVzcG9uc2UgPSB6b2Quei5vYmplY3Qoe1xuICAgIHBheW1lbnRfbWV0aG9kX2lkOiB6b2Quei5zdHJpbmcoKVxuICB9KTtcbiAgem9kLnoub2JqZWN0KHtcbiAgICBpZDogem9kLnouc3RyaW5nKCksXG4gICAgcmV0dXJuX3VybDogem9kLnouc3RyaW5nKClcbiAgfSk7XG4gIGNvbnN0IFB5ZGFudGljVmFsaWRhdGlvbkVycm9yID0gem9kLnoub2JqZWN0KHtcbiAgICB0eXBlOiB6b2Quei5zdHJpbmcoKSxcbiAgICBsb2M6IHpvZC56LmFycmF5KHpvZC56LnN0cmluZygpKSxcbiAgICBtc2c6IHpvZC56LnN0cmluZygpLFxuICAgIHVybDogem9kLnouc3RyaW5nKClcbiAgfSk7XG4gIHpvZC56LmFycmF5KFB5ZGFudGljVmFsaWRhdGlvbkVycm9yKTtcbiAgem9kLnoub2JqZWN0KHtcbiAgICBuZXdfY3VzdG9tZXJfZW1haWw6IHpvZC56LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgbmV3X2N1c3RvbWVyX2FkZHJlc3M6IHpvZC56LnJlY29yZCh6b2Quei5zdHJpbmcoKSwgem9kLnouYW55KCkpLm9wdGlvbmFsKCksXG4gICAgcGF5bWVudF9wcm92aWRlcjogem9kLnouc3RyaW5nKCksXG4gICAgY2hlY2tvdXRfcGF5bWVudF9tZXRob2Q6IENoZWNrb3V0UGF5bWVudE1ldGhvZCxcbiAgICBleGlzdGluZ19jY19wbV9pZDogem9kLnouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICB0aGVpcl9leGlzdGluZ19wbV9pZDogem9kLnouc3RyaW5nKCkub3B0aW9uYWwoKVxuICB9KTtcbiAgY29uc3QgU3RhcnRQYXltZW50Rmxvd1Jlc3BvbnNlID0gem9kLnoub2JqZWN0KHtcbiAgICByZXF1aXJlZF91c2VyX2FjdGlvbnM6IHpvZC56LmFycmF5KHpvZC56LnJlY29yZCh6b2Quei5zdHJpbmcoKSwgem9kLnouYW55KCkpKVxuICB9KTtcbiAgem9kLnoub2JqZWN0KHtcbiAgICBmaWVsZHM6IFBSRm9ybUZpZWxkcyxcbiAgICBjaGVja291dFBheW1lbnRNZXRob2Q6IENoZWNrb3V0UGF5bWVudE1ldGhvZFxuICB9KTtcbiAgem9kLnoub2JqZWN0KHtcbiAgICBzZXNzaW9uX2lkOiB6b2Quei5zdHJpbmcoKSxcbiAgICBub25fY2RlX2Zvcm1fZmllbGRzOiBSZXF1aXJlZEZvcm1GaWVsZHMsXG4gICAgY2hlY2tvdXRfcGF5bWVudF9tZXRob2Q6IENoZWNrb3V0UGF5bWVudE1ldGhvZFxuICB9KTtcbiAgY29uc3QgU3RhcnRQYXltZW50Rmxvd0ZvckNDUmVzcG9uc2UgPSB6b2Quei5vYmplY3Qoe1xuICAgIHJlcXVpcmVkX3VzZXJfYWN0aW9uczogem9kLnouYXJyYXkoem9kLnoucmVjb3JkKHpvZC56LnN0cmluZygpLCB6b2Quei5hbnkoKSkpLFxuICAgIGNjX3BtX2lkOiB6b2Quei5zdHJpbmcoKVxuICB9KTtcbiAgem9kLnoucmVjb3JkKHpvZC56LmFueSgpKTtcblxuICBjb25zdCBzdW0gPSAoYXJyKSA9PiB7XG4gICAgcmV0dXJuIGFyci5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcbiAgfTtcblxuICBmdW5jdGlvbiBmaXhQcm90byh0YXJnZXQsIHByb3RvdHlwZSkge1xuICAgIHZhciBzZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZjtcbiAgICBzZXRQcm90b3R5cGVPZiA/IHNldFByb3RvdHlwZU9mKHRhcmdldCwgcHJvdG90eXBlKSA6IHRhcmdldC5fX3Byb3RvX18gPSBwcm90b3R5cGU7XG4gIH1cbiAgZnVuY3Rpb24gZml4U3RhY2sodGFyZ2V0LCBmbikge1xuICAgIGlmIChmbiA9PT0gdm9pZCAwKSB7XG4gICAgICBmbiA9IHRhcmdldC5jb25zdHJ1Y3RvcjtcbiAgICB9XG5cbiAgICB2YXIgY2FwdHVyZVN0YWNrVHJhY2UgPSBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZTtcbiAgICBjYXB0dXJlU3RhY2tUcmFjZSAmJiBjYXB0dXJlU3RhY2tUcmFjZSh0YXJnZXQsIGZuKTtcbiAgfVxuXG4gIHZhciBfX2V4dGVuZHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF9leHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gZXh0ZW5kU3RhdGljcyhkLCBiKSB7XG4gICAgICBfZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCB7XG4gICAgICAgIF9fcHJvdG9fXzogW11cbiAgICAgIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBkLl9fcHJvdG9fXyA9IGI7XG4gICAgICB9IHx8IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGZvciAodmFyIHAgaW4gYikge1xuICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gX2V4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgfTtcblxuICAgIHJldHVybiBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbCkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xuXG4gICAgICBfZXh0ZW5kU3RhdGljcyhkLCBiKTtcblxuICAgICAgZnVuY3Rpb24gX18oKSB7XG4gICAgICAgIHRoaXMuY29uc3RydWN0b3IgPSBkO1xuICAgICAgfVxuXG4gICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gICAgfTtcbiAgfSgpO1xuXG4gIHZhciBDdXN0b21FcnJvciA9IGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQ3VzdG9tRXJyb3IsIF9zdXBlcik7XG5cbiAgICBmdW5jdGlvbiBDdXN0b21FcnJvcihtZXNzYWdlLCBvcHRpb25zKSB7XG4gICAgICB2YXIgX25ld1RhcmdldCA9IHRoaXMuY29uc3RydWN0b3I7XG5cbiAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG1lc3NhZ2UsIG9wdGlvbnMpIHx8IHRoaXM7XG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfdGhpcywgJ25hbWUnLCB7XG4gICAgICAgIHZhbHVlOiBfbmV3VGFyZ2V0Lm5hbWUsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgZml4UHJvdG8oX3RoaXMsIF9uZXdUYXJnZXQucHJvdG90eXBlKTtcbiAgICAgIGZpeFN0YWNrKF90aGlzKTtcbiAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG5cbiAgICByZXR1cm4gQ3VzdG9tRXJyb3I7XG4gIH0oRXJyb3IpO1xuXG4gIGNsYXNzIENkZUVycm9yIGV4dGVuZHMgQ3VzdG9tRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKHJlc3BvbnNlKSB7XG4gICAgICBjb25zdCBmcmllbmRseU1lc3NhZ2UgPSBgW2NkZS1jbGllbnRdIEVycm9yIHF1ZXJ5aW5nIENERTogJHtyZXNwb25zZS5tZXNzYWdlfWA7XG4gICAgICBzdXBlcihmcmllbmRseU1lc3NhZ2UpO1xuICAgICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlO1xuICAgIH1cbiAgICBnZXQgb3JpZ2luYWxFcnJvck1lc3NhZ2UoKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXNwb25zZS5tZXNzYWdlO1xuICAgIH1cbiAgfVxuICBjb25zdCBxdWVyeUNERSA9IGFzeW5jIChjZGVDb25uLCBkYXRhLCByZXNwb25zZVNjaGVtYSkgPT4ge1xuICAgIGNvbnNvbGUubG9nKFwiW2NkZS1jbGllbnRdIFF1ZXJ5aW5nIENERSB3aXRoIHBhdGggYW5kIGNvbm5lY3Rpb246XCIsIGRhdGEudHlwZSwgY2RlQ29ubik7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjZGVDb25uLnNlbmQoZGF0YSk7XG4gICAgY29uc29sZS5sb2coXCJbY2RlLWNsaWVudF0gR290IHJlc3BvbnNlIGZyb20gQ0RFOlwiLCByZXNwb25zZSk7XG4gICAgaWYgKGlzQ0RFUmVzcG9uc2VFcnJvcihyZXNwb25zZSkpIHtcbiAgICAgIHRocm93IG5ldyBDZGVFcnJvcihyZXNwb25zZSk7XG4gICAgfVxuICAgIGlmICghY2hlY2tJZkNvbmZvcm1zVG9TY2hlbWEocmVzcG9uc2UsIHJlc3BvbnNlU2NoZW1hKSkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gcmVzcG9uc2VTY2hlbWEuc2FmZVBhcnNlKHJlc3BvbnNlKTtcbiAgICAgIGlmIChyZXN1bHQuc3VjY2VzcykgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBzdGF0ZVwiKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJPSlMgcXVlcnlBcGkgZ290IGEgc2NoZW1hIGVycm9yLiBFeHBlY3RlZCBzY2hlbWE6XCIsIHJlc3BvbnNlU2NoZW1hLCBcIkFjdHVhbDpcIiwgcmVzcG9uc2UpO1xuICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgIH1cbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH07XG4gIGNvbnN0IGNoZWNrSWZDb25mb3Jtc1RvU2NoZW1hID0gKHZhbHVlLCBzY2hlbWEpID0+IHtcbiAgICByZXR1cm4gc2NoZW1hLnNhZmVQYXJzZSh2YWx1ZSkuc3VjY2VzcztcbiAgfTtcbiAgY29uc3QgaXNDREVSZXNwb25zZUVycm9yID0gKHJlc3BvbnNlKSA9PiB7XG4gICAgcmV0dXJuIENERVJlc3BvbnNlRXJyb3Iuc2FmZVBhcnNlKHJlc3BvbnNlKS5zdWNjZXNzO1xuICB9O1xuICBjb25zdCBnZXRDaGVja291dFByZXZpZXcgPSBhc3luYyAoY2RlQ29ubiwgcmVxdWVzdCkgPT4ge1xuICAgIHJldHVybiBhd2FpdCBxdWVyeUNERShjZGVDb25uLCB7IHR5cGU6IFwiZ2V0X2NoZWNrb3V0X3ByZXZpZXdcIiwgcGF5bG9hZDogcmVxdWVzdCB9LCBQcmV2aWV3Q2hlY2tvdXRSZXNwb25zZSk7XG4gIH07XG4gIGNvbnN0IGdldFByZWZpbGwgPSBhc3luYyAoY2RlQ29ubikgPT4ge1xuICAgIHJldHVybiBhd2FpdCBxdWVyeUNERShjZGVDb25uLCB7IHR5cGU6IFwiZ2V0X3ByZWZpbGxcIiwgcGF5bG9hZDoge30gfSwgUGF5bWVudEZvcm1QcmVmaWxsKTtcbiAgfTtcbiAgY29uc3Qgc3RhcnRQYXltZW50RmxvdyA9IGFzeW5jIChjZGVDb25uLCBwYXlsb2FkKSA9PiB7XG4gICAgcmV0dXJuIGF3YWl0IHF1ZXJ5Q0RFKGNkZUNvbm4sIHsgdHlwZTogXCJ2Ml9zdGFydF9wYXltZW50X2Zsb3dcIiwgcGF5bG9hZCB9LCBTdGFydFBheW1lbnRGbG93UmVzcG9uc2UpO1xuICB9O1xuICBjb25zdCBzdGFydFBheW1lbnRGbG93Rm9yQ0MgPSBhc3luYyAoY2RlQ29ubiwgcGF5bG9hZCkgPT4ge1xuICAgIHJldHVybiBhd2FpdCBxdWVyeUNERShjZGVDb25uLCB7IHR5cGU6IFwic3RhcnRfcGF5bWVudF9mbG93X2Zvcl9jY1wiLCBwYXlsb2FkIH0sIFN0YXJ0UGF5bWVudEZsb3dGb3JDQ1Jlc3BvbnNlKTtcbiAgfTtcbiAgY29uc3Qgc3RhcnRQYXltZW50Rmxvd0ZvclBSID0gYXN5bmMgKGNkZUNvbm4sIHBheWxvYWQpID0+IHtcbiAgICByZXR1cm4gYXdhaXQgcXVlcnlDREUoY2RlQ29ubiwgeyB0eXBlOiBcInN0YXJ0X3BheW1lbnRfZmxvd19mb3JfcHJcIiwgcGF5bG9hZCB9LCBTdGFydFBheW1lbnRGbG93UmVzcG9uc2UpO1xuICB9O1xuICBjb25zdCBjb25maXJtUGF5bWVudEZsb3cgPSBhc3luYyAoY2RlQ29ubiwgcGF5bG9hZCkgPT4ge1xuICAgIHJldHVybiBhd2FpdCBxdWVyeUNERShjZGVDb25uLCB7IHR5cGU6IFwiY29uZmlybV9wYXltZW50X2Zsb3dcIiwgcGF5bG9hZCB9LCBDb25maXJtUGF5bWVudEZsb3dSZXNwb25zZSk7XG4gIH07XG4gIGNvbnN0IGdldENoZWNrb3V0VmFsdWUgPSBhc3luYyAoY2RlQ29ubiwgc2VjdXJlVG9rZW4sIHByb21vQ29kZSkgPT4ge1xuICAgIGNvbnN0IGNoZWNrb3V0UHJldmlldyA9IGF3YWl0IGdldENoZWNrb3V0UHJldmlldyhjZGVDb25uLCB7XG4gICAgICBzZWN1cmVfdG9rZW46IHNlY3VyZVRva2VuLFxuICAgICAgcHJvbW90aW9uX2NvZGU6IHByb21vQ29kZVxuICAgIH0pO1xuICAgIGNvbnN0IGN1cnJlbmNpZXMgPSBuZXcgU2V0KGNoZWNrb3V0UHJldmlldy5wcmV2aWV3Lmludm9pY2VzLm1hcCgoaW52KSA9PiBpbnYuY3VycmVuY3kpKTtcbiAgICBpZiAoY3VycmVuY2llcy5zaXplICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGV4YWN0bHkgb25lIGN1cnJlbmN5LCBnb3QgJHtjdXJyZW5jaWVzLnNpemV9YCk7XG4gICAgfVxuICAgIGNvbnN0IGN1cnJlbmN5ID0gY3VycmVuY2llcy52YWx1ZXMoKS5uZXh0KCkudmFsdWUgPz8gXCJ1c2RcIjtcbiAgICBjb25zdCBhbW91bnRBdG9tID0gc3VtKGNoZWNrb3V0UHJldmlldy5wcmV2aWV3Lmludm9pY2VzLm1hcCgoaW52KSA9PiBpbnYucmVtYWluaW5nX2Ftb3VudF9hdG9tKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGN1cnJlbmN5LFxuICAgICAgYW1vdW50QXRvbVxuICAgIH07XG4gIH07XG4gIGNvbnN0IGdldENoZWNrb3V0UHJldmlld0Ftb3VudCA9IGFzeW5jIChjZGVDb25uLCBzZWN1cmVUb2tlbiwgaXNTZXR1cE1vZGUsIHByb21vQ29kZSkgPT4ge1xuICAgIGlmIChpc1NldHVwTW9kZSkge1xuICAgICAgcmV0dXJuIHsgYW1vdW50QXRvbTogMCwgY3VycmVuY3k6IFwidXNkXCIgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvbW9Db2RlID0gIXByb21vQ29kZSA/IHZvaWQgMCA6IHByb21vQ29kZTtcbiAgICAgIGNvbnN0IGNoZWNrb3V0UHJldmlldyA9IGF3YWl0IGdldENoZWNrb3V0VmFsdWUoY2RlQ29ubiwgc2VjdXJlVG9rZW4sIHByb21vQ29kZSk7XG4gICAgICByZXR1cm4geyBhbW91bnRBdG9tOiBjaGVja291dFByZXZpZXcuYW1vdW50QXRvbSwgY3VycmVuY3k6IGNoZWNrb3V0UHJldmlldy5jdXJyZW5jeSB9O1xuICAgIH1cbiAgfTtcbiAgY29uc3QgdG9rZW5pemVDYXJkT25BbGxDb25uZWN0aW9ucyA9IGFzeW5jIChhbGxDZGVDb25uZWN0aW9ucywgcGF5bG9hZCkgPT4ge1xuICAgIGlmIChhbGxDZGVDb25uZWN0aW9ucy5zaXplID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBDREUgY29ubmVjdGlvbnMgZm91bmRcIik7XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgQXJyYXkuZnJvbShhbGxDZGVDb25uZWN0aW9ucy52YWx1ZXMoKSkubWFwKFxuICAgICAgICAoY2RlQ29ubikgPT4gcXVlcnlDREUoY2RlQ29ubiwgeyB0eXBlOiBcInRva2VuaXplX2NhcmRcIiwgcGF5bG9hZCB9LCBUb2tlbml6ZUNhcmRSZXNwb25zZSlcbiAgICAgIClcbiAgICApO1xuICAgIHJldHVybiByZXNwb25zZXM7XG4gIH07XG4gIGNvbnN0IGNoZWNrb3V0Q2FyZEVsZW1lbnRzID0gYXN5bmMgKGNkZUNvbm4sIHBheWxvYWQpID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHF1ZXJ5Q0RFKGNkZUNvbm4sIHsgdHlwZTogXCJjaGVja291dF9jYXJkX2VsZW1lbnRzXCIsIHBheWxvYWQgfSwgQ2hlY2tvdXRTdWNjZXNzUmVzcG9uc2UpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiW2NkZS1jbGllbnRdIEVycm9yIGR1cmluZyBjaGVja291dENhcmRFbGVtZW50czpcIiwgZXJyb3IsIEpTT04uc3RyaW5naWZ5KGVycm9yKSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHNldHVwQ2hlY2tvdXQgPSBhc3luYyAoY2RlQ29ubiwgcGF5bG9hZCkgPT4ge1xuICAgIHJldHVybiBhd2FpdCBxdWVyeUNERShjZGVDb25uLCB7IHR5cGU6IFwic2V0dXBfcGF5bWVudF9tZXRob2RcIiwgcGF5bG9hZCB9LCBTZXR1cENoZWNrb3V0UmVzcG9uc2UpO1xuICB9O1xuICBjb25zdCBwZXJmb3JtQ2hlY2tvdXQgPSBhc3luYyAoY2RlQ29ubiwgcGF5bG9hZCkgPT4ge1xuICAgIHJldHVybiBhd2FpdCBxdWVyeUNERShjZGVDb25uLCB7IHR5cGU6IFwiY2hlY2tvdXRcIiwgcGF5bG9hZCB9LCBDaGVja291dFN1Y2Nlc3NSZXNwb25zZSk7XG4gIH07XG4gIGNvbnN0IENERV9QT0xMSU5HX0lOVEVSVkFMID0gMWUzO1xuICBjb25zdCBwaW5nQ2RlRm9yM2RzU3RhdHVzID0gYXN5bmMgKGlmcmFtZSwgY2hpbGRPcmlnaW4pID0+IHtcbiAgICBjb25zb2xlLmxvZyhjaGlsZE9yaWdpbik7XG4gICAgY29uc3QgY29ubmVjdGlvbiA9IHBlbnBhbC5jb25uZWN0VG9DaGlsZCh7XG4gICAgICBpZnJhbWUsXG4gICAgICBkZWJ1ZzogdHJ1ZSxcbiAgICAgIHRpbWVvdXQ6IENERV9QT0xMSU5HX0lOVEVSVkFMLFxuICAgICAgY2hpbGRPcmlnaW46IFwiKlwiXG4gICAgICAvLyBUT0RPOiB1c2Ugd2l0aCBwcm9wZXIgY2hpbGRPcmlnaW5cbiAgICB9KTtcbiAgICBjb25zdCBjb25uZWN0aW9uT2JqID0gYXdhaXQgY29ubmVjdGlvbi5wcm9taXNlO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHF1ZXJ5Q0RFKGNvbm5lY3Rpb25PYmosIHsgdHlwZTogXCJwaW5nLTNkcy1zdGF0dXNcIiB9LCBQaW5nM0RTU3RhdHVzUmVzcG9uc2UpO1xuICAgIHJldHVybiByZXN1bHQuc3RhdHVzO1xuICB9O1xuXG4gIGNvbnN0IGFkZEJhc2ljQ2hlY2tvdXRDYWxsYmFja0hhbmRsZXJzID0gKHNpbXBsZU9qc0Zsb3cpID0+IHtcbiAgICByZXR1cm4gYXN5bmMgKHBhcmFtcykgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcGFyYW1zLmZsb3dDYWxsYmFja3Mub25DaGVja291dFN0YXJ0ZWQoKTtcbiAgICAgICAgY29uc3QgZmxvd1Jlc3VsdCA9IGF3YWl0IHNpbXBsZU9qc0Zsb3cocGFyYW1zKTtcbiAgICAgICAgaWYgKGZsb3dSZXN1bHQubW9kZSA9PT0gXCJzZXR1cFwiKSB7XG4gICAgICAgICAgcGFyYW1zLmZsb3dDYWxsYmFja3Mub25TZXR1cFBheW1lbnRNZXRob2RTdWNjZXNzKGZsb3dSZXN1bHQucmVzdWx0LnBheW1lbnRfbWV0aG9kX2lkKTtcbiAgICAgICAgfSBlbHNlIGlmIChmbG93UmVzdWx0Lm1vZGUgPT09IFwiY2hlY2tvdXRcIikge1xuICAgICAgICAgIHBhcmFtcy5mbG93Q2FsbGJhY2tzLm9uQ2hlY2tvdXRTdWNjZXNzKFxuICAgICAgICAgICAgZmxvd1Jlc3VsdC5yZXN1bHQuaW52b2ljZV91cmxzLFxuICAgICAgICAgICAgZmxvd1Jlc3VsdC5yZXN1bHQuc3Vic2NyaXB0aW9uX2lkcyxcbiAgICAgICAgICAgIGZsb3dSZXN1bHQucmVzdWx0LmN1c3RvbWVyX2lkXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuaGFuZGxlZCBtb2RlOiAke2Zsb3dSZXN1bHR9YCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHBhcmFtcy5mbG93Q2FsbGJhY2tzLm9uQ2hlY2tvdXRFcnJvcihnZXRFcnJvck1lc3NhZ2UoZXJyb3IpKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcbiAgY29uc3QgYWRkRXJyb3JDYXRjaGVyRm9ySW5pdCA9IChpbml0KSA9PiB7XG4gICAgcmV0dXJuIGFzeW5jIChwYXJhbXMpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBpbml0KHBhcmFtcyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCB7IGVycl9fIH0gPSBjcmVhdGVPanNGbG93TG9nZ2VycyhcImluaXQtZXJyb3ItY2F0Y2hlclwiKTtcbiAgICAgICAgZXJyX18oZXJyb3IpO1xuICAgICAgICByZXR1cm4geyBpc0F2YWlsYWJsZTogZmFsc2UsIHJlYXNvbjogZ2V0RXJyb3JNZXNzYWdlKGVycm9yKSB9O1xuICAgICAgfVxuICAgIH07XG4gIH07XG4gIGNvbnN0IGNyZWF0ZU9qc0Zsb3dMb2dnZXJzID0gKHByZWZpeCkgPT4ge1xuICAgIGNvbnN0IGxvZyA9ICguLi5hcmdzKSA9PiB7XG4gICAgICB3aW5kb3dbXCJjb25zb2xlXCJdLmxvZyhgJHtjaGFsay5ncmVlbi5ib2xkKFwib2pzL1wiKX0ke2NoYWxrLmJvbGQuZ3JheShgJHtwcmVmaXh9YCl9XHRgLCAuLi5hcmdzKTtcbiAgICB9O1xuICAgIGNvbnN0IGVyciA9ICguLi5hcmdzKSA9PiB7XG4gICAgICB3aW5kb3dbXCJjb25zb2xlXCJdLmVycm9yKGAke2NoYWxrLnJlZC5ib2xkKFwib2pzL1wiKX0ke2NoYWxrLmJvbGQuZ3JheShgJHtwcmVmaXh9YCl9XHRgLCAuLi5hcmdzKTtcbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICBsb2csXG4gICAgICBlcnIsXG4gICAgICBsb2dfXzogbG9nLFxuICAgICAgZXJyX186IGVyclxuICAgIH07XG4gIH07XG5cbiAgY29uc3QgeyBsb2dfXzogbG9nX18kNSwgZXJyX186IGVycl9fJDUgfSA9IGNyZWF0ZU9qc0Zsb3dMb2dnZXJzKFwiY29tbW9uXCIpO1xuICBjb25zdCBwYXJzZUNvbmZpcm1QYXltZW50Rmxvd1Jlc3BvbnNlID0gKHJlc3BvbnNlKSA9PiB7XG4gICAgaWYgKHJlc3BvbnNlLnBheW1lbnRfbWV0aG9kcy5sZW5ndGggIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgZXhhY3RseSBvbmUgcGF5bWVudCBtZXRob2QsIGdvdCAke3Jlc3BvbnNlLnBheW1lbnRfbWV0aG9kcy5sZW5ndGh9YCk7XG4gICAgfVxuICAgIHJldHVybiB7IHBheW1lbnRfbWV0aG9kX2lkOiByZXNwb25zZS5wYXltZW50X21ldGhvZHNbMF0uaWQgfTtcbiAgfTtcbiAgY29uc3QgZmluZENwbU1hdGNoaW5nVHlwZSA9IChhbGxDUE1zLCB6b2RNb2RlbCkgPT4ge1xuICAgIGNvbnN0IGNwbSA9IGFsbENQTXMuZmluZCgoY3BtMikgPT4gem9kTW9kZWwuc2FmZVBhcnNlKGNwbTIpLnN1Y2Nlc3MpO1xuICAgIGlmICghY3BtKSB7XG4gICAgICBlcnJfXyQ1KGBObyBDUE1zIGZvdW5kIGZvciBtb2RlbC4gQWxsIG1vZGVsczpgLCBhbGxDUE1zKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gQ1BNcyBmb3VuZCBmb3IgbW9kZWxgKTtcbiAgICB9XG4gICAgcmV0dXJuIHpvZE1vZGVsLnBhcnNlKGNwbSk7XG4gIH07XG5cbiAgY29uc3QgeyBsb2dfXzogbG9nX18kNCwgZXJyX186IGVycl9fJDQgfSA9IGNyZWF0ZU9qc0Zsb3dMb2dnZXJzKFwiY29tbW9uLWNjXCIpO1xuICBjb25zdCB2YWxpZGF0ZU5vbkNkZUZvcm1GaWVsZHNGb3JDQyA9IChub25DZGVGb3JtSW5wdXRzLCBvblZhbGlkYXRpb25FcnJvcikgPT4ge1xuICAgIGNvbnN0IHBheWxvYWQgPSBSZXF1aXJlZEZvcm1GaWVsZHMuc2FmZVBhcnNlKG5vbkNkZUZvcm1JbnB1dHMpO1xuICAgIGlmICghcGF5bG9hZC5zdWNjZXNzKSB7XG4gICAgICBjb25zdCBmb3JtYXR0ZWQgPSBwYXlsb2FkLmVycm9yLmZvcm1hdCgpO1xuICAgICAgY29uc3QgaXNzdWVzID0gZXh0cmFjdElzc3Vlc1BlckZpZWxkKGZvcm1hdHRlZCk7XG4gICAgICBmb3IgKGNvbnN0IFtmaWVsZE5hbWUsIGVycm9yc10gb2YgT2JqZWN0LmVudHJpZXMoaXNzdWVzKSkge1xuICAgICAgICBvblZhbGlkYXRpb25FcnJvcihmaWVsZE5hbWUsIGVycm9ycywgZmllbGROYW1lKTtcbiAgICAgIH1cbiAgICAgIGVycl9fJDQoYEdvdCB2YWxpZGF0aW9uIGVycm9ycyBpbiBub24tQ0RFIGZvcm0gZmllbGRzYCwgaXNzdWVzKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkdvdCB2YWxpZGF0aW9uIGVycm9ycyBpbiBub24tQ0RFIGZvcm0gZmllbGRzXCIpO1xuICAgIH1cbiAgICByZXR1cm4gcGF5bG9hZC5kYXRhO1xuICB9O1xuICBjb25zdCB2YWxpZGF0ZVRva2VuaXplQ2FyZFJlc3VsdHMgPSAodG9rZW5pemVSZXN1bHRzLCBvblZhbGlkYXRpb25FcnJvcikgPT4ge1xuICAgIGZvciAoY29uc3QgdG9rZW5pemVSZXN1bHQgb2YgdG9rZW5pemVSZXN1bHRzKSB7XG4gICAgICBpZiAodG9rZW5pemVSZXN1bHQuc3VjY2VzcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgdG9rZW5pemVSZXN1bHQuZXJyb3JzLmZvckVhY2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgY29uc3QgcGFyc2VkID0gQWxsRmllbGROYW1lcy5zYWZlUGFyc2UoZXJyb3IuZWxlbWVudFR5cGUpO1xuICAgICAgICAgIGlmICghcGFyc2VkLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIGVycl9fJDQoYFVua25vd24gZmllbGQgbmFtZSBpbiBvblZhbGlkYXRpb25FcnJvcjogJHtlcnJvci5lbGVtZW50VHlwZX1gKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZmllbGROYW1lID0gcGFyc2VkLmRhdGE7XG4gICAgICAgICAgICBvblZhbGlkYXRpb25FcnJvcihmaWVsZE5hbWUsIGVycm9yLmVycm9ycyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgbG9nX18kNChgRXJyb3IgdG9rZW5pemluZyBjYXJkOiBnb3QgdmFsaWRhdGlvbiBlcnJvcnM6ICR7SlNPTi5zdHJpbmdpZnkodG9rZW5pemVSZXN1bHQuZXJyb3JzKX1gKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiR290IHZhbGlkYXRpb24gZXJyb3JzIHdoaWxlIHRva2VuaXppbmcgY2FyZFwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgY29uc3QgT0pTX1NUUklQRV9MSU5LX0JUTl9JRCA9IFwib2pzLXN0cmlwZS1saW5rLWJ0blwiO1xuICBjb25zdCB7IGxvZ19fOiBsb2dfXyQzLCBlcnJfXzogZXJyX18kMyB9ID0gY3JlYXRlT2pzRmxvd0xvZ2dlcnMoXCJzdHJpcGUtbGlua1wiKTtcbiAgY29uc3QgU3RyaXBlTGlua0NwbSA9IHpvZC56Lm9iamVjdCh7XG4gICAgcHJvdmlkZXI6IHpvZC56LmxpdGVyYWwoXCJzdHJpcGVfbGlua1wiKSxcbiAgICBwcm9jZXNzb3JfbmFtZTogem9kLnoubGl0ZXJhbChcInN0cmlwZVwiKSxcbiAgICBtZXRhZGF0YTogem9kLnoub2JqZWN0KHtcbiAgICAgIHN0cmlwZV9wazogem9kLnouc3RyaW5nKClcbiAgICB9KVxuICB9KTtcbiAgY29uc3QgU3RyaXBlTGlua1JlcXVpcmVkVXNlckFjdGlvbnMgPSB6b2Quei5hcnJheShcbiAgICB6b2Quei5vYmplY3Qoe1xuICAgICAgb3VyX2V4aXN0aW5nX3BtX2lkOiB6b2Quei5zdHJpbmcoKVxuICAgIH0pXG4gICkubGVuZ3RoKDEpO1xuICBjb25zdCBpbml0U3RyaXBlTGlua0Zsb3cgPSBhZGRFcnJvckNhdGNoZXJGb3JJbml0KFxuICAgIGFzeW5jICh7IGNvbnRleHQsIGZsb3dDYWxsYmFja3MgfSkgPT4ge1xuICAgICAgY29uc3QgaW5pdFBhcmFtcyA9IGNvbnRleHQuY3VzdG9tSW5pdFBhcmFtcy5zdHJpcGVMaW5rO1xuICAgICAgbG9nX18kMyhgQ2hlY2tpbmcgaWYgdGhlcmUgYXJlIGFueSBDUE1zIGZvciBTdHJpcGUgUFIuLi5gKTtcbiAgICAgIGNvbnN0IHN0cmlwZUxpbmtDcG0gPSBmaW5kQ3BtTWF0Y2hpbmdUeXBlKGNvbnRleHQuY2hlY2tvdXRQYXltZW50TWV0aG9kcywgU3RyaXBlTGlua0NwbSk7XG4gICAgICBsb2dfXyQzKGBTdGFydGluZyBzdHJpcGUgbGluayBmbG93Li4uYCk7XG4gICAgICBjb25zdCBhbnlDZGVDb25uZWN0aW9uID0gQXJyYXkuZnJvbShjb250ZXh0LmNkZUNvbm5lY3Rpb25zLnZhbHVlcygpKVswXTtcbiAgICAgIGNvbnN0IHByZWZpbGwgPSBhd2FpdCBnZXRQcmVmaWxsKGFueUNkZUNvbm5lY3Rpb24pO1xuICAgICAgY29uc3QgaXNTZXR1cE1vZGUgPSBwcmVmaWxsLm1vZGUgPT09IFwic2V0dXBcIjtcbiAgICAgIGxvZ19fJDMoYENyZWF0aW5nIHN0cmlwZSBlbGVtZW50cy4uLmApO1xuICAgICAgY29uc3QgaW5pdGlhbFByZXZpZXcgPSBhd2FpdCBnZXRDaGVja291dFByZXZpZXdBbW91bnQoYW55Q2RlQ29ubmVjdGlvbiwgcHJlZmlsbC50b2tlbiwgaXNTZXR1cE1vZGUsIHZvaWQgMCk7XG4gICAgICBjb25zdCB7IGVsZW1lbnRzLCBzdHJpcGUgfSA9IGF3YWl0IGNyZWF0ZVN0cmlwZUVsZW1lbnRzKHN0cmlwZUxpbmtDcG0ubWV0YWRhdGEuc3RyaXBlX3BrLCB7XG4gICAgICAgIG1vZGU6IFwic2V0dXBcIixcbiAgICAgICAgY3VycmVuY3k6IGluaXRpYWxQcmV2aWV3LmN1cnJlbmN5LFxuICAgICAgICBzZXR1cF9mdXR1cmVfdXNhZ2U6IFwib2ZmX3Nlc3Npb25cIixcbiAgICAgICAgcGF5bWVudE1ldGhvZENyZWF0aW9uOiBcIm1hbnVhbFwiXG4gICAgICB9KTtcbiAgICAgIGxvZ19fJDMoYENyZWF0aW5nIGV4cHJlc3MgY2hlY2tvdXQuLi5gKTtcbiAgICAgIGNvbnN0IGV4cHJlc3NDaGVja291dEVsZW1lbnQgPSBlbGVtZW50cy5jcmVhdGUoXCJleHByZXNzQ2hlY2tvdXRcIiwge1xuICAgICAgICBidXR0b25IZWlnaHQ6IGluaXRQYXJhbXM/LmJ1dHRvbkhlaWdodCxcbiAgICAgICAgcGF5bWVudE1ldGhvZHM6IHtcbiAgICAgICAgICBhbWF6b25QYXk6IFwibmV2ZXJcIixcbiAgICAgICAgICBhcHBsZVBheTogXCJuZXZlclwiLFxuICAgICAgICAgIGdvb2dsZVBheTogXCJuZXZlclwiLFxuICAgICAgICAgIHBheXBhbDogXCJuZXZlclwiXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY29uc3QgbW91bnRCdXR0b24gPSAoKSA9PiB7XG4gICAgICAgIGV4cHJlc3NDaGVja291dEVsZW1lbnQubW91bnQoYCMke09KU19TVFJJUEVfTElOS19CVE5fSUR9YCk7XG4gICAgICB9O1xuICAgICAgY29uc3QgZGlzbW91bnRCdXR0b24gPSAoKSA9PiB7XG4gICAgICAgIGV4cHJlc3NDaGVja291dEVsZW1lbnQudW5tb3VudCgpO1xuICAgICAgfTtcbiAgICAgIGlmIChpbml0UGFyYW1zPy5kb05vdE1vdW50T25Jbml0KSB7XG4gICAgICAgIGxvZ19fJDMoYE5PVCBtb3VudGluZyBzdHJpcGUgbGluayBidXR0b24gKGRvTm90TW91bnRPbkluaXQgaXMgdHJ1ZSlgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ19fJDMoYE1vdW50aW5nIHN0cmlwZSBsaW5rIGJ1dHRvbi4uLmApO1xuICAgICAgICBtb3VudEJ1dHRvbigpO1xuICAgICAgfVxuICAgICAgZXhwcmVzc0NoZWNrb3V0RWxlbWVudC5vbihcImNsaWNrXCIsIGFzeW5jIChldmVudCkgPT4ge1xuICAgICAgICBsb2dfXyQzKFwiU3RyaXBlIExpbmsgYnV0dG9uIGNsaWNrZWRcIik7XG4gICAgICAgIGlmIChpbml0UGFyYW1zPy5vdmVycmlkZUxpbmtTdWJtaXQpIHtcbiAgICAgICAgICBjb25zdCBzaG91bGRTdWJtaXQgPSBhd2FpdCBpbml0UGFyYW1zLm92ZXJyaWRlTGlua1N1Ym1pdCgpO1xuICAgICAgICAgIGlmICghc2hvdWxkU3VibWl0KSB7XG4gICAgICAgICAgICBsb2dfXyQzKFwiU3RyaXBlIExpbmsgc3VibWl0IGFib3J0ZWQgYnkgb3ZlcnJpZGVMaW5rU3VibWl0XCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBldmVudC5yZXNvbHZlKCk7XG4gICAgICB9KTtcbiAgICAgIGV4cHJlc3NDaGVja291dEVsZW1lbnQub24oXCJjb25maXJtXCIsIGFzeW5jIChldmVudCkgPT4ge1xuICAgICAgICBsb2dfXyQzKFwiU3RyaXBlIExpbmsgd2luZG93IGNvbmZpcm1lZFwiLCBldmVudCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0cmlwZS5jcmVhdGVQYXltZW50TWV0aG9kKHtcbiAgICAgICAgICBlbGVtZW50cyxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIGJpbGxpbmdfZGV0YWlsczogZXZlbnQuYmlsbGluZ0RldGFpbHNcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVzdWx0LmVycm9yKSB7XG4gICAgICAgICAgZXJyX18kMyhcImVycm9yXCIsIHJlc3VsdC5lcnJvcik7XG4gICAgICAgICAgZmxvd0NhbGxiYWNrcy5vbkNoZWNrb3V0RXJyb3IocmVzdWx0LmVycm9yLm1lc3NhZ2UgPz8gXCJTdHJpcGUgTGluayB1bmtub3duIGVycm9yXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvZ19fJDMoXCJwYXltZW50TWV0aG9kXCIsIHJlc3VsdC5wYXltZW50TWV0aG9kKTtcbiAgICAgICAgICBPanNGbG93cy5zdHJpcGVMaW5rLnJ1bih7XG4gICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgY2hlY2tvdXRQYXltZW50TWV0aG9kOiBzdHJpcGVMaW5rQ3BtLFxuICAgICAgICAgICAgbm9uQ2RlRm9ybUlucHV0czogY3JlYXRlSW5wdXRzRGljdEZyb21Gb3JtKGNvbnRleHQuZm9ybURpdiksXG4gICAgICAgICAgICBmbG93Q2FsbGJhY2tzLFxuICAgICAgICAgICAgY3VzdG9tUGFyYW1zOiB7IHN0cmlwZVBNOiByZXN1bHQucGF5bWVudE1ldGhvZCB9LFxuICAgICAgICAgICAgaW5pdFJlc3VsdDogeyBpc0F2YWlsYWJsZTogdHJ1ZSB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNBdmFpbGFibGU6IHRydWUsXG4gICAgICAgIGNvbnRyb2xsZXI6IHtcbiAgICAgICAgICBtb3VudEJ1dHRvbixcbiAgICAgICAgICBkaXNtb3VudEJ1dHRvbixcbiAgICAgICAgICB3YWl0Rm9yQnV0dG9uVG9Nb3VudDogYXN5bmMgKCkgPT4gYXdhaXQgZ2V0RWxlbWVudEJ5SWRBc3luYyhPSlNfU1RSSVBFX0xJTktfQlROX0lEKVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgKTtcbiAgY29uc3QgcnVuU3RyaXBlTGlua0Zsb3cgPSBhZGRCYXNpY0NoZWNrb3V0Q2FsbGJhY2tIYW5kbGVycyhcbiAgICBhc3luYyAoe1xuICAgICAgY29udGV4dCxcbiAgICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZCxcbiAgICAgIG5vbkNkZUZvcm1JbnB1dHMsXG4gICAgICBmbG93Q2FsbGJhY2tzLFxuICAgICAgY3VzdG9tUGFyYW1zXG4gICAgfSkgPT4ge1xuICAgICAgbG9nX18kMyhgUnVubmluZyBTdHJpcGUgUFIgZmxvdy4uLmApO1xuICAgICAgY29uc3QgYW55Q2RlQ29ubmVjdGlvbiA9IEFycmF5LmZyb20oY29udGV4dC5jZGVDb25uZWN0aW9ucy52YWx1ZXMoKSlbMF07XG4gICAgICBsb2dfXyQzKGBNZXJnaW5nIFBNIGZpZWxkcyB3aXRoIGZvcm0gZmllbGRzLi4uYCk7XG4gICAgICBjb25zdCBtZXJnZWRJbnB1dHMgPSBmaWxsRW1wdHlGb3JtSW5wdXRzV2l0aFN0cmlwZVBNKG5vbkNkZUZvcm1JbnB1dHMsIGN1c3RvbVBhcmFtcy5zdHJpcGVQTSk7XG4gICAgICBjb25zdCBub25DZGVGb3JtRmllbGRzID0gdmFsaWRhdGVOb25DZGVGb3JtRmllbGRzRm9yQ0MobWVyZ2VkSW5wdXRzLCBmbG93Q2FsbGJhY2tzLm9uVmFsaWRhdGlvbkVycm9yKTtcbiAgICAgIGxvZ19fJDMoYFN0YXJ0aW5nIHBheW1lbnQgZmxvdy4uLmApO1xuICAgICAgY29uc3Qgc3RhcnRQYXltZW50Rmxvd1Jlc3BvbnNlID0gYXdhaXQgc3RhcnRQYXltZW50RmxvdyhhbnlDZGVDb25uZWN0aW9uLCB7XG4gICAgICAgIHBheW1lbnRfcHJvdmlkZXI6IGNoZWNrb3V0UGF5bWVudE1ldGhvZC5wcm92aWRlcixcbiAgICAgICAgY2hlY2tvdXRfcGF5bWVudF9tZXRob2Q6IGNoZWNrb3V0UGF5bWVudE1ldGhvZCxcbiAgICAgICAgdGhlaXJfZXhpc3RpbmdfcG1faWQ6IGN1c3RvbVBhcmFtcy5zdHJpcGVQTS5pZFxuICAgICAgfSk7XG4gICAgICBsb2dfXyQzKFwiU3RhcnQgcGF5bWVudCBmbG93IHJlc3BvbnNlXCIsIHN0YXJ0UGF5bWVudEZsb3dSZXNwb25zZSk7XG4gICAgICBjb25zdCBuZXh0QWN0aW9uTWV0YWRhdGEgPSBTdHJpcGVMaW5rUmVxdWlyZWRVc2VyQWN0aW9ucy5wYXJzZShzdGFydFBheW1lbnRGbG93UmVzcG9uc2UucmVxdWlyZWRfdXNlcl9hY3Rpb25zKTtcbiAgICAgIGNvbnN0IG91ckV4aXN0aW5nUG1JZCA9IG5leHRBY3Rpb25NZXRhZGF0YVswXS5vdXJfZXhpc3RpbmdfcG1faWQ7XG4gICAgICBjb25zdCBwcmVmaWxsID0gYXdhaXQgZ2V0UHJlZmlsbChhbnlDZGVDb25uZWN0aW9uKTtcbiAgICAgIGlmIChwcmVmaWxsLm1vZGUgPT09IFwic2V0dXBcIikge1xuICAgICAgICBsb2dfXyQzKGBEb2luZyBwYXltZW50IHNldHVwLi4uYCk7XG4gICAgICAgIGNvbnN0IGNvbmZpcm1SZXN1bHQgPSBhd2FpdCBjb25maXJtUGF5bWVudEZsb3coYW55Q2RlQ29ubmVjdGlvbiwge1xuICAgICAgICAgIHNlY3VyZV90b2tlbjogcHJlZmlsbC50b2tlbixcbiAgICAgICAgICBleGlzdGluZ19jY19wbV9pZDogb3VyRXhpc3RpbmdQbUlkXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBjcmVhdGVkUGF5bWVudE1ldGhvZCA9IHBhcnNlQ29uZmlybVBheW1lbnRGbG93UmVzcG9uc2UoY29uZmlybVJlc3VsdCk7XG4gICAgICAgIHJldHVybiB7IG1vZGU6IFwic2V0dXBcIiwgcmVzdWx0OiBjcmVhdGVkUGF5bWVudE1ldGhvZCB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nX18kMyhgRG9pbmcgY2hlY2tvdXQuLi5gKTtcbiAgICAgICAgY29uc3QgY2hlY2tvdXRSZXF1ZXN0ID0ge1xuICAgICAgICAgIHNlY3VyZV90b2tlbjogcHJlZmlsbC50b2tlbixcbiAgICAgICAgICBwYXltZW50X2lucHV0OiB7XG4gICAgICAgICAgICBwcm92aWRlcl90eXBlOiBjaGVja291dFBheW1lbnRNZXRob2QucHJvdmlkZXJcbiAgICAgICAgICB9LFxuICAgICAgICAgIGN1c3RvbWVyX2VtYWlsOiBub25DZGVGb3JtRmllbGRzW0ZpZWxkTmFtZS5FTUFJTF0sXG4gICAgICAgICAgY3VzdG9tZXJfemlwX2NvZGU6IG5vbkNkZUZvcm1GaWVsZHNbRmllbGROYW1lLlpJUF9DT0RFXSxcbiAgICAgICAgICBjdXN0b21lcl9jb3VudHJ5OiBub25DZGVGb3JtRmllbGRzW0ZpZWxkTmFtZS5DT1VOVFJZXSxcbiAgICAgICAgICBwcm9tb3Rpb25fY29kZTogbm9uQ2RlRm9ybUZpZWxkc1tGaWVsZE5hbWUuUFJPTU9USU9OX0NPREVdLFxuICAgICAgICAgIGxpbmVfaXRlbXM6IHByZWZpbGwubGluZV9pdGVtcyxcbiAgICAgICAgICB0b3RhbF9hbW91bnRfYXRvbTogcHJlZmlsbC5hbW91bnRfdG90YWxfYXRvbSxcbiAgICAgICAgICBjYW5jZWxfYXRfZW5kOiBmYWxzZSxcbiAgICAgICAgICBjaGVja291dF9wYXltZW50X21ldGhvZDogY2hlY2tvdXRQYXltZW50TWV0aG9kXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBlcmZvcm1DaGVja291dChhbnlDZGVDb25uZWN0aW9uLCBjaGVja291dFJlcXVlc3QpO1xuICAgICAgICByZXR1cm4geyBtb2RlOiBcImNoZWNrb3V0XCIsIHJlc3VsdCB9O1xuICAgICAgfVxuICAgIH1cbiAgKTtcbiAgY29uc3QgZmlsbEVtcHR5Rm9ybUlucHV0c1dpdGhTdHJpcGVQTSA9IChmb3JtSW5wdXRzLCBzdHJpcGVQbSkgPT4ge1xuICAgIGNvbnN0IGlucHV0cyA9IHsgLi4uZm9ybUlucHV0cyB9O1xuICAgIGNvbnN0IFtwYXllckZpcnN0TmFtZSwgLi4ucGF5ZXJMYXN0TmFtZVBhcnRzXSA9IHN0cmlwZVBtLmJpbGxpbmdfZGV0YWlscy5uYW1lPy50cmltKCk/LnNwbGl0KC9cXHMrLykgPz8gW107XG4gICAgY29uc3QgcGF5ZXJMYXN0TmFtZSA9IHBheWVyTGFzdE5hbWVQYXJ0cy5qb2luKFwiIFwiKSB8fCB2b2lkIDA7XG4gICAgaW5wdXRzW0ZpZWxkTmFtZS5GSVJTVF9OQU1FXSA9IGlucHV0c1tGaWVsZE5hbWUuRklSU1RfTkFNRV0gfHwgcGF5ZXJGaXJzdE5hbWUgfHwgXCJfT1BfVU5LTk9XTlwiO1xuICAgIGlucHV0c1tGaWVsZE5hbWUuTEFTVF9OQU1FXSA9IGlucHV0c1tGaWVsZE5hbWUuTEFTVF9OQU1FXSB8fCBwYXllckxhc3ROYW1lIHx8IFwiX09QX1VOS05PV05cIjtcbiAgICBpbnB1dHNbRmllbGROYW1lLkVNQUlMXSA9IGlucHV0c1tGaWVsZE5hbWUuRU1BSUxdIHx8IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgc3RyaXBlUG1bXCJsaW5rXCJdPy5lbWFpbCB8fCBzdHJpcGVQbS5iaWxsaW5nX2RldGFpbHMuZW1haWwgfHwgXCJvcF91bmZpbGxlZEBnZXRvcGVucGF5LmNvbVwiO1xuICAgIGlucHV0c1tGaWVsZE5hbWUuWklQX0NPREVdID0gaW5wdXRzW0ZpZWxkTmFtZS5aSVBfQ09ERV0gfHwgc3RyaXBlUG0uYmlsbGluZ19kZXRhaWxzLmFkZHJlc3M/LnBvc3RhbF9jb2RlIHx8IFwiMDAwMDBcIjtcbiAgICBpbnB1dHNbRmllbGROYW1lLkNPVU5UUlldID0gaW5wdXRzW0ZpZWxkTmFtZS5DT1VOVFJZXSB8fCBzdHJpcGVQbS5iaWxsaW5nX2RldGFpbHMuYWRkcmVzcz8uY291bnRyeSB8fCBcIlVTXCI7XG4gICAgbG9nX18kMyhgRmluYWwgZm9ybSBpbnB1dHM6YCwgaW5wdXRzKTtcbiAgICByZXR1cm4gaW5wdXRzO1xuICB9O1xuICBjb25zdCBnZXRFbGVtZW50QnlJZEFzeW5jID0gKGlkKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IGdldEVsZW1lbnQgPSAoKSA9PiB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgcmVzb2x2ZShlbGVtZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShnZXRFbGVtZW50KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGdldEVsZW1lbnQoKTtcbiAgfSk7XG5cbiAgY29uc3Qgc3R5bGVzID0gXCJAa2V5ZnJhbWVzIGZhZGVJbnswJXtvcGFjaXR5OjA7dHJhbnNmb3JtOnNjYWxlKC45KX10b3tvcGFjaXR5OjE7dHJhbnNmb3JtOnNjYWxlKDEpfX0ub3ZlcmxheXtwb3NpdGlvbjpmaXhlZDt0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTt6LWluZGV4OjIxNDc0ODM2NDghaW1wb3J0YW50O2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcjtiYWNrZ3JvdW5kLWNvbG9yOiMwMDAwMDA4MH0uY29udGFpbmVye21heC13aWR0aDo1MDBweDttYXgtaGVpZ2h0OjYwMHB4O3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7YmFja2dyb3VuZC1jb2xvcjojZmZmO3Bvc2l0aW9uOnJlbGF0aXZlO2FuaW1hdGlvbjpmYWRlSW4gLjNzIGVhc2Utb3V0fS5mcmFtZXttYXgtd2lkdGg6NTAwcHg7bWF4LWhlaWdodDo2MDBweDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2JvcmRlcjpub25lfS5jYW5jZWwtYnV0dG9ue3Bvc2l0aW9uOmFic29sdXRlO2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Ym9yZGVyOm5vbmU7Zm9udC1zaXplOjFyZW07Y29sb3I6I2ZmZjtjdXJzb3I6cG9pbnRlcjt0b3A6LTEuNXJlbTtwYWRkaW5nOjA7cmlnaHQ6MH1cIjtcblxuICBjb25zdCBjcmVhdGVBbmRPcGVuRnJhbWUgPSAodXJsKSA9PiB7XG4gICAgY29uc3QgdGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIik7XG4gICAgdGVtcGxhdGUuaW5uZXJIVE1MID0gYFxuICAgIDxzdHlsZT5cbiAgICAgICR7c3R5bGVzfVxuICAgIDwvc3R5bGU+XG4gICAgPGRpdiBjbGFzcz1cIm92ZXJsYXlcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXJcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNhbmNlbC1idXR0b25cIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgPGlmcmFtZSBzcmM9XCIke3VybH1cIiBjbGFzcz1cImZyYW1lXCIgaWQ9XCJ0aHJlZS1kcy1pZnJhbWVcIiB0aXRsZT1cIjNEIFNlY3VyZSB2ZXJpZmljYXRpb25cIiBhbGxvdz1cInBheW1lbnRcIj48L2lmcmFtZT5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgO1xuICAgIGNvbnN0IGhvc3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIGNvbnN0IHNoYWRvd1Jvb3QgPSBob3N0LmF0dGFjaFNoYWRvdyh7IG1vZGU6IFwib3BlblwiIH0pO1xuICAgIHNoYWRvd1Jvb3QuYXBwZW5kQ2hpbGQodGVtcGxhdGUuY29udGVudC5jbG9uZU5vZGUodHJ1ZSkpO1xuICAgIGNvbnN0IGlmcmFtZSA9IHNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcihcIiN0aHJlZS1kcy1pZnJhbWVcIik7XG4gICAgY29uc3QgY2FuY2VsQnV0dG9uID0gc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKFwiLmNhbmNlbC1idXR0b25cIik7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChob3N0KTtcbiAgICByZXR1cm4geyBob3N0LCBpZnJhbWUsIGNhbmNlbEJ1dHRvbiB9O1xuICB9O1xuXG4gIGZ1bmN0aW9uIHN0YXJ0UG9sbGluZyhpZnJhbWUsIG9uU3VjY2VzcywgY2hpbGRPcmlnaW4pIHtcbiAgICBjb25zdCBoYW5kbGVQb2xsaW5nID0gYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc29sZS5sb2coXCLwn5SEIFBvbGxpbmcgQ0RFIGNvbm5lY3Rpb24uLi5cIik7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IHBpbmdDZGVGb3IzZHNTdGF0dXMoaWZyYW1lLCBjaGlsZE9yaWdpbik7XG4gICAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIvCfn6IgQ0RFIGNvbm5lY3Rpb24gc3VjY2Vzc2Z1bCEgU3RvcHBpbmcgcG9sbGluZy4uLlwiKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIuKeoe+4jyBHb3Qgc3RhdHVzOlwiLCBzdGF0dXMpO1xuICAgICAgICAgIGNsZWFySW50ZXJ2YWwocG9sbGluZ0ludGVydmFsKTtcbiAgICAgICAgICBvblN1Y2Nlc3Moc3RhdHVzKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIH1cbiAgICB9O1xuICAgIGhhbmRsZVBvbGxpbmcoKTtcbiAgICBjb25zdCBwb2xsaW5nSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChoYW5kbGVQb2xsaW5nLCBDREVfUE9MTElOR19JTlRFUlZBTCk7XG4gICAgcmV0dXJuIHBvbGxpbmdJbnRlcnZhbDtcbiAgfVxuICBmdW5jdGlvbiBoYW5kbGVFdmVudHMoe1xuICAgIGVsZW1lbnRzLFxuICAgIHBvbGxpbmdJbnRlcnZhbCxcbiAgICByZXNvbHZlXG4gIH0pIHtcbiAgICBjb25zdCBoYW5kbGVDYW5jZWwgPSAoKSA9PiB7XG4gICAgICBjbGVhckludGVydmFsKHBvbGxpbmdJbnRlcnZhbCk7XG4gICAgICBlbGVtZW50cy5ob3N0LnJlbW92ZSgpO1xuICAgICAgcmVzb2x2ZShUaHJlZURTU3RhdHVzLkNBTkNFTExFRCk7XG4gICAgfTtcbiAgICBlbGVtZW50cy5jYW5jZWxCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGhhbmRsZUNhbmNlbCk7XG4gICAgY29uc3QgY2xlYW51cEV2ZW50TGlzdGVuZXJzID0gKCkgPT4ge1xuICAgICAgZWxlbWVudHMuY2FuY2VsQnV0dG9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBoYW5kbGVDYW5jZWwpO1xuICAgIH07XG4gICAgcmV0dXJuIGNsZWFudXBFdmVudExpc3RlbmVycztcbiAgfVxuICBhc3luYyBmdW5jdGlvbiBzdGFydDNkc1ZlcmlmaWNhdGlvbih7XG4gICAgdXJsLFxuICAgIGJhc2VVcmxcbiAgfSkge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gY3JlYXRlQW5kT3BlbkZyYW1lKHVybCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBjb25zdCBvblN1Y2Nlc3MgPSAoc3RhdHVzKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGVsZW1lbnRzLmhvc3QucmVtb3ZlKCk7XG4gICAgICAgIH0sIDFlMyk7XG4gICAgICAgIHJlc29sdmUoc3RhdHVzKTtcbiAgICAgICAgY2xlYW51cEV2ZW50TGlzdGVuZXJzPy4oKTtcbiAgICAgIH07XG4gICAgICBjb25zdCBwb2xsaW5nSW50ZXJ2YWwgPSBzdGFydFBvbGxpbmcoZWxlbWVudHMuaWZyYW1lLCBvblN1Y2Nlc3MsIG5ldyBVUkwoYmFzZVVybCkub3JpZ2luKTtcbiAgICAgIGNvbnN0IGNsZWFudXBFdmVudExpc3RlbmVycyA9IGhhbmRsZUV2ZW50cyh7XG4gICAgICAgIGVsZW1lbnRzLFxuICAgICAgICBwb2xsaW5nSW50ZXJ2YWwsXG4gICAgICAgIHJlc29sdmVcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgeyBsb2dfXzogbG9nX18kMiwgZXJyX186IGVycl9fJDIgfSA9IGNyZWF0ZU9qc0Zsb3dMb2dnZXJzKFwiY29tbW9uLWNjXCIpO1xuICBjb25zdCB7IGxvZ19fOiBzdHJpcGVMb2dfXyB9ID0gY3JlYXRlT2pzRmxvd0xvZ2dlcnMoXCJzdHJpcGUtY2NcIik7XG4gIGNvbnN0IHJ1bkNvbW1vbkNjRmxvdyA9IGFkZEJhc2ljQ2hlY2tvdXRDYWxsYmFja0hhbmRsZXJzKFxuICAgIGFzeW5jICh7IGNvbnRleHQsIGNoZWNrb3V0UGF5bWVudE1ldGhvZCwgbm9uQ2RlRm9ybUlucHV0cywgZmxvd0NhbGxiYWNrcyB9KSA9PiB7XG4gICAgICBsb2dfXyQyKGDilJwgUnVubmluZyBjb21tb24gQ0MgZmxvdy4uLmAsIHsgY2hlY2tvdXRQYXltZW50TWV0aG9kIH0pO1xuICAgICAgY29uc3QgYW55Q2RlQ29ubmVjdGlvbiA9IEFycmF5LmZyb20oY29udGV4dC5jZGVDb25uZWN0aW9ucy52YWx1ZXMoKSlbMF07XG4gICAgICBjb25zdCBwcmVmaWxsID0gYXdhaXQgZ2V0UHJlZmlsbChhbnlDZGVDb25uZWN0aW9uKTtcbiAgICAgIGxvZ19fJDIoYOKUnCBWYWxpZGF0aW5nIG5vbi1DREUgZm9ybSBmaWVsZHMgW01vZGU6ICR7cHJlZmlsbC5tb2RlfV1gKTtcbiAgICAgIGNvbnN0IG5vbkNkZUZvcm1GaWVsZHMgPSB2YWxpZGF0ZU5vbkNkZUZvcm1GaWVsZHNGb3JDQyhub25DZGVGb3JtSW5wdXRzLCBmbG93Q2FsbGJhY2tzLm9uVmFsaWRhdGlvbkVycm9yKTtcbiAgICAgIGxvZ19fJDIoYOKUnCBUb2tlbml6aW5nIGNhcmQgaW5mbyBpbiBDREUgW1Nlc3Npb246ICR7Y29udGV4dC5lbGVtZW50c1Nlc3Npb25JZH1dYCk7XG4gICAgICBjb25zdCB0b2tlbml6ZUNhcmRSZXN1bHRzID0gYXdhaXQgdG9rZW5pemVDYXJkT25BbGxDb25uZWN0aW9ucyhjb250ZXh0LmNkZUNvbm5lY3Rpb25zLCB7XG4gICAgICAgIHNlc3Npb25faWQ6IGNvbnRleHQuZWxlbWVudHNTZXNzaW9uSWRcbiAgICAgIH0pO1xuICAgICAgdmFsaWRhdGVUb2tlbml6ZUNhcmRSZXN1bHRzKHRva2VuaXplQ2FyZFJlc3VsdHMsIGZsb3dDYWxsYmFja3Mub25WYWxpZGF0aW9uRXJyb3IpO1xuICAgICAgY29uc3QgY29tbW9uQ2hlY2tvdXRQYXJhbXMgPSB7XG4gICAgICAgIHNlc3Npb25faWQ6IGNvbnRleHQuZWxlbWVudHNTZXNzaW9uSWQsXG4gICAgICAgIGNoZWNrb3V0X3BheW1lbnRfbWV0aG9kOiBjaGVja291dFBheW1lbnRNZXRob2QsXG4gICAgICAgIG5vbl9jZGVfZm9ybV9maWVsZHM6IG5vbkNkZUZvcm1GaWVsZHNcbiAgICAgIH07XG4gICAgICB0cnkge1xuICAgICAgICBpZiAocHJlZmlsbC5tb2RlID09PSBcInNldHVwXCIpIHtcbiAgICAgICAgICBsb2dfXyQyKGDilJwgU2V0dGluZyB1cCBwYXltZW50IG1ldGhvZCBpbiBDREUgW1Rva2VuOiAke3ByZWZpbGwudG9rZW59XWApO1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNldHVwQ2hlY2tvdXQoYW55Q2RlQ29ubmVjdGlvbiwgY29tbW9uQ2hlY2tvdXRQYXJhbXMpO1xuICAgICAgICAgIGxvZ19fJDIoYOKVsCBTZXR1cCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IFtQTSBJRDogJHtyZXN1bHQucGF5bWVudF9tZXRob2RfaWR9XWApO1xuICAgICAgICAgIHJldHVybiB7IG1vZGU6IFwic2V0dXBcIiwgcmVzdWx0IH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG9nX18kMihg4pScIEluaXRpYWwgY2hlY2tvdXQgZmxvdy4gQ2hlY2tpbmcgb3V0IGNhcmQgaW5mbyBpbiBDREUgW1Nlc3Npb246ICR7Y29udGV4dC5lbGVtZW50c1Nlc3Npb25JZH1dYCk7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2hlY2tvdXRDYXJkRWxlbWVudHMoYW55Q2RlQ29ubmVjdGlvbiwgY29tbW9uQ2hlY2tvdXRQYXJhbXMpO1xuICAgICAgICAgIGxvZ19fJDIoYOKVsCBDaGVja291dCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LmApO1xuICAgICAgICAgIHJldHVybiB7IG1vZGU6IFwiY2hlY2tvdXRcIiwgcmVzdWx0IH07XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIENkZUVycm9yKSB7XG4gICAgICAgICAgaWYgKGVycm9yLm9yaWdpbmFsRXJyb3JNZXNzYWdlID09PSBcIjNEU19SRVFVSVJFRFwiKSB7XG4gICAgICAgICAgICBsb2dfXyQyKGDilJwgQ2FyZCByZXF1aXJlcyAzRFMsIHN0YXJ0aW5nIG5vbi1sZWdhY3kgcGF5bWVudCBmbG93YCk7XG4gICAgICAgICAgICBsb2dfXyQyKFwiZXJyb3IucmVzcG9uc2UuaGVhZGVyc1wiLCBlcnJvci5yZXNwb25zZS5oZWFkZXJzKTtcbiAgICAgICAgICAgIGNvbnN0IHNob3VsZFVzZU5ld0Zsb3cgPSBlcnJvci5yZXNwb25zZS5oZWFkZXJzPy5bXCJvcC1zaG91bGQtdXNlLW5ldy1mbG93XCJdID09PSBcInRydWVcIjtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0UGZSZXN1bHQgPSBhd2FpdCBzdGFydFBheW1lbnRGbG93Rm9yQ0MoYW55Q2RlQ29ubmVjdGlvbiwgY29tbW9uQ2hlY2tvdXRQYXJhbXMpO1xuICAgICAgICAgICAgbG9nX18kMihg4pScIG9wLXNob3VsZC11c2UtbmV3LWZsb3c6ICR7c2hvdWxkVXNlTmV3Rmxvd31gKTtcbiAgICAgICAgICAgIGxvZ19fJDIoYOKUnCBQYXltZW50IGZsb3cgcmVzdWx0OmAsIHN0YXJ0UGZSZXN1bHQpO1xuICAgICAgICAgICAgaWYgKHNob3VsZFVzZU5ld0Zsb3cpIHtcbiAgICAgICAgICAgICAgYXdhaXQgY29tbW9uQ0MzRFNGbG93KHN0YXJ0UGZSZXN1bHQsIGNvbnRleHQuYmFzZVVybCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBhd2FpdCBzdHJpcGVDQzNEU0Zsb3coc3RhcnRQZlJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocHJlZmlsbC5tb2RlID09PSBcInNldHVwXCIpIHtcbiAgICAgICAgICAgICAgbG9nX18kMihg4pScIENvbmZpcm1pbmcgcGF5bWVudCBmbG93IFtjY19wbV9pZDogJHtzdGFydFBmUmVzdWx0LmNjX3BtX2lkfV1gKTtcbiAgICAgICAgICAgICAgY29uc3QgY29uZmlybVJlc3VsdCA9IGF3YWl0IGNvbmZpcm1QYXltZW50RmxvdyhhbnlDZGVDb25uZWN0aW9uLCB7XG4gICAgICAgICAgICAgICAgc2VjdXJlX3Rva2VuOiBwcmVmaWxsLnRva2VuLFxuICAgICAgICAgICAgICAgIGV4aXN0aW5nX2NjX3BtX2lkOiBzdGFydFBmUmVzdWx0LmNjX3BtX2lkXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBsb2dfXyQyKGDilJwgQ29uZmlybSBwYXltZW50IGZsb3cgcmVzdWx0IHJlY2VpdmVkIFJlc3VsdDpgLCBjb25maXJtUmVzdWx0KTtcbiAgICAgICAgICAgICAgY29uc3QgY3JlYXRlZFBheW1lbnRNZXRob2QgPSBwYXJzZUNvbmZpcm1QYXltZW50Rmxvd1Jlc3BvbnNlKGNvbmZpcm1SZXN1bHQpO1xuICAgICAgICAgICAgICBsb2dfXyQyKGDilbAgU2V0dXAgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBbUE0gSUQ6ICR7Y3JlYXRlZFBheW1lbnRNZXRob2QucGF5bWVudF9tZXRob2RfaWR9XWApO1xuICAgICAgICAgICAgICByZXR1cm4geyBtb2RlOiBcInNldHVwXCIsIHJlc3VsdDogY3JlYXRlZFBheW1lbnRNZXRob2QgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGxvZ19fJDIoYOKUnCBDaGVja2luZyBvdXQgYWZ0ZXIgM0RTIGZsb3cgW0Zsb3c6ICR7c2hvdWxkVXNlTmV3RmxvdyA/IFwibmV3XCIgOiBcImxlZ2FjeVwifV1gKTtcbiAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2hlY2tvdXRDYXJkRWxlbWVudHMoYW55Q2RlQ29ubmVjdGlvbiwge1xuICAgICAgICAgICAgICAgIC4uLmNvbW1vbkNoZWNrb3V0UGFyYW1zLFxuICAgICAgICAgICAgICAgIGV4aXN0aW5nX2NjX3BtX2lkOiBzdGFydFBmUmVzdWx0LmNjX3BtX2lkLFxuICAgICAgICAgICAgICAgIGRvX25vdF91c2VfbGVnYWN5X2NjX2Zsb3c6ICFzaG91bGRVc2VOZXdGbG93XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBsb2dfXyQyKGDilbAgQ2hlY2tvdXQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS5gKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgbW9kZTogXCJjaGVja291dFwiLCByZXN1bHQgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZXJyX18kMihg4pWwIEVycm9yIGNoZWNraW5nIG91dCBjYXJkIGluZm8gaW4gQ0RFYCk7XG4gICAgICAgIGVycl9fJDIoZXJyb3IpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gICk7XG4gIGNvbnN0IHBhcnNlU3RyaXBlM0RTTmV4dEFjdGlvbk1ldGFkYXRhID0gKHJlc3BvbnNlKSA9PiB7XG4gICAgY29uc3Qgc3RyaXBlQWN0aW9uID0gcmVzcG9uc2UucmVxdWlyZWRfdXNlcl9hY3Rpb25zLmZpbmQoKGFjdGlvbikgPT4gYWN0aW9uLnR5cGUgPT09IFwic3RyaXBlXzNkc1wiKTtcbiAgICBpZiAoIXN0cmlwZUFjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gc3RyaXBlIDNEUyBhY3Rpb24gZm91bmRcIik7XG4gICAgfVxuICAgIHJldHVybiBTdHJpcGUzRFNOZXh0QWN0aW9uTWV0YWRhdGEucGFyc2Uoc3RyaXBlQWN0aW9uKTtcbiAgfTtcbiAgY29uc3QgcGFyc2VDb21tb24zRFNOZXh0QWN0aW9uTWV0YWRhdGEgPSAocmVzcG9uc2UpID0+IHtcbiAgICBjb25zdCBjb21tb25BY3Rpb24gPSByZXNwb25zZS5yZXF1aXJlZF91c2VyX2FjdGlvbnMuZmluZCgoYWN0aW9uKSA9PiBhY3Rpb24udHlwZSA9PT0gXCJhaXJ3YWxsZXhfcGF5bWVudF9jb25zZW50XCIpO1xuICAgIGlmICghY29tbW9uQWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBjb21tb24gM0RTIGFjdGlvbiBmb3VuZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIENvbW1vbjNEU05leHRBY3Rpb25NZXRhZGF0YS5wYXJzZShjb21tb25BY3Rpb24pO1xuICB9O1xuICBjb25zdCBjb21tb25DQzNEU0Zsb3cgPSBhc3luYyAoc3RhcnRQZlJlc3VsdCwgYmFzZVVybCkgPT4ge1xuICAgIGNvbnN0IG5leHRBY3Rpb25NZXRhZGF0YSA9IHBhcnNlQ29tbW9uM0RTTmV4dEFjdGlvbk1ldGFkYXRhKHN0YXJ0UGZSZXN1bHQpO1xuICAgIGxvZ19fJDIoYOKUnCBVc2luZyBjb21tb24gM0RTIGZsb3cgW1VSTDogJHtuZXh0QWN0aW9uTWV0YWRhdGEucmVkaXJlY3RfdXJsfV1gKTtcbiAgICBjb25zdCBzdGF0dXMgPSBhd2FpdCBzdGFydDNkc1ZlcmlmaWNhdGlvbih7IHVybDogbmV4dEFjdGlvbk1ldGFkYXRhLnJlZGlyZWN0X3VybCwgYmFzZVVybCB9KTtcbiAgICBsb2dfXyQyKGDilbAgM0RTIHZlcmlmaWNhdGlvbiBjb21wbGV0ZWQgW1N0YXR1czogJHtzdGF0dXN9XWApO1xuICAgIGlmIChzdGF0dXMgPT09IFRocmVlRFNTdGF0dXMuQ0FOQ0VMTEVEKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCIzRFMgdmVyaWZpY2F0aW9uIGNhbmNlbGxlZFwiKTtcbiAgICB9XG4gICAgaWYgKHN0YXR1cyA9PT0gVGhyZWVEU1N0YXR1cy5GQUlMVVJFKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCIzRFMgdmVyaWZpY2F0aW9uIGZhaWxlZFwiKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHN0cmlwZUNDM0RTRmxvdyA9IGFzeW5jIChzdGFydFBmUmVzdWx0KSA9PiB7XG4gICAgY29uc3QgbmV4dEFjdGlvbk1ldGFkYXRhID0gcGFyc2VTdHJpcGUzRFNOZXh0QWN0aW9uTWV0YWRhdGEoc3RhcnRQZlJlc3VsdCk7XG4gICAgc3RyaXBlTG9nX18oYOKUnCBVc2luZyBzdHJpcGUgM0RTIGZsb3cgW0NsaWVudCBTZWNyZXQ6ICR7bmV4dEFjdGlvbk1ldGFkYXRhLmNsaWVudF9zZWNyZXQuc3Vic3RyaW5nKDAsIDgpfS4uLl1gKTtcbiAgICBhd2FpdCBsYXVuY2hTdHJpcGUzRFNEaWFsb2dGbG93KG5leHRBY3Rpb25NZXRhZGF0YSk7XG4gICAgc3RyaXBlTG9nX18oXCLilbAgU3RyaXBlIDNEUyBmbG93IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHlcIik7XG4gIH07XG5cbiAgY29uc3QgeyBsb2dfXzogbG9nX18kMSwgZXJyX186IGVycl9fJDEgfSA9IGNyZWF0ZU9qc0Zsb3dMb2dnZXJzKFwic3RyaXBlLXByXCIpO1xuICBjb25zdCBTdHJpcGVQckNwbSA9IHpvZC56Lm9iamVjdCh7XG4gICAgcHJvdmlkZXI6IHpvZC56LnVuaW9uKFt6b2Quei5saXRlcmFsKFwiYXBwbGVfcGF5XCIpLCB6b2Quei5saXRlcmFsKFwiZ29vZ2xlX3BheVwiKV0pLFxuICAgIHByb2Nlc3Nvcl9uYW1lOiB6b2Quei5saXRlcmFsKFwic3RyaXBlXCIpLFxuICAgIG1ldGFkYXRhOiB6b2Quei5vYmplY3Qoe1xuICAgICAgc3RyaXBlX3BrOiB6b2Quei5zdHJpbmcoKVxuICAgIH0pXG4gIH0pO1xuICBjb25zdCBpbml0U3RyaXBlUHJGbG93ID0gYWRkRXJyb3JDYXRjaGVyRm9ySW5pdChcbiAgICBhc3luYyAoeyBjb250ZXh0IH0pID0+IHtcbiAgICAgIGxvZ19fJDEoYENoZWNraW5nIGlmIHRoZXJlIGFyZSBhbnkgQ1BNcyBmb3IgU3RyaXBlIFBSLi4uYCk7XG4gICAgICBjb25zdCBjaGVja291dFBheW1lbnRNZXRob2QgPSBmaW5kQ3BtTWF0Y2hpbmdUeXBlKGNvbnRleHQuY2hlY2tvdXRQYXltZW50TWV0aG9kcywgU3RyaXBlUHJDcG0pO1xuICAgICAgbG9nX18kMShgSW5pdGlhbGl6aW5nIFN0cmlwZSBQUiBmbG93Li4uYCk7XG4gICAgICBjb25zdCBhbnlDZGVDb25uZWN0aW9uID0gQXJyYXkuZnJvbShjb250ZXh0LmNkZUNvbm5lY3Rpb25zLnZhbHVlcygpKVswXTtcbiAgICAgIGNvbnN0IHByZWZpbGwgPSBhd2FpdCBnZXRQcmVmaWxsKGFueUNkZUNvbm5lY3Rpb24pO1xuICAgICAgY29uc3QgaXNTZXR1cE1vZGUgPSBwcmVmaWxsLm1vZGUgPT09IFwic2V0dXBcIjtcbiAgICAgIGxvZ19fJDEoYEdldHRpbmcgaW5pdGlhbCBwcmV2aWV3IGFtb3VudGApO1xuICAgICAgY29uc3QgaW5pdGlhbFByZXZpZXcgPSBhd2FpdCBnZXRDaGVja291dFByZXZpZXdBbW91bnQoYW55Q2RlQ29ubmVjdGlvbiwgcHJlZmlsbC50b2tlbiwgaXNTZXR1cE1vZGUsIHZvaWQgMCk7XG4gICAgICBjb25zdCBwciA9IGF3YWl0IGNyZWF0ZVN0cmlwZVBheW1lbnRSZXF1ZXN0KFxuICAgICAgICBjaGVja291dFBheW1lbnRNZXRob2QubWV0YWRhdGEuc3RyaXBlX3BrLFxuICAgICAgICBpbml0aWFsUHJldmlldy5hbW91bnRBdG9tLFxuICAgICAgICBpbml0aWFsUHJldmlldy5jdXJyZW5jeSxcbiAgICAgICAgaXNTZXR1cE1vZGVcbiAgICAgICk7XG4gICAgICBsb2dfXyQxKGBDaGVja2luZyBpZiBjYW4gbWFrZSBwYXltZW50YCk7XG4gICAgICBjb25zdCBjYW5NYWtlUGF5bWVudCA9IGF3YWl0IHByLmNhbk1ha2VQYXltZW50KCk7XG4gICAgICBpZiAoY2FuTWFrZVBheW1lbnQgPT09IG51bGwpIHtcbiAgICAgICAgZXJyX18kMShgY2FuTWFrZVBheW1lbnQgcmV0dXJuZWQgbnVsbGApO1xuICAgICAgICByZXR1cm4geyBpc0F2YWlsYWJsZTogZmFsc2UsIHJlYXNvbjogXCJjYW5NYWtlUGF5bWVudCByZXR1cm5lZCBudWxsXCIgfTtcbiAgICAgIH1cbiAgICAgIGxvZ19fJDEoYFN0cmlwZSBQUiBmbG93IGluaXRpYWxpemVkIHN1Y2Nlc3NmdWxseS4gQ2FuIG1ha2UgcGF5bWVudGAsIGNhbk1ha2VQYXltZW50KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzQXZhaWxhYmxlOiB0cnVlLFxuICAgICAgICBwcixcbiAgICAgICAgYXZhaWxhYmxlUHJvdmlkZXJzOiB7XG4gICAgICAgICAgYXBwbGVQYXk6IGNhbk1ha2VQYXltZW50LmFwcGxlUGF5LFxuICAgICAgICAgIGdvb2dsZVBheTogY2FuTWFrZVBheW1lbnQuZ29vZ2xlUGF5XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICApO1xuICBjb25zdCBydW5TdHJpcGVQckZsb3cgPSBhZGRCYXNpY0NoZWNrb3V0Q2FsbGJhY2tIYW5kbGVycyhcbiAgICBhc3luYyAoe1xuICAgICAgY29udGV4dCxcbiAgICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZCxcbiAgICAgIG5vbkNkZUZvcm1JbnB1dHMsXG4gICAgICBmbG93Q2FsbGJhY2tzLFxuICAgICAgY3VzdG9tUGFyYW1zLFxuICAgICAgaW5pdFJlc3VsdFxuICAgIH0pID0+IHtcbiAgICAgIGxvZ19fJDEoYFJ1bm5pbmcgU3RyaXBlIFBSIGZsb3cuLi5gKTtcbiAgICAgIGlmIChjdXN0b21QYXJhbXMucHJvdmlkZXIgIT09IGNoZWNrb3V0UGF5bWVudE1ldGhvZC5wcm92aWRlcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFByb3ZpZGVyIG1pc21hdGNoLiBFeHBlY3RlZCAke2N1c3RvbVBhcmFtcy5wcm92aWRlcn0sIGdvdCAke2NoZWNrb3V0UGF5bWVudE1ldGhvZC5wcm92aWRlcn1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFueUNkZUNvbm5lY3Rpb24gPSBBcnJheS5mcm9tKGNvbnRleHQuY2RlQ29ubmVjdGlvbnMudmFsdWVzKCkpWzBdO1xuICAgICAgY29uc3QgcHIgPSBpbml0UmVzdWx0LnByO1xuICAgICAgaWYgKGN1c3RvbVBhcmFtcz8ub3ZlcnJpZGVQYXltZW50UmVxdWVzdCkge1xuICAgICAgICBjb25zdCBvdmVycmlkZSA9IGN1c3RvbVBhcmFtcy5vdmVycmlkZVBheW1lbnRSZXF1ZXN0O1xuICAgICAgICBsb2dfXyQxKGBPdmVycmlkaW5nIFBSIGFtb3VudCB3aXRoYCwgb3ZlcnJpZGUpO1xuICAgICAgICB1cGRhdGVQcldpdGhBbW91bnQocHIsIG92ZXJyaWRlLmFtb3VudCwgb3ZlcnJpZGUucGVuZGluZyk7XG4gICAgICB9XG4gICAgICBsb2dfXyQxKGBTaG93aW5nIFBSIGRpYWxvZy4uLmApO1xuICAgICAgcHIuc2hvdygpO1xuICAgICAgY29uc3Qgc3RyaXBlUG1BZGRlZEV2ZW50ID0gYXdhaXQgd2FpdEZvclVzZXJUb0FkZFBheW1lbnRNZXRob2QocHIpO1xuICAgICAgbG9nX18kMShgU3RyaXBlIFBNIGFkZGVkIGV2ZW50OmAsIHN0cmlwZVBtQWRkZWRFdmVudCk7XG4gICAgICBsb2dfXyQxKGBNZXJnaW5nIFBNIGZpZWxkcyB3aXRoIGZvcm0gZmllbGRzLi4uYCk7XG4gICAgICBjb25zdCBtZXJnZWRJbnB1dHMgPSBmaWxsRW1wdHlGb3JtSW5wdXRzV2l0aFN0cmlwZVBtKG5vbkNkZUZvcm1JbnB1dHMsIHN0cmlwZVBtQWRkZWRFdmVudCk7XG4gICAgICBjb25zdCBub25DZGVGb3JtRmllbGRzID0gdmFsaWRhdGVOb25DZGVGb3JtRmllbGRzRm9yQ0MobWVyZ2VkSW5wdXRzLCBmbG93Q2FsbGJhY2tzLm9uVmFsaWRhdGlvbkVycm9yKTtcbiAgICAgIGxvZ19fJDEoYFBSIGRpYWxvZyBmaW5pc2hlZC4gU3RhcnRpbmcgcGF5bWVudCBmbG93Li4uYCk7XG4gICAgICBjb25zdCBzdGFydFBheW1lbnRGbG93UmVzcG9uc2UgPSBhd2FpdCBzdGFydFBheW1lbnRGbG93Rm9yUFIoYW55Q2RlQ29ubmVjdGlvbiwge1xuICAgICAgICBmaWVsZHM6IG5vbkNkZUZvcm1GaWVsZHMsXG4gICAgICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZFxuICAgICAgfSk7XG4gICAgICBjb25zdCBuZXh0QWN0aW9uTWV0YWRhdGEgPSBwYXJzZVBSTmV4dEFjdGlvbk1ldGFkYXRhKHN0YXJ0UGF5bWVudEZsb3dSZXNwb25zZSk7XG4gICAgICBsb2dfXyQxKGBDb25maXJtaW5nIFBSIHdpdGggU3RyaXBlLi4uYCk7XG4gICAgICBhd2FpdCBjb25maXJtU3RyaXBlUHJQTShuZXh0QWN0aW9uTWV0YWRhdGEsIHN0cmlwZVBtQWRkZWRFdmVudCk7XG4gICAgICBjb25zdCBwcmVmaWxsID0gYXdhaXQgZ2V0UHJlZmlsbChhbnlDZGVDb25uZWN0aW9uKTtcbiAgICAgIGlmIChwcmVmaWxsLm1vZGUgPT09IFwic2V0dXBcIikge1xuICAgICAgICBsb2dfXyQxKGBDb25maXJtaW5nIHBheW1lbnQgZmxvdyBmb3Igc2V0dXAuLi5gKTtcbiAgICAgICAgY29uc3QgY29uZmlybVJlc3VsdCA9IGF3YWl0IGNvbmZpcm1QYXltZW50RmxvdyhhbnlDZGVDb25uZWN0aW9uLCB7XG4gICAgICAgICAgc2VjdXJlX3Rva2VuOiBwcmVmaWxsLnRva2VuXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBjcmVhdGVkUGF5bWVudE1ldGhvZCA9IHBhcnNlQ29uZmlybVBheW1lbnRGbG93UmVzcG9uc2UoY29uZmlybVJlc3VsdCk7XG4gICAgICAgIHJldHVybiB7IG1vZGU6IFwic2V0dXBcIiwgcmVzdWx0OiBjcmVhdGVkUGF5bWVudE1ldGhvZCB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nX18kMShgUGVyZm9ybWluZyBjaGVja291dC4uLmApO1xuICAgICAgICBjb25zdCBjaGVja291dFJlcXVlc3QgPSB7XG4gICAgICAgICAgc2VjdXJlX3Rva2VuOiBwcmVmaWxsLnRva2VuLFxuICAgICAgICAgIHBheW1lbnRfaW5wdXQ6IHtcbiAgICAgICAgICAgIHByb3ZpZGVyX3R5cGU6IGNoZWNrb3V0UGF5bWVudE1ldGhvZC5wcm92aWRlclxuICAgICAgICAgIH0sXG4gICAgICAgICAgY3VzdG9tZXJfZW1haWw6IG5vbkNkZUZvcm1GaWVsZHNbRmllbGROYW1lLkVNQUlMXSxcbiAgICAgICAgICBjdXN0b21lcl96aXBfY29kZTogbm9uQ2RlRm9ybUZpZWxkc1tGaWVsZE5hbWUuWklQX0NPREVdLFxuICAgICAgICAgIGN1c3RvbWVyX2NvdW50cnk6IG5vbkNkZUZvcm1GaWVsZHNbRmllbGROYW1lLkNPVU5UUlldLFxuICAgICAgICAgIHByb21vdGlvbl9jb2RlOiBub25DZGVGb3JtRmllbGRzW0ZpZWxkTmFtZS5QUk9NT1RJT05fQ09ERV0sXG4gICAgICAgICAgbGluZV9pdGVtczogcHJlZmlsbC5saW5lX2l0ZW1zLFxuICAgICAgICAgIHRvdGFsX2Ftb3VudF9hdG9tOiBwcmVmaWxsLmFtb3VudF90b3RhbF9hdG9tLFxuICAgICAgICAgIGNhbmNlbF9hdF9lbmQ6IGZhbHNlLFxuICAgICAgICAgIGNoZWNrb3V0X3BheW1lbnRfbWV0aG9kOiBjaGVja291dFBheW1lbnRNZXRob2RcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGVyZm9ybUNoZWNrb3V0KGFueUNkZUNvbm5lY3Rpb24sIGNoZWNrb3V0UmVxdWVzdCk7XG4gICAgICAgIHJldHVybiB7IG1vZGU6IFwiY2hlY2tvdXRcIiwgcmVzdWx0IH07XG4gICAgICB9XG4gICAgfVxuICApO1xuICBjb25zdCBmaWxsRW1wdHlGb3JtSW5wdXRzV2l0aFN0cmlwZVBtID0gKGZvcm1JbnB1dHMsIHN0cmlwZVBtRXZ0KSA9PiB7XG4gICAgY29uc3QgaW5wdXRzID0geyAuLi5mb3JtSW5wdXRzIH07XG4gICAgY29uc3QgW3BheWVyRmlyc3ROYW1lLCAuLi5wYXllckxhc3ROYW1lUGFydHNdID0gc3RyaXBlUG1FdnQucGF5ZXJOYW1lPy50cmltKCk/LnNwbGl0KC9cXHMrLykgPz8gW107XG4gICAgY29uc3QgcGF5ZXJMYXN0TmFtZSA9IHBheWVyTGFzdE5hbWVQYXJ0cy5qb2luKFwiIFwiKSB8fCB2b2lkIDA7XG4gICAgaW5wdXRzW0ZpZWxkTmFtZS5GSVJTVF9OQU1FXSA9IGlucHV0c1tGaWVsZE5hbWUuRklSU1RfTkFNRV0gfHwgcGF5ZXJGaXJzdE5hbWUgfHwgXCJfT1BfVU5LTk9XTlwiO1xuICAgIGlucHV0c1tGaWVsZE5hbWUuTEFTVF9OQU1FXSA9IGlucHV0c1tGaWVsZE5hbWUuTEFTVF9OQU1FXSB8fCBwYXllckxhc3ROYW1lIHx8IFwiX09QX1VOS05PV05cIjtcbiAgICBpbnB1dHNbRmllbGROYW1lLkVNQUlMXSA9IGlucHV0c1tGaWVsZE5hbWUuRU1BSUxdIHx8IHN0cmlwZVBtRXZ0LnBheWVyRW1haWwgfHwgXCJvcF91bmZpbGxlZEBnZXRvcGVucGF5LmNvbVwiO1xuICAgIGlucHV0c1tGaWVsZE5hbWUuWklQX0NPREVdID0gaW5wdXRzW0ZpZWxkTmFtZS5aSVBfQ09ERV0gfHwgc3RyaXBlUG1FdnQuc2hpcHBpbmdBZGRyZXNzPy5wb3N0YWxDb2RlIHx8IFwiMDAwMDBcIjtcbiAgICBpbnB1dHNbRmllbGROYW1lLkNPVU5UUlldID0gaW5wdXRzW0ZpZWxkTmFtZS5DT1VOVFJZXSB8fCBzdHJpcGVQbUV2dC5zaGlwcGluZ0FkZHJlc3M/LmNvdW50cnkgfHwgXCJVU1wiO1xuICAgIGxvZ19fJDEoYEZpbmFsIGZvcm0gaW5wdXRzOmAsIGlucHV0cyk7XG4gICAgcmV0dXJuIGlucHV0cztcbiAgfTtcbiAgY29uc3QgdXBkYXRlUHJXaXRoQW1vdW50ID0gKHByLCBhbW91bnQsIGlzUGVuZGluZykgPT4ge1xuICAgIHByLnVwZGF0ZSh7XG4gICAgICB0b3RhbDoge1xuICAgICAgICBhbW91bnQ6IGFtb3VudC5hbW91bnRBdG9tLFxuICAgICAgICBsYWJlbDogXCJUb3RhbFwiLFxuICAgICAgICBwZW5kaW5nOiBpc1BlbmRpbmdcbiAgICAgIH0sXG4gICAgICBjdXJyZW5jeTogYW1vdW50LmN1cnJlbmN5XG4gICAgfSk7XG4gIH07XG4gIGNvbnN0IHBhcnNlUFJOZXh0QWN0aW9uTWV0YWRhdGEgPSAocmVzcG9uc2UpID0+IHtcbiAgICBpZiAocmVzcG9uc2UucmVxdWlyZWRfdXNlcl9hY3Rpb25zLmxlbmd0aCAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBvY2N1cnJlZC5cbkRldGFpbHM6IGdvdCAke3Jlc3BvbnNlLnJlcXVpcmVkX3VzZXJfYWN0aW9ucy5sZW5ndGh9IHJlcXVpcmVkIHVzZXIgYWN0aW9uc2ApO1xuICAgIH1cbiAgICByZXR1cm4gUGF5bWVudFJlcXVlc3ROZXh0QWN0aW9uTWV0YWRhdGEucGFyc2UocmVzcG9uc2UucmVxdWlyZWRfdXNlcl9hY3Rpb25zWzBdKTtcbiAgfTtcblxuICBjb25zdCBmaW5kQ2hlY2tvdXRQYXltZW50TWV0aG9kU3RyaWN0ID0gKGNwbXMsIHdpdGhQcm92aWRlciwgd2l0aFByb2Nlc3NvcikgPT4ge1xuICAgIGNvbnN0IG1hdGNoZXMgPSBjcG1zLmZpbHRlcigoY3BtKSA9PiB7XG4gICAgICBjb25zdCBtYXRjaGVzUHJvY2Vzc29yID0gdHJ1ZSA7XG4gICAgICBjb25zdCBtYXRjaGVzUHJvdmlkZXIgPSBjcG0ucHJvdmlkZXIgPT09IHdpdGhQcm92aWRlcjtcbiAgICAgIHJldHVybiBtYXRjaGVzUHJvY2Vzc29yICYmIG1hdGNoZXNQcm92aWRlcjtcbiAgICB9KTtcbiAgICBpZiAobWF0Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJDUE1zIGxpc3RcIiwgY3Btcyk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIENQTXMgZm91bmQgd2l0aCBwcm92aWRlciAnJHt3aXRoUHJvdmlkZXJ9JyBhbmQgcHJvY2Vzc29yICcke3dpdGhQcm9jZXNzb3J9J2ApO1xuICAgIH1cbiAgICBpZiAobWF0Y2hlcy5sZW5ndGggIT09IDEpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJDUE1zIGxpc3RcIiwgY3Btcyk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1vcmUgdGhhbiBvbmUgQ1BNIGZvdW5kIHdpdGggcHJvdmlkZXIgJyR7d2l0aFByb3ZpZGVyfScgYW5kIHByb2Nlc3NvciAnJHt3aXRoUHJvY2Vzc29yfSdgKTtcbiAgICB9XG4gICAgcmV0dXJuIG1hdGNoZXNbMF07XG4gIH07XG4gIGNvbnN0IE9qc0Zsb3dzID0ge1xuICAgIC8vIOKciyBOb3RlOiBGb3IgZmxvd3MgdGhhdCByZXF1aXJlIGluaXRpYWxpemF0aW9uLCBwbGVhc2UgYWRkIHRoZW0gdG8gYGluaXQtZmxvd3MudHNgXG4gICAgLy8gQ29tbW9uXG4gICAgY29tbW9uQ0M6IHtcbiAgICAgIHJ1bjogcnVuQ29tbW9uQ2NGbG93XG4gICAgfSxcbiAgICAvLyBTdHJpcGVcbiAgICBzdHJpcGVQUjoge1xuICAgICAgaW5pdDogaW5pdFN0cmlwZVByRmxvdyxcbiAgICAgIHJ1bjogcnVuU3RyaXBlUHJGbG93XG4gICAgfSxcbiAgICBzdHJpcGVMaW5rOiB7XG4gICAgICBpbml0OiBpbml0U3RyaXBlTGlua0Zsb3csXG4gICAgICBydW46IHJ1blN0cmlwZUxpbmtGbG93XG4gICAgfVxuICAgIC8vIPCfkYkgQWRkIG1vcmUgZmxvd3MgaGVyZVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIH07XG5cbiAgZnVuY3Rpb24gZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMgKHgpIHtcbiAgXHRyZXR1cm4geCAmJiB4Ll9fZXNNb2R1bGUgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHgsICdkZWZhdWx0JykgPyB4WydkZWZhdWx0J10gOiB4O1xuICB9XG5cbiAgdmFyIE9ic2VydmFibGUkMiA9IHt9O1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPYnNlcnZhYmxlJDIsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgdmFsdWU6IHRydWVcbiAgfSk7XG4gIE9ic2VydmFibGUkMi5PYnNlcnZhYmxlID0gdm9pZCAwO1xuXG4gIC8vID09PSBTeW1ib2wgU3VwcG9ydCA9PT1cbiAgY29uc3QgaGFzU3ltYm9sID0gbmFtZSA9PiBCb29sZWFuKFN5bWJvbFtuYW1lXSk7XG5cbiAgY29uc3QgZ2V0U3ltYm9sID0gbmFtZSA9PiBoYXNTeW1ib2wobmFtZSkgPyBTeW1ib2xbbmFtZV0gOiAnQEAnICsgbmFtZTtcblxuICBjb25zdCBTeW1ib2xJdGVyYXRvciA9IGdldFN5bWJvbCgnaXRlcmF0b3InKTtcbiAgY29uc3QgU3ltYm9sT2JzZXJ2YWJsZSA9IGdldFN5bWJvbCgnb2JzZXJ2YWJsZScpO1xuICBjb25zdCBTeW1ib2xTcGVjaWVzID0gZ2V0U3ltYm9sKCdzcGVjaWVzJyk7IC8vID09PSBBYnN0cmFjdCBPcGVyYXRpb25zID09PVxuXG4gIGZ1bmN0aW9uIGdldE1ldGhvZChvYmosIGtleSkge1xuICAgIGxldCB2YWx1ZSA9IG9ialtrZXldO1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBUeXBlRXJyb3IodmFsdWUgKyAnIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0U3BlY2llcyhvYmopIHtcbiAgICBsZXQgY3RvciA9IG9iai5jb25zdHJ1Y3RvcjtcblxuICAgIGlmIChjdG9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGN0b3IgPSBjdG9yW1N5bWJvbFNwZWNpZXNdO1xuXG4gICAgICBpZiAoY3RvciA9PT0gbnVsbCkge1xuICAgICAgICBjdG9yID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjdG9yICE9PSB1bmRlZmluZWQgPyBjdG9yIDogT2JzZXJ2YWJsZSQxO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNPYnNlcnZhYmxlKHgpIHtcbiAgICByZXR1cm4geCBpbnN0YW5jZW9mIE9ic2VydmFibGUkMTsgLy8gU1BFQzogQnJhbmQgY2hlY2tcbiAgfVxuXG4gIGZ1bmN0aW9uIGhvc3RSZXBvcnRFcnJvcihlKSB7XG4gICAgaWYgKGhvc3RSZXBvcnRFcnJvci5sb2cpIHtcbiAgICAgIGhvc3RSZXBvcnRFcnJvci5sb2coZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZW5xdWV1ZShmbikge1xuICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm4oKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaG9zdFJlcG9ydEVycm9yKGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gY2xlYW51cFN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pIHtcbiAgICBsZXQgY2xlYW51cCA9IHN1YnNjcmlwdGlvbi5fY2xlYW51cDtcbiAgICBpZiAoY2xlYW51cCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgc3Vic2NyaXB0aW9uLl9jbGVhbnVwID0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKCFjbGVhbnVwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGlmICh0eXBlb2YgY2xlYW51cCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjbGVhbnVwKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgdW5zdWJzY3JpYmUgPSBnZXRNZXRob2QoY2xlYW51cCwgJ3Vuc3Vic2NyaWJlJyk7XG5cbiAgICAgICAgaWYgKHVuc3Vic2NyaWJlKSB7XG4gICAgICAgICAgdW5zdWJzY3JpYmUuY2FsbChjbGVhbnVwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGhvc3RSZXBvcnRFcnJvcihlKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjbG9zZVN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pIHtcbiAgICBzdWJzY3JpcHRpb24uX29ic2VydmVyID0gdW5kZWZpbmVkO1xuICAgIHN1YnNjcmlwdGlvbi5fcXVldWUgPSB1bmRlZmluZWQ7XG4gICAgc3Vic2NyaXB0aW9uLl9zdGF0ZSA9ICdjbG9zZWQnO1xuICB9XG5cbiAgZnVuY3Rpb24gZmx1c2hTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKSB7XG4gICAgbGV0IHF1ZXVlID0gc3Vic2NyaXB0aW9uLl9xdWV1ZTtcblxuICAgIGlmICghcXVldWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzdWJzY3JpcHRpb24uX3F1ZXVlID0gdW5kZWZpbmVkO1xuICAgIHN1YnNjcmlwdGlvbi5fc3RhdGUgPSAncmVhZHknO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBxdWV1ZS5sZW5ndGg7ICsraSkge1xuICAgICAgbm90aWZ5U3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbiwgcXVldWVbaV0udHlwZSwgcXVldWVbaV0udmFsdWUpO1xuICAgICAgaWYgKHN1YnNjcmlwdGlvbi5fc3RhdGUgPT09ICdjbG9zZWQnKSBicmVhaztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBub3RpZnlTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uLCB0eXBlLCB2YWx1ZSkge1xuICAgIHN1YnNjcmlwdGlvbi5fc3RhdGUgPSAncnVubmluZyc7XG4gICAgbGV0IG9ic2VydmVyID0gc3Vic2NyaXB0aW9uLl9vYnNlcnZlcjtcblxuICAgIHRyeSB7XG4gICAgICBsZXQgbSA9IGdldE1ldGhvZChvYnNlcnZlciwgdHlwZSk7XG5cbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlICduZXh0JzpcbiAgICAgICAgICBpZiAobSkgbS5jYWxsKG9ic2VydmVyLCB2YWx1ZSk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgICAgIGNsb3NlU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbik7XG4gICAgICAgICAgaWYgKG0pIG0uY2FsbChvYnNlcnZlciwgdmFsdWUpO2Vsc2UgdGhyb3cgdmFsdWU7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnY29tcGxldGUnOlxuICAgICAgICAgIGNsb3NlU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbik7XG4gICAgICAgICAgaWYgKG0pIG0uY2FsbChvYnNlcnZlcik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaG9zdFJlcG9ydEVycm9yKGUpO1xuICAgIH1cblxuICAgIGlmIChzdWJzY3JpcHRpb24uX3N0YXRlID09PSAnY2xvc2VkJykgY2xlYW51cFN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pO2Vsc2UgaWYgKHN1YnNjcmlwdGlvbi5fc3RhdGUgPT09ICdydW5uaW5nJykgc3Vic2NyaXB0aW9uLl9zdGF0ZSA9ICdyZWFkeSc7XG4gIH1cblxuICBmdW5jdGlvbiBvbk5vdGlmeShzdWJzY3JpcHRpb24sIHR5cGUsIHZhbHVlKSB7XG4gICAgaWYgKHN1YnNjcmlwdGlvbi5fc3RhdGUgPT09ICdjbG9zZWQnKSByZXR1cm47XG5cbiAgICBpZiAoc3Vic2NyaXB0aW9uLl9zdGF0ZSA9PT0gJ2J1ZmZlcmluZycpIHtcbiAgICAgIHN1YnNjcmlwdGlvbi5fcXVldWUucHVzaCh7XG4gICAgICAgIHR5cGUsXG4gICAgICAgIHZhbHVlXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChzdWJzY3JpcHRpb24uX3N0YXRlICE9PSAncmVhZHknKSB7XG4gICAgICBzdWJzY3JpcHRpb24uX3N0YXRlID0gJ2J1ZmZlcmluZyc7XG4gICAgICBzdWJzY3JpcHRpb24uX3F1ZXVlID0gW3tcbiAgICAgICAgdHlwZSxcbiAgICAgICAgdmFsdWVcbiAgICAgIH1dO1xuICAgICAgZW5xdWV1ZSgoKSA9PiBmbHVzaFN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBub3RpZnlTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uLCB0eXBlLCB2YWx1ZSk7XG4gIH1cblxuICBjbGFzcyBTdWJzY3JpcHRpb24ge1xuICAgIGNvbnN0cnVjdG9yKG9ic2VydmVyLCBzdWJzY3JpYmVyKSB7XG4gICAgICAvLyBBU1NFUlQ6IG9ic2VydmVyIGlzIGFuIG9iamVjdFxuICAgICAgLy8gQVNTRVJUOiBzdWJzY3JpYmVyIGlzIGNhbGxhYmxlXG4gICAgICB0aGlzLl9jbGVhbnVwID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fb2JzZXJ2ZXIgPSBvYnNlcnZlcjtcbiAgICAgIHRoaXMuX3F1ZXVlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fc3RhdGUgPSAnaW5pdGlhbGl6aW5nJztcbiAgICAgIGxldCBzZWxmID0gdGhpcztcbiAgICAgIGxldCBzdWJzY3JpcHRpb25PYnNlcnZlciA9IHtcbiAgICAgICAgZ2V0IGNsb3NlZCgpIHtcbiAgICAgICAgICByZXR1cm4gc2VsZi5fc3RhdGUgPT09ICdjbG9zZWQnO1xuICAgICAgICB9LFxuXG4gICAgICAgIG5leHQodmFsdWUpIHtcbiAgICAgICAgICBvbk5vdGlmeShzZWxmLCAnbmV4dCcsIHZhbHVlKTtcbiAgICAgICAgfSxcblxuICAgICAgICBlcnJvcih2YWx1ZSkge1xuICAgICAgICAgIG9uTm90aWZ5KHNlbGYsICdlcnJvcicsIHZhbHVlKTtcbiAgICAgICAgfSxcblxuICAgICAgICBjb21wbGV0ZSgpIHtcbiAgICAgICAgICBvbk5vdGlmeShzZWxmLCAnY29tcGxldGUnKTtcbiAgICAgICAgfVxuXG4gICAgICB9O1xuXG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLl9jbGVhbnVwID0gc3Vic2NyaWJlci5jYWxsKHVuZGVmaW5lZCwgc3Vic2NyaXB0aW9uT2JzZXJ2ZXIpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBzdWJzY3JpcHRpb25PYnNlcnZlci5lcnJvcihlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX3N0YXRlID09PSAnaW5pdGlhbGl6aW5nJykgdGhpcy5fc3RhdGUgPSAncmVhZHknO1xuICAgIH1cblxuICAgIGdldCBjbG9zZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc3RhdGUgPT09ICdjbG9zZWQnO1xuICAgIH1cblxuICAgIHVuc3Vic2NyaWJlKCkge1xuICAgICAgaWYgKHRoaXMuX3N0YXRlICE9PSAnY2xvc2VkJykge1xuICAgICAgICBjbG9zZVN1YnNjcmlwdGlvbih0aGlzKTtcbiAgICAgICAgY2xlYW51cFN1YnNjcmlwdGlvbih0aGlzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgfVxuXG4gIGxldCBPYnNlcnZhYmxlJDEgPSBjbGFzcyBPYnNlcnZhYmxlIHtcbiAgICBjb25zdHJ1Y3RvcihzdWJzY3JpYmVyKSB7XG4gICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgT2JzZXJ2YWJsZSkpIHRocm93IG5ldyBUeXBlRXJyb3IoJ09ic2VydmFibGUgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uJyk7XG4gICAgICBpZiAodHlwZW9mIHN1YnNjcmliZXIgIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBUeXBlRXJyb3IoJ09ic2VydmFibGUgaW5pdGlhbGl6ZXIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgICB0aGlzLl9zdWJzY3JpYmVyID0gc3Vic2NyaWJlcjtcbiAgICB9XG5cbiAgICBzdWJzY3JpYmUob2JzZXJ2ZXIpIHtcbiAgICAgIGlmICh0eXBlb2Ygb2JzZXJ2ZXIgIT09ICdvYmplY3QnIHx8IG9ic2VydmVyID09PSBudWxsKSB7XG4gICAgICAgIG9ic2VydmVyID0ge1xuICAgICAgICAgIG5leHQ6IG9ic2VydmVyLFxuICAgICAgICAgIGVycm9yOiBhcmd1bWVudHNbMV0sXG4gICAgICAgICAgY29tcGxldGU6IGFyZ3VtZW50c1syXVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IFN1YnNjcmlwdGlvbihvYnNlcnZlciwgdGhpcy5fc3Vic2NyaWJlcik7XG4gICAgfVxuXG4gICAgZm9yRWFjaChmbikge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJlamVjdChuZXcgVHlwZUVycm9yKGZuICsgJyBpcyBub3QgYSBmdW5jdGlvbicpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBkb25lKCkge1xuICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzdWJzY3JpcHRpb24gPSB0aGlzLnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dCh2YWx1ZSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgZm4odmFsdWUsIGRvbmUpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBlcnJvcjogcmVqZWN0LFxuICAgICAgICAgIGNvbXBsZXRlOiByZXNvbHZlXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgbWFwKGZuKSB7XG4gICAgICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB0aHJvdyBuZXcgVHlwZUVycm9yKGZuICsgJyBpcyBub3QgYSBmdW5jdGlvbicpO1xuICAgICAgbGV0IEMgPSBnZXRTcGVjaWVzKHRoaXMpO1xuICAgICAgcmV0dXJuIG5ldyBDKG9ic2VydmVyID0+IHRoaXMuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dCh2YWx1ZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YWx1ZSA9IGZuKHZhbHVlKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JzZXJ2ZXIuZXJyb3IoZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgb2JzZXJ2ZXIubmV4dCh2YWx1ZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZXJyb3IoZSkge1xuICAgICAgICAgIG9ic2VydmVyLmVycm9yKGUpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGNvbXBsZXRlKCkge1xuICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIGZpbHRlcihmbikge1xuICAgICAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IFR5cGVFcnJvcihmbiArICcgaXMgbm90IGEgZnVuY3Rpb24nKTtcbiAgICAgIGxldCBDID0gZ2V0U3BlY2llcyh0aGlzKTtcbiAgICAgIHJldHVybiBuZXcgQyhvYnNlcnZlciA9PiB0aGlzLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQodmFsdWUpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCFmbih2YWx1ZSkpIHJldHVybjtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JzZXJ2ZXIuZXJyb3IoZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgb2JzZXJ2ZXIubmV4dCh2YWx1ZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZXJyb3IoZSkge1xuICAgICAgICAgIG9ic2VydmVyLmVycm9yKGUpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGNvbXBsZXRlKCkge1xuICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIHJlZHVjZShmbikge1xuICAgICAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IFR5cGVFcnJvcihmbiArICcgaXMgbm90IGEgZnVuY3Rpb24nKTtcbiAgICAgIGxldCBDID0gZ2V0U3BlY2llcyh0aGlzKTtcbiAgICAgIGxldCBoYXNTZWVkID0gYXJndW1lbnRzLmxlbmd0aCA+IDE7XG4gICAgICBsZXQgaGFzVmFsdWUgPSBmYWxzZTtcbiAgICAgIGxldCBzZWVkID0gYXJndW1lbnRzWzFdO1xuICAgICAgbGV0IGFjYyA9IHNlZWQ7XG4gICAgICByZXR1cm4gbmV3IEMob2JzZXJ2ZXIgPT4gdGhpcy5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0KHZhbHVlKSB7XG4gICAgICAgICAgbGV0IGZpcnN0ID0gIWhhc1ZhbHVlO1xuICAgICAgICAgIGhhc1ZhbHVlID0gdHJ1ZTtcblxuICAgICAgICAgIGlmICghZmlyc3QgfHwgaGFzU2VlZCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgYWNjID0gZm4oYWNjLCB2YWx1ZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBvYnNlcnZlci5lcnJvcihlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWNjID0gdmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIGVycm9yKGUpIHtcbiAgICAgICAgICBvYnNlcnZlci5lcnJvcihlKTtcbiAgICAgICAgfSxcblxuICAgICAgICBjb21wbGV0ZSgpIHtcbiAgICAgICAgICBpZiAoIWhhc1ZhbHVlICYmICFoYXNTZWVkKSByZXR1cm4gb2JzZXJ2ZXIuZXJyb3IobmV3IFR5cGVFcnJvcignQ2Fubm90IHJlZHVjZSBhbiBlbXB0eSBzZXF1ZW5jZScpKTtcbiAgICAgICAgICBvYnNlcnZlci5uZXh0KGFjYyk7XG4gICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgfVxuXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgYXN5bmMgYWxsKCkge1xuICAgICAgbGV0IHZhbHVlcyA9IFtdO1xuICAgICAgYXdhaXQgdGhpcy5mb3JFYWNoKHZhbHVlID0+IHZhbHVlcy5wdXNoKHZhbHVlKSk7XG4gICAgICByZXR1cm4gdmFsdWVzO1xuICAgIH1cblxuICAgIGNvbmNhdCguLi5zb3VyY2VzKSB7XG4gICAgICBsZXQgQyA9IGdldFNwZWNpZXModGhpcyk7XG4gICAgICByZXR1cm4gbmV3IEMob2JzZXJ2ZXIgPT4ge1xuICAgICAgICBsZXQgc3Vic2NyaXB0aW9uO1xuICAgICAgICBsZXQgaW5kZXggPSAwO1xuXG4gICAgICAgIGZ1bmN0aW9uIHN0YXJ0TmV4dChuZXh0KSB7XG4gICAgICAgICAgc3Vic2NyaXB0aW9uID0gbmV4dC5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgbmV4dCh2KSB7XG4gICAgICAgICAgICAgIG9ic2VydmVyLm5leHQodik7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBlcnJvcihlKSB7XG4gICAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKGUpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgY29tcGxldGUoKSB7XG4gICAgICAgICAgICAgIGlmIChpbmRleCA9PT0gc291cmNlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdGFydE5leHQoQy5mcm9tKHNvdXJjZXNbaW5kZXgrK10pKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBzdGFydE5leHQodGhpcyk7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgaWYgKHN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICBzdWJzY3JpcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZmxhdE1hcChmbikge1xuICAgICAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IFR5cGVFcnJvcihmbiArICcgaXMgbm90IGEgZnVuY3Rpb24nKTtcbiAgICAgIGxldCBDID0gZ2V0U3BlY2llcyh0aGlzKTtcbiAgICAgIHJldHVybiBuZXcgQyhvYnNlcnZlciA9PiB7XG4gICAgICAgIGxldCBzdWJzY3JpcHRpb25zID0gW107XG4gICAgICAgIGxldCBvdXRlciA9IHRoaXMuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0KHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoZm4pIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGZuKHZhbHVlKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvYnNlcnZlci5lcnJvcihlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgaW5uZXIgPSBDLmZyb20odmFsdWUpLnN1YnNjcmliZSh7XG4gICAgICAgICAgICAgIG5leHQodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KHZhbHVlKTtcbiAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICBlcnJvcihlKSB7XG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZSk7XG4gICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgY29tcGxldGUoKSB7XG4gICAgICAgICAgICAgICAgbGV0IGkgPSBzdWJzY3JpcHRpb25zLmluZGV4T2YoaW5uZXIpO1xuICAgICAgICAgICAgICAgIGlmIChpID49IDApIHN1YnNjcmlwdGlvbnMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgIGNvbXBsZXRlSWZEb25lKCk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzdWJzY3JpcHRpb25zLnB1c2goaW5uZXIpO1xuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBlcnJvcihlKSB7XG4gICAgICAgICAgICBvYnNlcnZlci5lcnJvcihlKTtcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgY29tcGxldGUoKSB7XG4gICAgICAgICAgICBjb21wbGV0ZUlmRG9uZSgpO1xuICAgICAgICAgIH1cblxuICAgICAgICB9KTtcblxuICAgICAgICBmdW5jdGlvbiBjb21wbGV0ZUlmRG9uZSgpIHtcbiAgICAgICAgICBpZiAob3V0ZXIuY2xvc2VkICYmIHN1YnNjcmlwdGlvbnMubGVuZ3RoID09PSAwKSBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICBzdWJzY3JpcHRpb25zLmZvckVhY2gocyA9PiBzLnVuc3Vic2NyaWJlKCkpO1xuICAgICAgICAgIG91dGVyLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBbU3ltYm9sT2JzZXJ2YWJsZV0oKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBzdGF0aWMgZnJvbSh4KSB7XG4gICAgICBsZXQgQyA9IHR5cGVvZiB0aGlzID09PSAnZnVuY3Rpb24nID8gdGhpcyA6IE9ic2VydmFibGU7XG4gICAgICBpZiAoeCA9PSBudWxsKSB0aHJvdyBuZXcgVHlwZUVycm9yKHggKyAnIGlzIG5vdCBhbiBvYmplY3QnKTtcbiAgICAgIGxldCBtZXRob2QgPSBnZXRNZXRob2QoeCwgU3ltYm9sT2JzZXJ2YWJsZSk7XG5cbiAgICAgIGlmIChtZXRob2QpIHtcbiAgICAgICAgbGV0IG9ic2VydmFibGUgPSBtZXRob2QuY2FsbCh4KTtcbiAgICAgICAgaWYgKE9iamVjdChvYnNlcnZhYmxlKSAhPT0gb2JzZXJ2YWJsZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihvYnNlcnZhYmxlICsgJyBpcyBub3QgYW4gb2JqZWN0Jyk7XG4gICAgICAgIGlmIChpc09ic2VydmFibGUob2JzZXJ2YWJsZSkgJiYgb2JzZXJ2YWJsZS5jb25zdHJ1Y3RvciA9PT0gQykgcmV0dXJuIG9ic2VydmFibGU7XG4gICAgICAgIHJldHVybiBuZXcgQyhvYnNlcnZlciA9PiBvYnNlcnZhYmxlLnN1YnNjcmliZShvYnNlcnZlcikpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaGFzU3ltYm9sKCdpdGVyYXRvcicpKSB7XG4gICAgICAgIG1ldGhvZCA9IGdldE1ldGhvZCh4LCBTeW1ib2xJdGVyYXRvcik7XG5cbiAgICAgICAgaWYgKG1ldGhvZCkge1xuICAgICAgICAgIHJldHVybiBuZXcgQyhvYnNlcnZlciA9PiB7XG4gICAgICAgICAgICBlbnF1ZXVlKCgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKG9ic2VydmVyLmNsb3NlZCkgcmV0dXJuO1xuXG4gICAgICAgICAgICAgIGZvciAobGV0IGl0ZW0gb2YgbWV0aG9kLmNhbGwoeCkpIHtcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KGl0ZW0pO1xuICAgICAgICAgICAgICAgIGlmIChvYnNlcnZlci5jbG9zZWQpIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh4KSkge1xuICAgICAgICByZXR1cm4gbmV3IEMob2JzZXJ2ZXIgPT4ge1xuICAgICAgICAgIGVucXVldWUoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKG9ic2VydmVyLmNsb3NlZCkgcmV0dXJuO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHgubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCh4W2ldKTtcbiAgICAgICAgICAgICAgaWYgKG9ic2VydmVyLmNsb3NlZCkgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcih4ICsgJyBpcyBub3Qgb2JzZXJ2YWJsZScpO1xuICAgIH1cblxuICAgIHN0YXRpYyBvZiguLi5pdGVtcykge1xuICAgICAgbGV0IEMgPSB0eXBlb2YgdGhpcyA9PT0gJ2Z1bmN0aW9uJyA/IHRoaXMgOiBPYnNlcnZhYmxlO1xuICAgICAgcmV0dXJuIG5ldyBDKG9ic2VydmVyID0+IHtcbiAgICAgICAgZW5xdWV1ZSgoKSA9PiB7XG4gICAgICAgICAgaWYgKG9ic2VydmVyLmNsb3NlZCkgcmV0dXJuO1xuXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChpdGVtc1tpXSk7XG4gICAgICAgICAgICBpZiAob2JzZXJ2ZXIuY2xvc2VkKSByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0IFtTeW1ib2xTcGVjaWVzXSgpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICB9O1xuXG4gIE9ic2VydmFibGUkMi5PYnNlcnZhYmxlID0gT2JzZXJ2YWJsZSQxO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoT2JzZXJ2YWJsZSQxLCBTeW1ib2woJ2V4dGVuc2lvbnMnKSwge1xuICAgIHZhbHVlOiB7XG4gICAgICBzeW1ib2w6IFN5bWJvbE9ic2VydmFibGUsXG4gICAgICBob3N0UmVwb3J0RXJyb3JcbiAgICB9LFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcblxuICB2YXIgemVuT2JzZXJ2YWJsZSA9IE9ic2VydmFibGUkMi5PYnNlcnZhYmxlO1xuXG4gIGNvbnN0IE9ic2VydmFibGUgPSAvKkBfX1BVUkVfXyovZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMoemVuT2JzZXJ2YWJsZSk7XG5cbiAgY29uc3QgeyBsb2dfXywgZXJyX18gfSA9IGNyZWF0ZU9qc0Zsb3dMb2dnZXJzKFwiaW5pdC1mbG93c1wiKTtcbiAgY29uc3QgZ2V0T2pzSW5pdFJlc3VsdHNEZWJ1Z09iamVjdCA9ICgpID0+IHtcbiAgICBpZiAoIShcIm9qc19pbml0X3Jlc3VsdHNcIiBpbiB3aW5kb3cpKSB7XG4gICAgICB3aW5kb3dbXCJvanNfaW5pdF9yZXN1bHRzXCJdID0ge307XG4gICAgfVxuICAgIHJldHVybiB3aW5kb3dbXCJvanNfaW5pdF9yZXN1bHRzXCJdO1xuICB9O1xuICBjb25zdCBpbml0aWFsaXplT2pzRmxvd3MgPSAoY29udGV4dCwgZmxvd0NhbGxiYWNrcykgPT4ge1xuICAgIGNvbnN0IGluaXRQYXJhbXMgPSB7IGNvbnRleHQsIGZsb3dDYWxsYmFja3MgfTtcbiAgICBjb25zb2xlLmxvZyhcIltPSlNdIGluaXRpYWxpemluZyBPSlMgZmxvd3MuLi5cIik7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIFN0cmlwZSBQUlxuICAgICAgc3RyaXBlUFI6IHJ1bkluaXRGbG93QXNPYnNlcnZhYmxlKFwic3RyaXBlUFJcIiwgT2pzRmxvd3Muc3RyaXBlUFIuaW5pdChpbml0UGFyYW1zKSksXG4gICAgICAvLyBTdHJpcGUgTGlua1xuICAgICAgc3RyaXBlTGluazogcnVuSW5pdEZsb3dBc09ic2VydmFibGUoXCJzdHJpcGVMaW5rXCIsIE9qc0Zsb3dzLnN0cmlwZUxpbmsuaW5pdChpbml0UGFyYW1zKSlcbiAgICAgIC8vIPCfkYkgQWRkIGluaXRpYWxpemF0aW9uIGZsb3dzIGhlcmVcbiAgICB9O1xuICB9O1xuICBjb25zdCBydW5Jbml0Rmxvd0FzT2JzZXJ2YWJsZSA9IChmbG93TmFtZSwgaW5pdEZsb3cpID0+IHtcbiAgICBjb25zdCBvYnNlcnZhYmxlID0gbmV3IE9ic2VydmFibGUoKG9ic2VydmVyKSA9PiB7XG4gICAgICBvYnNlcnZlci5uZXh0KHsgc3RhdHVzOiBcImxvYWRpbmdcIiB9KTtcbiAgICAgIGluaXRGbG93LnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICBvYnNlcnZlci5uZXh0KHsgc3RhdHVzOiBcImxvYWRlZFwiLCByZXN1bHQgfSk7XG4gICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgb2JzZXJ2ZXIubmV4dCh7IHN0YXR1czogXCJlcnJvclwiLCBtZXNzYWdlOiBlcnJvci5tZXNzYWdlIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgb2JzZXJ2YWJsZS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlc3VsdCkgPT4ge1xuICAgICAgICBsb2dfXyhgJHtmbG93TmFtZX0gZmxvdyByZXN1bHRgLCByZXN1bHQpO1xuICAgICAgICBnZXRPanNJbml0UmVzdWx0c0RlYnVnT2JqZWN0KClbZmxvd05hbWVdID0gcmVzdWx0O1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgZXJyX18oYCR7Zmxvd05hbWV9IGZsb3cgaW5pdGlhbGl6YXRpb24gZXJyb3I6XG4ke0pTT04uc3RyaW5naWZ5KGVycm9yKX1gKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG9ic2VydmFibGU7XG4gIH07XG5cbiAgY29uc3QgUFJfTE9BRElORyA9IHtcbiAgICBpc0xvYWRpbmc6IHRydWUsXG4gICAgaXNBdmFpbGFibGU6IGZhbHNlLFxuICAgIHN0YXJ0RmxvdzogYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgc3RhcnRGbG93IHRyaWdnZXJlZCB3aGlsZSBwYXltZW50IHJlcXVlc3QgaXMgc3RpbGwgbm90IHJlYWR5LiBcbiAgICAgIFlvdSBjYW4gY2hlY2sgdGhlIFwiLmlzTG9hZGluZ1wiIHBhcmFtIHRvIGtub3cgd2hlbiBhIHBheW1lbnQgcmVxdWVzdCBpcyBzdGlsbCBsb2FkaW5nLCBcbiAgICAgIGFuZCBcIi5pc0F2YWlsYWJsZVwiIHRvIGtub3cgaWYgYSBwYXltZW50IHJlcXVlc3QgaXMgYXZhaWxhYmxlLmBcbiAgICAgICk7XG4gICAgfVxuICB9O1xuICBjb25zdCBQUl9FUlJPUiA9IHtcbiAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgIGlzQXZhaWxhYmxlOiBmYWxzZSxcbiAgICBzdGFydEZsb3c6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYHN0YXJ0RmxvdyB0cmlnZ2VyZWQgd2hlbiBwYXltZW50IHJlcXVlc3QgaXMgbm90IGF2YWlsYWJsZS5gKTtcbiAgICB9XG4gIH07XG5cbiAgY2xhc3MgT3BlblBheUZvcm1FdmVudEhhbmRsZXIge1xuICAgIGNvbnN0cnVjdG9yKGZvcm1JbnN0YW5jZSkge1xuICAgICAgdGhpcy5mb3JtSW5zdGFuY2UgPSBmb3JtSW5zdGFuY2U7XG4gICAgICB0aGlzLmNvbmZpZyA9IGZvcm1JbnN0YW5jZS5jb25maWc7XG4gICAgICB0aGlzLmZvcm1JZCA9IGZvcm1JbnN0YW5jZS5mb3JtSWQ7XG4gICAgICB0aGlzLmV2ZW50VGFyZ2V0cyA9IHt9O1xuICAgICAgdGhpcy5ub25jZXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICAgIH1cbiAgICBoYW5kbGVNZXNzYWdlKGV2ZW50KSB7XG4gICAgICBpZiAoIWV2ZW50LnNvdXJjZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHNvdXJjZSBmb3VuZGApO1xuICAgICAgfVxuICAgICAgaWYgKGV2ZW50Lm9yaWdpbiAhPT0gdGhpcy5mb3JtSW5zdGFuY2UuY29uZmlnLl9mcmFtZVVybD8ub3JpZ2luKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgZXZlbnQuZGF0YSA9PT0gXCJvYmplY3RcIiAmJiBldmVudC5kYXRhW1wicGVucGFsXCJdKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IHBhcnNlRXZlbnRQYXlsb2FkKEpTT04ucGFyc2UoZXZlbnQuZGF0YSkpO1xuICAgICAgY29uc3QgaXNWYWxpZCA9IHRoaXMudmFsaWRhdGVFdmVudChldmVudERhdGEpO1xuICAgICAgaWYgKCFpc1ZhbGlkKSByZXR1cm47XG4gICAgICBjb25zdCB7IGVsZW1lbnRJZCwgcGF5bG9hZCB9ID0gZXZlbnREYXRhO1xuICAgICAgY29uc3QgZXZlbnRUeXBlID0gcGF5bG9hZC50eXBlO1xuICAgICAgc3dpdGNoIChldmVudFR5cGUpIHtcbiAgICAgICAgY2FzZSBcIkxBWU9VVFwiOlxuICAgICAgICAgIHRoaXMuaGFuZGxlTGF5b3V0RXZlbnQocGF5bG9hZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJGT0NVU1wiOlxuICAgICAgICAgIHRoaXMuaGFuZGxlRm9jdXNFdmVudChlbGVtZW50SWQsIHBheWxvYWQuZWxlbWVudFR5cGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiQkxVUlwiOlxuICAgICAgICAgIHRoaXMuaGFuZGxlQmx1ckV2ZW50KGVsZW1lbnRJZCwgcGF5bG9hZC5lbGVtZW50VHlwZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJDSEFOR0VcIjpcbiAgICAgICAgICB0aGlzLmhhbmRsZUNoYW5nZUV2ZW50KGVsZW1lbnRJZCwgcGF5bG9hZC5lbGVtZW50VHlwZSwgcGF5bG9hZC5lcnJvcnMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiTE9BREVEXCI6XG4gICAgICAgICAgdGhpcy5oYW5kbGVMb2FkZWRFdmVudChldmVudC5zb3VyY2UsIGVsZW1lbnRJZCwgcGF5bG9hZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJMT0FEX0VSUk9SXCI6XG4gICAgICAgICAgdGhpcy5oYW5kbGVMb2FkRXJyb3JFdmVudChwYXlsb2FkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIlZBTElEQVRJT05fRVJST1JcIjpcbiAgICAgICAgICB0aGlzLmhhbmRsZVZhbGlkYXRpb25FcnJvckV2ZW50KHBheWxvYWQsIGVsZW1lbnRJZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgY29uc29sZS53YXJuKFwiW2Zvcm1dIFVuaGFuZGxlZCBldmVudCB0eXBlOlwiLCBldmVudFR5cGUpO1xuICAgICAgfVxuICAgIH1cbiAgICB2YWxpZGF0ZUV2ZW50KGV2ZW50RGF0YSkge1xuICAgICAgaWYgKGV2ZW50RGF0YS5mb3JtSWQgIT09IHRoaXMuZm9ybUluc3RhbmNlLmZvcm1JZCB8fCAhZXZlbnREYXRhLmVsZW1lbnRJZCkge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJbZm9ybV0gSWdub3JpbmcgdW5rbm93biBldmVudDpcIiwgZXZlbnREYXRhKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMubm9uY2VzLmhhcyhldmVudERhdGEubm9uY2UpKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcIltmb3JtXSBJZ25vcmluZyBkdXBsaWNhdGUgZXZlbnQ6XCIsIGV2ZW50RGF0YSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHRoaXMubm9uY2VzLmFkZChldmVudERhdGEubm9uY2UpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGhhbmRsZUxheW91dEV2ZW50KHBheWxvYWQpIHtcbiAgICAgIGNvbnN0IGhlaWdodCA9IHBheWxvYWQuaGVpZ2h0ID8gYCR7cGF5bG9hZC5oZWlnaHR9cHhgIDogXCIxMDAlXCI7XG4gICAgICB0aGlzLmZvcm1JbnN0YW5jZS5zZXRGb3JtSGVpZ2h0KGhlaWdodCk7XG4gICAgfVxuICAgIGhhbmRsZUZvY3VzRXZlbnQoZWxlbWVudElkLCBmaWVsZCkge1xuICAgICAgaWYgKHRoaXMuY29uZmlnLm9uRm9jdXMpIHRoaXMuY29uZmlnLm9uRm9jdXMoZWxlbWVudElkLCBmaWVsZCk7XG4gICAgfVxuICAgIGhhbmRsZUJsdXJFdmVudChlbGVtZW50SWQsIGZpZWxkKSB7XG4gICAgICBpZiAodGhpcy5jb25maWcub25CbHVyKSB0aGlzLmNvbmZpZy5vbkJsdXIoZWxlbWVudElkLCBmaWVsZCk7XG4gICAgfVxuICAgIGhhbmRsZUNoYW5nZUV2ZW50KGVsZW1lbnRJZCwgZmllbGQsIGVycm9ycykge1xuICAgICAgaWYgKHRoaXMuY29uZmlnLm9uQ2hhbmdlKSB0aGlzLmNvbmZpZy5vbkNoYW5nZShlbGVtZW50SWQsIGZpZWxkLCBlcnJvcnMpO1xuICAgIH1cbiAgICBhc3luYyBoYW5kbGVMb2FkZWRFdmVudChzb3VyY2UsIGVsZW1lbnRJZCwgcGF5bG9hZCkge1xuICAgICAgY29uc29sZS5sb2coXCJoYW5kbGVMb2FkZWRFdmVudCBpcyBkZXByZWNhdGVkOlwiLCBzb3VyY2UsIGVsZW1lbnRJZCwgcGF5bG9hZCk7XG4gICAgICB0aGlzLmV2ZW50VGFyZ2V0c1tlbGVtZW50SWRdID0gc291cmNlO1xuICAgICAgdGhpcy5mb3JtSW5zdGFuY2Uub25DZGVMb2FkZWQocGF5bG9hZCk7XG4gICAgICBpZiAodGhpcy5jb25maWcub25Mb2FkKSB7XG4gICAgICAgIHRoaXMuY29uZmlnLm9uTG9hZChwYXlsb2FkLnRvdGFsQW1vdW50QXRvbXMsIHBheWxvYWQuY3VycmVuY3kpO1xuICAgICAgfVxuICAgIH1cbiAgICBoYW5kbGVMb2FkRXJyb3JFdmVudChwYXlsb2FkKSB7XG4gICAgICBpZiAodGhpcy5mb3JtSW5zdGFuY2UuY29uZmlnLm9uTG9hZEVycm9yKSB0aGlzLmZvcm1JbnN0YW5jZS5jb25maWcub25Mb2FkRXJyb3IocGF5bG9hZC5tZXNzYWdlKTtcbiAgICB9XG4gICAgaGFuZGxlVmFsaWRhdGlvbkVycm9yRXZlbnQocGF5bG9hZCwgZWxlbWVudElkKSB7XG4gICAgICBpZiAodGhpcy5mb3JtSW5zdGFuY2UuY29uZmlnLm9uVmFsaWRhdGlvbkVycm9yKSB7XG4gICAgICAgIHRoaXMuZm9ybUluc3RhbmNlLmNvbmZpZy5vblZhbGlkYXRpb25FcnJvcihwYXlsb2FkLmVsZW1lbnRUeXBlLCBwYXlsb2FkLmVycm9ycywgZWxlbWVudElkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gYXN5bmMgaGFuZGxlRXJyb3JFdmVudChwYXlsb2FkOiBFcnJvckV2ZW50UGF5bG9hZCkge1xuICAgIC8vICAgaWYgKHBheWxvYWQubWVzc2FnZSA9PT0gJzNEU19SRVFVSVJFRCcpIHtcbiAgICAvLyAgICAgY29uc3QgdGhyZWVEU1VybCA9IHBheWxvYWQuaGVhZGVycz8uWyd4LTNkcy1hdXRoLXVybCddID8/IFNJTVVMQVRFXzNEU19VUkw7XG4gICAgLy8gICAgIC8vIFRoaXMgd2lsbCBvcGVuIGEgcG9wdXAgYW5kIHByb2Nlc3MgdGhlIDNEUyBmbG93XG4gICAgLy8gICAgIC8vIHdpbGwgcmV0dXJuIGEgc3RhdHVzIGBzdWNjZXNzYCB8IGBmYWlsdXJlYCB8IGBjYW5jZWxsZWRgIHdoaWNoIHdlIGNhbiBjb250aW51ZSB3aXRoXG4gICAgLy8gICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IHN0YXJ0M2RzVmVyaWZpY2F0aW9uKHsgdXJsOiB0aHJlZURTVXJsLCBiYXNlVXJsOiB0aGlzLmNvbmZpZy5iYXNlVXJsISB9KTtcbiAgICAvLyAgICAgY29uc29sZS5sb2coJ/CflJAgM0RTIHN0YXR1czonLCBzdGF0dXMpO1xuICAgIC8vICAgICAvLyBUT0RPOiBjb250aW51ZSB3aXRoIHN0YXR1c1xuICAgIC8vICAgICBjb25zdCBjYXJkQ3BtID0gdGhpcy5mb3JtSW5zdGFuY2UuY2hlY2tvdXRQYXltZW50TWV0aG9kcz8uZmluZCgoY3BtKSA9PiBjcG0ucHJvdmlkZXIgPT09ICdjcmVkaXRfY2FyZCcpO1xuICAgIC8vICAgICBpZiAoIXRoaXMuZm9ybUluc3RhbmNlLnNlc3Npb25JZCB8fCAhdGhpcy5mb3JtSW5zdGFuY2UuZm9ybVRhcmdldCB8fCAhdGhpcy5jb25maWcub25WYWxpZGF0aW9uRXJyb3IgfHwgIWNhcmRDcG0pXG4gICAgLy8gICAgICAgcmV0dXJuO1xuICAgIC8vICAgICBmb3IgKGNvbnN0IFtlbGVtZW50SWQsIHRhcmdldF0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5ldmVudFRhcmdldHMpKSB7XG4gICAgLy8gICAgICAgaWYgKCF0YXJnZXQpIGNvbnRpbnVlO1xuICAgIC8vICAgICAgIGNvbnN0IHN0YXJ0UGF5bWVudEZsb3dFdmVudCA9IGNvbnN0cnVjdFN1Ym1pdEV2ZW50UGF5bG9hZChcbiAgICAvLyAgICAgICAgIEV2ZW50VHlwZS5lbnVtLlNUQVJUX1BBWU1FTlRfRkxPVyxcbiAgICAvLyAgICAgICAgIHRoaXMuZm9ybUluc3RhbmNlLnNlc3Npb25JZCxcbiAgICAvLyAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy5mb3JtSW5zdGFuY2UuZm9ybVRhcmdldCkgPz8gZG9jdW1lbnQuYm9keSxcbiAgICAvLyAgICAgICAgIHRoaXMuY29uZmlnLm9uVmFsaWRhdGlvbkVycm9yLFxuICAgIC8vICAgICAgICAgeyAuLi5jYXJkQ3BtLCBwcm9jZXNzb3JfbmFtZTogJ3N0cmlwZScgfSxcbiAgICAvLyAgICAgICAgIGZhbHNlXG4gICAgLy8gICAgICAgKTtcbiAgICAvLyAgICAgICBpZiAoIXN0YXJ0UGF5bWVudEZsb3dFdmVudCkgY29udGludWU7XG4gICAgLy8gICAgICAgdGhpcy5mb3JtSW5zdGFuY2UuY2hlY2tvdXRGaXJlZCA9IHRydWU7XG4gICAgLy8gICAgICAgdGhpcy50b2tlbml6ZWREYXRhID0gc3RhcnRQYXltZW50Rmxvd0V2ZW50O1xuICAgIC8vICAgICAgIHRoaXMucG9zdEV2ZW50VG9GcmFtZSh0YXJnZXQsIGVsZW1lbnRJZCwgc3RhcnRQYXltZW50Rmxvd0V2ZW50KTtcbiAgICAvLyAgICAgICBicmVhaztcbiAgICAvLyAgICAgfVxuICAgIC8vICAgfSBlbHNlIHtcbiAgICAvLyAgICAgdGhpcy5mb3JtSW5zdGFuY2UuY2hlY2tvdXRGaXJlZCA9IGZhbHNlO1xuICAgIC8vICAgICBpZiAodGhpcy5mb3JtSW5zdGFuY2UuY29uZmlnLm9uQ2hlY2tvdXRFcnJvcikgdGhpcy5mb3JtSW5zdGFuY2UuY29uZmlnLm9uQ2hlY2tvdXRFcnJvcihwYXlsb2FkLm1lc3NhZ2UpO1xuICAgIC8vICAgfVxuICAgIC8vIH1cbiAgICAvLyBoYW5kbGVGb3JtU3VibWl0KCkge1xuICAgIC8vICAgaWYgKFxuICAgIC8vICAgICAhdGhpcy5mb3JtSW5zdGFuY2Uuc2Vzc2lvbklkIHx8XG4gICAgLy8gICAgICF0aGlzLmZvcm1JbnN0YW5jZS5jaGVja291dFBheW1lbnRNZXRob2RzPy5sZW5ndGggfHxcbiAgICAvLyAgICAgIXRoaXMuY29uZmlnLm9uVmFsaWRhdGlvbkVycm9yXG4gICAgLy8gICApIHtcbiAgICAvLyAgICAgcmV0dXJuO1xuICAgIC8vICAgfVxuICAgIC8vICAgY29uc3QgY2FyZENwbSA9IHRoaXMuZm9ybUluc3RhbmNlLmNoZWNrb3V0UGF5bWVudE1ldGhvZHMuZmluZCgoY3BtKSA9PiBjcG0ucHJvdmlkZXIgPT09ICdjcmVkaXRfY2FyZCcpO1xuICAgIC8vICAgaWYgKCFjYXJkQ3BtKSB7XG4gICAgLy8gICAgIHRocm93IG5ldyBFcnJvcignQ2FyZCBub3QgYXZhaWxhYmxlIGFzIGEgcGF5bWVudCBtZXRob2QgaW4gY2hlY2tvdXQnKTtcbiAgICAvLyAgIH1cbiAgICAvLyAgIGNvbnN0IHRva2VuaXplRGF0YSA9IGNvbnN0cnVjdFN1Ym1pdEV2ZW50UGF5bG9hZChcbiAgICAvLyAgICAgRXZlbnRUeXBlLmVudW0uVE9LRU5JWkUsXG4gICAgLy8gICAgIHRoaXMuZm9ybUluc3RhbmNlLnNlc3Npb25JZCEsXG4gICAgLy8gICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy5mb3JtSW5zdGFuY2UuZm9ybVRhcmdldCkgPz8gZG9jdW1lbnQuYm9keSxcbiAgICAvLyAgICAgdGhpcy5jb25maWcub25WYWxpZGF0aW9uRXJyb3IsXG4gICAgLy8gICAgIGNhcmRDcG0sXG4gICAgLy8gICAgIGZhbHNlXG4gICAgLy8gICApO1xuICAgIC8vICAgaWYgKCF0b2tlbml6ZURhdGEpIHtcbiAgICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKCdFcnJvciBjb25zdHJ1Y3RpbmcgdG9rZW5pemUgZGF0YScpO1xuICAgIC8vICAgfVxuICAgIC8vICAgZm9yIChjb25zdCBbZWxlbWVudElkLCB0YXJnZXRdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuZXZlbnRUYXJnZXRzKSkge1xuICAgIC8vICAgICBpZiAoIXRhcmdldCkgY29udGludWU7XG4gICAgLy8gICAgIHRoaXMucG9zdEV2ZW50VG9GcmFtZSh0YXJnZXQsIGVsZW1lbnRJZCwgdG9rZW5pemVEYXRhKTtcbiAgICAvLyAgIH1cbiAgICAvLyAgIHRoaXMudG9rZW5pemVkRGF0YSA9IHRva2VuaXplRGF0YTtcbiAgICAvLyB9XG4gICAgLy8gYXN5bmMgb25Vc2VyQ29tcGxldGVQYXltZW50UmVxdWVzdFVJKFxuICAgIC8vICAgc3RyaXBlUG06IFBheW1lbnRSZXF1ZXN0UGF5bWVudE1ldGhvZEV2ZW50LFxuICAgIC8vICAgY2hlY2tvdXRQYXltZW50TWV0aG9kOiBDaGVja291dFBheW1lbnRNZXRob2RcbiAgICAvLyApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyAgIGlmICghdGhpcy5jb25maWcub25WYWxpZGF0aW9uRXJyb3IgfHwgIXRoaXMuZm9ybUluc3RhbmNlLnNlc3Npb25JZCB8fCAhdGhpcy5mb3JtSW5zdGFuY2UuY2hlY2tvdXRQYXltZW50TWV0aG9kcylcbiAgICAvLyAgICAgcmV0dXJuO1xuICAgIC8vICAgZm9yIChjb25zdCBbZWxlbWVudElkLCBlbGVtZW50XSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmV2ZW50VGFyZ2V0cyA/PyB7fSkpIHtcbiAgICAvLyAgICAgY29uc3QgcGF5bWVudEZsb3dNZXRhZGF0YSA9IHsgc3RyaXBlUG1JZDogc3RyaXBlUG0ucGF5bWVudE1ldGhvZC5pZCB9O1xuICAgIC8vICAgICBjb25zdCBzdGFydFBheW1lbnRGbG93RXZlbnQgPSBjb25zdHJ1Y3RTdWJtaXRFdmVudFBheWxvYWQoXG4gICAgLy8gICAgICAgRXZlbnRUeXBlLmVudW0uU1RBUlRfUEFZTUVOVF9GTE9XLFxuICAgIC8vICAgICAgIHRoaXMuZm9ybUluc3RhbmNlLnNlc3Npb25JZCxcbiAgICAvLyAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMuZm9ybUluc3RhbmNlLmZvcm1UYXJnZXQpID8/IGRvY3VtZW50LmJvZHksXG4gICAgLy8gICAgICAgdGhpcy5jb25maWcub25WYWxpZGF0aW9uRXJyb3IsXG4gICAgLy8gICAgICAgY2hlY2tvdXRQYXltZW50TWV0aG9kLFxuICAgIC8vICAgICAgIGZhbHNlLFxuICAgIC8vICAgICAgIHBheW1lbnRGbG93TWV0YWRhdGFcbiAgICAvLyAgICAgKTtcbiAgICAvLyAgICAgaWYgKCFzdGFydFBheW1lbnRGbG93RXZlbnQpIGNvbnRpbnVlO1xuICAgIC8vICAgICB0aGlzLnN0cmlwZVBtID0gc3RyaXBlUG07XG4gICAgLy8gICAgIHRoaXMuZm9ybUluc3RhbmNlLmNoZWNrb3V0RmlyZWQgPSB0cnVlO1xuICAgIC8vICAgICB0aGlzLnNldFRva2VuaXplZERhdGEoc3RhcnRQYXltZW50Rmxvd0V2ZW50KTtcbiAgICAvLyAgICAgdGhpcy5wb3N0RXZlbnRUb0ZyYW1lKGVsZW1lbnQsIGVsZW1lbnRJZCwgc3RhcnRQYXltZW50Rmxvd0V2ZW50KTtcbiAgICAvLyAgICAgLy8gZW1pdEV2ZW50KGVsZW1lbnQubm9kZS5jb250ZW50V2luZG93ISwgdGhpcy5mb3JtSWQsIGVsZW1lbnRJZCwgc3RhcnRQYXltZW50Rmxvd0V2ZW50LCB0aGlzLmNvbmZpZy5iYXNlVXJsISk7XG4gICAgLy8gICAgIGJyZWFrO1xuICAgIC8vICAgfVxuICAgIC8vIH1cbiAgICBwb3N0RXZlbnRUb0ZyYW1lKHNvdXJjZSwgZWxlbWVudElkLCBkYXRhKSB7XG4gICAgICBlbWl0RXZlbnQoc291cmNlLCB0aGlzLmZvcm1JZCwgZWxlbWVudElkLCBkYXRhLCB0aGlzLmNvbmZpZy5iYXNlVXJsKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBjcmVhdGVDb25uZWN0aW9uKGlmcmFtZSwgY2hpbGRPcmlnaW4pIHtcbiAgICBjb25zdCBjb25uZWN0aW9uID0gcGVucGFsLmNvbm5lY3RUb0NoaWxkKHtcbiAgICAgIGlmcmFtZSxcbiAgICAgIGRlYnVnOiBmYWxzZSxcbiAgICAgIGNoaWxkT3JpZ2luXG4gICAgfSk7XG4gICAgY29uc3QgY29ubmVjdGlvbk9iaiA9IGF3YWl0IGNvbm5lY3Rpb24ucHJvbWlzZTtcbiAgICBjb25zdCBpc1ZhbGlkT2JqZWN0ID0gYXdhaXQgY2hlY2tJZlZhbGlkQ2RlQ29ubmVjdGlvbk9iamVjdChjb25uZWN0aW9uT2JqKTtcbiAgICBpZiAoIWlzUmVzdWx0VmFsaWQoY29ubmVjdGlvbk9iaiwgaXNWYWxpZE9iamVjdCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgR290IGludmFsaWQgQ0RFIGNvbm5lY3Rpb24gb2JqZWN0YCk7XG4gICAgfVxuICAgIHJldHVybiBjb25uZWN0aW9uT2JqO1xuICB9XG4gIGNsYXNzIENvbm5lY3Rpb25NYW5hZ2VyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgIHRoaXMuY29ubmVjdGlvbnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICAgIH1cbiAgICBhZGRDb25uZWN0aW9uKGlkLCBjb25uZWN0aW9uKSB7XG4gICAgICB0aGlzLmNvbm5lY3Rpb25zLnNldChpZCwgY29ubmVjdGlvbik7XG4gICAgfVxuICAgIGdldENvbm5lY3Rpb24oKSB7XG4gICAgICBjb25zdCBjb25uZWN0aW9uID0gdGhpcy5jb25uZWN0aW9ucy52YWx1ZXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICBpZiAoIWNvbm5lY3Rpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29ubmVjdGlvbiBub3QgZm91bmRcIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29ubmVjdGlvbjtcbiAgICB9XG4gICAgZ2V0QWxsQ29ubmVjdGlvbnMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9ucztcbiAgICB9XG4gIH1cblxuICBjbGFzcyBPcGVuUGF5Rm9ybSB7XG4gICAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgICB0aGlzLnRyeUluaXRPanNGbG93cyA9ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMub2pzRmxvd3NJbml0aWFsaXphdGlvbiAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuY2RlTG9hZGVkUGF5bG9hZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uTWFuYWdlci5nZXRBbGxDb25uZWN0aW9ucygpLnNpemUgPT09IDApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vanNGbG93c0luaXRpYWxpemF0aW9uID0gaW5pdGlhbGl6ZU9qc0Zsb3dzKHRoaXMuY3JlYXRlT2pzRmxvd0NvbnRleHQoKSwgdGhpcy5jcmVhdGVPanNGbG93Q2FsbGJhY2tzKCkpO1xuICAgICAgICB0aGlzLm9qc0Zsb3dzSW5pdGlhbGl6YXRpb24uc3RyaXBlUFIuc3Vic2NyaWJlKChzdGF0dXMpID0+IHRoaXMub25TdHJpcGVQUlN0YXR1c0NoYW5nZShzdGF0dXMpKTtcbiAgICAgIH07XG4gICAgICB0aGlzLm9uQ2RlTG9hZGVkID0gKHBheWxvYWQpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY2RlTG9hZGVkUGF5bG9hZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNkZUxvYWRlZFBheWxvYWQgPSBwYXlsb2FkO1xuICAgICAgICB0aGlzLnRyeUluaXRPanNGbG93cygpO1xuICAgICAgfTtcbiAgICAgIHRoaXMub25TdHJpcGVQUlN0YXR1c0NoYW5nZSA9IChpbml0U3RhdHVzKSA9PiB7XG4gICAgICAgIGlmIChpbml0U3RhdHVzLnN0YXR1cyA9PT0gXCJsb2FkaW5nXCIpIHtcbiAgICAgICAgICB0aGlzLmNvbmZpZy5vblBheW1lbnRSZXF1ZXN0TG9hZD8uKHsgYXBwbGVfcGF5OiBQUl9MT0FESU5HLCBnb29nbGVfcGF5OiBQUl9MT0FESU5HIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKGluaXRTdGF0dXMuc3RhdHVzID09PSBcImVycm9yXCIpIHtcbiAgICAgICAgICB0aGlzLmNvbmZpZy5vblBheW1lbnRSZXF1ZXN0TG9hZD8uKHsgYXBwbGVfcGF5OiBQUl9FUlJPUiwgZ29vZ2xlX3BheTogUFJfRVJST1IgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaW5pdFN0YXR1cy5zdGF0dXMgPT09IFwibG9hZGVkXCIpIHtcbiAgICAgICAgICBjb25zdCBpbml0UmVzdWx0ID0gaW5pdFN0YXR1cy5yZXN1bHQ7XG4gICAgICAgICAgY29uc3QgY2FuQXBwbGVQYXkgPSBpbml0UmVzdWx0LmlzQXZhaWxhYmxlICYmIGluaXRSZXN1bHQuYXZhaWxhYmxlUHJvdmlkZXJzLmFwcGxlUGF5O1xuICAgICAgICAgIGNvbnN0IGNhbkdvb2dsZVBheSA9IGluaXRSZXN1bHQuaXNBdmFpbGFibGUgJiYgaW5pdFJlc3VsdC5hdmFpbGFibGVQcm92aWRlcnMuZ29vZ2xlUGF5O1xuICAgICAgICAgIHRoaXMuY29uZmlnLm9uUGF5bWVudFJlcXVlc3RMb2FkPy4oe1xuICAgICAgICAgICAgYXBwbGVfcGF5OiB7XG4gICAgICAgICAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgICAgIGlzQXZhaWxhYmxlOiBjYW5BcHBsZVBheSxcbiAgICAgICAgICAgICAgc3RhcnRGbG93OiBhc3luYyAodXNlclBhcmFtcykgPT4gY2FuQXBwbGVQYXkgPyB0aGlzLnN1Ym1pdFBheW1lbnRSZXF1ZXN0KFwiYXBwbGVfcGF5XCIsIGluaXRSZXN1bHQsIHVzZXJQYXJhbXMpIDogdm9pZCAwXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ29vZ2xlX3BheToge1xuICAgICAgICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgICAgICAgICBpc0F2YWlsYWJsZTogY2FuR29vZ2xlUGF5LFxuICAgICAgICAgICAgICBzdGFydEZsb3c6IGFzeW5jICh1c2VyUGFyYW1zKSA9PiBjYW5Hb29nbGVQYXkgPyB0aGlzLnN1Ym1pdFBheW1lbnRSZXF1ZXN0KFwiZ29vZ2xlX3BheVwiLCBpbml0UmVzdWx0LCB1c2VyUGFyYW1zKSA6IHZvaWQgMFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgdGhpcy5zdWJtaXRQYXltZW50UmVxdWVzdCA9IChwcm92aWRlciwgaW5pdFJlc3VsdCwgcGFyYW1zKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmNyZWF0ZU9qc0Zsb3dDb250ZXh0KCk7XG4gICAgICAgIHJldHVybiBPanNGbG93cy5zdHJpcGVQUi5ydW4oe1xuICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgY2hlY2tvdXRQYXltZW50TWV0aG9kOiBmaW5kQ2hlY2tvdXRQYXltZW50TWV0aG9kU3RyaWN0KGNvbnRleHQuY2hlY2tvdXRQYXltZW50TWV0aG9kcywgcHJvdmlkZXIpLFxuICAgICAgICAgIG5vbkNkZUZvcm1JbnB1dHM6IGNyZWF0ZUlucHV0c0RpY3RGcm9tRm9ybShjb250ZXh0LmZvcm1EaXYpLFxuICAgICAgICAgIGZsb3dDYWxsYmFja3M6IHRoaXMuY3JlYXRlT2pzRmxvd0NhbGxiYWNrcygpLFxuICAgICAgICAgIGN1c3RvbVBhcmFtczogeyBwcm92aWRlciwgb3ZlcnJpZGVQYXltZW50UmVxdWVzdDogcGFyYW1zPy5vdmVycmlkZVBheW1lbnRSZXF1ZXN0IH0sXG4gICAgICAgICAgaW5pdFJlc3VsdFxuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgICBPcGVuUGF5Rm9ybS5hc3NpZ25Bc1NpbmdsZXRvbih0aGlzKTtcbiAgICAgIHRoaXMuY29uZmlnID0geyAuLi5jb25maWcsIGJhc2VVcmw6IGNvbmZpZy5iYXNlVXJsID8/IFwiaHR0cHM6Ly9jZGUuZ2V0b3BlbnBheS5jb21cIiB9O1xuICAgICAgdGhpcy5lbGVtZW50cyA9IG51bGw7XG4gICAgICB0aGlzLmZvcm1JZCA9IGBvcGpzLWZvcm0tJHt3aW5kb3cuY3J5cHRvLnJhbmRvbVVVSUQoKX1gO1xuICAgICAgdGhpcy5yZWZlcmVyID0gd2luZG93LmxvY2F0aW9uLm9yaWdpbjtcbiAgICAgIHRoaXMuZm9ybVRhcmdldCA9IGNvbmZpZy5mb3JtVGFyZ2V0ID8/IFwiYm9keVwiO1xuICAgICAgdGhpcy5mb3JtUHJvcGVydGllcyA9IHsgaGVpZ2h0OiBcIjFweFwiIH07XG4gICAgICB0aGlzLmNkZUxvYWRlZFBheWxvYWQgPSBudWxsO1xuICAgICAgdGhpcy5vanNGbG93c0luaXRpYWxpemF0aW9uID0gbnVsbDtcbiAgICAgIHRoaXMuY2hlY2tvdXRGaXJlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5jb25uZWN0aW9uTWFuYWdlciA9IG5ldyBDb25uZWN0aW9uTWFuYWdlcigpO1xuICAgICAgdGhpcy5ldmVudEhhbmRsZXIgPSBuZXcgT3BlblBheUZvcm1FdmVudEhhbmRsZXIodGhpcyk7XG4gICAgICB0aGlzLm9qc1ZlcnNpb24gPSBcIjAuMS4xMVwiO1xuICAgICAgdGhpcy5vanNSZWxlYXNlVmVyc2lvbiA9IFwiMC4xLjExXCI7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgdGhpcy5ldmVudEhhbmRsZXIuaGFuZGxlTWVzc2FnZS5iaW5kKHRoaXMuZXZlbnRIYW5kbGVyKSk7XG4gICAgfVxuICAgIHN0YXRpYyB7XG4gICAgICB0aGlzLm9qc0Zsb3dzID0gT2pzRmxvd3M7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFzc2lnbiB0aGUgaW5zdGFuY2UgdG8gdGhlIHdpbmRvdyBhcyBhIHNpbmdsZXRvblxuICAgICAqIEBwYXJhbSBmb3JtIC0gVGhlIE9wZW5QYXlGb3JtIGluc3RhbmNlXG4gICAgICovXG4gICAgc3RhdGljIGFzc2lnbkFzU2luZ2xldG9uKGZvcm0pIHtcbiAgICAgIGlmIChPcGVuUGF5Rm9ybS5nZXRJbnN0YW5jZSgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk9wZW5QYXkgaW5zdGFuY2UgYWxyZWFkeSBleGlzdHMuIE9ubHkgb25lIGluc3RhbmNlIGlzIGFsbG93ZWQuXCIpO1xuICAgICAgfVxuICAgICAgd2luZG93W1wib2pzXCJdID0gZm9ybTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgT3BlblBheUZvcm1cbiAgICAgKiBAcmV0dXJucyBUaGUgT3BlblBheUZvcm0gaW5zdGFuY2VcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0SW5zdGFuY2UoKSB7XG4gICAgICByZXR1cm4gd2luZG93W1wib2pzXCJdID8/IG51bGw7XG4gICAgfVxuICAgIGdldENvbm5lY3Rpb25NYW5hZ2VyKCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbk1hbmFnZXI7XG4gICAgfVxuICAgIHNldEZvcm1IZWlnaHQoaGVpZ2h0KSB7XG4gICAgICB0aGlzLmZvcm1Qcm9wZXJ0aWVzLmhlaWdodCA9IGhlaWdodDtcbiAgICAgIGlmICh0aGlzLmVsZW1lbnRzKSB7XG4gICAgICAgIE9iamVjdC52YWx1ZXModGhpcy5lbGVtZW50cykuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgIGVsZW1lbnQubm9kZS5zdHlsZS5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBjcmVhdGVFbGVtZW50KGVsZW1lbnRWYWx1ZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICBpZiAoIXRoaXMuY29uZmlnKSB0aHJvdyBuZXcgRXJyb3IoXCJPcGVuUGF5IGZvcm0gbm90IGluaXRpYWxpemVkXCIpO1xuICAgICAgY29uc3QgdHlwZSA9IEVsZW1lbnRUeXBlLnBhcnNlKGVsZW1lbnRWYWx1ZSk7XG4gICAgICBjb25zdCBmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpZnJhbWVcIik7XG4gICAgICBjb25zdCBxdWVyeVN0cmluZyA9IHRoaXMuYnVpbGRRdWVyeVN0cmluZyhvcHRpb25zKTtcbiAgICAgIGZyYW1lLm5hbWUgPSBgJHt0eXBlfS1lbGVtZW50YDtcbiAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoYC9hcHAvdjEvJHtmcmFtZS5uYW1lfWAsIHRoaXMuY29uZmlnLmJhc2VVcmwpO1xuICAgICAgdXJsLnNlYXJjaCA9IHF1ZXJ5U3RyaW5nLnRvU3RyaW5nKCk7XG4gICAgICBmcmFtZS5zcmMgPSB1cmwuaHJlZjtcbiAgICAgIHRoaXMuY29uZmlnLl9mcmFtZVVybCA9IHVybDtcbiAgICAgIGZyYW1lLnN0eWxlLmJvcmRlciA9IFwibm9uZVwiO1xuICAgICAgZnJhbWUuc3R5bGUud2lkdGggPSBcIjEwMCVcIjtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSB7XG4gICAgICAgIHR5cGUsXG4gICAgICAgIG5vZGU6IGZyYW1lLFxuICAgICAgICBtb3VudDogKHNlbGVjdG9yKSA9PiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKT8uYXBwZW5kQ2hpbGQoZnJhbWUpXG4gICAgICB9O1xuICAgICAgdGhpcy5jb25uZWN0VG9FbGVtZW50KGVsZW1lbnQpO1xuICAgICAgaWYgKHRoaXMuZWxlbWVudHMpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50c1t0eXBlXSA9IGVsZW1lbnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmVsZW1lbnRzID0geyBbdHlwZV06IGVsZW1lbnQgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cbiAgICBidWlsZFF1ZXJ5U3RyaW5nKG9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICAgICAgcXVlcnlTdHJpbmcuYXBwZW5kKFwicmVmZXJlclwiLCB0aGlzLnJlZmVyZXIpO1xuICAgICAgcXVlcnlTdHJpbmcuYXBwZW5kKFwiZm9ybUlkXCIsIHRoaXMuZm9ybUlkKTtcbiAgICAgIGlmIChvcHRpb25zLnN0eWxlcykge1xuICAgICAgICBxdWVyeVN0cmluZy5hcHBlbmQoXCJzdHlsZXNcIiwgY29udmVydFN0eWxlc1RvUXVlcnlTdHJpbmcob3B0aW9ucy5zdHlsZXMpKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5U3RyaW5nLmFwcGVuZChcInNlY3VyZVRva2VuXCIsIHRoaXMuY29uZmlnLmNoZWNrb3V0U2VjdXJlVG9rZW4pO1xuICAgICAgcmV0dXJuIHF1ZXJ5U3RyaW5nO1xuICAgIH1cbiAgICBjb25uZWN0VG9FbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgIGNyZWF0ZUNvbm5lY3Rpb24oZWxlbWVudC5ub2RlKS50aGVuKChjb25uKSA9PiB7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbk1hbmFnZXIuYWRkQ29ubmVjdGlvbihlbGVtZW50LnR5cGUsIGNvbm4pO1xuICAgICAgICB0aGlzLnRyeUluaXRPanNGbG93cygpO1xuICAgICAgfSkuY2F0Y2goKGVycikgPT4gY29uc29sZS5lcnJvcihcIltGT1JNXSBFcnJvciBjb25uZWN0aW5nIHRvIENERSBpZnJhbWVcIiwgZXJyKSk7XG4gICAgfVxuICAgIGdldEZvcm1EaXYoKSB7XG4gICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLmZvcm1UYXJnZXQpID8/IGRvY3VtZW50LmJvZHk7XG4gICAgfVxuICAgIGNyZWF0ZU9qc0Zsb3dDb250ZXh0KCkge1xuICAgICAgY29uc3QgY2RlQ29ubmVjdGlvbnMgPSB0aGlzLmNvbm5lY3Rpb25NYW5hZ2VyLmdldEFsbENvbm5lY3Rpb25zKCk7XG4gICAgICBpZiAoIXRoaXMuY2RlTG9hZGVkUGF5bG9hZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZXF1ZXN0ZWQgY29udGV4dCB3aGlsZSBDREUgbm90IHlldCBsb2FkZWRcIik7XG4gICAgICB9XG4gICAgICBpZiAoY2RlQ29ubmVjdGlvbnMuc2l6ZSA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBDREUgY29ubmVjdGlvbnMgZm91bmRcIik7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBiYXNlVXJsOiBuZXcgVVJMKHRoaXMuY29uZmlnLmJhc2VVcmwgPz8gRlJBTUVfQkFTRV9VUkwpLm9yaWdpbixcbiAgICAgICAgZm9ybURpdjogdGhpcy5nZXRGb3JtRGl2KCksXG4gICAgICAgIGVsZW1lbnRzU2Vzc2lvbklkOiB0aGlzLmNkZUxvYWRlZFBheWxvYWQuc2Vzc2lvbklkLFxuICAgICAgICBjaGVja291dFBheW1lbnRNZXRob2RzOiB0aGlzLmNkZUxvYWRlZFBheWxvYWQuY2hlY2tvdXRQYXltZW50TWV0aG9kcyxcbiAgICAgICAgY2RlQ29ubmVjdGlvbnMsXG4gICAgICAgIGN1c3RvbUluaXRQYXJhbXM6IHRoaXMuY29uZmlnLmN1c3RvbUluaXRQYXJhbXMgPz8ge31cbiAgICAgIH07XG4gICAgfVxuICAgIGNyZWF0ZU9qc0Zsb3dDYWxsYmFja3MoKSB7XG4gICAgICBjb25zdCBub09wID0gKCkgPT4ge1xuICAgICAgfTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG9uQ2hlY2tvdXRFcnJvcjogbWFrZUNhbGxiYWNrU2FmZShcIm9uQ2hlY2tvdXRFcnJvclwiLCB0aGlzLmNvbmZpZy5vbkNoZWNrb3V0RXJyb3IgPz8gbm9PcCksXG4gICAgICAgIG9uQ2hlY2tvdXRTdGFydGVkOiBtYWtlQ2FsbGJhY2tTYWZlKFwib25DaGVja291dFN0YXJ0ZWRcIiwgdGhpcy5jb25maWcub25DaGVja291dFN0YXJ0ZWQgPz8gbm9PcCksXG4gICAgICAgIG9uQ2hlY2tvdXRTdWNjZXNzOiBtYWtlQ2FsbGJhY2tTYWZlKFwib25DaGVja291dFN1Y2Nlc3NcIiwgdGhpcy5jb25maWcub25DaGVja291dFN1Y2Nlc3MgPz8gbm9PcCksXG4gICAgICAgIG9uU2V0dXBQYXltZW50TWV0aG9kU3VjY2VzczogbWFrZUNhbGxiYWNrU2FmZShcbiAgICAgICAgICBcIm9uU2V0dXBQYXltZW50TWV0aG9kU3VjY2Vzc1wiLFxuICAgICAgICAgIHRoaXMuY29uZmlnLm9uU2V0dXBQYXltZW50TWV0aG9kU3VjY2VzcyA/PyBub09wXG4gICAgICAgICksXG4gICAgICAgIG9uVmFsaWRhdGlvbkVycm9yOiBtYWtlQ2FsbGJhY2tTYWZlKFwib25WYWxpZGF0aW9uRXJyb3JcIiwgdGhpcy5jb25maWcub25WYWxpZGF0aW9uRXJyb3IgPz8gbm9PcClcbiAgICAgIH07XG4gICAgfVxuICAgIHN1Ym1pdCgpIHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmNyZWF0ZU9qc0Zsb3dDb250ZXh0KCk7XG4gICAgICBPanNGbG93cy5jb21tb25DQy5ydW4oe1xuICAgICAgICBjb250ZXh0LFxuICAgICAgICBjaGVja291dFBheW1lbnRNZXRob2Q6IGZpbmRDaGVja291dFBheW1lbnRNZXRob2RTdHJpY3QoY29udGV4dC5jaGVja291dFBheW1lbnRNZXRob2RzLCBcImNyZWRpdF9jYXJkXCIpLFxuICAgICAgICBub25DZGVGb3JtSW5wdXRzOiBjcmVhdGVJbnB1dHNEaWN0RnJvbUZvcm0oY29udGV4dC5mb3JtRGl2KSxcbiAgICAgICAgZmxvd0NhbGxiYWNrczogdGhpcy5jcmVhdGVPanNGbG93Q2FsbGJhY2tzKCksXG4gICAgICAgIGN1c3RvbVBhcmFtczogdm9pZCAwLFxuICAgICAgICAvLyBUaGlzIGZsb3cgcmVxdWlyZXMgbm8gY3VzdG9tIHBhcmFtc1xuICAgICAgICBpbml0UmVzdWx0OiB2b2lkIDBcbiAgICAgICAgLy8gVGhpcyBmbG93IHJlcXVpcmVzIG5vIGluaXRpYWxpemF0aW9uXG4gICAgICB9KTtcbiAgICB9XG4gICAgb25QYXltZW50UmVxdWVzdEVycm9yKGVyck1zZykge1xuICAgICAgY29uc29sZS5lcnJvcihcIltmb3JtXSBFcnJvciBmcm9tIHBheW1lbnQgcmVxdWVzdDpcIiwgZXJyTXNnKTtcbiAgICAgIHRoaXMuY2hlY2tvdXRGaXJlZCA9IGZhbHNlO1xuICAgICAgaWYgKHRoaXMuY29uZmlnLm9uQ2hlY2tvdXRFcnJvcikgdGhpcy5jb25maWcub25DaGVja291dEVycm9yKGVyck1zZyk7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgT2JqZWN0LnZhbHVlcyh0aGlzLmVsZW1lbnRzID8/IHt9KSkge1xuICAgICAgICBlbGVtZW50Lm5vZGUucmVtb3ZlKCk7XG4gICAgICB9XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgdGhpcy5ldmVudEhhbmRsZXIuaGFuZGxlTWVzc2FnZS5iaW5kKHRoaXMuZXZlbnRIYW5kbGVyKSk7XG4gICAgfVxuICB9XG5cbiAgZXhwb3J0cy5GaWVsZE5hbWUgPSBGaWVsZE5hbWU7XG4gIGV4cG9ydHMuT3BlblBheUZvcm0gPSBPcGVuUGF5Rm9ybTtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblxufSkpOyJdLAogICJtYXBwaW5ncyI6ICJDQUFDLFNBQVVBLEVBQVFDLEVBQVMsQ0FDMUIsT0FBTyxTQUFZLFVBQVksT0FBTyxPQUFXLElBQWNBLEVBQVEsUUFBUyxRQUFRLEtBQUssRUFBRyxRQUFRLE1BQU0sRUFBRyxRQUFRLFFBQVEsRUFBRyxRQUFRLE9BQU8sQ0FBQyxFQUNwSixPQUFPLFFBQVcsWUFBYyxPQUFPLElBQU0sT0FBTyxDQUFDLFVBQVcsTUFBTyxPQUFRLFNBQVUsT0FBTyxFQUFHQSxDQUFPLEdBQ3pHRCxFQUFTLE9BQU8sV0FBZSxJQUFjLFdBQWFBLEdBQVUsS0FBTUMsRUFBUUQsRUFBTyxRQUFVLENBQUMsRUFBR0EsRUFBTyxJQUFLQSxFQUFPLEtBQU1BLEVBQU8sT0FBUUEsRUFBTyxLQUFLLEVBQzlKLEdBQUcsS0FBTyxTQUFVRSxFQUFTQyxFQUFLQyxHQUFNQyxHQUFRQyxFQUFPLENBQUUsYUFFdkQsTUFBTUMsR0FBaUIsNkJBRWpCQyxHQUE0QkwsRUFBSSxFQUFFLE9BQU8sQ0FDN0MsS0FBTUEsRUFBSSxFQUFFLE9BQU8sRUFDbkIsSUFBS0EsRUFBSSxFQUFFLE1BQU1BLEVBQUksRUFBRSxPQUFPLENBQUMsRUFDL0IsSUFBS0EsRUFBSSxFQUFFLE9BQU8sRUFDbEIsSUFBS0EsRUFBSSxFQUFFLE9BQU8sQ0FDcEIsQ0FBQyxFQUNLTSxHQUFrQ04sRUFBSSxFQUFFLE1BQU1LLEVBQXlCLEVBQ3ZFRSxHQUFnQlAsRUFBSSxFQUFFLE9BQU8sQ0FDakMsS0FBTUEsRUFBSSxFQUFFLE9BQU8sRUFDbkIsUUFBU0EsRUFBSSxFQUFFLE9BQU8sRUFDdEIsS0FBTUEsRUFBSSxFQUFFLE1BQU1BLEVBQUksRUFBRSxPQUFPLENBQUMsQ0FDbEMsQ0FBQyxFQUNLUSxHQUFpQlIsRUFBSSxFQUFFLE1BQU1PLEVBQWEsRUFDMUNFLEdBQWtDLENBQ3RDLGtCQUFtQiw0RkFDckIsRUFDTUMsRUFBMkJDLEdBQW1CLENBQ2xELE1BQU1DLEVBQU1ELEVBQWUsWUFBWSxFQUFFLEtBQUssRUFDOUMsT0FBT0YsR0FBZ0NHLENBQUcsR0FBS0QsQ0FDakQsRUFDTUUsR0FBMkJDLEdBQVEsQ0FDdkMsR0FBSSxDQUVGLE9BQU8sT0FEUSxLQUFLLE1BQU1BLENBQUcsR0FDSixRQUMzQixNQUFZLENBQ1YsTUFBTyxFQUNULENBQ0YsRUFDTUMsR0FBNENDLEdBQzVDQSxFQUFTLFNBQVcsRUFDZk4sRUFBd0JNLEVBQVMsQ0FBQyxFQUFFLEdBQUcsRUFHdkM7QUFBQSxFQURVQSxFQUFTLElBQUtDLEdBQVEsS0FBS1AsRUFBd0JPLEVBQUksR0FBRyxDQUFDLEVBQUUsRUFBRSxLQUFLO0FBQUEsQ0FBSSxDQUVyRixHQUdGQyxHQUFtQ0MsR0FFaEM7QUFBQSxFQURjQSxFQUFPLElBQUtGLEdBQVEsS0FBS0EsRUFBSSxLQUFLLEtBQUssR0FBRyxDQUFDLEtBQUtBLEVBQUksT0FBTyxFQUFFLEVBQUUsS0FBSztBQUFBLENBQUksQ0FFbkYsR0FFTkcsR0FBbUJDLEdBQU0sQ0FDN0IsR0FBSUEsYUFBYSxNQUNmLEdBQUlSLEdBQXdCUSxFQUFFLE9BQU8sRUFBRyxDQUN0QyxNQUFNQyxFQUFNLEtBQUssTUFBTUQsRUFBRSxPQUFPLEVBQ2hDLE9BQUlmLEdBQWdDLFVBQVVnQixDQUFHLEVBQUUsUUFDMUNQLEdBQXlDTyxDQUFHLEVBQzFDZCxHQUFlLFVBQVVjLENBQUcsRUFBRSxRQUNoQ0osR0FBZ0NJLENBQUcsR0FFMUMsUUFBUSxLQUFLO0FBQUEsRUFDckJELEVBQUUsT0FBTyxFQUFFLEVBQ0lBLEVBQUUsUUFFYixLQUNFLFFBQU9YLEVBQXdCVyxFQUFFLE9BQU8sRUFHNUMsR0FBSSxPQUFPQSxHQUFNLFNBQ2YsR0FBSSxDQUNGLE9BQU8sS0FBSyxVQUFVQSxDQUFDLENBQ3pCLE9BQVNFLEVBQUksQ0FDWCxPQUFPQSxFQUFLLEVBQ2QsS0FFQSxRQUFPRixFQUFJLEVBRWYsRUFDTUcsRUFBbUIsQ0FBQ0MsRUFBY0MsSUFDL0IsSUFBSUMsSUFBUyxDQUNsQixHQUFJLENBQ0YsT0FBT0QsRUFBRyxHQUFHQyxDQUFJLENBQ25CLE9BQVNDLEVBQU8sQ0FDZCxRQUFRLE1BQU0sa0NBQWtDSCxDQUFZLEtBQU1HLENBQUssRUFDdkUsTUFDRixDQUNGLEVBR0lDLEVBQWlCN0IsRUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFHLENBQUUsUUFBUyxpQkFBa0IsQ0FBQyxFQUM1RThCLEVBQWlCOUIsRUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUNoRCtCLEVBQW1CQyxHQUFVaEMsRUFBSSxFQUFFLFNBQVNnQyxFQUFNLFNBQVMsQ0FBQyxFQUNsRSxJQUFJQyxHQUE4QkMsSUFDaENBLEVBQVcsV0FBZ0IsWUFDM0JBLEVBQVcsVUFBZSxXQUMxQkEsRUFBVyxNQUFXLFFBQ3RCQSxFQUFXLFNBQWMsVUFDekJBLEVBQVcsS0FBVSxPQUNyQkEsRUFBVyxNQUFXLFFBQ3RCQSxFQUFXLFFBQWEsVUFDeEJBLEVBQVcsUUFBYSxVQUN4QkEsRUFBVyxNQUFXLFFBQ3RCQSxFQUFXLGVBQW9CLGdCQUN4QkEsSUFDTkQsR0FBYSxDQUFDLENBQUMsRUFDbEIsTUFBTUUsR0FBZ0JuQyxFQUFJLEVBQUUsV0FBV2lDLENBQVMsRUFDaEQsSUFBSUcsSUFBcUNDLElBQ3ZDQSxFQUFrQixZQUFpQixhQUNuQ0EsRUFBa0IsWUFBaUIsYUFDbkNBLEVBQWtCLFNBQWMsVUFDekJBLElBQ05ELElBQW9CLENBQUMsQ0FBQyxFQUN6QixNQUFNRSxHQUF1QnRDLEVBQUksRUFBRSxXQUFXb0MsRUFBZ0IsRUFDeERHLEdBQWdCdkMsRUFBSSxFQUFFLE1BQU0sQ0FBQ21DLEdBQWVHLEVBQW9CLENBQUMsRUFDdkUsSUFBSUUsSUFBb0NDLElBQ3RDQSxFQUFpQixLQUFVLE9BQzNCQSxFQUFpQixZQUFpQixjQUNsQ0EsRUFBaUIsWUFBaUIsY0FDbENBLEVBQWlCLFNBQWMsV0FDeEJBLElBQ05ELElBQW1CLENBQUMsQ0FBQyxFQUN4QixNQUFNRSxHQUFjMUMsRUFBSSxFQUFFLFdBQVd3QyxFQUFlLEVBQzlDRyxFQUEwQjNDLEVBQUksRUFBRSxPQUFPLENBQzNDLFNBQVVBLEVBQUksRUFBRSxPQUFPLEVBQ3ZCLGVBQWdCK0IsRUFBZ0IvQixFQUFJLEVBQUUsT0FBTyxDQUFDLEVBQzlDLFNBQVUrQixFQUFnQi9CLEVBQUksRUFBRSxPQUFPQSxFQUFJLEVBQUUsT0FBTyxFQUFHQSxFQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FDckUsQ0FBQyxFQUNLNEMsR0FBdUI1QyxFQUFJLEVBQUUsT0FBTyxDQUN4QyxHQUFJQSxFQUFJLEVBQUUsT0FBTyxDQUNuQixDQUFDLEVBQ0RBLEVBQUksRUFBRSxPQUFPLENBQ1gsV0FBWThCLEVBQ1osT0FBUUEsRUFDUixJQUFLQSxDQUNQLENBQUMsRUFDRDlCLEVBQUksRUFBRSxPQUFPLENBQ1gsZ0JBQWlCOEIsRUFDakIsTUFBT0EsRUFDUCxXQUFZQSxFQUNaLFNBQVVBLEVBQ1YsV0FBWUEsRUFDWixPQUFRQSxFQUNSLFFBQVNBLEVBQ1QsY0FBZUEsRUFDZixXQUFZQSxDQUNkLENBQUMsRUFDRCxNQUFNZSxFQUFZN0MsRUFBSSxFQUFFLEtBQUssQ0FFM0IsU0FDQSxTQUNBLE9BQ0EsUUFDQSxTQUNBLG1CQUNBLG1CQUNBLHVCQUNBLG1CQUNBLG1CQUNBLGFBQ0EsbUJBQ0EsaUJBQ0EsaUJBQ0EsK0JBRUEsV0FDQSxXQUNBLG9CQUNGLENBQUMsRUFDSzhDLEdBQW1CRCxFQUFVLFFBQVEsQ0FBQyxtQkFBb0Isa0JBQWtCLENBQUMsRUFDN0VFLEdBQXNCL0MsRUFBSSxFQUFFLE9BQU8sQ0FBRSxLQUFNOEMsRUFBaUIsQ0FBQyxFQUM3REUsR0FBaUJILEVBQVUsUUFBUSxDQUFDLE9BQVEsUUFBUyxRQUFRLENBQUMsRUFDOURJLEdBQW9CakQsRUFBSSxFQUFFLE9BQU8sQ0FDckMsS0FBTWdELEdBQ04sWUFBYVYsR0FDYixPQUFRdEMsRUFBSSxFQUFFLE1BQU1BLEVBQUksRUFBRSxPQUFPLENBQUMsRUFBRSxTQUFTLENBQy9DLENBQUMsRUFDS2tELEdBQWlCTCxFQUFVLFFBQVEsQ0FBQyxhQUFjLGlCQUFrQixnQkFBZ0IsQ0FBQyxFQUNyRk0sR0FBb0JuRCxFQUFJLEVBQUUsT0FBTyxDQUNyQyxLQUFNa0QsR0FDTixRQUFTckIsRUFDVCxRQUFTN0IsRUFBSSxFQUFFLE9BQU9BLEVBQUksRUFBRSxPQUFPLEVBQUdBLEVBQUksRUFBRSxPQUFPLENBQUMsRUFBRSxTQUFTLENBQ2pFLENBQUMsRUFDS29ELEdBQTJCUCxFQUFVLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxFQUNqRVEsR0FBOEJyRCxFQUFJLEVBQUUsT0FBTyxDQUMvQyxLQUFNb0QsR0FDTixZQUFhYixHQUNiLE9BQVF2QyxFQUFJLEVBQUUsTUFBTUEsRUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUNwQyxDQUFDLEVBQ0tzRCxHQUFxQnRELEVBQUksRUFBRSxPQUFPLENBQ3RDLEtBQU1BLEVBQUksRUFBRSxRQUFRNkMsRUFBVSxLQUFLLE1BQU0sRUFDekMsT0FBUWhCLENBQ1YsQ0FBQyxFQUNLMEIsR0FBcUJ2RCxFQUFJLEVBQUUsT0FBTyxDQUN0QyxLQUFNQSxFQUFJLEVBQUUsUUFBUTZDLEVBQVUsS0FBSyxNQUFNLEVBQ3pDLFVBQVdoQixFQUNYLGlCQUFrQjdCLEVBQUksRUFBRSxPQUFPLEVBQy9CLFNBQVU4QixFQUNWLHVCQUF3QjlCLEVBQUksRUFBRSxNQUFNMkMsQ0FBdUIsQ0FDN0QsQ0FBQyxFQUNLYSxHQUFpQ3hELEVBQUksRUFBRSxPQUFPLENBQ2xELEtBQU1BLEVBQUksRUFBRSxRQUFRNkMsRUFBVSxLQUFLLG9CQUFvQixFQUN2RCxtQkFBb0I3QyxFQUFJLEVBQUUsT0FBT0EsRUFBSSxFQUFFLE9BQU8sRUFBR0EsRUFBSSxFQUFFLElBQUksQ0FBQyxFQUM1RCxvQkFBcUJBLEVBQUksRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUMxQyxnQkFBaUJBLEVBQUksRUFBRSxTQUFTQSxFQUFJLEVBQUUsT0FBT0EsRUFBSSxFQUFFLE9BQU8sRUFBR0EsRUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQzNFLENBQUMsRUFDS3lELEdBQW1DekQsRUFBSSxFQUFFLE9BQU8sQ0FDcEQsS0FBTUEsRUFBSSxFQUFFLFFBQVE2QyxFQUFVLEtBQUssNEJBQTRCLEVBQy9ELGdCQUFpQjdDLEVBQUksRUFBRSxPQUFPLENBQ2hDLENBQUMsRUFDSzBELEVBQXFCMUQsRUFBSSxFQUFFLE9BQU8sQ0FDckMsVUFBK0I2QixFQUMvQixTQUE2QkEsRUFDN0IsTUFBc0JBLEVBQ3RCLFFBQTJCQSxFQUMzQixRQUEwQkEsRUFDMUIsY0FBdUNDLENBQzFDLENBQUMsRUFDSzZCLEdBQWUzRCxFQUFJLEVBQUUsT0FBTyxDQUMvQixNQUFzQjZCLEVBQ3RCLFFBQTJCQSxFQUMzQixRQUEwQkEsRUFDMUIsY0FBdUNDLENBQzFDLENBQUMsRUFDSzhCLEdBQWtCZixFQUFVLFFBQVEsQ0FBQyxXQUFZLFdBQVksb0JBQW9CLENBQUMsRUFDbEZnQixHQUFxQjdELEVBQUksRUFBRSxPQUFPLENBQ3RDLEtBQU00RCxHQUNOLFVBQVcvQixFQUNYLHNCQUF1QmMsRUFDdkIsb0JBQXFCM0MsRUFBSSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQzFDLHFCQUFzQkEsRUFBSSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQy9DLGVBQWdCOEIsQ0FDbEIsQ0FBQyxFQUFFLE9BQU80QixFQUFtQixLQUFLLEVBQzVCSSxHQUE4QjlELEVBQUksRUFBRSxPQUFPLENBQy9DLEtBQU1BLEVBQUksRUFBRSxRQUFRNkMsRUFBVSxLQUFLLGdCQUFnQixFQUNuRCxtQkFBb0I3QyxFQUFJLEVBQUUsUUFBUSxDQUNwQyxDQUFDLEVBQ0srRCxHQUE4Qi9ELEVBQUksRUFBRSxPQUFPLENBQy9DLEtBQU1BLEVBQUksRUFBRSxRQUFRNkMsRUFBVSxLQUFLLGdCQUFnQixFQUNuRCxZQUFhN0MsRUFBSSxFQUFFLE1BQU1BLEVBQUksRUFBRSxPQUFPLENBQUMsRUFDdkMsZ0JBQWlCQSxFQUFJLEVBQUUsTUFBTUEsRUFBSSxFQUFFLE9BQU8sQ0FBQyxFQUMzQyxXQUFZQSxFQUFJLEVBQUUsT0FBTyxDQUMzQixDQUFDLEVBQ0tnRSxHQUFlaEUsRUFBSSxFQUFFLG1CQUFtQixPQUFRLENBQ3BEK0MsR0FDQUUsR0FDQUUsR0FDQUUsR0FDQUMsR0FDQUMsR0FDQU0sR0FDQUMsR0FDQUMsR0FDQVAsR0FDQUMsRUFDRixDQUFDLEVBQ0tRLEdBQWVqRSxFQUFJLEVBQUUsT0FBTyxDQUNoQyxRQUFTZ0UsR0FDVCxNQUFPbkMsRUFDUCxPQUFRQSxFQUNSLFVBQVdBLENBQ2IsQ0FBQyxFQUNEN0IsRUFBSSxFQUFFLE9BQU8sQ0FDWCxXQUFZQSxFQUFJLEVBQUUsT0FBTyxFQUN6QixTQUFVNkIsQ0FDWixDQUFDLEVBQ0Q3QixFQUFJLEVBQUUsT0FBTyxDQUNYLGFBQWNBLEVBQUksRUFBRSxPQUFPLEVBQzNCLGVBQWdCQSxFQUFJLEVBQUUsT0FBTyxFQUFFLFNBQVMsQ0FDMUMsQ0FBQyxFQUNEQSxFQUFJLEVBQUUsT0FBTyxDQUNYLGFBQWNBLEVBQUksRUFBRSxPQUFPLEVBQzNCLGtCQUFtQitCLEVBQWdCL0IsRUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUNuRCxDQUFDLEVBQ0QsTUFBTWtFLEdBQTZCbEUsRUFBSSxFQUFFLE9BQU8sQ0FDOUMsZ0JBQWlCQSxFQUFJLEVBQUUsTUFBTTRDLEVBQW9CLENBQ25ELENBQUMsRUFDS3VCLEdBQXVCbkUsRUFBSSxFQUFFLE9BQU8sQ0FDeEMsWUFBYUEsRUFBSSxFQUFFLE9BQU8sRUFDMUIsT0FBUUEsRUFBSSxFQUFFLE1BQU1BLEVBQUksRUFBRSxPQUFPLENBQUMsQ0FDcEMsQ0FBQyxFQUNEQSxFQUFJLEVBQUUsT0FBTyxDQUNYLFdBQVlBLEVBQUksRUFBRSxPQUFPLENBQzNCLENBQUMsRUFDRCxNQUFNb0UsR0FBNEJwRSxFQUFJLEVBQUUsT0FBTyxDQUM3QyxRQUFTQSxFQUFJLEVBQUUsUUFBUSxFQUFLLEVBQzVCLFdBQVlBLEVBQUksRUFBRSxRQUFRLGtCQUFrQixFQUM1QyxPQUFRQSxFQUFJLEVBQUUsTUFBTW1FLEVBQW9CLENBQzFDLENBQUMsRUFDS0UsR0FBdUJyRSxFQUFJLEVBQUUsbUJBQW1CLFVBQVcsQ0FDL0RBLEVBQUksRUFBRSxPQUFPLENBQUUsUUFBU0EsRUFBSSxFQUFFLFFBQVEsRUFBSSxDQUFFLENBQUMsRUFDN0NvRSxFQUNGLENBQUMsRUFDRHBFLEVBQUksRUFBRSxPQUFPLENBQ1gsV0FBWUEsRUFBSSxFQUFFLE9BQU8sRUFDekIsd0JBQXlCMkMsRUFDekIsb0JBQXFCZSxFQUNyQiwwQkFBMkIxRCxFQUFJLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFDcEQsa0JBQW1CK0IsRUFBZ0IvQixFQUFJLEVBQUUsT0FBTyxDQUFDLENBQ25ELENBQUMsRUFDREEsRUFBSSxFQUFFLE9BQU8sQ0FDWCxXQUFZQSxFQUFJLEVBQUUsT0FBTyxFQUN6Qix3QkFBeUIyQyxFQUN6QixvQkFBcUJlLENBQ3ZCLENBQUMsRUFDRCxJQUFJWSxHQUFrQ0MsSUFDcENBLEVBQWUsUUFBYSxVQUM1QkEsRUFBZSxRQUFhLFVBQzVCQSxFQUFlLFVBQWUsWUFDdkJBLElBQ05ELEdBQWlCLENBQUMsQ0FBQyxFQUN0QixNQUFNRSxHQUF3QnhFLEVBQUksRUFBRSxPQUFPLENBQ3pDLE9BQVFBLEVBQUksRUFBRSxLQUFLLENBQUMsVUFBeUIsVUFBeUIsV0FBMkIsQ0FBQyxDQUNwRyxDQUFDLEVBQ0t5RSxHQUE4QnpFLEVBQUksRUFBRSxPQUFPLENBQy9DLEtBQU1BLEVBQUksRUFBRSxPQUFPLEVBQ25CLGFBQWNBLEVBQUksRUFBRSxPQUFPLEVBQzNCLGtCQUFtQkEsRUFBSSxFQUFFLE9BQU8sRUFDaEMsV0FBWUEsRUFBSSxFQUFFLE9BQU8sQ0FDM0IsQ0FBQyxFQUVLMEUsR0FBeUI5QyxHQUFVLENBQ3ZDLE1BQU0rQyxFQUFpQixDQUFDLEVBQ3hCLGNBQU8sUUFBUS9DLENBQUssRUFBRSxRQUFRLENBQUMsQ0FBQ2hCLEVBQUtnRSxDQUFLLElBQU0sQ0FDOUMsR0FBSSxDQUNGLE1BQU1DLEVBQVkxQyxHQUFjLE1BQU12QixDQUFHLEVBQ3JDLE1BQU0sUUFBUWdFLENBQUssRUFDckJELEVBQWVFLENBQVMsRUFBSUQsRUFDbkIsTUFBTSxRQUFRQSxFQUFNLE9BQU8sSUFDcENELEVBQWVFLENBQVMsRUFBSUQsRUFBTSxRQUV0QyxNQUFRLENBQ04sTUFDRixDQUNGLENBQUMsRUFDTUQsQ0FDVCxFQUVNRyxHQUE4QjlFLEVBQUksRUFBRSxPQUFPLENBQy9DLFVBQVdBLEVBQUksRUFBRSxPQUFPLEVBQ3hCLGNBQWVBLEVBQUksRUFBRSxPQUFPLEVBQzVCLGFBQWNBLEVBQUksRUFBRSxPQUFPLENBQzdCLENBQUMsRUFDSytFLEdBQW1DL0UsRUFBSSxFQUFFLE9BQU8sQ0FDcEQsS0FBTUEsRUFBSSxFQUFFLE9BQU8sRUFDbkIsY0FBZUEsRUFBSSxFQUFFLE9BQU8sRUFDNUIsVUFBV0EsRUFBSSxFQUFFLE9BQU8sQ0FDMUIsQ0FBQyxFQUNLZ0YsR0FBc0IsQ0FDMUIsSUFBSyxNQUNMLElBQUssS0FDUCxFQUNNQyxFQUFrQixNQUFPQyxHQUFtQixDQUNoRCxRQUFTQyxFQUFJLEVBQUdBLEVBQUksR0FBSUEsSUFDakJDLEdBQWtCLEdBQ3JCLE1BQU1DLEdBQU0sR0FBRyxFQUduQixHQUFJLENBQUNELEdBQWtCLEVBQ3JCLGNBQVEsSUFBSSxzQkFBc0IsRUFDNUIsSUFBSSxNQUFNLHNCQUFzQixFQUd4QyxPQURlLElBQUksT0FBT0YsQ0FBYyxDQUUxQyxFQUNNSSxHQUF1QixNQUFPQyxFQUFjQyxJQUFvQixDQUNwRSxNQUFNQyxFQUFTLE1BQU1SLEVBQWdCTSxDQUFZLEVBQ2pELE1BQU8sQ0FDTCxTQUFVRSxFQUFPLFNBQVNELENBQWUsRUFDekMsT0FBQUMsQ0FDRixDQUNGLEVBQ01DLEdBQTZCLE1BQU9ILEVBQWNJLEVBQWlCQyxFQUFVQyxFQUFpQkMsSUFBZSxDQUNqSCxRQUFRLElBQUlBLENBQVUsRUFDdEIsTUFBTUwsRUFBUyxNQUFNUixFQUFnQk0sQ0FBWSxFQUMzQ1EsRUFBaUJmLEdBQW9CWSxFQUFTLFlBQVksRUFBRSxLQUFLLENBQUMsRUFjeEUsT0FidUJILEVBQU8sZUFBZSxDQUUzQyxRQUFTLEtBQ1QsU0FBVU0sRUFDVixNQUFPLENBQ0wsTUFBTyxRQUNQLE9BQVFKLEVBQ1IsUUFBU0UsQ0FDWCxFQUNBLGlCQUFrQixHQUNsQixrQkFBbUIsR0FDbkIsZUFBZ0IsQ0FBQyxDQUNuQixDQUFDLENBRUgsRUFDTVIsR0FBU1csR0FDTixJQUFJLFFBQVNDLEdBQVksQ0FDOUIsV0FBV0EsRUFBU0QsQ0FBUyxDQUMvQixDQUFDLEVBRUdaLEdBQW9CLElBQ2pCLFdBQVksT0FFZmMsR0FBZ0MsTUFBT0MsR0FDcEMsSUFBSSxRQUFRLENBQUNGLEVBQVNHLElBQVcsQ0FDdEMsR0FBSSxDQUNGRCxFQUFlLEdBQUcsZ0JBQWlCLE1BQU9FLEdBQVEsQ0FDaERKLEVBQVFJLENBQUcsQ0FDYixDQUFDLEVBQ0RGLEVBQWUsR0FBRyxTQUFVLElBQU0sQ0FDaENDLEVBQU8sSUFBSSxNQUFNLHFEQUFxRCxDQUFDLENBQ3pFLENBQUMsQ0FDSCxPQUFTL0UsRUFBRyxDQUNWK0UsRUFBTy9FLENBQUMsQ0FDVixDQUNGLENBQUMsRUFFR2lGLEdBQW9CLE1BQU9DLEVBQW9CQyxJQUFhLENBQ2hFLEdBQUksQ0FBQ0QsRUFBbUIsV0FBYSxDQUFDQSxFQUFtQixjQUN2RCxNQUFNLElBQUksTUFBTSx3Q0FBd0MsS0FBSyxVQUFVQSxDQUFrQixDQUFDLEVBQUUsRUFHOUYsTUFBTUUsRUFBZ0IsTUFEUCxNQUFNeEIsRUFBZ0JzQixFQUFtQixTQUFTLEdBQzlCLGlCQUFpQkEsRUFBbUIsY0FBZSxDQUNwRixlQUFnQkMsRUFBUyxjQUFjLEVBQ3pDLENBQUMsRUFDRCxHQUFJQyxFQUFjLE1BQ2hCLE1BQUFELEVBQVMsU0FBUyxNQUFNLEVBQ2xCLElBQUksTUFBTSxtQkFBbUJDLEVBQWMsTUFBTSxTQUFXLFNBQVMsRUFBRSxFQUU3RSxPQUFBRCxFQUFTLFNBQVMsU0FBUyxFQUV0QkMsQ0FDVCxFQUNNQyxHQUE0QixNQUFPSCxHQUF1QixDQTNhbEUsSUFBQUksRUFBQUMsRUFBQUMsRUFBQUMsRUE2YUksTUFBTUwsRUFBZ0IsTUFEUCxNQUFNeEIsRUFBZ0JzQixFQUFtQixTQUFTLEdBQzlCLGlCQUFpQkEsRUFBbUIsY0FBZSxDQUNwRixlQUFnQkEsRUFBbUIsWUFDckMsQ0FBQyxFQUNLUSxHQUFlSixFQUFBRixFQUFjLGNBQWQsWUFBQUUsRUFBMkIsT0FDaEQsR0FBSUksSUFBaUIsWUFDbkIsUUFBUSxJQUFJLHVCQUF3QlIsRUFBbUIsWUFBWSxFQUNuRSxRQUFRLElBQUksOEJBQStCRSxFQUFjLFdBQVcsTUFDL0QsT0FBSU0sSUFBaUIsV0FDcEIsSUFBSSxNQUFNLHFEQUFxRCxFQUUvRCxJQUFJLE1BQ1IsS0FBR0gsRUFBQUgsRUFBYyxRQUFkLFlBQUFHLEVBQXFCLFlBQVdFLEdBQUFELEVBQUFKLEVBQWMsY0FBZCxZQUFBSSxFQUEyQixtQkFBM0IsWUFBQUMsRUFBNkMsVUFBVyxtREFBbUQsRUFDaEosQ0FFSixFQUVNRSxHQUE4QkMsR0FDVCxLQUFLLFVBQVVBLENBQU0sRUFJMUNDLEVBQTJCLENBQUNDLEVBQVNDLElBQ2xCLE1BQU0sS0FBS0QsRUFBUSxpQkFBaUIsYUFBYSxHQUFLLENBQUMsQ0FBQyxFQUM5QyxPQUFPLENBQUNFLEVBQUtDLElBQVUsQ0FDdEQsTUFBTTFHLEVBQU0wRyxFQUFNLGFBQWEsV0FBVyxFQUMxQyxPQUFLMUcsRUFDRSxDQUFFLEdBQUd5RyxFQUFLLENBQUN6RyxDQUFHLEVBQUcwRyxFQUFNLEtBQU0sRUFEbkJELENBRW5CLEVBQUcsQ0FBQyxDQUFDLEVBR0RFLEdBQXFCQyxHQUFjLENBQ3ZDLEdBQUksQ0FDRixPQUFPdkQsR0FBYSxNQUFNdUQsQ0FBUyxDQUNyQyxPQUFTNUYsRUFBTyxDQUNkLGNBQVEsTUFBTSwrQkFBZ0M0RixFQUFXNUYsQ0FBSyxFQUN4REEsQ0FDUixDQUNGLEVBQ002RixHQUFZLENBQUNDLEVBQVFDLEVBQVFDLEVBQVdDLEVBQVNDLElBQVksQ0FDakUsTUFBTUMsRUFBUSxDQUNaLFFBQUFGLEVBQ0EsTUFBTzVILEdBQUssR0FBRyxFQUNmLE9BQUEwSCxFQUNBLFVBQUFDLENBQ0YsRUFDQSxRQUFRLElBQUksU0FBU0QsQ0FBTSw0QkFBNEJDLENBQVMsSUFBS0csQ0FBSyxFQUMxRUwsRUFBTyxZQUFZLEtBQUssVUFBVUssQ0FBSyxFQUFHRCxDQUFPLENBQ25ELEVBRU1FLEdBQWtDLE1BQU8xRyxHQUFRLENBQ3JELEdBQUksT0FBT0EsR0FBUSxVQUFZLENBQUNBLEVBQUssTUFBTyxHQUM1QyxHQUFJLENBQ0YsTUFBTTJHLEVBQU8sQ0FBRSxLQUFNLE1BQU8sRUFDdEJDLEVBQVMsTUFBTTVHLEVBQUksS0FBSzJHLENBQUksRUFDbEMsR0FBSUMsSUFBVyxHQUNiLE1BQU0sSUFBSSxNQUFNLG1DQUFtQyxLQUFLLFVBQVVBLENBQU0sQ0FBQyxFQUFFLEVBRTdFLE1BQU8sRUFDVCxPQUFTLEVBQUcsQ0FDVixlQUFRLE1BQU0sZ0NBQWlDLENBQUMsRUFDekMsRUFDVCxDQUNGLEVBQ01DLEdBQWdCLENBQUM3RyxFQUFLOEcsSUFDbkIsQ0FBQyxDQUFDOUcsR0FBTzhHLEVBR1pDLEVBQWlCckcsR0FBVWhDLEVBQUksRUFBRSxTQUFTZ0MsRUFBTSxTQUFTLENBQUMsRUFDaEVoQyxFQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUcsQ0FBRSxRQUFTLGlCQUFrQixDQUFDLEVBQzNELE1BQU1zSSxHQUFtQnRJLEVBQUksRUFBRSxPQUFPLENBQ3BDLGtCQUFtQkEsRUFBSSxFQUFFLFFBQVEsT0FBTyxFQUN4QyxRQUFTQSxFQUFJLEVBQUUsT0FBTyxFQUN0QixRQUFTQSxFQUFJLEVBQUUsT0FBT0EsRUFBSSxFQUFFLE9BQU8sRUFBR0EsRUFBSSxFQUFFLE9BQU8sQ0FBQyxFQUFFLFNBQVMsQ0FDakUsQ0FBQyxFQUNEQSxFQUFJLEVBQUUsS0FBSyxDQUFDLE1BQU8sS0FBSyxDQUFDLEVBQ3pCLE1BQU11SSxHQUFnQnZJLEVBQUksRUFBRSxPQUFPLENBQ2pDLEtBQU1BLEVBQUksRUFBRSxPQUFPLEVBQ25CLGdCQUFpQnFJLEVBQWNySSxFQUFJLEVBQUUsT0FBTyxDQUFDLEVBQzdDLFlBQWFxSSxFQUFjckksRUFBSSxFQUFFLE9BQU8sQ0FBQyxFQUN6QyxTQUFVcUksRUFBY3JJLEVBQUksRUFBRSxPQUFPLENBQUMsRUFDdEMsU0FBVUEsRUFBSSxFQUFFLE9BQU8sRUFDdkIsbUJBQW9CcUksRUFBY3JJLEVBQUksRUFBRSxPQUFPLENBQUMsQ0FDbEQsQ0FBQyxFQUNLd0ksR0FBV3hJLEVBQUksRUFBRSxPQUFPLENBQzVCLHFCQUFzQkEsRUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQ3pDLGtCQUFtQkEsRUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQ3RDLFNBQVVBLEVBQUksRUFBRSxPQUFPLEVBQ3ZCLFlBQWFxSSxFQUFjckksRUFBSSxFQUFFLE9BQU8sQ0FBQyxFQUN6QyxTQUFVQSxFQUFJLEVBQUUsT0FBTyxFQUN2QixpQkFBa0JxSSxFQUFjckksRUFBSSxFQUFFLE9BQU8sQ0FBQyxFQUM5Qyx1QkFBd0JxSSxFQUFjckksRUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsRUFDMUQsU0FBVUEsRUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQy9CLENBQUMsRUFDS3lJLEdBQWdCekksRUFBSSxFQUFFLE9BQU9BLEVBQUksRUFBRSxPQUFPLEVBQUdBLEVBQUksRUFBRSxJQUFJLENBQUMsRUFDeEQwSSxHQUFRMUksRUFBSSxFQUFFLE9BQU8sQ0FDekIsS0FBTUEsRUFBSSxFQUFFLE9BQU8sRUFDbkIsU0FBVXFJLEVBQWNJLEVBQWEsQ0FDdkMsQ0FBQyxFQUNLRSxFQUF3QjNJLEVBQUksRUFBRSxPQUFPLENBQ3pDLFNBQVVBLEVBQUksRUFBRSxPQUFPLEVBQ3ZCLGVBQWdCcUksRUFBY3JJLEVBQUksRUFBRSxPQUFPLENBQUMsRUFDNUMsU0FBVXFJLEVBQWNySSxFQUFJLEVBQUUsT0FBT0EsRUFBSSxFQUFFLE9BQU8sRUFBR0EsRUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQ25FLENBQUMsRUFDSzRJLEdBQTBCNUksRUFBSSxFQUFFLE9BQU8sQ0FDM0MsU0FBVUEsRUFBSSxFQUFFLE9BQU8sQ0FDekIsQ0FBQyxFQUNLNkksR0FBc0I3SSxFQUFJLEVBQUUsT0FBTyxDQUN2QyxHQUFJcUksRUFBY3JJLEVBQUksRUFBRSxPQUFPLENBQUMsRUFDaEMsaUJBQWtCcUksRUFBY3JJLEVBQUksRUFBRSxPQUFPLENBQUMsRUFDOUMsdUJBQXdCcUksRUFBY3JJLEVBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQzFELG1CQUFvQkEsRUFBSSxFQUFFLE1BQU00SSxFQUF1QixFQUN2RCxZQUFhUCxFQUFjckksRUFBSSxFQUFFLE9BQU8sQ0FBQyxFQUN6QyxVQUFXcUksRUFBY3JJLEVBQUksRUFBRSxPQUFPLENBQUMsQ0FDekMsQ0FBQyxFQUNLOEksR0FBb0M5SSxFQUFJLEVBQUUsT0FBTyxDQUNyRCxZQUFhQSxFQUFJLEVBQUUsT0FBTyxDQUM1QixDQUFDLEVBQ0srSSxHQUF5Qi9JLEVBQUksRUFBRSxPQUFPLENBQzFDLFlBQWFBLEVBQUksRUFBRSxPQUFPLEVBQzFCLHlDQUEwQ0EsRUFBSSxFQUFFLE9BQU8sRUFDdkQsU0FBVUEsRUFBSSxFQUFFLE9BQU8sRUFDdkIsc0JBQXVCQSxFQUFJLEVBQUUsTUFBTThJLEVBQWlDLEVBQ3BFLHFCQUFzQjlJLEVBQUksRUFBRSxPQUFPLENBQ3JDLENBQUMsRUFDS2dKLEdBQWtCaEosRUFBSSxFQUFFLE9BQU8sQ0FDbkMsT0FBUXVJLEVBQ1YsQ0FBQyxFQUNLVSxHQUFpQmpKLEVBQUksRUFBRSxPQUFPLENBQ2xDLFNBQVVBLEVBQUksRUFBRSxPQUFPLEVBQ3ZCLFVBQVdBLEVBQUksRUFBRSxNQUFNZ0osRUFBZSxFQUN0QyxtQkFBb0JYLEVBQWNySSxFQUFJLEVBQUUsT0FBTyxDQUFDLEVBQ2hELE1BQU9BLEVBQUksRUFBRSxNQUFNK0ksRUFBc0IsRUFDekMsc0JBQXVCL0ksRUFBSSxFQUFFLE9BQU8sRUFDcEMsZ0JBQWlCQSxFQUFJLEVBQUUsT0FBTyxFQUM5QixrQkFBbUJBLEVBQUksRUFBRSxPQUFPLEVBQ2hDLDRCQUE2QkEsRUFBSSxFQUFFLE1BQU04SSxFQUFpQyxDQUM1RSxDQUFDLEVBQ0tJLEdBQW9DbEosRUFBSSxFQUFFLE9BQU8sQ0FDckQsUUFBU0EsRUFBSSxFQUFFLE1BQU02SSxFQUFtQixFQUN4QyxTQUFVN0ksRUFBSSxFQUFFLE1BQU1pSixFQUFjLENBQ3RDLENBQUMsRUFDS0UsR0FBMEJuSixFQUFJLEVBQUUsT0FBTyxDQUMzQyxRQUFTa0osR0FDVCxtQkFBb0JiLEVBQWNhLEVBQWlDLEVBQ25FLFFBQVNsSixFQUFJLEVBQUUsTUFBTXVJLEVBQWEsQ0FDcEMsQ0FBQyxFQUNLYSxHQUE0QnBKLEVBQUksRUFBRSxPQUFPLENBQzdDLE9BQVFBLEVBQUksRUFBRSxRQUFRLE1BQU0sRUFDNUIsTUFBT0EsRUFBSSxFQUFFLE9BQU8sRUFDcEIsTUFBT3FJLEVBQWNySSxFQUFJLEVBQUUsT0FBTyxDQUFDLEVBQ25DLFdBQVlBLEVBQUksRUFBRSxNQUFNd0ksRUFBUSxFQUNoQyxxQkFBc0J4SSxFQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFDekMsa0JBQW1CQSxFQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFDdEMsTUFBTzBJLEdBQ1AsYUFBY0wsRUFBY2MsRUFBdUIsRUFFbkQsa0JBQW1CbkosRUFBSSxFQUFFLE1BQU0ySSxDQUFxQixDQUN0RCxDQUFDLEVBQ0tVLEdBQXFCckosRUFBSSxFQUFFLG1CQUFtQixPQUFRLENBQzFEQSxFQUFJLEVBQUUsT0FBTyxDQUNYLEtBQU1BLEVBQUksRUFBRSxRQUFRLE9BQU8sRUFDM0IsU0FBVUEsRUFBSSxFQUFFLFNBQVNBLEVBQUksRUFBRSxVQUFVLENBQUMsQ0FDNUMsQ0FBQyxFQUFFLE9BQU9vSixHQUEwQixLQUFLLEVBQ3pDcEosRUFBSSxFQUFFLE9BQU8sQ0FDWCxLQUFNQSxFQUFJLEVBQUUsS0FBSyxDQUFDLFVBQVcsY0FBYyxDQUFDLEVBQzVDLFNBQVVBLEVBQUksRUFBRSxPQUFPLENBQ3pCLENBQUMsRUFBRSxPQUFPb0osR0FBMEIsS0FBSyxDQUMzQyxDQUFDLEVBQ0tFLEdBQXVCdEosRUFBSSxFQUFFLE9BQU8sQ0FDeEMsT0FBUUEsRUFBSSxFQUFFLFFBQVEsVUFBVSxDQUNsQyxDQUFDLEVBQ0t1SixHQUFxQnZKLEVBQUksRUFBRSxPQUFPLENBQ3RDLE9BQVFBLEVBQUksRUFBRSxRQUFRLFNBQVMsQ0FDakMsQ0FBQyxFQUNEQSxFQUFJLEVBQUUsTUFBTSxDQUFDcUosR0FBb0JDLEdBQXNCQyxFQUFrQixDQUFDLEVBQzFFdkosRUFBSSxFQUFFLE9BQU8sQ0FDWCxLQUFNQSxFQUFJLEVBQUUsT0FBTyxFQUNuQixLQUFNQSxFQUFJLEVBQUUsT0FBTyxFQUNuQixjQUFlQSxFQUFJLEVBQUUsT0FBTyxFQUM1QixnQkFBaUJBLEVBQUksRUFBRSxPQUFPLENBQ2hDLENBQUMsRUFDRCxNQUFNd0osR0FBMEJ4SixFQUFJLEVBQUUsT0FBTyxDQUMzQyxhQUFjQSxFQUFJLEVBQUUsTUFBTUEsRUFBSSxFQUFFLE9BQU8sQ0FBQyxFQUN4QyxpQkFBa0JBLEVBQUksRUFBRSxNQUFNQSxFQUFJLEVBQUUsT0FBTyxDQUFDLEVBQzVDLFlBQWFBLEVBQUksRUFBRSxPQUFPLENBQzVCLENBQUMsRUFDREEsRUFBSSxFQUFFLE9BQU8sQ0FDWCxhQUFjQSxFQUFJLEVBQUUsT0FBTyxFQUMzQixjQUFlQSxFQUFJLEVBQUUsSUFBSSxFQUV6QixlQUFnQkEsRUFBSSxFQUFFLE9BQU8sRUFDN0Isa0JBQW1CQSxFQUFJLEVBQUUsT0FBTyxFQUNoQyxpQkFBa0JBLEVBQUksRUFBRSxPQUFPLEVBQy9CLFdBQVlBLEVBQUksRUFBRSxNQUFNd0ksRUFBUSxFQUNoQyxrQkFBbUJ4SSxFQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFDdEMsY0FBZUEsRUFBSSxFQUFFLFFBQVEsRUFDN0Isd0JBQXlCMkksRUFDekIsZUFBZ0IzSSxFQUFJLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFDeEMsMEJBQTJCQSxFQUFJLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FDdEQsQ0FBQyxFQUNELE1BQU15SixHQUF3QnpKLEVBQUksRUFBRSxPQUFPLENBQ3pDLGtCQUFtQkEsRUFBSSxFQUFFLE9BQU8sQ0FDbEMsQ0FBQyxFQUNEQSxFQUFJLEVBQUUsT0FBTyxDQUNYLEdBQUlBLEVBQUksRUFBRSxPQUFPLEVBQ2pCLFdBQVlBLEVBQUksRUFBRSxPQUFPLENBQzNCLENBQUMsRUFDRCxNQUFNMEosR0FBMEIxSixFQUFJLEVBQUUsT0FBTyxDQUMzQyxLQUFNQSxFQUFJLEVBQUUsT0FBTyxFQUNuQixJQUFLQSxFQUFJLEVBQUUsTUFBTUEsRUFBSSxFQUFFLE9BQU8sQ0FBQyxFQUMvQixJQUFLQSxFQUFJLEVBQUUsT0FBTyxFQUNsQixJQUFLQSxFQUFJLEVBQUUsT0FBTyxDQUNwQixDQUFDLEVBQ0RBLEVBQUksRUFBRSxNQUFNMEosRUFBdUIsRUFDbkMxSixFQUFJLEVBQUUsT0FBTyxDQUNYLG1CQUFvQkEsRUFBSSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQzVDLHFCQUFzQkEsRUFBSSxFQUFFLE9BQU9BLEVBQUksRUFBRSxPQUFPLEVBQUdBLEVBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxTQUFTLEVBQ3pFLGlCQUFrQkEsRUFBSSxFQUFFLE9BQU8sRUFDL0Isd0JBQXlCMkksRUFDekIsa0JBQW1CM0ksRUFBSSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQzNDLHFCQUFzQkEsRUFBSSxFQUFFLE9BQU8sRUFBRSxTQUFTLENBQ2hELENBQUMsRUFDRCxNQUFNMkosR0FBMkIzSixFQUFJLEVBQUUsT0FBTyxDQUM1QyxzQkFBdUJBLEVBQUksRUFBRSxNQUFNQSxFQUFJLEVBQUUsT0FBT0EsRUFBSSxFQUFFLE9BQU8sRUFBR0EsRUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQzlFLENBQUMsRUFDREEsRUFBSSxFQUFFLE9BQU8sQ0FDWCxPQUFRMkQsR0FDUixzQkFBdUJnRixDQUN6QixDQUFDLEVBQ0QzSSxFQUFJLEVBQUUsT0FBTyxDQUNYLFdBQVlBLEVBQUksRUFBRSxPQUFPLEVBQ3pCLG9CQUFxQjBELEVBQ3JCLHdCQUF5QmlGLENBQzNCLENBQUMsRUFDRCxNQUFNaUIsR0FBZ0M1SixFQUFJLEVBQUUsT0FBTyxDQUNqRCxzQkFBdUJBLEVBQUksRUFBRSxNQUFNQSxFQUFJLEVBQUUsT0FBT0EsRUFBSSxFQUFFLE9BQU8sRUFBR0EsRUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQzVFLFNBQVVBLEVBQUksRUFBRSxPQUFPLENBQ3pCLENBQUMsRUFDREEsRUFBSSxFQUFFLE9BQU9BLEVBQUksRUFBRSxJQUFJLENBQUMsRUFFeEIsTUFBTTZKLEdBQU9DLEdBQ0pBLEVBQUksT0FBTyxDQUFDQyxFQUFHQyxJQUFNRCxFQUFJQyxFQUFHLENBQUMsRUFHdEMsU0FBU0MsR0FBU3ZDLEVBQVF3QyxFQUFXLENBQ25DLElBQUlDLEVBQWlCLE9BQU8sZUFDNUJBLEVBQWlCQSxFQUFlekMsRUFBUXdDLENBQVMsRUFBSXhDLEVBQU8sVUFBWXdDLENBQzFFLENBQ0EsU0FBU0UsR0FBUzFDLEVBQVFoRyxFQUFJLENBQ3hCQSxJQUFPLFNBQ1RBLEVBQUtnRyxFQUFPLGFBR2QsSUFBSTJDLEVBQW9CLE1BQU0sa0JBQzlCQSxHQUFxQkEsRUFBa0IzQyxFQUFRaEcsQ0FBRSxDQUNuRCxDQUVBLElBQUk0SSxHQUFZLFVBQVksQ0FDMUIsSUFBSUMsRUFBaUIsU0FBdUJDLEVBQUdSLEVBQUcsQ0FDaEQsT0FBQU8sRUFBaUIsT0FBTyxnQkFBa0IsQ0FDeEMsVUFBVyxDQUFDLENBQ2QsWUFBYSxPQUFTLFNBQVVDLEVBQUdSLEVBQUcsQ0FDcENRLEVBQUUsVUFBWVIsQ0FDaEIsR0FBSyxTQUFVUSxFQUFHUixFQUFHLENBQ25CLFFBQVNTLEtBQUtULEVBQ1IsT0FBTyxVQUFVLGVBQWUsS0FBS0EsRUFBR1MsQ0FBQyxJQUFHRCxFQUFFQyxDQUFDLEVBQUlULEVBQUVTLENBQUMsRUFFOUQsRUFFT0YsRUFBZUMsRUFBR1IsQ0FBQyxDQUM1QixFQUVBLE9BQU8sU0FBVVEsRUFBR1IsRUFBRyxDQUNyQixHQUFJLE9BQU9BLEdBQU0sWUFBY0EsSUFBTSxLQUFNLE1BQU0sSUFBSSxVQUFVLHVCQUF5QixPQUFPQSxDQUFDLEVBQUksK0JBQStCLEVBRW5JTyxFQUFlQyxFQUFHUixDQUFDLEVBRW5CLFNBQVNVLEdBQUssQ0FDWixLQUFLLFlBQWNGLENBQ3JCLENBRUFBLEVBQUUsVUFBWVIsSUFBTSxLQUFPLE9BQU8sT0FBT0EsQ0FBQyxHQUFLVSxFQUFHLFVBQVlWLEVBQUUsVUFBVyxJQUFJVSxFQUNqRixDQUNGLEVBQUUsRUFFRUMsR0FBYyxTQUFVQyxFQUFRLENBQ2xDTixHQUFVSyxFQUFhQyxDQUFNLEVBRTdCLFNBQVNELEVBQVlFLEVBQVNDLEVBQVMsQ0FDckMsSUFBSUMsRUFBYSxLQUFLLFlBRWxCQyxFQUFRSixFQUFPLEtBQUssS0FBTUMsRUFBU0MsQ0FBTyxHQUFLLEtBRW5ELGNBQU8sZUFBZUUsRUFBTyxPQUFRLENBQ25DLE1BQU9ELEVBQVcsS0FDbEIsV0FBWSxHQUNaLGFBQWMsRUFDaEIsQ0FBQyxFQUNEZCxHQUFTZSxFQUFPRCxFQUFXLFNBQVMsRUFDcENYLEdBQVNZLENBQUssRUFDUEEsQ0FDVCxDQUVBLE9BQU9MLENBQ1QsRUFBRSxLQUFLLEVBRVAsTUFBTU0sV0FBaUJOLEVBQVksQ0FDakMsWUFBWTNKLEVBQVUsQ0FDcEIsTUFBTWtLLEVBQWtCLG9DQUFvQ2xLLEVBQVMsT0FBTyxHQUM1RSxNQUFNa0ssQ0FBZSxFQUNyQixLQUFLLFNBQVdsSyxDQUNsQixDQUNBLElBQUksc0JBQXVCLENBQ3pCLE9BQU8sS0FBSyxTQUFTLE9BQ3ZCLENBQ0YsQ0FDQSxNQUFNbUssRUFBVyxNQUFPQyxFQUFTQyxFQUFNQyxJQUFtQixDQUN4RCxRQUFRLElBQUksc0RBQXVERCxFQUFLLEtBQU1ELENBQU8sRUFDckYsTUFBTXBLLEVBQVcsTUFBTW9LLEVBQVEsS0FBS0MsQ0FBSSxFQUV4QyxHQURBLFFBQVEsSUFBSSxzQ0FBdUNySyxDQUFRLEVBQ3ZEdUssR0FBbUJ2SyxDQUFRLEVBQzdCLE1BQU0sSUFBSWlLLEdBQVNqSyxDQUFRLEVBRTdCLEdBQUksQ0FBQ3dLLEdBQXdCeEssRUFBVXNLLENBQWMsRUFBRyxDQUN0RCxNQUFNcEQsRUFBU29ELEVBQWUsVUFBVXRLLENBQVEsRUFDaEQsTUFBSWtILEVBQU8sUUFBZSxJQUFJLE1BQU0sZUFBZSxHQUNuRCxRQUFRLE1BQU0sb0RBQXFEb0QsRUFBZ0IsVUFBV3RLLENBQVEsRUFDaEdrSCxFQUFPLE1BQ2YsQ0FDQSxPQUFPbEgsQ0FDVCxFQUNNd0ssR0FBMEIsQ0FBQzVHLEVBQU82RyxJQUMvQkEsRUFBTyxVQUFVN0csQ0FBSyxFQUFFLFFBRTNCMkcsR0FBc0J2SyxHQUNuQnNILEdBQWlCLFVBQVV0SCxDQUFRLEVBQUUsUUFFeEMwSyxHQUFxQixNQUFPTixFQUFTTyxJQUNsQyxNQUFNUixFQUFTQyxFQUFTLENBQUUsS0FBTSx1QkFBd0IsUUFBU08sQ0FBUSxFQUFHeEMsRUFBdUIsRUFFdEd5QyxFQUFhLE1BQU9SLEdBQ2pCLE1BQU1ELEVBQVNDLEVBQVMsQ0FBRSxLQUFNLGNBQWUsUUFBUyxDQUFDLENBQUUsRUFBRy9CLEVBQWtCLEVBRW5Gd0MsR0FBbUIsTUFBT1QsRUFBU3ZELElBQ2hDLE1BQU1zRCxFQUFTQyxFQUFTLENBQUUsS0FBTSx3QkFBeUIsUUFBQXZELENBQVEsRUFBRzhCLEVBQXdCLEVBRS9GbUMsR0FBd0IsTUFBT1YsRUFBU3ZELElBQ3JDLE1BQU1zRCxFQUFTQyxFQUFTLENBQUUsS0FBTSw0QkFBNkIsUUFBQXZELENBQVEsRUFBRytCLEVBQTZCLEVBRXhHbUMsR0FBd0IsTUFBT1gsRUFBU3ZELElBQ3JDLE1BQU1zRCxFQUFTQyxFQUFTLENBQUUsS0FBTSw0QkFBNkIsUUFBQXZELENBQVEsRUFBRzhCLEVBQXdCLEVBRW5HcUMsRUFBcUIsTUFBT1osRUFBU3ZELElBQ2xDLE1BQU1zRCxFQUFTQyxFQUFTLENBQUUsS0FBTSx1QkFBd0IsUUFBQXZELENBQVEsRUFBRzNELEVBQTBCLEVBRWhHK0gsR0FBbUIsTUFBT2IsRUFBU2MsRUFBYUMsSUFBYyxDQUNsRSxNQUFNQyxFQUFrQixNQUFNVixHQUFtQk4sRUFBUyxDQUN4RCxhQUFjYyxFQUNkLGVBQWdCQyxDQUNsQixDQUFDLEVBQ0tFLEVBQWEsSUFBSSxJQUFJRCxFQUFnQixRQUFRLFNBQVMsSUFBS0UsR0FBUUEsRUFBSSxRQUFRLENBQUMsRUFDdEYsR0FBSUQsRUFBVyxPQUFTLEVBQ3RCLE1BQU0sSUFBSSxNQUFNLHNDQUFzQ0EsRUFBVyxJQUFJLEVBQUUsRUFFekUsTUFBTXpHLEVBQVd5RyxFQUFXLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBUyxNQUMvQ0UsRUFBYTFDLEdBQUl1QyxFQUFnQixRQUFRLFNBQVMsSUFBS0UsR0FBUUEsRUFBSSxxQkFBcUIsQ0FBQyxFQUMvRixNQUFPLENBQ0wsU0FBQTFHLEVBQ0EsV0FBQTJHLENBQ0YsQ0FDRixFQUNNQyxHQUEyQixNQUFPcEIsRUFBU2MsRUFBYU8sRUFBYU4sSUFBYyxDQUN2RixHQUFJTSxFQUNGLE1BQU8sQ0FBRSxXQUFZLEVBQUcsU0FBVSxLQUFNLEVBQ25DLENBQ0xOLEVBQWFBLEdBQVksT0FDekIsTUFBTUMsRUFBa0IsTUFBTUgsR0FBaUJiLEVBQVNjLEVBQWFDLENBQVMsRUFDOUUsTUFBTyxDQUFFLFdBQVlDLEVBQWdCLFdBQVksU0FBVUEsRUFBZ0IsUUFBUyxDQUN0RixDQUNGLEVBQ01NLEdBQStCLE1BQU9DLEVBQW1COUUsSUFBWSxDQUN6RSxHQUFJOEUsRUFBa0IsT0FBUyxFQUM3QixNQUFNLElBQUksTUFBTSwwQkFBMEIsRUFPNUMsT0FMa0IsTUFBTSxRQUFRLElBQzlCLE1BQU0sS0FBS0EsRUFBa0IsT0FBTyxDQUFDLEVBQUUsSUFDcEN2QixHQUFZRCxFQUFTQyxFQUFTLENBQUUsS0FBTSxnQkFBaUIsUUFBQXZELENBQVEsRUFBR3hELEVBQW9CLENBQ3pGLENBQ0YsQ0FFRixFQUNNdUksR0FBdUIsTUFBT3hCLEVBQVN2RCxJQUFZLENBQ3ZELEdBQUksQ0FDRixPQUFPLE1BQU1zRCxFQUFTQyxFQUFTLENBQUUsS0FBTSx5QkFBMEIsUUFBQXZELENBQVEsRUFBRzJCLEVBQXVCLENBQ3JHLE9BQVM1SCxFQUFPLENBQ2QsY0FBUSxNQUFNLGtEQUFtREEsRUFBTyxLQUFLLFVBQVVBLENBQUssQ0FBQyxFQUN2RkEsQ0FDUixDQUNGLEVBQ01pTCxHQUFnQixNQUFPekIsRUFBU3ZELElBQzdCLE1BQU1zRCxFQUFTQyxFQUFTLENBQUUsS0FBTSx1QkFBd0IsUUFBQXZELENBQVEsRUFBRzRCLEVBQXFCLEVBRTNGcUQsR0FBa0IsTUFBTzFCLEVBQVN2RCxJQUMvQixNQUFNc0QsRUFBU0MsRUFBUyxDQUFFLEtBQU0sV0FBWSxRQUFBdkQsQ0FBUSxFQUFHMkIsRUFBdUIsRUFFakZ1RCxHQUF1QixJQUN2QkMsR0FBc0IsTUFBT0MsRUFBUUMsSUFBZ0IsQ0FDekQsUUFBUSxJQUFJQSxDQUFXLEVBUXZCLE1BQU1DLEVBQWdCLE1BUEhqTixHQUFPLGVBQWUsQ0FDdkMsT0FBQStNLEVBQ0EsTUFBTyxHQUNQLFFBQVNGLEdBQ1QsWUFBYSxHQUVmLENBQUMsRUFDc0MsUUFFdkMsT0FEZSxNQUFNNUIsRUFBU2dDLEVBQWUsQ0FBRSxLQUFNLGlCQUFrQixFQUFHM0ksRUFBcUIsR0FDakYsTUFDaEIsRUFFTTRJLEVBQW9DQyxHQUNqQyxNQUFPQyxHQUFXLENBQ3ZCLEdBQUksQ0FDRkEsRUFBTyxjQUFjLGtCQUFrQixFQUN2QyxNQUFNQyxFQUFhLE1BQU1GLEVBQWNDLENBQU0sRUFDN0MsR0FBSUMsRUFBVyxPQUFTLFFBQ3RCRCxFQUFPLGNBQWMsNEJBQTRCQyxFQUFXLE9BQU8saUJBQWlCLFVBQzNFQSxFQUFXLE9BQVMsV0FDN0JELEVBQU8sY0FBYyxrQkFDbkJDLEVBQVcsT0FBTyxhQUNsQkEsRUFBVyxPQUFPLGlCQUNsQkEsRUFBVyxPQUFPLFdBQ3BCLE1BRUEsT0FBTSxJQUFJLE1BQU0sbUJBQW1CQSxDQUFVLEVBQUUsQ0FFbkQsT0FBUzNMLEVBQU8sQ0FDZCxNQUFBMEwsRUFBTyxjQUFjLGdCQUFnQmxNLEdBQWdCUSxDQUFLLENBQUMsRUFDckRBLENBQ1IsQ0FDRixFQUVJNEwsR0FBMEJDLEdBQ3ZCLE1BQU9ILEdBQVcsQ0FDdkIsR0FBSSxDQUNGLE9BQU8sTUFBTUcsRUFBS0gsQ0FBTSxDQUMxQixPQUFTMUwsRUFBTyxDQUNkLEtBQU0sQ0FBRSxNQUFBOEwsQ0FBTSxFQUFJQyxFQUFxQixvQkFBb0IsRUFDM0QsT0FBQUQsRUFBTTlMLENBQUssRUFDSixDQUFFLFlBQWEsR0FBTyxPQUFRUixHQUFnQlEsQ0FBSyxDQUFFLENBQzlELENBQ0YsRUFFSStMLEVBQXdCQyxHQUFXLENBQ3ZDLE1BQU1DLEVBQU0sSUFBSWxNLElBQVMsQ0FDdkIsT0FBTyxRQUFXLElBQUksR0FBR3hCLEVBQU0sTUFBTSxLQUFLLE1BQU0sQ0FBQyxHQUFHQSxFQUFNLEtBQUssS0FBSyxHQUFHeU4sQ0FBTSxFQUFFLENBQUMsSUFBSyxHQUFHak0sQ0FBSSxDQUM5RixFQUNNVixFQUFNLElBQUlVLElBQVMsQ0FDdkIsT0FBTyxRQUFXLE1BQU0sR0FBR3hCLEVBQU0sSUFBSSxLQUFLLE1BQU0sQ0FBQyxHQUFHQSxFQUFNLEtBQUssS0FBSyxHQUFHeU4sQ0FBTSxFQUFFLENBQUMsSUFBSyxHQUFHak0sQ0FBSSxDQUM5RixFQUNBLE1BQU8sQ0FDTCxJQUFBa00sRUFDQSxJQUFBNU0sRUFDQSxNQUFPNE0sRUFDUCxNQUFPNU0sQ0FDVCxDQUNGLEVBRU0sQ0FBRSxNQUFPNk0sR0FBUyxNQUFPQyxFQUFRLEVBQUlKLEVBQXFCLFFBQVEsRUFDbEVLLEVBQW1DaE4sR0FBYSxDQUNwRCxHQUFJQSxFQUFTLGdCQUFnQixTQUFXLEVBQ3RDLE1BQU0sSUFBSSxNQUFNLDRDQUE0Q0EsRUFBUyxnQkFBZ0IsTUFBTSxFQUFFLEVBRS9GLE1BQU8sQ0FBRSxrQkFBbUJBLEVBQVMsZ0JBQWdCLENBQUMsRUFBRSxFQUFHLENBQzdELEVBQ01pTixHQUFzQixDQUFDQyxFQUFTQyxJQUFhLENBQ2pELE1BQU1DLEVBQU1GLEVBQVEsS0FBTUcsR0FBU0YsRUFBUyxVQUFVRSxDQUFJLEVBQUUsT0FBTyxFQUNuRSxHQUFJLENBQUNELEVBQ0gsTUFBQUwsR0FBUSx1Q0FBd0NHLENBQU8sRUFDakQsSUFBSSxNQUFNLHlCQUF5QixFQUUzQyxPQUFPQyxFQUFTLE1BQU1DLENBQUcsQ0FDM0IsRUFFTSxDQUFFLE1BQU9FLEdBQVMsTUFBT0MsRUFBUSxFQUFJWixFQUFxQixXQUFXLEVBQ3JFYSxFQUFnQyxDQUFDQyxFQUFrQkMsSUFBc0IsQ0FDN0UsTUFBTTdHLEVBQVVuRSxFQUFtQixVQUFVK0ssQ0FBZ0IsRUFDN0QsR0FBSSxDQUFDNUcsRUFBUSxRQUFTLENBQ3BCLE1BQU04RyxFQUFZOUcsRUFBUSxNQUFNLE9BQU8sRUFDakMrRyxFQUFTbEssR0FBc0JpSyxDQUFTLEVBQzlDLFNBQVcsQ0FBQzlKLEVBQVcxRCxDQUFNLElBQUssT0FBTyxRQUFReU4sQ0FBTSxFQUNyREYsRUFBa0I3SixFQUFXMUQsRUFBUTBELENBQVMsRUFFaEQsTUFBQTBKLEdBQVEsK0NBQWdESyxDQUFNLEVBQ3hELElBQUksTUFBTSw4Q0FBOEMsQ0FDaEUsQ0FDQSxPQUFPL0csRUFBUSxJQUNqQixFQUNNZ0gsR0FBOEIsQ0FBQ0MsRUFBaUJKLElBQXNCLENBQzFFLFVBQVdLLEtBQWtCRCxFQUMzQixHQUFJQyxFQUFlLFVBQVksR0FDN0IsTUFBQUEsRUFBZSxPQUFPLFFBQVNuTixHQUFVLENBQ3ZDLE1BQU1vTixFQUFTek0sR0FBYyxVQUFVWCxFQUFNLFdBQVcsRUFDeEQsR0FBSSxDQUFDb04sRUFBTyxRQUNWVCxHQUFRLDRDQUE0QzNNLEVBQU0sV0FBVyxFQUFFLE1BQ2xFLENBQ0wsTUFBTWlELEVBQVltSyxFQUFPLEtBQ3pCTixFQUFrQjdKLEVBQVdqRCxFQUFNLE1BQU0sQ0FDM0MsQ0FDRixDQUFDLEVBQ0QwTSxHQUFRLGlEQUFpRCxLQUFLLFVBQVVTLEVBQWUsTUFBTSxDQUFDLEVBQUUsRUFDMUYsSUFBSSxNQUFNLDZDQUE2QyxDQUduRSxFQUVNRSxHQUF5QixzQkFDekIsQ0FBRSxNQUFPQyxFQUFTLE1BQU9DLEVBQVEsRUFBSXhCLEVBQXFCLGFBQWEsRUFDdkV5QixHQUFnQnBQLEVBQUksRUFBRSxPQUFPLENBQ2pDLFNBQVVBLEVBQUksRUFBRSxRQUFRLGFBQWEsRUFDckMsZUFBZ0JBLEVBQUksRUFBRSxRQUFRLFFBQVEsRUFDdEMsU0FBVUEsRUFBSSxFQUFFLE9BQU8sQ0FDckIsVUFBV0EsRUFBSSxFQUFFLE9BQU8sQ0FDMUIsQ0FBQyxDQUNILENBQUMsRUFDS3FQLEdBQWdDclAsRUFBSSxFQUFFLE1BQzFDQSxFQUFJLEVBQUUsT0FBTyxDQUNYLG1CQUFvQkEsRUFBSSxFQUFFLE9BQU8sQ0FDbkMsQ0FBQyxDQUNILEVBQUUsT0FBTyxDQUFDLEVBQ0pzUCxHQUFxQjlCLEdBQ3pCLE1BQU8sQ0FBRSxRQUFBK0IsRUFBUyxjQUFBQyxDQUFjLElBQU0sQ0FDcEMsTUFBTUMsRUFBYUYsRUFBUSxpQkFBaUIsV0FDNUNMLEVBQVEsaURBQWlELEVBQ3pELE1BQU1RLEVBQWdCekIsR0FBb0JzQixFQUFRLHVCQUF3QkgsRUFBYSxFQUN2RkYsRUFBUSw4QkFBOEIsRUFDdEMsTUFBTVMsRUFBbUIsTUFBTSxLQUFLSixFQUFRLGVBQWUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUNoRUssRUFBVSxNQUFNaEUsRUFBVytELENBQWdCLEVBQzNDbEQsRUFBY21ELEVBQVEsT0FBUyxRQUNyQ1YsRUFBUSw2QkFBNkIsRUFDckMsTUFBTVcsRUFBaUIsTUFBTXJELEdBQXlCbUQsRUFBa0JDLEVBQVEsTUFBT25ELEVBQWEsTUFBTSxFQUNwRyxDQUFFLFNBQUFxRCxFQUFVLE9BQUFySyxDQUFPLEVBQUksTUFBTUgsR0FBcUJvSyxFQUFjLFNBQVMsVUFBVyxDQUN4RixLQUFNLFFBQ04sU0FBVUcsRUFBZSxTQUN6QixtQkFBb0IsY0FDcEIsc0JBQXVCLFFBQ3pCLENBQUMsRUFDRFgsRUFBUSw4QkFBOEIsRUFDdEMsTUFBTWEsRUFBeUJELEVBQVMsT0FBTyxrQkFBbUIsQ0FDaEUsYUFBY0wsR0FBQSxZQUFBQSxFQUFZLGFBQzFCLGVBQWdCLENBQ2QsVUFBVyxRQUNYLFNBQVUsUUFDVixVQUFXLFFBQ1gsT0FBUSxPQUNWLENBQ0YsQ0FBQyxFQUNLTyxFQUFjLElBQU0sQ0FDeEJELEVBQXVCLE1BQU0sSUFBSWQsRUFBc0IsRUFBRSxDQUMzRCxFQUNNZ0IsRUFBaUIsSUFBTSxDQUMzQkYsRUFBdUIsUUFBUSxDQUNqQyxFQUNBLE9BQUlOLEdBQUEsTUFBQUEsRUFBWSxpQkFDZFAsRUFBUSw0REFBNEQsR0FFcEVBLEVBQVEsZ0NBQWdDLEVBQ3hDYyxFQUFZLEdBRWRELEVBQXVCLEdBQUcsUUFBUyxNQUFPaEksR0FBVSxDQUVsRCxHQURBbUgsRUFBUSw0QkFBNEIsRUFDaENPLEdBQUEsTUFBQUEsRUFBWSxvQkFFVixDQURpQixNQUFNQSxFQUFXLG1CQUFtQixFQUN0QyxDQUNqQlAsRUFBUSxrREFBa0QsRUFDMUQsTUFDRixDQUVGbkgsRUFBTSxRQUFRLENBQ2hCLENBQUMsRUFDRGdJLEVBQXVCLEdBQUcsVUFBVyxNQUFPaEksR0FBVSxDQUNwRG1ILEVBQVEsK0JBQWdDbkgsQ0FBSyxFQUM3QyxNQUFNRyxFQUFTLE1BQU16QyxFQUFPLG9CQUFvQixDQUM5QyxTQUFBcUssRUFDQSxPQUFRLENBQ04sZ0JBQWlCL0gsRUFBTSxjQUN6QixDQUNGLENBQUMsRUFDR0csRUFBTyxPQUNUaUgsR0FBUSxRQUFTakgsRUFBTyxLQUFLLEVBQzdCc0gsRUFBYyxnQkFBZ0J0SCxFQUFPLE1BQU0sU0FBVywyQkFBMkIsSUFFakZnSCxFQUFRLGdCQUFpQmhILEVBQU8sYUFBYSxFQUM3Q2dJLEVBQVMsV0FBVyxJQUFJLENBQ3RCLFFBQUFYLEVBQ0Esc0JBQXVCRyxFQUN2QixpQkFBa0J4SSxFQUF5QnFJLEVBQVEsT0FBTyxFQUMxRCxjQUFBQyxFQUNBLGFBQWMsQ0FBRSxTQUFVdEgsRUFBTyxhQUFjLEVBQy9DLFdBQVksQ0FBRSxZQUFhLEVBQUssQ0FDbEMsQ0FBQyxFQUVMLENBQUMsRUFDTSxDQUNMLFlBQWEsR0FDYixXQUFZLENBQ1YsWUFBQThILEVBQ0EsZUFBQUMsRUFDQSxxQkFBc0IsU0FBWSxNQUFNRSxHQUFvQmxCLEVBQXNCLENBQ3BGLENBQ0YsQ0FDRixDQUNGLEVBQ01tQixHQUFvQmhELEVBQ3hCLE1BQU8sQ0FDTCxRQUFBbUMsRUFDQSxzQkFBQWMsRUFDQSxpQkFBQTVCLEVBQ0EsY0FBQWUsRUFDQSxhQUFBYyxDQUNGLElBQU0sQ0FDSnBCLEVBQVEsMkJBQTJCLEVBQ25DLE1BQU1TLEVBQW1CLE1BQU0sS0FBS0osRUFBUSxlQUFlLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFDdEVMLEVBQVEsdUNBQXVDLEVBQy9DLE1BQU1xQixFQUFlQyxHQUFnQy9CLEVBQWtCNkIsRUFBYSxRQUFRLEVBQ3RGRyxFQUFtQmpDLEVBQThCK0IsRUFBY2YsRUFBYyxpQkFBaUIsRUFDcEdOLEVBQVEsMEJBQTBCLEVBQ2xDLE1BQU13QixFQUEyQixNQUFNN0UsR0FBaUI4RCxFQUFrQixDQUN4RSxpQkFBa0JVLEVBQXNCLFNBQ3hDLHdCQUF5QkEsRUFDekIscUJBQXNCQyxFQUFhLFNBQVMsRUFDOUMsQ0FBQyxFQUNEcEIsRUFBUSw4QkFBK0J3QixDQUF3QixFQUUvRCxNQUFNQyxFQURxQnRCLEdBQThCLE1BQU1xQixFQUF5QixxQkFBcUIsRUFDbEUsQ0FBQyxFQUFFLG1CQUN4Q2QsRUFBVSxNQUFNaEUsRUFBVytELENBQWdCLEVBQ2pELEdBQUlDLEVBQVEsT0FBUyxRQUFTLENBQzVCVixFQUFRLHdCQUF3QixFQUNoQyxNQUFNekksRUFBZ0IsTUFBTXVGLEVBQW1CMkQsRUFBa0IsQ0FDL0QsYUFBY0MsRUFBUSxNQUN0QixrQkFBbUJlLENBQ3JCLENBQUMsRUFFRCxNQUFPLENBQUUsS0FBTSxRQUFTLE9BREszQyxFQUFnQ3ZILENBQWEsQ0FDckIsQ0FDdkQsS0FBTyxDQUNMeUksRUFBUSxtQkFBbUIsRUFDM0IsTUFBTTBCLEVBQWtCLENBQ3RCLGFBQWNoQixFQUFRLE1BQ3RCLGNBQWUsQ0FDYixjQUFlUyxFQUFzQixRQUN2QyxFQUNBLGVBQWdCSSxFQUFpQnhPLEVBQVUsS0FBSyxFQUNoRCxrQkFBbUJ3TyxFQUFpQnhPLEVBQVUsUUFBUSxFQUN0RCxpQkFBa0J3TyxFQUFpQnhPLEVBQVUsT0FBTyxFQUNwRCxlQUFnQndPLEVBQWlCeE8sRUFBVSxjQUFjLEVBQ3pELFdBQVkyTixFQUFRLFdBQ3BCLGtCQUFtQkEsRUFBUSxrQkFDM0IsY0FBZSxHQUNmLHdCQUF5QlMsQ0FDM0IsRUFFQSxNQUFPLENBQUUsS0FBTSxXQUFZLE9BRFosTUFBTXZELEdBQWdCNkMsRUFBa0JpQixDQUFlLENBQ3BDLENBQ3BDLENBQ0YsQ0FDRixFQUNNSixHQUFrQyxDQUFDSyxFQUFZckssSUFBYSxDQXRrQ3BFLElBQUFHLEVBQUFDLEVBQUFDLEVBQUFDLEVBQUFnSyxFQXVrQ0ksTUFBTUMsRUFBUyxDQUFFLEdBQUdGLENBQVcsRUFDekIsQ0FBQ0csRUFBZ0IsR0FBR0MsQ0FBa0IsSUFBSXJLLEdBQUFELEVBQUFILEVBQVMsZ0JBQWdCLE9BQXpCLFlBQUFHLEVBQStCLFNBQS9CLFlBQUFDLEVBQXVDLE1BQU0sU0FBVSxDQUFDLEVBQ2xHc0ssRUFBZ0JELEVBQW1CLEtBQUssR0FBRyxHQUFLLE9BQ3RELE9BQUFGLEVBQU85TyxFQUFVLFVBQVUsRUFBSThPLEVBQU85TyxFQUFVLFVBQVUsR0FBSytPLEdBQWtCLGNBQ2pGRCxFQUFPOU8sRUFBVSxTQUFTLEVBQUk4TyxFQUFPOU8sRUFBVSxTQUFTLEdBQUtpUCxHQUFpQixjQUM5RUgsRUFBTzlPLEVBQVUsS0FBSyxFQUFJOE8sRUFBTzlPLEVBQVUsS0FBSyxLQUNoRDRFLEVBQUFMLEVBQVMsT0FBVCxZQUFBSyxFQUFrQixRQUFTTCxFQUFTLGdCQUFnQixPQUFTLDZCQUM3RHVLLEVBQU85TyxFQUFVLFFBQVEsRUFBSThPLEVBQU85TyxFQUFVLFFBQVEsS0FBSzZFLEVBQUFOLEVBQVMsZ0JBQWdCLFVBQXpCLFlBQUFNLEVBQWtDLGNBQWUsUUFDNUdpSyxFQUFPOU8sRUFBVSxPQUFPLEVBQUk4TyxFQUFPOU8sRUFBVSxPQUFPLEtBQUs2TyxFQUFBdEssRUFBUyxnQkFBZ0IsVUFBekIsWUFBQXNLLEVBQWtDLFVBQVcsS0FDdEc1QixFQUFRLHFCQUFzQjZCLENBQU0sRUFDN0JBLENBQ1QsRUFDTVosR0FBdUJnQixHQUFPLElBQUksUUFBU2xMLEdBQVksQ0FDM0QsTUFBTW1MLEVBQWEsSUFBTSxDQUN2QixNQUFNQyxFQUFVLFNBQVMsZUFBZUYsQ0FBRSxFQUN0Q0UsRUFDRnBMLEVBQVFvTCxDQUFPLEVBRWYsc0JBQXNCRCxDQUFVLENBRXBDLEVBQ0FBLEVBQVcsQ0FDYixDQUFDLEVBRUtuSyxHQUFTLGltQkFFVHFLLEdBQXNCQyxHQUFRLENBQ2xDLE1BQU1DLEVBQVcsU0FBUyxjQUFjLFVBQVUsRUFDbERBLEVBQVMsVUFBWTtBQUFBO0FBQUEsUUFFakJ2SyxFQUFNO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSx1QkFLU3NLLENBQUc7QUFBQTtBQUFBO0FBQUEsSUFJdEIsTUFBTUUsRUFBTyxTQUFTLGNBQWMsS0FBSyxFQUNuQ0MsRUFBYUQsRUFBSyxhQUFhLENBQUUsS0FBTSxNQUFPLENBQUMsRUFDckRDLEVBQVcsWUFBWUYsRUFBUyxRQUFRLFVBQVUsRUFBSSxDQUFDLEVBQ3ZELE1BQU12RSxFQUFTeUUsRUFBVyxjQUFjLGtCQUFrQixFQUNwREMsRUFBZUQsRUFBVyxjQUFjLGdCQUFnQixFQUM5RCxnQkFBUyxLQUFLLFlBQVlELENBQUksRUFDdkIsQ0FBRSxLQUFBQSxFQUFNLE9BQUF4RSxFQUFRLGFBQUEwRSxDQUFhLENBQ3RDLEVBRUEsU0FBU0MsR0FBYTNFLEVBQVE0RSxFQUFXM0UsRUFBYSxDQUNwRCxNQUFNNEUsRUFBZ0IsU0FBWSxDQUNoQyxHQUFJLENBQ0YsUUFBUSxJQUFJLDhCQUE4QixFQUMxQyxNQUFNQyxFQUFTLE1BQU0vRSxHQUFvQkMsRUFBUUMsQ0FBVyxFQUN4RDZFLElBQ0YsUUFBUSxJQUFJLG1EQUFtRCxFQUMvRCxRQUFRLElBQUksaUJBQWtCQSxDQUFNLEVBQ3BDLGNBQWNDLENBQWUsRUFDN0JILEVBQVVFLENBQU0sRUFFcEIsTUFBZ0IsQ0FDaEIsQ0FDRixFQUNBRCxFQUFjLEVBQ2QsTUFBTUUsRUFBa0IsWUFBWUYsRUFBZS9FLEVBQW9CLEVBQ3ZFLE9BQU9pRixDQUNULENBQ0EsU0FBU0MsR0FBYSxDQUNwQixTQUFBbkMsRUFDQSxnQkFBQWtDLEVBQ0EsUUFBQS9MLENBQ0YsRUFBRyxDQUNELE1BQU1pTSxFQUFlLElBQU0sQ0FDekIsY0FBY0YsQ0FBZSxFQUM3QmxDLEVBQVMsS0FBSyxPQUFPLEVBQ3JCN0osRUFBUTNCLEVBQWMsU0FBUyxDQUNqQyxFQUNBLE9BQUF3TCxFQUFTLGFBQWEsaUJBQWlCLFFBQVNvQyxDQUFZLEVBQzlCLElBQU0sQ0FDbENwQyxFQUFTLGFBQWEsb0JBQW9CLFFBQVNvQyxDQUFZLENBQ2pFLENBRUYsQ0FDQSxlQUFlQyxHQUFxQixDQUNsQyxJQUFBWixFQUNBLFFBQUF6SixDQUNGLEVBQUcsQ0FDRCxNQUFNZ0ksRUFBV3dCLEdBQW1CQyxDQUFHLEVBQ3ZDLE9BQU8sSUFBSSxRQUFTdEwsR0FBWSxDQUM5QixNQUFNNEwsRUFBYUUsR0FBVyxDQUM1QixXQUFXLElBQU0sQ0FDZmpDLEVBQVMsS0FBSyxPQUFPLENBQ3ZCLEVBQUcsR0FBRyxFQUNON0osRUFBUThMLENBQU0sRUFDZEssR0FBQSxNQUFBQSxHQUNGLEVBQ01KLEVBQWtCSixHQUFhOUIsRUFBUyxPQUFRK0IsRUFBVyxJQUFJLElBQUkvSixDQUFPLEVBQUUsTUFBTSxFQUNsRnNLLEVBQXdCSCxHQUFhLENBQ3pDLFNBQUFuQyxFQUNBLGdCQUFBa0MsRUFDQSxRQUFBL0wsQ0FDRixDQUFDLENBQ0gsQ0FBQyxDQUNILENBRUEsS0FBTSxDQUFFLE1BQU9vTSxFQUFTLE1BQU9DLEVBQVEsRUFBSTNFLEVBQXFCLFdBQVcsRUFDckUsQ0FBRSxNQUFPNEUsRUFBWSxFQUFJNUUsRUFBcUIsV0FBVyxFQUN6RDZFLEdBQWtCcEYsRUFDdEIsTUFBTyxDQUFFLFFBQUFtQyxFQUFTLHNCQUFBYyxFQUF1QixpQkFBQTVCLEVBQWtCLGNBQUFlLENBQWMsSUFBTSxDQWxyQ25GLElBQUE3SSxFQW1yQ00wTCxFQUFRLDhCQUErQixDQUFFLHNCQUFBaEMsQ0FBc0IsQ0FBQyxFQUNoRSxNQUFNVixFQUFtQixNQUFNLEtBQUtKLEVBQVEsZUFBZSxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQ2hFSyxFQUFVLE1BQU1oRSxFQUFXK0QsQ0FBZ0IsRUFDakQwQyxFQUFRLDJDQUEyQ3pDLEVBQVEsSUFBSSxHQUFHLEVBQ2xFLE1BQU1hLEVBQW1CakMsRUFBOEJDLEVBQWtCZSxFQUFjLGlCQUFpQixFQUN4RzZDLEVBQVEsMkNBQTJDOUMsRUFBUSxpQkFBaUIsR0FBRyxFQUMvRSxNQUFNa0QsRUFBc0IsTUFBTS9GLEdBQTZCNkMsRUFBUSxlQUFnQixDQUNyRixXQUFZQSxFQUFRLGlCQUN0QixDQUFDLEVBQ0RWLEdBQTRCNEQsRUFBcUJqRCxFQUFjLGlCQUFpQixFQUNoRixNQUFNa0QsRUFBdUIsQ0FDM0IsV0FBWW5ELEVBQVEsa0JBQ3BCLHdCQUF5QmMsRUFDekIsb0JBQXFCSSxDQUN2QixFQUNBLEdBQUksQ0FDRixHQUFJYixFQUFRLE9BQVMsUUFBUyxDQUM1QnlDLEVBQVEsOENBQThDekMsRUFBUSxLQUFLLEdBQUcsRUFDdEUsTUFBTTFILEVBQVMsTUFBTTJFLEdBQWM4QyxFQUFrQitDLENBQW9CLEVBQ3pFLE9BQUFMLEVBQVEsMENBQTBDbkssRUFBTyxpQkFBaUIsR0FBRyxFQUN0RSxDQUFFLEtBQU0sUUFBUyxPQUFBQSxDQUFPLENBQ2pDLEtBQU8sQ0FDTG1LLEVBQVEsb0VBQW9FOUMsRUFBUSxpQkFBaUIsR0FBRyxFQUN4RyxNQUFNckgsRUFBUyxNQUFNMEUsR0FBcUIrQyxFQUFrQitDLENBQW9CLEVBQ2hGLE9BQUFMLEVBQVEsb0NBQW9DLEVBQ3JDLENBQUUsS0FBTSxXQUFZLE9BQUFuSyxDQUFPLENBQ3BDLENBQ0YsT0FBU3RHLEVBQU8sQ0FDZCxHQUFJQSxhQUFpQnFKLElBQ2ZySixFQUFNLHVCQUF5QixlQUFnQixDQUNqRHlRLEVBQVEsdURBQXVELEVBQy9EQSxFQUFRLHlCQUEwQnpRLEVBQU0sU0FBUyxPQUFPLEVBQ3hELE1BQU0rUSxJQUFtQmhNLEVBQUEvRSxFQUFNLFNBQVMsVUFBZixZQUFBK0UsRUFBeUIsNkJBQThCLE9BQzFFaU0sRUFBZ0IsTUFBTTlHLEdBQXNCNkQsRUFBa0IrQyxDQUFvQixFQVF4RixHQVBBTCxFQUFRLDZCQUE2Qk0sQ0FBZ0IsRUFBRSxFQUN2RE4sRUFBUSx5QkFBMEJPLENBQWEsRUFDM0NELEVBQ0YsTUFBTUUsR0FBZ0JELEVBQWVyRCxFQUFRLE9BQU8sRUFFcEQsTUFBTXVELEdBQWdCRixDQUFhLEVBRWpDaEQsRUFBUSxPQUFTLFFBQVMsQ0FDNUJ5QyxFQUFRLHdDQUF3Q08sRUFBYyxRQUFRLEdBQUcsRUFDekUsTUFBTW5NLEVBQWdCLE1BQU11RixFQUFtQjJELEVBQWtCLENBQy9ELGFBQWNDLEVBQVEsTUFDdEIsa0JBQW1CZ0QsRUFBYyxRQUNuQyxDQUFDLEVBQ0RQLEVBQVEsaURBQWtENUwsQ0FBYSxFQUN2RSxNQUFNc00sRUFBdUIvRSxFQUFnQ3ZILENBQWEsRUFDMUUsT0FBQTRMLEVBQVEsMENBQTBDVSxFQUFxQixpQkFBaUIsR0FBRyxFQUNwRixDQUFFLEtBQU0sUUFBUyxPQUFRQSxDQUFxQixDQUN2RCxLQUFPLENBQ0xWLEVBQVEsd0NBQXdDTSxFQUFtQixNQUFRLFFBQVEsR0FBRyxFQUN0RixNQUFNekssRUFBUyxNQUFNMEUsR0FBcUIrQyxFQUFrQixDQUMxRCxHQUFHK0MsRUFDSCxrQkFBbUJFLEVBQWMsU0FDakMsMEJBQTJCLENBQUNELENBQzlCLENBQUMsRUFDRCxPQUFBTixFQUFRLG9DQUFvQyxFQUNyQyxDQUFFLEtBQU0sV0FBWSxPQUFBbkssQ0FBTyxDQUNwQyxDQUNGLENBRUYsTUFBQW9LLEdBQVEsdUNBQXVDLEVBQy9DQSxHQUFRMVEsQ0FBSyxFQUNQQSxDQUNSLENBQ0YsQ0FDRixFQUNNb1IsR0FBb0NoUyxHQUFhLENBQ3JELE1BQU1pUyxFQUFlalMsRUFBUyxzQkFBc0IsS0FBTWtTLEdBQVdBLEVBQU8sT0FBUyxZQUFZLEVBQ2pHLEdBQUksQ0FBQ0QsRUFDSCxNQUFNLElBQUksTUFBTSw0QkFBNEIsRUFFOUMsT0FBT25PLEdBQTRCLE1BQU1tTyxDQUFZLENBQ3ZELEVBQ01FLEdBQW9DblMsR0FBYSxDQUNyRCxNQUFNb1MsRUFBZXBTLEVBQVMsc0JBQXNCLEtBQU1rUyxHQUFXQSxFQUFPLE9BQVMsMkJBQTJCLEVBQ2hILEdBQUksQ0FBQ0UsRUFDSCxNQUFNLElBQUksTUFBTSw0QkFBNEIsRUFFOUMsT0FBTzNPLEdBQTRCLE1BQU0yTyxDQUFZLENBQ3ZELEVBQ01QLEdBQWtCLE1BQU9ELEVBQWU5SyxJQUFZLENBQ3hELE1BQU12QixFQUFxQjRNLEdBQWlDUCxDQUFhLEVBQ3pFUCxFQUFRLGlDQUFpQzlMLEVBQW1CLFlBQVksR0FBRyxFQUMzRSxNQUFNd0wsRUFBUyxNQUFNSSxHQUFxQixDQUFFLElBQUs1TCxFQUFtQixhQUFjLFFBQUF1QixDQUFRLENBQUMsRUFFM0YsR0FEQXVLLEVBQVEseUNBQXlDTixDQUFNLEdBQUcsRUFDdERBLElBQVd6TixFQUFjLFVBQzNCLE1BQU0sSUFBSSxNQUFNLDRCQUE0QixFQUU5QyxHQUFJeU4sSUFBV3pOLEVBQWMsUUFDM0IsTUFBTSxJQUFJLE1BQU0seUJBQXlCLENBRTdDLEVBQ013TyxHQUFrQixNQUFPRixHQUFrQixDQUMvQyxNQUFNck0sRUFBcUJ5TSxHQUFpQ0osQ0FBYSxFQUN6RUwsR0FBWSwyQ0FBMkNoTSxFQUFtQixjQUFjLFVBQVUsRUFBRyxDQUFDLENBQUMsTUFBTSxFQUM3RyxNQUFNRyxHQUEwQkgsQ0FBa0IsRUFDbERnTSxHQUFZLDBDQUEwQyxDQUN4RCxFQUVNLENBQUUsTUFBT2MsRUFBUyxNQUFPQyxFQUFRLEVBQUkzRixFQUFxQixXQUFXLEVBQ3JFNEYsR0FBY3ZULEVBQUksRUFBRSxPQUFPLENBQy9CLFNBQVVBLEVBQUksRUFBRSxNQUFNLENBQUNBLEVBQUksRUFBRSxRQUFRLFdBQVcsRUFBR0EsRUFBSSxFQUFFLFFBQVEsWUFBWSxDQUFDLENBQUMsRUFDL0UsZUFBZ0JBLEVBQUksRUFBRSxRQUFRLFFBQVEsRUFDdEMsU0FBVUEsRUFBSSxFQUFFLE9BQU8sQ0FDckIsVUFBV0EsRUFBSSxFQUFFLE9BQU8sQ0FDMUIsQ0FBQyxDQUNILENBQUMsRUFDS3dULEdBQW1CaEcsR0FDdkIsTUFBTyxDQUFFLFFBQUErQixDQUFRLElBQU0sQ0FDckI4RCxFQUFRLGlEQUFpRCxFQUN6RCxNQUFNaEQsRUFBd0JwQyxHQUFvQnNCLEVBQVEsdUJBQXdCZ0UsRUFBVyxFQUM3RkYsRUFBUSxnQ0FBZ0MsRUFDeEMsTUFBTTFELEVBQW1CLE1BQU0sS0FBS0osRUFBUSxlQUFlLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFDaEVLLEVBQVUsTUFBTWhFLEVBQVcrRCxDQUFnQixFQUMzQ2xELEVBQWNtRCxFQUFRLE9BQVMsUUFDckN5RCxFQUFRLGdDQUFnQyxFQUN4QyxNQUFNeEQsRUFBaUIsTUFBTXJELEdBQXlCbUQsRUFBa0JDLEVBQVEsTUFBT25ELEVBQWEsTUFBTSxFQUNwR2dILEVBQUssTUFBTS9OLEdBQ2YySyxFQUFzQixTQUFTLFVBQy9CUixFQUFlLFdBQ2ZBLEVBQWUsU0FDZnBELENBQ0YsRUFDQTRHLEVBQVEsOEJBQThCLEVBQ3RDLE1BQU1LLEVBQWlCLE1BQU1ELEVBQUcsZUFBZSxFQUMvQyxPQUFJQyxJQUFtQixNQUNyQkosR0FBUSw4QkFBOEIsRUFDL0IsQ0FBRSxZQUFhLEdBQU8sT0FBUSw4QkFBK0IsSUFFdEVELEVBQVEsNERBQTZESyxDQUFjLEVBQzVFLENBQ0wsWUFBYSxHQUNiLEdBQUFELEVBQ0EsbUJBQW9CLENBQ2xCLFNBQVVDLEVBQWUsU0FDekIsVUFBV0EsRUFBZSxTQUM1QixDQUNGLEVBQ0YsQ0FDRixFQUNNQyxHQUFrQnZHLEVBQ3RCLE1BQU8sQ0FDTCxRQUFBbUMsRUFDQSxzQkFBQWMsRUFDQSxpQkFBQTVCLEVBQ0EsY0FBQWUsRUFDQSxhQUFBYyxFQUNBLFdBQUFzRCxDQUNGLElBQU0sQ0FFSixHQURBUCxFQUFRLDJCQUEyQixFQUMvQi9DLEVBQWEsV0FBYUQsRUFBc0IsU0FDbEQsTUFBTSxJQUFJLE1BQU0sK0JBQStCQyxFQUFhLFFBQVEsU0FBU0QsRUFBc0IsUUFBUSxFQUFFLEVBRS9HLE1BQU1WLEVBQW1CLE1BQU0sS0FBS0osRUFBUSxlQUFlLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFDaEVrRSxFQUFLRyxFQUFXLEdBQ3RCLEdBQUl0RCxHQUFBLE1BQUFBLEVBQWMsdUJBQXdCLENBQ3hDLE1BQU11RCxFQUFXdkQsRUFBYSx1QkFDOUIrQyxFQUFRLDRCQUE2QlEsQ0FBUSxFQUM3Q0MsR0FBbUJMLEVBQUlJLEVBQVMsT0FBUUEsRUFBUyxPQUFPLENBQzFELENBQ0FSLEVBQVEsc0JBQXNCLEVBQzlCSSxFQUFHLEtBQUssRUFDUixNQUFNTSxFQUFxQixNQUFNN04sR0FBOEJ1TixDQUFFLEVBQ2pFSixFQUFRLHlCQUEwQlUsQ0FBa0IsRUFDcERWLEVBQVEsdUNBQXVDLEVBQy9DLE1BQU05QyxFQUFleUQsR0FBZ0N2RixFQUFrQnNGLENBQWtCLEVBQ25GdEQsRUFBbUJqQyxFQUE4QitCLEVBQWNmLEVBQWMsaUJBQWlCLEVBQ3BHNkQsRUFBUSw4Q0FBOEMsRUFDdEQsTUFBTTNDLEVBQTJCLE1BQU0zRSxHQUFzQjRELEVBQWtCLENBQzdFLE9BQVFjLEVBQ1Isc0JBQUFKLENBQ0YsQ0FBQyxFQUNLOUosRUFBcUIwTixHQUEwQnZELENBQXdCLEVBQzdFMkMsRUFBUSw4QkFBOEIsRUFDdEMsTUFBTS9NLEdBQWtCQyxFQUFvQndOLENBQWtCLEVBQzlELE1BQU1uRSxFQUFVLE1BQU1oRSxFQUFXK0QsQ0FBZ0IsRUFDakQsR0FBSUMsRUFBUSxPQUFTLFFBQVMsQ0FDNUJ5RCxFQUFRLHNDQUFzQyxFQUM5QyxNQUFNNU0sRUFBZ0IsTUFBTXVGLEVBQW1CMkQsRUFBa0IsQ0FDL0QsYUFBY0MsRUFBUSxLQUN4QixDQUFDLEVBRUQsTUFBTyxDQUFFLEtBQU0sUUFBUyxPQURLNUIsRUFBZ0N2SCxDQUFhLENBQ3JCLENBQ3ZELEtBQU8sQ0FDTDRNLEVBQVEsd0JBQXdCLEVBQ2hDLE1BQU16QyxFQUFrQixDQUN0QixhQUFjaEIsRUFBUSxNQUN0QixjQUFlLENBQ2IsY0FBZVMsRUFBc0IsUUFDdkMsRUFDQSxlQUFnQkksRUFBaUJ4TyxFQUFVLEtBQUssRUFDaEQsa0JBQW1Cd08sRUFBaUJ4TyxFQUFVLFFBQVEsRUFDdEQsaUJBQWtCd08sRUFBaUJ4TyxFQUFVLE9BQU8sRUFDcEQsZUFBZ0J3TyxFQUFpQnhPLEVBQVUsY0FBYyxFQUN6RCxXQUFZMk4sRUFBUSxXQUNwQixrQkFBbUJBLEVBQVEsa0JBQzNCLGNBQWUsR0FDZix3QkFBeUJTLENBQzNCLEVBRUEsTUFBTyxDQUFFLEtBQU0sV0FBWSxPQURaLE1BQU12RCxHQUFnQjZDLEVBQWtCaUIsQ0FBZSxDQUNwQyxDQUNwQyxDQUNGLENBQ0YsRUFDTW9ELEdBQWtDLENBQUNuRCxFQUFZcUQsSUFBZ0IsQ0FsNEN2RSxJQUFBdk4sRUFBQUMsRUFBQUMsRUFBQUMsRUFtNENJLE1BQU1pSyxFQUFTLENBQUUsR0FBR0YsQ0FBVyxFQUN6QixDQUFDRyxFQUFnQixHQUFHQyxDQUFrQixJQUFJckssR0FBQUQsRUFBQXVOLEVBQVksWUFBWixZQUFBdk4sRUFBdUIsU0FBdkIsWUFBQUMsRUFBK0IsTUFBTSxTQUFVLENBQUMsRUFDMUZzSyxFQUFnQkQsRUFBbUIsS0FBSyxHQUFHLEdBQUssT0FDdEQsT0FBQUYsRUFBTzlPLEVBQVUsVUFBVSxFQUFJOE8sRUFBTzlPLEVBQVUsVUFBVSxHQUFLK08sR0FBa0IsY0FDakZELEVBQU85TyxFQUFVLFNBQVMsRUFBSThPLEVBQU85TyxFQUFVLFNBQVMsR0FBS2lQLEdBQWlCLGNBQzlFSCxFQUFPOU8sRUFBVSxLQUFLLEVBQUk4TyxFQUFPOU8sRUFBVSxLQUFLLEdBQUtpUyxFQUFZLFlBQWMsNkJBQy9FbkQsRUFBTzlPLEVBQVUsUUFBUSxFQUFJOE8sRUFBTzlPLEVBQVUsUUFBUSxLQUFLNEUsRUFBQXFOLEVBQVksa0JBQVosWUFBQXJOLEVBQTZCLGFBQWMsUUFDdEdrSyxFQUFPOU8sRUFBVSxPQUFPLEVBQUk4TyxFQUFPOU8sRUFBVSxPQUFPLEtBQUs2RSxFQUFBb04sRUFBWSxrQkFBWixZQUFBcE4sRUFBNkIsVUFBVyxLQUNqR3VNLEVBQVEscUJBQXNCdEMsQ0FBTSxFQUM3QkEsQ0FDVCxFQUNNK0MsR0FBcUIsQ0FBQ0wsRUFBSVUsRUFBUUMsSUFBYyxDQUNwRFgsRUFBRyxPQUFPLENBQ1IsTUFBTyxDQUNMLE9BQVFVLEVBQU8sV0FDZixNQUFPLFFBQ1AsUUFBU0MsQ0FDWCxFQUNBLFNBQVVELEVBQU8sUUFDbkIsQ0FBQyxDQUNILEVBQ01GLEdBQTZCalQsR0FBYSxDQUM5QyxHQUFJQSxFQUFTLHNCQUFzQixTQUFXLEVBQzVDLE1BQU0sSUFBSSxNQUFNO0FBQUEsZUFDUEEsRUFBUyxzQkFBc0IsTUFBTSx3QkFBd0IsRUFFeEUsT0FBTytELEdBQWlDLE1BQU0vRCxFQUFTLHNCQUFzQixDQUFDLENBQUMsQ0FDakYsRUFFTXFULEdBQWtDLENBQUNDLEVBQU1DLEVBQWNDLElBQWtCLENBQzdFLE1BQU1DLEVBQVVILEVBQUssT0FBUWxHLEdBRUhBLEVBQUksV0FBYW1HLENBRTFDLEVBQ0QsR0FBSUUsRUFBUSxTQUFXLEVBQ3JCLGNBQVEsTUFBTSxZQUFhSCxDQUFJLEVBQ3pCLElBQUksTUFBTSxnQ0FBZ0NDLENBQVksb0JBQW9CQyxDQUFhLEdBQUcsRUFFbEcsR0FBSUMsRUFBUSxTQUFXLEVBQ3JCLGNBQVEsTUFBTSxZQUFhSCxDQUFJLEVBQ3pCLElBQUksTUFBTSwwQ0FBMENDLENBQVksb0JBQW9CQyxDQUFhLEdBQUcsRUFFNUcsT0FBT0MsRUFBUSxDQUFDLENBQ2xCLEVBQ012RSxFQUFXLENBR2YsU0FBVSxDQUNSLElBQUtzQyxFQUNQLEVBRUEsU0FBVSxDQUNSLEtBQU1nQixHQUNOLElBQUtHLEVBQ1AsRUFDQSxXQUFZLENBQ1YsS0FBTXJFLEdBQ04sSUFBS2MsRUFDUCxDQUdGLEVBRUEsU0FBU3NFLEdBQXlCQyxFQUFHLENBQ3BDLE9BQU9BLEdBQUtBLEVBQUUsWUFBYyxPQUFPLFVBQVUsZUFBZSxLQUFLQSxFQUFHLFNBQVMsRUFBSUEsRUFBRSxRQUFhQSxDQUNqRyxDQUVBLElBQUlDLEVBQWUsQ0FBQyxFQUVwQixPQUFPLGVBQWVBLEVBQWMsYUFBYyxDQUNoRCxNQUFPLEVBQ1QsQ0FBQyxFQUNEQSxFQUFhLFdBQWEsT0FHMUIsTUFBTUMsR0FBWUMsR0FBUSxFQUFRLE9BQU9BLENBQUksRUFFdkNDLEVBQVlELEdBQVFELEdBQVVDLENBQUksRUFBSSxPQUFPQSxDQUFJLEVBQUksS0FBT0EsRUFFNURFLEdBQWlCRCxFQUFVLFVBQVUsRUFDckNFLEVBQW1CRixFQUFVLFlBQVksRUFDekNHLEdBQWdCSCxFQUFVLFNBQVMsRUFFekMsU0FBU0ksRUFBVTdULEVBQUtWLEVBQUssQ0FDM0IsSUFBSWdFLEVBQVF0RCxFQUFJVixDQUFHLEVBQ25CLEdBQUlnRSxHQUFTLEtBQ2IsSUFBSSxPQUFPQSxHQUFVLFdBQVksTUFBTSxJQUFJLFVBQVVBLEVBQVEsb0JBQW9CLEVBQ2pGLE9BQU9BLEVBQ1QsQ0FFQSxTQUFTd1EsRUFBVzlULEVBQUssQ0FDdkIsSUFBSStULEVBQU8vVCxFQUFJLFlBRWYsT0FBSStULElBQVMsU0FDWEEsRUFBT0EsRUFBS0gsRUFBYSxFQUVyQkcsSUFBUyxPQUNYQSxFQUFPLFNBSUpBLElBQVMsT0FBWUEsRUFBT0MsQ0FDckMsQ0FFQSxTQUFTQyxHQUFhWixFQUFHLENBQ3ZCLE9BQU9BLGFBQWFXLENBQ3RCLENBRUEsU0FBU0UsRUFBZ0JuVSxFQUFHLENBQ3RCbVUsRUFBZ0IsSUFDbEJBLEVBQWdCLElBQUluVSxDQUFDLEVBRXJCLFdBQVcsSUFBTSxDQUNmLE1BQU1BLENBQ1IsQ0FBQyxDQUVMLENBRUEsU0FBU29VLEVBQVEvVCxFQUFJLENBQ25CLFFBQVEsUUFBUSxFQUFFLEtBQUssSUFBTSxDQUMzQixHQUFJLENBQ0ZBLEVBQUcsQ0FDTCxPQUFTLEVBQUcsQ0FDVjhULEVBQWdCLENBQUMsQ0FDbkIsQ0FDRixDQUFDLENBQ0gsQ0FFQSxTQUFTRSxHQUFvQkMsRUFBYyxDQUN6QyxJQUFJQyxFQUFVRCxFQUFhLFNBQzNCLEdBQUlDLElBQVksU0FDaEJELEVBQWEsU0FBVyxPQUVwQixFQUFDQyxHQUlMLEdBQUksQ0FDRixHQUFJLE9BQU9BLEdBQVksV0FDckJBLEVBQVEsTUFDSCxDQUNMLElBQUlDLEVBQWNWLEVBQVVTLEVBQVMsYUFBYSxFQUU5Q0MsR0FDRkEsRUFBWSxLQUFLRCxDQUFPLENBRTVCLENBQ0YsT0FBU3ZVLEVBQUcsQ0FDVm1VLEVBQWdCblUsQ0FBQyxDQUNuQixDQUNGLENBRUEsU0FBU3lVLEVBQWtCSCxFQUFjLENBQ3ZDQSxFQUFhLFVBQVksT0FDekJBLEVBQWEsT0FBUyxPQUN0QkEsRUFBYSxPQUFTLFFBQ3hCLENBRUEsU0FBU0ksR0FBa0JKLEVBQWMsQ0FDdkMsSUFBSUssRUFBUUwsRUFBYSxPQUV6QixHQUFLSyxFQUlMLENBQUFMLEVBQWEsT0FBUyxPQUN0QkEsRUFBYSxPQUFTLFFBRXRCLFFBQVN4USxFQUFJLEVBQUdBLEVBQUk2USxFQUFNLFNBQ3hCQyxHQUFtQk4sRUFBY0ssRUFBTTdRLENBQUMsRUFBRSxLQUFNNlEsRUFBTTdRLENBQUMsRUFBRSxLQUFLLEVBQzFEd1EsRUFBYSxTQUFXLFVBRkksRUFBRXhRLEVBRWxDLEVBRUosQ0FFQSxTQUFTOFEsR0FBbUJOLEVBQWNPLEVBQU10UixFQUFPLENBQ3JEK1EsRUFBYSxPQUFTLFVBQ3RCLElBQUlRLEVBQVdSLEVBQWEsVUFFNUIsR0FBSSxDQUNGLElBQUlTLEVBQUlqQixFQUFVZ0IsRUFBVUQsQ0FBSSxFQUVoQyxPQUFRQSxFQUFNLENBQ1osSUFBSyxPQUNDRSxHQUFHQSxFQUFFLEtBQUtELEVBQVV2UixDQUFLLEVBQzdCLE1BRUYsSUFBSyxRQUVILEdBREFrUixFQUFrQkgsQ0FBWSxFQUMxQlMsRUFBR0EsRUFBRSxLQUFLRCxFQUFVdlIsQ0FBSyxNQUFPLE9BQU1BLEVBQzFDLE1BRUYsSUFBSyxXQUNIa1IsRUFBa0JILENBQVksRUFDMUJTLEdBQUdBLEVBQUUsS0FBS0QsQ0FBUSxFQUN0QixLQUNKLENBQ0YsT0FBUzlVLEVBQUcsQ0FDVm1VLEVBQWdCblUsQ0FBQyxDQUNuQixDQUVJc1UsRUFBYSxTQUFXLFNBQVVELEdBQW9CQyxDQUFZLEVBQVdBLEVBQWEsU0FBVyxZQUFXQSxFQUFhLE9BQVMsUUFDNUksQ0FFQSxTQUFTVSxHQUFTVixFQUFjTyxFQUFNdFIsRUFBTyxDQUMzQyxHQUFJK1EsRUFBYSxTQUFXLFNBRTVCLElBQUlBLEVBQWEsU0FBVyxZQUFhLENBQ3ZDQSxFQUFhLE9BQU8sS0FBSyxDQUN2QixLQUFBTyxFQUNBLE1BQUF0UixDQUNGLENBQUMsRUFFRCxNQUNGLENBRUEsR0FBSStRLEVBQWEsU0FBVyxRQUFTLENBQ25DQSxFQUFhLE9BQVMsWUFDdEJBLEVBQWEsT0FBUyxDQUFDLENBQ3JCLEtBQUFPLEVBQ0EsTUFBQXRSLENBQ0YsQ0FBQyxFQUNENlEsRUFBUSxJQUFNTSxHQUFrQkosQ0FBWSxDQUFDLEVBQzdDLE1BQ0YsQ0FFQU0sR0FBbUJOLEVBQWNPLEVBQU10UixDQUFLLEVBQzlDLENBRUEsTUFBTTBSLEVBQWEsQ0FDakIsWUFBWUgsRUFBVUksRUFBWSxDQUdoQyxLQUFLLFNBQVcsT0FDaEIsS0FBSyxVQUFZSixFQUNqQixLQUFLLE9BQVMsT0FDZCxLQUFLLE9BQVMsZUFDZCxJQUFJSyxFQUFPLEtBQ1BDLEVBQXVCLENBQ3pCLElBQUksUUFBUyxDQUNYLE9BQU9ELEVBQUssU0FBVyxRQUN6QixFQUVBLEtBQUs1UixFQUFPLENBQ1Z5UixHQUFTRyxFQUFNLE9BQVE1UixDQUFLLENBQzlCLEVBRUEsTUFBTUEsRUFBTyxDQUNYeVIsR0FBU0csRUFBTSxRQUFTNVIsQ0FBSyxDQUMvQixFQUVBLFVBQVcsQ0FDVHlSLEdBQVNHLEVBQU0sVUFBVSxDQUMzQixDQUVGLEVBRUEsR0FBSSxDQUNGLEtBQUssU0FBV0QsRUFBVyxLQUFLLE9BQVdFLENBQW9CLENBQ2pFLE9BQVNwVixFQUFHLENBQ1ZvVixFQUFxQixNQUFNcFYsQ0FBQyxDQUM5QixDQUVJLEtBQUssU0FBVyxpQkFBZ0IsS0FBSyxPQUFTLFFBQ3BELENBRUEsSUFBSSxRQUFTLENBQ1gsT0FBTyxLQUFLLFNBQVcsUUFDekIsQ0FFQSxhQUFjLENBQ1IsS0FBSyxTQUFXLFdBQ2xCeVUsRUFBa0IsSUFBSSxFQUN0QkosR0FBb0IsSUFBSSxFQUU1QixDQUVGLENBRUEsSUFBSUosRUFBZSxNQUFNb0IsQ0FBVyxDQUNsQyxZQUFZSCxFQUFZLENBQ3RCLEdBQUksRUFBRSxnQkFBZ0JHLEdBQWEsTUFBTSxJQUFJLFVBQVUsMkNBQTJDLEVBQ2xHLEdBQUksT0FBT0gsR0FBZSxXQUFZLE1BQU0sSUFBSSxVQUFVLDJDQUEyQyxFQUNyRyxLQUFLLFlBQWNBLENBQ3JCLENBRUEsVUFBVUosRUFBVSxDQUNsQixPQUFJLE9BQU9BLEdBQWEsVUFBWUEsSUFBYSxRQUMvQ0EsRUFBVyxDQUNULEtBQU1BLEVBQ04sTUFBTyxVQUFVLENBQUMsRUFDbEIsU0FBVSxVQUFVLENBQUMsQ0FDdkIsR0FHSyxJQUFJRyxHQUFhSCxFQUFVLEtBQUssV0FBVyxDQUNwRCxDQUVBLFFBQVF6VSxFQUFJLENBQ1YsT0FBTyxJQUFJLFFBQVEsQ0FBQ3VFLEVBQVNHLElBQVcsQ0FDdEMsR0FBSSxPQUFPMUUsR0FBTyxXQUFZLENBQzVCMEUsRUFBTyxJQUFJLFVBQVUxRSxFQUFLLG9CQUFvQixDQUFDLEVBQy9DLE1BQ0YsQ0FFQSxTQUFTaVYsR0FBTyxDQUNkaEIsRUFBYSxZQUFZLEVBQ3pCMVAsRUFBUSxDQUNWLENBRUEsSUFBSTBQLEVBQWUsS0FBSyxVQUFVLENBQ2hDLEtBQUsvUSxFQUFPLENBQ1YsR0FBSSxDQUNGbEQsRUFBR2tELEVBQU8rUixDQUFJLENBQ2hCLE9BQVN0VixFQUFHLENBQ1YrRSxFQUFPL0UsQ0FBQyxFQUNSc1UsRUFBYSxZQUFZLENBQzNCLENBQ0YsRUFFQSxNQUFPdlAsRUFDUCxTQUFVSCxDQUNaLENBQUMsQ0FDSCxDQUFDLENBQ0gsQ0FFQSxJQUFJdkUsRUFBSSxDQUNOLEdBQUksT0FBT0EsR0FBTyxXQUFZLE1BQU0sSUFBSSxVQUFVQSxFQUFLLG9CQUFvQixFQUMzRSxJQUFJa1YsRUFBSXhCLEVBQVcsSUFBSSxFQUN2QixPQUFPLElBQUl3QixFQUFFVCxHQUFZLEtBQUssVUFBVSxDQUN0QyxLQUFLdlIsRUFBTyxDQUNWLEdBQUksQ0FDRkEsRUFBUWxELEVBQUdrRCxDQUFLLENBQ2xCLE9BQVN2RCxFQUFHLENBQ1YsT0FBTzhVLEVBQVMsTUFBTTlVLENBQUMsQ0FDekIsQ0FFQThVLEVBQVMsS0FBS3ZSLENBQUssQ0FDckIsRUFFQSxNQUFNdkQsRUFBRyxDQUNQOFUsRUFBUyxNQUFNOVUsQ0FBQyxDQUNsQixFQUVBLFVBQVcsQ0FDVDhVLEVBQVMsU0FBUyxDQUNwQixDQUVGLENBQUMsQ0FBQyxDQUNKLENBRUEsT0FBT3pVLEVBQUksQ0FDVCxHQUFJLE9BQU9BLEdBQU8sV0FBWSxNQUFNLElBQUksVUFBVUEsRUFBSyxvQkFBb0IsRUFDM0UsSUFBSWtWLEVBQUl4QixFQUFXLElBQUksRUFDdkIsT0FBTyxJQUFJd0IsRUFBRVQsR0FBWSxLQUFLLFVBQVUsQ0FDdEMsS0FBS3ZSLEVBQU8sQ0FDVixHQUFJLENBQ0YsR0FBSSxDQUFDbEQsRUFBR2tELENBQUssRUFBRyxNQUNsQixPQUFTdkQsRUFBRyxDQUNWLE9BQU84VSxFQUFTLE1BQU05VSxDQUFDLENBQ3pCLENBRUE4VSxFQUFTLEtBQUt2UixDQUFLLENBQ3JCLEVBRUEsTUFBTXZELEVBQUcsQ0FDUDhVLEVBQVMsTUFBTTlVLENBQUMsQ0FDbEIsRUFFQSxVQUFXLENBQ1Q4VSxFQUFTLFNBQVMsQ0FDcEIsQ0FFRixDQUFDLENBQUMsQ0FDSixDQUVBLE9BQU96VSxFQUFJLENBQ1QsR0FBSSxPQUFPQSxHQUFPLFdBQVksTUFBTSxJQUFJLFVBQVVBLEVBQUssb0JBQW9CLEVBQzNFLElBQUlrVixFQUFJeEIsRUFBVyxJQUFJLEVBQ25CeUIsRUFBVSxVQUFVLE9BQVMsRUFDN0JDLEVBQVcsR0FFWHpQLEVBRE8sVUFBVSxDQUFDLEVBRXRCLE9BQU8sSUFBSXVQLEVBQUVULEdBQVksS0FBSyxVQUFVLENBQ3RDLEtBQUt2UixFQUFPLENBQ1YsSUFBSW1TLEVBQVEsQ0FBQ0QsRUFHYixHQUZBQSxFQUFXLEdBRVAsQ0FBQ0MsR0FBU0YsRUFDWixHQUFJLENBQ0Z4UCxFQUFNM0YsRUFBRzJGLEVBQUt6QyxDQUFLLENBQ3JCLE9BQVN2RCxFQUFHLENBQ1YsT0FBTzhVLEVBQVMsTUFBTTlVLENBQUMsQ0FDekIsTUFFQWdHLEVBQU16QyxDQUVWLEVBRUEsTUFBTXZELEVBQUcsQ0FDUDhVLEVBQVMsTUFBTTlVLENBQUMsQ0FDbEIsRUFFQSxVQUFXLENBQ1QsR0FBSSxDQUFDeVYsR0FBWSxDQUFDRCxFQUFTLE9BQU9WLEVBQVMsTUFBTSxJQUFJLFVBQVUsaUNBQWlDLENBQUMsRUFDakdBLEVBQVMsS0FBSzlPLENBQUcsRUFDakI4TyxFQUFTLFNBQVMsQ0FDcEIsQ0FFRixDQUFDLENBQUMsQ0FDSixDQUVBLE1BQU0sS0FBTSxDQUNWLElBQUlhLEVBQVMsQ0FBQyxFQUNkLGFBQU0sS0FBSyxRQUFRcFMsR0FBU29TLEVBQU8sS0FBS3BTLENBQUssQ0FBQyxFQUN2Q29TLENBQ1QsQ0FFQSxVQUFVQyxFQUFTLENBQ2pCLElBQUlMLEVBQUl4QixFQUFXLElBQUksRUFDdkIsT0FBTyxJQUFJd0IsRUFBRVQsR0FBWSxDQUN2QixJQUFJUixFQUNBdUIsRUFBUSxFQUVaLFNBQVNDLEVBQVVDLEVBQU0sQ0FDdkJ6QixFQUFleUIsRUFBSyxVQUFVLENBQzVCLEtBQUtDLEVBQUcsQ0FDTmxCLEVBQVMsS0FBS2tCLENBQUMsQ0FDakIsRUFFQSxNQUFNaFcsRUFBRyxDQUNQOFUsRUFBUyxNQUFNOVUsQ0FBQyxDQUNsQixFQUVBLFVBQVcsQ0FDTDZWLElBQVVELEVBQVEsUUFDcEJ0QixFQUFlLE9BQ2ZRLEVBQVMsU0FBUyxHQUVsQmdCLEVBQVVQLEVBQUUsS0FBS0ssRUFBUUMsR0FBTyxDQUFDLENBQUMsQ0FFdEMsQ0FFRixDQUFDLENBQ0gsQ0FFQSxPQUFBQyxFQUFVLElBQUksRUFDUCxJQUFNLENBQ1B4QixJQUNGQSxFQUFhLFlBQVksRUFDekJBLEVBQWUsT0FFbkIsQ0FDRixDQUFDLENBQ0gsQ0FFQSxRQUFRalUsRUFBSSxDQUNWLEdBQUksT0FBT0EsR0FBTyxXQUFZLE1BQU0sSUFBSSxVQUFVQSxFQUFLLG9CQUFvQixFQUMzRSxJQUFJa1YsRUFBSXhCLEVBQVcsSUFBSSxFQUN2QixPQUFPLElBQUl3QixFQUFFVCxHQUFZLENBQ3ZCLElBQUltQixFQUFnQixDQUFDLEVBQ2pCQyxFQUFRLEtBQUssVUFBVSxDQUN6QixLQUFLM1MsRUFBTyxDQUNWLEdBQUlsRCxFQUNGLEdBQUksQ0FDRmtELEVBQVFsRCxFQUFHa0QsQ0FBSyxDQUNsQixPQUFTdkQsRUFBRyxDQUNWLE9BQU84VSxFQUFTLE1BQU05VSxDQUFDLENBQ3pCLENBR0YsSUFBSW1XLEVBQVFaLEVBQUUsS0FBS2hTLENBQUssRUFBRSxVQUFVLENBQ2xDLEtBQUtBLEVBQU8sQ0FDVnVSLEVBQVMsS0FBS3ZSLENBQUssQ0FDckIsRUFFQSxNQUFNdkQsRUFBRyxDQUNQOFUsRUFBUyxNQUFNOVUsQ0FBQyxDQUNsQixFQUVBLFVBQVcsQ0FDVCxJQUFJOEQsRUFBSW1TLEVBQWMsUUFBUUUsQ0FBSyxFQUMvQnJTLEdBQUssR0FBR21TLEVBQWMsT0FBT25TLEVBQUcsQ0FBQyxFQUNyQ3NTLEVBQWUsQ0FDakIsQ0FFRixDQUFDLEVBQ0RILEVBQWMsS0FBS0UsQ0FBSyxDQUMxQixFQUVBLE1BQU1uVyxFQUFHLENBQ1A4VSxFQUFTLE1BQU05VSxDQUFDLENBQ2xCLEVBRUEsVUFBVyxDQUNUb1csRUFBZSxDQUNqQixDQUVGLENBQUMsRUFFRCxTQUFTQSxHQUFpQixDQUNwQkYsRUFBTSxRQUFVRCxFQUFjLFNBQVcsR0FBR25CLEVBQVMsU0FBUyxDQUNwRSxDQUVBLE1BQU8sSUFBTSxDQUNYbUIsRUFBYyxRQUFRSSxHQUFLQSxFQUFFLFlBQVksQ0FBQyxFQUMxQ0gsRUFBTSxZQUFZLENBQ3BCLENBQ0YsQ0FBQyxDQUNILENBRUEsQ0FBQ3RDLENBQWdCLEdBQUksQ0FDbkIsT0FBTyxJQUNULENBRUEsT0FBTyxLQUFLTixFQUFHLENBQ2IsSUFBSWlDLEVBQUksT0FBTyxNQUFTLFdBQWEsS0FBT0YsRUFDNUMsR0FBSS9CLEdBQUssS0FBTSxNQUFNLElBQUksVUFBVUEsRUFBSSxtQkFBbUIsRUFDMUQsSUFBSWdELEVBQVN4QyxFQUFVUixFQUFHTSxDQUFnQixFQUUxQyxHQUFJMEMsRUFBUSxDQUNWLElBQUlDLEVBQWFELEVBQU8sS0FBS2hELENBQUMsRUFDOUIsR0FBSSxPQUFPaUQsQ0FBVSxJQUFNQSxFQUFZLE1BQU0sSUFBSSxVQUFVQSxFQUFhLG1CQUFtQixFQUMzRixPQUFJckMsR0FBYXFDLENBQVUsR0FBS0EsRUFBVyxjQUFnQmhCLEVBQVVnQixFQUM5RCxJQUFJaEIsRUFBRVQsR0FBWXlCLEVBQVcsVUFBVXpCLENBQVEsQ0FBQyxDQUN6RCxDQUVBLEdBQUl0QixHQUFVLFVBQVUsSUFDdEI4QyxFQUFTeEMsRUFBVVIsRUFBR0ssRUFBYyxFQUVoQzJDLEdBQ0YsT0FBTyxJQUFJZixFQUFFVCxHQUFZLENBQ3ZCVixFQUFRLElBQU0sQ0FDWixHQUFJLENBQUFVLEVBQVMsT0FFYixTQUFTMEIsS0FBUUYsRUFBTyxLQUFLaEQsQ0FBQyxFQUU1QixHQURBd0IsRUFBUyxLQUFLMEIsQ0FBSSxFQUNkMUIsRUFBUyxPQUFRLE9BR3ZCQSxFQUFTLFNBQVMsRUFDcEIsQ0FBQyxDQUNILENBQUMsRUFJTCxHQUFJLE1BQU0sUUFBUXhCLENBQUMsRUFDakIsT0FBTyxJQUFJaUMsRUFBRVQsR0FBWSxDQUN2QlYsRUFBUSxJQUFNLENBQ1osR0FBSSxDQUFBVSxFQUFTLE9BRWIsU0FBUyxFQUFJLEVBQUcsRUFBSXhCLEVBQUUsT0FBUSxFQUFFLEVBRTlCLEdBREF3QixFQUFTLEtBQUt4QixFQUFFLENBQUMsQ0FBQyxFQUNkd0IsRUFBUyxPQUFRLE9BR3ZCQSxFQUFTLFNBQVMsRUFDcEIsQ0FBQyxDQUNILENBQUMsRUFHSCxNQUFNLElBQUksVUFBVXhCLEVBQUksb0JBQW9CLENBQzlDLENBRUEsT0FBTyxNQUFNbUQsRUFBTyxDQUNsQixJQUFJbEIsRUFBSSxPQUFPLE1BQVMsV0FBYSxLQUFPRixFQUM1QyxPQUFPLElBQUlFLEVBQUVULEdBQVksQ0FDdkJWLEVBQVEsSUFBTSxDQUNaLEdBQUksQ0FBQVUsRUFBUyxPQUViLFNBQVNoUixFQUFJLEVBQUdBLEVBQUkyUyxFQUFNLE9BQVEsRUFBRTNTLEVBRWxDLEdBREFnUixFQUFTLEtBQUsyQixFQUFNM1MsQ0FBQyxDQUFDLEVBQ2xCZ1IsRUFBUyxPQUFRLE9BR3ZCQSxFQUFTLFNBQVMsRUFDcEIsQ0FBQyxDQUNILENBQUMsQ0FDSCxDQUVBLFdBQVlqQixFQUFhLEdBQUksQ0FDM0IsT0FBTyxJQUNULENBRUYsRUFFQU4sRUFBYSxXQUFhVSxFQUMxQixPQUFPLGVBQWVBLEVBQWMsT0FBTyxZQUFZLEVBQUcsQ0FDeEQsTUFBTyxDQUNMLE9BQVFMLEVBQ1IsZ0JBQUFPLENBQ0YsRUFDQSxhQUFjLEVBQ2hCLENBQUMsRUFFRCxJQUFJdUMsR0FBZ0JuRCxFQUFhLFdBRWpDLE1BQU04QixHQUEwQmhDLEdBQXdCcUQsRUFBYSxFQUUvRCxDQUFFLE1BQUFDLEdBQU8sTUFBQXRLLEVBQU0sRUFBSUMsRUFBcUIsWUFBWSxFQUNwRHNLLEdBQStCLEtBQzdCLHFCQUFzQixTQUMxQixPQUFPLGlCQUFzQixDQUFDLEdBRXpCLE9BQU8sa0JBRVZDLEdBQXFCLENBQUMzSSxFQUFTQyxJQUFrQixDQUNyRCxNQUFNQyxFQUFhLENBQUUsUUFBQUYsRUFBUyxjQUFBQyxDQUFjLEVBQzVDLGVBQVEsSUFBSSxpQ0FBaUMsRUFDdEMsQ0FFTCxTQUFVMkksR0FBd0IsV0FBWWpJLEVBQVMsU0FBUyxLQUFLVCxDQUFVLENBQUMsRUFFaEYsV0FBWTBJLEdBQXdCLGFBQWNqSSxFQUFTLFdBQVcsS0FBS1QsQ0FBVSxDQUFDLENBRXhGLENBQ0YsRUFDTTBJLEdBQTBCLENBQUNDLEVBQVVDLElBQWEsQ0FDdEQsTUFBTVQsRUFBYSxJQUFJbEIsR0FBWVAsR0FBYSxDQUM5Q0EsRUFBUyxLQUFLLENBQUUsT0FBUSxTQUFVLENBQUMsRUFDbkNrQyxFQUFTLEtBQU1uUSxHQUFXLENBQ3hCaU8sRUFBUyxLQUFLLENBQUUsT0FBUSxTQUFVLE9BQUFqTyxDQUFPLENBQUMsQ0FDNUMsQ0FBQyxFQUFFLE1BQU90RyxHQUFVLENBQ2xCdVUsRUFBUyxLQUFLLENBQUUsT0FBUSxRQUFTLFFBQVN2VSxFQUFNLE9BQVEsQ0FBQyxDQUMzRCxDQUFDLENBQ0gsQ0FBQyxFQUNELE9BQUFnVyxFQUFXLFVBQVUsQ0FDbkIsS0FBTzFQLEdBQVcsQ0FDaEI4UCxHQUFNLEdBQUdJLENBQVEsZUFBZ0JsUSxDQUFNLEVBQ3ZDK1AsR0FBNkIsRUFBRUcsQ0FBUSxFQUFJbFEsQ0FDN0MsRUFDQSxNQUFRdEcsR0FBVSxDQUNoQixNQUFBOEwsR0FBTSxHQUFHMEssQ0FBUTtBQUFBLEVBQ3ZCLEtBQUssVUFBVXhXLENBQUssQ0FBQyxFQUFFLEVBQ1hBLENBQ1IsQ0FDRixDQUFDLEVBQ01nVyxDQUNULEVBRU1VLEdBQWEsQ0FDakIsVUFBVyxHQUNYLFlBQWEsR0FDYixVQUFXLFNBQVksQ0FDckIsUUFBUSxLQUNOO0FBQUE7QUFBQSxvRUFHRixDQUNGLENBQ0YsRUFDTUMsR0FBVyxDQUNmLFVBQVcsR0FDWCxZQUFhLEdBQ2IsVUFBVyxTQUFZLENBQ3JCLFFBQVEsTUFBTSw0REFBNEQsQ0FDNUUsQ0FDRixFQUVBLE1BQU1DLEVBQXdCLENBQzVCLFlBQVlDLEVBQWMsQ0FDeEIsS0FBSyxhQUFlQSxFQUNwQixLQUFLLE9BQVNBLEVBQWEsT0FDM0IsS0FBSyxPQUFTQSxFQUFhLE9BQzNCLEtBQUssYUFBZSxDQUFDLEVBQ3JCLEtBQUssT0FBeUIsSUFBSSxHQUNwQyxDQUNBLGNBQWMxUSxFQUFPLENBOWhFekIsSUFBQXBCLEVBK2hFTSxHQUFJLENBQUNvQixFQUFNLE9BQ1QsTUFBTSxJQUFJLE1BQU0saUJBQWlCLEVBS25DLEdBSElBLEVBQU0sV0FBV3BCLEVBQUEsS0FBSyxhQUFhLE9BQU8sWUFBekIsWUFBQUEsRUFBb0MsU0FHckQsT0FBT29CLEVBQU0sTUFBUyxVQUFZQSxFQUFNLEtBQUssT0FDL0MsT0FFRixNQUFNUCxFQUFZRCxHQUFrQixLQUFLLE1BQU1RLEVBQU0sSUFBSSxDQUFDLEVBRTFELEdBQUksQ0FEWSxLQUFLLGNBQWNQLENBQVMsRUFDOUIsT0FDZCxLQUFNLENBQUUsVUFBQUksRUFBVyxRQUFBQyxDQUFRLEVBQUlMLEVBQ3pCa1IsRUFBWTdRLEVBQVEsS0FDMUIsT0FBUTZRLEVBQVcsQ0FDakIsSUFBSyxTQUNILEtBQUssa0JBQWtCN1EsQ0FBTyxFQUM5QixNQUNGLElBQUssUUFDSCxLQUFLLGlCQUFpQkQsRUFBV0MsRUFBUSxXQUFXLEVBQ3BELE1BQ0YsSUFBSyxPQUNILEtBQUssZ0JBQWdCRCxFQUFXQyxFQUFRLFdBQVcsRUFDbkQsTUFDRixJQUFLLFNBQ0gsS0FBSyxrQkFBa0JELEVBQVdDLEVBQVEsWUFBYUEsRUFBUSxNQUFNLEVBQ3JFLE1BQ0YsSUFBSyxTQUNILEtBQUssa0JBQWtCRSxFQUFNLE9BQVFILEVBQVdDLENBQU8sRUFDdkQsTUFDRixJQUFLLGFBQ0gsS0FBSyxxQkFBcUJBLENBQU8sRUFDakMsTUFDRixJQUFLLG1CQUNILEtBQUssMkJBQTJCQSxFQUFTRCxDQUFTLEVBQ2xELE1BQ0YsUUFDRSxRQUFRLEtBQUssK0JBQWdDOFEsQ0FBUyxDQUMxRCxDQUNGLENBQ0EsY0FBY2xSLEVBQVcsQ0FDdkIsT0FBSUEsRUFBVSxTQUFXLEtBQUssYUFBYSxRQUFVLENBQUNBLEVBQVUsV0FDOUQsUUFBUSxLQUFLLGlDQUFrQ0EsQ0FBUyxFQUNqRCxJQUVMLEtBQUssT0FBTyxJQUFJQSxFQUFVLEtBQUssR0FDakMsUUFBUSxLQUFLLG1DQUFvQ0EsQ0FBUyxFQUNuRCxLQUVULEtBQUssT0FBTyxJQUFJQSxFQUFVLEtBQUssRUFDeEIsR0FDVCxDQUNBLGtCQUFrQkssRUFBUyxDQUN6QixNQUFNOFEsRUFBUzlRLEVBQVEsT0FBUyxHQUFHQSxFQUFRLE1BQU0sS0FBTyxPQUN4RCxLQUFLLGFBQWEsY0FBYzhRLENBQU0sQ0FDeEMsQ0FDQSxpQkFBaUIvUSxFQUFXZ1IsRUFBTyxDQUM3QixLQUFLLE9BQU8sU0FBUyxLQUFLLE9BQU8sUUFBUWhSLEVBQVdnUixDQUFLLENBQy9ELENBQ0EsZ0JBQWdCaFIsRUFBV2dSLEVBQU8sQ0FDNUIsS0FBSyxPQUFPLFFBQVEsS0FBSyxPQUFPLE9BQU9oUixFQUFXZ1IsQ0FBSyxDQUM3RCxDQUNBLGtCQUFrQmhSLEVBQVdnUixFQUFPelgsRUFBUSxDQUN0QyxLQUFLLE9BQU8sVUFBVSxLQUFLLE9BQU8sU0FBU3lHLEVBQVdnUixFQUFPelgsQ0FBTSxDQUN6RSxDQUNBLE1BQU0sa0JBQWtCMFgsRUFBUWpSLEVBQVdDLEVBQVMsQ0FDbEQsUUFBUSxJQUFJLG1DQUFvQ2dSLEVBQVFqUixFQUFXQyxDQUFPLEVBQzFFLEtBQUssYUFBYUQsQ0FBUyxFQUFJaVIsRUFDL0IsS0FBSyxhQUFhLFlBQVloUixDQUFPLEVBQ2pDLEtBQUssT0FBTyxRQUNkLEtBQUssT0FBTyxPQUFPQSxFQUFRLGlCQUFrQkEsRUFBUSxRQUFRLENBRWpFLENBQ0EscUJBQXFCQSxFQUFTLENBQ3hCLEtBQUssYUFBYSxPQUFPLGFBQWEsS0FBSyxhQUFhLE9BQU8sWUFBWUEsRUFBUSxPQUFPLENBQ2hHLENBQ0EsMkJBQTJCQSxFQUFTRCxFQUFXLENBQ3pDLEtBQUssYUFBYSxPQUFPLG1CQUMzQixLQUFLLGFBQWEsT0FBTyxrQkFBa0JDLEVBQVEsWUFBYUEsRUFBUSxPQUFRRCxDQUFTLENBRTdGLENBd0ZBLGlCQUFpQmlSLEVBQVFqUixFQUFXeUQsRUFBTSxDQUN4QzVELEdBQVVvUixFQUFRLEtBQUssT0FBUWpSLEVBQVd5RCxFQUFNLEtBQUssT0FBTyxPQUFPLENBQ3JFLENBQ0YsQ0FFQSxlQUFleU4sR0FBaUI3TCxFQUFRQyxFQUFhLENBTW5ELE1BQU1DLEVBQWdCLE1BTEhqTixHQUFPLGVBQWUsQ0FDdkMsT0FBQStNLEVBQ0EsTUFBTyxHQUNQLFlBQUFDLENBQ0YsQ0FBQyxFQUNzQyxRQUNqQzZMLEVBQWdCLE1BQU0vUSxHQUFnQ21GLENBQWEsRUFDekUsR0FBSSxDQUFDaEYsR0FBY2dGLEVBQWU0TCxDQUFhLEVBQzdDLE1BQU0sSUFBSSxNQUFNLG1DQUFtQyxFQUVyRCxPQUFPNUwsQ0FDVCxDQUNBLE1BQU02TCxFQUFrQixDQUN0QixhQUFjLENBQ1osS0FBSyxZQUE4QixJQUFJLEdBQ3pDLENBQ0EsY0FBYzdILEVBQUk4SCxFQUFZLENBQzVCLEtBQUssWUFBWSxJQUFJOUgsRUFBSThILENBQVUsQ0FDckMsQ0FDQSxlQUFnQixDQUNkLE1BQU1BLEVBQWEsS0FBSyxZQUFZLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFDcEQsR0FBSSxDQUFDQSxFQUNILE1BQU0sSUFBSSxNQUFNLHNCQUFzQixFQUV4QyxPQUFPQSxDQUNULENBQ0EsbUJBQW9CLENBQ2xCLE9BQU8sS0FBSyxXQUNkLENBQ0YsQ0FFQSxNQUFNQyxFQUFOLE1BQU1BLENBQVksQ0FDaEIsWUFBWUMsRUFBUSxDQUNsQixLQUFLLGdCQUFrQixJQUFNLENBQ3ZCLEtBQUsseUJBQTJCLE1BRy9CLEtBQUssa0JBR04sS0FBSyxrQkFBa0Isa0JBQWtCLEVBQUUsT0FBUyxJQUd4RCxLQUFLLHVCQUF5QmpCLEdBQW1CLEtBQUsscUJBQXFCLEVBQUcsS0FBSyx1QkFBdUIsQ0FBQyxFQUMzRyxLQUFLLHVCQUF1QixTQUFTLFVBQVduRyxHQUFXLEtBQUssdUJBQXVCQSxDQUFNLENBQUMsRUFDaEcsRUFDQSxLQUFLLFlBQWVsSyxHQUFZLENBQzFCLEtBQUssbUJBR1QsS0FBSyxpQkFBbUJBLEVBQ3hCLEtBQUssZ0JBQWdCLEVBQ3ZCLEVBQ0EsS0FBSyx1QkFBMEJ1UixHQUFlLENBbHdFcEQsSUFBQXpTLEVBQUFDLEVBQUFDLEVBQUFDLEVBQUFnSyxFQUFBdUksRUFtd0VRLEdBQUlELEVBQVcsU0FBVyxXQUN4QnhTLEdBQUFELEVBQUEsS0FBSyxRQUFPLHVCQUFaLE1BQUFDLEVBQUEsS0FBQUQsRUFBbUMsQ0FBRSxVQUFXMlIsR0FBWSxXQUFZQSxFQUFXLFdBQzFFYyxFQUFXLFNBQVcsU0FDL0J0UyxHQUFBRCxFQUFBLEtBQUssUUFBTyx1QkFBWixNQUFBQyxFQUFBLEtBQUFELEVBQW1DLENBQUUsVUFBVzBSLEdBQVUsV0FBWUEsRUFBUyxXQUN0RWEsRUFBVyxTQUFXLFNBQVUsQ0FDekMsTUFBTXhGLEVBQWF3RixFQUFXLE9BQ3hCRSxFQUFjMUYsRUFBVyxhQUFlQSxFQUFXLG1CQUFtQixTQUN0RTJGLEVBQWUzRixFQUFXLGFBQWVBLEVBQVcsbUJBQW1CLFdBQzdFeUYsR0FBQXZJLEVBQUEsS0FBSyxRQUFPLHVCQUFaLE1BQUF1SSxFQUFBLEtBQUF2SSxFQUFtQyxDQUNqQyxVQUFXLENBQ1QsVUFBVyxHQUNYLFlBQWF3SSxFQUNiLFVBQVcsTUFBT0UsR0FBZUYsRUFBYyxLQUFLLHFCQUFxQixZQUFhMUYsRUFBWTRGLENBQVUsRUFBSSxNQUNsSCxFQUNBLFdBQVksQ0FDVixVQUFXLEdBQ1gsWUFBYUQsRUFDYixVQUFXLE1BQU9DLEdBQWVELEVBQWUsS0FBSyxxQkFBcUIsYUFBYzNGLEVBQVk0RixDQUFVLEVBQUksTUFDcEgsQ0FDRixFQUNGLENBQ0YsRUFDQSxLQUFLLHFCQUF1QixDQUFDQyxFQUFVN0YsRUFBWXRHLElBQVcsQ0FDNUQsTUFBTWlDLEVBQVUsS0FBSyxxQkFBcUIsRUFDMUMsT0FBT1csRUFBUyxTQUFTLElBQUksQ0FDM0IsUUFBQVgsRUFDQSxzQkFBdUI4RSxHQUFnQzlFLEVBQVEsdUJBQXdCa0ssQ0FBUSxFQUMvRixpQkFBa0J2UyxFQUF5QnFJLEVBQVEsT0FBTyxFQUMxRCxjQUFlLEtBQUssdUJBQXVCLEVBQzNDLGFBQWMsQ0FBRSxTQUFBa0ssRUFBVSx1QkFBd0JuTSxHQUFBLFlBQUFBLEVBQVEsc0JBQXVCLEVBQ2pGLFdBQUFzRyxDQUNGLENBQUMsQ0FDSCxFQUNBc0YsRUFBWSxrQkFBa0IsSUFBSSxFQUNsQyxLQUFLLE9BQVMsQ0FBRSxHQUFHQyxFQUFRLFFBQVNBLEVBQU8sU0FBVyw0QkFBNkIsRUFDbkYsS0FBSyxTQUFXLEtBQ2hCLEtBQUssT0FBUyxhQUFhLE9BQU8sT0FBTyxXQUFXLENBQUMsR0FDckQsS0FBSyxRQUFVLE9BQU8sU0FBUyxPQUMvQixLQUFLLFdBQWFBLEVBQU8sWUFBYyxPQUN2QyxLQUFLLGVBQWlCLENBQUUsT0FBUSxLQUFNLEVBQ3RDLEtBQUssaUJBQW1CLEtBQ3hCLEtBQUssdUJBQXlCLEtBQzlCLEtBQUssY0FBZ0IsR0FDckIsS0FBSyxrQkFBb0IsSUFBSUgsR0FDN0IsS0FBSyxhQUFlLElBQUlSLEdBQXdCLElBQUksRUFDcEQsS0FBSyxXQUFhLFNBQ2xCLEtBQUssa0JBQW9CLFNBQ3pCLE9BQU8saUJBQWlCLFVBQVcsS0FBSyxhQUFhLGNBQWMsS0FBSyxLQUFLLFlBQVksQ0FBQyxDQUM1RixDQVFBLE9BQU8sa0JBQWtCa0IsRUFBTSxDQUM3QixHQUFJUixFQUFZLFlBQVksRUFDMUIsTUFBTSxJQUFJLE1BQU0sZ0VBQWdFLEVBRWxGLE9BQU8sSUFBU1EsQ0FDbEIsQ0FLQSxPQUFPLGFBQWMsQ0FDbkIsT0FBTyxPQUFPLEtBQVUsSUFDMUIsQ0FDQSxzQkFBdUIsQ0FDckIsT0FBTyxLQUFLLGlCQUNkLENBQ0EsY0FBY2YsRUFBUSxDQUNwQixLQUFLLGVBQWUsT0FBU0EsRUFDekIsS0FBSyxVQUNQLE9BQU8sT0FBTyxLQUFLLFFBQVEsRUFBRSxRQUFTdEgsR0FBWSxDQUNoREEsRUFBUSxLQUFLLE1BQU0sT0FBU3NILENBQzlCLENBQUMsQ0FFTCxDQUNBLGNBQWNnQixFQUFjN08sRUFBVSxDQUFDLEVBQUcsQ0FDeEMsR0FBSSxDQUFDLEtBQUssT0FBUSxNQUFNLElBQUksTUFBTSw4QkFBOEIsRUFDaEUsTUFBTW9MLEVBQU94VCxHQUFZLE1BQU1pWCxDQUFZLEVBQ3JDQyxFQUFRLFNBQVMsY0FBYyxRQUFRLEVBQ3ZDQyxFQUFjLEtBQUssaUJBQWlCL08sQ0FBTyxFQUNqRDhPLEVBQU0sS0FBTyxHQUFHMUQsQ0FBSSxXQUNwQixNQUFNM0UsRUFBTSxJQUFJLElBQUksV0FBV3FJLEVBQU0sSUFBSSxHQUFJLEtBQUssT0FBTyxPQUFPLEVBQ2hFckksRUFBSSxPQUFTc0ksRUFBWSxTQUFTLEVBQ2xDRCxFQUFNLElBQU1ySSxFQUFJLEtBQ2hCLEtBQUssT0FBTyxVQUFZQSxFQUN4QnFJLEVBQU0sTUFBTSxPQUFTLE9BQ3JCQSxFQUFNLE1BQU0sTUFBUSxPQUNwQixNQUFNdkksRUFBVSxDQUNkLEtBQUE2RSxFQUNBLEtBQU0wRCxFQUNOLE1BQVFFLEdBQVUsQ0FsMkUxQixJQUFBblQsRUFrMkU2QixPQUFBQSxFQUFBLFNBQVMsY0FBY21ULENBQVEsSUFBL0IsWUFBQW5ULEVBQWtDLFlBQVlpVCxHQUNyRSxFQUNBLFlBQUssaUJBQWlCdkksQ0FBTyxFQUN6QixLQUFLLFNBQ1AsS0FBSyxTQUFTNkUsQ0FBSSxFQUFJN0UsRUFFdEIsS0FBSyxTQUFXLENBQUUsQ0FBQzZFLENBQUksRUFBRzdFLENBQVEsRUFFN0JBLENBQ1QsQ0FDQSxpQkFBaUJ2RyxFQUFTLENBQ3hCLE1BQU0rTyxFQUFjLElBQUksZ0JBQ3hCLE9BQUFBLEVBQVksT0FBTyxVQUFXLEtBQUssT0FBTyxFQUMxQ0EsRUFBWSxPQUFPLFNBQVUsS0FBSyxNQUFNLEVBQ3BDL08sRUFBUSxRQUNWK08sRUFBWSxPQUFPLFNBQVU3UyxHQUEyQjhELEVBQVEsTUFBTSxDQUFDLEVBRXpFK08sRUFBWSxPQUFPLGNBQWUsS0FBSyxPQUFPLG1CQUFtQixFQUMxREEsQ0FDVCxDQUNBLGlCQUFpQnhJLEVBQVMsQ0FDeEJ5SCxHQUFpQnpILEVBQVEsSUFBSSxFQUFFLEtBQU0wSSxHQUFTLENBQzVDLEtBQUssa0JBQWtCLGNBQWMxSSxFQUFRLEtBQU0wSSxDQUFJLEVBQ3ZELEtBQUssZ0JBQWdCLENBQ3ZCLENBQUMsRUFBRSxNQUFPOVksR0FBUSxRQUFRLE1BQU0sd0NBQXlDQSxDQUFHLENBQUMsQ0FDL0UsQ0FDQSxZQUFhLENBQ1gsT0FBTyxTQUFTLGNBQWMsS0FBSyxVQUFVLEdBQUssU0FBUyxJQUM3RCxDQUNBLHNCQUF1QixDQUNyQixNQUFNK1ksRUFBaUIsS0FBSyxrQkFBa0Isa0JBQWtCLEVBQ2hFLEdBQUksQ0FBQyxLQUFLLGlCQUNSLE1BQU0sSUFBSSxNQUFNLDRDQUE0QyxFQUU5RCxHQUFJQSxFQUFlLE9BQVMsRUFDMUIsTUFBTSxJQUFJLE1BQU0sMEJBQTBCLEVBRTVDLE1BQU8sQ0FDTCxRQUFTLElBQUksSUFBSSxLQUFLLE9BQU8sU0FBVzVaLEVBQWMsRUFBRSxPQUN4RCxRQUFTLEtBQUssV0FBVyxFQUN6QixrQkFBbUIsS0FBSyxpQkFBaUIsVUFDekMsdUJBQXdCLEtBQUssaUJBQWlCLHVCQUM5QyxlQUFBNFosRUFDQSxpQkFBa0IsS0FBSyxPQUFPLGtCQUFvQixDQUFDLENBQ3JELENBQ0YsQ0FDQSx3QkFBeUIsQ0FDdkIsTUFBTUMsRUFBTyxJQUFNLENBQ25CLEVBQ0EsTUFBTyxDQUNMLGdCQUFpQnpZLEVBQWlCLGtCQUFtQixLQUFLLE9BQU8saUJBQW1CeVksQ0FBSSxFQUN4RixrQkFBbUJ6WSxFQUFpQixvQkFBcUIsS0FBSyxPQUFPLG1CQUFxQnlZLENBQUksRUFDOUYsa0JBQW1CelksRUFBaUIsb0JBQXFCLEtBQUssT0FBTyxtQkFBcUJ5WSxDQUFJLEVBQzlGLDRCQUE2QnpZLEVBQzNCLDhCQUNBLEtBQUssT0FBTyw2QkFBK0J5WSxDQUM3QyxFQUNBLGtCQUFtQnpZLEVBQWlCLG9CQUFxQixLQUFLLE9BQU8sbUJBQXFCeVksQ0FBSSxDQUNoRyxDQUNGLENBQ0EsUUFBUyxDQUNQLE1BQU0xSyxFQUFVLEtBQUsscUJBQXFCLEVBQzFDVyxFQUFTLFNBQVMsSUFBSSxDQUNwQixRQUFBWCxFQUNBLHNCQUF1QjhFLEdBQWdDOUUsRUFBUSx1QkFBd0IsYUFBYSxFQUNwRyxpQkFBa0JySSxFQUF5QnFJLEVBQVEsT0FBTyxFQUMxRCxjQUFlLEtBQUssdUJBQXVCLEVBQzNDLGFBQWMsT0FFZCxXQUFZLE1BRWQsQ0FBQyxDQUNILENBQ0Esc0JBQXNCMkssRUFBUSxDQUM1QixRQUFRLE1BQU0scUNBQXNDQSxDQUFNLEVBQzFELEtBQUssY0FBZ0IsR0FDakIsS0FBSyxPQUFPLGlCQUFpQixLQUFLLE9BQU8sZ0JBQWdCQSxDQUFNLENBQ3JFLENBQ0EsU0FBVSxDQUNSLFVBQVc3SSxLQUFXLE9BQU8sT0FBTyxLQUFLLFVBQVksQ0FBQyxDQUFDLEVBQ3JEQSxFQUFRLEtBQUssT0FBTyxFQUV0QixPQUFPLG9CQUFvQixVQUFXLEtBQUssYUFBYSxjQUFjLEtBQUssS0FBSyxZQUFZLENBQUMsQ0FDL0YsQ0FDRixFQWpJSTZILEVBQUssU0FBV2hKLEVBekVwQixJQUFNaUssR0FBTmpCLEVBNE1BblosRUFBUSxVQUFZa0MsRUFDcEJsQyxFQUFRLFlBQWNvYSxHQUV0QixPQUFPLGVBQWVwYSxFQUFTLE9BQU8sWUFBYSxDQUFFLE1BQU8sUUFBUyxDQUFDLENBRXhFLENBQUUiLAogICJuYW1lcyI6IFsiZ2xvYmFsIiwgImZhY3RvcnkiLCAiZXhwb3J0cyIsICJ6b2QiLCAidXVpZCIsICJwZW5wYWwiLCAiY2hhbGsiLCAiRlJBTUVfQkFTRV9VUkwiLCAiUHlkYW50aWNWYWxpZGF0aW9uRXJyb3IkMSIsICJQeWRhbnRpY1ZhbGlkYXRpb25FcnJvclJlc3BvbnNlIiwgIlpvZEZpZWxkRXJyb3IiLCAiWm9kRmllbGRFcnJvcnMiLCAiTUFQX1RPX0hVTUFOX0ZSSUVORExZX0xPV0VSQ0FTRSIsICJnZXRIdW1hbkZyaWVuZGx5TWVzc2FnZSIsICJvZ0Vycm9yTWVzc2FnZSIsICJrZXkiLCAiaXNTdHJpbmdpZmllZEpzb25PYmplY3QiLCAic3RyIiwgImNyZWF0ZU1lc3NhZ2VGcm9tUHlkYW50aWNWYWxpZGF0aW9uRXJyb3IiLCAicmVzcG9uc2UiLCAiZXJyIiwgImNyZWF0ZU1lc3NhZ2VGcm9tWm9kRmllbGRFcnJvcnMiLCAiZXJyb3JzIiwgImdldEVycm9yTWVzc2FnZSIsICJlIiwgIm9iaiIsICJlMiIsICJtYWtlQ2FsbGJhY2tTYWZlIiwgImNhbGxiYWNrTmFtZSIsICJmbiIsICJhcmdzIiwgImVycm9yIiwgIlJlcXVpcmVkU3RyaW5nIiwgIk9wdGlvbmFsU3RyaW5nIiwgIm51bGxPclVuZGVmT3IkMSIsICJ6VHlwZSIsICJGaWVsZE5hbWUiLCAiRmllbGROYW1lMiIsICJGaWVsZE5hbWVFbnVtIiwgIlByaXZhdGVGaWVsZE5hbWUiLCAiUHJpdmF0ZUZpZWxkTmFtZTIiLCAiUHJpdmF0ZUZpZWxkTmFtZUVudW0iLCAiQWxsRmllbGROYW1lcyIsICJFbGVtZW50VHlwZUVudW0iLCAiRWxlbWVudFR5cGVFbnVtMiIsICJFbGVtZW50VHlwZSIsICJDaGVja291dFBheW1lbnRNZXRob2QkMSIsICJQYXltZW50TWV0aG9kTWluaW1hbCIsICJFdmVudFR5cGUiLCAiR2VuZXJpY0V2ZW50VHlwZSIsICJHZW5lcmljRXZlbnRQYXlsb2FkIiwgIklucHV0RXZlbnRUeXBlIiwgIklucHV0RXZlbnRQYXlsb2FkIiwgIkVycm9yRXZlbnRUeXBlIiwgIkVycm9yRXZlbnRQYXlsb2FkIiwgIlZhbGlkYXRpb25FcnJvckV2ZW50VHlwZSIsICJWYWxpZGF0aW9uRXJyb3JFdmVudFBheWxvYWQiLCAiTGF5b3V0RXZlbnRQYXlsb2FkIiwgIkxvYWRlZEV2ZW50UGF5bG9hZCIsICJQYXltZW50Rmxvd1N0YXJ0ZWRFdmVudFBheWxvYWQiLCAiU2V0dXBDaGVja291dFN1Y2Nlc3NFdmVudFBheWxvYWQiLCAiUmVxdWlyZWRGb3JtRmllbGRzIiwgIlBSRm9ybUZpZWxkcyIsICJTdWJtaXRFdmVudFR5cGUiLCAiU3VibWl0RXZlbnRQYXlsb2FkIiwgIlRva2VuaXplU3VjY2Vzc0V2ZW50UGF5bG9hZCIsICJDaGVja291dFN1Y2Nlc3NFdmVudFBheWxvYWQiLCAiRXZlbnRQYXlsb2FkIiwgIkVsZW1lbnRFdmVudCIsICJDb25maXJtUGF5bWVudEZsb3dSZXNwb25zZSIsICJGaWVsZFZhbGlkYXRpb25FcnJvciIsICJUb2tlbml6ZUNhcmRFcnJvclJlc3BvbnNlIiwgIlRva2VuaXplQ2FyZFJlc3BvbnNlIiwgIlRocmVlRFNTdGF0dXMiLCAiVGhyZWVEU1N0YXR1czIiLCAiUGluZzNEU1N0YXR1c1Jlc3BvbnNlIiwgIkNvbW1vbjNEU05leHRBY3Rpb25NZXRhZGF0YSIsICJleHRyYWN0SXNzdWVzUGVyRmllbGQiLCAiaXNzdWVzUGVyRmllbGQiLCAidmFsdWUiLCAiZmllbGROYW1lIiwgIlN0cmlwZTNEU05leHRBY3Rpb25NZXRhZGF0YSIsICJQYXltZW50UmVxdWVzdE5leHRBY3Rpb25NZXRhZGF0YSIsICJvdXJDdXJyZW5jeVRvVGhlaXJzIiwgImdldExvYWRlZFN0cmlwZSIsICJwdWJsaXNoYWJsZUtleSIsICJpIiwgImlzU3RyaXBlSnNQcmVzZW50IiwgInNsZWVwIiwgImNyZWF0ZVN0cmlwZUVsZW1lbnRzIiwgInN0cmlwZVB1YktleSIsICJlbGVtZW50c09wdGlvbnMiLCAic3RyaXBlIiwgImNyZWF0ZVN0cmlwZVBheW1lbnRSZXF1ZXN0IiwgInRvdGFsQW1vdW50QXRvbSIsICJjdXJyZW5jeSIsICJpc0Ftb3VudFBlbmRpbmciLCAiaXNMaW5rT25seSIsICJzdHJpcGVDdXJyZW5jeSIsICJ0aW1lb3V0TXMiLCAicmVzb2x2ZSIsICJ3YWl0Rm9yVXNlclRvQWRkUGF5bWVudE1ldGhvZCIsICJwYXltZW50UmVxdWVzdCIsICJyZWplY3QiLCAiZXZ0IiwgImNvbmZpcm1TdHJpcGVQclBNIiwgIm5leHRBY3Rpb25NZXRhZGF0YSIsICJzdHJpcGVQbSIsICJjb25maXJtUmVzdWx0IiwgImxhdW5jaFN0cmlwZTNEU0RpYWxvZ0Zsb3ciLCAiX2EiLCAiX2IiLCAiX2MiLCAiX2QiLCAicmVzdWx0U3RhdHVzIiwgImNvbnZlcnRTdHlsZXNUb1F1ZXJ5U3RyaW5nIiwgInN0eWxlcyIsICJjcmVhdGVJbnB1dHNEaWN0RnJvbUZvcm0iLCAiZm9ybURpdiIsICJpbml0aWFsRGljdCIsICJhY2MiLCAiaW5wdXQiLCAicGFyc2VFdmVudFBheWxvYWQiLCAiZXZlbnREYXRhIiwgImVtaXRFdmVudCIsICJ0YXJnZXQiLCAiZm9ybUlkIiwgImVsZW1lbnRJZCIsICJwYXlsb2FkIiwgImJhc2VVcmwiLCAiZXZlbnQiLCAiY2hlY2tJZlZhbGlkQ2RlQ29ubmVjdGlvbk9iamVjdCIsICJwaW5nIiwgInJlc3VsdCIsICJpc1Jlc3VsdFZhbGlkIiwgImlzVmFsaWQiLCAibnVsbE9yVW5kZWZPciIsICJDREVSZXNwb25zZUVycm9yIiwgIkNvdXBvbk1pbmltYWwiLCAiTGluZUl0ZW0iLCAiQnJhbmRTZXR0aW5ncyIsICJCcmFuZCIsICJDaGVja291dFBheW1lbnRNZXRob2QiLCAiU3Vic2NyaXB0aW9uSXRlbU1pbmltYWwiLCAiU3Vic2NyaXB0aW9uTWluaW1hbCIsICJJbnZvaWNlSXRlbURpc2NvdW50QW1vdW50c01pbmltYWwiLCAiSW52b2ljZUxpbmVJdGVtTWluaW1hbCIsICJEaXNjb3VudE1pbmltYWwiLCAiSW52b2ljZU1pbmltYWwiLCAiQ3JlYXRlU3Vic2NyaXB0aW9uUmVzcG9uc2VNaW5pbWFsIiwgIlByZXZpZXdDaGVja291dFJlc3BvbnNlIiwgIl9QYXltZW50Rm9ybVByZWZpbGxDb21tb24iLCAiUGF5bWVudEZvcm1QcmVmaWxsIiwgIkNvbXBsZXRlZEZvcm1QcmVmaWxsIiwgIkV4cGlyZWRGb3JtUHJlZmlsbCIsICJDaGVja291dFN1Y2Nlc3NSZXNwb25zZSIsICJTZXR1cENoZWNrb3V0UmVzcG9uc2UiLCAiUHlkYW50aWNWYWxpZGF0aW9uRXJyb3IiLCAiU3RhcnRQYXltZW50Rmxvd1Jlc3BvbnNlIiwgIlN0YXJ0UGF5bWVudEZsb3dGb3JDQ1Jlc3BvbnNlIiwgInN1bSIsICJhcnIiLCAiYSIsICJiIiwgImZpeFByb3RvIiwgInByb3RvdHlwZSIsICJzZXRQcm90b3R5cGVPZiIsICJmaXhTdGFjayIsICJjYXB0dXJlU3RhY2tUcmFjZSIsICJfX2V4dGVuZHMiLCAiX2V4dGVuZFN0YXRpY3MiLCAiZCIsICJwIiwgIl9fIiwgIkN1c3RvbUVycm9yIiwgIl9zdXBlciIsICJtZXNzYWdlIiwgIm9wdGlvbnMiLCAiX25ld1RhcmdldCIsICJfdGhpcyIsICJDZGVFcnJvciIsICJmcmllbmRseU1lc3NhZ2UiLCAicXVlcnlDREUiLCAiY2RlQ29ubiIsICJkYXRhIiwgInJlc3BvbnNlU2NoZW1hIiwgImlzQ0RFUmVzcG9uc2VFcnJvciIsICJjaGVja0lmQ29uZm9ybXNUb1NjaGVtYSIsICJzY2hlbWEiLCAiZ2V0Q2hlY2tvdXRQcmV2aWV3IiwgInJlcXVlc3QiLCAiZ2V0UHJlZmlsbCIsICJzdGFydFBheW1lbnRGbG93IiwgInN0YXJ0UGF5bWVudEZsb3dGb3JDQyIsICJzdGFydFBheW1lbnRGbG93Rm9yUFIiLCAiY29uZmlybVBheW1lbnRGbG93IiwgImdldENoZWNrb3V0VmFsdWUiLCAic2VjdXJlVG9rZW4iLCAicHJvbW9Db2RlIiwgImNoZWNrb3V0UHJldmlldyIsICJjdXJyZW5jaWVzIiwgImludiIsICJhbW91bnRBdG9tIiwgImdldENoZWNrb3V0UHJldmlld0Ftb3VudCIsICJpc1NldHVwTW9kZSIsICJ0b2tlbml6ZUNhcmRPbkFsbENvbm5lY3Rpb25zIiwgImFsbENkZUNvbm5lY3Rpb25zIiwgImNoZWNrb3V0Q2FyZEVsZW1lbnRzIiwgInNldHVwQ2hlY2tvdXQiLCAicGVyZm9ybUNoZWNrb3V0IiwgIkNERV9QT0xMSU5HX0lOVEVSVkFMIiwgInBpbmdDZGVGb3IzZHNTdGF0dXMiLCAiaWZyYW1lIiwgImNoaWxkT3JpZ2luIiwgImNvbm5lY3Rpb25PYmoiLCAiYWRkQmFzaWNDaGVja291dENhbGxiYWNrSGFuZGxlcnMiLCAic2ltcGxlT2pzRmxvdyIsICJwYXJhbXMiLCAiZmxvd1Jlc3VsdCIsICJhZGRFcnJvckNhdGNoZXJGb3JJbml0IiwgImluaXQiLCAiZXJyX18iLCAiY3JlYXRlT2pzRmxvd0xvZ2dlcnMiLCAicHJlZml4IiwgImxvZyIsICJsb2dfXyQ1IiwgImVycl9fJDUiLCAicGFyc2VDb25maXJtUGF5bWVudEZsb3dSZXNwb25zZSIsICJmaW5kQ3BtTWF0Y2hpbmdUeXBlIiwgImFsbENQTXMiLCAiem9kTW9kZWwiLCAiY3BtIiwgImNwbTIiLCAibG9nX18kNCIsICJlcnJfXyQ0IiwgInZhbGlkYXRlTm9uQ2RlRm9ybUZpZWxkc0ZvckNDIiwgIm5vbkNkZUZvcm1JbnB1dHMiLCAib25WYWxpZGF0aW9uRXJyb3IiLCAiZm9ybWF0dGVkIiwgImlzc3VlcyIsICJ2YWxpZGF0ZVRva2VuaXplQ2FyZFJlc3VsdHMiLCAidG9rZW5pemVSZXN1bHRzIiwgInRva2VuaXplUmVzdWx0IiwgInBhcnNlZCIsICJPSlNfU1RSSVBFX0xJTktfQlROX0lEIiwgImxvZ19fJDMiLCAiZXJyX18kMyIsICJTdHJpcGVMaW5rQ3BtIiwgIlN0cmlwZUxpbmtSZXF1aXJlZFVzZXJBY3Rpb25zIiwgImluaXRTdHJpcGVMaW5rRmxvdyIsICJjb250ZXh0IiwgImZsb3dDYWxsYmFja3MiLCAiaW5pdFBhcmFtcyIsICJzdHJpcGVMaW5rQ3BtIiwgImFueUNkZUNvbm5lY3Rpb24iLCAicHJlZmlsbCIsICJpbml0aWFsUHJldmlldyIsICJlbGVtZW50cyIsICJleHByZXNzQ2hlY2tvdXRFbGVtZW50IiwgIm1vdW50QnV0dG9uIiwgImRpc21vdW50QnV0dG9uIiwgIk9qc0Zsb3dzIiwgImdldEVsZW1lbnRCeUlkQXN5bmMiLCAicnVuU3RyaXBlTGlua0Zsb3ciLCAiY2hlY2tvdXRQYXltZW50TWV0aG9kIiwgImN1c3RvbVBhcmFtcyIsICJtZXJnZWRJbnB1dHMiLCAiZmlsbEVtcHR5Rm9ybUlucHV0c1dpdGhTdHJpcGVQTSIsICJub25DZGVGb3JtRmllbGRzIiwgInN0YXJ0UGF5bWVudEZsb3dSZXNwb25zZSIsICJvdXJFeGlzdGluZ1BtSWQiLCAiY2hlY2tvdXRSZXF1ZXN0IiwgImZvcm1JbnB1dHMiLCAiX2UiLCAiaW5wdXRzIiwgInBheWVyRmlyc3ROYW1lIiwgInBheWVyTGFzdE5hbWVQYXJ0cyIsICJwYXllckxhc3ROYW1lIiwgImlkIiwgImdldEVsZW1lbnQiLCAiZWxlbWVudCIsICJjcmVhdGVBbmRPcGVuRnJhbWUiLCAidXJsIiwgInRlbXBsYXRlIiwgImhvc3QiLCAic2hhZG93Um9vdCIsICJjYW5jZWxCdXR0b24iLCAic3RhcnRQb2xsaW5nIiwgIm9uU3VjY2VzcyIsICJoYW5kbGVQb2xsaW5nIiwgInN0YXR1cyIsICJwb2xsaW5nSW50ZXJ2YWwiLCAiaGFuZGxlRXZlbnRzIiwgImhhbmRsZUNhbmNlbCIsICJzdGFydDNkc1ZlcmlmaWNhdGlvbiIsICJjbGVhbnVwRXZlbnRMaXN0ZW5lcnMiLCAibG9nX18kMiIsICJlcnJfXyQyIiwgInN0cmlwZUxvZ19fIiwgInJ1bkNvbW1vbkNjRmxvdyIsICJ0b2tlbml6ZUNhcmRSZXN1bHRzIiwgImNvbW1vbkNoZWNrb3V0UGFyYW1zIiwgInNob3VsZFVzZU5ld0Zsb3ciLCAic3RhcnRQZlJlc3VsdCIsICJjb21tb25DQzNEU0Zsb3ciLCAic3RyaXBlQ0MzRFNGbG93IiwgImNyZWF0ZWRQYXltZW50TWV0aG9kIiwgInBhcnNlU3RyaXBlM0RTTmV4dEFjdGlvbk1ldGFkYXRhIiwgInN0cmlwZUFjdGlvbiIsICJhY3Rpb24iLCAicGFyc2VDb21tb24zRFNOZXh0QWN0aW9uTWV0YWRhdGEiLCAiY29tbW9uQWN0aW9uIiwgImxvZ19fJDEiLCAiZXJyX18kMSIsICJTdHJpcGVQckNwbSIsICJpbml0U3RyaXBlUHJGbG93IiwgInByIiwgImNhbk1ha2VQYXltZW50IiwgInJ1blN0cmlwZVByRmxvdyIsICJpbml0UmVzdWx0IiwgIm92ZXJyaWRlIiwgInVwZGF0ZVByV2l0aEFtb3VudCIsICJzdHJpcGVQbUFkZGVkRXZlbnQiLCAiZmlsbEVtcHR5Rm9ybUlucHV0c1dpdGhTdHJpcGVQbSIsICJwYXJzZVBSTmV4dEFjdGlvbk1ldGFkYXRhIiwgInN0cmlwZVBtRXZ0IiwgImFtb3VudCIsICJpc1BlbmRpbmciLCAiZmluZENoZWNrb3V0UGF5bWVudE1ldGhvZFN0cmljdCIsICJjcG1zIiwgIndpdGhQcm92aWRlciIsICJ3aXRoUHJvY2Vzc29yIiwgIm1hdGNoZXMiLCAiZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMiLCAieCIsICJPYnNlcnZhYmxlJDIiLCAiaGFzU3ltYm9sIiwgIm5hbWUiLCAiZ2V0U3ltYm9sIiwgIlN5bWJvbEl0ZXJhdG9yIiwgIlN5bWJvbE9ic2VydmFibGUiLCAiU3ltYm9sU3BlY2llcyIsICJnZXRNZXRob2QiLCAiZ2V0U3BlY2llcyIsICJjdG9yIiwgIk9ic2VydmFibGUkMSIsICJpc09ic2VydmFibGUiLCAiaG9zdFJlcG9ydEVycm9yIiwgImVucXVldWUiLCAiY2xlYW51cFN1YnNjcmlwdGlvbiIsICJzdWJzY3JpcHRpb24iLCAiY2xlYW51cCIsICJ1bnN1YnNjcmliZSIsICJjbG9zZVN1YnNjcmlwdGlvbiIsICJmbHVzaFN1YnNjcmlwdGlvbiIsICJxdWV1ZSIsICJub3RpZnlTdWJzY3JpcHRpb24iLCAidHlwZSIsICJvYnNlcnZlciIsICJtIiwgIm9uTm90aWZ5IiwgIlN1YnNjcmlwdGlvbiIsICJzdWJzY3JpYmVyIiwgInNlbGYiLCAic3Vic2NyaXB0aW9uT2JzZXJ2ZXIiLCAiT2JzZXJ2YWJsZSIsICJkb25lIiwgIkMiLCAiaGFzU2VlZCIsICJoYXNWYWx1ZSIsICJmaXJzdCIsICJ2YWx1ZXMiLCAic291cmNlcyIsICJpbmRleCIsICJzdGFydE5leHQiLCAibmV4dCIsICJ2IiwgInN1YnNjcmlwdGlvbnMiLCAib3V0ZXIiLCAiaW5uZXIiLCAiY29tcGxldGVJZkRvbmUiLCAicyIsICJtZXRob2QiLCAib2JzZXJ2YWJsZSIsICJpdGVtIiwgIml0ZW1zIiwgInplbk9ic2VydmFibGUiLCAibG9nX18iLCAiZ2V0T2pzSW5pdFJlc3VsdHNEZWJ1Z09iamVjdCIsICJpbml0aWFsaXplT2pzRmxvd3MiLCAicnVuSW5pdEZsb3dBc09ic2VydmFibGUiLCAiZmxvd05hbWUiLCAiaW5pdEZsb3ciLCAiUFJfTE9BRElORyIsICJQUl9FUlJPUiIsICJPcGVuUGF5Rm9ybUV2ZW50SGFuZGxlciIsICJmb3JtSW5zdGFuY2UiLCAiZXZlbnRUeXBlIiwgImhlaWdodCIsICJmaWVsZCIsICJzb3VyY2UiLCAiY3JlYXRlQ29ubmVjdGlvbiIsICJpc1ZhbGlkT2JqZWN0IiwgIkNvbm5lY3Rpb25NYW5hZ2VyIiwgImNvbm5lY3Rpb24iLCAiX09wZW5QYXlGb3JtIiwgImNvbmZpZyIsICJpbml0U3RhdHVzIiwgIl9mIiwgImNhbkFwcGxlUGF5IiwgImNhbkdvb2dsZVBheSIsICJ1c2VyUGFyYW1zIiwgInByb3ZpZGVyIiwgImZvcm0iLCAiZWxlbWVudFZhbHVlIiwgImZyYW1lIiwgInF1ZXJ5U3RyaW5nIiwgInNlbGVjdG9yIiwgImNvbm4iLCAiY2RlQ29ubmVjdGlvbnMiLCAibm9PcCIsICJlcnJNc2ciLCAiT3BlblBheUZvcm0iXQp9Cg==