diff --git a/dist/cjs/src/index.js b/dist/cjs/src/index.js index c424071..91d08b5 100644 --- a/dist/cjs/src/index.js +++ b/dist/cjs/src/index.js @@ -1,4 +1,4 @@ -var le=Object.create;var F=Object.defineProperty;var de=Object.getOwnPropertyDescriptor;var ue=Object.getOwnPropertyNames,H=Object.getOwnPropertySymbols,ce=Object.getPrototypeOf,K=Object.prototype.hasOwnProperty,pe=Object.prototype.propertyIsEnumerable;var q=(t,e,r)=>e in t?F(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r,Y=(t,e)=>{for(var r in e||(e={}))K.call(e,r)&&q(t,r,e[r]);if(H)for(var r of H(e))pe.call(e,r)&&q(t,r,e[r]);return t};var me=(t,e)=>{for(var r in e)F(t,r,{get:e[r],enumerable:!0})},W=(t,e,r,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of ue(e))!K.call(t,n)&&n!==r&&F(t,n,{get:()=>e[n],enumerable:!(a=de(e,n))||a.enumerable});return t};var k=(t,e,r)=>(r=t!=null?le(ce(t)):{},W(e||!t||!t.__esModule?F(r,"default",{value:t,enumerable:!0}):r,t)),fe=t=>W(F({},"__esModule",{value:!0}),t);var C=(t,e,r)=>new Promise((a,n)=>{var s=l=>{try{u(r.next(l))}catch(c){n(c)}},d=l=>{try{u(r.throw(l))}catch(c){n(c)}},u=l=>l.done?a(l.value):Promise.resolve(l.value).then(s,d);u((r=r.apply(t,e)).next())});var xe={};me(xe,{Disable:()=>ae,Enable:()=>oe,EnableContext:()=>x,Features:()=>re,FeaturesMachine:()=>D,ToggleFeatures:()=>se,useAllDisabled:()=>L,useAllEnabled:()=>A,useDisabled:()=>O,useEnabled:()=>I});module.exports=fe(xe);var f=require("xstate");var w=require("xstate");function $(t){var e,r;return[t.matches("enabled")?!0:t.matches("disabled")?!1:void 0,(r=(e=t.context.featureDesc)==null?void 0:e.force)!=null?r:!1]}var Q=(0,w.createMachine)({id:"feature",initial:"initial",context:{},predictableActionArguments:!0,on:{ENABLE:[{target:"asyncEnabled",cond:t=>{var e;return((e=t.featureDesc)==null?void 0:e.onChangeDefault)!=null}},{target:"enabled"}],TOGGLE:[{target:"asyncEnabled",cond:t=>{var e;return((e=t.featureDesc)==null?void 0:e.onChangeDefault)!=null}},{target:"enabled"}],DISABLE:[{target:"asyncDisabled",cond:t=>{var e;return((e=t.featureDesc)==null?void 0:e.onChangeDefault)!=null}},{target:"disabled"}],UNSET:[{target:"asyncUnspecied",cond:t=>{var e;return((e=t.featureDesc)==null?void 0:e.onChangeDefault)!=null}},{target:"unspecified"}],SET:[{target:"asyncEnabled",cond:(t,e)=>{var r;return e.value===!0&&((r=t.featureDesc)==null?void 0:r.onChangeDefault)!=null}},{target:"asyncDisabled",cond:(t,e)=>{var r;return e.value===!1&&((r=t.featureDesc)==null?void 0:r.onChangeDefault)!=null}},{target:"asyncUnspecied",cond:(t,e)=>{var r;return((r=t.featureDesc)==null?void 0:r.onChangeDefault)!=null}},{target:"enabled",cond:(t,e)=>e.value===!0},{target:"disabled",cond:(t,e)=>e.value===!1},{target:"unspecified"}]},states:{initial:{on:{INIT:[{actions:(0,w.assign)({featureDesc:(t,e)=>e.feature}),target:"enabled",cond:(t,e)=>e.feature.defaultValue===!0},{actions:(0,w.assign)({featureDesc:(t,e)=>e.feature}),target:"unspecified",cond:(t,e)=>e.feature.defaultValue===void 0},{actions:(0,w.assign)({featureDesc:(t,e)=>e.feature}),target:"disabled",cond:(t,e)=>e.feature.defaultValue===!1}]}},unspecified:{},disabled:{},enabled:{},asyncDisabled:{invoke:{id:"set-off-upstream",src:t=>C(void 0,null,function*(){var r;let e=(r=t.featureDesc)==null?void 0:r.onChangeDefault;if(e!=null&&t.featureDesc!=null)return e(t.featureDesc.name,!1)}),onDone:[{target:"enabled",cond:(t,e)=>e.data===!0},{target:"disabled",cond:(t,e)=>e.data===!1},{target:"unspecified"}],onError:"unspecified"}},asyncUnspecied:{invoke:{id:"set-unset-upstream",src:t=>C(void 0,null,function*(){var r;let e=(r=t.featureDesc)==null?void 0:r.onChangeDefault;if(e!=null&&t.featureDesc!=null)return e(t.featureDesc.name,void 0)}),onDone:[{target:"enabled",cond:(t,e)=>e.data===!0},{target:"disabled",cond:(t,e)=>e.data===!1},{target:"unspecified"}],onError:"unspecified"}},asyncEnabled:{invoke:{id:"set-on-upstream",src:t=>C(void 0,null,function*(){var r;let e=(r=t.featureDesc)==null?void 0:r.onChangeDefault;if(e!=null&&t.featureDesc!=null)return e(t.featureDesc.name,!0)}),onDone:[{target:"enabled",cond:(t,e)=>e.data===!0},{target:"disabled",cond:(t,e)=>e.data===!1},{target:"unspecified"}],onError:"unspecified"}}}});function h(t,e){if(t.context.features[e]==null)return[void 0,!1];let r=t.context.features[e].getSnapshot();return r!=null?$(r):[void 0,!1]}var D=(0,f.createMachine)({id:"features",initial:"idle",predictableActionArguments:!0,context:{features:{}},states:{idle:{on:{INIT:{target:"ready",cond:(t,e)=>e.features.length>0,actions:(0,f.assign)({features:(t,e)=>{let r={};for(let a of e.features)r[a.name]=(0,f.spawn)(Q,{name:a.name,sync:!0}),r[a.name].send({type:"INIT",feature:a});return r}})}}},ready:{on:{DE_INIT:{target:"idle",actions:(0,f.assign)({features:(t,e)=>({})})},SET_ALL:{actions:(0,f.assign)({features:(t,e)=>{let r=Y({},t.features);return Object.keys(r).forEach(a=>{var n;r[a].send({type:"SET",value:(n=e.features[a])!=null?n:void 0})}),r}})},SET:{actions:(t,e)=>{let r=t.features[e.name];r!=null&&r.send({type:"SET",value:e.value})}},TOGGLE:{actions:(t,e)=>{let r=t.features[e.name];r!=null&&r.send({type:"TOGGLE"})}},ENABLE:{actions:(t,e)=>{let r=t.features[e.name];r!=null&&r.send({type:"ENABLE"})}},DISABLE:{actions:(t,e)=>{let r=t.features[e.name];r!=null&&r.send({type:"DISABLE"})}},UNSET:{actions:(t,e)=>{let r=t.features[e.name];r!=null&&r.send({type:"UNSET"})}}}}}});var p=k(require("react")),J=require("@xstate/react");var Z=require("react"),x=(0,Z.createContext)(t=>!1);var R=require("react"),E=(0,R.createContext)(null);var ee=require("react");var N=class{constructor(e,r,a){this.featureDesc=a,this.dispatch=e,this.testFeature=r}toggle(e){this.dispatch({type:"TOGGLE",name:e})}enable(e){this.dispatch({type:"ENABLE",name:e})}unset(e){this.dispatch({type:"UNSET",name:e})}disable(e){this.dispatch({type:"DISABLE",name:e})}setAll(e){this.dispatch({type:"SET_ALL",features:e})}listFeatures(){return this.featureDesc.map(e=>[e.name,this.testFeature(e.name)])}};function j(t,e,r,a){(0,ee.useEffect)(()=>t?(window.feature=new N(a,r,e),()=>{window.feature!=null&&delete window.feature}):()=>{},[e,a,t,r])}var z=require("react");var B="react-enable:feature-values";function P(t,e,r){let a=(0,z.useMemo)(()=>{let s={};if(r.matches("ready"))for(let d of e){let[u]=h(r,d.name);u!=null&&(s[d.name]=u)}return s},[e,r]),n=Object.keys(a).length===0||t==null?"{}":JSON.stringify({overrides:a});(0,z.useEffect)(()=>{try{t!=null&&r.matches("ready")&&t.setItem(B,n)}catch(s){}},[r,t,n])}var te=require("react");function U(t,e){let r=e.map(a=>h(a,t));for(let[a,n]of r)if(a!=null&&n)return a;for(let[a]of r)if(a!=null)return a}function G(t,e){return(0,te.useCallback)(r=>U(r,[t,e]),[t,e])}function re({children:t,features:e,disableConsole:r=!1,storage:a=window.sessionStorage}){let n=(0,p.useRef)(e),[s,d]=(0,J.useMachine)(D),[u,l]=(0,J.useMachine)(D);(0,p.useEffect)(()=>(l({type:"INIT",features:e}),()=>{l({type:"DE_INIT"})}),[l,e]),(0,p.useEffect)(()=>{let b={};if(a!=null)try{let i=a.getItem(B);i!=null&&(b=JSON.parse(i).overrides)}catch(i){console.error("error in localStorage",i)}return d({type:"INIT",features:n.current.filter(i=>i.noOverride!==!0).map(i=>{var m;return{name:i.name,description:i.description,defaultValue:(m=b==null?void 0:b[i.name])!=null?m:void 0}})}),()=>{d({type:"DE_INIT"})}},[n,d,a]),P(a,n.current,s);let c=G(s,u);j(!r,n.current,c,l);let S=(0,p.useMemo)(()=>({overridesSend:d,defaultsSend:l,featuresDescription:n.current,overridesState:s,defaultsState:u,test:c}),[d,l,s,u,c]);return p.default.createElement(E.Provider,{value:S},p.default.createElement(x.Provider,{value:c},t))}var V=k(require("react"));var T=require("react");function g(t){let e=(0,T.useContext)(x),r=(0,T.useMemo)(()=>t==null?[]:Array.isArray(t)?t:[t],[t]);return[e,r]}function A(t){let[e,r]=g(t);return r.length>0&&r.every(e)}function I(t){let[e,r]=g(t);return r.some(e)}function oe({feature:t=[],allFeatures:e=[],children:r}){let a=I(t),n=A(e);return a||n?V.createElement(V.Fragment,null,r):null}var M=k(require("react"));function L(t){let[e,r]=g(t);return t.length>0&&r.every(a=>{var n;return!((n=e(a))!=null&&n)})}function O(t){let[e,r]=g(t);return r.some(a=>{var n;return!((n=e(a))!=null&&n)})}var ae=({feature:t=[],allFeatures:e=[],children:r})=>{let a=O(t),n=L(e);return a||n?M.createElement(M.Fragment,null,r):null};var o=k(require("react")),ie=k(require("react-dom")),v=require("@headlessui/react");var ne=`/* +var le=Object.create;var F=Object.defineProperty;var de=Object.getOwnPropertyDescriptor;var ue=Object.getOwnPropertyNames,H=Object.getOwnPropertySymbols,ce=Object.getPrototypeOf,K=Object.prototype.hasOwnProperty,pe=Object.prototype.propertyIsEnumerable;var q=(t,e,r)=>e in t?F(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r,Y=(t,e)=>{for(var r in e||(e={}))K.call(e,r)&&q(t,r,e[r]);if(H)for(var r of H(e))pe.call(e,r)&&q(t,r,e[r]);return t};var fe=(t,e)=>{for(var r in e)F(t,r,{get:e[r],enumerable:!0})},W=(t,e,r,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of ue(e))!K.call(t,n)&&n!==r&&F(t,n,{get:()=>e[n],enumerable:!(a=de(e,n))||a.enumerable});return t};var k=(t,e,r)=>(r=t!=null?le(ce(t)):{},W(e||!t||!t.__esModule?F(r,"default",{value:t,enumerable:!0}):r,t)),me=t=>W(F({},"__esModule",{value:!0}),t);var C=(t,e,r)=>new Promise((a,n)=>{var i=s=>{try{u(r.next(s))}catch(c){n(c)}},d=s=>{try{u(r.throw(s))}catch(c){n(c)}},u=s=>s.done?a(s.value):Promise.resolve(s.value).then(i,d);u((r=r.apply(t,e)).next())});var xe={};fe(xe,{Disable:()=>ae,Enable:()=>oe,EnableContext:()=>x,Features:()=>re,FeaturesMachine:()=>D,ToggleFeatures:()=>se,useAllDisabled:()=>L,useAllEnabled:()=>A,useDisabled:()=>O,useEnabled:()=>I});module.exports=me(xe);var m=require("xstate");var w=require("xstate");function $(t){var e,r;return[t.matches("enabled")?!0:t.matches("disabled")?!1:void 0,(r=(e=t.context.featureDesc)==null?void 0:e.force)!=null?r:!1]}var Q=(0,w.createMachine)({id:"feature",initial:"initial",context:{},predictableActionArguments:!0,on:{ENABLE:[{target:"asyncEnabled",cond:t=>{var e;return((e=t.featureDesc)==null?void 0:e.onChangeDefault)!=null}},{target:"enabled"}],TOGGLE:[{target:"asyncEnabled",cond:t=>{var e;return((e=t.featureDesc)==null?void 0:e.onChangeDefault)!=null}},{target:"enabled"}],DISABLE:[{target:"asyncDisabled",cond:t=>{var e;return((e=t.featureDesc)==null?void 0:e.onChangeDefault)!=null}},{target:"disabled"}],UNSET:[{target:"asyncUnspecied",cond:t=>{var e;return((e=t.featureDesc)==null?void 0:e.onChangeDefault)!=null}},{target:"unspecified"}],SET:[{target:"asyncEnabled",cond:(t,e)=>{var r;return e.value===!0&&((r=t.featureDesc)==null?void 0:r.onChangeDefault)!=null}},{target:"asyncDisabled",cond:(t,e)=>{var r;return e.value===!1&&((r=t.featureDesc)==null?void 0:r.onChangeDefault)!=null}},{target:"asyncUnspecied",cond:(t,e)=>{var r;return((r=t.featureDesc)==null?void 0:r.onChangeDefault)!=null}},{target:"enabled",cond:(t,e)=>e.value===!0},{target:"disabled",cond:(t,e)=>e.value===!1},{target:"unspecified"}]},states:{initial:{on:{INIT:[{actions:(0,w.assign)({featureDesc:(t,e)=>e.feature}),target:"enabled",cond:(t,e)=>e.feature.defaultValue===!0},{actions:(0,w.assign)({featureDesc:(t,e)=>e.feature}),target:"unspecified",cond:(t,e)=>e.feature.defaultValue===void 0},{actions:(0,w.assign)({featureDesc:(t,e)=>e.feature}),target:"disabled",cond:(t,e)=>e.feature.defaultValue===!1}]}},unspecified:{},disabled:{},enabled:{},asyncDisabled:{invoke:{id:"set-off-upstream",src:t=>C(void 0,null,function*(){var r;let e=(r=t.featureDesc)==null?void 0:r.onChangeDefault;if(e!=null&&t.featureDesc!=null)return e(t.featureDesc.name,!1)}),onDone:[{target:"enabled",cond:(t,e)=>e.data===!0},{target:"disabled",cond:(t,e)=>e.data===!1},{target:"unspecified"}],onError:"unspecified"}},asyncUnspecied:{invoke:{id:"set-unset-upstream",src:t=>C(void 0,null,function*(){var r;let e=(r=t.featureDesc)==null?void 0:r.onChangeDefault;if(e!=null&&t.featureDesc!=null)return e(t.featureDesc.name,void 0)}),onDone:[{target:"enabled",cond:(t,e)=>e.data===!0},{target:"disabled",cond:(t,e)=>e.data===!1},{target:"unspecified"}],onError:"unspecified"}},asyncEnabled:{invoke:{id:"set-on-upstream",src:t=>C(void 0,null,function*(){var r;let e=(r=t.featureDesc)==null?void 0:r.onChangeDefault;if(e!=null&&t.featureDesc!=null)return e(t.featureDesc.name,!0)}),onDone:[{target:"enabled",cond:(t,e)=>e.data===!0},{target:"disabled",cond:(t,e)=>e.data===!1},{target:"unspecified"}],onError:"unspecified"}}}});function h(t,e){if(t.context.features[e]==null)return[void 0,!1];let r=t.context.features[e].getSnapshot();return r!=null?$(r):[void 0,!1]}var D=(0,m.createMachine)({id:"features",initial:"idle",predictableActionArguments:!0,context:{features:{}},states:{idle:{on:{INIT:{target:"ready",cond:(t,e)=>e.features.length>0,actions:(0,m.assign)({features:(t,e)=>{let r={};for(let a of e.features)r[a.name]=(0,m.spawn)(Q,{name:a.name,sync:!0}),r[a.name].send({type:"INIT",feature:a});return r}})}}},ready:{on:{DE_INIT:{target:"idle",actions:(0,m.assign)({features:(t,e)=>({})})},SET_ALL:{actions:(0,m.assign)({features:(t,e)=>{let r=Y({},t.features);return Object.keys(r).forEach(a=>{var n;r[a].send({type:"SET",value:(n=e.features[a])!=null?n:void 0})}),r}})},SET:{actions:(t,e)=>{let r=t.features[e.name];r!=null&&r.send({type:"SET",value:e.value})}},TOGGLE:{actions:(t,e)=>{let r=t.features[e.name];r!=null&&r.send({type:"TOGGLE"})}},ENABLE:{actions:(t,e)=>{let r=t.features[e.name];r!=null&&r.send({type:"ENABLE"})}},DISABLE:{actions:(t,e)=>{let r=t.features[e.name];r!=null&&r.send({type:"DISABLE"})}},UNSET:{actions:(t,e)=>{let r=t.features[e.name];r!=null&&r.send({type:"UNSET"})}}}}}});var p=k(require("react")),J=require("@xstate/react");var Z=require("react"),x=(0,Z.createContext)(t=>!1);var R=require("react"),E=(0,R.createContext)(null);var ee=require("react");var N=class{constructor(e,r,a){this.featureDesc=a,this.dispatch=e,this.testFeature=r}toggle(e){this.dispatch({type:"TOGGLE",name:e})}enable(e){this.dispatch({type:"ENABLE",name:e})}unset(e){this.dispatch({type:"UNSET",name:e})}disable(e){this.dispatch({type:"DISABLE",name:e})}setAll(e){this.dispatch({type:"SET_ALL",features:e})}listFeatures(){return this.featureDesc.map(e=>[e.name,this.testFeature(e.name)])}};function j(t,e,r,a){(0,ee.useEffect)(()=>t?(window.feature=new N(a,r,e),()=>{window.feature!=null&&delete window.feature}):()=>{},[e,a,t,r])}var z=require("react");var B="react-enable:feature-values";function P(t,e,r){let a=(0,z.useMemo)(()=>{let i={};if(r.matches("ready"))for(let d of e){let[u]=h(r,d.name);u!=null&&(i[d.name]=u)}return i},[e,r]),n=Object.keys(a).length===0||t==null?"{}":JSON.stringify({overrides:a});(0,z.useEffect)(()=>{try{t!=null&&r.matches("ready")&&t.setItem(B,n)}catch(i){}},[r,t,n])}var te=require("react");function U(t,e){let r=e.map(a=>h(a,t));for(let[a,n]of r)if(a!=null&&n)return a;for(let[a]of r)if(a!=null)return a}function G(t,e){return(0,te.useCallback)(r=>U(r,[t,e]),[t,e])}function re({children:t,features:e,disableConsole:r=!1,storage:a=window.sessionStorage}){let n=(0,p.useRef)(e),[i,d]=(0,J.useMachine)(D),[u,s]=(0,J.useMachine)(D);(0,p.useEffect)(()=>(s({type:"INIT",features:e}),()=>{s({type:"DE_INIT"})}),[s,e]),(0,p.useEffect)(()=>{let b={};if(a!=null)try{let l=a.getItem(B);l!=null&&(b=JSON.parse(l).overrides)}catch(l){console.error("error in localStorage",l)}return d({type:"INIT",features:n.current.filter(l=>l.noOverride!==!0).map(l=>{var f;return{name:l.name,description:l.description,defaultValue:(f=b==null?void 0:b[l.name])!=null?f:void 0}})}),()=>{d({type:"DE_INIT"})}},[n,d,a]),P(a,n.current,i);let c=G(i,u);j(!r,n.current,c,s);let S=(0,p.useMemo)(()=>({overridesSend:d,defaultsSend:s,featuresDescription:n.current,overridesState:i,defaultsState:u,test:c}),[d,s,i,u,c]);return p.default.createElement(E.Provider,{value:S},p.default.createElement(x.Provider,{value:c},t))}var V=k(require("react"));var T=require("react");function g(t){let e=(0,T.useContext)(x),r=(0,T.useMemo)(()=>t==null?[]:Array.isArray(t)?t:[t],[t]);return[e,r]}function A(t){let[e,r]=g(t);return r.length>0&&r.every(e)}function I(t){let[e,r]=g(t);return r.some(e)}function oe({feature:t=[],allFeatures:e=[],children:r}){let a=I(t),n=A(e);return a||n?V.createElement(V.Fragment,null,r):null}var M=k(require("react"));function L(t){let[e,r]=g(t);return t.length>0&&r.every(a=>{var n;return!((n=e(a))!=null&&n)})}function O(t){let[e,r]=g(t);return r.some(a=>{var n;return!((n=e(a))!=null&&n)})}var ae=({feature:t=[],allFeatures:e=[],children:r})=>{let a=O(t),n=L(e);return a||n?M.createElement(M.Fragment,null,r):null};var o=k(require("react")),ie=k(require("react-dom")),v=require("@headlessui/react");var ne=`/* ! tailwindcss v3.0.24 | MIT License | https://tailwindcss.com */ @@ -744,6 +744,10 @@ select { display: grid; } +.hidden { + display: none; +} + .h-7 { height: 1.75rem; } @@ -1185,5 +1189,5 @@ select { gap: 1rem; } } -`;function X(...t){return t.filter(Boolean).join(" ")}function be({feature:t}){var c,S,b;let e=(0,o.useContext)(E),r=(0,o.useCallback)(i=>{if((e==null?void 0:e.overridesSend)!=null)switch(i){case"true":{e.overridesSend({type:"ENABLE",name:t.name});break}case"false":{e.overridesSend({type:"DISABLE",name:t.name});break}case"unset":{e.overridesSend({type:"UNSET",name:t.name});break}}},[t.name,e]);if(e==null)return null;let{overridesState:a,test:n,defaultsState:s}=e,d=((c=h(s,t.name)[0])!=null?c:"unset").toString(),u=((S=h(a,t.name)[0])!=null?S:"unset").toString(),l=n(t.name);return o.default.createElement(v.RadioGroup,{disabled:t.noOverride,onChange:r,value:u},o.default.createElement(v.RadioGroup.Label,null,o.default.createElement("h6",{className:"text-gray-900 align-center flex flex-row flex-nowrap items-center gap-2 lg:gap-4 h-7"},o.default.createElement("span",{className:"font-medium"},"Feature: ",o.default.createElement("code",null,t.name)),t.noOverride===!0?o.default.createElement("div",{className:"border-orange-500 text-orange-500 flex flex-nowrap text-xs flex-row gap-1 rounded-sm border items-center justify-center px-2 py-1"},o.default.createElement("svg",{"aria-hidden":"true",className:"h-4 w-4 min-w-4",fill:"currentColor",viewBox:"0 0 20 20",xmlns:"http://www.w3.org/2000/svg"},o.default.createElement("path",{clipRule:"evenodd",d:"M5 9V7a5 5 0 0110 0v2a2 2 0 012 2v5a2 2 0 01-2 2H5a2 2 0 01-2-2v-5a2 2 0 012-2zm8-2v2H7V7a3 3 0 016 0z",fillRule:"evenodd"})),o.default.createElement("div",null,"No Overrides")):null,l===!0?o.default.createElement("div",{className:"flex flex-nowrap text-xs text-green-500 flex-row gap-1 rounded-sm border items-center justify-center border-green-500 px-2 py-1"},o.default.createElement("svg",{"aria-hidden":"true",className:"h-4 w-4 min-w-4",fill:"currentColor",viewBox:"0 0 20 20",xmlns:"http://www.w3.org/2000/svg"},o.default.createElement("path",{clipRule:"evenodd",d:"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z",fillRule:"evenodd"})),o.default.createElement("div",null,l?"Enabled":"Disabled")):null),t.description==null?null:o.default.createElement("p",{className:"text-base text-gray-500 text-sm"},t.description)),o.default.createElement("div",{className:"mt-4 grid grid-cols-1 gap-y-6 sm:grid-cols-3 sm:gap-x-4"},[{id:"false",title:`Disable ${t.name}`,description:"Override the feature to be disabled"},{id:"unset",title:"Default",description:"Inherit enabled state from defaults",disabled:((b=t.noOverride)!=null?b:!1)||t.force,defaultValue:d==="true"?o.default.createElement("div",{className:"text-green-500 border-green-500 flex flex-nowrap text-xs flex-row gap-1 rounded-sm border items-center justify-center px-2 py-1"},o.default.createElement("span",null,"Enabled")):o.default.createElement("div",{className:"text-red-500 border-red-500 flex flex-nowrap text-xs flex-row gap-1 rounded-sm border items-center justify-center px-2 py-1"},o.default.createElement("span",null,"Disabled"))},{id:"true",title:`Enable ${t.name}`,description:"Override the feature to be enabled"}].map(i=>o.default.createElement(v.RadioGroup.Option,{className:({checked:m,active:_,disabled:y})=>X(m?"border-transparent":"border-gray-300",!y&&_?"border-blue-500 ring-2 ring-blue-500":"",y?"border-transparent ring-gray-500 cursor-not-allowed":"cursor-pointer","relative bg-white border rounded-lg shadow-sm p-3 flex focus:outline-none"),disabled:i.disabled,key:i.id,value:i.id},({checked:m,active:_,disabled:y})=>o.default.createElement(o.default.Fragment,null,o.default.createElement("div",{className:"flex flex-col grow"},o.default.createElement(v.RadioGroup.Label,{as:"span",className:"flex flex-nowrap flex-row gap-1 items-center space-between"},o.default.createElement("span",{className:"text-sm font-medium text-gray-900 grow shrink"},i.title),i.defaultValue!=null?i.defaultValue:null,o.default.createElement("svg",{"aria-hidden":"true",className:X(m?"":"invisible","h-5 w-5 text-blue-500 min-w-4"),fill:"currentColor",viewBox:"0 0 20 20",xmlns:"http://www.w3.org/2000/svg"},o.default.createElement("path",{clipRule:"evenodd",d:"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z",fillRule:"evenodd"}))),o.default.createElement(v.RadioGroup.Description,{as:"span",className:"mt-1 flex items-center text-sm text-gray-500"},i.description)),o.default.createElement("div",{"aria-hidden":"true",className:X(!y&&_?"border":"border-2",m?y?"border-gray-500":"border-blue-500":"border-transparent","absolute -inset-px rounded-lg pointer-events-none")}))))))}function he({root:t,children:e}){return ie.default.createPortal(e,t)}function se({defaultOpen:t=!1}){let[e,r]=(0,o.useState)(null);return o.default.createElement("div",{ref:n=>{if(n==null||e!=null)return;let s=n==null?void 0:n.attachShadow({mode:"open"}),d=document.createElement("style"),u=document.createElement("div");d.textContent=ne,s.appendChild(d),s.appendChild(u),r(u)},style:{zIndex:99999,position:"fixed",width:"0",height:"0",bottom:0}},e!=null?o.default.createElement(he,{root:e},o.default.createElement(we,{defaultOpen:t})):null)}function we({defaultOpen:t=!1}){let[e,r]=(0,o.useState)(t),a=(0,o.useContext)(E);if(a==null)return null;let{featuresDescription:n}=a;return n.length===0?null:o.default.createElement("div",{className:"relative"},o.default.createElement("div",{className:"absolute bottom-0 left-0 mx-4 my-4"},o.default.createElement("button",{className:"inline-flex items-center text-sm font-medium p-1 h-8 w-8 align-middle cursor-pointer rounded-full bg-blue-600 text-white border border-transparent justify-center text-base font-medium focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-600 sm:text-sm",onClick:()=>r(!0),title:"Toggle features",type:"button"},o.default.createElement("svg",{className:"w-6 h-6 min-h-6 min-w-6",fill:"currentColor",viewBox:"0 0 20 20",xmlns:"http://www.w3.org/2000/svg"},o.default.createElement("path",{clipRule:"evenodd",d:"M3 6a3 3 0 013-3h10a1 1 0 01.8 1.6L14.25 8l2.55 3.4A1 1 0 0116 13H6a1 1 0 00-1 1v3a1 1 0 11-2 0V6z",fillRule:"evenodd"})))),e?o.default.createElement("div",{className:"fixed z-10 inset-0 overflow-y-auto"},o.default.createElement("div",{className:"flex items-end justify-flex-start mx-8 my-4 min-h-screen pt-4 px-4 pb-10 sm:block sm:p-0"},o.default.createElement("div",{className:"relative inline-block align-bottom bg-white rounded-lg px-4 pt-5 pb-4 text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:p-6 lg:max-w-[80%] max-w-full"},o.default.createElement("div",null,o.default.createElement("div",{className:"mt-1 sm:mt-3"},o.default.createElement("h3",{className:"flex flex-row gap-4 flex-nowrap items-center space-between"},o.default.createElement("div",{className:"grow text-lg leading-6 font-medium text-gray-900"},"Feature Flag Overrides")),o.default.createElement("p",{className:"text-sm text-gray-500"},"Features can be enabled or disabled unless they are forced upstream. You can also revert to default."),o.default.createElement("div",{className:"mt-6"},o.default.createElement("fieldset",{className:"flex flex-col gap-9"},o.default.createElement("legend",{className:"sr-only"},"Feature Flags"),n.map(s=>o.default.createElement(be,{feature:s,key:s.name})))),o.default.createElement("div",{className:"flex justify-center items-center mt-5 sm:mt-6"},o.default.createElement("button",{className:"inline-flex items-center text-sm font-medium pt-0 pb-0 pr-4 pl-4 h-8 leading-7 align-middle cursor-pointer rounded-sm bg-blue-600 text-white border border-transparent justify-center text-base font-medium focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-600 sm:text-sm",onClick:()=>r(!1),type:"button"},"Done"))))))):null)} -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2luZGV4LnRzeCIsICIuLi8uLi8uLi9zcmMvRmVhdHVyZXNTdGF0ZS50c3giLCAiLi4vLi4vLi4vc3JjL0ZlYXR1cmVTdGF0ZS50c3giLCAiLi4vLi4vLi4vc3JjL0ZlYXR1cmVzLnRzeCIsICIuLi8uLi8uLi9zcmMvRW5hYmxlQ29udGV4dC50c3giLCAiLi4vLi4vLi4vc3JjL0ZlYXR1cmVDb250ZXh0LnRzeCIsICIuLi8uLi8uLi9zcmMvdXNlQ29uc29sZU92ZXJyaWRlLnRzeCIsICIuLi8uLi8uLi9zcmMvR2xvYmFsRW5hYmxlLnRzeCIsICIuLi8uLi8uLi9zcmMvdXNlUGVyc2lzdC50c3giLCAiLi4vLi4vLi4vc3JjL3VzZVRlc3RDYWxsYmFjay50c3giLCAiLi4vLi4vLi4vc3JjL3Rlc3RGZWF0dXJlLnRzeCIsICIuLi8uLi8uLi9zcmMvRW5hYmxlLnRzeCIsICIuLi8uLi8uLi9zcmMvdXRpbHMudHMiLCAiLi4vLi4vLi4vc3JjL3VzZUFsbEVuYWJsZWQudHN4IiwgIi4uLy4uLy4uL3NyYy91c2VFbmFibGVkLnRzeCIsICIuLi8uLi8uLi9zcmMvRGlzYWJsZS50c3giLCAiLi4vLi4vLi4vc3JjL3VzZUFsbERpc2FibGVkLnRzeCIsICIuLi8uLi8uLi9zcmMvdXNlRGlzYWJsZWQudHN4IiwgIi4uLy4uLy4uL3NyYy9Ub2dnbGVGZWF0dXJlcy50c3giXSwKICAic291cmNlc0NvbnRlbnQiOiBbImV4cG9ydCB7IEZlYXR1cmVzTWFjaGluZSB9IGZyb20gJy4vRmVhdHVyZXNTdGF0ZSc7XG5leHBvcnQgeyBGZWF0dXJlcyB9IGZyb20gJy4vRmVhdHVyZXMnO1xuZXhwb3J0IHsgRW5hYmxlIH0gZnJvbSAnLi9FbmFibGUnO1xuZXhwb3J0IHsgRGlzYWJsZSB9IGZyb20gJy4vRGlzYWJsZSc7XG5leHBvcnQgeyB1c2VEaXNhYmxlZCB9IGZyb20gJy4vdXNlRGlzYWJsZWQnO1xuZXhwb3J0IHsgdXNlRW5hYmxlZCB9IGZyb20gJy4vdXNlRW5hYmxlZCc7XG5leHBvcnQgeyB1c2VBbGxEaXNhYmxlZCB9IGZyb20gJy4vdXNlQWxsRGlzYWJsZWQnO1xuZXhwb3J0IHsgdXNlQWxsRW5hYmxlZCB9IGZyb20gJy4vdXNlQWxsRW5hYmxlZCc7XG5leHBvcnQgdHlwZSB7IEVuYWJsZUNvbnRleHRUeXBlIH0gZnJvbSAnLi9FbmFibGVDb250ZXh0JztcbmV4cG9ydCB0eXBlIHsgRmVhdHVyZUNvbnRleHRUeXBlIH0gZnJvbSAnLi9GZWF0dXJlQ29udGV4dCc7XG5leHBvcnQgdHlwZSB7IEZlYXR1cmVWYWx1ZSwgRmVhdHVyZVN0YXRlLCBGZWF0dXJlRGlzcGF0Y2ggfSBmcm9tICcuL0ZlYXR1cmVTdGF0ZSc7XG5leHBvcnQgeyBFbmFibGVDb250ZXh0IH0gZnJvbSAnLi9FbmFibGVDb250ZXh0JztcbmV4cG9ydCB7IFRvZ2dsZUZlYXR1cmVzIH0gZnJvbSAnLi9Ub2dnbGVGZWF0dXJlcyc7XG4iLCAiaW1wb3J0IHsgQWN0b3JSZWZGcm9tLCBJbnRlcnByZXRlckZyb20sIFN0YXRlRnJvbSwgYXNzaWduLCBjcmVhdGVNYWNoaW5lLCBzcGF3biB9IGZyb20gJ3hzdGF0ZSc7XG5cbmltcG9ydCB7IEZlYXR1cmVNYWNoaW5lLCBGZWF0dXJlRGVzY3JpcHRpb24sIEZlYXR1cmVWYWx1ZSwgdmFsdWVGb3JTdGF0ZSB9IGZyb20gJy4vRmVhdHVyZVN0YXRlJztcblxuZXhwb3J0IGludGVyZmFjZSBGZWF0dXJlc0NvbnRleHQge1xuICAvLyBmZWF0dXJlcyBhcmUgbGF5ZXJlZDpcbiAgLy8gIC0gZGVmYXVsdHM6IGlmIG5vdGhpbmcgZWxzZSBtYXRjaGVzLCBwcm92aWRlZCBhIHZhbHVlIGZvciBmZWF0dXJlXG4gIC8vICAtIGJyb3dzZXI6IGJyb3dzZXItbG9jYWwgdmFsdWVzIGZvciBmZWF0dXJlcyAoa2VwdCBpbiBsb2NhbCBzdG9yYWdlLCBldGMpXG4gIC8vICAtIHVzZXI6IHZhbHVlcyBmcm9tIHRoZSB1c2VyJ3MgcHJvZmlsZSwgaWYgYW55XG4gIC8vICAtIG9yZzogdmFsdWUgZnJvbSB0aGUgb3JnJ3MgcHJvZmlsZSwgaWYgYW55XG4gIGZlYXR1cmVzOiB7IFt4OiBzdHJpbmddOiBBY3RvclJlZkZyb208dHlwZW9mIEZlYXR1cmVNYWNoaW5lPiB9O1xufVxuXG5leHBvcnQgdHlwZSBGZWF0dXJlc0FjdGlvbiA9XG4gIHwgeyB0eXBlOiAnREVfSU5JVCcgfVxuICB8IHsgdHlwZTogJ0RJU0FCTEUnOyBuYW1lOiBzdHJpbmcgfVxuICB8IHsgdHlwZTogJ0VOQUJMRSc7IG5hbWU6IHN0cmluZyB9XG4gIHwgeyB0eXBlOiAnSU5JVCc7IGZlYXR1cmVzOiByZWFkb25seSBGZWF0dXJlRGVzY3JpcHRpb25bXSB9XG4gIHwgeyB0eXBlOiAnU0VUX0FMTCc7IGZlYXR1cmVzOiB7IFtrZXk6IHN0cmluZ106IEZlYXR1cmVWYWx1ZSB9IH1cbiAgfCB7IHR5cGU6ICdTRVQnOyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBGZWF0dXJlVmFsdWUgfVxuICB8IHsgdHlwZTogJ1RPR0dMRSc7IG5hbWU6IHN0cmluZyB9XG4gIHwgeyB0eXBlOiAnVU5TRVQnOyBuYW1lOiBzdHJpbmcgfTtcblxuZXhwb3J0IGludGVyZmFjZSBGZWF0dXJlc1R5cGVTdGF0ZSB7XG4gIHZhbHVlOiAncmVhZHknO1xuICBjb250ZXh0OiBGZWF0dXJlc0NvbnRleHQ7XG59XG5cbmV4cG9ydCB0eXBlIEZlYXR1cmVzU3RhdGUgPSBTdGF0ZUZyb208dHlwZW9mIEZlYXR1cmVzTWFjaGluZT47XG5leHBvcnQgdHlwZSBGZWF0dXJlc0Rpc3BhdGNoID0gSW50ZXJwcmV0ZXJGcm9tPHR5cGVvZiBGZWF0dXJlc01hY2hpbmU+WydzZW5kJ107XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWx1ZU9mRmVhdHVyZShmZWF0dXJlc1N0YXRlOiBGZWF0dXJlc1N0YXRlLCBmZWF0dXJlOiBzdHJpbmcpOiBbRmVhdHVyZVZhbHVlLCBib29sZWFuXSB7XG4gIGlmIChmZWF0dXJlc1N0YXRlLmNvbnRleHQuZmVhdHVyZXNbZmVhdHVyZV0gPT0gbnVsbCkge1xuICAgIHJldHVybiBbdW5kZWZpbmVkLCBmYWxzZV07XG4gIH1cbiAgY29uc3QgZmVhdHVyZVN0YXRlID0gZmVhdHVyZXNTdGF0ZS5jb250ZXh0LmZlYXR1cmVzW2ZlYXR1cmVdLmdldFNuYXBzaG90KCk7XG4gIGlmIChmZWF0dXJlU3RhdGUgIT0gbnVsbCkge1xuICAgIHJldHVybiB2YWx1ZUZvclN0YXRlKGZlYXR1cmVTdGF0ZSk7XG4gIH1cbiAgcmV0dXJuIFt1bmRlZmluZWQsIGZhbHNlXTtcbn1cblxuLy8vIHN0YXRlIG1hY2hpbmUgdGhhdCBtYW5hZ2VzIGEgc2V0IG9mIGZlYXR1cmVzIHdpdGggdXNlciwgb3JnLCBhbmQgbG9jYWwgb3ZlcnJpZGVzXG5leHBvcnQgY29uc3QgRmVhdHVyZXNNYWNoaW5lID0gY3JlYXRlTWFjaGluZTxGZWF0dXJlc0NvbnRleHQsIEZlYXR1cmVzQWN0aW9uLCBGZWF0dXJlc1R5cGVTdGF0ZT4oe1xuICBpZDogJ2ZlYXR1cmVzJyxcbiAgaW5pdGlhbDogJ2lkbGUnLFxuICBwcmVkaWN0YWJsZUFjdGlvbkFyZ3VtZW50czogdHJ1ZSxcbiAgY29udGV4dDoge1xuICAgIGZlYXR1cmVzOiB7fSxcbiAgfSxcbiAgc3RhdGVzOiB7XG4gICAgaWRsZToge1xuICAgICAgb246IHtcbiAgICAgICAgSU5JVDoge1xuICAgICAgICAgIHRhcmdldDogJ3JlYWR5JyxcbiAgICAgICAgICBjb25kOiAoXywgZSkgPT4gZS5mZWF0dXJlcy5sZW5ndGggPiAwLFxuICAgICAgICAgIGFjdGlvbnM6IGFzc2lnbih7XG4gICAgICAgICAgICBmZWF0dXJlczogKGNvbnRleHQsIGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGZlYXR1cmVzOiB0eXBlb2YgY29udGV4dC5mZWF0dXJlcyA9IHt9O1xuXG4gICAgICAgICAgICAgIGZvciAoY29uc3QgZmVhdHVyZSBvZiBldmVudC5mZWF0dXJlcykge1xuICAgICAgICAgICAgICAgIGZlYXR1cmVzW2ZlYXR1cmUubmFtZV0gPSBzcGF3bihGZWF0dXJlTWFjaGluZSwge1xuICAgICAgICAgICAgICAgICAgbmFtZTogZmVhdHVyZS5uYW1lLFxuICAgICAgICAgICAgICAgICAgc3luYzogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBmZWF0dXJlc1tmZWF0dXJlLm5hbWVdLnNlbmQoeyB0eXBlOiAnSU5JVCcsIGZlYXR1cmUgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGZlYXR1cmVzO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIC8vIHRoZSBmZWF0dXJlcyBhcmUgbG9hZGVkIGFuZCByZWFkeSB0byBiZSB1c2VkXG4gICAgcmVhZHk6IHtcbiAgICAgIG9uOiB7XG4gICAgICAgIERFX0lOSVQ6IHsgdGFyZ2V0OiAnaWRsZScsIGFjdGlvbnM6IGFzc2lnbih7IGZlYXR1cmVzOiAoXywgX18pID0+ICh7fSkgfSkgfSxcbiAgICAgICAgU0VUX0FMTDoge1xuICAgICAgICAgIGFjdGlvbnM6IGFzc2lnbih7XG4gICAgICAgICAgICBmZWF0dXJlczogKGN0eCwgZSkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBmZWF0dXJlcyA9IHsgLi4uY3R4LmZlYXR1cmVzIH07XG4gICAgICAgICAgICAgIC8vIEFsbCBjb25maWd1cmVkIGZlYXR1cmVzIGFyZSBzZXQgdG8gb24vb2ZmIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgICBPYmplY3Qua2V5cyhmZWF0dXJlcykuZm9yRWFjaCgobmFtZSkgPT4ge1xuICAgICAgICAgICAgICAgIGZlYXR1cmVzW25hbWVdLnNlbmQoeyB0eXBlOiAnU0VUJywgdmFsdWU6IGUuZmVhdHVyZXNbbmFtZV0gPz8gdW5kZWZpbmVkIH0pO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgcmV0dXJuIGZlYXR1cmVzO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSxcblxuICAgICAgICAvLyBTZXQgYSBmZWF0dXJlIHRvIGEgdmFsdWVcbiAgICAgICAgU0VUOiB7XG4gICAgICAgICAgYWN0aW9uczogKGN0eCwgZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmVhdHVyZSA9IGN0eC5mZWF0dXJlc1tlLm5hbWVdO1xuICAgICAgICAgICAgaWYgKGZlYXR1cmUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICBmZWF0dXJlLnNlbmQoeyB0eXBlOiAnU0VUJywgdmFsdWU6IGUudmFsdWUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcblxuICAgICAgICAvLyB0b2dnbGUgYSBmZWF0dXJlXG4gICAgICAgIFRPR0dMRToge1xuICAgICAgICAgIGFjdGlvbnM6IChjdHgsIGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZlYXR1cmUgPSBjdHguZmVhdHVyZXNbZS5uYW1lXTtcbiAgICAgICAgICAgIGlmIChmZWF0dXJlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgZmVhdHVyZS5zZW5kKHsgdHlwZTogJ1RPR0dMRScgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcblxuICAgICAgICAvLyB3aGVuIGEgZmVhdHVyZSBpcyBlbmFibGVkLCBzZW5kIHRoZSBlbmFibGUgbWVzc2FnZSB0byB0aGUgYWN0b3JcbiAgICAgICAgRU5BQkxFOiB7XG4gICAgICAgICAgYWN0aW9uczogKGN0eCwgZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmVhdHVyZSA9IGN0eC5mZWF0dXJlc1tlLm5hbWVdO1xuICAgICAgICAgICAgaWYgKGZlYXR1cmUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICBmZWF0dXJlLnNlbmQoeyB0eXBlOiAnRU5BQkxFJyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuXG4gICAgICAgIC8vIHdoZW4gYSBmZWF0dXJlIGlzIGRpc2FibGVkLCBzZW5kIHRoZSBkaXNhYmxlIG1lc3NhZ2UgdG8gdGhlIGFjdG9yXG4gICAgICAgIERJU0FCTEU6IHtcbiAgICAgICAgICBhY3Rpb25zOiAoY3R4LCBlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmZWF0dXJlID0gY3R4LmZlYXR1cmVzW2UubmFtZV07XG4gICAgICAgICAgICBpZiAoZmVhdHVyZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIGZlYXR1cmUuc2VuZCh7IHR5cGU6ICdESVNBQkxFJyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuXG4gICAgICAgIC8vIHdoZW4gYSBmZWF0dXJlIGlzIHVuc2V0LCBzZW5kIHRoZSB1bnNldCBtZXNzYWdlIHRvIHRoZSBhY3RvclxuICAgICAgICBVTlNFVDoge1xuICAgICAgICAgIGFjdGlvbnM6IChjdHgsIGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZlYXR1cmUgPSBjdHguZmVhdHVyZXNbZS5uYW1lXTtcbiAgICAgICAgICAgIGlmIChmZWF0dXJlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgZmVhdHVyZS5zZW5kKHsgdHlwZTogJ1VOU0VUJyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxufSk7XG4iLCAiaW1wb3J0IHsgYXNzaWduLCBjcmVhdGVNYWNoaW5lLCBEb25lSW52b2tlRXZlbnQsIEludGVycHJldGVyRnJvbSwgU3RhdGVGcm9tIH0gZnJvbSAneHN0YXRlJztcblxuLyoqXG4gKiBGZWF0dXJlIGlzIGVpdGhlciBvbiwgb2ZmLCBvciAndW5zZXQnLFxuICogd2hpY2ggbWVhbnMgaXQgd2lsbCBnbyB0byB0aGUgZGVmYXVsdCB2YWx1ZSBvciB0aGUgbGVzcyBzcGVjaWZpYyB2YWx1ZS5cbiAqL1xuZXhwb3J0IHR5cGUgRmVhdHVyZVZhbHVlID0gZmFsc2UgfCB0cnVlIHwgdW5kZWZpbmVkO1xuXG5leHBvcnQgdHlwZSBGZWF0dXJlU3RhdGUgPSBTdGF0ZUZyb208dHlwZW9mIEZlYXR1cmVNYWNoaW5lPjtcbmV4cG9ydCB0eXBlIEZlYXR1cmVEaXNwYXRjaCA9IEludGVycHJldGVyRnJvbTx0eXBlb2YgRmVhdHVyZU1hY2hpbmU+WydzZW5kJ107XG5cbi8vLyBHaXZlbiBhIGZlYXR1cmVzdGF0ZSwgZGV0ZXJtaW5lIHRoZSB2YWx1ZSAob24sIG9mZiwgb3IgdW5zZXQpXG5leHBvcnQgZnVuY3Rpb24gdmFsdWVGb3JTdGF0ZShmZWF0dXJlU3RhdGU6IEZlYXR1cmVTdGF0ZSk6IFtGZWF0dXJlVmFsdWUsIGJvb2xlYW5dIHtcbiAgcmV0dXJuIFtcbiAgICBmZWF0dXJlU3RhdGUubWF0Y2hlcygnZW5hYmxlZCcpID8gdHJ1ZSA6IGZlYXR1cmVTdGF0ZS5tYXRjaGVzKCdkaXNhYmxlZCcpID8gZmFsc2UgOiB1bmRlZmluZWQsXG4gICAgZmVhdHVyZVN0YXRlLmNvbnRleHQuZmVhdHVyZURlc2M/LmZvcmNlID8/IGZhbHNlLFxuICBdO1xufVxuXG4vKipcbiAqIERlZmluaXRpb24gb2YgYSBmZWF0dXJlIHRoYXQgY2FuIGJlIGVuYWJsZWQgb3IgZGlzYWJsZWQuXG4gKiBLIGlzIHRoZSB0eXBlIG9mIHRoZSBrZXkgdGhhdCBpcyB1c2VkIHRvIGlkZW50aWZ5IHRoZSBmZWF0dXJlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZlYXR1cmVEZXNjcmlwdGlvbjxLIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPiB7XG4gIHJlYWRvbmx5IG5hbWU6IEs7XG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8vLyBJZiBzZXQsIHdpbGwgYmUgdXNlZCB0byB1cGRhdGUgdGhlIGZlYXR1cmUgZGVmYXVsdCBzdGF0ZSBpbnN0ZWFkIG9mIHNpbXBseSBvdmVycmlkaW5nLlxuICAvLy8gRm9yIGV4YW1wbGUsIHlvdSBtaWdodCB1c2UgdGhpcyB0byB1cGRhdGUgYSBmZWF0dXJlIGZsYWcgb24gYSBiYWNrZW5kIHNlcnZlci5cbiAgLy8vIHdoZW4gc2V0LCB0aGUgZmVhdHVyZSB3aWxsIGJlIHVwZGF0ZWQgb24gdGhlIGJhY2tlbmQgc2VydmVyLCBhbmQgdGhlIHJlc3VsdCBvZiB0aGUgYXN5bmNcbiAgLy8vIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGZpbmFsIHN0YXRlIGFmdGVyIHRoZSBjaGFuZ2UuIHdoaWxlIGNoYW5naW5nLCB0aGUgZmVhdHVyZSB3aWxsIGJlXG4gIC8vLyBpbiB0aGUgJ2NoYW5naW5nJyBzdGF0ZS4gQWxzbyBub3RlIHRoYXQgdGhlIGZlYXR1cmUgd2lsbCBiZSBjaGFuZ2VkIGF0IHRoZSBcImRlZmF1bHRcIiBsYXllci5cbiAgcmVhZG9ubHkgb25DaGFuZ2VEZWZhdWx0PzogKG5hbWU6IEssIG5ld1ZhbHVlOiBGZWF0dXJlVmFsdWUpID0+IFByb21pc2U8RmVhdHVyZVZhbHVlPjtcblxuICAvLy8gaWYgc2V0IHRydWUsIHdpbGwgZm9yY2UgdGhlIGZpZWxkIHRvIHdoYXQgaXQgaXMgc2V0IGhlcmUgdGhyb3VnaCBsYXllcnMgb2Ygc3RhdGVzLlxuICAvLy8gdXNlZnVsIHRvIGludmVydCB0aGUgbGF5ZXJzLCBzaW1pbGFyIHRvICFpbXBvcnRhbnQgaW4gQ1NTLlxuICByZWFkb25seSBmb3JjZT86IGJvb2xlYW47XG5cbiAgLy8vIElmIHNldCB0byB0cnVlLCB0aGUgZmVhdHVyZSB3aWxsIG5vdCBiZSBvdmVycmlkYWJsZSBieSB0aGUgdXNlci5cbiAgcmVhZG9ubHkgbm9PdmVycmlkZT86IGJvb2xlYW47XG5cbiAgLy8vIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgd2hhdCBzaG91bGQgaGFwcGVuIGlmIHRoZSBmZWF0dXJlIGlzIG5vdCBzZXQgdG8gYSBwYXJ0aWN1bGFyIHZhbHVlLlxuICByZWFkb25seSBkZWZhdWx0VmFsdWU/OiBGZWF0dXJlVmFsdWU7XG59XG5cbmludGVyZmFjZSBGZWF0dXJlQ29udGV4dCB7XG4gIGZlYXR1cmVEZXNjPzogRmVhdHVyZURlc2NyaXB0aW9uO1xufVxuXG50eXBlIEZlYXR1cmVUeXBlU3RhdGUgPVxuICB8IHtcbiAgICAgIHZhbHVlOiAnYXN5bmNEZW5hYmxlZCc7XG4gICAgICBjb250ZXh0OiBGZWF0dXJlQ29udGV4dDtcbiAgICB9XG4gIHwge1xuICAgICAgdmFsdWU6ICdhc3luY0Rpc2FibGVkJztcbiAgICAgIGNvbnRleHQ6IEZlYXR1cmVDb250ZXh0O1xuICAgIH1cbiAgfCB7XG4gICAgICB2YWx1ZTogJ2FzeW5jVW5zcGVjaWVkJztcbiAgICAgIGNvbnRleHQ6IEZlYXR1cmVDb250ZXh0O1xuICAgIH1cbiAgfCB7XG4gICAgICB2YWx1ZTogJ2Rpc2FibGVkJztcbiAgICAgIGNvbnRleHQ6IEZlYXR1cmVDb250ZXh0O1xuICAgIH1cbiAgfCB7XG4gICAgICB2YWx1ZTogJ2VuYWJsZWQnO1xuICAgICAgY29udGV4dDogRmVhdHVyZUNvbnRleHQ7XG4gICAgfVxuICB8IHtcbiAgICAgIHZhbHVlOiAnaW5pdGlhbCc7XG4gICAgICBjb250ZXh0OiBuZXZlcjtcbiAgICB9XG4gIHwge1xuICAgICAgdmFsdWU6ICd1bnNwZWNpZWQnO1xuICAgICAgY29udGV4dDogRmVhdHVyZUNvbnRleHQ7XG4gICAgfTtcblxuLyoqXG4gKiBBY3Rpb25zIHRoYXQgY2FuIGJlIHBlcmZvcm1lZCBvbiBhIGZlYXR1cmUuXG4gKi9cbmV4cG9ydCB0eXBlIEZlYXR1cmVBY3Rpb24gPVxuICB8IHsgdHlwZTogJ0RJU0FCTEUnIH1cbiAgfCB7IHR5cGU6ICdFTkFCTEUnIH1cbiAgfCB7IHR5cGU6ICdJTklUJzsgZmVhdHVyZTogRmVhdHVyZURlc2NyaXB0aW9uIH1cbiAgfCB7IHR5cGU6ICdTRVQnOyB2YWx1ZTogRmVhdHVyZVZhbHVlIH1cbiAgfCB7IHR5cGU6ICdUT0dHTEUnIH1cbiAgfCB7IHR5cGU6ICdVTlNFVCcgfTtcblxuLyoqXG4gKiBGdWxseSBkZXNjcmliZSB0aGUgc3RhdGVzIGEgZmVhdHVyZSBjYW4gYmUgaW5cbiAqL1xuZXhwb3J0IGNvbnN0IEZlYXR1cmVNYWNoaW5lID0gY3JlYXRlTWFjaGluZTxGZWF0dXJlQ29udGV4dCwgRmVhdHVyZUFjdGlvbiwgRmVhdHVyZVR5cGVTdGF0ZT4oe1xuICBpZDogJ2ZlYXR1cmUnLFxuICBpbml0aWFsOiAnaW5pdGlhbCcsXG4gIGNvbnRleHQ6IHt9LFxuICBwcmVkaWN0YWJsZUFjdGlvbkFyZ3VtZW50czogdHJ1ZSxcbiAgb246IHtcbiAgICBFTkFCTEU6IFtcbiAgICAgIHsgdGFyZ2V0OiAnYXN5bmNFbmFibGVkJywgY29uZDogKGN0eCkgPT4gY3R4LmZlYXR1cmVEZXNjPy5vbkNoYW5nZURlZmF1bHQgIT0gbnVsbCB9LFxuICAgICAgeyB0YXJnZXQ6ICdlbmFibGVkJyB9LFxuICAgIF0sXG5cbiAgICBUT0dHTEU6IFtcbiAgICAgIHsgdGFyZ2V0OiAnYXN5bmNFbmFibGVkJywgY29uZDogKGN0eCkgPT4gY3R4LmZlYXR1cmVEZXNjPy5vbkNoYW5nZURlZmF1bHQgIT0gbnVsbCB9LFxuICAgICAgeyB0YXJnZXQ6ICdlbmFibGVkJyB9LFxuICAgIF0sXG5cbiAgICBESVNBQkxFOiBbXG4gICAgICB7IHRhcmdldDogJ2FzeW5jRGlzYWJsZWQnLCBjb25kOiAoY3R4KSA9PiBjdHguZmVhdHVyZURlc2M/Lm9uQ2hhbmdlRGVmYXVsdCAhPSBudWxsIH0sXG4gICAgICB7IHRhcmdldDogJ2Rpc2FibGVkJyB9LFxuICAgIF0sXG5cbiAgICBVTlNFVDogW1xuICAgICAgeyB0YXJnZXQ6ICdhc3luY1Vuc3BlY2llZCcsIGNvbmQ6IChjdHgpID0+IGN0eC5mZWF0dXJlRGVzYz8ub25DaGFuZ2VEZWZhdWx0ICE9IG51bGwgfSxcbiAgICAgIHsgdGFyZ2V0OiAndW5zcGVjaWZpZWQnIH0sXG4gICAgXSxcblxuICAgIFNFVDogW1xuICAgICAge1xuICAgICAgICB0YXJnZXQ6ICdhc3luY0VuYWJsZWQnLFxuICAgICAgICBjb25kOiAoY3R4LCBlKSA9PiBlLnZhbHVlID09PSB0cnVlICYmIGN0eC5mZWF0dXJlRGVzYz8ub25DaGFuZ2VEZWZhdWx0ICE9IG51bGwsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB0YXJnZXQ6ICdhc3luY0Rpc2FibGVkJyxcbiAgICAgICAgY29uZDogKGN0eCwgZSkgPT4gZS52YWx1ZSA9PT0gZmFsc2UgJiYgY3R4LmZlYXR1cmVEZXNjPy5vbkNoYW5nZURlZmF1bHQgIT0gbnVsbCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHRhcmdldDogJ2FzeW5jVW5zcGVjaWVkJyxcbiAgICAgICAgY29uZDogKGN0eCwgX2UpID0+IGN0eC5mZWF0dXJlRGVzYz8ub25DaGFuZ2VEZWZhdWx0ICE9IG51bGwsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB0YXJnZXQ6ICdlbmFibGVkJyxcbiAgICAgICAgY29uZDogKF9jdHgsIGUpID0+IGUudmFsdWUgPT09IHRydWUsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB0YXJnZXQ6ICdkaXNhYmxlZCcsXG4gICAgICAgIGNvbmQ6IChfY3R4LCBlKSA9PiBlLnZhbHVlID09PSBmYWxzZSxcbiAgICAgIH0sXG4gICAgICB7IHRhcmdldDogJ3Vuc3BlY2lmaWVkJyB9LFxuICAgIF0sXG4gIH0sXG5cbiAgc3RhdGVzOiB7XG4gICAgaW5pdGlhbDoge1xuICAgICAgb246IHtcbiAgICAgICAgSU5JVDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbnM6IGFzc2lnbih7IGZlYXR1cmVEZXNjOiAoXywgZSkgPT4gZS5mZWF0dXJlIH0pLFxuICAgICAgICAgICAgdGFyZ2V0OiAnZW5hYmxlZCcsXG4gICAgICAgICAgICBjb25kOiAoXywgZSkgPT4gZS5mZWF0dXJlLmRlZmF1bHRWYWx1ZSA9PT0gdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbnM6IGFzc2lnbih7IGZlYXR1cmVEZXNjOiAoXywgZSkgPT4gZS5mZWF0dXJlIH0pLFxuICAgICAgICAgICAgdGFyZ2V0OiAndW5zcGVjaWZpZWQnLFxuICAgICAgICAgICAgY29uZDogKF8sIGUpID0+IGUuZmVhdHVyZS5kZWZhdWx0VmFsdWUgPT09IHVuZGVmaW5lZCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbnM6IGFzc2lnbih7IGZlYXR1cmVEZXNjOiAoXywgZSkgPT4gZS5mZWF0dXJlIH0pLFxuICAgICAgICAgICAgdGFyZ2V0OiAnZGlzYWJsZWQnLFxuICAgICAgICAgICAgY29uZDogKF8sIGUpID0+IGUuZmVhdHVyZS5kZWZhdWx0VmFsdWUgPT09IGZhbHNlLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0sXG5cbiAgICB1bnNwZWNpZmllZDoge30sXG4gICAgZGlzYWJsZWQ6IHt9LFxuICAgIGVuYWJsZWQ6IHt9LFxuXG4gICAgYXN5bmNEaXNhYmxlZDoge1xuICAgICAgaW52b2tlOiB7XG4gICAgICAgIGlkOiAnc2V0LW9mZi11cHN0cmVhbScsXG4gICAgICAgIHNyYzogYXN5bmMgKGN0eCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG9uY2hhbmdlID0gY3R4LmZlYXR1cmVEZXNjPy5vbkNoYW5nZURlZmF1bHQ7XG4gICAgICAgICAgaWYgKG9uY2hhbmdlICE9IG51bGwgJiYgY3R4LmZlYXR1cmVEZXNjICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBvbmNoYW5nZShjdHguZmVhdHVyZURlc2MubmFtZSwgZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9LFxuICAgICAgICBvbkRvbmU6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0YXJnZXQ6ICdlbmFibGVkJyxcbiAgICAgICAgICAgIGNvbmQ6IChfY3R4LCBlOiBEb25lSW52b2tlRXZlbnQ8RmVhdHVyZVZhbHVlPikgPT4gZS5kYXRhID09PSB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgdGFyZ2V0OiAnZGlzYWJsZWQnLFxuICAgICAgICAgICAgY29uZDogKF9jdHgsIGU6IERvbmVJbnZva2VFdmVudDxGZWF0dXJlVmFsdWU+KSA9PiBlLmRhdGEgPT09IGZhbHNlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgeyB0YXJnZXQ6ICd1bnNwZWNpZmllZCcgfSxcbiAgICAgICAgXSxcbiAgICAgICAgb25FcnJvcjogJ3Vuc3BlY2lmaWVkJyxcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIGFzeW5jVW5zcGVjaWVkOiB7XG4gICAgICBpbnZva2U6IHtcbiAgICAgICAgaWQ6ICdzZXQtdW5zZXQtdXBzdHJlYW0nLFxuICAgICAgICBzcmM6IGFzeW5jIChjdHgpID0+IHtcbiAgICAgICAgICBjb25zdCBvbmNoYW5nZSA9IGN0eC5mZWF0dXJlRGVzYz8ub25DaGFuZ2VEZWZhdWx0O1xuICAgICAgICAgIGlmIChvbmNoYW5nZSAhPSBudWxsICYmIGN0eC5mZWF0dXJlRGVzYyAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gb25jaGFuZ2UoY3R4LmZlYXR1cmVEZXNjLm5hbWUsIHVuZGVmaW5lZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH0sXG4gICAgICAgIG9uRG9uZTogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRhcmdldDogJ2VuYWJsZWQnLFxuICAgICAgICAgICAgY29uZDogKF9jdHgsIGU6IERvbmVJbnZva2VFdmVudDxGZWF0dXJlVmFsdWU+KSA9PiBlLmRhdGEgPT09IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0YXJnZXQ6ICdkaXNhYmxlZCcsXG4gICAgICAgICAgICBjb25kOiAoX2N0eCwgZTogRG9uZUludm9rZUV2ZW50PEZlYXR1cmVWYWx1ZT4pID0+IGUuZGF0YSA9PT0gZmFsc2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IHRhcmdldDogJ3Vuc3BlY2lmaWVkJyB9LFxuICAgICAgICBdLFxuICAgICAgICBvbkVycm9yOiAndW5zcGVjaWZpZWQnLFxuICAgICAgfSxcbiAgICB9LFxuXG4gICAgYXN5bmNFbmFibGVkOiB7XG4gICAgICBpbnZva2U6IHtcbiAgICAgICAgaWQ6ICdzZXQtb24tdXBzdHJlYW0nLFxuICAgICAgICBzcmM6IGFzeW5jIChjdHgpID0+IHtcbiAgICAgICAgICBjb25zdCBvbmNoYW5nZSA9IGN0eC5mZWF0dXJlRGVzYz8ub25DaGFuZ2VEZWZhdWx0O1xuICAgICAgICAgIGlmIChvbmNoYW5nZSAhPSBudWxsICYmIGN0eC5mZWF0dXJlRGVzYyAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gb25jaGFuZ2UoY3R4LmZlYXR1cmVEZXNjLm5hbWUsIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9LFxuICAgICAgICBvbkRvbmU6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0YXJnZXQ6ICdlbmFibGVkJyxcbiAgICAgICAgICAgIGNvbmQ6IChfY3R4LCBlOiBEb25lSW52b2tlRXZlbnQ8RmVhdHVyZVZhbHVlPikgPT4gZS5kYXRhID09PSB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgdGFyZ2V0OiAnZGlzYWJsZWQnLFxuICAgICAgICAgICAgY29uZDogKF9jdHgsIGU6IERvbmVJbnZva2VFdmVudDxGZWF0dXJlVmFsdWU+KSA9PiBlLmRhdGEgPT09IGZhbHNlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgeyB0YXJnZXQ6ICd1bnNwZWNpZmllZCcgfSxcbiAgICAgICAgXSxcbiAgICAgICAgb25FcnJvcjogJ3Vuc3BlY2lmaWVkJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn0pO1xuIiwgImltcG9ydCBSZWFjdCwgeyB1c2VNZW1vLCBSZWFjdE5vZGUsIHVzZUVmZmVjdCwgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgeyB1c2VNYWNoaW5lIH0gZnJvbSAnQHhzdGF0ZS9yZWFjdCc7XG5cbmltcG9ydCB7IEVuYWJsZUNvbnRleHQgfSBmcm9tICcuL0VuYWJsZUNvbnRleHQnO1xuaW1wb3J0IHsgRmVhdHVyZUNvbnRleHQgfSBmcm9tICcuL0ZlYXR1cmVDb250ZXh0JztcbmltcG9ydCB7IEZlYXR1cmVzTWFjaGluZSB9IGZyb20gJy4vRmVhdHVyZXNTdGF0ZSc7XG5pbXBvcnQgeyBGZWF0dXJlRGVzY3JpcHRpb24gfSBmcm9tICcuL0ZlYXR1cmVTdGF0ZSc7XG5pbXBvcnQgdXNlQ29uc29sZU92ZXJyaWRlIGZyb20gJy4vdXNlQ29uc29sZU92ZXJyaWRlJztcbmltcG9ydCB1c2VQZXJzaXN0LCB7IEtFWSB9IGZyb20gJy4vdXNlUGVyc2lzdCc7XG5pbXBvcnQgdXNlVGVzdENhbGxiYWNrIGZyb20gJy4vdXNlVGVzdENhbGxiYWNrJztcblxuaW50ZXJmYWNlIEZlYXR1cmVQcm9wcyB7XG4gIHJlYWRvbmx5IGZlYXR1cmVzOiByZWFkb25seSBGZWF0dXJlRGVzY3JpcHRpb25bXTtcbiAgcmVhZG9ubHkgY2hpbGRyZW4/OiBSZWFjdE5vZGU7XG4gIHJlYWRvbmx5IGRpc2FibGVDb25zb2xlPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc3RvcmFnZT86IFN0b3JhZ2U7XG59XG5cbi8qKlxuICogQSBtb3JlIGJhdHRlcmllcy1lbmFibGVkIHBhcmVudCBjb21wb25lbnQgdGhhdCBrZWVwcyB0cmFjayBvZiBmZWF0dXJlIHN0YXRlXG4gKiBpbnRlcm5hbGx5LCBhbmQgY3JlYXRlcyB3aW5kb3cuZmVhdHVyZS5lbmFibGUoXCJmXCIpIGFuZCB3aW5kb3cuZmVhdHVyZS5kaXNhYmxlKFwiZlwiKS5cbiAqIEtlZXBzIHRyYWNrIG9mIG92ZXJyaWRlcyBhbmQgZGVmYXVsdHMsIHdpdGggZGVmYXVsdHMgcG90ZW50aWFsbHkgY29taW5nIGZyb20geW91ciBwcm9wc1xuICogYW5kIG92ZXJyaWRlcyBiZWluZyBwZXJzaXN0ZWQgdG8geW91ciBjaG9pY2Ugb2Ygc3RvcmFnZSBsYXllci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEZlYXR1cmVzKHtcbiAgY2hpbGRyZW4sXG4gIGZlYXR1cmVzLFxuICBkaXNhYmxlQ29uc29sZSA9IGZhbHNlLFxuICBzdG9yYWdlID0gd2luZG93LnNlc3Npb25TdG9yYWdlLFxufTogRmVhdHVyZVByb3BzKTogSlNYLkVsZW1lbnQge1xuICAvLyBDYXB0dXJlIG9ubHkgZmlyc3QgdmFsdWU7IHdlIGRvbid0IGNhcmUgYWJvdXQgZnV0dXJlIHVwZGF0ZXNcbiAgY29uc3QgZmVhdHVyZXNSZWYgPSB1c2VSZWYoZmVhdHVyZXMpO1xuICBjb25zdCBbb3ZlcnJpZGVzU3RhdGUsIG92ZXJyaWRlc1NlbmRdID0gdXNlTWFjaGluZShGZWF0dXJlc01hY2hpbmUpO1xuICBjb25zdCBbZGVmYXVsdHNTdGF0ZSwgZGVmYXVsdHNTZW5kXSA9IHVzZU1hY2hpbmUoRmVhdHVyZXNNYWNoaW5lKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIC8vLyBMb2FkIGRlZmF1bHRzXG4gICAgZGVmYXVsdHNTZW5kKHsgdHlwZTogJ0lOSVQnLCBmZWF0dXJlcyB9KTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgZGVmYXVsdHNTZW5kKHsgdHlwZTogJ0RFX0lOSVQnIH0pO1xuICAgIH07XG4gIH0sIFtkZWZhdWx0c1NlbmQsIGZlYXR1cmVzXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBsZXQgZjogUmVjb3JkPHN0cmluZywgYm9vbGVhbiB8IHVuZGVmaW5lZD4gPSB7fTtcbiAgICBpZiAoc3RvcmFnZSAhPSBudWxsKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBmZWF0dXJlc0pzb24gPSBzdG9yYWdlLmdldEl0ZW0oS0VZKTtcbiAgICAgICAgaWYgKGZlYXR1cmVzSnNvbiAhPSBudWxsKSB7XG4gICAgICAgICAgY29uc3QgZmggPSBKU09OLnBhcnNlKGZlYXR1cmVzSnNvbik7XG4gICAgICAgICAgZiA9IGZoLm92ZXJyaWRlcztcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBDYW4ndCBwYXJzZSBvciBnZXQgb3Igb3RoZXJ3aXNlOyBpZ25vcmVcbiAgICAgICAgY29uc29sZS5lcnJvcignZXJyb3IgaW4gbG9jYWxTdG9yYWdlJywgZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgb3ZlcnJpZGVzU2VuZCh7XG4gICAgICB0eXBlOiAnSU5JVCcsXG4gICAgICBmZWF0dXJlczogZmVhdHVyZXNSZWYuY3VycmVudFxuICAgICAgICAuZmlsdGVyKCh4KSA9PiB4Lm5vT3ZlcnJpZGUgIT09IHRydWUpXG4gICAgICAgIC5tYXAoKHgpID0+ICh7IG5hbWU6IHgubmFtZSwgZGVzY3JpcHRpb246IHguZGVzY3JpcHRpb24sIGRlZmF1bHRWYWx1ZTogZj8uW3gubmFtZV0gPz8gdW5kZWZpbmVkIH0pKSxcbiAgICB9KTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBvdmVycmlkZXNTZW5kKHsgdHlwZTogJ0RFX0lOSVQnIH0pO1xuICAgIH07XG4gIH0sIFtmZWF0dXJlc1JlZiwgb3ZlcnJpZGVzU2VuZCwgc3RvcmFnZV0pO1xuXG4gIHVzZVBlcnNpc3Qoc3RvcmFnZSwgZmVhdHVyZXNSZWYuY3VycmVudCwgb3ZlcnJpZGVzU3RhdGUpO1xuXG4gIGNvbnN0IHRlc3RDYWxsYmFjayA9IHVzZVRlc3RDYWxsYmFjayhvdmVycmlkZXNTdGF0ZSwgZGVmYXVsdHNTdGF0ZSk7XG4gIHVzZUNvbnNvbGVPdmVycmlkZSghZGlzYWJsZUNvbnNvbGUsIGZlYXR1cmVzUmVmLmN1cnJlbnQsIHRlc3RDYWxsYmFjaywgZGVmYXVsdHNTZW5kKTtcblxuICBjb25zdCBmZWF0dXJlVmFsdWUgPSB1c2VNZW1vKFxuICAgICgpID0+ICh7XG4gICAgICBvdmVycmlkZXNTZW5kLFxuICAgICAgZGVmYXVsdHNTZW5kLFxuICAgICAgZmVhdHVyZXNEZXNjcmlwdGlvbjogZmVhdHVyZXNSZWYuY3VycmVudCxcbiAgICAgIG92ZXJyaWRlc1N0YXRlLFxuICAgICAgZGVmYXVsdHNTdGF0ZSxcbiAgICAgIHRlc3Q6IHRlc3RDYWxsYmFjayxcbiAgICB9KSxcbiAgICBbb3ZlcnJpZGVzU2VuZCwgZGVmYXVsdHNTZW5kLCBvdmVycmlkZXNTdGF0ZSwgZGVmYXVsdHNTdGF0ZSwgdGVzdENhbGxiYWNrXVxuICApO1xuXG4gIHJldHVybiAoXG4gICAgPEZlYXR1cmVDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXtmZWF0dXJlVmFsdWV9PlxuICAgICAgPEVuYWJsZUNvbnRleHQuUHJvdmlkZXIgdmFsdWU9e3Rlc3RDYWxsYmFja30+e2NoaWxkcmVufTwvRW5hYmxlQ29udGV4dC5Qcm92aWRlcj5cbiAgICA8L0ZlYXR1cmVDb250ZXh0LlByb3ZpZGVyPlxuICApO1xufVxuIiwgImltcG9ydCB7IGNyZWF0ZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCB7IEZlYXR1cmVWYWx1ZSB9IGZyb20gJy4vRmVhdHVyZVN0YXRlJztcblxuZXhwb3J0IHR5cGUgRW5hYmxlQ29udGV4dFR5cGUgPSAoZmVhdHVyZTogc3RyaW5nKSA9PiBGZWF0dXJlVmFsdWU7XG5cbi8qKlxuICogQ29udGFpbmVkIGZ1bmN0aW9uIGNhbiBjaGVjayB3aGV0aGVyIGEgZ2l2ZW4gZmVhdHVyZSBpcyBlbmFibGVkLlxuICovXG5leHBvcnQgY29uc3QgRW5hYmxlQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8RW5hYmxlQ29udGV4dFR5cGU+KChfcykgPT4gZmFsc2UpO1xuIiwgImltcG9ydCB7IGNyZWF0ZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCB7IEZlYXR1cmVzRGlzcGF0Y2gsIEZlYXR1cmVzU3RhdGUgfSBmcm9tICcuL0ZlYXR1cmVzU3RhdGUnO1xuaW1wb3J0IHsgRmVhdHVyZURlc2NyaXB0aW9uLCBGZWF0dXJlVmFsdWUgfSBmcm9tICcuL0ZlYXR1cmVTdGF0ZSc7XG5cbmV4cG9ydCBjb25zdCBGZWF0dXJlQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8RmVhdHVyZUNvbnRleHRUeXBlIHwgbnVsbD4obnVsbCk7XG5cbi8vLyBHaXZlIGFjY2VzcyB0byB0aGUgb3ZlcnJpZGVzIGxheWVyXG5leHBvcnQgaW50ZXJmYWNlIEZlYXR1cmVDb250ZXh0VHlwZSB7XG4gIC8vIE1ha2UgY2hhbmdlcyB0byB0aGUgb3ZlcnJpZGVzXG4gIG92ZXJyaWRlc1NlbmQ6IEZlYXR1cmVzRGlzcGF0Y2g7XG5cbiAgLy8gTWFrZSBjaGFuZ2VzIHRvIGRlZmF1bHRzXG4gIGRlZmF1bHRzU2VuZDogRmVhdHVyZXNEaXNwYXRjaDtcblxuICBmZWF0dXJlc0Rlc2NyaXB0aW9uOiByZWFkb25seSBGZWF0dXJlRGVzY3JpcHRpb25bXTtcblxuICAvLyBTdGF0ZSBpcyBpbiBsYXllcnM7IG92ZXJyaWRlcyBhbmQgZGVmYXVsdHNcbiAgb3ZlcnJpZGVzU3RhdGU6IEZlYXR1cmVzU3RhdGU7XG4gIGRlZmF1bHRzU3RhdGU6IEZlYXR1cmVzU3RhdGU7XG5cbiAgLy8vIFRlc3Qgd2l0aCBwcm9wZXIgZmFsbGJhY2sgYW5kIHJlc3BlY3RpbmcgdGhlIHVzZXIncyBmb3JjZSBwcmVmZXJlbmNlXG4gIHRlc3Q6IChmbGFnOiBzdHJpbmcpID0+IEZlYXR1cmVWYWx1ZTtcbn1cbiIsICJpbXBvcnQgeyB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCB7IEZlYXR1cmVzRGlzcGF0Y2ggfSBmcm9tICcuL0ZlYXR1cmVzU3RhdGUnO1xuaW1wb3J0IHsgRmVhdHVyZURlc2NyaXB0aW9uLCBGZWF0dXJlVmFsdWUgfSBmcm9tICcuL0ZlYXR1cmVTdGF0ZSc7XG5pbXBvcnQgeyBHbG9iYWxFbmFibGUgfSBmcm9tICcuL0dsb2JhbEVuYWJsZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZUNvbnNvbGVPdmVycmlkZShcbiAgY29uc29sZU92ZXJyaWRlOiBib29sZWFuLFxuICBmZWF0dXJlczogcmVhZG9ubHkgRmVhdHVyZURlc2NyaXB0aW9uW10sXG4gIHRlc3RGZWF0dXJlOiAoXzogc3RyaW5nKSA9PiBGZWF0dXJlVmFsdWUsXG4gIGRpc3BhdGNoOiBGZWF0dXJlc0Rpc3BhdGNoXG4pOiB2b2lkIHtcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWNvbnNvbGVPdmVycmlkZSkge1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgLyogZW1wdHkgKi9cbiAgICAgIH07XG4gICAgfVxuICAgIHdpbmRvdy5mZWF0dXJlID0gbmV3IEdsb2JhbEVuYWJsZShkaXNwYXRjaCwgdGVzdEZlYXR1cmUsIGZlYXR1cmVzKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgaWYgKHdpbmRvdy5mZWF0dXJlICE9IG51bGwpIHtcbiAgICAgICAgZGVsZXRlIHdpbmRvdy5mZWF0dXJlO1xuICAgICAgfVxuICAgIH07XG4gIH0sIFtmZWF0dXJlcywgZGlzcGF0Y2gsIGNvbnNvbGVPdmVycmlkZSwgdGVzdEZlYXR1cmVdKTtcbn1cbiIsICJpbXBvcnQgeyBGZWF0dXJlc0Rpc3BhdGNoIH0gZnJvbSAnLi9GZWF0dXJlc1N0YXRlJztcbmltcG9ydCB7IEZlYXR1cmVEZXNjcmlwdGlvbiwgRmVhdHVyZVZhbHVlIH0gZnJvbSAnLi9GZWF0dXJlU3RhdGUnO1xuXG5leHBvcnQgY2xhc3MgR2xvYmFsRW5hYmxlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBmZWF0dXJlRGVzYzogcmVhZG9ubHkgRmVhdHVyZURlc2NyaXB0aW9uW107XG4gIHByaXZhdGUgcmVhZG9ubHkgZGlzcGF0Y2g6IEZlYXR1cmVzRGlzcGF0Y2g7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGVzdEZlYXR1cmU6ICh2YWx1ZTogc3RyaW5nKSA9PiBGZWF0dXJlVmFsdWU7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZGlzcGF0Y2g6IEZlYXR1cmVzRGlzcGF0Y2gsXG4gICAgdGVzdEZlYXR1cmU6IChfOiBzdHJpbmcpID0+IEZlYXR1cmVWYWx1ZSxcbiAgICBmZWF0dXJlRGVzYzogcmVhZG9ubHkgRmVhdHVyZURlc2NyaXB0aW9uW11cbiAgKSB7XG4gICAgdGhpcy5mZWF0dXJlRGVzYyA9IGZlYXR1cmVEZXNjO1xuICAgIHRoaXMuZGlzcGF0Y2ggPSBkaXNwYXRjaDtcbiAgICB0aGlzLnRlc3RGZWF0dXJlID0gdGVzdEZlYXR1cmU7XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlKGZlYXR1cmU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZGlzcGF0Y2goeyB0eXBlOiAnVE9HR0xFJywgbmFtZTogZmVhdHVyZSB9KTtcbiAgfVxuXG4gIHB1YmxpYyBlbmFibGUoZmVhdHVyZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwYXRjaCh7IHR5cGU6ICdFTkFCTEUnLCBuYW1lOiBmZWF0dXJlIH0pO1xuICB9XG5cbiAgcHVibGljIHVuc2V0KGZlYXR1cmU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZGlzcGF0Y2goeyB0eXBlOiAnVU5TRVQnLCBuYW1lOiBmZWF0dXJlIH0pO1xuICB9XG5cbiAgcHVibGljIGRpc2FibGUoZmVhdHVyZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwYXRjaCh7IHR5cGU6ICdESVNBQkxFJywgbmFtZTogZmVhdHVyZSB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRBbGwoZmVhdHVyZXM6IHsgW2tleTogc3RyaW5nXTogRmVhdHVyZVZhbHVlIH0pOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BhdGNoKHsgdHlwZTogJ1NFVF9BTEwnLCBmZWF0dXJlcyB9KTtcbiAgfVxuXG4gIHB1YmxpYyBsaXN0RmVhdHVyZXMoKTogcmVhZG9ubHkgW3N0cmluZywgRmVhdHVyZVZhbHVlXVtdIHtcbiAgICByZXR1cm4gdGhpcy5mZWF0dXJlRGVzYy5tYXAoKGYpID0+IFtmLm5hbWUsIHRoaXMudGVzdEZlYXR1cmUoZi5uYW1lKV0pO1xuICB9XG59XG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBXaW5kb3cge1xuICAgIGZlYXR1cmU/OiBHbG9iYWxFbmFibGU7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyB1c2VNZW1vLCB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCB7IEZlYXR1cmVzU3RhdGUsIHZhbHVlT2ZGZWF0dXJlIH0gZnJvbSAnLi9GZWF0dXJlc1N0YXRlJztcbmltcG9ydCB7IEZlYXR1cmVEZXNjcmlwdGlvbiwgRmVhdHVyZVZhbHVlIH0gZnJvbSAnLi9GZWF0dXJlU3RhdGUnO1xuXG5leHBvcnQgY29uc3QgS0VZID0gJ3JlYWN0LWVuYWJsZTpmZWF0dXJlLXZhbHVlcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZVBlcnNpc3QoXG4gIHN0b3JhZ2U6IFN0b3JhZ2UgfCB1bmRlZmluZWQsXG4gIGZlYXR1cmVzOiByZWFkb25seSBGZWF0dXJlRGVzY3JpcHRpb25bXSxcbiAgb3ZlcnJpZGVTdGF0ZTogRmVhdHVyZXNTdGF0ZVxuKTogdm9pZCB7XG4gIGNvbnN0IG92ZXJyaWRlcyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IG5ld092ZXJyaWRlczogeyBba2V5OiBzdHJpbmddOiBGZWF0dXJlVmFsdWUgfSA9IHt9O1xuICAgIGlmIChvdmVycmlkZVN0YXRlLm1hdGNoZXMoJ3JlYWR5JykpIHtcbiAgICAgIGZvciAoY29uc3QgZmVhdHVyZSBvZiBmZWF0dXJlcykge1xuICAgICAgICBjb25zdCBbdmFsdWVdID0gdmFsdWVPZkZlYXR1cmUob3ZlcnJpZGVTdGF0ZSwgZmVhdHVyZS5uYW1lKTtcbiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICBuZXdPdmVycmlkZXNbZmVhdHVyZS5uYW1lXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXdPdmVycmlkZXM7XG4gIH0sIFtmZWF0dXJlcywgb3ZlcnJpZGVTdGF0ZV0pO1xuXG4gIGNvbnN0IHN0clN0YXRlID0gT2JqZWN0LmtleXMob3ZlcnJpZGVzKS5sZW5ndGggPT09IDAgfHwgc3RvcmFnZSA9PSBudWxsID8gJ3t9JyA6IEpTT04uc3RyaW5naWZ5KHsgb3ZlcnJpZGVzIH0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChzdG9yYWdlICE9IG51bGwgJiYgb3ZlcnJpZGVTdGF0ZS5tYXRjaGVzKCdyZWFkeScpKSB7XG4gICAgICAgIHN0b3JhZ2Uuc2V0SXRlbShLRVksIHN0clN0YXRlKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBDYW4ndCBzZXQgZm9yIHNvbWUgcmVhc29uXG4gICAgfVxuICB9LCBbb3ZlcnJpZGVTdGF0ZSwgc3RvcmFnZSwgc3RyU3RhdGVdKTtcbn1cbiIsICJpbXBvcnQgeyB1c2VDYWxsYmFjayB9IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHsgRmVhdHVyZXNTdGF0ZSB9IGZyb20gJy4vRmVhdHVyZXNTdGF0ZSc7XG5pbXBvcnQgdGVzdEZlYXR1cmUgZnJvbSAnLi90ZXN0RmVhdHVyZSc7XG5cbi8vLyBBIGNhbGxiYWNrIHRoYXQgY2FuIGJlIGNhbGxlZCB0byB0ZXN0IGlmIGEgZmVhdHVyZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VUZXN0Q2FsbGJhY2soXG4gIGRlZmF1bHRzU3RhdGU6IEZlYXR1cmVzU3RhdGUsXG4gIG92ZXJyaWRlc1N0YXRlOiBGZWF0dXJlc1N0YXRlXG4pOiAoZmVhdHVyZTogc3RyaW5nKSA9PiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHVzZUNhbGxiYWNrKChmOiBzdHJpbmcpID0+IHRlc3RGZWF0dXJlKGYsIFtkZWZhdWx0c1N0YXRlLCBvdmVycmlkZXNTdGF0ZV0pLCBbZGVmYXVsdHNTdGF0ZSwgb3ZlcnJpZGVzU3RhdGVdKTtcbn1cbiIsICJpbXBvcnQgeyBGZWF0dXJlc1N0YXRlLCB2YWx1ZU9mRmVhdHVyZSB9IGZyb20gJy4vRmVhdHVyZXNTdGF0ZSc7XG5pbXBvcnQgeyBGZWF0dXJlVmFsdWUgfSBmcm9tICcuL0ZlYXR1cmVTdGF0ZSc7XG5cbi8qKiBEZXRlcm1pbmUgaWYgdGhlIGZlYXR1cmUgaXMgZW5hYmxlZCBpbiBvbmUgb2YgdGhlIHN0YXRlIG1hY2hpbmVzLCBpbiBvcmRlclxuICpcbiAqIEBwYXJhbSBzdGF0ZSBUaGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgbWFjaGluZVxuICogQHBhcmFtIGZlYXR1cmUgVGhlIGZlYXR1cmUgdG8gY2hlY2tcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0ZXN0RmVhdHVyZShmZWF0dXJlOiBzdHJpbmcsIHN0YXRlczogRmVhdHVyZXNTdGF0ZVtdKTogRmVhdHVyZVZhbHVlIHtcbiAgY29uc3QgdmFsdWVzID0gc3RhdGVzLm1hcCgoc3RhdGUpID0+IHZhbHVlT2ZGZWF0dXJlKHN0YXRlLCBmZWF0dXJlKSk7XG5cbiAgLy8gbG9vayBmb3IgYmVzdCBmb3JjZWQgb3B0aW9uLCBpbiBvcmRlclxuICBmb3IgKGNvbnN0IFtmZWF0dXJlVmFsdWUsIGZlYXR1cmVGb3JjZWRdIG9mIHZhbHVlcykge1xuICAgIGlmIChmZWF0dXJlVmFsdWUgIT0gbnVsbCAmJiBmZWF0dXJlRm9yY2VkKSB7XG4gICAgICByZXR1cm4gZmVhdHVyZVZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIC8vIGxvb2sgZm9yIGJlc3Qgbm9uLWZvcmNlZCBvcHRpb24sIGluIG9yZGVyXG4gIGZvciAoY29uc3QgW2ZlYXR1cmVWYWx1ZV0gb2YgdmFsdWVzKSB7XG4gICAgaWYgKGZlYXR1cmVWYWx1ZSAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gZmVhdHVyZVZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIC8vIHVuc2V0IGlmIG5vdGhpbmcgaGl0XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG4iLCAiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgeyB1c2VBbGxFbmFibGVkIH0gZnJvbSAnLi91c2VBbGxFbmFibGVkJztcbmltcG9ydCB7IHVzZUVuYWJsZWQgfSBmcm9tICcuL3VzZUVuYWJsZWQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEVuYWJsZVByb3BzIHtcbiAgcmVhZG9ubHkgZmVhdHVyZT86IHN0cmluZ1tdIHwgc3RyaW5nO1xuICByZWFkb25seSBhbGxGZWF0dXJlcz86IHN0cmluZ1tdO1xuICBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlO1xufVxuXG4vKipcbiAqIEZlYXR1cmUgd2lsbCBiZSBlbmFibGVkIGlmIGFueSBmZWF0dXJlIGluIHRoZSBsaXN0IGFyZSBlbmFibGVkLFxuICovXG5leHBvcnQgZnVuY3Rpb24gRW5hYmxlKHsgZmVhdHVyZSA9IFtdLCBhbGxGZWF0dXJlcyA9IFtdLCBjaGlsZHJlbiB9OiBFbmFibGVQcm9wcyk6IEpTWC5FbGVtZW50IHwgbnVsbCB7XG4gIGNvbnN0IGlzQW55ID0gdXNlRW5hYmxlZChmZWF0dXJlKTtcbiAgY29uc3QgaXNBbGwgPSB1c2VBbGxFbmFibGVkKGFsbEZlYXR1cmVzKTtcblxuICBpZiAoaXNBbnkgfHwgaXNBbGwpIHtcbiAgICByZXR1cm4gPD57Y2hpbGRyZW59PC8+O1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4iLCAiaW1wb3J0IHsgdXNlQ29udGV4dCwgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHsgRW5hYmxlQ29udGV4dFR5cGUsIEVuYWJsZUNvbnRleHQgfSBmcm9tICcuL0VuYWJsZUNvbnRleHQnO1xuXG4vLyBIZWxwZXI6IGdldCByaWQgb2Ygc29tZSBib2lsZXJwbGF0ZS5cbi8vIGp1c3QgaW5wdXQgbWFzaGluZyBhbmQgc2FuaXRhdGlvbiwgcmVtb3ZpbmcgZXh0cmEgcmVuZGVycywgYW5kIGdldHRpbmcgdGVzdCBmdW5jdGlvblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVRlc3RBbmRDb252ZXJ0KGlucHV0Pzogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsKTogW0VuYWJsZUNvbnRleHRUeXBlLCBzdHJpbmdbXV0ge1xuICBjb25zdCB0ZXN0ID0gdXNlQ29udGV4dChFbmFibGVDb250ZXh0KTtcblxuICAvLyBXZSBtZW1vaXplIGp1c3QgdG8gcHJldmVudCByZS1yZW5kZXJzIHNpbmNlIHRoaXMgY291bGQgYmUgYXQgdGhlIGxlYWYgb2YgYSB0cmVlXG4gIGNvbnN0IGNvbnZlcnRlZCA9IHVzZU1lbW8oKCkgPT4gKGlucHV0ID09IG51bGwgPyBbXSA6IEFycmF5LmlzQXJyYXkoaW5wdXQpID8gaW5wdXQgOiBbaW5wdXRdKSwgW2lucHV0XSk7XG5cbiAgcmV0dXJuIFt0ZXN0LCBjb252ZXJ0ZWRdO1xufVxuIiwgImltcG9ydCB7IHVzZVRlc3RBbmRDb252ZXJ0IH0gZnJvbSAnLi91dGlscyc7XG5cbi8qKlxuICogcmV0dXJucyB0cnVlIGlmZiBhbGwgc3BlY2lmaWVkIGZlYXR1cmVzIGFyZSBlbmFibGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VBbGxFbmFibGVkKGFsbEZlYXR1cmVzOiBzdHJpbmdbXSB8IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBbdGVzdCwgcXVlcnlBbGxQcmVzZW50XSA9IHVzZVRlc3RBbmRDb252ZXJ0KGFsbEZlYXR1cmVzKTtcbiAgcmV0dXJuIHF1ZXJ5QWxsUHJlc2VudC5sZW5ndGggPiAwICYmIHF1ZXJ5QWxsUHJlc2VudC5ldmVyeSh0ZXN0KTtcbn1cbiIsICJpbXBvcnQgeyB1c2VUZXN0QW5kQ29udmVydCB9IGZyb20gJy4vdXRpbHMnO1xuXG4vKipcbiAqIHJldHVybnMgdHJ1ZSBpZmYgYW55IHNwZWNpZmllZCBmZWF0dXJlIGlzIGVuYWJsZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUVuYWJsZWQoZmVhdHVyZTogc3RyaW5nW10gfCBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgW3Rlc3QsIHF1ZXJ5QW55UHJlc2VudF0gPSB1c2VUZXN0QW5kQ29udmVydChmZWF0dXJlKTtcbiAgcmV0dXJuIHF1ZXJ5QW55UHJlc2VudC5zb21lKHRlc3QpO1xufVxuIiwgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuXG5pbXBvcnQgeyBFbmFibGVQcm9wcyB9IGZyb20gXCIuL0VuYWJsZVwiO1xuaW1wb3J0IHsgdXNlQWxsRGlzYWJsZWQgfSBmcm9tIFwiLi91c2VBbGxEaXNhYmxlZFwiO1xuaW1wb3J0IHsgdXNlRGlzYWJsZWQgfSBmcm9tIFwiLi91c2VEaXNhYmxlZFwiO1xuXG4vKipcbiAqIEZlYXR1cmUgd2lsbCBiZSBkaXNhYmxlZCBpZiBhbnkgaW4gdGhlIGxpc3QgYXJlIGVuYWJsZWRcbiAqL1xuZXhwb3J0IGNvbnN0IERpc2FibGU6IFJlYWN0LkZDPEVuYWJsZVByb3BzPiA9ICh7XG4gIGZlYXR1cmUgPSBbXSxcbiAgYWxsRmVhdHVyZXMgPSBbXSxcbiAgY2hpbGRyZW5cbn0pID0+IHtcbiAgY29uc3QgaXNBbnkgPSB1c2VEaXNhYmxlZChmZWF0dXJlKTtcbiAgY29uc3QgaXNBbGwgPSB1c2VBbGxEaXNhYmxlZChhbGxGZWF0dXJlcyk7XG5cbiAgaWYgKGlzQW55IHx8IGlzQWxsKSB7XG4gICAgcmV0dXJuIDw+e2NoaWxkcmVufTwvPjtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufTtcbiIsICJpbXBvcnQgeyB1c2VUZXN0QW5kQ29udmVydCB9IGZyb20gJy4vdXRpbHMnO1xuXG4vKipcbiAqIHJldHVybnMgdHJ1ZSBpZmYgYWxsIHNwZWNpZmllZCBmZWF0dXJlcyBhcmUgZGlzYWJsZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUFsbERpc2FibGVkKHdpdGhvdXRBbGw6IHN0cmluZ1tdIHwgc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IFt0ZXN0LCBxdWVyeUFsbFdpdGhvdXRdID0gdXNlVGVzdEFuZENvbnZlcnQod2l0aG91dEFsbCk7XG4gIHJldHVybiB3aXRob3V0QWxsLmxlbmd0aCA+IDAgJiYgcXVlcnlBbGxXaXRob3V0LmV2ZXJ5KCh4KSA9PiAhKHRlc3QoeCkgPz8gZmFsc2UpKTtcbn1cbiIsICJpbXBvcnQgeyB1c2VUZXN0QW5kQ29udmVydCB9IGZyb20gJy4vdXRpbHMnO1xuXG4vKipcbiAqIHJldHVybnMgdHJ1ZSBpZmYgYW55IHNwZWNpZmllZCBmZWF0dXJlIGlzIGRpc2FibGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VEaXNhYmxlZCh3aXRob3V0OiBzdHJpbmdbXSB8IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBbdGVzdCwgcXVlcnlBbnlXaXRob3V0XSA9IHVzZVRlc3RBbmRDb252ZXJ0KHdpdGhvdXQpO1xuICByZXR1cm4gcXVlcnlBbnlXaXRob3V0LnNvbWUoKHgpID0+ICEodGVzdCh4KSA/PyBmYWxzZSkpO1xufVxuIiwgImltcG9ydCBSZWFjdCwgeyB1c2VDb250ZXh0LCB1c2VTdGF0ZSwgdXNlQ2FsbGJhY2ssIFJlYWN0Tm9kZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nO1xuXG5pbXBvcnQgeyBSYWRpb0dyb3VwIH0gZnJvbSAnQGhlYWRsZXNzdWkvcmVhY3QnO1xuXG5pbXBvcnQgeyBGZWF0dXJlQ29udGV4dCB9IGZyb20gJy4vRmVhdHVyZUNvbnRleHQnO1xuaW1wb3J0IHsgdmFsdWVPZkZlYXR1cmUgfSBmcm9tICcuL0ZlYXR1cmVzU3RhdGUnO1xuaW1wb3J0IHsgRmVhdHVyZURlc2NyaXB0aW9uIH0gZnJvbSAnLi9GZWF0dXJlU3RhdGUnO1xuLy8gQHRzLWV4cGVjdC1lcnJvciBidW5kbGVyIHdpbGwgdGFrZSBjYXJlIG9mIHRoaXNcbmltcG9ydCBzdHlsZXMgZnJvbSAnLi90YWlsd2luZC5jc3MnO1xuXG5mdW5jdGlvbiBjbGFzc05hbWVzKC4uLmNsYXNzZXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNsYXNzZXMuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbn1cblxuZnVuY3Rpb24gVG9nZ2xlRmVhdHVyZSh7IGZlYXR1cmUgfTogeyBmZWF0dXJlOiBGZWF0dXJlRGVzY3JpcHRpb24gfSk6IEpTWC5FbGVtZW50IHwgbnVsbCB7XG4gIGNvbnN0IGNvbnRleHQgPSB1c2VDb250ZXh0KEZlYXR1cmVDb250ZXh0KTtcbiAgY29uc3QgaGFuZGxlQ2hhbmdlU2VsZWN0aW9uID0gdXNlQ2FsbGJhY2soXG4gICAgKHZhbHVlOiAnZmFsc2UnIHwgJ3RydWUnIHwgJ3Vuc2V0JykgPT4ge1xuICAgICAgaWYgKGNvbnRleHQ/Lm92ZXJyaWRlc1NlbmQgIT0gbnVsbCkge1xuICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7XG4gICAgICAgICAgY2FzZSAndHJ1ZSc6IHtcbiAgICAgICAgICAgIGNvbnRleHQub3ZlcnJpZGVzU2VuZCh7IHR5cGU6ICdFTkFCTEUnLCBuYW1lOiBmZWF0dXJlLm5hbWUgfSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnZmFsc2UnOiB7XG4gICAgICAgICAgICBjb250ZXh0Lm92ZXJyaWRlc1NlbmQoeyB0eXBlOiAnRElTQUJMRScsIG5hbWU6IGZlYXR1cmUubmFtZSB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICd1bnNldCc6IHtcbiAgICAgICAgICAgIGNvbnRleHQub3ZlcnJpZGVzU2VuZCh7IHR5cGU6ICdVTlNFVCcsIG5hbWU6IGZlYXR1cmUubmFtZSB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgW2ZlYXR1cmUubmFtZSwgY29udGV4dF1cbiAgKTtcblxuICBpZiAoY29udGV4dCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCB7IG92ZXJyaWRlc1N0YXRlLCB0ZXN0OiB0ZXN0RmVhdHVyZSwgZGVmYXVsdHNTdGF0ZSB9ID0gY29udGV4dDtcblxuICBjb25zdCB2YWx1ZUluRGVmYXVsdHMgPSAodmFsdWVPZkZlYXR1cmUoZGVmYXVsdHNTdGF0ZSwgZmVhdHVyZS5uYW1lKVswXSA/PyAndW5zZXQnKS50b1N0cmluZygpIGFzXG4gICAgfCAnZmFsc2UnXG4gICAgfCAndHJ1ZSdcbiAgICB8ICd1bnNldCc7XG5cbiAgY29uc3QgdmFsdWVJbk92ZXJyaWRlcyA9ICh2YWx1ZU9mRmVhdHVyZShvdmVycmlkZXNTdGF0ZSwgZmVhdHVyZS5uYW1lKVswXSA/PyAndW5zZXQnKS50b1N0cmluZygpIGFzXG4gICAgfCAnZmFsc2UnXG4gICAgfCAndHJ1ZSdcbiAgICB8ICd1bnNldCc7XG5cbiAgY29uc3QgYWN0dWFsQ2hlY2tlZCA9IHRlc3RGZWF0dXJlKGZlYXR1cmUubmFtZSk7XG5cbiAgcmV0dXJuIChcbiAgICA8UmFkaW9Hcm91cCBkaXNhYmxlZD17ZmVhdHVyZS5ub092ZXJyaWRlfSBvbkNoYW5nZT17aGFuZGxlQ2hhbmdlU2VsZWN0aW9ufSB2YWx1ZT17dmFsdWVJbk92ZXJyaWRlc30+XG4gICAgICA8UmFkaW9Hcm91cC5MYWJlbD5cbiAgICAgICAgPGg2IGNsYXNzTmFtZT1cInRleHQtZ3JheS05MDAgYWxpZ24tY2VudGVyIGZsZXggZmxleC1yb3cgZmxleC1ub3dyYXAgaXRlbXMtY2VudGVyIGdhcC0yIGxnOmdhcC00IGgtN1wiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImZvbnQtbWVkaXVtXCI+XG4gICAgICAgICAgICBGZWF0dXJlOiA8Y29kZT57ZmVhdHVyZS5uYW1lfTwvY29kZT5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAge2ZlYXR1cmUubm9PdmVycmlkZSA9PT0gdHJ1ZSA/IChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYm9yZGVyLW9yYW5nZS01MDAgdGV4dC1vcmFuZ2UtNTAwIGZsZXggZmxleC1ub3dyYXAgdGV4dC14cyBmbGV4LXJvdyBnYXAtMSByb3VuZGVkLXNtIGJvcmRlciBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcHgtMiBweS0xXCI+XG4gICAgICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImgtNCB3LTQgbWluLXctNFwiXG4gICAgICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyMCAyMFwiXG4gICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgY2xpcFJ1bGU9XCJldmVub2RkXCJcbiAgICAgICAgICAgICAgICAgIGQ9XCJNNSA5VjdhNSA1IDAgMDExMCAwdjJhMiAyIDAgMDEyIDJ2NWEyIDIgMCAwMS0yIDJINWEyIDIgMCAwMS0yLTJ2LTVhMiAyIDAgMDEyLTJ6bTgtMnYySDdWN2EzIDMgMCAwMTYgMHpcIlxuICAgICAgICAgICAgICAgICAgZmlsbFJ1bGU9XCJldmVub2RkXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgPGRpdj5ObyBPdmVycmlkZXM8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgIHthY3R1YWxDaGVja2VkID09PSB0cnVlID8gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtbm93cmFwIHRleHQteHMgdGV4dC1ncmVlbi01MDAgZmxleC1yb3cgZ2FwLTEgcm91bmRlZC1zbSBib3JkZXIgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGJvcmRlci1ncmVlbi01MDAgcHgtMiBweS0xXCI+XG4gICAgICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImgtNCB3LTQgbWluLXctNFwiXG4gICAgICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyMCAyMFwiXG4gICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgY2xpcFJ1bGU9XCJldmVub2RkXCJcbiAgICAgICAgICAgICAgICAgIGQ9XCJNMTAgMThhOCA4IDAgMTAwLTE2IDggOCAwIDAwMCAxNnptMy43MDctOS4yOTNhMSAxIDAgMDAtMS40MTQtMS40MTRMOSAxMC41ODYgNy43MDcgOS4yOTNhMSAxIDAgMDAtMS40MTQgMS40MTRsMiAyYTEgMSAwIDAwMS40MTQgMGw0LTR6XCJcbiAgICAgICAgICAgICAgICAgIGZpbGxSdWxlPVwiZXZlbm9kZFwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgIDxkaXY+e2FjdHVhbENoZWNrZWQgPyAnRW5hYmxlZCcgOiAnRGlzYWJsZWQnfTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgIDwvaDY+XG4gICAgICAgIHtmZWF0dXJlLmRlc2NyaXB0aW9uID09IG51bGwgPyBudWxsIDogPHAgY2xhc3NOYW1lPVwidGV4dC1iYXNlIHRleHQtZ3JheS01MDAgdGV4dC1zbVwiPntmZWF0dXJlLmRlc2NyaXB0aW9ufTwvcD59XG4gICAgICA8L1JhZGlvR3JvdXAuTGFiZWw+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LTQgZ3JpZCBncmlkLWNvbHMtMSBnYXAteS02IHNtOmdyaWQtY29scy0zIHNtOmdhcC14LTRcIj5cbiAgICAgICAge1tcbiAgICAgICAgICB7IGlkOiAnZmFsc2UnLCB0aXRsZTogYERpc2FibGUgJHtmZWF0dXJlLm5hbWV9YCwgZGVzY3JpcHRpb246ICdPdmVycmlkZSB0aGUgZmVhdHVyZSB0byBiZSBkaXNhYmxlZCcgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZDogJ3Vuc2V0JyxcbiAgICAgICAgICAgIHRpdGxlOiAnRGVmYXVsdCcsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0luaGVyaXQgZW5hYmxlZCBzdGF0ZSBmcm9tIGRlZmF1bHRzJyxcbiAgICAgICAgICAgIGRpc2FibGVkOiAoZmVhdHVyZS5ub092ZXJyaWRlID8/IGZhbHNlKSB8fCBmZWF0dXJlLmZvcmNlLFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOlxuICAgICAgICAgICAgICB2YWx1ZUluRGVmYXVsdHMgPT09ICd0cnVlJyA/IChcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtZ3JlZW4tNTAwIGJvcmRlci1ncmVlbi01MDAgZmxleCBmbGV4LW5vd3JhcCB0ZXh0LXhzIGZsZXgtcm93IGdhcC0xIHJvdW5kZWQtc20gYm9yZGVyIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBweC0yIHB5LTFcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPkVuYWJsZWQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXJlZC01MDAgYm9yZGVyLXJlZC01MDAgZmxleCBmbGV4LW5vd3JhcCB0ZXh0LXhzIGZsZXgtcm93IGdhcC0xIHJvdW5kZWQtc20gYm9yZGVyIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBweC0yIHB5LTFcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPkRpc2FibGVkPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICApLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgeyBpZDogJ3RydWUnLCB0aXRsZTogYEVuYWJsZSAke2ZlYXR1cmUubmFtZX1gLCBkZXNjcmlwdGlvbjogJ092ZXJyaWRlIHRoZSBmZWF0dXJlIHRvIGJlIGVuYWJsZWQnIH0sXG4gICAgICAgIF0ubWFwKChvcHRpb24pID0+IChcbiAgICAgICAgICA8UmFkaW9Hcm91cC5PcHRpb25cbiAgICAgICAgICAgIGNsYXNzTmFtZT17KHsgY2hlY2tlZCwgYWN0aXZlLCBkaXNhYmxlZCB9KSA9PlxuICAgICAgICAgICAgICBjbGFzc05hbWVzKFxuICAgICAgICAgICAgICAgIGNoZWNrZWQgPyAnYm9yZGVyLXRyYW5zcGFyZW50JyA6ICdib3JkZXItZ3JheS0zMDAnLFxuICAgICAgICAgICAgICAgICFkaXNhYmxlZCAmJiBhY3RpdmUgPyAnYm9yZGVyLWJsdWUtNTAwIHJpbmctMiByaW5nLWJsdWUtNTAwJyA6ICcnLFxuICAgICAgICAgICAgICAgIGRpc2FibGVkID8gJ2JvcmRlci10cmFuc3BhcmVudCByaW5nLWdyYXktNTAwIGN1cnNvci1ub3QtYWxsb3dlZCcgOiAnY3Vyc29yLXBvaW50ZXInLFxuICAgICAgICAgICAgICAgICdyZWxhdGl2ZSBiZy13aGl0ZSBib3JkZXIgcm91bmRlZC1sZyBzaGFkb3ctc20gcC0zIGZsZXggZm9jdXM6b3V0bGluZS1ub25lJ1xuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkaXNhYmxlZD17b3B0aW9uLmRpc2FibGVkfVxuICAgICAgICAgICAga2V5PXtvcHRpb24uaWR9XG4gICAgICAgICAgICB2YWx1ZT17b3B0aW9uLmlkfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHsoeyBjaGVja2VkLCBhY3RpdmUsIGRpc2FibGVkIH0pID0+IChcbiAgICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgZ3Jvd1wiPlxuICAgICAgICAgICAgICAgICAgPFJhZGlvR3JvdXAuTGFiZWwgYXM9XCJzcGFuXCIgY2xhc3NOYW1lPVwiZmxleCBmbGV4LW5vd3JhcCBmbGV4LXJvdyBnYXAtMSBpdGVtcy1jZW50ZXIgc3BhY2UtYmV0d2VlblwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZ3JheS05MDAgZ3JvdyBzaHJpbmtcIj57b3B0aW9uLnRpdGxlfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAge29wdGlvbi5kZWZhdWx0VmFsdWUgIT0gbnVsbCA/IG9wdGlvbi5kZWZhdWx0VmFsdWUgOiBudWxsfVxuICAgICAgICAgICAgICAgICAgICA8c3ZnXG4gICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZXMoIWNoZWNrZWQgPyAnaW52aXNpYmxlJyA6ICcnLCAnaC01IHctNSB0ZXh0LWJsdWUtNTAwIG1pbi13LTQnKX1cbiAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDIwIDIwXCJcbiAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGlwUnVsZT1cImV2ZW5vZGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMCAxOGE4IDggMCAxMDAtMTYgOCA4IDAgMDAwIDE2em0zLjcwNy05LjI5M2ExIDEgMCAwMC0xLjQxNC0xLjQxNEw5IDEwLjU4NiA3LjcwNyA5LjI5M2ExIDEgMCAwMC0xLjQxNCAxLjQxNGwyIDJhMSAxIDAgMDAxLjQxNCAwbDQtNHpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsbFJ1bGU9XCJldmVub2RkXCJcbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgIDwvUmFkaW9Hcm91cC5MYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxSYWRpb0dyb3VwLkRlc2NyaXB0aW9uIGFzPVwic3BhblwiIGNsYXNzTmFtZT1cIm10LTEgZmxleCBpdGVtcy1jZW50ZXIgdGV4dC1zbSB0ZXh0LWdyYXktNTAwXCI+XG4gICAgICAgICAgICAgICAgICAgIHtvcHRpb24uZGVzY3JpcHRpb259XG4gICAgICAgICAgICAgICAgICA8L1JhZGlvR3JvdXAuRGVzY3JpcHRpb24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lcyhcbiAgICAgICAgICAgICAgICAgICAgIWRpc2FibGVkICYmIGFjdGl2ZSA/ICdib3JkZXInIDogJ2JvcmRlci0yJyxcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tlZCA/IChkaXNhYmxlZCA/ICdib3JkZXItZ3JheS01MDAnIDogJ2JvcmRlci1ibHVlLTUwMCcpIDogJ2JvcmRlci10cmFuc3BhcmVudCcsXG4gICAgICAgICAgICAgICAgICAgICdhYnNvbHV0ZSAtaW5zZXQtcHggcm91bmRlZC1sZyBwb2ludGVyLWV2ZW50cy1ub25lJ1xuICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8Lz5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC9SYWRpb0dyb3VwLk9wdGlvbj5cbiAgICAgICAgKSl9XG4gICAgICA8L2Rpdj5cbiAgICA8L1JhZGlvR3JvdXA+XG4gICk7XG59XG5cbmZ1bmN0aW9uIFNoYWRvd0NvbnRlbnQoeyByb290LCBjaGlsZHJlbiB9OiB7IGNoaWxkcmVuOiBSZWFjdE5vZGU7IHJvb3Q6IEVsZW1lbnQgfSkge1xuICByZXR1cm4gUmVhY3RET00uY3JlYXRlUG9ydGFsKGNoaWxkcmVuLCByb290KTtcbn1cblxuLy8vIFBlcm1pdCB1c2VycyB0byBvdmVycmlkZSBmZWF0dXJlIGZsYWdzIHZpYSBhIEdVSS5cbi8vLyBSZW5kZXJzIGEgc21hbGwgZmxvYXRpbmcgYnV0dG9uIGluIGxvd2VyIGxlZnQgb3IgcmlnaHQsIHByZXNzaW5nIGl0IGJyaW5ncyB1cFxuLy8vIGEgbGlzdCBvZiBmZWF0dXJlcyB0byB0b2dnbGUgYW5kIHRoZWlyIGN1cnJlbnQgb3ZlcnJpZGUgc3RhdGUuIHlvdSBjYW4gb3ZlcnJpZGUgb24gb3Igb3ZlcnJpZGUgb2ZmLFxuLy8vIG9yIHVuc2V0IHRoZSBvdmVycmlkZSBhbmQgZ28gYmFjayB0byBkZWZhdWx0IHZhbHVlLlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG5leHBvcnQgZnVuY3Rpb24gVG9nZ2xlRmVhdHVyZXMoeyBkZWZhdWx0T3BlbiA9IGZhbHNlIH06IHsgZGVmYXVsdE9wZW4/OiBib29sZWFuIH0pOiBKU1guRWxlbWVudCB8IG51bGwge1xuICBjb25zdCBbcm9vdCwgc2V0Q29yZVJvb3RdID0gdXNlU3RhdGU8SFRNTERpdkVsZW1lbnQgfCBudWxsPihudWxsKTtcblxuICBjb25zdCBzZXRSb290ID0gKGhvc3Q6IEhUTUxEaXZFbGVtZW50IHwgbnVsbCkgPT4ge1xuICAgIGlmIChob3N0ID09IG51bGwgfHwgcm9vdCAhPSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNoYWRvd1Jvb3QgPSBob3N0Py5hdHRhY2hTaGFkb3coeyBtb2RlOiAnb3BlbicgfSk7XG4gICAgY29uc3Qgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgIGNvbnN0IHJlbmRlckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHN0eWxlLnRleHRDb250ZW50ID0gc3R5bGVzO1xuICAgIHNoYWRvd1Jvb3QuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuICAgIHNoYWRvd1Jvb3QuYXBwZW5kQ2hpbGQocmVuZGVyRGl2KTtcbiAgICBzZXRDb3JlUm9vdChyZW5kZXJEaXYpO1xuICB9O1xuXG4gIHJldHVybiAoXG4gICAgPGRpdiByZWY9e3NldFJvb3R9IHN0eWxlPXt7IHpJbmRleDogOTk5OTksIHBvc2l0aW9uOiAnZml4ZWQnLCB3aWR0aDogJzAnLCBoZWlnaHQ6ICcwJywgYm90dG9tOiAwIH19PlxuICAgICAge3Jvb3QgIT0gbnVsbCA/IChcbiAgICAgICAgPFNoYWRvd0NvbnRlbnQgcm9vdD17cm9vdH0+XG4gICAgICAgICAgPFRvZ2dsZUZlYXR1cmVVbndyYXBwZWQgZGVmYXVsdE9wZW49e2RlZmF1bHRPcGVufSAvPlxuICAgICAgICA8L1NoYWRvd0NvbnRlbnQ+XG4gICAgICApIDogbnVsbH1cbiAgICA8L2Rpdj5cbiAgKTtcbn1cblxuLy8vIExpa2UgVG9nZ2xlRmVhdHVyZXMsIGJ1dCBkb2VzIG5vdCBpbmplY3Qgc3R5bGVzIGludG8gYSBzaGFkb3cgRE9NIHJvb3Qgbm9kZS5cbi8vLyB1c2VmdWwgaWYgeW91J3JlIHVzaW5nIHRhaWx3aW5kLlxuZXhwb3J0IGZ1bmN0aW9uIFRvZ2dsZUZlYXR1cmVVbndyYXBwZWQoeyBkZWZhdWx0T3BlbiA9IGZhbHNlIH06IHsgZGVmYXVsdE9wZW4/OiBib29sZWFuIH0pOiBKU1guRWxlbWVudCB8IG51bGwge1xuICBjb25zdCBbb3Blbiwgc2V0T3Blbl0gPSB1c2VTdGF0ZShkZWZhdWx0T3Blbik7XG4gIGNvbnN0IGNvbnRleHQgPSB1c2VDb250ZXh0KEZlYXR1cmVDb250ZXh0KTtcblxuICBpZiAoY29udGV4dCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBXZSB3YW50OiBSZWFsIHZhbHVlIGFmdGVyIGFsbCBuZXN0aW5ncywgdmFsdWUgb2YgdGhlIG92ZXJyaWRlLiB3ZSB0b2dnbGUgb3ZlcnJpZGVcbiAgY29uc3QgeyBmZWF0dXJlc0Rlc2NyaXB0aW9uIH0gPSBjb250ZXh0O1xuXG4gIGlmIChmZWF0dXJlc0Rlc2NyaXB0aW9uLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImFic29sdXRlIGJvdHRvbS0wIGxlZnQtMCBteC00IG15LTRcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGNsYXNzTmFtZT1cImlubGluZS1mbGV4IGl0ZW1zLWNlbnRlciB0ZXh0LXNtIGZvbnQtbWVkaXVtIHAtMSBoLTggdy04IGFsaWduLW1pZGRsZSBjdXJzb3ItcG9pbnRlciByb3VuZGVkLWZ1bGwgYmctYmx1ZS02MDAgdGV4dC13aGl0ZSAgYm9yZGVyIGJvcmRlci10cmFuc3BhcmVudCBqdXN0aWZ5LWNlbnRlciB0ZXh0LWJhc2UgZm9udC1tZWRpdW0gZm9jdXM6b3V0bGluZS1ub25lIGZvY3VzOnJpbmctMiBmb2N1czpyaW5nLW9mZnNldC0yIGZvY3VzOnJpbmctYmx1ZS02MDAgc206dGV4dC1zbVwiXG4gICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0T3Blbih0cnVlKX1cbiAgICAgICAgICB0aXRsZT1cIlRvZ2dsZSBmZWF0dXJlc1wiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3ZnXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJ3LTYgaC02IG1pbi1oLTYgbWluLXctNlwiXG4gICAgICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjAgMjBcIlxuICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgY2xpcFJ1bGU9XCJldmVub2RkXCJcbiAgICAgICAgICAgICAgZD1cIk0zIDZhMyAzIDAgMDEzLTNoMTBhMSAxIDAgMDEuOCAxLjZMMTQuMjUgOGwyLjU1IDMuNEExIDEgMCAwMTE2IDEzSDZhMSAxIDAgMDAtMSAxdjNhMSAxIDAgMTEtMiAwVjZ6XCJcbiAgICAgICAgICAgICAgZmlsbFJ1bGU9XCJldmVub2RkXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICB7IW9wZW4gPyBudWxsIDogKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZpeGVkIHotMTAgaW5zZXQtMCBvdmVyZmxvdy15LWF1dG9cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtZW5kIGp1c3RpZnktZmxleC1zdGFydCBteC04IG15LTQgbWluLWgtc2NyZWVuIHB0LTQgcHgtNCBwYi0xMCBzbTpibG9jayBzbTpwLTBcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicmVsYXRpdmUgaW5saW5lLWJsb2NrIGFsaWduLWJvdHRvbSBiZy13aGl0ZSByb3VuZGVkLWxnIHB4LTQgcHQtNSBwYi00IHRleHQtbGVmdCBvdmVyZmxvdy1oaWRkZW4gc2hhZG93LXhsIHRyYW5zZm9ybSB0cmFuc2l0aW9uLWFsbCBzbTpteS04IHNtOmFsaWduLW1pZGRsZSBzbTpwLTYgbGc6bWF4LXctWzgwJV0gbWF4LXctZnVsbFwiPlxuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtMSBzbTptdC0zXCI+XG4gICAgICAgICAgICAgICAgICA8aDMgY2xhc3NOYW1lPVwiZmxleCBmbGV4LXJvdyBnYXAtNCBmbGV4LW5vd3JhcCBpdGVtcy1jZW50ZXIgc3BhY2UtYmV0d2VlblwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdyb3cgdGV4dC1sZyBsZWFkaW5nLTYgZm9udC1tZWRpdW0gdGV4dC1ncmF5LTkwMFwiPkZlYXR1cmUgRmxhZyBPdmVycmlkZXM8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvaDM+XG4gICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtZ3JheS01MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgRmVhdHVyZXMgY2FuIGJlIGVuYWJsZWQgb3IgZGlzYWJsZWQgdW5sZXNzIHRoZXkgYXJlIGZvcmNlZCB1cHN0cmVhbS4gWW91IGNhbiBhbHNvIHJldmVydCB0byBkZWZhdWx0LlxuICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC02XCI+XG4gICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGdhcC05XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGxlZ2VuZCBjbGFzc05hbWU9XCJzci1vbmx5XCI+RmVhdHVyZSBGbGFnczwvbGVnZW5kPlxuICAgICAgICAgICAgICAgICAgICAgIHtmZWF0dXJlc0Rlc2NyaXB0aW9uLm1hcCgoZmVhdHVyZSkgPT4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgPFRvZ2dsZUZlYXR1cmUgZmVhdHVyZT17ZmVhdHVyZX0ga2V5PXtmZWF0dXJlLm5hbWV9IC8+XG4gICAgICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXIgbXQtNSBzbTptdC02XCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIgdGV4dC1zbSBmb250LW1lZGl1bSBwdC0wIHBiLTAgcHItNCBwbC00IGgtOCBsZWFkaW5nLTcgYWxpZ24tbWlkZGxlIGN1cnNvci1wb2ludGVyIHJvdW5kZWQtc20gYmctYmx1ZS02MDAgdGV4dC13aGl0ZSBib3JkZXIgYm9yZGVyLXRyYW5zcGFyZW50IGp1c3RpZnktY2VudGVyIHRleHQtYmFzZSBmb250LW1lZGl1bSBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6cmluZy0yIGZvY3VzOnJpbmctb2Zmc2V0LTIgZm9jdXM6cmluZy1ibHVlLTYwMCBzbTp0ZXh0LXNtXCJcbiAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRPcGVuKGZhbHNlKX1cbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIERvbmVcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICApfVxuICAgIDwvZGl2PlxuICApO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogInFoQ0FBQSxrT0NBQSxNQUF1RixrQkNBdkYsTUFBbUYsa0JBWTVFLFdBQXVCLEVBQXFELENBWm5GLFFBYUUsTUFBTyxDQUNMLEVBQWEsUUFBUSxTQUFTLEVBQUksR0FBTyxFQUFhLFFBQVEsVUFBVSxFQUFJLEdBQVEsT0FDcEYsUUFBYSxRQUFRLGNBQXJCLGNBQWtDLFFBQWxDLE9BQTJDLEVBQzdDLENBQ0YsQ0E0RU8sR0FBTSxHQUFpQixvQkFBK0QsQ0FDM0YsR0FBSSxVQUNKLFFBQVMsVUFDVCxRQUFTLENBQUMsRUFDViwyQkFBNEIsR0FDNUIsR0FBSSxDQUNGLE9BQVEsQ0FDTixDQUFFLE9BQVEsZUFBZ0IsS0FBTSxBQUFDLEdBQUssQ0FwRzVDLE1Bb0crQyxZQUFJLGNBQUosY0FBaUIsa0JBQW1CLEtBQUssRUFDbEYsQ0FBRSxPQUFRLFNBQVUsQ0FDdEIsRUFFQSxPQUFRLENBQ04sQ0FBRSxPQUFRLGVBQWdCLEtBQU0sQUFBQyxHQUFLLENBekc1QyxNQXlHK0MsWUFBSSxjQUFKLGNBQWlCLGtCQUFtQixLQUFLLEVBQ2xGLENBQUUsT0FB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 +`;function X(...t){return t.filter(Boolean).join(" ")}function be({feature:t}){var c,S,b;let e=(0,o.useContext)(E),r=(0,o.useCallback)(l=>{if((e==null?void 0:e.overridesSend)!=null)switch(l){case"true":{e.overridesSend({type:"ENABLE",name:t.name});break}case"false":{e.overridesSend({type:"DISABLE",name:t.name});break}case"unset":{e.overridesSend({type:"UNSET",name:t.name});break}}},[t.name,e]);if(e==null)return null;let{overridesState:a,test:n,defaultsState:i}=e,d=((c=h(i,t.name)[0])!=null?c:"unset").toString(),u=((S=h(a,t.name)[0])!=null?S:"unset").toString(),s=n(t.name);return o.default.createElement(v.RadioGroup,{disabled:t.noOverride,onChange:r,value:u},o.default.createElement(v.RadioGroup.Label,null,o.default.createElement("h6",{className:"text-gray-900 align-center flex flex-row flex-nowrap items-center gap-2 lg:gap-4 h-7"},o.default.createElement("span",{className:"font-medium"},"Feature: ",o.default.createElement("code",null,t.name)),t.noOverride===!0?o.default.createElement("div",{className:"border-orange-500 text-orange-500 flex flex-nowrap text-xs flex-row gap-1 rounded-sm border items-center justify-center px-2 py-1"},o.default.createElement("svg",{"aria-hidden":"true",className:"h-4 w-4 min-w-4",fill:"currentColor",viewBox:"0 0 20 20",xmlns:"http://www.w3.org/2000/svg"},o.default.createElement("path",{clipRule:"evenodd",d:"M5 9V7a5 5 0 0110 0v2a2 2 0 012 2v5a2 2 0 01-2 2H5a2 2 0 01-2-2v-5a2 2 0 012-2zm8-2v2H7V7a3 3 0 016 0z",fillRule:"evenodd"})),o.default.createElement("div",null,"No Overrides")):null,s===!0?o.default.createElement("div",{className:"flex flex-nowrap text-xs text-green-500 flex-row gap-1 rounded-sm border items-center justify-center border-green-500 px-2 py-1"},o.default.createElement("svg",{"aria-hidden":"true",className:"h-4 w-4 min-w-4",fill:"currentColor",viewBox:"0 0 20 20",xmlns:"http://www.w3.org/2000/svg"},o.default.createElement("path",{clipRule:"evenodd",d:"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z",fillRule:"evenodd"})),o.default.createElement("div",null,s?"Enabled":"Disabled")):null),t.description==null?null:o.default.createElement("p",{className:"text-base text-gray-500 text-sm"},t.description)),o.default.createElement("div",{className:"mt-4 grid grid-cols-1 gap-y-6 sm:grid-cols-3 sm:gap-x-4"},[{id:"false",title:`Disable ${t.name}`,description:"Override the feature to be disabled"},{id:"unset",title:"Default",description:"Inherit enabled state from defaults",disabled:((b=t.noOverride)!=null?b:!1)||t.force,defaultValue:d==="true"?o.default.createElement("div",{className:"text-green-500 border-green-500 flex flex-nowrap text-xs flex-row gap-1 rounded-sm border items-center justify-center px-2 py-1"},o.default.createElement("span",null,"Enabled")):o.default.createElement("div",{className:"text-red-500 border-red-500 flex flex-nowrap text-xs flex-row gap-1 rounded-sm border items-center justify-center px-2 py-1"},o.default.createElement("span",null,"Disabled"))},{id:"true",title:`Enable ${t.name}`,description:"Override the feature to be enabled"}].map(l=>o.default.createElement(v.RadioGroup.Option,{className:({checked:f,active:_,disabled:y})=>X(f?"border-transparent":"border-gray-300",!y&&_?"border-blue-500 ring-2 ring-blue-500":"",y?"border-transparent ring-gray-500 cursor-not-allowed":"cursor-pointer","relative bg-white border rounded-lg shadow-sm p-3 flex focus:outline-none"),disabled:l.disabled,key:l.id,value:l.id},({checked:f,active:_,disabled:y})=>o.default.createElement(o.default.Fragment,null,o.default.createElement("div",{className:"flex flex-col grow"},o.default.createElement(v.RadioGroup.Label,{as:"span",className:"flex flex-nowrap flex-row gap-1 items-center space-between"},o.default.createElement("span",{className:"text-sm font-medium text-gray-900 grow shrink"},l.title),l.defaultValue!=null?l.defaultValue:null,o.default.createElement("svg",{"aria-hidden":"true",className:X(f?"":"invisible","h-5 w-5 text-blue-500 min-w-4"),fill:"currentColor",viewBox:"0 0 20 20",xmlns:"http://www.w3.org/2000/svg"},o.default.createElement("path",{clipRule:"evenodd",d:"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z",fillRule:"evenodd"}))),o.default.createElement(v.RadioGroup.Description,{as:"span",className:"mt-1 flex items-center text-sm text-gray-500"},l.description)),o.default.createElement("div",{"aria-hidden":"true",className:X(!y&&_?"border":"border-2",f?y?"border-gray-500":"border-blue-500":"border-transparent","absolute -inset-px rounded-lg pointer-events-none")}))))))}function he({root:t,children:e}){return ie.default.createPortal(e,t)}function se({defaultOpen:t=!1,hidden:e=!1}){let[r,a]=(0,o.useState)(null),n=i=>{if(i==null||r!=null)return;let d=i==null?void 0:i.attachShadow({mode:"open"}),u=document.createElement("style"),s=document.createElement("div");u.textContent=ne,d.appendChild(u),d.appendChild(s),a(s)};return e?null:o.default.createElement("div",{ref:n,style:{zIndex:99999,position:"fixed",width:"0",height:"0",bottom:0}},r!=null?o.default.createElement(he,{root:r},o.default.createElement(we,{defaultOpen:t})):null)}function we({defaultOpen:t=!1,hidden:e=!1}){let[r,a]=(0,o.useState)(t),n=(0,o.useContext)(E);if(n==null||e)return null;let{featuresDescription:i}=n;return i.length===0?null:o.default.createElement("div",{className:"relative"},o.default.createElement("div",{className:"absolute bottom-0 left-0 mx-4 my-4"},o.default.createElement("button",{className:"inline-flex items-center text-sm font-medium p-1 h-8 w-8 align-middle cursor-pointer rounded-full bg-blue-600 text-white border border-transparent justify-center text-base font-medium focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-600 sm:text-sm",onClick:()=>a(!0),title:"Toggle features",type:"button"},o.default.createElement("svg",{className:"w-6 h-6 min-h-6 min-w-6",fill:"currentColor",viewBox:"0 0 20 20",xmlns:"http://www.w3.org/2000/svg"},o.default.createElement("path",{clipRule:"evenodd",d:"M3 6a3 3 0 013-3h10a1 1 0 01.8 1.6L14.25 8l2.55 3.4A1 1 0 0116 13H6a1 1 0 00-1 1v3a1 1 0 11-2 0V6z",fillRule:"evenodd"})))),r?o.default.createElement("div",{className:"fixed z-10 inset-0 overflow-y-auto"},o.default.createElement("div",{className:"flex items-end justify-flex-start mx-8 my-4 min-h-screen pt-4 px-4 pb-10 sm:block sm:p-0"},o.default.createElement("div",{className:"relative inline-block align-bottom bg-white rounded-lg px-4 pt-5 pb-4 text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:p-6 lg:max-w-[80%] max-w-full"},o.default.createElement("div",null,o.default.createElement("div",{className:"mt-1 sm:mt-3"},o.default.createElement("h3",{className:"flex flex-row gap-4 flex-nowrap items-center space-between"},o.default.createElement("div",{className:"grow text-lg leading-6 font-medium text-gray-900"},"Feature Flag Overrides")),o.default.createElement("p",{className:"text-sm text-gray-500"},"Features can be enabled or disabled unless they are forced upstream. You can also revert to default."),o.default.createElement("div",{className:"mt-6"},o.default.createElement("fieldset",{className:"flex flex-col gap-9"},o.default.createElement("legend",{className:"sr-only"},"Feature Flags"),i.map(d=>o.default.createElement(be,{feature:d,key:d.name})))),o.default.createElement("div",{className:"flex justify-center items-center mt-5 sm:mt-6"},o.default.createElement("button",{className:"inline-flex items-center text-sm font-medium pt-0 pb-0 pr-4 pl-4 h-8 leading-7 align-middle cursor-pointer rounded-sm bg-blue-600 text-white border border-transparent justify-center text-base font-medium focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-600 sm:text-sm",onClick:()=>a(!1),type:"button"},"Done"))))))):null)} +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2luZGV4LnRzeCIsICIuLi8uLi8uLi9zcmMvRmVhdHVyZXNTdGF0ZS50c3giLCAiLi4vLi4vLi4vc3JjL0ZlYXR1cmVTdGF0ZS50c3giLCAiLi4vLi4vLi4vc3JjL0ZlYXR1cmVzLnRzeCIsICIuLi8uLi8uLi9zcmMvRW5hYmxlQ29udGV4dC50c3giLCAiLi4vLi4vLi4vc3JjL0ZlYXR1cmVDb250ZXh0LnRzeCIsICIuLi8uLi8uLi9zcmMvdXNlQ29uc29sZU92ZXJyaWRlLnRzeCIsICIuLi8uLi8uLi9zcmMvR2xvYmFsRW5hYmxlLnRzeCIsICIuLi8uLi8uLi9zcmMvdXNlUGVyc2lzdC50c3giLCAiLi4vLi4vLi4vc3JjL3VzZVRlc3RDYWxsYmFjay50c3giLCAiLi4vLi4vLi4vc3JjL3Rlc3RGZWF0dXJlLnRzeCIsICIuLi8uLi8uLi9zcmMvRW5hYmxlLnRzeCIsICIuLi8uLi8uLi9zcmMvdXRpbHMudHMiLCAiLi4vLi4vLi4vc3JjL3VzZUFsbEVuYWJsZWQudHN4IiwgIi4uLy4uLy4uL3NyYy91c2VFbmFibGVkLnRzeCIsICIuLi8uLi8uLi9zcmMvRGlzYWJsZS50c3giLCAiLi4vLi4vLi4vc3JjL3VzZUFsbERpc2FibGVkLnRzeCIsICIuLi8uLi8uLi9zcmMvdXNlRGlzYWJsZWQudHN4IiwgIi4uLy4uLy4uL3NyYy9Ub2dnbGVGZWF0dXJlcy50c3giXSwKICAic291cmNlc0NvbnRlbnQiOiBbImV4cG9ydCB7IEZlYXR1cmVzTWFjaGluZSB9IGZyb20gJy4vRmVhdHVyZXNTdGF0ZSc7XG5leHBvcnQgeyBGZWF0dXJlcyB9IGZyb20gJy4vRmVhdHVyZXMnO1xuZXhwb3J0IHsgRW5hYmxlIH0gZnJvbSAnLi9FbmFibGUnO1xuZXhwb3J0IHsgRGlzYWJsZSB9IGZyb20gJy4vRGlzYWJsZSc7XG5leHBvcnQgeyB1c2VEaXNhYmxlZCB9IGZyb20gJy4vdXNlRGlzYWJsZWQnO1xuZXhwb3J0IHsgdXNlRW5hYmxlZCB9IGZyb20gJy4vdXNlRW5hYmxlZCc7XG5leHBvcnQgeyB1c2VBbGxEaXNhYmxlZCB9IGZyb20gJy4vdXNlQWxsRGlzYWJsZWQnO1xuZXhwb3J0IHsgdXNlQWxsRW5hYmxlZCB9IGZyb20gJy4vdXNlQWxsRW5hYmxlZCc7XG5leHBvcnQgdHlwZSB7IEVuYWJsZUNvbnRleHRUeXBlIH0gZnJvbSAnLi9FbmFibGVDb250ZXh0JztcbmV4cG9ydCB0eXBlIHsgRmVhdHVyZUNvbnRleHRUeXBlIH0gZnJvbSAnLi9GZWF0dXJlQ29udGV4dCc7XG5leHBvcnQgdHlwZSB7IEZlYXR1cmVWYWx1ZSwgRmVhdHVyZVN0YXRlLCBGZWF0dXJlRGVzY3JpcHRpb24sIEZlYXR1cmVEaXNwYXRjaCB9IGZyb20gJy4vRmVhdHVyZVN0YXRlJztcbmV4cG9ydCB7IEVuYWJsZUNvbnRleHQgfSBmcm9tICcuL0VuYWJsZUNvbnRleHQnO1xuZXhwb3J0IHsgVG9nZ2xlRmVhdHVyZXMgfSBmcm9tICcuL1RvZ2dsZUZlYXR1cmVzJztcbiIsICJpbXBvcnQgeyBBY3RvclJlZkZyb20sIEludGVycHJldGVyRnJvbSwgU3RhdGVGcm9tLCBhc3NpZ24sIGNyZWF0ZU1hY2hpbmUsIHNwYXduIH0gZnJvbSAneHN0YXRlJztcblxuaW1wb3J0IHsgRmVhdHVyZU1hY2hpbmUsIEZlYXR1cmVEZXNjcmlwdGlvbiwgRmVhdHVyZVZhbHVlLCB2YWx1ZUZvclN0YXRlIH0gZnJvbSAnLi9GZWF0dXJlU3RhdGUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZlYXR1cmVzQ29udGV4dCB7XG4gIC8vIGZlYXR1cmVzIGFyZSBsYXllcmVkOlxuICAvLyAgLSBkZWZhdWx0czogaWYgbm90aGluZyBlbHNlIG1hdGNoZXMsIHByb3ZpZGVkIGEgdmFsdWUgZm9yIGZlYXR1cmVcbiAgLy8gIC0gYnJvd3NlcjogYnJvd3Nlci1sb2NhbCB2YWx1ZXMgZm9yIGZlYXR1cmVzIChrZXB0IGluIGxvY2FsIHN0b3JhZ2UsIGV0YylcbiAgLy8gIC0gdXNlcjogdmFsdWVzIGZyb20gdGhlIHVzZXIncyBwcm9maWxlLCBpZiBhbnlcbiAgLy8gIC0gb3JnOiB2YWx1ZSBmcm9tIHRoZSBvcmcncyBwcm9maWxlLCBpZiBhbnlcbiAgZmVhdHVyZXM6IHsgW3g6IHN0cmluZ106IEFjdG9yUmVmRnJvbTx0eXBlb2YgRmVhdHVyZU1hY2hpbmU+IH07XG59XG5cbmV4cG9ydCB0eXBlIEZlYXR1cmVzQWN0aW9uID1cbiAgfCB7IHR5cGU6ICdERV9JTklUJyB9XG4gIHwgeyB0eXBlOiAnRElTQUJMRSc7IG5hbWU6IHN0cmluZyB9XG4gIHwgeyB0eXBlOiAnRU5BQkxFJzsgbmFtZTogc3RyaW5nIH1cbiAgfCB7IHR5cGU6ICdJTklUJzsgZmVhdHVyZXM6IHJlYWRvbmx5IEZlYXR1cmVEZXNjcmlwdGlvbltdIH1cbiAgfCB7IHR5cGU6ICdTRVRfQUxMJzsgZmVhdHVyZXM6IHsgW2tleTogc3RyaW5nXTogRmVhdHVyZVZhbHVlIH0gfVxuICB8IHsgdHlwZTogJ1NFVCc7IG5hbWU6IHN0cmluZzsgdmFsdWU6IEZlYXR1cmVWYWx1ZSB9XG4gIHwgeyB0eXBlOiAnVE9HR0xFJzsgbmFtZTogc3RyaW5nIH1cbiAgfCB7IHR5cGU6ICdVTlNFVCc7IG5hbWU6IHN0cmluZyB9O1xuXG5leHBvcnQgaW50ZXJmYWNlIEZlYXR1cmVzVHlwZVN0YXRlIHtcbiAgdmFsdWU6ICdyZWFkeSc7XG4gIGNvbnRleHQ6IEZlYXR1cmVzQ29udGV4dDtcbn1cblxuZXhwb3J0IHR5cGUgRmVhdHVyZXNTdGF0ZSA9IFN0YXRlRnJvbTx0eXBlb2YgRmVhdHVyZXNNYWNoaW5lPjtcbmV4cG9ydCB0eXBlIEZlYXR1cmVzRGlzcGF0Y2ggPSBJbnRlcnByZXRlckZyb208dHlwZW9mIEZlYXR1cmVzTWFjaGluZT5bJ3NlbmQnXTtcblxuZXhwb3J0IGZ1bmN0aW9uIHZhbHVlT2ZGZWF0dXJlKGZlYXR1cmVzU3RhdGU6IEZlYXR1cmVzU3RhdGUsIGZlYXR1cmU6IHN0cmluZyk6IFtGZWF0dXJlVmFsdWUsIGJvb2xlYW5dIHtcbiAgaWYgKGZlYXR1cmVzU3RhdGUuY29udGV4dC5mZWF0dXJlc1tmZWF0dXJlXSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIFt1bmRlZmluZWQsIGZhbHNlXTtcbiAgfVxuICBjb25zdCBmZWF0dXJlU3RhdGUgPSBmZWF0dXJlc1N0YXRlLmNvbnRleHQuZmVhdHVyZXNbZmVhdHVyZV0uZ2V0U25hcHNob3QoKTtcbiAgaWYgKGZlYXR1cmVTdGF0ZSAhPSBudWxsKSB7XG4gICAgcmV0dXJuIHZhbHVlRm9yU3RhdGUoZmVhdHVyZVN0YXRlKTtcbiAgfVxuICByZXR1cm4gW3VuZGVmaW5lZCwgZmFsc2VdO1xufVxuXG4vLy8gc3RhdGUgbWFjaGluZSB0aGF0IG1hbmFnZXMgYSBzZXQgb2YgZmVhdHVyZXMgd2l0aCB1c2VyLCBvcmcsIGFuZCBsb2NhbCBvdmVycmlkZXNcbmV4cG9ydCBjb25zdCBGZWF0dXJlc01hY2hpbmUgPSBjcmVhdGVNYWNoaW5lPEZlYXR1cmVzQ29udGV4dCwgRmVhdHVyZXNBY3Rpb24sIEZlYXR1cmVzVHlwZVN0YXRlPih7XG4gIGlkOiAnZmVhdHVyZXMnLFxuICBpbml0aWFsOiAnaWRsZScsXG4gIHByZWRpY3RhYmxlQWN0aW9uQXJndW1lbnRzOiB0cnVlLFxuICBjb250ZXh0OiB7XG4gICAgZmVhdHVyZXM6IHt9LFxuICB9LFxuICBzdGF0ZXM6IHtcbiAgICBpZGxlOiB7XG4gICAgICBvbjoge1xuICAgICAgICBJTklUOiB7XG4gICAgICAgICAgdGFyZ2V0OiAncmVhZHknLFxuICAgICAgICAgIGNvbmQ6IChfLCBlKSA9PiBlLmZlYXR1cmVzLmxlbmd0aCA+IDAsXG4gICAgICAgICAgYWN0aW9uczogYXNzaWduKHtcbiAgICAgICAgICAgIGZlYXR1cmVzOiAoY29udGV4dCwgZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgZmVhdHVyZXM6IHR5cGVvZiBjb250ZXh0LmZlYXR1cmVzID0ge307XG5cbiAgICAgICAgICAgICAgZm9yIChjb25zdCBmZWF0dXJlIG9mIGV2ZW50LmZlYXR1cmVzKSB7XG4gICAgICAgICAgICAgICAgZmVhdHVyZXNbZmVhdHVyZS5uYW1lXSA9IHNwYXduKEZlYXR1cmVNYWNoaW5lLCB7XG4gICAgICAgICAgICAgICAgICBuYW1lOiBmZWF0dXJlLm5hbWUsXG4gICAgICAgICAgICAgICAgICBzeW5jOiB0cnVlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGZlYXR1cmVzW2ZlYXR1cmUubmFtZV0uc2VuZCh7IHR5cGU6ICdJTklUJywgZmVhdHVyZSB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gZmVhdHVyZXM7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuXG4gICAgLy8gdGhlIGZlYXR1cmVzIGFyZSBsb2FkZWQgYW5kIHJlYWR5IHRvIGJlIHVzZWRcbiAgICByZWFkeToge1xuICAgICAgb246IHtcbiAgICAgICAgREVfSU5JVDogeyB0YXJnZXQ6ICdpZGxlJywgYWN0aW9uczogYXNzaWduKHsgZmVhdHVyZXM6IChfLCBfXykgPT4gKHt9KSB9KSB9LFxuICAgICAgICBTRVRfQUxMOiB7XG4gICAgICAgICAgYWN0aW9uczogYXNzaWduKHtcbiAgICAgICAgICAgIGZlYXR1cmVzOiAoY3R4LCBlKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGZlYXR1cmVzID0geyAuLi5jdHguZmVhdHVyZXMgfTtcbiAgICAgICAgICAgICAgLy8gQWxsIGNvbmZpZ3VyZWQgZmVhdHVyZXMgYXJlIHNldCB0byBvbi9vZmYgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICAgIE9iamVjdC5rZXlzKGZlYXR1cmVzKS5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgZmVhdHVyZXNbbmFtZV0uc2VuZCh7IHR5cGU6ICdTRVQnLCB2YWx1ZTogZS5mZWF0dXJlc1tuYW1lXSA/PyB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICByZXR1cm4gZmVhdHVyZXM7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuXG4gICAgICAgIC8vIFNldCBhIGZlYXR1cmUgdG8gYSB2YWx1ZVxuICAgICAgICBTRVQ6IHtcbiAgICAgICAgICBhY3Rpb25zOiAoY3R4LCBlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmZWF0dXJlID0gY3R4LmZlYXR1cmVzW2UubmFtZV07XG4gICAgICAgICAgICBpZiAoZmVhdHVyZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIGZlYXR1cmUuc2VuZCh7IHR5cGU6ICdTRVQnLCB2YWx1ZTogZS52YWx1ZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuXG4gICAgICAgIC8vIHRvZ2dsZSBhIGZlYXR1cmVcbiAgICAgICAgVE9HR0xFOiB7XG4gICAgICAgICAgYWN0aW9uczogKGN0eCwgZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmVhdHVyZSA9IGN0eC5mZWF0dXJlc1tlLm5hbWVdO1xuICAgICAgICAgICAgaWYgKGZlYXR1cmUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICBmZWF0dXJlLnNlbmQoeyB0eXBlOiAnVE9HR0xFJyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuXG4gICAgICAgIC8vIHdoZW4gYSBmZWF0dXJlIGlzIGVuYWJsZWQsIHNlbmQgdGhlIGVuYWJsZSBtZXNzYWdlIHRvIHRoZSBhY3RvclxuICAgICAgICBFTkFCTEU6IHtcbiAgICAgICAgICBhY3Rpb25zOiAoY3R4LCBlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmZWF0dXJlID0gY3R4LmZlYXR1cmVzW2UubmFtZV07XG4gICAgICAgICAgICBpZiAoZmVhdHVyZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIGZlYXR1cmUuc2VuZCh7IHR5cGU6ICdFTkFCTEUnIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8gd2hlbiBhIGZlYXR1cmUgaXMgZGlzYWJsZWQsIHNlbmQgdGhlIGRpc2FibGUgbWVzc2FnZSB0byB0aGUgYWN0b3JcbiAgICAgICAgRElTQUJMRToge1xuICAgICAgICAgIGFjdGlvbnM6IChjdHgsIGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZlYXR1cmUgPSBjdHguZmVhdHVyZXNbZS5uYW1lXTtcbiAgICAgICAgICAgIGlmIChmZWF0dXJlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgZmVhdHVyZS5zZW5kKHsgdHlwZTogJ0RJU0FCTEUnIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8gd2hlbiBhIGZlYXR1cmUgaXMgdW5zZXQsIHNlbmQgdGhlIHVuc2V0IG1lc3NhZ2UgdG8gdGhlIGFjdG9yXG4gICAgICAgIFVOU0VUOiB7XG4gICAgICAgICAgYWN0aW9uczogKGN0eCwgZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmVhdHVyZSA9IGN0eC5mZWF0dXJlc1tlLm5hbWVdO1xuICAgICAgICAgICAgaWYgKGZlYXR1cmUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICBmZWF0dXJlLnNlbmQoeyB0eXBlOiAnVU5TRVQnIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59KTtcbiIsICJpbXBvcnQgeyBhc3NpZ24sIGNyZWF0ZU1hY2hpbmUsIERvbmVJbnZva2VFdmVudCwgSW50ZXJwcmV0ZXJGcm9tLCBTdGF0ZUZyb20gfSBmcm9tICd4c3RhdGUnO1xuXG4vKipcbiAqIEZlYXR1cmUgaXMgZWl0aGVyIG9uLCBvZmYsIG9yICd1bnNldCcsXG4gKiB3aGljaCBtZWFucyBpdCB3aWxsIGdvIHRvIHRoZSBkZWZhdWx0IHZhbHVlIG9yIHRoZSBsZXNzIHNwZWNpZmljIHZhbHVlLlxuICovXG5leHBvcnQgdHlwZSBGZWF0dXJlVmFsdWUgPSBmYWxzZSB8IHRydWUgfCB1bmRlZmluZWQ7XG5cbmV4cG9ydCB0eXBlIEZlYXR1cmVTdGF0ZSA9IFN0YXRlRnJvbTx0eXBlb2YgRmVhdHVyZU1hY2hpbmU+O1xuZXhwb3J0IHR5cGUgRmVhdHVyZURpc3BhdGNoID0gSW50ZXJwcmV0ZXJGcm9tPHR5cGVvZiBGZWF0dXJlTWFjaGluZT5bJ3NlbmQnXTtcblxuLy8vIEdpdmVuIGEgZmVhdHVyZXN0YXRlLCBkZXRlcm1pbmUgdGhlIHZhbHVlIChvbiwgb2ZmLCBvciB1bnNldClcbmV4cG9ydCBmdW5jdGlvbiB2YWx1ZUZvclN0YXRlKGZlYXR1cmVTdGF0ZTogRmVhdHVyZVN0YXRlKTogW0ZlYXR1cmVWYWx1ZSwgYm9vbGVhbl0ge1xuICByZXR1cm4gW1xuICAgIGZlYXR1cmVTdGF0ZS5tYXRjaGVzKCdlbmFibGVkJykgPyB0cnVlIDogZmVhdHVyZVN0YXRlLm1hdGNoZXMoJ2Rpc2FibGVkJykgPyBmYWxzZSA6IHVuZGVmaW5lZCxcbiAgICBmZWF0dXJlU3RhdGUuY29udGV4dC5mZWF0dXJlRGVzYz8uZm9yY2UgPz8gZmFsc2UsXG4gIF07XG59XG5cbi8qKlxuICogRGVmaW5pdGlvbiBvZiBhIGZlYXR1cmUgdGhhdCBjYW4gYmUgZW5hYmxlZCBvciBkaXNhYmxlZC5cbiAqIEsgaXMgdGhlIHR5cGUgb2YgdGhlIGtleSB0aGF0IGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhlIGZlYXR1cmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmVhdHVyZURlc2NyaXB0aW9uPEsgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+IHtcbiAgcmVhZG9ubHkgbmFtZTogSztcbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLy8vIElmIHNldCwgd2lsbCBiZSB1c2VkIHRvIHVwZGF0ZSB0aGUgZmVhdHVyZSBkZWZhdWx0IHN0YXRlIGluc3RlYWQgb2Ygc2ltcGx5IG92ZXJyaWRpbmcuXG4gIC8vLyBGb3IgZXhhbXBsZSwgeW91IG1pZ2h0IHVzZSB0aGlzIHRvIHVwZGF0ZSBhIGZlYXR1cmUgZmxhZyBvbiBhIGJhY2tlbmQgc2VydmVyLlxuICAvLy8gd2hlbiBzZXQsIHRoZSBmZWF0dXJlIHdpbGwgYmUgdXBkYXRlZCBvbiB0aGUgYmFja2VuZCBzZXJ2ZXIsIGFuZCB0aGUgcmVzdWx0IG9mIHRoZSBhc3luY1xuICAvLy8gd2lsbCBiZSB1c2VkIGZvciB0aGUgZmluYWwgc3RhdGUgYWZ0ZXIgdGhlIGNoYW5nZS4gd2hpbGUgY2hhbmdpbmcsIHRoZSBmZWF0dXJlIHdpbGwgYmVcbiAgLy8vIGluIHRoZSAnY2hhbmdpbmcnIHN0YXRlLiBBbHNvIG5vdGUgdGhhdCB0aGUgZmVhdHVyZSB3aWxsIGJlIGNoYW5nZWQgYXQgdGhlIFwiZGVmYXVsdFwiIGxheWVyLlxuICByZWFkb25seSBvbkNoYW5nZURlZmF1bHQ/OiAobmFtZTogSywgbmV3VmFsdWU6IEZlYXR1cmVWYWx1ZSkgPT4gUHJvbWlzZTxGZWF0dXJlVmFsdWU+O1xuXG4gIC8vLyBpZiBzZXQgdHJ1ZSwgd2lsbCBmb3JjZSB0aGUgZmllbGQgdG8gd2hhdCBpdCBpcyBzZXQgaGVyZSB0aHJvdWdoIGxheWVycyBvZiBzdGF0ZXMuXG4gIC8vLyB1c2VmdWwgdG8gaW52ZXJ0IHRoZSBsYXllcnMsIHNpbWlsYXIgdG8gIWltcG9ydGFudCBpbiBDU1MuXG4gIHJlYWRvbmx5IGZvcmNlPzogYm9vbGVhbjtcblxuICAvLy8gSWYgc2V0IHRvIHRydWUsIHRoZSBmZWF0dXJlIHdpbGwgbm90IGJlIG92ZXJyaWRhYmxlIGJ5IHRoZSB1c2VyLlxuICByZWFkb25seSBub092ZXJyaWRlPzogYm9vbGVhbjtcblxuICAvLy8gY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB3aGF0IHNob3VsZCBoYXBwZW4gaWYgdGhlIGZlYXR1cmUgaXMgbm90IHNldCB0byBhIHBhcnRpY3VsYXIgdmFsdWUuXG4gIHJlYWRvbmx5IGRlZmF1bHRWYWx1ZT86IEZlYXR1cmVWYWx1ZTtcbn1cblxuaW50ZXJmYWNlIEZlYXR1cmVDb250ZXh0IHtcbiAgZmVhdHVyZURlc2M/OiBGZWF0dXJlRGVzY3JpcHRpb247XG59XG5cbnR5cGUgRmVhdHVyZVR5cGVTdGF0ZSA9XG4gIHwge1xuICAgICAgdmFsdWU6ICdhc3luY0RlbmFibGVkJztcbiAgICAgIGNvbnRleHQ6IEZlYXR1cmVDb250ZXh0O1xuICAgIH1cbiAgfCB7XG4gICAgICB2YWx1ZTogJ2FzeW5jRGlzYWJsZWQnO1xuICAgICAgY29udGV4dDogRmVhdHVyZUNvbnRleHQ7XG4gICAgfVxuICB8IHtcbiAgICAgIHZhbHVlOiAnYXN5bmNVbnNwZWNpZWQnO1xuICAgICAgY29udGV4dDogRmVhdHVyZUNvbnRleHQ7XG4gICAgfVxuICB8IHtcbiAgICAgIHZhbHVlOiAnZGlzYWJsZWQnO1xuICAgICAgY29udGV4dDogRmVhdHVyZUNvbnRleHQ7XG4gICAgfVxuICB8IHtcbiAgICAgIHZhbHVlOiAnZW5hYmxlZCc7XG4gICAgICBjb250ZXh0OiBGZWF0dXJlQ29udGV4dDtcbiAgICB9XG4gIHwge1xuICAgICAgdmFsdWU6ICdpbml0aWFsJztcbiAgICAgIGNvbnRleHQ6IG5ldmVyO1xuICAgIH1cbiAgfCB7XG4gICAgICB2YWx1ZTogJ3Vuc3BlY2llZCc7XG4gICAgICBjb250ZXh0OiBGZWF0dXJlQ29udGV4dDtcbiAgICB9O1xuXG4vKipcbiAqIEFjdGlvbnMgdGhhdCBjYW4gYmUgcGVyZm9ybWVkIG9uIGEgZmVhdHVyZS5cbiAqL1xuZXhwb3J0IHR5cGUgRmVhdHVyZUFjdGlvbiA9XG4gIHwgeyB0eXBlOiAnRElTQUJMRScgfVxuICB8IHsgdHlwZTogJ0VOQUJMRScgfVxuICB8IHsgdHlwZTogJ0lOSVQnOyBmZWF0dXJlOiBGZWF0dXJlRGVzY3JpcHRpb24gfVxuICB8IHsgdHlwZTogJ1NFVCc7IHZhbHVlOiBGZWF0dXJlVmFsdWUgfVxuICB8IHsgdHlwZTogJ1RPR0dMRScgfVxuICB8IHsgdHlwZTogJ1VOU0VUJyB9O1xuXG4vKipcbiAqIEZ1bGx5IGRlc2NyaWJlIHRoZSBzdGF0ZXMgYSBmZWF0dXJlIGNhbiBiZSBpblxuICovXG5leHBvcnQgY29uc3QgRmVhdHVyZU1hY2hpbmUgPSBjcmVhdGVNYWNoaW5lPEZlYXR1cmVDb250ZXh0LCBGZWF0dXJlQWN0aW9uLCBGZWF0dXJlVHlwZVN0YXRlPih7XG4gIGlkOiAnZmVhdHVyZScsXG4gIGluaXRpYWw6ICdpbml0aWFsJyxcbiAgY29udGV4dDoge30sXG4gIHByZWRpY3RhYmxlQWN0aW9uQXJndW1lbnRzOiB0cnVlLFxuICBvbjoge1xuICAgIEVOQUJMRTogW1xuICAgICAgeyB0YXJnZXQ6ICdhc3luY0VuYWJsZWQnLCBjb25kOiAoY3R4KSA9PiBjdHguZmVhdHVyZURlc2M/Lm9uQ2hhbmdlRGVmYXVsdCAhPSBudWxsIH0sXG4gICAgICB7IHRhcmdldDogJ2VuYWJsZWQnIH0sXG4gICAgXSxcblxuICAgIFRPR0dMRTogW1xuICAgICAgeyB0YXJnZXQ6ICdhc3luY0VuYWJsZWQnLCBjb25kOiAoY3R4KSA9PiBjdHguZmVhdHVyZURlc2M/Lm9uQ2hhbmdlRGVmYXVsdCAhPSBudWxsIH0sXG4gICAgICB7IHRhcmdldDogJ2VuYWJsZWQnIH0sXG4gICAgXSxcblxuICAgIERJU0FCTEU6IFtcbiAgICAgIHsgdGFyZ2V0OiAnYXN5bmNEaXNhYmxlZCcsIGNvbmQ6IChjdHgpID0+IGN0eC5mZWF0dXJlRGVzYz8ub25DaGFuZ2VEZWZhdWx0ICE9IG51bGwgfSxcbiAgICAgIHsgdGFyZ2V0OiAnZGlzYWJsZWQnIH0sXG4gICAgXSxcblxuICAgIFVOU0VUOiBbXG4gICAgICB7IHRhcmdldDogJ2FzeW5jVW5zcGVjaWVkJywgY29uZDogKGN0eCkgPT4gY3R4LmZlYXR1cmVEZXNjPy5vbkNoYW5nZURlZmF1bHQgIT0gbnVsbCB9LFxuICAgICAgeyB0YXJnZXQ6ICd1bnNwZWNpZmllZCcgfSxcbiAgICBdLFxuXG4gICAgU0VUOiBbXG4gICAgICB7XG4gICAgICAgIHRhcmdldDogJ2FzeW5jRW5hYmxlZCcsXG4gICAgICAgIGNvbmQ6IChjdHgsIGUpID0+IGUudmFsdWUgPT09IHRydWUgJiYgY3R4LmZlYXR1cmVEZXNjPy5vbkNoYW5nZURlZmF1bHQgIT0gbnVsbCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHRhcmdldDogJ2FzeW5jRGlzYWJsZWQnLFxuICAgICAgICBjb25kOiAoY3R4LCBlKSA9PiBlLnZhbHVlID09PSBmYWxzZSAmJiBjdHguZmVhdHVyZURlc2M/Lm9uQ2hhbmdlRGVmYXVsdCAhPSBudWxsLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdGFyZ2V0OiAnYXN5bmNVbnNwZWNpZWQnLFxuICAgICAgICBjb25kOiAoY3R4LCBfZSkgPT4gY3R4LmZlYXR1cmVEZXNjPy5vbkNoYW5nZURlZmF1bHQgIT0gbnVsbCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHRhcmdldDogJ2VuYWJsZWQnLFxuICAgICAgICBjb25kOiAoX2N0eCwgZSkgPT4gZS52YWx1ZSA9PT0gdHJ1ZSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHRhcmdldDogJ2Rpc2FibGVkJyxcbiAgICAgICAgY29uZDogKF9jdHgsIGUpID0+IGUudmFsdWUgPT09IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIHsgdGFyZ2V0OiAndW5zcGVjaWZpZWQnIH0sXG4gICAgXSxcbiAgfSxcblxuICBzdGF0ZXM6IHtcbiAgICBpbml0aWFsOiB7XG4gICAgICBvbjoge1xuICAgICAgICBJTklUOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uczogYXNzaWduKHsgZmVhdHVyZURlc2M6IChfLCBlKSA9PiBlLmZlYXR1cmUgfSksXG4gICAgICAgICAgICB0YXJnZXQ6ICdlbmFibGVkJyxcbiAgICAgICAgICAgIGNvbmQ6IChfLCBlKSA9PiBlLmZlYXR1cmUuZGVmYXVsdFZhbHVlID09PSB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uczogYXNzaWduKHsgZmVhdHVyZURlc2M6IChfLCBlKSA9PiBlLmZlYXR1cmUgfSksXG4gICAgICAgICAgICB0YXJnZXQ6ICd1bnNwZWNpZmllZCcsXG4gICAgICAgICAgICBjb25kOiAoXywgZSkgPT4gZS5mZWF0dXJlLmRlZmF1bHRWYWx1ZSA9PT0gdW5kZWZpbmVkLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uczogYXNzaWduKHsgZmVhdHVyZURlc2M6IChfLCBlKSA9PiBlLmZlYXR1cmUgfSksXG4gICAgICAgICAgICB0YXJnZXQ6ICdkaXNhYmxlZCcsXG4gICAgICAgICAgICBjb25kOiAoXywgZSkgPT4gZS5mZWF0dXJlLmRlZmF1bHRWYWx1ZSA9PT0gZmFsc2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIHVuc3BlY2lmaWVkOiB7fSxcbiAgICBkaXNhYmxlZDoge30sXG4gICAgZW5hYmxlZDoge30sXG5cbiAgICBhc3luY0Rpc2FibGVkOiB7XG4gICAgICBpbnZva2U6IHtcbiAgICAgICAgaWQ6ICdzZXQtb2ZmLXVwc3RyZWFtJyxcbiAgICAgICAgc3JjOiBhc3luYyAoY3R4KSA9PiB7XG4gICAgICAgICAgY29uc3Qgb25jaGFuZ2UgPSBjdHguZmVhdHVyZURlc2M/Lm9uQ2hhbmdlRGVmYXVsdDtcbiAgICAgICAgICBpZiAob25jaGFuZ2UgIT0gbnVsbCAmJiBjdHguZmVhdHVyZURlc2MgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG9uY2hhbmdlKGN0eC5mZWF0dXJlRGVzYy5uYW1lLCBmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH0sXG4gICAgICAgIG9uRG9uZTogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRhcmdldDogJ2VuYWJsZWQnLFxuICAgICAgICAgICAgY29uZDogKF9jdHgsIGU6IERvbmVJbnZva2VFdmVudDxGZWF0dXJlVmFsdWU+KSA9PiBlLmRhdGEgPT09IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0YXJnZXQ6ICdkaXNhYmxlZCcsXG4gICAgICAgICAgICBjb25kOiAoX2N0eCwgZTogRG9uZUludm9rZUV2ZW50PEZlYXR1cmVWYWx1ZT4pID0+IGUuZGF0YSA9PT0gZmFsc2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IHRhcmdldDogJ3Vuc3BlY2lmaWVkJyB9LFxuICAgICAgICBdLFxuICAgICAgICBvbkVycm9yOiAndW5zcGVjaWZpZWQnLFxuICAgICAgfSxcbiAgICB9LFxuXG4gICAgYXN5bmNVbnNwZWNpZWQ6IHtcbiAgICAgIGludm9rZToge1xuICAgICAgICBpZDogJ3NldC11bnNldC11cHN0cmVhbScsXG4gICAgICAgIHNyYzogYXN5bmMgKGN0eCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG9uY2hhbmdlID0gY3R4LmZlYXR1cmVEZXNjPy5vbkNoYW5nZURlZmF1bHQ7XG4gICAgICAgICAgaWYgKG9uY2hhbmdlICE9IG51bGwgJiYgY3R4LmZlYXR1cmVEZXNjICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBvbmNoYW5nZShjdHguZmVhdHVyZURlc2MubmFtZSwgdW5kZWZpbmVkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfSxcbiAgICAgICAgb25Eb25lOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdGFyZ2V0OiAnZW5hYmxlZCcsXG4gICAgICAgICAgICBjb25kOiAoX2N0eCwgZTogRG9uZUludm9rZUV2ZW50PEZlYXR1cmVWYWx1ZT4pID0+IGUuZGF0YSA9PT0gdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRhcmdldDogJ2Rpc2FibGVkJyxcbiAgICAgICAgICAgIGNvbmQ6IChfY3R4LCBlOiBEb25lSW52b2tlRXZlbnQ8RmVhdHVyZVZhbHVlPikgPT4gZS5kYXRhID09PSBmYWxzZSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHsgdGFyZ2V0OiAndW5zcGVjaWZpZWQnIH0sXG4gICAgICAgIF0sXG4gICAgICAgIG9uRXJyb3I6ICd1bnNwZWNpZmllZCcsXG4gICAgICB9LFxuICAgIH0sXG5cbiAgICBhc3luY0VuYWJsZWQ6IHtcbiAgICAgIGludm9rZToge1xuICAgICAgICBpZDogJ3NldC1vbi11cHN0cmVhbScsXG4gICAgICAgIHNyYzogYXN5bmMgKGN0eCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG9uY2hhbmdlID0gY3R4LmZlYXR1cmVEZXNjPy5vbkNoYW5nZURlZmF1bHQ7XG4gICAgICAgICAgaWYgKG9uY2hhbmdlICE9IG51bGwgJiYgY3R4LmZlYXR1cmVEZXNjICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBvbmNoYW5nZShjdHguZmVhdHVyZURlc2MubmFtZSwgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH0sXG4gICAgICAgIG9uRG9uZTogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRhcmdldDogJ2VuYWJsZWQnLFxuICAgICAgICAgICAgY29uZDogKF9jdHgsIGU6IERvbmVJbnZva2VFdmVudDxGZWF0dXJlVmFsdWU+KSA9PiBlLmRhdGEgPT09IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0YXJnZXQ6ICdkaXNhYmxlZCcsXG4gICAgICAgICAgICBjb25kOiAoX2N0eCwgZTogRG9uZUludm9rZUV2ZW50PEZlYXR1cmVWYWx1ZT4pID0+IGUuZGF0YSA9PT0gZmFsc2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IHRhcmdldDogJ3Vuc3BlY2lmaWVkJyB9LFxuICAgICAgICBdLFxuICAgICAgICBvbkVycm9yOiAndW5zcGVjaWZpZWQnLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxufSk7XG4iLCAiaW1wb3J0IFJlYWN0LCB7IHVzZU1lbW8sIFJlYWN0Tm9kZSwgdXNlRWZmZWN0LCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCB7IHVzZU1hY2hpbmUgfSBmcm9tICdAeHN0YXRlL3JlYWN0JztcblxuaW1wb3J0IHsgRW5hYmxlQ29udGV4dCB9IGZyb20gJy4vRW5hYmxlQ29udGV4dCc7XG5pbXBvcnQgeyBGZWF0dXJlQ29udGV4dCB9IGZyb20gJy4vRmVhdHVyZUNvbnRleHQnO1xuaW1wb3J0IHsgRmVhdHVyZXNNYWNoaW5lIH0gZnJvbSAnLi9GZWF0dXJlc1N0YXRlJztcbmltcG9ydCB7IEZlYXR1cmVEZXNjcmlwdGlvbiB9IGZyb20gJy4vRmVhdHVyZVN0YXRlJztcbmltcG9ydCB1c2VDb25zb2xlT3ZlcnJpZGUgZnJvbSAnLi91c2VDb25zb2xlT3ZlcnJpZGUnO1xuaW1wb3J0IHVzZVBlcnNpc3QsIHsgS0VZIH0gZnJvbSAnLi91c2VQZXJzaXN0JztcbmltcG9ydCB1c2VUZXN0Q2FsbGJhY2sgZnJvbSAnLi91c2VUZXN0Q2FsbGJhY2snO1xuXG5pbnRlcmZhY2UgRmVhdHVyZVByb3BzIHtcbiAgcmVhZG9ubHkgZmVhdHVyZXM6IHJlYWRvbmx5IEZlYXR1cmVEZXNjcmlwdGlvbltdO1xuICByZWFkb25seSBjaGlsZHJlbj86IFJlYWN0Tm9kZTtcbiAgcmVhZG9ubHkgZGlzYWJsZUNvbnNvbGU/OiBib29sZWFuO1xuICByZWFkb25seSBzdG9yYWdlPzogU3RvcmFnZTtcbn1cblxuLyoqXG4gKiBBIG1vcmUgYmF0dGVyaWVzLWVuYWJsZWQgcGFyZW50IGNvbXBvbmVudCB0aGF0IGtlZXBzIHRyYWNrIG9mIGZlYXR1cmUgc3RhdGVcbiAqIGludGVybmFsbHksIGFuZCBjcmVhdGVzIHdpbmRvdy5mZWF0dXJlLmVuYWJsZShcImZcIikgYW5kIHdpbmRvdy5mZWF0dXJlLmRpc2FibGUoXCJmXCIpLlxuICogS2VlcHMgdHJhY2sgb2Ygb3ZlcnJpZGVzIGFuZCBkZWZhdWx0cywgd2l0aCBkZWZhdWx0cyBwb3RlbnRpYWxseSBjb21pbmcgZnJvbSB5b3VyIHByb3BzXG4gKiBhbmQgb3ZlcnJpZGVzIGJlaW5nIHBlcnNpc3RlZCB0byB5b3VyIGNob2ljZSBvZiBzdG9yYWdlIGxheWVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gRmVhdHVyZXMoe1xuICBjaGlsZHJlbixcbiAgZmVhdHVyZXMsXG4gIGRpc2FibGVDb25zb2xlID0gZmFsc2UsXG4gIHN0b3JhZ2UgPSB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UsXG59OiBGZWF0dXJlUHJvcHMpOiBKU1guRWxlbWVudCB7XG4gIC8vIENhcHR1cmUgb25seSBmaXJzdCB2YWx1ZTsgd2UgZG9uJ3QgY2FyZSBhYm91dCBmdXR1cmUgdXBkYXRlc1xuICBjb25zdCBmZWF0dXJlc1JlZiA9IHVzZVJlZihmZWF0dXJlcyk7XG4gIGNvbnN0IFtvdmVycmlkZXNTdGF0ZSwgb3ZlcnJpZGVzU2VuZF0gPSB1c2VNYWNoaW5lKEZlYXR1cmVzTWFjaGluZSk7XG4gIGNvbnN0IFtkZWZhdWx0c1N0YXRlLCBkZWZhdWx0c1NlbmRdID0gdXNlTWFjaGluZShGZWF0dXJlc01hY2hpbmUpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgLy8vIExvYWQgZGVmYXVsdHNcbiAgICBkZWZhdWx0c1NlbmQoeyB0eXBlOiAnSU5JVCcsIGZlYXR1cmVzIH0pO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBkZWZhdWx0c1NlbmQoeyB0eXBlOiAnREVfSU5JVCcgfSk7XG4gICAgfTtcbiAgfSwgW2RlZmF1bHRzU2VuZCwgZmVhdHVyZXNdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGxldCBmOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuIHwgdW5kZWZpbmVkPiA9IHt9O1xuICAgIGlmIChzdG9yYWdlICE9IG51bGwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGZlYXR1cmVzSnNvbiA9IHN0b3JhZ2UuZ2V0SXRlbShLRVkpO1xuICAgICAgICBpZiAoZmVhdHVyZXNKc29uICE9IG51bGwpIHtcbiAgICAgICAgICBjb25zdCBmaCA9IEpTT04ucGFyc2UoZmVhdHVyZXNKc29uKTtcbiAgICAgICAgICBmID0gZmgub3ZlcnJpZGVzO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIENhbid0IHBhcnNlIG9yIGdldCBvciBvdGhlcndpc2U7IGlnbm9yZVxuICAgICAgICBjb25zb2xlLmVycm9yKCdlcnJvciBpbiBsb2NhbFN0b3JhZ2UnLCBlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBvdmVycmlkZXNTZW5kKHtcbiAgICAgIHR5cGU6ICdJTklUJyxcbiAgICAgIGZlYXR1cmVzOiBmZWF0dXJlc1JlZi5jdXJyZW50XG4gICAgICAgIC5maWx0ZXIoKHgpID0+IHgubm9PdmVycmlkZSAhPT0gdHJ1ZSlcbiAgICAgICAgLm1hcCgoeCkgPT4gKHsgbmFtZTogeC5uYW1lLCBkZXNjcmlwdGlvbjogeC5kZXNjcmlwdGlvbiwgZGVmYXVsdFZhbHVlOiBmPy5beC5uYW1lXSA/PyB1bmRlZmluZWQgfSkpLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIG92ZXJyaWRlc1NlbmQoeyB0eXBlOiAnREVfSU5JVCcgfSk7XG4gICAgfTtcbiAgfSwgW2ZlYXR1cmVzUmVmLCBvdmVycmlkZXNTZW5kLCBzdG9yYWdlXSk7XG5cbiAgdXNlUGVyc2lzdChzdG9yYWdlLCBmZWF0dXJlc1JlZi5jdXJyZW50LCBvdmVycmlkZXNTdGF0ZSk7XG5cbiAgY29uc3QgdGVzdENhbGxiYWNrID0gdXNlVGVzdENhbGxiYWNrKG92ZXJyaWRlc1N0YXRlLCBkZWZhdWx0c1N0YXRlKTtcbiAgdXNlQ29uc29sZU92ZXJyaWRlKCFkaXNhYmxlQ29uc29sZSwgZmVhdHVyZXNSZWYuY3VycmVudCwgdGVzdENhbGxiYWNrLCBkZWZhdWx0c1NlbmQpO1xuXG4gIGNvbnN0IGZlYXR1cmVWYWx1ZSA9IHVzZU1lbW8oXG4gICAgKCkgPT4gKHtcbiAgICAgIG92ZXJyaWRlc1NlbmQsXG4gICAgICBkZWZhdWx0c1NlbmQsXG4gICAgICBmZWF0dXJlc0Rlc2NyaXB0aW9uOiBmZWF0dXJlc1JlZi5jdXJyZW50LFxuICAgICAgb3ZlcnJpZGVzU3RhdGUsXG4gICAgICBkZWZhdWx0c1N0YXRlLFxuICAgICAgdGVzdDogdGVzdENhbGxiYWNrLFxuICAgIH0pLFxuICAgIFtvdmVycmlkZXNTZW5kLCBkZWZhdWx0c1NlbmQsIG92ZXJyaWRlc1N0YXRlLCBkZWZhdWx0c1N0YXRlLCB0ZXN0Q2FsbGJhY2tdXG4gICk7XG5cbiAgcmV0dXJuIChcbiAgICA8RmVhdHVyZUNvbnRleHQuUHJvdmlkZXIgdmFsdWU9e2ZlYXR1cmVWYWx1ZX0+XG4gICAgICA8RW5hYmxlQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17dGVzdENhbGxiYWNrfT57Y2hpbGRyZW59PC9FbmFibGVDb250ZXh0LlByb3ZpZGVyPlxuICAgIDwvRmVhdHVyZUNvbnRleHQuUHJvdmlkZXI+XG4gICk7XG59XG4iLCAiaW1wb3J0IHsgY3JlYXRlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHsgRmVhdHVyZVZhbHVlIH0gZnJvbSAnLi9GZWF0dXJlU3RhdGUnO1xuXG5leHBvcnQgdHlwZSBFbmFibGVDb250ZXh0VHlwZSA9IChmZWF0dXJlOiBzdHJpbmcpID0+IEZlYXR1cmVWYWx1ZTtcblxuLyoqXG4gKiBDb250YWluZWQgZnVuY3Rpb24gY2FuIGNoZWNrIHdoZXRoZXIgYSBnaXZlbiBmZWF0dXJlIGlzIGVuYWJsZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBFbmFibGVDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxFbmFibGVDb250ZXh0VHlwZT4oKF9zKSA9PiBmYWxzZSk7XG4iLCAiaW1wb3J0IHsgY3JlYXRlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHsgRmVhdHVyZXNEaXNwYXRjaCwgRmVhdHVyZXNTdGF0ZSB9IGZyb20gJy4vRmVhdHVyZXNTdGF0ZSc7XG5pbXBvcnQgeyBGZWF0dXJlRGVzY3JpcHRpb24sIEZlYXR1cmVWYWx1ZSB9IGZyb20gJy4vRmVhdHVyZVN0YXRlJztcblxuZXhwb3J0IGNvbnN0IEZlYXR1cmVDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxGZWF0dXJlQ29udGV4dFR5cGUgfCBudWxsPihudWxsKTtcblxuLy8vIEdpdmUgYWNjZXNzIHRvIHRoZSBvdmVycmlkZXMgbGF5ZXJcbmV4cG9ydCBpbnRlcmZhY2UgRmVhdHVyZUNvbnRleHRUeXBlIHtcbiAgLy8gTWFrZSBjaGFuZ2VzIHRvIHRoZSBvdmVycmlkZXNcbiAgb3ZlcnJpZGVzU2VuZDogRmVhdHVyZXNEaXNwYXRjaDtcblxuICAvLyBNYWtlIGNoYW5nZXMgdG8gZGVmYXVsdHNcbiAgZGVmYXVsdHNTZW5kOiBGZWF0dXJlc0Rpc3BhdGNoO1xuXG4gIGZlYXR1cmVzRGVzY3JpcHRpb246IHJlYWRvbmx5IEZlYXR1cmVEZXNjcmlwdGlvbltdO1xuXG4gIC8vIFN0YXRlIGlzIGluIGxheWVyczsgb3ZlcnJpZGVzIGFuZCBkZWZhdWx0c1xuICBvdmVycmlkZXNTdGF0ZTogRmVhdHVyZXNTdGF0ZTtcbiAgZGVmYXVsdHNTdGF0ZTogRmVhdHVyZXNTdGF0ZTtcblxuICAvLy8gVGVzdCB3aXRoIHByb3BlciBmYWxsYmFjayBhbmQgcmVzcGVjdGluZyB0aGUgdXNlcidzIGZvcmNlIHByZWZlcmVuY2VcbiAgdGVzdDogKGZsYWc6IHN0cmluZykgPT4gRmVhdHVyZVZhbHVlO1xufVxuIiwgImltcG9ydCB7IHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHsgRmVhdHVyZXNEaXNwYXRjaCB9IGZyb20gJy4vRmVhdHVyZXNTdGF0ZSc7XG5pbXBvcnQgeyBGZWF0dXJlRGVzY3JpcHRpb24sIEZlYXR1cmVWYWx1ZSB9IGZyb20gJy4vRmVhdHVyZVN0YXRlJztcbmltcG9ydCB7IEdsb2JhbEVuYWJsZSB9IGZyb20gJy4vR2xvYmFsRW5hYmxlJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlQ29uc29sZU92ZXJyaWRlKFxuICBjb25zb2xlT3ZlcnJpZGU6IGJvb2xlYW4sXG4gIGZlYXR1cmVzOiByZWFkb25seSBGZWF0dXJlRGVzY3JpcHRpb25bXSxcbiAgdGVzdEZlYXR1cmU6IChfOiBzdHJpbmcpID0+IEZlYXR1cmVWYWx1ZSxcbiAgZGlzcGF0Y2g6IEZlYXR1cmVzRGlzcGF0Y2hcbik6IHZvaWQge1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghY29uc29sZU92ZXJyaWRlKSB7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAvKiBlbXB0eSAqL1xuICAgICAgfTtcbiAgICB9XG4gICAgd2luZG93LmZlYXR1cmUgPSBuZXcgR2xvYmFsRW5hYmxlKGRpc3BhdGNoLCB0ZXN0RmVhdHVyZSwgZmVhdHVyZXMpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBpZiAod2luZG93LmZlYXR1cmUgIT0gbnVsbCkge1xuICAgICAgICBkZWxldGUgd2luZG93LmZlYXR1cmU7XG4gICAgICB9XG4gICAgfTtcbiAgfSwgW2ZlYXR1cmVzLCBkaXNwYXRjaCwgY29uc29sZU92ZXJyaWRlLCB0ZXN0RmVhdHVyZV0pO1xufVxuIiwgImltcG9ydCB7IEZlYXR1cmVzRGlzcGF0Y2ggfSBmcm9tICcuL0ZlYXR1cmVzU3RhdGUnO1xuaW1wb3J0IHsgRmVhdHVyZURlc2NyaXB0aW9uLCBGZWF0dXJlVmFsdWUgfSBmcm9tICcuL0ZlYXR1cmVTdGF0ZSc7XG5cbmV4cG9ydCBjbGFzcyBHbG9iYWxFbmFibGUge1xuICBwcml2YXRlIHJlYWRvbmx5IGZlYXR1cmVEZXNjOiByZWFkb25seSBGZWF0dXJlRGVzY3JpcHRpb25bXTtcbiAgcHJpdmF0ZSByZWFkb25seSBkaXNwYXRjaDogRmVhdHVyZXNEaXNwYXRjaDtcbiAgcHJpdmF0ZSByZWFkb25seSB0ZXN0RmVhdHVyZTogKHZhbHVlOiBzdHJpbmcpID0+IEZlYXR1cmVWYWx1ZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBkaXNwYXRjaDogRmVhdHVyZXNEaXNwYXRjaCxcbiAgICB0ZXN0RmVhdHVyZTogKF86IHN0cmluZykgPT4gRmVhdHVyZVZhbHVlLFxuICAgIGZlYXR1cmVEZXNjOiByZWFkb25seSBGZWF0dXJlRGVzY3JpcHRpb25bXVxuICApIHtcbiAgICB0aGlzLmZlYXR1cmVEZXNjID0gZmVhdHVyZURlc2M7XG4gICAgdGhpcy5kaXNwYXRjaCA9IGRpc3BhdGNoO1xuICAgIHRoaXMudGVzdEZlYXR1cmUgPSB0ZXN0RmVhdHVyZTtcbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGUoZmVhdHVyZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwYXRjaCh7IHR5cGU6ICdUT0dHTEUnLCBuYW1lOiBmZWF0dXJlIH0pO1xuICB9XG5cbiAgcHVibGljIGVuYWJsZShmZWF0dXJlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BhdGNoKHsgdHlwZTogJ0VOQUJMRScsIG5hbWU6IGZlYXR1cmUgfSk7XG4gIH1cblxuICBwdWJsaWMgdW5zZXQoZmVhdHVyZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwYXRjaCh7IHR5cGU6ICdVTlNFVCcsIG5hbWU6IGZlYXR1cmUgfSk7XG4gIH1cblxuICBwdWJsaWMgZGlzYWJsZShmZWF0dXJlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BhdGNoKHsgdHlwZTogJ0RJU0FCTEUnLCBuYW1lOiBmZWF0dXJlIH0pO1xuICB9XG5cbiAgcHVibGljIHNldEFsbChmZWF0dXJlczogeyBba2V5OiBzdHJpbmddOiBGZWF0dXJlVmFsdWUgfSk6IHZvaWQge1xuICAgIHRoaXMuZGlzcGF0Y2goeyB0eXBlOiAnU0VUX0FMTCcsIGZlYXR1cmVzIH0pO1xuICB9XG5cbiAgcHVibGljIGxpc3RGZWF0dXJlcygpOiByZWFkb25seSBbc3RyaW5nLCBGZWF0dXJlVmFsdWVdW10ge1xuICAgIHJldHVybiB0aGlzLmZlYXR1cmVEZXNjLm1hcCgoZikgPT4gW2YubmFtZSwgdGhpcy50ZXN0RmVhdHVyZShmLm5hbWUpXSk7XG4gIH1cbn1cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgZmVhdHVyZT86IEdsb2JhbEVuYWJsZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IHVzZU1lbW8sIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHsgRmVhdHVyZXNTdGF0ZSwgdmFsdWVPZkZlYXR1cmUgfSBmcm9tICcuL0ZlYXR1cmVzU3RhdGUnO1xuaW1wb3J0IHsgRmVhdHVyZURlc2NyaXB0aW9uLCBGZWF0dXJlVmFsdWUgfSBmcm9tICcuL0ZlYXR1cmVTdGF0ZSc7XG5cbmV4cG9ydCBjb25zdCBLRVkgPSAncmVhY3QtZW5hYmxlOmZlYXR1cmUtdmFsdWVzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlUGVyc2lzdChcbiAgc3RvcmFnZTogU3RvcmFnZSB8IHVuZGVmaW5lZCxcbiAgZmVhdHVyZXM6IHJlYWRvbmx5IEZlYXR1cmVEZXNjcmlwdGlvbltdLFxuICBvdmVycmlkZVN0YXRlOiBGZWF0dXJlc1N0YXRlXG4pOiB2b2lkIHtcbiAgY29uc3Qgb3ZlcnJpZGVzID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgbmV3T3ZlcnJpZGVzOiB7IFtrZXk6IHN0cmluZ106IEZlYXR1cmVWYWx1ZSB9ID0ge307XG4gICAgaWYgKG92ZXJyaWRlU3RhdGUubWF0Y2hlcygncmVhZHknKSkge1xuICAgICAgZm9yIChjb25zdCBmZWF0dXJlIG9mIGZlYXR1cmVzKSB7XG4gICAgICAgIGNvbnN0IFt2YWx1ZV0gPSB2YWx1ZU9mRmVhdHVyZShvdmVycmlkZVN0YXRlLCBmZWF0dXJlLm5hbWUpO1xuICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgIG5ld092ZXJyaWRlc1tmZWF0dXJlLm5hbWVdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ld092ZXJyaWRlcztcbiAgfSwgW2ZlYXR1cmVzLCBvdmVycmlkZVN0YXRlXSk7XG5cbiAgY29uc3Qgc3RyU3RhdGUgPSBPYmplY3Qua2V5cyhvdmVycmlkZXMpLmxlbmd0aCA9PT0gMCB8fCBzdG9yYWdlID09IG51bGwgPyAne30nIDogSlNPTi5zdHJpbmdpZnkoeyBvdmVycmlkZXMgfSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICB0cnkge1xuICAgICAgaWYgKHN0b3JhZ2UgIT0gbnVsbCAmJiBvdmVycmlkZVN0YXRlLm1hdGNoZXMoJ3JlYWR5JykpIHtcbiAgICAgICAgc3RvcmFnZS5zZXRJdGVtKEtFWSwgc3RyU3RhdGUpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIENhbid0IHNldCBmb3Igc29tZSByZWFzb25cbiAgICB9XG4gIH0sIFtvdmVycmlkZVN0YXRlLCBzdG9yYWdlLCBzdHJTdGF0ZV0pO1xufVxuIiwgImltcG9ydCB7IHVzZUNhbGxiYWNrIH0gZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgeyBGZWF0dXJlc1N0YXRlIH0gZnJvbSAnLi9GZWF0dXJlc1N0YXRlJztcbmltcG9ydCB0ZXN0RmVhdHVyZSBmcm9tICcuL3Rlc3RGZWF0dXJlJztcblxuLy8vIEEgY2FsbGJhY2sgdGhhdCBjYW4gYmUgY2FsbGVkIHRvIHRlc3QgaWYgYSBmZWF0dXJlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWRcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZVRlc3RDYWxsYmFjayhcbiAgZGVmYXVsdHNTdGF0ZTogRmVhdHVyZXNTdGF0ZSxcbiAgb3ZlcnJpZGVzU3RhdGU6IEZlYXR1cmVzU3RhdGVcbik6IChmZWF0dXJlOiBzdHJpbmcpID0+IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICByZXR1cm4gdXNlQ2FsbGJhY2soKGY6IHN0cmluZykgPT4gdGVzdEZlYXR1cmUoZiwgW2RlZmF1bHRzU3RhdGUsIG92ZXJyaWRlc1N0YXRlXSksIFtkZWZhdWx0c1N0YXRlLCBvdmVycmlkZXNTdGF0ZV0pO1xufVxuIiwgImltcG9ydCB7IEZlYXR1cmVzU3RhdGUsIHZhbHVlT2ZGZWF0dXJlIH0gZnJvbSAnLi9GZWF0dXJlc1N0YXRlJztcbmltcG9ydCB7IEZlYXR1cmVWYWx1ZSB9IGZyb20gJy4vRmVhdHVyZVN0YXRlJztcblxuLyoqIERldGVybWluZSBpZiB0aGUgZmVhdHVyZSBpcyBlbmFibGVkIGluIG9uZSBvZiB0aGUgc3RhdGUgbWFjaGluZXMsIGluIG9yZGVyXG4gKlxuICogQHBhcmFtIHN0YXRlIFRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBtYWNoaW5lXG4gKiBAcGFyYW0gZmVhdHVyZSBUaGUgZmVhdHVyZSB0byBjaGVja1xuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRlc3RGZWF0dXJlKGZlYXR1cmU6IHN0cmluZywgc3RhdGVzOiBGZWF0dXJlc1N0YXRlW10pOiBGZWF0dXJlVmFsdWUge1xuICBjb25zdCB2YWx1ZXMgPSBzdGF0ZXMubWFwKChzdGF0ZSkgPT4gdmFsdWVPZkZlYXR1cmUoc3RhdGUsIGZlYXR1cmUpKTtcblxuICAvLyBsb29rIGZvciBiZXN0IGZvcmNlZCBvcHRpb24sIGluIG9yZGVyXG4gIGZvciAoY29uc3QgW2ZlYXR1cmVWYWx1ZSwgZmVhdHVyZUZvcmNlZF0gb2YgdmFsdWVzKSB7XG4gICAgaWYgKGZlYXR1cmVWYWx1ZSAhPSBudWxsICYmIGZlYXR1cmVGb3JjZWQpIHtcbiAgICAgIHJldHVybiBmZWF0dXJlVmFsdWU7XG4gICAgfVxuICB9XG5cbiAgLy8gbG9vayBmb3IgYmVzdCBub24tZm9yY2VkIG9wdGlvbiwgaW4gb3JkZXJcbiAgZm9yIChjb25zdCBbZmVhdHVyZVZhbHVlXSBvZiB2YWx1ZXMpIHtcbiAgICBpZiAoZmVhdHVyZVZhbHVlICE9IG51bGwpIHtcbiAgICAgIHJldHVybiBmZWF0dXJlVmFsdWU7XG4gICAgfVxuICB9XG5cbiAgLy8gdW5zZXQgaWYgbm90aGluZyBoaXRcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiIsICJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCB7IHVzZUFsbEVuYWJsZWQgfSBmcm9tICcuL3VzZUFsbEVuYWJsZWQnO1xuaW1wb3J0IHsgdXNlRW5hYmxlZCB9IGZyb20gJy4vdXNlRW5hYmxlZCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW5hYmxlUHJvcHMge1xuICByZWFkb25seSBmZWF0dXJlPzogc3RyaW5nW10gfCBzdHJpbmc7XG4gIHJlYWRvbmx5IGFsbEZlYXR1cmVzPzogc3RyaW5nW107XG4gIGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGU7XG59XG5cbi8qKlxuICogRmVhdHVyZSB3aWxsIGJlIGVuYWJsZWQgaWYgYW55IGZlYXR1cmUgaW4gdGhlIGxpc3QgYXJlIGVuYWJsZWQsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFbmFibGUoeyBmZWF0dXJlID0gW10sIGFsbEZlYXR1cmVzID0gW10sIGNoaWxkcmVuIH06IEVuYWJsZVByb3BzKTogSlNYLkVsZW1lbnQgfCBudWxsIHtcbiAgY29uc3QgaXNBbnkgPSB1c2VFbmFibGVkKGZlYXR1cmUpO1xuICBjb25zdCBpc0FsbCA9IHVzZUFsbEVuYWJsZWQoYWxsRmVhdHVyZXMpO1xuXG4gIGlmIChpc0FueSB8fCBpc0FsbCkge1xuICAgIHJldHVybiA8PntjaGlsZHJlbn08Lz47XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbiIsICJpbXBvcnQgeyB1c2VDb250ZXh0LCB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgeyBFbmFibGVDb250ZXh0VHlwZSwgRW5hYmxlQ29udGV4dCB9IGZyb20gJy4vRW5hYmxlQ29udGV4dCc7XG5cbi8vIEhlbHBlcjogZ2V0IHJpZCBvZiBzb21lIGJvaWxlcnBsYXRlLlxuLy8ganVzdCBpbnB1dCBtYXNoaW5nIGFuZCBzYW5pdGF0aW9uLCByZW1vdmluZyBleHRyYSByZW5kZXJzLCBhbmQgZ2V0dGluZyB0ZXN0IGZ1bmN0aW9uXG5leHBvcnQgZnVuY3Rpb24gdXNlVGVzdEFuZENvbnZlcnQoaW5wdXQ/OiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwpOiBbRW5hYmxlQ29udGV4dFR5cGUsIHN0cmluZ1tdXSB7XG4gIGNvbnN0IHRlc3QgPSB1c2VDb250ZXh0KEVuYWJsZUNvbnRleHQpO1xuXG4gIC8vIFdlIG1lbW9pemUganVzdCB0byBwcmV2ZW50IHJlLXJlbmRlcnMgc2luY2UgdGhpcyBjb3VsZCBiZSBhdCB0aGUgbGVhZiBvZiBhIHRyZWVcbiAgY29uc3QgY29udmVydGVkID0gdXNlTWVtbygoKSA9PiAoaW5wdXQgPT0gbnVsbCA/IFtdIDogQXJyYXkuaXNBcnJheShpbnB1dCkgPyBpbnB1dCA6IFtpbnB1dF0pLCBbaW5wdXRdKTtcblxuICByZXR1cm4gW3Rlc3QsIGNvbnZlcnRlZF07XG59XG4iLCAiaW1wb3J0IHsgdXNlVGVzdEFuZENvbnZlcnQgfSBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiByZXR1cm5zIHRydWUgaWZmIGFsbCBzcGVjaWZpZWQgZmVhdHVyZXMgYXJlIGVuYWJsZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUFsbEVuYWJsZWQoYWxsRmVhdHVyZXM6IHN0cmluZ1tdIHwgc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IFt0ZXN0LCBxdWVyeUFsbFByZXNlbnRdID0gdXNlVGVzdEFuZENvbnZlcnQoYWxsRmVhdHVyZXMpO1xuICByZXR1cm4gcXVlcnlBbGxQcmVzZW50Lmxlbmd0aCA+IDAgJiYgcXVlcnlBbGxQcmVzZW50LmV2ZXJ5KHRlc3QpO1xufVxuIiwgImltcG9ydCB7IHVzZVRlc3RBbmRDb252ZXJ0IH0gZnJvbSAnLi91dGlscyc7XG5cbi8qKlxuICogcmV0dXJucyB0cnVlIGlmZiBhbnkgc3BlY2lmaWVkIGZlYXR1cmUgaXMgZW5hYmxlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlRW5hYmxlZChmZWF0dXJlOiBzdHJpbmdbXSB8IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBbdGVzdCwgcXVlcnlBbnlQcmVzZW50XSA9IHVzZVRlc3RBbmRDb252ZXJ0KGZlYXR1cmUpO1xuICByZXR1cm4gcXVlcnlBbnlQcmVzZW50LnNvbWUodGVzdCk7XG59XG4iLCAiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5cbmltcG9ydCB7IEVuYWJsZVByb3BzIH0gZnJvbSBcIi4vRW5hYmxlXCI7XG5pbXBvcnQgeyB1c2VBbGxEaXNhYmxlZCB9IGZyb20gXCIuL3VzZUFsbERpc2FibGVkXCI7XG5pbXBvcnQgeyB1c2VEaXNhYmxlZCB9IGZyb20gXCIuL3VzZURpc2FibGVkXCI7XG5cbi8qKlxuICogRmVhdHVyZSB3aWxsIGJlIGRpc2FibGVkIGlmIGFueSBpbiB0aGUgbGlzdCBhcmUgZW5hYmxlZFxuICovXG5leHBvcnQgY29uc3QgRGlzYWJsZTogUmVhY3QuRkM8RW5hYmxlUHJvcHM+ID0gKHtcbiAgZmVhdHVyZSA9IFtdLFxuICBhbGxGZWF0dXJlcyA9IFtdLFxuICBjaGlsZHJlblxufSkgPT4ge1xuICBjb25zdCBpc0FueSA9IHVzZURpc2FibGVkKGZlYXR1cmUpO1xuICBjb25zdCBpc0FsbCA9IHVzZUFsbERpc2FibGVkKGFsbEZlYXR1cmVzKTtcblxuICBpZiAoaXNBbnkgfHwgaXNBbGwpIHtcbiAgICByZXR1cm4gPD57Y2hpbGRyZW59PC8+O1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59O1xuIiwgImltcG9ydCB7IHVzZVRlc3RBbmRDb252ZXJ0IH0gZnJvbSAnLi91dGlscyc7XG5cbi8qKlxuICogcmV0dXJucyB0cnVlIGlmZiBhbGwgc3BlY2lmaWVkIGZlYXR1cmVzIGFyZSBkaXNhYmxlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlQWxsRGlzYWJsZWQod2l0aG91dEFsbDogc3RyaW5nW10gfCBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgW3Rlc3QsIHF1ZXJ5QWxsV2l0aG91dF0gPSB1c2VUZXN0QW5kQ29udmVydCh3aXRob3V0QWxsKTtcbiAgcmV0dXJuIHdpdGhvdXRBbGwubGVuZ3RoID4gMCAmJiBxdWVyeUFsbFdpdGhvdXQuZXZlcnkoKHgpID0+ICEodGVzdCh4KSA/PyBmYWxzZSkpO1xufVxuIiwgImltcG9ydCB7IHVzZVRlc3RBbmRDb252ZXJ0IH0gZnJvbSAnLi91dGlscyc7XG5cbi8qKlxuICogcmV0dXJucyB0cnVlIGlmZiBhbnkgc3BlY2lmaWVkIGZlYXR1cmUgaXMgZGlzYWJsZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZURpc2FibGVkKHdpdGhvdXQ6IHN0cmluZ1tdIHwgc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IFt0ZXN0LCBxdWVyeUFueVdpdGhvdXRdID0gdXNlVGVzdEFuZENvbnZlcnQod2l0aG91dCk7XG4gIHJldHVybiBxdWVyeUFueVdpdGhvdXQuc29tZSgoeCkgPT4gISh0ZXN0KHgpID8/IGZhbHNlKSk7XG59XG4iLCAiaW1wb3J0IFJlYWN0LCB7IHVzZUNvbnRleHQsIHVzZVN0YXRlLCB1c2VDYWxsYmFjaywgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbSc7XG5cbmltcG9ydCB7IFJhZGlvR3JvdXAgfSBmcm9tICdAaGVhZGxlc3N1aS9yZWFjdCc7XG5cbmltcG9ydCB7IEZlYXR1cmVDb250ZXh0IH0gZnJvbSAnLi9GZWF0dXJlQ29udGV4dCc7XG5pbXBvcnQgeyB2YWx1ZU9mRmVhdHVyZSB9IGZyb20gJy4vRmVhdHVyZXNTdGF0ZSc7XG5pbXBvcnQgeyBGZWF0dXJlRGVzY3JpcHRpb24gfSBmcm9tICcuL0ZlYXR1cmVTdGF0ZSc7XG4vLyBAdHMtZXhwZWN0LWVycm9yIGJ1bmRsZXIgd2lsbCB0YWtlIGNhcmUgb2YgdGhpc1xuaW1wb3J0IHN0eWxlcyBmcm9tICcuL3RhaWx3aW5kLmNzcyc7XG5cbmZ1bmN0aW9uIGNsYXNzTmFtZXMoLi4uY2xhc3Nlczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gY2xhc3Nlcy5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xufVxuXG5mdW5jdGlvbiBUb2dnbGVGZWF0dXJlKHsgZmVhdHVyZSB9OiB7IGZlYXR1cmU6IEZlYXR1cmVEZXNjcmlwdGlvbiB9KTogSlNYLkVsZW1lbnQgfCBudWxsIHtcbiAgY29uc3QgY29udGV4dCA9IHVzZUNvbnRleHQoRmVhdHVyZUNvbnRleHQpO1xuICBjb25zdCBoYW5kbGVDaGFuZ2VTZWxlY3Rpb24gPSB1c2VDYWxsYmFjayhcbiAgICAodmFsdWU6ICdmYWxzZScgfCAndHJ1ZScgfCAndW5zZXQnKSA9PiB7XG4gICAgICBpZiAoY29udGV4dD8ub3ZlcnJpZGVzU2VuZCAhPSBudWxsKSB7XG4gICAgICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgICAgICBjYXNlICd0cnVlJzoge1xuICAgICAgICAgICAgY29udGV4dC5vdmVycmlkZXNTZW5kKHsgdHlwZTogJ0VOQUJMRScsIG5hbWU6IGZlYXR1cmUubmFtZSB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdmYWxzZSc6IHtcbiAgICAgICAgICAgIGNvbnRleHQub3ZlcnJpZGVzU2VuZCh7IHR5cGU6ICdESVNBQkxFJywgbmFtZTogZmVhdHVyZS5uYW1lIH0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3Vuc2V0Jzoge1xuICAgICAgICAgICAgY29udGV4dC5vdmVycmlkZXNTZW5kKHsgdHlwZTogJ1VOU0VUJywgbmFtZTogZmVhdHVyZS5uYW1lIH0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBbZmVhdHVyZS5uYW1lLCBjb250ZXh0XVxuICApO1xuXG4gIGlmIChjb250ZXh0ID09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHsgb3ZlcnJpZGVzU3RhdGUsIHRlc3Q6IHRlc3RGZWF0dXJlLCBkZWZhdWx0c1N0YXRlIH0gPSBjb250ZXh0O1xuXG4gIGNvbnN0IHZhbHVlSW5EZWZhdWx0cyA9ICh2YWx1ZU9mRmVhdHVyZShkZWZhdWx0c1N0YXRlLCBmZWF0dXJlLm5hbWUpWzBdID8/ICd1bnNldCcpLnRvU3RyaW5nKCkgYXNcbiAgICB8ICdmYWxzZSdcbiAgICB8ICd0cnVlJ1xuICAgIHwgJ3Vuc2V0JztcblxuICBjb25zdCB2YWx1ZUluT3ZlcnJpZGVzID0gKHZhbHVlT2ZGZWF0dXJlKG92ZXJyaWRlc1N0YXRlLCBmZWF0dXJlLm5hbWUpWzBdID8/ICd1bnNldCcpLnRvU3RyaW5nKCkgYXNcbiAgICB8ICdmYWxzZSdcbiAgICB8ICd0cnVlJ1xuICAgIHwgJ3Vuc2V0JztcblxuICBjb25zdCBhY3R1YWxDaGVja2VkID0gdGVzdEZlYXR1cmUoZmVhdHVyZS5uYW1lKTtcblxuICByZXR1cm4gKFxuICAgIDxSYWRpb0dyb3VwIGRpc2FibGVkPXtmZWF0dXJlLm5vT3ZlcnJpZGV9IG9uQ2hhbmdlPXtoYW5kbGVDaGFuZ2VTZWxlY3Rpb259IHZhbHVlPXt2YWx1ZUluT3ZlcnJpZGVzfT5cbiAgICAgIDxSYWRpb0dyb3VwLkxhYmVsPlxuICAgICAgICA8aDYgY2xhc3NOYW1lPVwidGV4dC1ncmF5LTkwMCBhbGlnbi1jZW50ZXIgZmxleCBmbGV4LXJvdyBmbGV4LW5vd3JhcCBpdGVtcy1jZW50ZXIgZ2FwLTIgbGc6Z2FwLTQgaC03XCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZm9udC1tZWRpdW1cIj5cbiAgICAgICAgICAgIEZlYXR1cmU6IDxjb2RlPntmZWF0dXJlLm5hbWV9PC9jb2RlPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICB7ZmVhdHVyZS5ub092ZXJyaWRlID09PSB0cnVlID8gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJib3JkZXItb3JhbmdlLTUwMCB0ZXh0LW9yYW5nZS01MDAgZmxleCBmbGV4LW5vd3JhcCB0ZXh0LXhzIGZsZXgtcm93IGdhcC0xIHJvdW5kZWQtc20gYm9yZGVyIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBweC0yIHB5LTFcIj5cbiAgICAgICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaC00IHctNCBtaW4tdy00XCJcbiAgICAgICAgICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDIwIDIwXCJcbiAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICBjbGlwUnVsZT1cImV2ZW5vZGRcIlxuICAgICAgICAgICAgICAgICAgZD1cIk01IDlWN2E1IDUgMCAwMTEwIDB2MmEyIDIgMCAwMTIgMnY1YTIgMiAwIDAxLTIgMkg1YTIgMiAwIDAxLTItMnYtNWEyIDIgMCAwMTItMnptOC0ydjJIN1Y3YTMgMyAwIDAxNiAwelwiXG4gICAgICAgICAgICAgICAgICBmaWxsUnVsZT1cImV2ZW5vZGRcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICA8ZGl2Pk5vIE92ZXJyaWRlczwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAge2FjdHVhbENoZWNrZWQgPT09IHRydWUgPyAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1ub3dyYXAgdGV4dC14cyB0ZXh0LWdyZWVuLTUwMCBmbGV4LXJvdyBnYXAtMSByb3VuZGVkLXNtIGJvcmRlciBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgYm9yZGVyLWdyZWVuLTUwMCBweC0yIHB5LTFcIj5cbiAgICAgICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaC00IHctNCBtaW4tdy00XCJcbiAgICAgICAgICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDIwIDIwXCJcbiAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICBjbGlwUnVsZT1cImV2ZW5vZGRcIlxuICAgICAgICAgICAgICAgICAgZD1cIk0xMCAxOGE4IDggMCAxMDAtMTYgOCA4IDAgMDAwIDE2em0zLjcwNy05LjI5M2ExIDEgMCAwMC0xLjQxNC0xLjQxNEw5IDEwLjU4NiA3LjcwNyA5LjI5M2ExIDEgMCAwMC0xLjQxNCAxLjQxNGwyIDJhMSAxIDAgMDAxLjQxNCAwbDQtNHpcIlxuICAgICAgICAgICAgICAgICAgZmlsbFJ1bGU9XCJldmVub2RkXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgPGRpdj57YWN0dWFsQ2hlY2tlZCA/ICdFbmFibGVkJyA6ICdEaXNhYmxlZCd9PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgPC9oNj5cbiAgICAgICAge2ZlYXR1cmUuZGVzY3JpcHRpb24gPT0gbnVsbCA/IG51bGwgOiA8cCBjbGFzc05hbWU9XCJ0ZXh0LWJhc2UgdGV4dC1ncmF5LTUwMCB0ZXh0LXNtXCI+e2ZlYXR1cmUuZGVzY3JpcHRpb259PC9wPn1cbiAgICAgIDwvUmFkaW9Hcm91cC5MYWJlbD5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtNCBncmlkIGdyaWQtY29scy0xIGdhcC15LTYgc206Z3JpZC1jb2xzLTMgc206Z2FwLXgtNFwiPlxuICAgICAgICB7W1xuICAgICAgICAgIHsgaWQ6ICdmYWxzZScsIHRpdGxlOiBgRGlzYWJsZSAke2ZlYXR1cmUubmFtZX1gLCBkZXNjcmlwdGlvbjogJ092ZXJyaWRlIHRoZSBmZWF0dXJlIHRvIGJlIGRpc2FibGVkJyB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlkOiAndW5zZXQnLFxuICAgICAgICAgICAgdGl0bGU6ICdEZWZhdWx0JyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnSW5oZXJpdCBlbmFibGVkIHN0YXRlIGZyb20gZGVmYXVsdHMnLFxuICAgICAgICAgICAgZGlzYWJsZWQ6IChmZWF0dXJlLm5vT3ZlcnJpZGUgPz8gZmFsc2UpIHx8IGZlYXR1cmUuZm9yY2UsXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6XG4gICAgICAgICAgICAgIHZhbHVlSW5EZWZhdWx0cyA9PT0gJ3RydWUnID8gKFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1ncmVlbi01MDAgYm9yZGVyLWdyZWVuLTUwMCBmbGV4IGZsZXgtbm93cmFwIHRleHQteHMgZmxleC1yb3cgZ2FwLTEgcm91bmRlZC1zbSBib3JkZXIgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHB4LTIgcHktMVwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+RW5hYmxlZDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtcmVkLTUwMCBib3JkZXItcmVkLTUwMCBmbGV4IGZsZXgtbm93cmFwIHRleHQteHMgZmxleC1yb3cgZ2FwLTEgcm91bmRlZC1zbSBib3JkZXIgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHB4LTIgcHktMVwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+RGlzYWJsZWQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IGlkOiAndHJ1ZScsIHRpdGxlOiBgRW5hYmxlICR7ZmVhdHVyZS5uYW1lfWAsIGRlc2NyaXB0aW9uOiAnT3ZlcnJpZGUgdGhlIGZlYXR1cmUgdG8gYmUgZW5hYmxlZCcgfSxcbiAgICAgICAgXS5tYXAoKG9wdGlvbikgPT4gKFxuICAgICAgICAgIDxSYWRpb0dyb3VwLk9wdGlvblxuICAgICAgICAgICAgY2xhc3NOYW1lPXsoeyBjaGVja2VkLCBhY3RpdmUsIGRpc2FibGVkIH0pID0+XG4gICAgICAgICAgICAgIGNsYXNzTmFtZXMoXG4gICAgICAgICAgICAgICAgY2hlY2tlZCA/ICdib3JkZXItdHJhbnNwYXJlbnQnIDogJ2JvcmRlci1ncmF5LTMwMCcsXG4gICAgICAgICAgICAgICAgIWRpc2FibGVkICYmIGFjdGl2ZSA/ICdib3JkZXItYmx1ZS01MDAgcmluZy0yIHJpbmctYmx1ZS01MDAnIDogJycsXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQgPyAnYm9yZGVyLXRyYW5zcGFyZW50IHJpbmctZ3JheS01MDAgY3Vyc29yLW5vdC1hbGxvd2VkJyA6ICdjdXJzb3ItcG9pbnRlcicsXG4gICAgICAgICAgICAgICAgJ3JlbGF0aXZlIGJnLXdoaXRlIGJvcmRlciByb3VuZGVkLWxnIHNoYWRvdy1zbSBwLTMgZmxleCBmb2N1czpvdXRsaW5lLW5vbmUnXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRpc2FibGVkPXtvcHRpb24uZGlzYWJsZWR9XG4gICAgICAgICAgICBrZXk9e29wdGlvbi5pZH1cbiAgICAgICAgICAgIHZhbHVlPXtvcHRpb24uaWR9XG4gICAgICAgICAgPlxuICAgICAgICAgICAgeyh7IGNoZWNrZWQsIGFjdGl2ZSwgZGlzYWJsZWQgfSkgPT4gKFxuICAgICAgICAgICAgICA8PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBncm93XCI+XG4gICAgICAgICAgICAgICAgICA8UmFkaW9Hcm91cC5MYWJlbCBhcz1cInNwYW5cIiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtbm93cmFwIGZsZXgtcm93IGdhcC0xIGl0ZW1zLWNlbnRlciBzcGFjZS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1ncmF5LTkwMCBncm93IHNocmlua1wiPntvcHRpb24udGl0bGV9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB7b3B0aW9uLmRlZmF1bHRWYWx1ZSAhPSBudWxsID8gb3B0aW9uLmRlZmF1bHRWYWx1ZSA6IG51bGx9XG4gICAgICAgICAgICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lcyghY2hlY2tlZCA/ICdpbnZpc2libGUnIDogJycsICdoLTUgdy01IHRleHQtYmx1ZS01MDAgbWluLXctNCcpfVxuICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjAgMjBcIlxuICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBSdWxlPVwiZXZlbm9kZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTEwIDE4YTggOCAwIDEwMC0xNiA4IDggMCAwMDAgMTZ6bTMuNzA3LTkuMjkzYTEgMSAwIDAwLTEuNDE0LTEuNDE0TDkgMTAuNTg2IDcuNzA3IDkuMjkzYTEgMSAwIDAwLTEuNDE0IDEuNDE0bDIgMmExIDEgMCAwMDEuNDE0IDBsNC00elwiXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxsUnVsZT1cImV2ZW5vZGRcIlxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgPC9SYWRpb0dyb3VwLkxhYmVsPlxuICAgICAgICAgICAgICAgICAgPFJhZGlvR3JvdXAuRGVzY3JpcHRpb24gYXM9XCJzcGFuXCIgY2xhc3NOYW1lPVwibXQtMSBmbGV4IGl0ZW1zLWNlbnRlciB0ZXh0LXNtIHRleHQtZ3JheS01MDBcIj5cbiAgICAgICAgICAgICAgICAgICAge29wdGlvbi5kZXNjcmlwdGlvbn1cbiAgICAgICAgICAgICAgICAgIDwvUmFkaW9Hcm91cC5EZXNjcmlwdGlvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWVzKFxuICAgICAgICAgICAgICAgICAgICAhZGlzYWJsZWQgJiYgYWN0aXZlID8gJ2JvcmRlcicgOiAnYm9yZGVyLTInLFxuICAgICAgICAgICAgICAgICAgICBjaGVja2VkID8gKGRpc2FibGVkID8gJ2JvcmRlci1ncmF5LTUwMCcgOiAnYm9yZGVyLWJsdWUtNTAwJykgOiAnYm9yZGVyLXRyYW5zcGFyZW50JyxcbiAgICAgICAgICAgICAgICAgICAgJ2Fic29sdXRlIC1pbnNldC1weCByb3VuZGVkLWxnIHBvaW50ZXItZXZlbnRzLW5vbmUnXG4gICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L1JhZGlvR3JvdXAuT3B0aW9uPlxuICAgICAgICApKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvUmFkaW9Hcm91cD5cbiAgKTtcbn1cblxuZnVuY3Rpb24gU2hhZG93Q29udGVudCh7IHJvb3QsIGNoaWxkcmVuIH06IHsgY2hpbGRyZW46IFJlYWN0Tm9kZTsgcm9vdDogRWxlbWVudCB9KSB7XG4gIHJldHVybiBSZWFjdERPTS5jcmVhdGVQb3J0YWwoY2hpbGRyZW4sIHJvb3QpO1xufVxuXG4vLy8gUGVybWl0IHVzZXJzIHRvIG92ZXJyaWRlIGZlYXR1cmUgZmxhZ3MgdmlhIGEgR1VJLlxuLy8vIFJlbmRlcnMgYSBzbWFsbCBmbG9hdGluZyBidXR0b24gaW4gbG93ZXIgbGVmdCBvciByaWdodCwgcHJlc3NpbmcgaXQgYnJpbmdzIHVwXG4vLy8gYSBsaXN0IG9mIGZlYXR1cmVzIHRvIHRvZ2dsZSBhbmQgdGhlaXIgY3VycmVudCBvdmVycmlkZSBzdGF0ZS4geW91IGNhbiBvdmVycmlkZSBvbiBvciBvdmVycmlkZSBvZmYsXG4vLy8gb3IgdW5zZXQgdGhlIG92ZXJyaWRlIGFuZCBnbyBiYWNrIHRvIGRlZmF1bHQgdmFsdWUuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbmV4cG9ydCBmdW5jdGlvbiBUb2dnbGVGZWF0dXJlcyh7IGRlZmF1bHRPcGVuID0gZmFsc2UsIGhpZGRlbiA9IGZhbHNlIH06IHsgZGVmYXVsdE9wZW4/OiBib29sZWFuOyBoaWRkZW4/OiBib29sZWFuIH0pOiBKU1guRWxlbWVudCB8IG51bGwge1xuICBjb25zdCBbcm9vdCwgc2V0Q29yZVJvb3RdID0gdXNlU3RhdGU8SFRNTERpdkVsZW1lbnQgfCBudWxsPihudWxsKTtcblxuICBjb25zdCBzZXRSb290ID0gKGhvc3Q6IEhUTUxEaXZFbGVtZW50IHwgbnVsbCkgPT4ge1xuICAgIGlmIChob3N0ID09IG51bGwgfHwgcm9vdCAhPSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNoYWRvd1Jvb3QgPSBob3N0Py5hdHRhY2hTaGFkb3coeyBtb2RlOiAnb3BlbicgfSk7XG4gICAgY29uc3Qgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgIGNvbnN0IHJlbmRlckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHN0eWxlLnRleHRDb250ZW50ID0gc3R5bGVzO1xuICAgIHNoYWRvd1Jvb3QuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuICAgIHNoYWRvd1Jvb3QuYXBwZW5kQ2hpbGQocmVuZGVyRGl2KTtcbiAgICBzZXRDb3JlUm9vdChyZW5kZXJEaXYpO1xuICB9O1xuXG4gIGlmIChoaWRkZW4pIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPGRpdiByZWY9e3NldFJvb3R9IHN0eWxlPXt7IHpJbmRleDogOTk5OTksIHBvc2l0aW9uOiAnZml4ZWQnLCB3aWR0aDogJzAnLCBoZWlnaHQ6ICcwJywgYm90dG9tOiAwIH19PlxuICAgICAge3Jvb3QgIT0gbnVsbCA/IChcbiAgICAgICAgPFNoYWRvd0NvbnRlbnQgcm9vdD17cm9vdH0+XG4gICAgICAgICAgPFRvZ2dsZUZlYXR1cmVVbndyYXBwZWQgZGVmYXVsdE9wZW49e2RlZmF1bHRPcGVufSAvPlxuICAgICAgICA8L1NoYWRvd0NvbnRlbnQ+XG4gICAgICApIDogbnVsbH1cbiAgICA8L2Rpdj5cbiAgKTtcbn1cblxuLy8vIExpa2UgVG9nZ2xlRmVhdHVyZXMsIGJ1dCBkb2VzIG5vdCBpbmplY3Qgc3R5bGVzIGludG8gYSBzaGFkb3cgRE9NIHJvb3Qgbm9kZS5cbi8vLyB1c2VmdWwgaWYgeW91J3JlIHVzaW5nIHRhaWx3aW5kLlxuZXhwb3J0IGZ1bmN0aW9uIFRvZ2dsZUZlYXR1cmVVbndyYXBwZWQoeyBkZWZhdWx0T3BlbiA9IGZhbHNlLCBoaWRkZW4gPSBmYWxzZSB9OiB7IGRlZmF1bHRPcGVuPzogYm9vbGVhbjsgaGlkZGVuPzogYm9vbGVhbiB9KTogSlNYLkVsZW1lbnQgfCBudWxsIHtcbiAgY29uc3QgW29wZW4sIHNldE9wZW5dID0gdXNlU3RhdGUoZGVmYXVsdE9wZW4pO1xuICBjb25zdCBjb250ZXh0ID0gdXNlQ29udGV4dChGZWF0dXJlQ29udGV4dCk7XG5cbiAgaWYgKGNvbnRleHQgPT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKGhpZGRlbikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gV2Ugd2FudDogUmVhbCB2YWx1ZSBhZnRlciBhbGwgbmVzdGluZ3MsIHZhbHVlIG9mIHRoZSBvdmVycmlkZS4gd2UgdG9nZ2xlIG92ZXJyaWRlXG4gIGNvbnN0IHsgZmVhdHVyZXNEZXNjcmlwdGlvbiB9ID0gY29udGV4dDtcblxuICBpZiAoZmVhdHVyZXNEZXNjcmlwdGlvbi5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJyZWxhdGl2ZVwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJhYnNvbHV0ZSBib3R0b20tMCBsZWZ0LTAgbXgtNCBteS00XCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBjbGFzc05hbWU9XCJpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIgdGV4dC1zbSBmb250LW1lZGl1bSBwLTEgaC04IHctOCBhbGlnbi1taWRkbGUgY3Vyc29yLXBvaW50ZXIgcm91bmRlZC1mdWxsIGJnLWJsdWUtNjAwIHRleHQtd2hpdGUgIGJvcmRlciBib3JkZXItdHJhbnNwYXJlbnQganVzdGlmeS1jZW50ZXIgdGV4dC1iYXNlIGZvbnQtbWVkaXVtIGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpyaW5nLTIgZm9jdXM6cmluZy1vZmZzZXQtMiBmb2N1czpyaW5nLWJsdWUtNjAwIHNtOnRleHQtc21cIlxuICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldE9wZW4odHJ1ZSl9XG4gICAgICAgICAgdGl0bGU9XCJUb2dnbGUgZmVhdHVyZXNcIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICA+XG4gICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgY2xhc3NOYW1lPVwidy02IGgtNiBtaW4taC02IG1pbi13LTZcIlxuICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDIwIDIwXCJcbiAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgIGNsaXBSdWxlPVwiZXZlbm9kZFwiXG4gICAgICAgICAgICAgIGQ9XCJNMyA2YTMgMyAwIDAxMy0zaDEwYTEgMSAwIDAxLjggMS42TDE0LjI1IDhsMi41NSAzLjRBMSAxIDAgMDExNiAxM0g2YTEgMSAwIDAwLTEgMXYzYTEgMSAwIDExLTIgMFY2elwiXG4gICAgICAgICAgICAgIGZpbGxSdWxlPVwiZXZlbm9kZFwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgeyFvcGVuID8gbnVsbCA6IChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmaXhlZCB6LTEwIGluc2V0LTAgb3ZlcmZsb3cteS1hdXRvXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWVuZCBqdXN0aWZ5LWZsZXgtc3RhcnQgbXgtOCBteS00IG1pbi1oLXNjcmVlbiBwdC00IHB4LTQgcGItMTAgc206YmxvY2sgc206cC0wXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlIGlubGluZS1ibG9jayBhbGlnbi1ib3R0b20gYmctd2hpdGUgcm91bmRlZC1sZyBweC00IHB0LTUgcGItNCB0ZXh0LWxlZnQgb3ZlcmZsb3ctaGlkZGVuIHNoYWRvdy14bCB0cmFuc2Zvcm0gdHJhbnNpdGlvbi1hbGwgc206bXktOCBzbTphbGlnbi1taWRkbGUgc206cC02IGxnOm1heC13LVs4MCVdIG1heC13LWZ1bGxcIj5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LTEgc206bXQtM1wiPlxuICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzTmFtZT1cImZsZXggZmxleC1yb3cgZ2FwLTQgZmxleC1ub3dyYXAgaXRlbXMtY2VudGVyIHNwYWNlLWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJncm93IHRleHQtbGcgbGVhZGluZy02IGZvbnQtbWVkaXVtIHRleHQtZ3JheS05MDBcIj5GZWF0dXJlIEZsYWcgT3ZlcnJpZGVzPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2gzPlxuICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LWdyYXktNTAwXCI+XG4gICAgICAgICAgICAgICAgICAgIEZlYXR1cmVzIGNhbiBiZSBlbmFibGVkIG9yIGRpc2FibGVkIHVubGVzcyB0aGV5IGFyZSBmb3JjZWQgdXBzdHJlYW0uIFlvdSBjYW4gYWxzbyByZXZlcnQgdG8gZGVmYXVsdC5cbiAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtNlwiPlxuICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBnYXAtOVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxsZWdlbmQgY2xhc3NOYW1lPVwic3Itb25seVwiPkZlYXR1cmUgRmxhZ3M8L2xlZ2VuZD5cbiAgICAgICAgICAgICAgICAgICAgICB7ZmVhdHVyZXNEZXNjcmlwdGlvbi5tYXAoKGZlYXR1cmUpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxUb2dnbGVGZWF0dXJlIGZlYXR1cmU9e2ZlYXR1cmV9IGtleT17ZmVhdHVyZS5uYW1lfSAvPlxuICAgICAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIG10LTUgc206bXQtNlwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIHRleHQtc20gZm9udC1tZWRpdW0gcHQtMCBwYi0wIHByLTQgcGwtNCBoLTggbGVhZGluZy03IGFsaWduLW1pZGRsZSBjdXJzb3ItcG9pbnRlciByb3VuZGVkLXNtIGJnLWJsdWUtNjAwIHRleHQtd2hpdGUgYm9yZGVyIGJvcmRlci10cmFuc3BhcmVudCBqdXN0aWZ5LWNlbnRlciB0ZXh0LWJhc2UgZm9udC1tZWRpdW0gZm9jdXM6b3V0bGluZS1ub25lIGZvY3VzOnJpbmctMiBmb2N1czpyaW5nLW9mZnNldC0yIGZvY3VzOnJpbmctYmx1ZS02MDAgc206dGV4dC1zbVwiXG4gICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0T3BlbihmYWxzZSl9XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICBEb25lXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICJxaENBQUEsa09DQUEsTUFBdUYsa0JDQXZGLE1BQW1GLGtCQVk1RSxXQUF1QixFQUFxRCxDQVpuRixRQWFFLE1BQU8sQ0FDTCxFQUFhLFFBQVEsU0FBUyxFQUFJLEdBQU8sRUFBYSxRQUFRLFVBQVUsRUFBSSxHQUFRLE9BQ3BGLFFBQWEsUUFBUSxjQUFyQixjQUFrQyxRQUFsQyxPQUEyQyxFQUM3QyxDQUNGLENBNEVPLEdBQU0sR0FBaUIsb0JBQStELENBQzNGLEdBQUksVUFDSixRQUFTLFVBQ1QsUUFBUyxDQUFDLEVBQ1YsMkJBQTRCLEdBQzVCLEdBQUksQ0FDRixPQUFRLENBQ04sQ0FBRSxPQUFRLGVBQWdCLEtBQU0sQUFBQyxHQUFL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 diff --git a/dist/cjs/src/index.js.map b/dist/cjs/src/index.js.map index fcf9017..c76e7bf 100644 --- a/dist/cjs/src/index.js.map +++ b/dist/cjs/src/index.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../../../src/index.tsx", "../../../src/FeaturesState.tsx", "../../../src/FeatureState.tsx", "../../../src/Features.tsx", "../../../src/EnableContext.tsx", "../../../src/FeatureContext.tsx", "../../../src/useConsoleOverride.tsx", "../../../src/GlobalEnable.tsx", "../../../src/usePersist.tsx", "../../../src/useTestCallback.tsx", "../../../src/testFeature.tsx", "../../../src/Enable.tsx", "../../../src/utils.ts", "../../../src/useAllEnabled.tsx", "../../../src/useEnabled.tsx", "../../../src/Disable.tsx", "../../../src/useAllDisabled.tsx", "../../../src/useDisabled.tsx", "../../../src/ToggleFeatures.tsx"], - "sourcesContent": ["export { FeaturesMachine } from './FeaturesState';\nexport { Features } from './Features';\nexport { Enable } from './Enable';\nexport { Disable } from './Disable';\nexport { useDisabled } from './useDisabled';\nexport { useEnabled } from './useEnabled';\nexport { useAllDisabled } from './useAllDisabled';\nexport { useAllEnabled } from './useAllEnabled';\nexport type { EnableContextType } from './EnableContext';\nexport type { FeatureContextType } from './FeatureContext';\nexport type { FeatureValue, FeatureState, FeatureDispatch } from './FeatureState';\nexport { EnableContext } from './EnableContext';\nexport { ToggleFeatures } from './ToggleFeatures';\n", "import { ActorRefFrom, InterpreterFrom, StateFrom, assign, createMachine, spawn } from 'xstate';\n\nimport { FeatureMachine, FeatureDescription, FeatureValue, valueForState } from './FeatureState';\n\nexport interface FeaturesContext {\n // features are layered:\n // - defaults: if nothing else matches, provided a value for feature\n // - browser: browser-local values for features (kept in local storage, etc)\n // - user: values from the user's profile, if any\n // - org: value from the org's profile, if any\n features: { [x: string]: ActorRefFrom };\n}\n\nexport type FeaturesAction =\n | { type: 'DE_INIT' }\n | { type: 'DISABLE'; name: string }\n | { type: 'ENABLE'; name: string }\n | { type: 'INIT'; features: readonly FeatureDescription[] }\n | { type: 'SET_ALL'; features: { [key: string]: FeatureValue } }\n | { type: 'SET'; name: string; value: FeatureValue }\n | { type: 'TOGGLE'; name: string }\n | { type: 'UNSET'; name: string };\n\nexport interface FeaturesTypeState {\n value: 'ready';\n context: FeaturesContext;\n}\n\nexport type FeaturesState = StateFrom;\nexport type FeaturesDispatch = InterpreterFrom['send'];\n\nexport function valueOfFeature(featuresState: FeaturesState, feature: string): [FeatureValue, boolean] {\n if (featuresState.context.features[feature] == null) {\n return [undefined, false];\n }\n const featureState = featuresState.context.features[feature].getSnapshot();\n if (featureState != null) {\n return valueForState(featureState);\n }\n return [undefined, false];\n}\n\n/// state machine that manages a set of features with user, org, and local overrides\nexport const FeaturesMachine = createMachine({\n id: 'features',\n initial: 'idle',\n predictableActionArguments: true,\n context: {\n features: {},\n },\n states: {\n idle: {\n on: {\n INIT: {\n target: 'ready',\n cond: (_, e) => e.features.length > 0,\n actions: assign({\n features: (context, event) => {\n const features: typeof context.features = {};\n\n for (const feature of event.features) {\n features[feature.name] = spawn(FeatureMachine, {\n name: feature.name,\n sync: true,\n });\n features[feature.name].send({ type: 'INIT', feature });\n }\n return features;\n },\n }),\n },\n },\n },\n\n // the features are loaded and ready to be used\n ready: {\n on: {\n DE_INIT: { target: 'idle', actions: assign({ features: (_, __) => ({}) }) },\n SET_ALL: {\n actions: assign({\n features: (ctx, e) => {\n const features = { ...ctx.features };\n // All configured features are set to on/off or undefined\n Object.keys(features).forEach((name) => {\n features[name].send({ type: 'SET', value: e.features[name] ?? undefined });\n });\n return features;\n },\n }),\n },\n\n // Set a feature to a value\n SET: {\n actions: (ctx, e) => {\n const feature = ctx.features[e.name];\n if (feature != null) {\n feature.send({ type: 'SET', value: e.value });\n }\n },\n },\n\n // toggle a feature\n TOGGLE: {\n actions: (ctx, e) => {\n const feature = ctx.features[e.name];\n if (feature != null) {\n feature.send({ type: 'TOGGLE' });\n }\n },\n },\n\n // when a feature is enabled, send the enable message to the actor\n ENABLE: {\n actions: (ctx, e) => {\n const feature = ctx.features[e.name];\n if (feature != null) {\n feature.send({ type: 'ENABLE' });\n }\n },\n },\n\n // when a feature is disabled, send the disable message to the actor\n DISABLE: {\n actions: (ctx, e) => {\n const feature = ctx.features[e.name];\n if (feature != null) {\n feature.send({ type: 'DISABLE' });\n }\n },\n },\n\n // when a feature is unset, send the unset message to the actor\n UNSET: {\n actions: (ctx, e) => {\n const feature = ctx.features[e.name];\n if (feature != null) {\n feature.send({ type: 'UNSET' });\n }\n },\n },\n },\n },\n },\n});\n", "import { assign, createMachine, DoneInvokeEvent, InterpreterFrom, StateFrom } from 'xstate';\n\n/**\n * Feature is either on, off, or 'unset',\n * which means it will go to the default value or the less specific value.\n */\nexport type FeatureValue = false | true | undefined;\n\nexport type FeatureState = StateFrom;\nexport type FeatureDispatch = InterpreterFrom['send'];\n\n/// Given a featurestate, determine the value (on, off, or unset)\nexport function valueForState(featureState: FeatureState): [FeatureValue, boolean] {\n return [\n featureState.matches('enabled') ? true : featureState.matches('disabled') ? false : undefined,\n featureState.context.featureDesc?.force ?? false,\n ];\n}\n\n/**\n * Definition of a feature that can be enabled or disabled.\n * K is the type of the key that is used to identify the feature.\n */\nexport interface FeatureDescription {\n readonly name: K;\n readonly description?: string;\n\n /// If set, will be used to update the feature default state instead of simply overriding.\n /// For example, you might use this to update a feature flag on a backend server.\n /// when set, the feature will be updated on the backend server, and the result of the async\n /// will be used for the final state after the change. while changing, the feature will be\n /// in the 'changing' state. Also note that the feature will be changed at the \"default\" layer.\n readonly onChangeDefault?: (name: K, newValue: FeatureValue) => Promise;\n\n /// if set true, will force the field to what it is set here through layers of states.\n /// useful to invert the layers, similar to !important in CSS.\n readonly force?: boolean;\n\n /// If set to true, the feature will not be overridable by the user.\n readonly noOverride?: boolean;\n\n /// can be used to specify what should happen if the feature is not set to a particular value.\n readonly defaultValue?: FeatureValue;\n}\n\ninterface FeatureContext {\n featureDesc?: FeatureDescription;\n}\n\ntype FeatureTypeState =\n | {\n value: 'asyncDenabled';\n context: FeatureContext;\n }\n | {\n value: 'asyncDisabled';\n context: FeatureContext;\n }\n | {\n value: 'asyncUnspecied';\n context: FeatureContext;\n }\n | {\n value: 'disabled';\n context: FeatureContext;\n }\n | {\n value: 'enabled';\n context: FeatureContext;\n }\n | {\n value: 'initial';\n context: never;\n }\n | {\n value: 'unspecied';\n context: FeatureContext;\n };\n\n/**\n * Actions that can be performed on a feature.\n */\nexport type FeatureAction =\n | { type: 'DISABLE' }\n | { type: 'ENABLE' }\n | { type: 'INIT'; feature: FeatureDescription }\n | { type: 'SET'; value: FeatureValue }\n | { type: 'TOGGLE' }\n | { type: 'UNSET' };\n\n/**\n * Fully describe the states a feature can be in\n */\nexport const FeatureMachine = createMachine({\n id: 'feature',\n initial: 'initial',\n context: {},\n predictableActionArguments: true,\n on: {\n ENABLE: [\n { target: 'asyncEnabled', cond: (ctx) => ctx.featureDesc?.onChangeDefault != null },\n { target: 'enabled' },\n ],\n\n TOGGLE: [\n { target: 'asyncEnabled', cond: (ctx) => ctx.featureDesc?.onChangeDefault != null },\n { target: 'enabled' },\n ],\n\n DISABLE: [\n { target: 'asyncDisabled', cond: (ctx) => ctx.featureDesc?.onChangeDefault != null },\n { target: 'disabled' },\n ],\n\n UNSET: [\n { target: 'asyncUnspecied', cond: (ctx) => ctx.featureDesc?.onChangeDefault != null },\n { target: 'unspecified' },\n ],\n\n SET: [\n {\n target: 'asyncEnabled',\n cond: (ctx, e) => e.value === true && ctx.featureDesc?.onChangeDefault != null,\n },\n {\n target: 'asyncDisabled',\n cond: (ctx, e) => e.value === false && ctx.featureDesc?.onChangeDefault != null,\n },\n {\n target: 'asyncUnspecied',\n cond: (ctx, _e) => ctx.featureDesc?.onChangeDefault != null,\n },\n {\n target: 'enabled',\n cond: (_ctx, e) => e.value === true,\n },\n {\n target: 'disabled',\n cond: (_ctx, e) => e.value === false,\n },\n { target: 'unspecified' },\n ],\n },\n\n states: {\n initial: {\n on: {\n INIT: [\n {\n actions: assign({ featureDesc: (_, e) => e.feature }),\n target: 'enabled',\n cond: (_, e) => e.feature.defaultValue === true,\n },\n {\n actions: assign({ featureDesc: (_, e) => e.feature }),\n target: 'unspecified',\n cond: (_, e) => e.feature.defaultValue === undefined,\n },\n {\n actions: assign({ featureDesc: (_, e) => e.feature }),\n target: 'disabled',\n cond: (_, e) => e.feature.defaultValue === false,\n },\n ],\n },\n },\n\n unspecified: {},\n disabled: {},\n enabled: {},\n\n asyncDisabled: {\n invoke: {\n id: 'set-off-upstream',\n src: async (ctx) => {\n const onchange = ctx.featureDesc?.onChangeDefault;\n if (onchange != null && ctx.featureDesc != null) {\n return onchange(ctx.featureDesc.name, false);\n }\n return undefined;\n },\n onDone: [\n {\n target: 'enabled',\n cond: (_ctx, e: DoneInvokeEvent) => e.data === true,\n },\n {\n target: 'disabled',\n cond: (_ctx, e: DoneInvokeEvent) => e.data === false,\n },\n { target: 'unspecified' },\n ],\n onError: 'unspecified',\n },\n },\n\n asyncUnspecied: {\n invoke: {\n id: 'set-unset-upstream',\n src: async (ctx) => {\n const onchange = ctx.featureDesc?.onChangeDefault;\n if (onchange != null && ctx.featureDesc != null) {\n return onchange(ctx.featureDesc.name, undefined);\n }\n return undefined;\n },\n onDone: [\n {\n target: 'enabled',\n cond: (_ctx, e: DoneInvokeEvent) => e.data === true,\n },\n {\n target: 'disabled',\n cond: (_ctx, e: DoneInvokeEvent) => e.data === false,\n },\n { target: 'unspecified' },\n ],\n onError: 'unspecified',\n },\n },\n\n asyncEnabled: {\n invoke: {\n id: 'set-on-upstream',\n src: async (ctx) => {\n const onchange = ctx.featureDesc?.onChangeDefault;\n if (onchange != null && ctx.featureDesc != null) {\n return onchange(ctx.featureDesc.name, true);\n }\n return undefined;\n },\n onDone: [\n {\n target: 'enabled',\n cond: (_ctx, e: DoneInvokeEvent) => e.data === true,\n },\n {\n target: 'disabled',\n cond: (_ctx, e: DoneInvokeEvent) => e.data === false,\n },\n { target: 'unspecified' },\n ],\n onError: 'unspecified',\n },\n },\n },\n});\n", "import React, { useMemo, ReactNode, useEffect, useRef } from 'react';\n\nimport { useMachine } from '@xstate/react';\n\nimport { EnableContext } from './EnableContext';\nimport { FeatureContext } from './FeatureContext';\nimport { FeaturesMachine } from './FeaturesState';\nimport { FeatureDescription } from './FeatureState';\nimport useConsoleOverride from './useConsoleOverride';\nimport usePersist, { KEY } from './usePersist';\nimport useTestCallback from './useTestCallback';\n\ninterface FeatureProps {\n readonly features: readonly FeatureDescription[];\n readonly children?: ReactNode;\n readonly disableConsole?: boolean;\n readonly storage?: Storage;\n}\n\n/**\n * A more batteries-enabled parent component that keeps track of feature state\n * internally, and creates window.feature.enable(\"f\") and window.feature.disable(\"f\").\n * Keeps track of overrides and defaults, with defaults potentially coming from your props\n * and overrides being persisted to your choice of storage layer.\n */\nexport function Features({\n children,\n features,\n disableConsole = false,\n storage = window.sessionStorage,\n}: FeatureProps): JSX.Element {\n // Capture only first value; we don't care about future updates\n const featuresRef = useRef(features);\n const [overridesState, overridesSend] = useMachine(FeaturesMachine);\n const [defaultsState, defaultsSend] = useMachine(FeaturesMachine);\n\n useEffect(() => {\n /// Load defaults\n defaultsSend({ type: 'INIT', features });\n return () => {\n defaultsSend({ type: 'DE_INIT' });\n };\n }, [defaultsSend, features]);\n\n useEffect(() => {\n let f: Record = {};\n if (storage != null) {\n try {\n const featuresJson = storage.getItem(KEY);\n if (featuresJson != null) {\n const fh = JSON.parse(featuresJson);\n f = fh.overrides;\n }\n } catch (e) {\n // Can't parse or get or otherwise; ignore\n console.error('error in localStorage', e);\n }\n }\n\n overridesSend({\n type: 'INIT',\n features: featuresRef.current\n .filter((x) => x.noOverride !== true)\n .map((x) => ({ name: x.name, description: x.description, defaultValue: f?.[x.name] ?? undefined })),\n });\n\n return () => {\n overridesSend({ type: 'DE_INIT' });\n };\n }, [featuresRef, overridesSend, storage]);\n\n usePersist(storage, featuresRef.current, overridesState);\n\n const testCallback = useTestCallback(overridesState, defaultsState);\n useConsoleOverride(!disableConsole, featuresRef.current, testCallback, defaultsSend);\n\n const featureValue = useMemo(\n () => ({\n overridesSend,\n defaultsSend,\n featuresDescription: featuresRef.current,\n overridesState,\n defaultsState,\n test: testCallback,\n }),\n [overridesSend, defaultsSend, overridesState, defaultsState, testCallback]\n );\n\n return (\n \n {children}\n \n );\n}\n", "import { createContext } from 'react';\n\nimport { FeatureValue } from './FeatureState';\n\nexport type EnableContextType = (feature: string) => FeatureValue;\n\n/**\n * Contained function can check whether a given feature is enabled.\n */\nexport const EnableContext = createContext((_s) => false);\n", "import { createContext } from 'react';\n\nimport { FeaturesDispatch, FeaturesState } from './FeaturesState';\nimport { FeatureDescription, FeatureValue } from './FeatureState';\n\nexport const FeatureContext = createContext(null);\n\n/// Give access to the overrides layer\nexport interface FeatureContextType {\n // Make changes to the overrides\n overridesSend: FeaturesDispatch;\n\n // Make changes to defaults\n defaultsSend: FeaturesDispatch;\n\n featuresDescription: readonly FeatureDescription[];\n\n // State is in layers; overrides and defaults\n overridesState: FeaturesState;\n defaultsState: FeaturesState;\n\n /// Test with proper fallback and respecting the user's force preference\n test: (flag: string) => FeatureValue;\n}\n", "import { useEffect } from 'react';\n\nimport { FeaturesDispatch } from './FeaturesState';\nimport { FeatureDescription, FeatureValue } from './FeatureState';\nimport { GlobalEnable } from './GlobalEnable';\n\nexport default function useConsoleOverride(\n consoleOverride: boolean,\n features: readonly FeatureDescription[],\n testFeature: (_: string) => FeatureValue,\n dispatch: FeaturesDispatch\n): void {\n useEffect(() => {\n if (!consoleOverride) {\n return () => {\n /* empty */\n };\n }\n window.feature = new GlobalEnable(dispatch, testFeature, features);\n return () => {\n if (window.feature != null) {\n delete window.feature;\n }\n };\n }, [features, dispatch, consoleOverride, testFeature]);\n}\n", "import { FeaturesDispatch } from './FeaturesState';\nimport { FeatureDescription, FeatureValue } from './FeatureState';\n\nexport class GlobalEnable {\n private readonly featureDesc: readonly FeatureDescription[];\n private readonly dispatch: FeaturesDispatch;\n private readonly testFeature: (value: string) => FeatureValue;\n\n constructor(\n dispatch: FeaturesDispatch,\n testFeature: (_: string) => FeatureValue,\n featureDesc: readonly FeatureDescription[]\n ) {\n this.featureDesc = featureDesc;\n this.dispatch = dispatch;\n this.testFeature = testFeature;\n }\n\n public toggle(feature: string): void {\n this.dispatch({ type: 'TOGGLE', name: feature });\n }\n\n public enable(feature: string): void {\n this.dispatch({ type: 'ENABLE', name: feature });\n }\n\n public unset(feature: string): void {\n this.dispatch({ type: 'UNSET', name: feature });\n }\n\n public disable(feature: string): void {\n this.dispatch({ type: 'DISABLE', name: feature });\n }\n\n public setAll(features: { [key: string]: FeatureValue }): void {\n this.dispatch({ type: 'SET_ALL', features });\n }\n\n public listFeatures(): readonly [string, FeatureValue][] {\n return this.featureDesc.map((f) => [f.name, this.testFeature(f.name)]);\n }\n}\ndeclare global {\n interface Window {\n feature?: GlobalEnable;\n }\n}\n", "import { useMemo, useEffect } from 'react';\n\nimport { FeaturesState, valueOfFeature } from './FeaturesState';\nimport { FeatureDescription, FeatureValue } from './FeatureState';\n\nexport const KEY = 'react-enable:feature-values';\n\nexport default function usePersist(\n storage: Storage | undefined,\n features: readonly FeatureDescription[],\n overrideState: FeaturesState\n): void {\n const overrides = useMemo(() => {\n const newOverrides: { [key: string]: FeatureValue } = {};\n if (overrideState.matches('ready')) {\n for (const feature of features) {\n const [value] = valueOfFeature(overrideState, feature.name);\n if (value != null) {\n newOverrides[feature.name] = value;\n }\n }\n }\n return newOverrides;\n }, [features, overrideState]);\n\n const strState = Object.keys(overrides).length === 0 || storage == null ? '{}' : JSON.stringify({ overrides });\n\n useEffect(() => {\n try {\n if (storage != null && overrideState.matches('ready')) {\n storage.setItem(KEY, strState);\n }\n } catch (e) {\n // Can't set for some reason\n }\n }, [overrideState, storage, strState]);\n}\n", "import { useCallback } from 'react';\n\nimport { FeaturesState } from './FeaturesState';\nimport testFeature from './testFeature';\n\n/// A callback that can be called to test if a feature is enabled or disabled\nexport default function useTestCallback(\n defaultsState: FeaturesState,\n overridesState: FeaturesState\n): (feature: string) => boolean | undefined {\n return useCallback((f: string) => testFeature(f, [defaultsState, overridesState]), [defaultsState, overridesState]);\n}\n", "import { FeaturesState, valueOfFeature } from './FeaturesState';\nimport { FeatureValue } from './FeatureState';\n\n/** Determine if the feature is enabled in one of the state machines, in order\n *\n * @param state The current state of the machine\n * @param feature The feature to check\n */\n\nexport default function testFeature(feature: string, states: FeaturesState[]): FeatureValue {\n const values = states.map((state) => valueOfFeature(state, feature));\n\n // look for best forced option, in order\n for (const [featureValue, featureForced] of values) {\n if (featureValue != null && featureForced) {\n return featureValue;\n }\n }\n\n // look for best non-forced option, in order\n for (const [featureValue] of values) {\n if (featureValue != null) {\n return featureValue;\n }\n }\n\n // unset if nothing hit\n return undefined;\n}\n", "import * as React from 'react';\n\nimport { useAllEnabled } from './useAllEnabled';\nimport { useEnabled } from './useEnabled';\n\nexport interface EnableProps {\n readonly feature?: string[] | string;\n readonly allFeatures?: string[];\n children: React.ReactNode;\n}\n\n/**\n * Feature will be enabled if any feature in the list are enabled,\n */\nexport function Enable({ feature = [], allFeatures = [], children }: EnableProps): JSX.Element | null {\n const isAny = useEnabled(feature);\n const isAll = useAllEnabled(allFeatures);\n\n if (isAny || isAll) {\n return <>{children};\n }\n\n return null;\n}\n", "import { useContext, useMemo } from 'react';\n\nimport { EnableContextType, EnableContext } from './EnableContext';\n\n// Helper: get rid of some boilerplate.\n// just input mashing and sanitation, removing extra renders, and getting test function\nexport function useTestAndConvert(input?: string[] | string | null): [EnableContextType, string[]] {\n const test = useContext(EnableContext);\n\n // We memoize just to prevent re-renders since this could be at the leaf of a tree\n const converted = useMemo(() => (input == null ? [] : Array.isArray(input) ? input : [input]), [input]);\n\n return [test, converted];\n}\n", "import { useTestAndConvert } from './utils';\n\n/**\n * returns true iff all specified features are enabled\n */\nexport function useAllEnabled(allFeatures: string[] | string): boolean {\n const [test, queryAllPresent] = useTestAndConvert(allFeatures);\n return queryAllPresent.length > 0 && queryAllPresent.every(test);\n}\n", "import { useTestAndConvert } from './utils';\n\n/**\n * returns true iff any specified feature is enabled\n */\nexport function useEnabled(feature: string[] | string): boolean {\n const [test, queryAnyPresent] = useTestAndConvert(feature);\n return queryAnyPresent.some(test);\n}\n", "import * as React from \"react\";\n\nimport { EnableProps } from \"./Enable\";\nimport { useAllDisabled } from \"./useAllDisabled\";\nimport { useDisabled } from \"./useDisabled\";\n\n/**\n * Feature will be disabled if any in the list are enabled\n */\nexport const Disable: React.FC = ({\n feature = [],\n allFeatures = [],\n children\n}) => {\n const isAny = useDisabled(feature);\n const isAll = useAllDisabled(allFeatures);\n\n if (isAny || isAll) {\n return <>{children};\n }\n\n return null;\n};\n", "import { useTestAndConvert } from './utils';\n\n/**\n * returns true iff all specified features are disabled\n */\nexport function useAllDisabled(withoutAll: string[] | string): boolean {\n const [test, queryAllWithout] = useTestAndConvert(withoutAll);\n return withoutAll.length > 0 && queryAllWithout.every((x) => !(test(x) ?? false));\n}\n", "import { useTestAndConvert } from './utils';\n\n/**\n * returns true iff any specified feature is disabled\n */\nexport function useDisabled(without: string[] | string): boolean {\n const [test, queryAnyWithout] = useTestAndConvert(without);\n return queryAnyWithout.some((x) => !(test(x) ?? false));\n}\n", "import React, { useContext, useState, useCallback, ReactNode } from 'react';\nimport ReactDOM from 'react-dom';\n\nimport { RadioGroup } from '@headlessui/react';\n\nimport { FeatureContext } from './FeatureContext';\nimport { valueOfFeature } from './FeaturesState';\nimport { FeatureDescription } from './FeatureState';\n// @ts-expect-error bundler will take care of this\nimport styles from './tailwind.css';\n\nfunction classNames(...classes: string[]): string {\n return classes.filter(Boolean).join(' ');\n}\n\nfunction ToggleFeature({ feature }: { feature: FeatureDescription }): JSX.Element | null {\n const context = useContext(FeatureContext);\n const handleChangeSelection = useCallback(\n (value: 'false' | 'true' | 'unset') => {\n if (context?.overridesSend != null) {\n switch (value) {\n case 'true': {\n context.overridesSend({ type: 'ENABLE', name: feature.name });\n break;\n }\n case 'false': {\n context.overridesSend({ type: 'DISABLE', name: feature.name });\n break;\n }\n case 'unset': {\n context.overridesSend({ type: 'UNSET', name: feature.name });\n break;\n }\n }\n }\n },\n [feature.name, context]\n );\n\n if (context == null) {\n return null;\n }\n\n const { overridesState, test: testFeature, defaultsState } = context;\n\n const valueInDefaults = (valueOfFeature(defaultsState, feature.name)[0] ?? 'unset').toString() as\n | 'false'\n | 'true'\n | 'unset';\n\n const valueInOverrides = (valueOfFeature(overridesState, feature.name)[0] ?? 'unset').toString() as\n | 'false'\n | 'true'\n | 'unset';\n\n const actualChecked = testFeature(feature.name);\n\n return (\n \n \n
\n \n Feature: {feature.name}\n \n {feature.noOverride === true ? (\n
\n \n \n \n
No Overrides
\n
\n ) : null}\n {actualChecked === true ? (\n
\n \n \n \n
{actualChecked ? 'Enabled' : 'Disabled'}
\n
\n ) : null}\n
\n {feature.description == null ? null :

{feature.description}

}\n
\n
\n {[\n { id: 'false', title: `Disable ${feature.name}`, description: 'Override the feature to be disabled' },\n {\n id: 'unset',\n title: 'Default',\n description: 'Inherit enabled state from defaults',\n disabled: (feature.noOverride ?? false) || feature.force,\n defaultValue:\n valueInDefaults === 'true' ? (\n
\n Enabled\n
\n ) : (\n
\n Disabled\n
\n ),\n },\n { id: 'true', title: `Enable ${feature.name}`, description: 'Override the feature to be enabled' },\n ].map((option) => (\n \n classNames(\n checked ? 'border-transparent' : 'border-gray-300',\n !disabled && active ? 'border-blue-500 ring-2 ring-blue-500' : '',\n disabled ? 'border-transparent ring-gray-500 cursor-not-allowed' : 'cursor-pointer',\n 'relative bg-white border rounded-lg shadow-sm p-3 flex focus:outline-none'\n )\n }\n disabled={option.disabled}\n key={option.id}\n value={option.id}\n >\n {({ checked, active, disabled }) => (\n <>\n
\n \n {option.title}\n {option.defaultValue != null ? option.defaultValue : null}\n \n \n \n \n \n {option.description}\n \n
\n \n \n )}\n \n ))}\n
\n
\n );\n}\n\nfunction ShadowContent({ root, children }: { children: ReactNode; root: Element }) {\n return ReactDOM.createPortal(children, root);\n}\n\n/// Permit users to override feature flags via a GUI.\n/// Renders a small floating button in lower left or right, pressing it brings up\n/// a list of features to toggle and their current override state. you can override on or override off,\n/// or unset the override and go back to default value.\n// eslint-disable-next-line no-undef\nexport function ToggleFeatures({ defaultOpen = false }: { defaultOpen?: boolean }): JSX.Element | null {\n const [root, setCoreRoot] = useState(null);\n\n const setRoot = (host: HTMLDivElement | null) => {\n if (host == null || root != null) {\n return;\n }\n const shadowRoot = host?.attachShadow({ mode: 'open' });\n const style = document.createElement('style');\n const renderDiv = document.createElement('div');\n style.textContent = styles;\n shadowRoot.appendChild(style);\n shadowRoot.appendChild(renderDiv);\n setCoreRoot(renderDiv);\n };\n\n return (\n
\n {root != null ? (\n \n \n \n ) : null}\n
\n );\n}\n\n/// Like ToggleFeatures, but does not inject styles into a shadow DOM root node.\n/// useful if you're using tailwind.\nexport function ToggleFeatureUnwrapped({ defaultOpen = false }: { defaultOpen?: boolean }): JSX.Element | null {\n const [open, setOpen] = useState(defaultOpen);\n const context = useContext(FeatureContext);\n\n if (context == null) {\n return null;\n }\n\n // We want: Real value after all nestings, value of the override. we toggle override\n const { featuresDescription } = context;\n\n if (featuresDescription.length === 0) {\n return null;\n }\n\n return (\n
\n
\n setOpen(true)}\n title=\"Toggle features\"\n type=\"button\"\n >\n \n \n \n \n
\n {!open ? null : (\n
\n
\n
\n
\n
\n

\n
Feature Flag Overrides
\n

\n

\n Features can be enabled or disabled unless they are forced upstream. You can also revert to default.\n

\n
\n
\n Feature Flags\n {featuresDescription.map((feature) => (\n \n ))}\n
\n
\n
\n setOpen(false)}\n type=\"button\"\n >\n Done\n \n
\n
\n
\n
\n
\n
\n )}\n
\n );\n}\n"], - "mappings": "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", + "sourcesContent": ["export { FeaturesMachine } from './FeaturesState';\nexport { Features } from './Features';\nexport { Enable } from './Enable';\nexport { Disable } from './Disable';\nexport { useDisabled } from './useDisabled';\nexport { useEnabled } from './useEnabled';\nexport { useAllDisabled } from './useAllDisabled';\nexport { useAllEnabled } from './useAllEnabled';\nexport type { EnableContextType } from './EnableContext';\nexport type { FeatureContextType } from './FeatureContext';\nexport type { FeatureValue, FeatureState, FeatureDescription, FeatureDispatch } from './FeatureState';\nexport { EnableContext } from './EnableContext';\nexport { ToggleFeatures } from './ToggleFeatures';\n", "import { ActorRefFrom, InterpreterFrom, StateFrom, assign, createMachine, spawn } from 'xstate';\n\nimport { FeatureMachine, FeatureDescription, FeatureValue, valueForState } from './FeatureState';\n\nexport interface FeaturesContext {\n // features are layered:\n // - defaults: if nothing else matches, provided a value for feature\n // - browser: browser-local values for features (kept in local storage, etc)\n // - user: values from the user's profile, if any\n // - org: value from the org's profile, if any\n features: { [x: string]: ActorRefFrom };\n}\n\nexport type FeaturesAction =\n | { type: 'DE_INIT' }\n | { type: 'DISABLE'; name: string }\n | { type: 'ENABLE'; name: string }\n | { type: 'INIT'; features: readonly FeatureDescription[] }\n | { type: 'SET_ALL'; features: { [key: string]: FeatureValue } }\n | { type: 'SET'; name: string; value: FeatureValue }\n | { type: 'TOGGLE'; name: string }\n | { type: 'UNSET'; name: string };\n\nexport interface FeaturesTypeState {\n value: 'ready';\n context: FeaturesContext;\n}\n\nexport type FeaturesState = StateFrom;\nexport type FeaturesDispatch = InterpreterFrom['send'];\n\nexport function valueOfFeature(featuresState: FeaturesState, feature: string): [FeatureValue, boolean] {\n if (featuresState.context.features[feature] == null) {\n return [undefined, false];\n }\n const featureState = featuresState.context.features[feature].getSnapshot();\n if (featureState != null) {\n return valueForState(featureState);\n }\n return [undefined, false];\n}\n\n/// state machine that manages a set of features with user, org, and local overrides\nexport const FeaturesMachine = createMachine({\n id: 'features',\n initial: 'idle',\n predictableActionArguments: true,\n context: {\n features: {},\n },\n states: {\n idle: {\n on: {\n INIT: {\n target: 'ready',\n cond: (_, e) => e.features.length > 0,\n actions: assign({\n features: (context, event) => {\n const features: typeof context.features = {};\n\n for (const feature of event.features) {\n features[feature.name] = spawn(FeatureMachine, {\n name: feature.name,\n sync: true,\n });\n features[feature.name].send({ type: 'INIT', feature });\n }\n return features;\n },\n }),\n },\n },\n },\n\n // the features are loaded and ready to be used\n ready: {\n on: {\n DE_INIT: { target: 'idle', actions: assign({ features: (_, __) => ({}) }) },\n SET_ALL: {\n actions: assign({\n features: (ctx, e) => {\n const features = { ...ctx.features };\n // All configured features are set to on/off or undefined\n Object.keys(features).forEach((name) => {\n features[name].send({ type: 'SET', value: e.features[name] ?? undefined });\n });\n return features;\n },\n }),\n },\n\n // Set a feature to a value\n SET: {\n actions: (ctx, e) => {\n const feature = ctx.features[e.name];\n if (feature != null) {\n feature.send({ type: 'SET', value: e.value });\n }\n },\n },\n\n // toggle a feature\n TOGGLE: {\n actions: (ctx, e) => {\n const feature = ctx.features[e.name];\n if (feature != null) {\n feature.send({ type: 'TOGGLE' });\n }\n },\n },\n\n // when a feature is enabled, send the enable message to the actor\n ENABLE: {\n actions: (ctx, e) => {\n const feature = ctx.features[e.name];\n if (feature != null) {\n feature.send({ type: 'ENABLE' });\n }\n },\n },\n\n // when a feature is disabled, send the disable message to the actor\n DISABLE: {\n actions: (ctx, e) => {\n const feature = ctx.features[e.name];\n if (feature != null) {\n feature.send({ type: 'DISABLE' });\n }\n },\n },\n\n // when a feature is unset, send the unset message to the actor\n UNSET: {\n actions: (ctx, e) => {\n const feature = ctx.features[e.name];\n if (feature != null) {\n feature.send({ type: 'UNSET' });\n }\n },\n },\n },\n },\n },\n});\n", "import { assign, createMachine, DoneInvokeEvent, InterpreterFrom, StateFrom } from 'xstate';\n\n/**\n * Feature is either on, off, or 'unset',\n * which means it will go to the default value or the less specific value.\n */\nexport type FeatureValue = false | true | undefined;\n\nexport type FeatureState = StateFrom;\nexport type FeatureDispatch = InterpreterFrom['send'];\n\n/// Given a featurestate, determine the value (on, off, or unset)\nexport function valueForState(featureState: FeatureState): [FeatureValue, boolean] {\n return [\n featureState.matches('enabled') ? true : featureState.matches('disabled') ? false : undefined,\n featureState.context.featureDesc?.force ?? false,\n ];\n}\n\n/**\n * Definition of a feature that can be enabled or disabled.\n * K is the type of the key that is used to identify the feature.\n */\nexport interface FeatureDescription {\n readonly name: K;\n readonly description?: string;\n\n /// If set, will be used to update the feature default state instead of simply overriding.\n /// For example, you might use this to update a feature flag on a backend server.\n /// when set, the feature will be updated on the backend server, and the result of the async\n /// will be used for the final state after the change. while changing, the feature will be\n /// in the 'changing' state. Also note that the feature will be changed at the \"default\" layer.\n readonly onChangeDefault?: (name: K, newValue: FeatureValue) => Promise;\n\n /// if set true, will force the field to what it is set here through layers of states.\n /// useful to invert the layers, similar to !important in CSS.\n readonly force?: boolean;\n\n /// If set to true, the feature will not be overridable by the user.\n readonly noOverride?: boolean;\n\n /// can be used to specify what should happen if the feature is not set to a particular value.\n readonly defaultValue?: FeatureValue;\n}\n\ninterface FeatureContext {\n featureDesc?: FeatureDescription;\n}\n\ntype FeatureTypeState =\n | {\n value: 'asyncDenabled';\n context: FeatureContext;\n }\n | {\n value: 'asyncDisabled';\n context: FeatureContext;\n }\n | {\n value: 'asyncUnspecied';\n context: FeatureContext;\n }\n | {\n value: 'disabled';\n context: FeatureContext;\n }\n | {\n value: 'enabled';\n context: FeatureContext;\n }\n | {\n value: 'initial';\n context: never;\n }\n | {\n value: 'unspecied';\n context: FeatureContext;\n };\n\n/**\n * Actions that can be performed on a feature.\n */\nexport type FeatureAction =\n | { type: 'DISABLE' }\n | { type: 'ENABLE' }\n | { type: 'INIT'; feature: FeatureDescription }\n | { type: 'SET'; value: FeatureValue }\n | { type: 'TOGGLE' }\n | { type: 'UNSET' };\n\n/**\n * Fully describe the states a feature can be in\n */\nexport const FeatureMachine = createMachine({\n id: 'feature',\n initial: 'initial',\n context: {},\n predictableActionArguments: true,\n on: {\n ENABLE: [\n { target: 'asyncEnabled', cond: (ctx) => ctx.featureDesc?.onChangeDefault != null },\n { target: 'enabled' },\n ],\n\n TOGGLE: [\n { target: 'asyncEnabled', cond: (ctx) => ctx.featureDesc?.onChangeDefault != null },\n { target: 'enabled' },\n ],\n\n DISABLE: [\n { target: 'asyncDisabled', cond: (ctx) => ctx.featureDesc?.onChangeDefault != null },\n { target: 'disabled' },\n ],\n\n UNSET: [\n { target: 'asyncUnspecied', cond: (ctx) => ctx.featureDesc?.onChangeDefault != null },\n { target: 'unspecified' },\n ],\n\n SET: [\n {\n target: 'asyncEnabled',\n cond: (ctx, e) => e.value === true && ctx.featureDesc?.onChangeDefault != null,\n },\n {\n target: 'asyncDisabled',\n cond: (ctx, e) => e.value === false && ctx.featureDesc?.onChangeDefault != null,\n },\n {\n target: 'asyncUnspecied',\n cond: (ctx, _e) => ctx.featureDesc?.onChangeDefault != null,\n },\n {\n target: 'enabled',\n cond: (_ctx, e) => e.value === true,\n },\n {\n target: 'disabled',\n cond: (_ctx, e) => e.value === false,\n },\n { target: 'unspecified' },\n ],\n },\n\n states: {\n initial: {\n on: {\n INIT: [\n {\n actions: assign({ featureDesc: (_, e) => e.feature }),\n target: 'enabled',\n cond: (_, e) => e.feature.defaultValue === true,\n },\n {\n actions: assign({ featureDesc: (_, e) => e.feature }),\n target: 'unspecified',\n cond: (_, e) => e.feature.defaultValue === undefined,\n },\n {\n actions: assign({ featureDesc: (_, e) => e.feature }),\n target: 'disabled',\n cond: (_, e) => e.feature.defaultValue === false,\n },\n ],\n },\n },\n\n unspecified: {},\n disabled: {},\n enabled: {},\n\n asyncDisabled: {\n invoke: {\n id: 'set-off-upstream',\n src: async (ctx) => {\n const onchange = ctx.featureDesc?.onChangeDefault;\n if (onchange != null && ctx.featureDesc != null) {\n return onchange(ctx.featureDesc.name, false);\n }\n return undefined;\n },\n onDone: [\n {\n target: 'enabled',\n cond: (_ctx, e: DoneInvokeEvent) => e.data === true,\n },\n {\n target: 'disabled',\n cond: (_ctx, e: DoneInvokeEvent) => e.data === false,\n },\n { target: 'unspecified' },\n ],\n onError: 'unspecified',\n },\n },\n\n asyncUnspecied: {\n invoke: {\n id: 'set-unset-upstream',\n src: async (ctx) => {\n const onchange = ctx.featureDesc?.onChangeDefault;\n if (onchange != null && ctx.featureDesc != null) {\n return onchange(ctx.featureDesc.name, undefined);\n }\n return undefined;\n },\n onDone: [\n {\n target: 'enabled',\n cond: (_ctx, e: DoneInvokeEvent) => e.data === true,\n },\n {\n target: 'disabled',\n cond: (_ctx, e: DoneInvokeEvent) => e.data === false,\n },\n { target: 'unspecified' },\n ],\n onError: 'unspecified',\n },\n },\n\n asyncEnabled: {\n invoke: {\n id: 'set-on-upstream',\n src: async (ctx) => {\n const onchange = ctx.featureDesc?.onChangeDefault;\n if (onchange != null && ctx.featureDesc != null) {\n return onchange(ctx.featureDesc.name, true);\n }\n return undefined;\n },\n onDone: [\n {\n target: 'enabled',\n cond: (_ctx, e: DoneInvokeEvent) => e.data === true,\n },\n {\n target: 'disabled',\n cond: (_ctx, e: DoneInvokeEvent) => e.data === false,\n },\n { target: 'unspecified' },\n ],\n onError: 'unspecified',\n },\n },\n },\n});\n", "import React, { useMemo, ReactNode, useEffect, useRef } from 'react';\n\nimport { useMachine } from '@xstate/react';\n\nimport { EnableContext } from './EnableContext';\nimport { FeatureContext } from './FeatureContext';\nimport { FeaturesMachine } from './FeaturesState';\nimport { FeatureDescription } from './FeatureState';\nimport useConsoleOverride from './useConsoleOverride';\nimport usePersist, { KEY } from './usePersist';\nimport useTestCallback from './useTestCallback';\n\ninterface FeatureProps {\n readonly features: readonly FeatureDescription[];\n readonly children?: ReactNode;\n readonly disableConsole?: boolean;\n readonly storage?: Storage;\n}\n\n/**\n * A more batteries-enabled parent component that keeps track of feature state\n * internally, and creates window.feature.enable(\"f\") and window.feature.disable(\"f\").\n * Keeps track of overrides and defaults, with defaults potentially coming from your props\n * and overrides being persisted to your choice of storage layer.\n */\nexport function Features({\n children,\n features,\n disableConsole = false,\n storage = window.sessionStorage,\n}: FeatureProps): JSX.Element {\n // Capture only first value; we don't care about future updates\n const featuresRef = useRef(features);\n const [overridesState, overridesSend] = useMachine(FeaturesMachine);\n const [defaultsState, defaultsSend] = useMachine(FeaturesMachine);\n\n useEffect(() => {\n /// Load defaults\n defaultsSend({ type: 'INIT', features });\n return () => {\n defaultsSend({ type: 'DE_INIT' });\n };\n }, [defaultsSend, features]);\n\n useEffect(() => {\n let f: Record = {};\n if (storage != null) {\n try {\n const featuresJson = storage.getItem(KEY);\n if (featuresJson != null) {\n const fh = JSON.parse(featuresJson);\n f = fh.overrides;\n }\n } catch (e) {\n // Can't parse or get or otherwise; ignore\n console.error('error in localStorage', e);\n }\n }\n\n overridesSend({\n type: 'INIT',\n features: featuresRef.current\n .filter((x) => x.noOverride !== true)\n .map((x) => ({ name: x.name, description: x.description, defaultValue: f?.[x.name] ?? undefined })),\n });\n\n return () => {\n overridesSend({ type: 'DE_INIT' });\n };\n }, [featuresRef, overridesSend, storage]);\n\n usePersist(storage, featuresRef.current, overridesState);\n\n const testCallback = useTestCallback(overridesState, defaultsState);\n useConsoleOverride(!disableConsole, featuresRef.current, testCallback, defaultsSend);\n\n const featureValue = useMemo(\n () => ({\n overridesSend,\n defaultsSend,\n featuresDescription: featuresRef.current,\n overridesState,\n defaultsState,\n test: testCallback,\n }),\n [overridesSend, defaultsSend, overridesState, defaultsState, testCallback]\n );\n\n return (\n \n {children}\n \n );\n}\n", "import { createContext } from 'react';\n\nimport { FeatureValue } from './FeatureState';\n\nexport type EnableContextType = (feature: string) => FeatureValue;\n\n/**\n * Contained function can check whether a given feature is enabled.\n */\nexport const EnableContext = createContext((_s) => false);\n", "import { createContext } from 'react';\n\nimport { FeaturesDispatch, FeaturesState } from './FeaturesState';\nimport { FeatureDescription, FeatureValue } from './FeatureState';\n\nexport const FeatureContext = createContext(null);\n\n/// Give access to the overrides layer\nexport interface FeatureContextType {\n // Make changes to the overrides\n overridesSend: FeaturesDispatch;\n\n // Make changes to defaults\n defaultsSend: FeaturesDispatch;\n\n featuresDescription: readonly FeatureDescription[];\n\n // State is in layers; overrides and defaults\n overridesState: FeaturesState;\n defaultsState: FeaturesState;\n\n /// Test with proper fallback and respecting the user's force preference\n test: (flag: string) => FeatureValue;\n}\n", "import { useEffect } from 'react';\n\nimport { FeaturesDispatch } from './FeaturesState';\nimport { FeatureDescription, FeatureValue } from './FeatureState';\nimport { GlobalEnable } from './GlobalEnable';\n\nexport default function useConsoleOverride(\n consoleOverride: boolean,\n features: readonly FeatureDescription[],\n testFeature: (_: string) => FeatureValue,\n dispatch: FeaturesDispatch\n): void {\n useEffect(() => {\n if (!consoleOverride) {\n return () => {\n /* empty */\n };\n }\n window.feature = new GlobalEnable(dispatch, testFeature, features);\n return () => {\n if (window.feature != null) {\n delete window.feature;\n }\n };\n }, [features, dispatch, consoleOverride, testFeature]);\n}\n", "import { FeaturesDispatch } from './FeaturesState';\nimport { FeatureDescription, FeatureValue } from './FeatureState';\n\nexport class GlobalEnable {\n private readonly featureDesc: readonly FeatureDescription[];\n private readonly dispatch: FeaturesDispatch;\n private readonly testFeature: (value: string) => FeatureValue;\n\n constructor(\n dispatch: FeaturesDispatch,\n testFeature: (_: string) => FeatureValue,\n featureDesc: readonly FeatureDescription[]\n ) {\n this.featureDesc = featureDesc;\n this.dispatch = dispatch;\n this.testFeature = testFeature;\n }\n\n public toggle(feature: string): void {\n this.dispatch({ type: 'TOGGLE', name: feature });\n }\n\n public enable(feature: string): void {\n this.dispatch({ type: 'ENABLE', name: feature });\n }\n\n public unset(feature: string): void {\n this.dispatch({ type: 'UNSET', name: feature });\n }\n\n public disable(feature: string): void {\n this.dispatch({ type: 'DISABLE', name: feature });\n }\n\n public setAll(features: { [key: string]: FeatureValue }): void {\n this.dispatch({ type: 'SET_ALL', features });\n }\n\n public listFeatures(): readonly [string, FeatureValue][] {\n return this.featureDesc.map((f) => [f.name, this.testFeature(f.name)]);\n }\n}\ndeclare global {\n interface Window {\n feature?: GlobalEnable;\n }\n}\n", "import { useMemo, useEffect } from 'react';\n\nimport { FeaturesState, valueOfFeature } from './FeaturesState';\nimport { FeatureDescription, FeatureValue } from './FeatureState';\n\nexport const KEY = 'react-enable:feature-values';\n\nexport default function usePersist(\n storage: Storage | undefined,\n features: readonly FeatureDescription[],\n overrideState: FeaturesState\n): void {\n const overrides = useMemo(() => {\n const newOverrides: { [key: string]: FeatureValue } = {};\n if (overrideState.matches('ready')) {\n for (const feature of features) {\n const [value] = valueOfFeature(overrideState, feature.name);\n if (value != null) {\n newOverrides[feature.name] = value;\n }\n }\n }\n return newOverrides;\n }, [features, overrideState]);\n\n const strState = Object.keys(overrides).length === 0 || storage == null ? '{}' : JSON.stringify({ overrides });\n\n useEffect(() => {\n try {\n if (storage != null && overrideState.matches('ready')) {\n storage.setItem(KEY, strState);\n }\n } catch (e) {\n // Can't set for some reason\n }\n }, [overrideState, storage, strState]);\n}\n", "import { useCallback } from 'react';\n\nimport { FeaturesState } from './FeaturesState';\nimport testFeature from './testFeature';\n\n/// A callback that can be called to test if a feature is enabled or disabled\nexport default function useTestCallback(\n defaultsState: FeaturesState,\n overridesState: FeaturesState\n): (feature: string) => boolean | undefined {\n return useCallback((f: string) => testFeature(f, [defaultsState, overridesState]), [defaultsState, overridesState]);\n}\n", "import { FeaturesState, valueOfFeature } from './FeaturesState';\nimport { FeatureValue } from './FeatureState';\n\n/** Determine if the feature is enabled in one of the state machines, in order\n *\n * @param state The current state of the machine\n * @param feature The feature to check\n */\n\nexport default function testFeature(feature: string, states: FeaturesState[]): FeatureValue {\n const values = states.map((state) => valueOfFeature(state, feature));\n\n // look for best forced option, in order\n for (const [featureValue, featureForced] of values) {\n if (featureValue != null && featureForced) {\n return featureValue;\n }\n }\n\n // look for best non-forced option, in order\n for (const [featureValue] of values) {\n if (featureValue != null) {\n return featureValue;\n }\n }\n\n // unset if nothing hit\n return undefined;\n}\n", "import * as React from 'react';\n\nimport { useAllEnabled } from './useAllEnabled';\nimport { useEnabled } from './useEnabled';\n\nexport interface EnableProps {\n readonly feature?: string[] | string;\n readonly allFeatures?: string[];\n children: React.ReactNode;\n}\n\n/**\n * Feature will be enabled if any feature in the list are enabled,\n */\nexport function Enable({ feature = [], allFeatures = [], children }: EnableProps): JSX.Element | null {\n const isAny = useEnabled(feature);\n const isAll = useAllEnabled(allFeatures);\n\n if (isAny || isAll) {\n return <>{children};\n }\n\n return null;\n}\n", "import { useContext, useMemo } from 'react';\n\nimport { EnableContextType, EnableContext } from './EnableContext';\n\n// Helper: get rid of some boilerplate.\n// just input mashing and sanitation, removing extra renders, and getting test function\nexport function useTestAndConvert(input?: string[] | string | null): [EnableContextType, string[]] {\n const test = useContext(EnableContext);\n\n // We memoize just to prevent re-renders since this could be at the leaf of a tree\n const converted = useMemo(() => (input == null ? [] : Array.isArray(input) ? input : [input]), [input]);\n\n return [test, converted];\n}\n", "import { useTestAndConvert } from './utils';\n\n/**\n * returns true iff all specified features are enabled\n */\nexport function useAllEnabled(allFeatures: string[] | string): boolean {\n const [test, queryAllPresent] = useTestAndConvert(allFeatures);\n return queryAllPresent.length > 0 && queryAllPresent.every(test);\n}\n", "import { useTestAndConvert } from './utils';\n\n/**\n * returns true iff any specified feature is enabled\n */\nexport function useEnabled(feature: string[] | string): boolean {\n const [test, queryAnyPresent] = useTestAndConvert(feature);\n return queryAnyPresent.some(test);\n}\n", "import * as React from \"react\";\n\nimport { EnableProps } from \"./Enable\";\nimport { useAllDisabled } from \"./useAllDisabled\";\nimport { useDisabled } from \"./useDisabled\";\n\n/**\n * Feature will be disabled if any in the list are enabled\n */\nexport const Disable: React.FC = ({\n feature = [],\n allFeatures = [],\n children\n}) => {\n const isAny = useDisabled(feature);\n const isAll = useAllDisabled(allFeatures);\n\n if (isAny || isAll) {\n return <>{children};\n }\n\n return null;\n};\n", "import { useTestAndConvert } from './utils';\n\n/**\n * returns true iff all specified features are disabled\n */\nexport function useAllDisabled(withoutAll: string[] | string): boolean {\n const [test, queryAllWithout] = useTestAndConvert(withoutAll);\n return withoutAll.length > 0 && queryAllWithout.every((x) => !(test(x) ?? false));\n}\n", "import { useTestAndConvert } from './utils';\n\n/**\n * returns true iff any specified feature is disabled\n */\nexport function useDisabled(without: string[] | string): boolean {\n const [test, queryAnyWithout] = useTestAndConvert(without);\n return queryAnyWithout.some((x) => !(test(x) ?? false));\n}\n", "import React, { useContext, useState, useCallback, ReactNode } from 'react';\nimport ReactDOM from 'react-dom';\n\nimport { RadioGroup } from '@headlessui/react';\n\nimport { FeatureContext } from './FeatureContext';\nimport { valueOfFeature } from './FeaturesState';\nimport { FeatureDescription } from './FeatureState';\n// @ts-expect-error bundler will take care of this\nimport styles from './tailwind.css';\n\nfunction classNames(...classes: string[]): string {\n return classes.filter(Boolean).join(' ');\n}\n\nfunction ToggleFeature({ feature }: { feature: FeatureDescription }): JSX.Element | null {\n const context = useContext(FeatureContext);\n const handleChangeSelection = useCallback(\n (value: 'false' | 'true' | 'unset') => {\n if (context?.overridesSend != null) {\n switch (value) {\n case 'true': {\n context.overridesSend({ type: 'ENABLE', name: feature.name });\n break;\n }\n case 'false': {\n context.overridesSend({ type: 'DISABLE', name: feature.name });\n break;\n }\n case 'unset': {\n context.overridesSend({ type: 'UNSET', name: feature.name });\n break;\n }\n }\n }\n },\n [feature.name, context]\n );\n\n if (context == null) {\n return null;\n }\n\n const { overridesState, test: testFeature, defaultsState } = context;\n\n const valueInDefaults = (valueOfFeature(defaultsState, feature.name)[0] ?? 'unset').toString() as\n | 'false'\n | 'true'\n | 'unset';\n\n const valueInOverrides = (valueOfFeature(overridesState, feature.name)[0] ?? 'unset').toString() as\n | 'false'\n | 'true'\n | 'unset';\n\n const actualChecked = testFeature(feature.name);\n\n return (\n \n \n
\n \n Feature: {feature.name}\n \n {feature.noOverride === true ? (\n
\n \n \n \n
No Overrides
\n
\n ) : null}\n {actualChecked === true ? (\n
\n \n \n \n
{actualChecked ? 'Enabled' : 'Disabled'}
\n
\n ) : null}\n
\n {feature.description == null ? null :

{feature.description}

}\n
\n
\n {[\n { id: 'false', title: `Disable ${feature.name}`, description: 'Override the feature to be disabled' },\n {\n id: 'unset',\n title: 'Default',\n description: 'Inherit enabled state from defaults',\n disabled: (feature.noOverride ?? false) || feature.force,\n defaultValue:\n valueInDefaults === 'true' ? (\n
\n Enabled\n
\n ) : (\n
\n Disabled\n
\n ),\n },\n { id: 'true', title: `Enable ${feature.name}`, description: 'Override the feature to be enabled' },\n ].map((option) => (\n \n classNames(\n checked ? 'border-transparent' : 'border-gray-300',\n !disabled && active ? 'border-blue-500 ring-2 ring-blue-500' : '',\n disabled ? 'border-transparent ring-gray-500 cursor-not-allowed' : 'cursor-pointer',\n 'relative bg-white border rounded-lg shadow-sm p-3 flex focus:outline-none'\n )\n }\n disabled={option.disabled}\n key={option.id}\n value={option.id}\n >\n {({ checked, active, disabled }) => (\n <>\n
\n \n {option.title}\n {option.defaultValue != null ? option.defaultValue : null}\n \n \n \n \n \n {option.description}\n \n
\n \n \n )}\n \n ))}\n
\n
\n );\n}\n\nfunction ShadowContent({ root, children }: { children: ReactNode; root: Element }) {\n return ReactDOM.createPortal(children, root);\n}\n\n/// Permit users to override feature flags via a GUI.\n/// Renders a small floating button in lower left or right, pressing it brings up\n/// a list of features to toggle and their current override state. you can override on or override off,\n/// or unset the override and go back to default value.\n// eslint-disable-next-line no-undef\nexport function ToggleFeatures({ defaultOpen = false, hidden = false }: { defaultOpen?: boolean; hidden?: boolean }): JSX.Element | null {\n const [root, setCoreRoot] = useState(null);\n\n const setRoot = (host: HTMLDivElement | null) => {\n if (host == null || root != null) {\n return;\n }\n const shadowRoot = host?.attachShadow({ mode: 'open' });\n const style = document.createElement('style');\n const renderDiv = document.createElement('div');\n style.textContent = styles;\n shadowRoot.appendChild(style);\n shadowRoot.appendChild(renderDiv);\n setCoreRoot(renderDiv);\n };\n\n if (hidden) {\n return null;\n }\n\n return (\n
\n {root != null ? (\n \n \n \n ) : null}\n
\n );\n}\n\n/// Like ToggleFeatures, but does not inject styles into a shadow DOM root node.\n/// useful if you're using tailwind.\nexport function ToggleFeatureUnwrapped({ defaultOpen = false, hidden = false }: { defaultOpen?: boolean; hidden?: boolean }): JSX.Element | null {\n const [open, setOpen] = useState(defaultOpen);\n const context = useContext(FeatureContext);\n\n if (context == null) {\n return null;\n }\n\n if (hidden) {\n return null;\n }\n\n // We want: Real value after all nestings, value of the override. we toggle override\n const { featuresDescription } = context;\n\n if (featuresDescription.length === 0) {\n return null;\n }\n\n return (\n
\n
\n setOpen(true)}\n title=\"Toggle features\"\n type=\"button\"\n >\n \n \n \n \n
\n {!open ? null : (\n
\n
\n
\n
\n
\n

\n
Feature Flag Overrides
\n

\n

\n Features can be enabled or disabled unless they are forced upstream. You can also revert to default.\n

\n
\n
\n Feature Flags\n {featuresDescription.map((feature) => (\n \n ))}\n
\n
\n
\n setOpen(false)}\n type=\"button\"\n >\n Done\n \n
\n
\n
\n
\n
\n
\n )}\n
\n );\n}\n"], + "mappings": "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", "names": [] } diff --git a/dist/esm/src/index.js b/dist/esm/src/index.js index 285cf6c..58aa113 100644 --- a/dist/esm/src/index.js +++ b/dist/esm/src/index.js @@ -1,4 +1,4 @@ -var $=Object.defineProperty;var B=Object.getOwnPropertySymbols;var Q=Object.prototype.hasOwnProperty,Z=Object.prototype.propertyIsEnumerable;var P=(t,e,r)=>e in t?$(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r,U=(t,e)=>{for(var r in e||(e={}))Q.call(e,r)&&P(t,r,e[r]);if(B)for(var r of B(e))Z.call(e,r)&&P(t,r,e[r]);return t};var y=(t,e,r)=>new Promise((a,n)=>{var s=l=>{try{u(r.next(l))}catch(c){n(c)}},d=l=>{try{u(r.throw(l))}catch(c){n(c)}},u=l=>l.done?a(l.value):Promise.resolve(l.value).then(s,d);u((r=r.apply(t,e)).next())});import{assign as N,createMachine as ee,spawn as te}from"xstate";import{assign as C,createMachine as R}from"xstate";function G(t){var e,r;return[t.matches("enabled")?!0:t.matches("disabled")?!1:void 0,(r=(e=t.context.featureDesc)==null?void 0:e.force)!=null?r:!1]}var J=R({id:"feature",initial:"initial",context:{},predictableActionArguments:!0,on:{ENABLE:[{target:"asyncEnabled",cond:t=>{var e;return((e=t.featureDesc)==null?void 0:e.onChangeDefault)!=null}},{target:"enabled"}],TOGGLE:[{target:"asyncEnabled",cond:t=>{var e;return((e=t.featureDesc)==null?void 0:e.onChangeDefault)!=null}},{target:"enabled"}],DISABLE:[{target:"asyncDisabled",cond:t=>{var e;return((e=t.featureDesc)==null?void 0:e.onChangeDefault)!=null}},{target:"disabled"}],UNSET:[{target:"asyncUnspecied",cond:t=>{var e;return((e=t.featureDesc)==null?void 0:e.onChangeDefault)!=null}},{target:"unspecified"}],SET:[{target:"asyncEnabled",cond:(t,e)=>{var r;return e.value===!0&&((r=t.featureDesc)==null?void 0:r.onChangeDefault)!=null}},{target:"asyncDisabled",cond:(t,e)=>{var r;return e.value===!1&&((r=t.featureDesc)==null?void 0:r.onChangeDefault)!=null}},{target:"asyncUnspecied",cond:(t,e)=>{var r;return((r=t.featureDesc)==null?void 0:r.onChangeDefault)!=null}},{target:"enabled",cond:(t,e)=>e.value===!0},{target:"disabled",cond:(t,e)=>e.value===!1},{target:"unspecified"}]},states:{initial:{on:{INIT:[{actions:C({featureDesc:(t,e)=>e.feature}),target:"enabled",cond:(t,e)=>e.feature.defaultValue===!0},{actions:C({featureDesc:(t,e)=>e.feature}),target:"unspecified",cond:(t,e)=>e.feature.defaultValue===void 0},{actions:C({featureDesc:(t,e)=>e.feature}),target:"disabled",cond:(t,e)=>e.feature.defaultValue===!1}]}},unspecified:{},disabled:{},enabled:{},asyncDisabled:{invoke:{id:"set-off-upstream",src:t=>y(void 0,null,function*(){var r;let e=(r=t.featureDesc)==null?void 0:r.onChangeDefault;if(e!=null&&t.featureDesc!=null)return e(t.featureDesc.name,!1)}),onDone:[{target:"enabled",cond:(t,e)=>e.data===!0},{target:"disabled",cond:(t,e)=>e.data===!1},{target:"unspecified"}],onError:"unspecified"}},asyncUnspecied:{invoke:{id:"set-unset-upstream",src:t=>y(void 0,null,function*(){var r;let e=(r=t.featureDesc)==null?void 0:r.onChangeDefault;if(e!=null&&t.featureDesc!=null)return e(t.featureDesc.name,void 0)}),onDone:[{target:"enabled",cond:(t,e)=>e.data===!0},{target:"disabled",cond:(t,e)=>e.data===!1},{target:"unspecified"}],onError:"unspecified"}},asyncEnabled:{invoke:{id:"set-on-upstream",src:t=>y(void 0,null,function*(){var r;let e=(r=t.featureDesc)==null?void 0:r.onChangeDefault;if(e!=null&&t.featureDesc!=null)return e(t.featureDesc.name,!0)}),onDone:[{target:"enabled",cond:(t,e)=>e.data===!0},{target:"disabled",cond:(t,e)=>e.data===!1},{target:"unspecified"}],onError:"unspecified"}}}});function g(t,e){if(t.context.features[e]==null)return[void 0,!1];let r=t.context.features[e].getSnapshot();return r!=null?G(r):[void 0,!1]}var F=ee({id:"features",initial:"idle",predictableActionArguments:!0,context:{features:{}},states:{idle:{on:{INIT:{target:"ready",cond:(t,e)=>e.features.length>0,actions:N({features:(t,e)=>{let r={};for(let a of e.features)r[a.name]=te(J,{name:a.name,sync:!0}),r[a.name].send({type:"INIT",feature:a});return r}})}}},ready:{on:{DE_INIT:{target:"idle",actions:N({features:(t,e)=>({})})},SET_ALL:{actions:N({features:(t,e)=>{let r=U({},t.features);return Object.keys(r).forEach(a=>{var n;r[a].send({type:"SET",value:(n=e.features[a])!=null?n:void 0})}),r}})},SET:{actions:(t,e)=>{let r=t.features[e.name];r!=null&&r.send({type:"SET",value:e.value})}},TOGGLE:{actions:(t,e)=>{let r=t.features[e.name];r!=null&&r.send({type:"TOGGLE"})}},ENABLE:{actions:(t,e)=>{let r=t.features[e.name];r!=null&&r.send({type:"ENABLE"})}},DISABLE:{actions:(t,e)=>{let r=t.features[e.name];r!=null&&r.send({type:"DISABLE"})}},UNSET:{actions:(t,e)=>{let r=t.features[e.name];r!=null&&r.send({type:"UNSET"})}}}}}});import X,{useMemo as le,useEffect as H,useRef as de}from"react";import{useMachine as q}from"@xstate/react";import{createContext as re}from"react";var h=re(t=>!1);import{createContext as oe}from"react";var w=oe(null);import{useEffect as ae}from"react";var k=class{constructor(e,r,a){this.featureDesc=a,this.dispatch=e,this.testFeature=r}toggle(e){this.dispatch({type:"TOGGLE",name:e})}enable(e){this.dispatch({type:"ENABLE",name:e})}unset(e){this.dispatch({type:"UNSET",name:e})}disable(e){this.dispatch({type:"DISABLE",name:e})}setAll(e){this.dispatch({type:"SET_ALL",features:e})}listFeatures(){return this.featureDesc.map(e=>[e.name,this.testFeature(e.name)])}};function z(t,e,r,a){ae(()=>t?(window.feature=new k(a,r,e),()=>{window.feature!=null&&delete window.feature}):()=>{},[e,a,t,r])}import{useMemo as ne,useEffect as ie}from"react";var T="react-enable:feature-values";function A(t,e,r){let a=ne(()=>{let s={};if(r.matches("ready"))for(let d of e){let[u]=g(r,d.name);u!=null&&(s[d.name]=u)}return s},[e,r]),n=Object.keys(a).length===0||t==null?"{}":JSON.stringify({overrides:a});ie(()=>{try{t!=null&&r.matches("ready")&&t.setItem(T,n)}catch(s){}},[r,t,n])}import{useCallback as se}from"react";function I(t,e){let r=e.map(a=>g(a,t));for(let[a,n]of r)if(a!=null&&n)return a;for(let[a]of r)if(a!=null)return a}function V(t,e){return se(r=>I(r,[t,e]),[t,e])}function ue({children:t,features:e,disableConsole:r=!1,storage:a=window.sessionStorage}){let n=de(e),[s,d]=q(F),[u,l]=q(F);H(()=>(l({type:"INIT",features:e}),()=>{l({type:"DE_INIT"})}),[l,e]),H(()=>{let f={};if(a!=null)try{let i=a.getItem(T);i!=null&&(f=JSON.parse(i).overrides)}catch(i){console.error("error in localStorage",i)}return d({type:"INIT",features:n.current.filter(i=>i.noOverride!==!0).map(i=>{var p;return{name:i.name,description:i.description,defaultValue:(p=f==null?void 0:f[i.name])!=null?p:void 0}})}),()=>{d({type:"DE_INIT"})}},[n,d,a]),A(a,n.current,s);let c=V(s,u);z(!r,n.current,c,l);let v=le(()=>({overridesSend:d,defaultsSend:l,featuresDescription:n.current,overridesState:s,defaultsState:u,test:c}),[d,l,s,u,c]);return X.createElement(w.Provider,{value:v},X.createElement(h.Provider,{value:c},t))}import*as D from"react";import{useContext as ce,useMemo as pe}from"react";function m(t){let e=ce(h),r=pe(()=>t==null?[]:Array.isArray(t)?t:[t],[t]);return[e,r]}function L(t){let[e,r]=m(t);return r.length>0&&r.every(e)}function O(t){let[e,r]=m(t);return r.some(e)}function me({feature:t=[],allFeatures:e=[],children:r}){let a=O(t),n=L(e);return a||n?D.createElement(D.Fragment,null,r):null}import*as E from"react";function M(t){let[e,r]=m(t);return t.length>0&&r.every(a=>{var n;return!((n=e(a))!=null&&n)})}function _(t){let[e,r]=m(t);return r.some(a=>{var n;return!((n=e(a))!=null&&n)})}var fe=({feature:t=[],allFeatures:e=[],children:r})=>{let a=_(t),n=M(e);return a||n?E.createElement(E.Fragment,null,r):null};import o,{useContext as Y,useState as W,useCallback as be}from"react";import he from"react-dom";import{RadioGroup as x}from"@headlessui/react";var K=`/* +var $=Object.defineProperty;var B=Object.getOwnPropertySymbols;var Q=Object.prototype.hasOwnProperty,Z=Object.prototype.propertyIsEnumerable;var P=(t,e,r)=>e in t?$(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r,U=(t,e)=>{for(var r in e||(e={}))Q.call(e,r)&&P(t,r,e[r]);if(B)for(var r of B(e))Z.call(e,r)&&P(t,r,e[r]);return t};var y=(t,e,r)=>new Promise((a,n)=>{var i=s=>{try{u(r.next(s))}catch(c){n(c)}},d=s=>{try{u(r.throw(s))}catch(c){n(c)}},u=s=>s.done?a(s.value):Promise.resolve(s.value).then(i,d);u((r=r.apply(t,e)).next())});import{assign as N,createMachine as ee,spawn as te}from"xstate";import{assign as C,createMachine as R}from"xstate";function G(t){var e,r;return[t.matches("enabled")?!0:t.matches("disabled")?!1:void 0,(r=(e=t.context.featureDesc)==null?void 0:e.force)!=null?r:!1]}var J=R({id:"feature",initial:"initial",context:{},predictableActionArguments:!0,on:{ENABLE:[{target:"asyncEnabled",cond:t=>{var e;return((e=t.featureDesc)==null?void 0:e.onChangeDefault)!=null}},{target:"enabled"}],TOGGLE:[{target:"asyncEnabled",cond:t=>{var e;return((e=t.featureDesc)==null?void 0:e.onChangeDefault)!=null}},{target:"enabled"}],DISABLE:[{target:"asyncDisabled",cond:t=>{var e;return((e=t.featureDesc)==null?void 0:e.onChangeDefault)!=null}},{target:"disabled"}],UNSET:[{target:"asyncUnspecied",cond:t=>{var e;return((e=t.featureDesc)==null?void 0:e.onChangeDefault)!=null}},{target:"unspecified"}],SET:[{target:"asyncEnabled",cond:(t,e)=>{var r;return e.value===!0&&((r=t.featureDesc)==null?void 0:r.onChangeDefault)!=null}},{target:"asyncDisabled",cond:(t,e)=>{var r;return e.value===!1&&((r=t.featureDesc)==null?void 0:r.onChangeDefault)!=null}},{target:"asyncUnspecied",cond:(t,e)=>{var r;return((r=t.featureDesc)==null?void 0:r.onChangeDefault)!=null}},{target:"enabled",cond:(t,e)=>e.value===!0},{target:"disabled",cond:(t,e)=>e.value===!1},{target:"unspecified"}]},states:{initial:{on:{INIT:[{actions:C({featureDesc:(t,e)=>e.feature}),target:"enabled",cond:(t,e)=>e.feature.defaultValue===!0},{actions:C({featureDesc:(t,e)=>e.feature}),target:"unspecified",cond:(t,e)=>e.feature.defaultValue===void 0},{actions:C({featureDesc:(t,e)=>e.feature}),target:"disabled",cond:(t,e)=>e.feature.defaultValue===!1}]}},unspecified:{},disabled:{},enabled:{},asyncDisabled:{invoke:{id:"set-off-upstream",src:t=>y(void 0,null,function*(){var r;let e=(r=t.featureDesc)==null?void 0:r.onChangeDefault;if(e!=null&&t.featureDesc!=null)return e(t.featureDesc.name,!1)}),onDone:[{target:"enabled",cond:(t,e)=>e.data===!0},{target:"disabled",cond:(t,e)=>e.data===!1},{target:"unspecified"}],onError:"unspecified"}},asyncUnspecied:{invoke:{id:"set-unset-upstream",src:t=>y(void 0,null,function*(){var r;let e=(r=t.featureDesc)==null?void 0:r.onChangeDefault;if(e!=null&&t.featureDesc!=null)return e(t.featureDesc.name,void 0)}),onDone:[{target:"enabled",cond:(t,e)=>e.data===!0},{target:"disabled",cond:(t,e)=>e.data===!1},{target:"unspecified"}],onError:"unspecified"}},asyncEnabled:{invoke:{id:"set-on-upstream",src:t=>y(void 0,null,function*(){var r;let e=(r=t.featureDesc)==null?void 0:r.onChangeDefault;if(e!=null&&t.featureDesc!=null)return e(t.featureDesc.name,!0)}),onDone:[{target:"enabled",cond:(t,e)=>e.data===!0},{target:"disabled",cond:(t,e)=>e.data===!1},{target:"unspecified"}],onError:"unspecified"}}}});function g(t,e){if(t.context.features[e]==null)return[void 0,!1];let r=t.context.features[e].getSnapshot();return r!=null?G(r):[void 0,!1]}var F=ee({id:"features",initial:"idle",predictableActionArguments:!0,context:{features:{}},states:{idle:{on:{INIT:{target:"ready",cond:(t,e)=>e.features.length>0,actions:N({features:(t,e)=>{let r={};for(let a of e.features)r[a.name]=te(J,{name:a.name,sync:!0}),r[a.name].send({type:"INIT",feature:a});return r}})}}},ready:{on:{DE_INIT:{target:"idle",actions:N({features:(t,e)=>({})})},SET_ALL:{actions:N({features:(t,e)=>{let r=U({},t.features);return Object.keys(r).forEach(a=>{var n;r[a].send({type:"SET",value:(n=e.features[a])!=null?n:void 0})}),r}})},SET:{actions:(t,e)=>{let r=t.features[e.name];r!=null&&r.send({type:"SET",value:e.value})}},TOGGLE:{actions:(t,e)=>{let r=t.features[e.name];r!=null&&r.send({type:"TOGGLE"})}},ENABLE:{actions:(t,e)=>{let r=t.features[e.name];r!=null&&r.send({type:"ENABLE"})}},DISABLE:{actions:(t,e)=>{let r=t.features[e.name];r!=null&&r.send({type:"DISABLE"})}},UNSET:{actions:(t,e)=>{let r=t.features[e.name];r!=null&&r.send({type:"UNSET"})}}}}}});import X,{useMemo as le,useEffect as H,useRef as de}from"react";import{useMachine as q}from"@xstate/react";import{createContext as re}from"react";var h=re(t=>!1);import{createContext as oe}from"react";var w=oe(null);import{useEffect as ae}from"react";var k=class{constructor(e,r,a){this.featureDesc=a,this.dispatch=e,this.testFeature=r}toggle(e){this.dispatch({type:"TOGGLE",name:e})}enable(e){this.dispatch({type:"ENABLE",name:e})}unset(e){this.dispatch({type:"UNSET",name:e})}disable(e){this.dispatch({type:"DISABLE",name:e})}setAll(e){this.dispatch({type:"SET_ALL",features:e})}listFeatures(){return this.featureDesc.map(e=>[e.name,this.testFeature(e.name)])}};function z(t,e,r,a){ae(()=>t?(window.feature=new k(a,r,e),()=>{window.feature!=null&&delete window.feature}):()=>{},[e,a,t,r])}import{useMemo as ne,useEffect as ie}from"react";var T="react-enable:feature-values";function A(t,e,r){let a=ne(()=>{let i={};if(r.matches("ready"))for(let d of e){let[u]=g(r,d.name);u!=null&&(i[d.name]=u)}return i},[e,r]),n=Object.keys(a).length===0||t==null?"{}":JSON.stringify({overrides:a});ie(()=>{try{t!=null&&r.matches("ready")&&t.setItem(T,n)}catch(i){}},[r,t,n])}import{useCallback as se}from"react";function I(t,e){let r=e.map(a=>g(a,t));for(let[a,n]of r)if(a!=null&&n)return a;for(let[a]of r)if(a!=null)return a}function V(t,e){return se(r=>I(r,[t,e]),[t,e])}function ue({children:t,features:e,disableConsole:r=!1,storage:a=window.sessionStorage}){let n=de(e),[i,d]=q(F),[u,s]=q(F);H(()=>(s({type:"INIT",features:e}),()=>{s({type:"DE_INIT"})}),[s,e]),H(()=>{let m={};if(a!=null)try{let l=a.getItem(T);l!=null&&(m=JSON.parse(l).overrides)}catch(l){console.error("error in localStorage",l)}return d({type:"INIT",features:n.current.filter(l=>l.noOverride!==!0).map(l=>{var p;return{name:l.name,description:l.description,defaultValue:(p=m==null?void 0:m[l.name])!=null?p:void 0}})}),()=>{d({type:"DE_INIT"})}},[n,d,a]),A(a,n.current,i);let c=V(i,u);z(!r,n.current,c,s);let v=le(()=>({overridesSend:d,defaultsSend:s,featuresDescription:n.current,overridesState:i,defaultsState:u,test:c}),[d,s,i,u,c]);return X.createElement(w.Provider,{value:v},X.createElement(h.Provider,{value:c},t))}import*as D from"react";import{useContext as ce,useMemo as pe}from"react";function f(t){let e=ce(h),r=pe(()=>t==null?[]:Array.isArray(t)?t:[t],[t]);return[e,r]}function L(t){let[e,r]=f(t);return r.length>0&&r.every(e)}function O(t){let[e,r]=f(t);return r.some(e)}function fe({feature:t=[],allFeatures:e=[],children:r}){let a=O(t),n=L(e);return a||n?D.createElement(D.Fragment,null,r):null}import*as E from"react";function M(t){let[e,r]=f(t);return t.length>0&&r.every(a=>{var n;return!((n=e(a))!=null&&n)})}function _(t){let[e,r]=f(t);return r.some(a=>{var n;return!((n=e(a))!=null&&n)})}var me=({feature:t=[],allFeatures:e=[],children:r})=>{let a=_(t),n=M(e);return a||n?E.createElement(E.Fragment,null,r):null};import o,{useContext as Y,useState as W,useCallback as be}from"react";import he from"react-dom";import{RadioGroup as x}from"@headlessui/react";var K=`/* ! tailwindcss v3.0.24 | MIT License | https://tailwindcss.com */ @@ -744,6 +744,10 @@ select { display: grid; } +.hidden { + display: none; +} + .h-7 { height: 1.75rem; } @@ -1185,5 +1189,5 @@ select { gap: 1rem; } } -`;function j(...t){return t.filter(Boolean).join(" ")}function we({feature:t}){var c,v,f;let e=Y(w),r=be(i=>{if((e==null?void 0:e.overridesSend)!=null)switch(i){case"true":{e.overridesSend({type:"ENABLE",name:t.name});break}case"false":{e.overridesSend({type:"DISABLE",name:t.name});break}case"unset":{e.overridesSend({type:"UNSET",name:t.name});break}}},[t.name,e]);if(e==null)return null;let{overridesState:a,test:n,defaultsState:s}=e,d=((c=g(s,t.name)[0])!=null?c:"unset").toString(),u=((v=g(a,t.name)[0])!=null?v:"unset").toString(),l=n(t.name);return o.createElement(x,{disabled:t.noOverride,onChange:r,value:u},o.createElement(x.Label,null,o.createElement("h6",{className:"text-gray-900 align-center flex flex-row flex-nowrap items-center gap-2 lg:gap-4 h-7"},o.createElement("span",{className:"font-medium"},"Feature: ",o.createElement("code",null,t.name)),t.noOverride===!0?o.createElement("div",{className:"border-orange-500 text-orange-500 flex flex-nowrap text-xs flex-row gap-1 rounded-sm border items-center justify-center px-2 py-1"},o.createElement("svg",{"aria-hidden":"true",className:"h-4 w-4 min-w-4",fill:"currentColor",viewBox:"0 0 20 20",xmlns:"http://www.w3.org/2000/svg"},o.createElement("path",{clipRule:"evenodd",d:"M5 9V7a5 5 0 0110 0v2a2 2 0 012 2v5a2 2 0 01-2 2H5a2 2 0 01-2-2v-5a2 2 0 012-2zm8-2v2H7V7a3 3 0 016 0z",fillRule:"evenodd"})),o.createElement("div",null,"No Overrides")):null,l===!0?o.createElement("div",{className:"flex flex-nowrap text-xs text-green-500 flex-row gap-1 rounded-sm border items-center justify-center border-green-500 px-2 py-1"},o.createElement("svg",{"aria-hidden":"true",className:"h-4 w-4 min-w-4",fill:"currentColor",viewBox:"0 0 20 20",xmlns:"http://www.w3.org/2000/svg"},o.createElement("path",{clipRule:"evenodd",d:"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z",fillRule:"evenodd"})),o.createElement("div",null,l?"Enabled":"Disabled")):null),t.description==null?null:o.createElement("p",{className:"text-base text-gray-500 text-sm"},t.description)),o.createElement("div",{className:"mt-4 grid grid-cols-1 gap-y-6 sm:grid-cols-3 sm:gap-x-4"},[{id:"false",title:`Disable ${t.name}`,description:"Override the feature to be disabled"},{id:"unset",title:"Default",description:"Inherit enabled state from defaults",disabled:((f=t.noOverride)!=null?f:!1)||t.force,defaultValue:d==="true"?o.createElement("div",{className:"text-green-500 border-green-500 flex flex-nowrap text-xs flex-row gap-1 rounded-sm border items-center justify-center px-2 py-1"},o.createElement("span",null,"Enabled")):o.createElement("div",{className:"text-red-500 border-red-500 flex flex-nowrap text-xs flex-row gap-1 rounded-sm border items-center justify-center px-2 py-1"},o.createElement("span",null,"Disabled"))},{id:"true",title:`Enable ${t.name}`,description:"Override the feature to be enabled"}].map(i=>o.createElement(x.Option,{className:({checked:p,active:S,disabled:b})=>j(p?"border-transparent":"border-gray-300",!b&&S?"border-blue-500 ring-2 ring-blue-500":"",b?"border-transparent ring-gray-500 cursor-not-allowed":"cursor-pointer","relative bg-white border rounded-lg shadow-sm p-3 flex focus:outline-none"),disabled:i.disabled,key:i.id,value:i.id},({checked:p,active:S,disabled:b})=>o.createElement(o.Fragment,null,o.createElement("div",{className:"flex flex-col grow"},o.createElement(x.Label,{as:"span",className:"flex flex-nowrap flex-row gap-1 items-center space-between"},o.createElement("span",{className:"text-sm font-medium text-gray-900 grow shrink"},i.title),i.defaultValue!=null?i.defaultValue:null,o.createElement("svg",{"aria-hidden":"true",className:j(p?"":"invisible","h-5 w-5 text-blue-500 min-w-4"),fill:"currentColor",viewBox:"0 0 20 20",xmlns:"http://www.w3.org/2000/svg"},o.createElement("path",{clipRule:"evenodd",d:"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z",fillRule:"evenodd"}))),o.createElement(x.Description,{as:"span",className:"mt-1 flex items-center text-sm text-gray-500"},i.description)),o.createElement("div",{"aria-hidden":"true",className:j(!b&&S?"border":"border-2",p?b?"border-gray-500":"border-blue-500":"border-transparent","absolute -inset-px rounded-lg pointer-events-none")}))))))}function xe({root:t,children:e}){return he.createPortal(e,t)}function ve({defaultOpen:t=!1}){let[e,r]=W(null);return o.createElement("div",{ref:n=>{if(n==null||e!=null)return;let s=n==null?void 0:n.attachShadow({mode:"open"}),d=document.createElement("style"),u=document.createElement("div");d.textContent=K,s.appendChild(d),s.appendChild(u),r(u)},style:{zIndex:99999,position:"fixed",width:"0",height:"0",bottom:0}},e!=null?o.createElement(xe,{root:e},o.createElement(ye,{defaultOpen:t})):null)}function ye({defaultOpen:t=!1}){let[e,r]=W(t),a=Y(w);if(a==null)return null;let{featuresDescription:n}=a;return n.length===0?null:o.createElement("div",{className:"relative"},o.createElement("div",{className:"absolute bottom-0 left-0 mx-4 my-4"},o.createElement("button",{className:"inline-flex items-center text-sm font-medium p-1 h-8 w-8 align-middle cursor-pointer rounded-full bg-blue-600 text-white border border-transparent justify-center text-base font-medium focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-600 sm:text-sm",onClick:()=>r(!0),title:"Toggle features",type:"button"},o.createElement("svg",{className:"w-6 h-6 min-h-6 min-w-6",fill:"currentColor",viewBox:"0 0 20 20",xmlns:"http://www.w3.org/2000/svg"},o.createElement("path",{clipRule:"evenodd",d:"M3 6a3 3 0 013-3h10a1 1 0 01.8 1.6L14.25 8l2.55 3.4A1 1 0 0116 13H6a1 1 0 00-1 1v3a1 1 0 11-2 0V6z",fillRule:"evenodd"})))),e?o.createElement("div",{className:"fixed z-10 inset-0 overflow-y-auto"},o.createElement("div",{className:"flex items-end justify-flex-start mx-8 my-4 min-h-screen pt-4 px-4 pb-10 sm:block sm:p-0"},o.createElement("div",{className:"relative inline-block align-bottom bg-white rounded-lg px-4 pt-5 pb-4 text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:p-6 lg:max-w-[80%] max-w-full"},o.createElement("div",null,o.createElement("div",{className:"mt-1 sm:mt-3"},o.createElement("h3",{className:"flex flex-row gap-4 flex-nowrap items-center space-between"},o.createElement("div",{className:"grow text-lg leading-6 font-medium text-gray-900"},"Feature Flag Overrides")),o.createElement("p",{className:"text-sm text-gray-500"},"Features can be enabled or disabled unless they are forced upstream. You can also revert to default."),o.createElement("div",{className:"mt-6"},o.createElement("fieldset",{className:"flex flex-col gap-9"},o.createElement("legend",{className:"sr-only"},"Feature Flags"),n.map(s=>o.createElement(we,{feature:s,key:s.name})))),o.createElement("div",{className:"flex justify-center items-center mt-5 sm:mt-6"},o.createElement("button",{className:"inline-flex items-center text-sm font-medium pt-0 pb-0 pr-4 pl-4 h-8 leading-7 align-middle cursor-pointer rounded-sm bg-blue-600 text-white border border-transparent justify-center text-base font-medium focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-600 sm:text-sm",onClick:()=>r(!1),type:"button"},"Done"))))))):null)}export{fe as Disable,me as Enable,h as EnableContext,ue as Features,F as FeaturesMachine,ve as ToggleFeatures,M as useAllDisabled,L as useAllEnabled,_ as useDisabled,O as useEnabled}; -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL0ZlYXR1cmVzU3RhdGUudHN4IiwgIi4uLy4uLy4uL3NyYy9GZWF0dXJlU3RhdGUudHN4IiwgIi4uLy4uLy4uL3NyYy9GZWF0dXJlcy50c3giLCAiLi4vLi4vLi4vc3JjL0VuYWJsZUNvbnRleHQudHN4IiwgIi4uLy4uLy4uL3NyYy9GZWF0dXJlQ29udGV4dC50c3giLCAiLi4vLi4vLi4vc3JjL3VzZUNvbnNvbGVPdmVycmlkZS50c3giLCAiLi4vLi4vLi4vc3JjL0dsb2JhbEVuYWJsZS50c3giLCAiLi4vLi4vLi4vc3JjL3VzZVBlcnNpc3QudHN4IiwgIi4uLy4uLy4uL3NyYy91c2VUZXN0Q2FsbGJhY2sudHN4IiwgIi4uLy4uLy4uL3NyYy90ZXN0RmVhdHVyZS50c3giLCAiLi4vLi4vLi4vc3JjL0VuYWJsZS50c3giLCAiLi4vLi4vLi4vc3JjL3V0aWxzLnRzIiwgIi4uLy4uLy4uL3NyYy91c2VBbGxFbmFibGVkLnRzeCIsICIuLi8uLi8uLi9zcmMvdXNlRW5hYmxlZC50c3giLCAiLi4vLi4vLi4vc3JjL0Rpc2FibGUudHN4IiwgIi4uLy4uLy4uL3NyYy91c2VBbGxEaXNhYmxlZC50c3giLCAiLi4vLi4vLi4vc3JjL3VzZURpc2FibGVkLnRzeCIsICIuLi8uLi8uLi9zcmMvVG9nZ2xlRmVhdHVyZXMudHN4Il0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBBY3RvclJlZkZyb20sIEludGVycHJldGVyRnJvbSwgU3RhdGVGcm9tLCBhc3NpZ24sIGNyZWF0ZU1hY2hpbmUsIHNwYXduIH0gZnJvbSAneHN0YXRlJztcblxuaW1wb3J0IHsgRmVhdHVyZU1hY2hpbmUsIEZlYXR1cmVEZXNjcmlwdGlvbiwgRmVhdHVyZVZhbHVlLCB2YWx1ZUZvclN0YXRlIH0gZnJvbSAnLi9GZWF0dXJlU3RhdGUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZlYXR1cmVzQ29udGV4dCB7XG4gIC8vIGZlYXR1cmVzIGFyZSBsYXllcmVkOlxuICAvLyAgLSBkZWZhdWx0czogaWYgbm90aGluZyBlbHNlIG1hdGNoZXMsIHByb3ZpZGVkIGEgdmFsdWUgZm9yIGZlYXR1cmVcbiAgLy8gIC0gYnJvd3NlcjogYnJvd3Nlci1sb2NhbCB2YWx1ZXMgZm9yIGZlYXR1cmVzIChrZXB0IGluIGxvY2FsIHN0b3JhZ2UsIGV0YylcbiAgLy8gIC0gdXNlcjogdmFsdWVzIGZyb20gdGhlIHVzZXIncyBwcm9maWxlLCBpZiBhbnlcbiAgLy8gIC0gb3JnOiB2YWx1ZSBmcm9tIHRoZSBvcmcncyBwcm9maWxlLCBpZiBhbnlcbiAgZmVhdHVyZXM6IHsgW3g6IHN0cmluZ106IEFjdG9yUmVmRnJvbTx0eXBlb2YgRmVhdHVyZU1hY2hpbmU+IH07XG59XG5cbmV4cG9ydCB0eXBlIEZlYXR1cmVzQWN0aW9uID1cbiAgfCB7IHR5cGU6ICdERV9JTklUJyB9XG4gIHwgeyB0eXBlOiAnRElTQUJMRSc7IG5hbWU6IHN0cmluZyB9XG4gIHwgeyB0eXBlOiAnRU5BQkxFJzsgbmFtZTogc3RyaW5nIH1cbiAgfCB7IHR5cGU6ICdJTklUJzsgZmVhdHVyZXM6IHJlYWRvbmx5IEZlYXR1cmVEZXNjcmlwdGlvbltdIH1cbiAgfCB7IHR5cGU6ICdTRVRfQUxMJzsgZmVhdHVyZXM6IHsgW2tleTogc3RyaW5nXTogRmVhdHVyZVZhbHVlIH0gfVxuICB8IHsgdHlwZTogJ1NFVCc7IG5hbWU6IHN0cmluZzsgdmFsdWU6IEZlYXR1cmVWYWx1ZSB9XG4gIHwgeyB0eXBlOiAnVE9HR0xFJzsgbmFtZTogc3RyaW5nIH1cbiAgfCB7IHR5cGU6ICdVTlNFVCc7IG5hbWU6IHN0cmluZyB9O1xuXG5leHBvcnQgaW50ZXJmYWNlIEZlYXR1cmVzVHlwZVN0YXRlIHtcbiAgdmFsdWU6ICdyZWFkeSc7XG4gIGNvbnRleHQ6IEZlYXR1cmVzQ29udGV4dDtcbn1cblxuZXhwb3J0IHR5cGUgRmVhdHVyZXNTdGF0ZSA9IFN0YXRlRnJvbTx0eXBlb2YgRmVhdHVyZXNNYWNoaW5lPjtcbmV4cG9ydCB0eXBlIEZlYXR1cmVzRGlzcGF0Y2ggPSBJbnRlcnByZXRlckZyb208dHlwZW9mIEZlYXR1cmVzTWFjaGluZT5bJ3NlbmQnXTtcblxuZXhwb3J0IGZ1bmN0aW9uIHZhbHVlT2ZGZWF0dXJlKGZlYXR1cmVzU3RhdGU6IEZlYXR1cmVzU3RhdGUsIGZlYXR1cmU6IHN0cmluZyk6IFtGZWF0dXJlVmFsdWUsIGJvb2xlYW5dIHtcbiAgaWYgKGZlYXR1cmVzU3RhdGUuY29udGV4dC5mZWF0dXJlc1tmZWF0dXJlXSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIFt1bmRlZmluZWQsIGZhbHNlXTtcbiAgfVxuICBjb25zdCBmZWF0dXJlU3RhdGUgPSBmZWF0dXJlc1N0YXRlLmNvbnRleHQuZmVhdHVyZXNbZmVhdHVyZV0uZ2V0U25hcHNob3QoKTtcbiAgaWYgKGZlYXR1cmVTdGF0ZSAhPSBudWxsKSB7XG4gICAgcmV0dXJuIHZhbHVlRm9yU3RhdGUoZmVhdHVyZVN0YXRlKTtcbiAgfVxuICByZXR1cm4gW3VuZGVmaW5lZCwgZmFsc2VdO1xufVxuXG4vLy8gc3RhdGUgbWFjaGluZSB0aGF0IG1hbmFnZXMgYSBzZXQgb2YgZmVhdHVyZXMgd2l0aCB1c2VyLCBvcmcsIGFuZCBsb2NhbCBvdmVycmlkZXNcbmV4cG9ydCBjb25zdCBGZWF0dXJlc01hY2hpbmUgPSBjcmVhdGVNYWNoaW5lPEZlYXR1cmVzQ29udGV4dCwgRmVhdHVyZXNBY3Rpb24sIEZlYXR1cmVzVHlwZVN0YXRlPih7XG4gIGlkOiAnZmVhdHVyZXMnLFxuICBpbml0aWFsOiAnaWRsZScsXG4gIHByZWRpY3RhYmxlQWN0aW9uQXJndW1lbnRzOiB0cnVlLFxuICBjb250ZXh0OiB7XG4gICAgZmVhdHVyZXM6IHt9LFxuICB9LFxuICBzdGF0ZXM6IHtcbiAgICBpZGxlOiB7XG4gICAgICBvbjoge1xuICAgICAgICBJTklUOiB7XG4gICAgICAgICAgdGFyZ2V0OiAncmVhZHknLFxuICAgICAgICAgIGNvbmQ6IChfLCBlKSA9PiBlLmZlYXR1cmVzLmxlbmd0aCA+IDAsXG4gICAgICAgICAgYWN0aW9uczogYXNzaWduKHtcbiAgICAgICAgICAgIGZlYXR1cmVzOiAoY29udGV4dCwgZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgZmVhdHVyZXM6IHR5cGVvZiBjb250ZXh0LmZlYXR1cmVzID0ge307XG5cbiAgICAgICAgICAgICAgZm9yIChjb25zdCBmZWF0dXJlIG9mIGV2ZW50LmZlYXR1cmVzKSB7XG4gICAgICAgICAgICAgICAgZmVhdHVyZXNbZmVhdHVyZS5uYW1lXSA9IHNwYXduKEZlYXR1cmVNYWNoaW5lLCB7XG4gICAgICAgICAgICAgICAgICBuYW1lOiBmZWF0dXJlLm5hbWUsXG4gICAgICAgICAgICAgICAgICBzeW5jOiB0cnVlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGZlYXR1cmVzW2ZlYXR1cmUubmFtZV0uc2VuZCh7IHR5cGU6ICdJTklUJywgZmVhdHVyZSB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gZmVhdHVyZXM7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuXG4gICAgLy8gdGhlIGZlYXR1cmVzIGFyZSBsb2FkZWQgYW5kIHJlYWR5IHRvIGJlIHVzZWRcbiAgICByZWFkeToge1xuICAgICAgb246IHtcbiAgICAgICAgREVfSU5JVDogeyB0YXJnZXQ6ICdpZGxlJywgYWN0aW9uczogYXNzaWduKHsgZmVhdHVyZXM6IChfLCBfXykgPT4gKHt9KSB9KSB9LFxuICAgICAgICBTRVRfQUxMOiB7XG4gICAgICAgICAgYWN0aW9uczogYXNzaWduKHtcbiAgICAgICAgICAgIGZlYXR1cmVzOiAoY3R4LCBlKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGZlYXR1cmVzID0geyAuLi5jdHguZmVhdHVyZXMgfTtcbiAgICAgICAgICAgICAgLy8gQWxsIGNvbmZpZ3VyZWQgZmVhdHVyZXMgYXJlIHNldCB0byBvbi9vZmYgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICAgIE9iamVjdC5rZXlzKGZlYXR1cmVzKS5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgZmVhdHVyZXNbbmFtZV0uc2VuZCh7IHR5cGU6ICdTRVQnLCB2YWx1ZTogZS5mZWF0dXJlc1tuYW1lXSA/PyB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICByZXR1cm4gZmVhdHVyZXM7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuXG4gICAgICAgIC8vIFNldCBhIGZlYXR1cmUgdG8gYSB2YWx1ZVxuICAgICAgICBTRVQ6IHtcbiAgICAgICAgICBhY3Rpb25zOiAoY3R4LCBlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmZWF0dXJlID0gY3R4LmZlYXR1cmVzW2UubmFtZV07XG4gICAgICAgICAgICBpZiAoZmVhdHVyZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIGZlYXR1cmUuc2VuZCh7IHR5cGU6ICdTRVQnLCB2YWx1ZTogZS52YWx1ZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuXG4gICAgICAgIC8vIHRvZ2dsZSBhIGZlYXR1cmVcbiAgICAgICAgVE9HR0xFOiB7XG4gICAgICAgICAgYWN0aW9uczogKGN0eCwgZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmVhdHVyZSA9IGN0eC5mZWF0dXJlc1tlLm5hbWVdO1xuICAgICAgICAgICAgaWYgKGZlYXR1cmUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICBmZWF0dXJlLnNlbmQoeyB0eXBlOiAnVE9HR0xFJyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuXG4gICAgICAgIC8vIHdoZW4gYSBmZWF0dXJlIGlzIGVuYWJsZWQsIHNlbmQgdGhlIGVuYWJsZSBtZXNzYWdlIHRvIHRoZSBhY3RvclxuICAgICAgICBFTkFCTEU6IHtcbiAgICAgICAgICBhY3Rpb25zOiAoY3R4LCBlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmZWF0dXJlID0gY3R4LmZlYXR1cmVzW2UubmFtZV07XG4gICAgICAgICAgICBpZiAoZmVhdHVyZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIGZlYXR1cmUuc2VuZCh7IHR5cGU6ICdFTkFCTEUnIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8gd2hlbiBhIGZlYXR1cmUgaXMgZGlzYWJsZWQsIHNlbmQgdGhlIGRpc2FibGUgbWVzc2FnZSB0byB0aGUgYWN0b3JcbiAgICAgICAgRElTQUJMRToge1xuICAgICAgICAgIGFjdGlvbnM6IChjdHgsIGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZlYXR1cmUgPSBjdHguZmVhdHVyZXNbZS5uYW1lXTtcbiAgICAgICAgICAgIGlmIChmZWF0dXJlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgZmVhdHVyZS5zZW5kKHsgdHlwZTogJ0RJU0FCTEUnIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8gd2hlbiBhIGZlYXR1cmUgaXMgdW5zZXQsIHNlbmQgdGhlIHVuc2V0IG1lc3NhZ2UgdG8gdGhlIGFjdG9yXG4gICAgICAgIFVOU0VUOiB7XG4gICAgICAgICAgYWN0aW9uczogKGN0eCwgZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmVhdHVyZSA9IGN0eC5mZWF0dXJlc1tlLm5hbWVdO1xuICAgICAgICAgICAgaWYgKGZlYXR1cmUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICBmZWF0dXJlLnNlbmQoeyB0eXBlOiAnVU5TRVQnIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59KTtcbiIsICJpbXBvcnQgeyBhc3NpZ24sIGNyZWF0ZU1hY2hpbmUsIERvbmVJbnZva2VFdmVudCwgSW50ZXJwcmV0ZXJGcm9tLCBTdGF0ZUZyb20gfSBmcm9tICd4c3RhdGUnO1xuXG4vKipcbiAqIEZlYXR1cmUgaXMgZWl0aGVyIG9uLCBvZmYsIG9yICd1bnNldCcsXG4gKiB3aGljaCBtZWFucyBpdCB3aWxsIGdvIHRvIHRoZSBkZWZhdWx0IHZhbHVlIG9yIHRoZSBsZXNzIHNwZWNpZmljIHZhbHVlLlxuICovXG5leHBvcnQgdHlwZSBGZWF0dXJlVmFsdWUgPSBmYWxzZSB8IHRydWUgfCB1bmRlZmluZWQ7XG5cbmV4cG9ydCB0eXBlIEZlYXR1cmVTdGF0ZSA9IFN0YXRlRnJvbTx0eXBlb2YgRmVhdHVyZU1hY2hpbmU+O1xuZXhwb3J0IHR5cGUgRmVhdHVyZURpc3BhdGNoID0gSW50ZXJwcmV0ZXJGcm9tPHR5cGVvZiBGZWF0dXJlTWFjaGluZT5bJ3NlbmQnXTtcblxuLy8vIEdpdmVuIGEgZmVhdHVyZXN0YXRlLCBkZXRlcm1pbmUgdGhlIHZhbHVlIChvbiwgb2ZmLCBvciB1bnNldClcbmV4cG9ydCBmdW5jdGlvbiB2YWx1ZUZvclN0YXRlKGZlYXR1cmVTdGF0ZTogRmVhdHVyZVN0YXRlKTogW0ZlYXR1cmVWYWx1ZSwgYm9vbGVhbl0ge1xuICByZXR1cm4gW1xuICAgIGZlYXR1cmVTdGF0ZS5tYXRjaGVzKCdlbmFibGVkJykgPyB0cnVlIDogZmVhdHVyZVN0YXRlLm1hdGNoZXMoJ2Rpc2FibGVkJykgPyBmYWxzZSA6IHVuZGVmaW5lZCxcbiAgICBmZWF0dXJlU3RhdGUuY29udGV4dC5mZWF0dXJlRGVzYz8uZm9yY2UgPz8gZmFsc2UsXG4gIF07XG59XG5cbi8qKlxuICogRGVmaW5pdGlvbiBvZiBhIGZlYXR1cmUgdGhhdCBjYW4gYmUgZW5hYmxlZCBvciBkaXNhYmxlZC5cbiAqIEsgaXMgdGhlIHR5cGUgb2YgdGhlIGtleSB0aGF0IGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhlIGZlYXR1cmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmVhdHVyZURlc2NyaXB0aW9uPEsgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+IHtcbiAgcmVhZG9ubHkgbmFtZTogSztcbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLy8vIElmIHNldCwgd2lsbCBiZSB1c2VkIHRvIHVwZGF0ZSB0aGUgZmVhdHVyZSBkZWZhdWx0IHN0YXRlIGluc3RlYWQgb2Ygc2ltcGx5IG92ZXJyaWRpbmcuXG4gIC8vLyBGb3IgZXhhbXBsZSwgeW91IG1pZ2h0IHVzZSB0aGlzIHRvIHVwZGF0ZSBhIGZlYXR1cmUgZmxhZyBvbiBhIGJhY2tlbmQgc2VydmVyLlxuICAvLy8gd2hlbiBzZXQsIHRoZSBmZWF0dXJlIHdpbGwgYmUgdXBkYXRlZCBvbiB0aGUgYmFja2VuZCBzZXJ2ZXIsIGFuZCB0aGUgcmVzdWx0IG9mIHRoZSBhc3luY1xuICAvLy8gd2lsbCBiZSB1c2VkIGZvciB0aGUgZmluYWwgc3RhdGUgYWZ0ZXIgdGhlIGNoYW5nZS4gd2hpbGUgY2hhbmdpbmcsIHRoZSBmZWF0dXJlIHdpbGwgYmVcbiAgLy8vIGluIHRoZSAnY2hhbmdpbmcnIHN0YXRlLiBBbHNvIG5vdGUgdGhhdCB0aGUgZmVhdHVyZSB3aWxsIGJlIGNoYW5nZWQgYXQgdGhlIFwiZGVmYXVsdFwiIGxheWVyLlxuICByZWFkb25seSBvbkNoYW5nZURlZmF1bHQ/OiAobmFtZTogSywgbmV3VmFsdWU6IEZlYXR1cmVWYWx1ZSkgPT4gUHJvbWlzZTxGZWF0dXJlVmFsdWU+O1xuXG4gIC8vLyBpZiBzZXQgdHJ1ZSwgd2lsbCBmb3JjZSB0aGUgZmllbGQgdG8gd2hhdCBpdCBpcyBzZXQgaGVyZSB0aHJvdWdoIGxheWVycyBvZiBzdGF0ZXMuXG4gIC8vLyB1c2VmdWwgdG8gaW52ZXJ0IHRoZSBsYXllcnMsIHNpbWlsYXIgdG8gIWltcG9ydGFudCBpbiBDU1MuXG4gIHJlYWRvbmx5IGZvcmNlPzogYm9vbGVhbjtcblxuICAvLy8gSWYgc2V0IHRvIHRydWUsIHRoZSBmZWF0dXJlIHdpbGwgbm90IGJlIG92ZXJyaWRhYmxlIGJ5IHRoZSB1c2VyLlxuICByZWFkb25seSBub092ZXJyaWRlPzogYm9vbGVhbjtcblxuICAvLy8gY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB3aGF0IHNob3VsZCBoYXBwZW4gaWYgdGhlIGZlYXR1cmUgaXMgbm90IHNldCB0byBhIHBhcnRpY3VsYXIgdmFsdWUuXG4gIHJlYWRvbmx5IGRlZmF1bHRWYWx1ZT86IEZlYXR1cmVWYWx1ZTtcbn1cblxuaW50ZXJmYWNlIEZlYXR1cmVDb250ZXh0IHtcbiAgZmVhdHVyZURlc2M/OiBGZWF0dXJlRGVzY3JpcHRpb247XG59XG5cbnR5cGUgRmVhdHVyZVR5cGVTdGF0ZSA9XG4gIHwge1xuICAgICAgdmFsdWU6ICdhc3luY0RlbmFibGVkJztcbiAgICAgIGNvbnRleHQ6IEZlYXR1cmVDb250ZXh0O1xuICAgIH1cbiAgfCB7XG4gICAgICB2YWx1ZTogJ2FzeW5jRGlzYWJsZWQnO1xuICAgICAgY29udGV4dDogRmVhdHVyZUNvbnRleHQ7XG4gICAgfVxuICB8IHtcbiAgICAgIHZhbHVlOiAnYXN5bmNVbnNwZWNpZWQnO1xuICAgICAgY29udGV4dDogRmVhdHVyZUNvbnRleHQ7XG4gICAgfVxuICB8IHtcbiAgICAgIHZhbHVlOiAnZGlzYWJsZWQnO1xuICAgICAgY29udGV4dDogRmVhdHVyZUNvbnRleHQ7XG4gICAgfVxuICB8IHtcbiAgICAgIHZhbHVlOiAnZW5hYmxlZCc7XG4gICAgICBjb250ZXh0OiBGZWF0dXJlQ29udGV4dDtcbiAgICB9XG4gIHwge1xuICAgICAgdmFsdWU6ICdpbml0aWFsJztcbiAgICAgIGNvbnRleHQ6IG5ldmVyO1xuICAgIH1cbiAgfCB7XG4gICAgICB2YWx1ZTogJ3Vuc3BlY2llZCc7XG4gICAgICBjb250ZXh0OiBGZWF0dXJlQ29udGV4dDtcbiAgICB9O1xuXG4vKipcbiAqIEFjdGlvbnMgdGhhdCBjYW4gYmUgcGVyZm9ybWVkIG9uIGEgZmVhdHVyZS5cbiAqL1xuZXhwb3J0IHR5cGUgRmVhdHVyZUFjdGlvbiA9XG4gIHwgeyB0eXBlOiAnRElTQUJMRScgfVxuICB8IHsgdHlwZTogJ0VOQUJMRScgfVxuICB8IHsgdHlwZTogJ0lOSVQnOyBmZWF0dXJlOiBGZWF0dXJlRGVzY3JpcHRpb24gfVxuICB8IHsgdHlwZTogJ1NFVCc7IHZhbHVlOiBGZWF0dXJlVmFsdWUgfVxuICB8IHsgdHlwZTogJ1RPR0dMRScgfVxuICB8IHsgdHlwZTogJ1VOU0VUJyB9O1xuXG4vKipcbiAqIEZ1bGx5IGRlc2NyaWJlIHRoZSBzdGF0ZXMgYSBmZWF0dXJlIGNhbiBiZSBpblxuICovXG5leHBvcnQgY29uc3QgRmVhdHVyZU1hY2hpbmUgPSBjcmVhdGVNYWNoaW5lPEZlYXR1cmVDb250ZXh0LCBGZWF0dXJlQWN0aW9uLCBGZWF0dXJlVHlwZVN0YXRlPih7XG4gIGlkOiAnZmVhdHVyZScsXG4gIGluaXRpYWw6ICdpbml0aWFsJyxcbiAgY29udGV4dDoge30sXG4gIHByZWRpY3RhYmxlQWN0aW9uQXJndW1lbnRzOiB0cnVlLFxuICBvbjoge1xuICAgIEVOQUJMRTogW1xuICAgICAgeyB0YXJnZXQ6ICdhc3luY0VuYWJsZWQnLCBjb25kOiAoY3R4KSA9PiBjdHguZmVhdHVyZURlc2M/Lm9uQ2hhbmdlRGVmYXVsdCAhPSBudWxsIH0sXG4gICAgICB7IHRhcmdldDogJ2VuYWJsZWQnIH0sXG4gICAgXSxcblxuICAgIFRPR0dMRTogW1xuICAgICAgeyB0YXJnZXQ6ICdhc3luY0VuYWJsZWQnLCBjb25kOiAoY3R4KSA9PiBjdHguZmVhdHVyZURlc2M/Lm9uQ2hhbmdlRGVmYXVsdCAhPSBudWxsIH0sXG4gICAgICB7IHRhcmdldDogJ2VuYWJsZWQnIH0sXG4gICAgXSxcblxuICAgIERJU0FCTEU6IFtcbiAgICAgIHsgdGFyZ2V0OiAnYXN5bmNEaXNhYmxlZCcsIGNvbmQ6IChjdHgpID0+IGN0eC5mZWF0dXJlRGVzYz8ub25DaGFuZ2VEZWZhdWx0ICE9IG51bGwgfSxcbiAgICAgIHsgdGFyZ2V0OiAnZGlzYWJsZWQnIH0sXG4gICAgXSxcblxuICAgIFVOU0VUOiBbXG4gICAgICB7IHRhcmdldDogJ2FzeW5jVW5zcGVjaWVkJywgY29uZDogKGN0eCkgPT4gY3R4LmZlYXR1cmVEZXNjPy5vbkNoYW5nZURlZmF1bHQgIT0gbnVsbCB9LFxuICAgICAgeyB0YXJnZXQ6ICd1bnNwZWNpZmllZCcgfSxcbiAgICBdLFxuXG4gICAgU0VUOiBbXG4gICAgICB7XG4gICAgICAgIHRhcmdldDogJ2FzeW5jRW5hYmxlZCcsXG4gICAgICAgIGNvbmQ6IChjdHgsIGUpID0+IGUudmFsdWUgPT09IHRydWUgJiYgY3R4LmZlYXR1cmVEZXNjPy5vbkNoYW5nZURlZmF1bHQgIT0gbnVsbCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHRhcmdldDogJ2FzeW5jRGlzYWJsZWQnLFxuICAgICAgICBjb25kOiAoY3R4LCBlKSA9PiBlLnZhbHVlID09PSBmYWxzZSAmJiBjdHguZmVhdHVyZURlc2M/Lm9uQ2hhbmdlRGVmYXVsdCAhPSBudWxsLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdGFyZ2V0OiAnYXN5bmNVbnNwZWNpZWQnLFxuICAgICAgICBjb25kOiAoY3R4LCBfZSkgPT4gY3R4LmZlYXR1cmVEZXNjPy5vbkNoYW5nZURlZmF1bHQgIT0gbnVsbCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHRhcmdldDogJ2VuYWJsZWQnLFxuICAgICAgICBjb25kOiAoX2N0eCwgZSkgPT4gZS52YWx1ZSA9PT0gdHJ1ZSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHRhcmdldDogJ2Rpc2FibGVkJyxcbiAgICAgICAgY29uZDogKF9jdHgsIGUpID0+IGUudmFsdWUgPT09IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIHsgdGFyZ2V0OiAndW5zcGVjaWZpZWQnIH0sXG4gICAgXSxcbiAgfSxcblxuICBzdGF0ZXM6IHtcbiAgICBpbml0aWFsOiB7XG4gICAgICBvbjoge1xuICAgICAgICBJTklUOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uczogYXNzaWduKHsgZmVhdHVyZURlc2M6IChfLCBlKSA9PiBlLmZlYXR1cmUgfSksXG4gICAgICAgICAgICB0YXJnZXQ6ICdlbmFibGVkJyxcbiAgICAgICAgICAgIGNvbmQ6IChfLCBlKSA9PiBlLmZlYXR1cmUuZGVmYXVsdFZhbHVlID09PSB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uczogYXNzaWduKHsgZmVhdHVyZURlc2M6IChfLCBlKSA9PiBlLmZlYXR1cmUgfSksXG4gICAgICAgICAgICB0YXJnZXQ6ICd1bnNwZWNpZmllZCcsXG4gICAgICAgICAgICBjb25kOiAoXywgZSkgPT4gZS5mZWF0dXJlLmRlZmF1bHRWYWx1ZSA9PT0gdW5kZWZpbmVkLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uczogYXNzaWduKHsgZmVhdHVyZURlc2M6IChfLCBlKSA9PiBlLmZlYXR1cmUgfSksXG4gICAgICAgICAgICB0YXJnZXQ6ICdkaXNhYmxlZCcsXG4gICAgICAgICAgICBjb25kOiAoXywgZSkgPT4gZS5mZWF0dXJlLmRlZmF1bHRWYWx1ZSA9PT0gZmFsc2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIHVuc3BlY2lmaWVkOiB7fSxcbiAgICBkaXNhYmxlZDoge30sXG4gICAgZW5hYmxlZDoge30sXG5cbiAgICBhc3luY0Rpc2FibGVkOiB7XG4gICAgICBpbnZva2U6IHtcbiAgICAgICAgaWQ6ICdzZXQtb2ZmLXVwc3RyZWFtJyxcbiAgICAgICAgc3JjOiBhc3luYyAoY3R4KSA9PiB7XG4gICAgICAgICAgY29uc3Qgb25jaGFuZ2UgPSBjdHguZmVhdHVyZURlc2M/Lm9uQ2hhbmdlRGVmYXVsdDtcbiAgICAgICAgICBpZiAob25jaGFuZ2UgIT0gbnVsbCAmJiBjdHguZmVhdHVyZURlc2MgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG9uY2hhbmdlKGN0eC5mZWF0dXJlRGVzYy5uYW1lLCBmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH0sXG4gICAgICAgIG9uRG9uZTogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRhcmdldDogJ2VuYWJsZWQnLFxuICAgICAgICAgICAgY29uZDogKF9jdHgsIGU6IERvbmVJbnZva2VFdmVudDxGZWF0dXJlVmFsdWU+KSA9PiBlLmRhdGEgPT09IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0YXJnZXQ6ICdkaXNhYmxlZCcsXG4gICAgICAgICAgICBjb25kOiAoX2N0eCwgZTogRG9uZUludm9rZUV2ZW50PEZlYXR1cmVWYWx1ZT4pID0+IGUuZGF0YSA9PT0gZmFsc2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IHRhcmdldDogJ3Vuc3BlY2lmaWVkJyB9LFxuICAgICAgICBdLFxuICAgICAgICBvbkVycm9yOiAndW5zcGVjaWZpZWQnLFxuICAgICAgfSxcbiAgICB9LFxuXG4gICAgYXN5bmNVbnNwZWNpZWQ6IHtcbiAgICAgIGludm9rZToge1xuICAgICAgICBpZDogJ3NldC11bnNldC11cHN0cmVhbScsXG4gICAgICAgIHNyYzogYXN5bmMgKGN0eCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG9uY2hhbmdlID0gY3R4LmZlYXR1cmVEZXNjPy5vbkNoYW5nZURlZmF1bHQ7XG4gICAgICAgICAgaWYgKG9uY2hhbmdlICE9IG51bGwgJiYgY3R4LmZlYXR1cmVEZXNjICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBvbmNoYW5nZShjdHguZmVhdHVyZURlc2MubmFtZSwgdW5kZWZpbmVkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfSxcbiAgICAgICAgb25Eb25lOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdGFyZ2V0OiAnZW5hYmxlZCcsXG4gICAgICAgICAgICBjb25kOiAoX2N0eCwgZTogRG9uZUludm9rZUV2ZW50PEZlYXR1cmVWYWx1ZT4pID0+IGUuZGF0YSA9PT0gdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRhcmdldDogJ2Rpc2FibGVkJyxcbiAgICAgICAgICAgIGNvbmQ6IChfY3R4LCBlOiBEb25lSW52b2tlRXZlbnQ8RmVhdHVyZVZhbHVlPikgPT4gZS5kYXRhID09PSBmYWxzZSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHsgdGFyZ2V0OiAndW5zcGVjaWZpZWQnIH0sXG4gICAgICAgIF0sXG4gICAgICAgIG9uRXJyb3I6ICd1bnNwZWNpZmllZCcsXG4gICAgICB9LFxuICAgIH0sXG5cbiAgICBhc3luY0VuYWJsZWQ6IHtcbiAgICAgIGludm9rZToge1xuICAgICAgICBpZDogJ3NldC1vbi11cHN0cmVhbScsXG4gICAgICAgIHNyYzogYXN5bmMgKGN0eCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG9uY2hhbmdlID0gY3R4LmZlYXR1cmVEZXNjPy5vbkNoYW5nZURlZmF1bHQ7XG4gICAgICAgICAgaWYgKG9uY2hhbmdlICE9IG51bGwgJiYgY3R4LmZlYXR1cmVEZXNjICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBvbmNoYW5nZShjdHguZmVhdHVyZURlc2MubmFtZSwgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH0sXG4gICAgICAgIG9uRG9uZTogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRhcmdldDogJ2VuYWJsZWQnLFxuICAgICAgICAgICAgY29uZDogKF9jdHgsIGU6IERvbmVJbnZva2VFdmVudDxGZWF0dXJlVmFsdWU+KSA9PiBlLmRhdGEgPT09IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0YXJnZXQ6ICdkaXNhYmxlZCcsXG4gICAgICAgICAgICBjb25kOiAoX2N0eCwgZTogRG9uZUludm9rZUV2ZW50PEZlYXR1cmVWYWx1ZT4pID0+IGUuZGF0YSA9PT0gZmFsc2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IHRhcmdldDogJ3Vuc3BlY2lmaWVkJyB9LFxuICAgICAgICBdLFxuICAgICAgICBvbkVycm9yOiAndW5zcGVjaWZpZWQnLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxufSk7XG4iLCAiaW1wb3J0IFJlYWN0LCB7IHVzZU1lbW8sIFJlYWN0Tm9kZSwgdXNlRWZmZWN0LCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCB7IHVzZU1hY2hpbmUgfSBmcm9tICdAeHN0YXRlL3JlYWN0JztcblxuaW1wb3J0IHsgRW5hYmxlQ29udGV4dCB9IGZyb20gJy4vRW5hYmxlQ29udGV4dCc7XG5pbXBvcnQgeyBGZWF0dXJlQ29udGV4dCB9IGZyb20gJy4vRmVhdHVyZUNvbnRleHQnO1xuaW1wb3J0IHsgRmVhdHVyZXNNYWNoaW5lIH0gZnJvbSAnLi9GZWF0dXJlc1N0YXRlJztcbmltcG9ydCB7IEZlYXR1cmVEZXNjcmlwdGlvbiB9IGZyb20gJy4vRmVhdHVyZVN0YXRlJztcbmltcG9ydCB1c2VDb25zb2xlT3ZlcnJpZGUgZnJvbSAnLi91c2VDb25zb2xlT3ZlcnJpZGUnO1xuaW1wb3J0IHVzZVBlcnNpc3QsIHsgS0VZIH0gZnJvbSAnLi91c2VQZXJzaXN0JztcbmltcG9ydCB1c2VUZXN0Q2FsbGJhY2sgZnJvbSAnLi91c2VUZXN0Q2FsbGJhY2snO1xuXG5pbnRlcmZhY2UgRmVhdHVyZVByb3BzIHtcbiAgcmVhZG9ubHkgZmVhdHVyZXM6IHJlYWRvbmx5IEZlYXR1cmVEZXNjcmlwdGlvbltdO1xuICByZWFkb25seSBjaGlsZHJlbj86IFJlYWN0Tm9kZTtcbiAgcmVhZG9ubHkgZGlzYWJsZUNvbnNvbGU/OiBib29sZWFuO1xuICByZWFkb25seSBzdG9yYWdlPzogU3RvcmFnZTtcbn1cblxuLyoqXG4gKiBBIG1vcmUgYmF0dGVyaWVzLWVuYWJsZWQgcGFyZW50IGNvbXBvbmVudCB0aGF0IGtlZXBzIHRyYWNrIG9mIGZlYXR1cmUgc3RhdGVcbiAqIGludGVybmFsbHksIGFuZCBjcmVhdGVzIHdpbmRvdy5mZWF0dXJlLmVuYWJsZShcImZcIikgYW5kIHdpbmRvdy5mZWF0dXJlLmRpc2FibGUoXCJmXCIpLlxuICogS2VlcHMgdHJhY2sgb2Ygb3ZlcnJpZGVzIGFuZCBkZWZhdWx0cywgd2l0aCBkZWZhdWx0cyBwb3RlbnRpYWxseSBjb21pbmcgZnJvbSB5b3VyIHByb3BzXG4gKiBhbmQgb3ZlcnJpZGVzIGJlaW5nIHBlcnNpc3RlZCB0byB5b3VyIGNob2ljZSBvZiBzdG9yYWdlIGxheWVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gRmVhdHVyZXMoe1xuICBjaGlsZHJlbixcbiAgZmVhdHVyZXMsXG4gIGRpc2FibGVDb25zb2xlID0gZmFsc2UsXG4gIHN0b3JhZ2UgPSB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UsXG59OiBGZWF0dXJlUHJvcHMpOiBKU1guRWxlbWVudCB7XG4gIC8vIENhcHR1cmUgb25seSBmaXJzdCB2YWx1ZTsgd2UgZG9uJ3QgY2FyZSBhYm91dCBmdXR1cmUgdXBkYXRlc1xuICBjb25zdCBmZWF0dXJlc1JlZiA9IHVzZVJlZihmZWF0dXJlcyk7XG4gIGNvbnN0IFtvdmVycmlkZXNTdGF0ZSwgb3ZlcnJpZGVzU2VuZF0gPSB1c2VNYWNoaW5lKEZlYXR1cmVzTWFjaGluZSk7XG4gIGNvbnN0IFtkZWZhdWx0c1N0YXRlLCBkZWZhdWx0c1NlbmRdID0gdXNlTWFjaGluZShGZWF0dXJlc01hY2hpbmUpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgLy8vIExvYWQgZGVmYXVsdHNcbiAgICBkZWZhdWx0c1NlbmQoeyB0eXBlOiAnSU5JVCcsIGZlYXR1cmVzIH0pO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBkZWZhdWx0c1NlbmQoeyB0eXBlOiAnREVfSU5JVCcgfSk7XG4gICAgfTtcbiAgfSwgW2RlZmF1bHRzU2VuZCwgZmVhdHVyZXNdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGxldCBmOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuIHwgdW5kZWZpbmVkPiA9IHt9O1xuICAgIGlmIChzdG9yYWdlICE9IG51bGwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGZlYXR1cmVzSnNvbiA9IHN0b3JhZ2UuZ2V0SXRlbShLRVkpO1xuICAgICAgICBpZiAoZmVhdHVyZXNKc29uICE9IG51bGwpIHtcbiAgICAgICAgICBjb25zdCBmaCA9IEpTT04ucGFyc2UoZmVhdHVyZXNKc29uKTtcbiAgICAgICAgICBmID0gZmgub3ZlcnJpZGVzO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIENhbid0IHBhcnNlIG9yIGdldCBvciBvdGhlcndpc2U7IGlnbm9yZVxuICAgICAgICBjb25zb2xlLmVycm9yKCdlcnJvciBpbiBsb2NhbFN0b3JhZ2UnLCBlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBvdmVycmlkZXNTZW5kKHtcbiAgICAgIHR5cGU6ICdJTklUJyxcbiAgICAgIGZlYXR1cmVzOiBmZWF0dXJlc1JlZi5jdXJyZW50XG4gICAgICAgIC5maWx0ZXIoKHgpID0+IHgubm9PdmVycmlkZSAhPT0gdHJ1ZSlcbiAgICAgICAgLm1hcCgoeCkgPT4gKHsgbmFtZTogeC5uYW1lLCBkZXNjcmlwdGlvbjogeC5kZXNjcmlwdGlvbiwgZGVmYXVsdFZhbHVlOiBmPy5beC5uYW1lXSA/PyB1bmRlZmluZWQgfSkpLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIG92ZXJyaWRlc1NlbmQoeyB0eXBlOiAnREVfSU5JVCcgfSk7XG4gICAgfTtcbiAgfSwgW2ZlYXR1cmVzUmVmLCBvdmVycmlkZXNTZW5kLCBzdG9yYWdlXSk7XG5cbiAgdXNlUGVyc2lzdChzdG9yYWdlLCBmZWF0dXJlc1JlZi5jdXJyZW50LCBvdmVycmlkZXNTdGF0ZSk7XG5cbiAgY29uc3QgdGVzdENhbGxiYWNrID0gdXNlVGVzdENhbGxiYWNrKG92ZXJyaWRlc1N0YXRlLCBkZWZhdWx0c1N0YXRlKTtcbiAgdXNlQ29uc29sZU92ZXJyaWRlKCFkaXNhYmxlQ29uc29sZSwgZmVhdHVyZXNSZWYuY3VycmVudCwgdGVzdENhbGxiYWNrLCBkZWZhdWx0c1NlbmQpO1xuXG4gIGNvbnN0IGZlYXR1cmVWYWx1ZSA9IHVzZU1lbW8oXG4gICAgKCkgPT4gKHtcbiAgICAgIG92ZXJyaWRlc1NlbmQsXG4gICAgICBkZWZhdWx0c1NlbmQsXG4gICAgICBmZWF0dXJlc0Rlc2NyaXB0aW9uOiBmZWF0dXJlc1JlZi5jdXJyZW50LFxuICAgICAgb3ZlcnJpZGVzU3RhdGUsXG4gICAgICBkZWZhdWx0c1N0YXRlLFxuICAgICAgdGVzdDogdGVzdENhbGxiYWNrLFxuICAgIH0pLFxuICAgIFtvdmVycmlkZXNTZW5kLCBkZWZhdWx0c1NlbmQsIG92ZXJyaWRlc1N0YXRlLCBkZWZhdWx0c1N0YXRlLCB0ZXN0Q2FsbGJhY2tdXG4gICk7XG5cbiAgcmV0dXJuIChcbiAgICA8RmVhdHVyZUNvbnRleHQuUHJvdmlkZXIgdmFsdWU9e2ZlYXR1cmVWYWx1ZX0+XG4gICAgICA8RW5hYmxlQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17dGVzdENhbGxiYWNrfT57Y2hpbGRyZW59PC9FbmFibGVDb250ZXh0LlByb3ZpZGVyPlxuICAgIDwvRmVhdHVyZUNvbnRleHQuUHJvdmlkZXI+XG4gICk7XG59XG4iLCAiaW1wb3J0IHsgY3JlYXRlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHsgRmVhdHVyZVZhbHVlIH0gZnJvbSAnLi9GZWF0dXJlU3RhdGUnO1xuXG5leHBvcnQgdHlwZSBFbmFibGVDb250ZXh0VHlwZSA9IChmZWF0dXJlOiBzdHJpbmcpID0+IEZlYXR1cmVWYWx1ZTtcblxuLyoqXG4gKiBDb250YWluZWQgZnVuY3Rpb24gY2FuIGNoZWNrIHdoZXRoZXIgYSBnaXZlbiBmZWF0dXJlIGlzIGVuYWJsZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBFbmFibGVDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxFbmFibGVDb250ZXh0VHlwZT4oKF9zKSA9PiBmYWxzZSk7XG4iLCAiaW1wb3J0IHsgY3JlYXRlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHsgRmVhdHVyZXNEaXNwYXRjaCwgRmVhdHVyZXNTdGF0ZSB9IGZyb20gJy4vRmVhdHVyZXNTdGF0ZSc7XG5pbXBvcnQgeyBGZWF0dXJlRGVzY3JpcHRpb24sIEZlYXR1cmVWYWx1ZSB9IGZyb20gJy4vRmVhdHVyZVN0YXRlJztcblxuZXhwb3J0IGNvbnN0IEZlYXR1cmVDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxGZWF0dXJlQ29udGV4dFR5cGUgfCBudWxsPihudWxsKTtcblxuLy8vIEdpdmUgYWNjZXNzIHRvIHRoZSBvdmVycmlkZXMgbGF5ZXJcbmV4cG9ydCBpbnRlcmZhY2UgRmVhdHVyZUNvbnRleHRUeXBlIHtcbiAgLy8gTWFrZSBjaGFuZ2VzIHRvIHRoZSBvdmVycmlkZXNcbiAgb3ZlcnJpZGVzU2VuZDogRmVhdHVyZXNEaXNwYXRjaDtcblxuICAvLyBNYWtlIGNoYW5nZXMgdG8gZGVmYXVsdHNcbiAgZGVmYXVsdHNTZW5kOiBGZWF0dXJlc0Rpc3BhdGNoO1xuXG4gIGZlYXR1cmVzRGVzY3JpcHRpb246IHJlYWRvbmx5IEZlYXR1cmVEZXNjcmlwdGlvbltdO1xuXG4gIC8vIFN0YXRlIGlzIGluIGxheWVyczsgb3ZlcnJpZGVzIGFuZCBkZWZhdWx0c1xuICBvdmVycmlkZXNTdGF0ZTogRmVhdHVyZXNTdGF0ZTtcbiAgZGVmYXVsdHNTdGF0ZTogRmVhdHVyZXNTdGF0ZTtcblxuICAvLy8gVGVzdCB3aXRoIHByb3BlciBmYWxsYmFjayBhbmQgcmVzcGVjdGluZyB0aGUgdXNlcidzIGZvcmNlIHByZWZlcmVuY2VcbiAgdGVzdDogKGZsYWc6IHN0cmluZykgPT4gRmVhdHVyZVZhbHVlO1xufVxuIiwgImltcG9ydCB7IHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHsgRmVhdHVyZXNEaXNwYXRjaCB9IGZyb20gJy4vRmVhdHVyZXNTdGF0ZSc7XG5pbXBvcnQgeyBGZWF0dXJlRGVzY3JpcHRpb24sIEZlYXR1cmVWYWx1ZSB9IGZyb20gJy4vRmVhdHVyZVN0YXRlJztcbmltcG9ydCB7IEdsb2JhbEVuYWJsZSB9IGZyb20gJy4vR2xvYmFsRW5hYmxlJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlQ29uc29sZU92ZXJyaWRlKFxuICBjb25zb2xlT3ZlcnJpZGU6IGJvb2xlYW4sXG4gIGZlYXR1cmVzOiByZWFkb25seSBGZWF0dXJlRGVzY3JpcHRpb25bXSxcbiAgdGVzdEZlYXR1cmU6IChfOiBzdHJpbmcpID0+IEZlYXR1cmVWYWx1ZSxcbiAgZGlzcGF0Y2g6IEZlYXR1cmVzRGlzcGF0Y2hcbik6IHZvaWQge1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghY29uc29sZU92ZXJyaWRlKSB7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAvKiBlbXB0eSAqL1xuICAgICAgfTtcbiAgICB9XG4gICAgd2luZG93LmZlYXR1cmUgPSBuZXcgR2xvYmFsRW5hYmxlKGRpc3BhdGNoLCB0ZXN0RmVhdHVyZSwgZmVhdHVyZXMpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBpZiAod2luZG93LmZlYXR1cmUgIT0gbnVsbCkge1xuICAgICAgICBkZWxldGUgd2luZG93LmZlYXR1cmU7XG4gICAgICB9XG4gICAgfTtcbiAgfSwgW2ZlYXR1cmVzLCBkaXNwYXRjaCwgY29uc29sZU92ZXJyaWRlLCB0ZXN0RmVhdHVyZV0pO1xufVxuIiwgImltcG9ydCB7IEZlYXR1cmVzRGlzcGF0Y2ggfSBmcm9tICcuL0ZlYXR1cmVzU3RhdGUnO1xuaW1wb3J0IHsgRmVhdHVyZURlc2NyaXB0aW9uLCBGZWF0dXJlVmFsdWUgfSBmcm9tICcuL0ZlYXR1cmVTdGF0ZSc7XG5cbmV4cG9ydCBjbGFzcyBHbG9iYWxFbmFibGUge1xuICBwcml2YXRlIHJlYWRvbmx5IGZlYXR1cmVEZXNjOiByZWFkb25seSBGZWF0dXJlRGVzY3JpcHRpb25bXTtcbiAgcHJpdmF0ZSByZWFkb25seSBkaXNwYXRjaDogRmVhdHVyZXNEaXNwYXRjaDtcbiAgcHJpdmF0ZSByZWFkb25seSB0ZXN0RmVhdHVyZTogKHZhbHVlOiBzdHJpbmcpID0+IEZlYXR1cmVWYWx1ZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBkaXNwYXRjaDogRmVhdHVyZXNEaXNwYXRjaCxcbiAgICB0ZXN0RmVhdHVyZTogKF86IHN0cmluZykgPT4gRmVhdHVyZVZhbHVlLFxuICAgIGZlYXR1cmVEZXNjOiByZWFkb25seSBGZWF0dXJlRGVzY3JpcHRpb25bXVxuICApIHtcbiAgICB0aGlzLmZlYXR1cmVEZXNjID0gZmVhdHVyZURlc2M7XG4gICAgdGhpcy5kaXNwYXRjaCA9IGRpc3BhdGNoO1xuICAgIHRoaXMudGVzdEZlYXR1cmUgPSB0ZXN0RmVhdHVyZTtcbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGUoZmVhdHVyZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwYXRjaCh7IHR5cGU6ICdUT0dHTEUnLCBuYW1lOiBmZWF0dXJlIH0pO1xuICB9XG5cbiAgcHVibGljIGVuYWJsZShmZWF0dXJlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BhdGNoKHsgdHlwZTogJ0VOQUJMRScsIG5hbWU6IGZlYXR1cmUgfSk7XG4gIH1cblxuICBwdWJsaWMgdW5zZXQoZmVhdHVyZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwYXRjaCh7IHR5cGU6ICdVTlNFVCcsIG5hbWU6IGZlYXR1cmUgfSk7XG4gIH1cblxuICBwdWJsaWMgZGlzYWJsZShmZWF0dXJlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BhdGNoKHsgdHlwZTogJ0RJU0FCTEUnLCBuYW1lOiBmZWF0dXJlIH0pO1xuICB9XG5cbiAgcHVibGljIHNldEFsbChmZWF0dXJlczogeyBba2V5OiBzdHJpbmddOiBGZWF0dXJlVmFsdWUgfSk6IHZvaWQge1xuICAgIHRoaXMuZGlzcGF0Y2goeyB0eXBlOiAnU0VUX0FMTCcsIGZlYXR1cmVzIH0pO1xuICB9XG5cbiAgcHVibGljIGxpc3RGZWF0dXJlcygpOiByZWFkb25seSBbc3RyaW5nLCBGZWF0dXJlVmFsdWVdW10ge1xuICAgIHJldHVybiB0aGlzLmZlYXR1cmVEZXNjLm1hcCgoZikgPT4gW2YubmFtZSwgdGhpcy50ZXN0RmVhdHVyZShmLm5hbWUpXSk7XG4gIH1cbn1cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgZmVhdHVyZT86IEdsb2JhbEVuYWJsZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IHVzZU1lbW8sIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHsgRmVhdHVyZXNTdGF0ZSwgdmFsdWVPZkZlYXR1cmUgfSBmcm9tICcuL0ZlYXR1cmVzU3RhdGUnO1xuaW1wb3J0IHsgRmVhdHVyZURlc2NyaXB0aW9uLCBGZWF0dXJlVmFsdWUgfSBmcm9tICcuL0ZlYXR1cmVTdGF0ZSc7XG5cbmV4cG9ydCBjb25zdCBLRVkgPSAncmVhY3QtZW5hYmxlOmZlYXR1cmUtdmFsdWVzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlUGVyc2lzdChcbiAgc3RvcmFnZTogU3RvcmFnZSB8IHVuZGVmaW5lZCxcbiAgZmVhdHVyZXM6IHJlYWRvbmx5IEZlYXR1cmVEZXNjcmlwdGlvbltdLFxuICBvdmVycmlkZVN0YXRlOiBGZWF0dXJlc1N0YXRlXG4pOiB2b2lkIHtcbiAgY29uc3Qgb3ZlcnJpZGVzID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgbmV3T3ZlcnJpZGVzOiB7IFtrZXk6IHN0cmluZ106IEZlYXR1cmVWYWx1ZSB9ID0ge307XG4gICAgaWYgKG92ZXJyaWRlU3RhdGUubWF0Y2hlcygncmVhZHknKSkge1xuICAgICAgZm9yIChjb25zdCBmZWF0dXJlIG9mIGZlYXR1cmVzKSB7XG4gICAgICAgIGNvbnN0IFt2YWx1ZV0gPSB2YWx1ZU9mRmVhdHVyZShvdmVycmlkZVN0YXRlLCBmZWF0dXJlLm5hbWUpO1xuICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgIG5ld092ZXJyaWRlc1tmZWF0dXJlLm5hbWVdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ld092ZXJyaWRlcztcbiAgfSwgW2ZlYXR1cmVzLCBvdmVycmlkZVN0YXRlXSk7XG5cbiAgY29uc3Qgc3RyU3RhdGUgPSBPYmplY3Qua2V5cyhvdmVycmlkZXMpLmxlbmd0aCA9PT0gMCB8fCBzdG9yYWdlID09IG51bGwgPyAne30nIDogSlNPTi5zdHJpbmdpZnkoeyBvdmVycmlkZXMgfSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICB0cnkge1xuICAgICAgaWYgKHN0b3JhZ2UgIT0gbnVsbCAmJiBvdmVycmlkZVN0YXRlLm1hdGNoZXMoJ3JlYWR5JykpIHtcbiAgICAgICAgc3RvcmFnZS5zZXRJdGVtKEtFWSwgc3RyU3RhdGUpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIENhbid0IHNldCBmb3Igc29tZSByZWFzb25cbiAgICB9XG4gIH0sIFtvdmVycmlkZVN0YXRlLCBzdG9yYWdlLCBzdHJTdGF0ZV0pO1xufVxuIiwgImltcG9ydCB7IHVzZUNhbGxiYWNrIH0gZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgeyBGZWF0dXJlc1N0YXRlIH0gZnJvbSAnLi9GZWF0dXJlc1N0YXRlJztcbmltcG9ydCB0ZXN0RmVhdHVyZSBmcm9tICcuL3Rlc3RGZWF0dXJlJztcblxuLy8vIEEgY2FsbGJhY2sgdGhhdCBjYW4gYmUgY2FsbGVkIHRvIHRlc3QgaWYgYSBmZWF0dXJlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWRcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZVRlc3RDYWxsYmFjayhcbiAgZGVmYXVsdHNTdGF0ZTogRmVhdHVyZXNTdGF0ZSxcbiAgb3ZlcnJpZGVzU3RhdGU6IEZlYXR1cmVzU3RhdGVcbik6IChmZWF0dXJlOiBzdHJpbmcpID0+IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICByZXR1cm4gdXNlQ2FsbGJhY2soKGY6IHN0cmluZykgPT4gdGVzdEZlYXR1cmUoZiwgW2RlZmF1bHRzU3RhdGUsIG92ZXJyaWRlc1N0YXRlXSksIFtkZWZhdWx0c1N0YXRlLCBvdmVycmlkZXNTdGF0ZV0pO1xufVxuIiwgImltcG9ydCB7IEZlYXR1cmVzU3RhdGUsIHZhbHVlT2ZGZWF0dXJlIH0gZnJvbSAnLi9GZWF0dXJlc1N0YXRlJztcbmltcG9ydCB7IEZlYXR1cmVWYWx1ZSB9IGZyb20gJy4vRmVhdHVyZVN0YXRlJztcblxuLyoqIERldGVybWluZSBpZiB0aGUgZmVhdHVyZSBpcyBlbmFibGVkIGluIG9uZSBvZiB0aGUgc3RhdGUgbWFjaGluZXMsIGluIG9yZGVyXG4gKlxuICogQHBhcmFtIHN0YXRlIFRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBtYWNoaW5lXG4gKiBAcGFyYW0gZmVhdHVyZSBUaGUgZmVhdHVyZSB0byBjaGVja1xuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRlc3RGZWF0dXJlKGZlYXR1cmU6IHN0cmluZywgc3RhdGVzOiBGZWF0dXJlc1N0YXRlW10pOiBGZWF0dXJlVmFsdWUge1xuICBjb25zdCB2YWx1ZXMgPSBzdGF0ZXMubWFwKChzdGF0ZSkgPT4gdmFsdWVPZkZlYXR1cmUoc3RhdGUsIGZlYXR1cmUpKTtcblxuICAvLyBsb29rIGZvciBiZXN0IGZvcmNlZCBvcHRpb24sIGluIG9yZGVyXG4gIGZvciAoY29uc3QgW2ZlYXR1cmVWYWx1ZSwgZmVhdHVyZUZvcmNlZF0gb2YgdmFsdWVzKSB7XG4gICAgaWYgKGZlYXR1cmVWYWx1ZSAhPSBudWxsICYmIGZlYXR1cmVGb3JjZWQpIHtcbiAgICAgIHJldHVybiBmZWF0dXJlVmFsdWU7XG4gICAgfVxuICB9XG5cbiAgLy8gbG9vayBmb3IgYmVzdCBub24tZm9yY2VkIG9wdGlvbiwgaW4gb3JkZXJcbiAgZm9yIChjb25zdCBbZmVhdHVyZVZhbHVlXSBvZiB2YWx1ZXMpIHtcbiAgICBpZiAoZmVhdHVyZVZhbHVlICE9IG51bGwpIHtcbiAgICAgIHJldHVybiBmZWF0dXJlVmFsdWU7XG4gICAgfVxuICB9XG5cbiAgLy8gdW5zZXQgaWYgbm90aGluZyBoaXRcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiIsICJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCB7IHVzZUFsbEVuYWJsZWQgfSBmcm9tICcuL3VzZUFsbEVuYWJsZWQnO1xuaW1wb3J0IHsgdXNlRW5hYmxlZCB9IGZyb20gJy4vdXNlRW5hYmxlZCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW5hYmxlUHJvcHMge1xuICByZWFkb25seSBmZWF0dXJlPzogc3RyaW5nW10gfCBzdHJpbmc7XG4gIHJlYWRvbmx5IGFsbEZlYXR1cmVzPzogc3RyaW5nW107XG4gIGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGU7XG59XG5cbi8qKlxuICogRmVhdHVyZSB3aWxsIGJlIGVuYWJsZWQgaWYgYW55IGZlYXR1cmUgaW4gdGhlIGxpc3QgYXJlIGVuYWJsZWQsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFbmFibGUoeyBmZWF0dXJlID0gW10sIGFsbEZlYXR1cmVzID0gW10sIGNoaWxkcmVuIH06IEVuYWJsZVByb3BzKTogSlNYLkVsZW1lbnQgfCBudWxsIHtcbiAgY29uc3QgaXNBbnkgPSB1c2VFbmFibGVkKGZlYXR1cmUpO1xuICBjb25zdCBpc0FsbCA9IHVzZUFsbEVuYWJsZWQoYWxsRmVhdHVyZXMpO1xuXG4gIGlmIChpc0FueSB8fCBpc0FsbCkge1xuICAgIHJldHVybiA8PntjaGlsZHJlbn08Lz47XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbiIsICJpbXBvcnQgeyB1c2VDb250ZXh0LCB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgeyBFbmFibGVDb250ZXh0VHlwZSwgRW5hYmxlQ29udGV4dCB9IGZyb20gJy4vRW5hYmxlQ29udGV4dCc7XG5cbi8vIEhlbHBlcjogZ2V0IHJpZCBvZiBzb21lIGJvaWxlcnBsYXRlLlxuLy8ganVzdCBpbnB1dCBtYXNoaW5nIGFuZCBzYW5pdGF0aW9uLCByZW1vdmluZyBleHRyYSByZW5kZXJzLCBhbmQgZ2V0dGluZyB0ZXN0IGZ1bmN0aW9uXG5leHBvcnQgZnVuY3Rpb24gdXNlVGVzdEFuZENvbnZlcnQoaW5wdXQ/OiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwpOiBbRW5hYmxlQ29udGV4dFR5cGUsIHN0cmluZ1tdXSB7XG4gIGNvbnN0IHRlc3QgPSB1c2VDb250ZXh0KEVuYWJsZUNvbnRleHQpO1xuXG4gIC8vIFdlIG1lbW9pemUganVzdCB0byBwcmV2ZW50IHJlLXJlbmRlcnMgc2luY2UgdGhpcyBjb3VsZCBiZSBhdCB0aGUgbGVhZiBvZiBhIHRyZWVcbiAgY29uc3QgY29udmVydGVkID0gdXNlTWVtbygoKSA9PiAoaW5wdXQgPT0gbnVsbCA/IFtdIDogQXJyYXkuaXNBcnJheShpbnB1dCkgPyBpbnB1dCA6IFtpbnB1dF0pLCBbaW5wdXRdKTtcblxuICByZXR1cm4gW3Rlc3QsIGNvbnZlcnRlZF07XG59XG4iLCAiaW1wb3J0IHsgdXNlVGVzdEFuZENvbnZlcnQgfSBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiByZXR1cm5zIHRydWUgaWZmIGFsbCBzcGVjaWZpZWQgZmVhdHVyZXMgYXJlIGVuYWJsZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUFsbEVuYWJsZWQoYWxsRmVhdHVyZXM6IHN0cmluZ1tdIHwgc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IFt0ZXN0LCBxdWVyeUFsbFByZXNlbnRdID0gdXNlVGVzdEFuZENvbnZlcnQoYWxsRmVhdHVyZXMpO1xuICByZXR1cm4gcXVlcnlBbGxQcmVzZW50Lmxlbmd0aCA+IDAgJiYgcXVlcnlBbGxQcmVzZW50LmV2ZXJ5KHRlc3QpO1xufVxuIiwgImltcG9ydCB7IHVzZVRlc3RBbmRDb252ZXJ0IH0gZnJvbSAnLi91dGlscyc7XG5cbi8qKlxuICogcmV0dXJucyB0cnVlIGlmZiBhbnkgc3BlY2lmaWVkIGZlYXR1cmUgaXMgZW5hYmxlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlRW5hYmxlZChmZWF0dXJlOiBzdHJpbmdbXSB8IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBbdGVzdCwgcXVlcnlBbnlQcmVzZW50XSA9IHVzZVRlc3RBbmRDb252ZXJ0KGZlYXR1cmUpO1xuICByZXR1cm4gcXVlcnlBbnlQcmVzZW50LnNvbWUodGVzdCk7XG59XG4iLCAiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5cbmltcG9ydCB7IEVuYWJsZVByb3BzIH0gZnJvbSBcIi4vRW5hYmxlXCI7XG5pbXBvcnQgeyB1c2VBbGxEaXNhYmxlZCB9IGZyb20gXCIuL3VzZUFsbERpc2FibGVkXCI7XG5pbXBvcnQgeyB1c2VEaXNhYmxlZCB9IGZyb20gXCIuL3VzZURpc2FibGVkXCI7XG5cbi8qKlxuICogRmVhdHVyZSB3aWxsIGJlIGRpc2FibGVkIGlmIGFueSBpbiB0aGUgbGlzdCBhcmUgZW5hYmxlZFxuICovXG5leHBvcnQgY29uc3QgRGlzYWJsZTogUmVhY3QuRkM8RW5hYmxlUHJvcHM+ID0gKHtcbiAgZmVhdHVyZSA9IFtdLFxuICBhbGxGZWF0dXJlcyA9IFtdLFxuICBjaGlsZHJlblxufSkgPT4ge1xuICBjb25zdCBpc0FueSA9IHVzZURpc2FibGVkKGZlYXR1cmUpO1xuICBjb25zdCBpc0FsbCA9IHVzZUFsbERpc2FibGVkKGFsbEZlYXR1cmVzKTtcblxuICBpZiAoaXNBbnkgfHwgaXNBbGwpIHtcbiAgICByZXR1cm4gPD57Y2hpbGRyZW59PC8+O1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59O1xuIiwgImltcG9ydCB7IHVzZVRlc3RBbmRDb252ZXJ0IH0gZnJvbSAnLi91dGlscyc7XG5cbi8qKlxuICogcmV0dXJucyB0cnVlIGlmZiBhbGwgc3BlY2lmaWVkIGZlYXR1cmVzIGFyZSBkaXNhYmxlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlQWxsRGlzYWJsZWQod2l0aG91dEFsbDogc3RyaW5nW10gfCBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgW3Rlc3QsIHF1ZXJ5QWxsV2l0aG91dF0gPSB1c2VUZXN0QW5kQ29udmVydCh3aXRob3V0QWxsKTtcbiAgcmV0dXJuIHdpdGhvdXRBbGwubGVuZ3RoID4gMCAmJiBxdWVyeUFsbFdpdGhvdXQuZXZlcnkoKHgpID0+ICEodGVzdCh4KSA/PyBmYWxzZSkpO1xufVxuIiwgImltcG9ydCB7IHVzZVRlc3RBbmRDb252ZXJ0IH0gZnJvbSAnLi91dGlscyc7XG5cbi8qKlxuICogcmV0dXJucyB0cnVlIGlmZiBhbnkgc3BlY2lmaWVkIGZlYXR1cmUgaXMgZGlzYWJsZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZURpc2FibGVkKHdpdGhvdXQ6IHN0cmluZ1tdIHwgc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IFt0ZXN0LCBxdWVyeUFueVdpdGhvdXRdID0gdXNlVGVzdEFuZENvbnZlcnQod2l0aG91dCk7XG4gIHJldHVybiBxdWVyeUFueVdpdGhvdXQuc29tZSgoeCkgPT4gISh0ZXN0KHgpID8/IGZhbHNlKSk7XG59XG4iLCAiaW1wb3J0IFJlYWN0LCB7IHVzZUNvbnRleHQsIHVzZVN0YXRlLCB1c2VDYWxsYmFjaywgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbSc7XG5cbmltcG9ydCB7IFJhZGlvR3JvdXAgfSBmcm9tICdAaGVhZGxlc3N1aS9yZWFjdCc7XG5cbmltcG9ydCB7IEZlYXR1cmVDb250ZXh0IH0gZnJvbSAnLi9GZWF0dXJlQ29udGV4dCc7XG5pbXBvcnQgeyB2YWx1ZU9mRmVhdHVyZSB9IGZyb20gJy4vRmVhdHVyZXNTdGF0ZSc7XG5pbXBvcnQgeyBGZWF0dXJlRGVzY3JpcHRpb24gfSBmcm9tICcuL0ZlYXR1cmVTdGF0ZSc7XG4vLyBAdHMtZXhwZWN0LWVycm9yIGJ1bmRsZXIgd2lsbCB0YWtlIGNhcmUgb2YgdGhpc1xuaW1wb3J0IHN0eWxlcyBmcm9tICcuL3RhaWx3aW5kLmNzcyc7XG5cbmZ1bmN0aW9uIGNsYXNzTmFtZXMoLi4uY2xhc3Nlczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gY2xhc3Nlcy5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xufVxuXG5mdW5jdGlvbiBUb2dnbGVGZWF0dXJlKHsgZmVhdHVyZSB9OiB7IGZlYXR1cmU6IEZlYXR1cmVEZXNjcmlwdGlvbiB9KTogSlNYLkVsZW1lbnQgfCBudWxsIHtcbiAgY29uc3QgY29udGV4dCA9IHVzZUNvbnRleHQoRmVhdHVyZUNvbnRleHQpO1xuICBjb25zdCBoYW5kbGVDaGFuZ2VTZWxlY3Rpb24gPSB1c2VDYWxsYmFjayhcbiAgICAodmFsdWU6ICdmYWxzZScgfCAndHJ1ZScgfCAndW5zZXQnKSA9PiB7XG4gICAgICBpZiAoY29udGV4dD8ub3ZlcnJpZGVzU2VuZCAhPSBudWxsKSB7XG4gICAgICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgICAgICBjYXNlICd0cnVlJzoge1xuICAgICAgICAgICAgY29udGV4dC5vdmVycmlkZXNTZW5kKHsgdHlwZTogJ0VOQUJMRScsIG5hbWU6IGZlYXR1cmUubmFtZSB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdmYWxzZSc6IHtcbiAgICAgICAgICAgIGNvbnRleHQub3ZlcnJpZGVzU2VuZCh7IHR5cGU6ICdESVNBQkxFJywgbmFtZTogZmVhdHVyZS5uYW1lIH0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3Vuc2V0Jzoge1xuICAgICAgICAgICAgY29udGV4dC5vdmVycmlkZXNTZW5kKHsgdHlwZTogJ1VOU0VUJywgbmFtZTogZmVhdHVyZS5uYW1lIH0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBbZmVhdHVyZS5uYW1lLCBjb250ZXh0XVxuICApO1xuXG4gIGlmIChjb250ZXh0ID09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHsgb3ZlcnJpZGVzU3RhdGUsIHRlc3Q6IHRlc3RGZWF0dXJlLCBkZWZhdWx0c1N0YXRlIH0gPSBjb250ZXh0O1xuXG4gIGNvbnN0IHZhbHVlSW5EZWZhdWx0cyA9ICh2YWx1ZU9mRmVhdHVyZShkZWZhdWx0c1N0YXRlLCBmZWF0dXJlLm5hbWUpWzBdID8/ICd1bnNldCcpLnRvU3RyaW5nKCkgYXNcbiAgICB8ICdmYWxzZSdcbiAgICB8ICd0cnVlJ1xuICAgIHwgJ3Vuc2V0JztcblxuICBjb25zdCB2YWx1ZUluT3ZlcnJpZGVzID0gKHZhbHVlT2ZGZWF0dXJlKG92ZXJyaWRlc1N0YXRlLCBmZWF0dXJlLm5hbWUpWzBdID8/ICd1bnNldCcpLnRvU3RyaW5nKCkgYXNcbiAgICB8ICdmYWxzZSdcbiAgICB8ICd0cnVlJ1xuICAgIHwgJ3Vuc2V0JztcblxuICBjb25zdCBhY3R1YWxDaGVja2VkID0gdGVzdEZlYXR1cmUoZmVhdHVyZS5uYW1lKTtcblxuICByZXR1cm4gKFxuICAgIDxSYWRpb0dyb3VwIGRpc2FibGVkPXtmZWF0dXJlLm5vT3ZlcnJpZGV9IG9uQ2hhbmdlPXtoYW5kbGVDaGFuZ2VTZWxlY3Rpb259IHZhbHVlPXt2YWx1ZUluT3ZlcnJpZGVzfT5cbiAgICAgIDxSYWRpb0dyb3VwLkxhYmVsPlxuICAgICAgICA8aDYgY2xhc3NOYW1lPVwidGV4dC1ncmF5LTkwMCBhbGlnbi1jZW50ZXIgZmxleCBmbGV4LXJvdyBmbGV4LW5vd3JhcCBpdGVtcy1jZW50ZXIgZ2FwLTIgbGc6Z2FwLTQgaC03XCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZm9udC1tZWRpdW1cIj5cbiAgICAgICAgICAgIEZlYXR1cmU6IDxjb2RlPntmZWF0dXJlLm5hbWV9PC9jb2RlPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICB7ZmVhdHVyZS5ub092ZXJyaWRlID09PSB0cnVlID8gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJib3JkZXItb3JhbmdlLTUwMCB0ZXh0LW9yYW5nZS01MDAgZmxleCBmbGV4LW5vd3JhcCB0ZXh0LXhzIGZsZXgtcm93IGdhcC0xIHJvdW5kZWQtc20gYm9yZGVyIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBweC0yIHB5LTFcIj5cbiAgICAgICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaC00IHctNCBtaW4tdy00XCJcbiAgICAgICAgICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDIwIDIwXCJcbiAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICBjbGlwUnVsZT1cImV2ZW5vZGRcIlxuICAgICAgICAgICAgICAgICAgZD1cIk01IDlWN2E1IDUgMCAwMTEwIDB2MmEyIDIgMCAwMTIgMnY1YTIgMiAwIDAxLTIgMkg1YTIgMiAwIDAxLTItMnYtNWEyIDIgMCAwMTItMnptOC0ydjJIN1Y3YTMgMyAwIDAxNiAwelwiXG4gICAgICAgICAgICAgICAgICBmaWxsUnVsZT1cImV2ZW5vZGRcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICA8ZGl2Pk5vIE92ZXJyaWRlczwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAge2FjdHVhbENoZWNrZWQgPT09IHRydWUgPyAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1ub3dyYXAgdGV4dC14cyB0ZXh0LWdyZWVuLTUwMCBmbGV4LXJvdyBnYXAtMSByb3VuZGVkLXNtIGJvcmRlciBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgYm9yZGVyLWdyZWVuLTUwMCBweC0yIHB5LTFcIj5cbiAgICAgICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaC00IHctNCBtaW4tdy00XCJcbiAgICAgICAgICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDIwIDIwXCJcbiAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICBjbGlwUnVsZT1cImV2ZW5vZGRcIlxuICAgICAgICAgICAgICAgICAgZD1cIk0xMCAxOGE4IDggMCAxMDAtMTYgOCA4IDAgMDAwIDE2em0zLjcwNy05LjI5M2ExIDEgMCAwMC0xLjQxNC0xLjQxNEw5IDEwLjU4NiA3LjcwNyA5LjI5M2ExIDEgMCAwMC0xLjQxNCAxLjQxNGwyIDJhMSAxIDAgMDAxLjQxNCAwbDQtNHpcIlxuICAgICAgICAgICAgICAgICAgZmlsbFJ1bGU9XCJldmVub2RkXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgPGRpdj57YWN0dWFsQ2hlY2tlZCA/ICdFbmFibGVkJyA6ICdEaXNhYmxlZCd9PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgPC9oNj5cbiAgICAgICAge2ZlYXR1cmUuZGVzY3JpcHRpb24gPT0gbnVsbCA/IG51bGwgOiA8cCBjbGFzc05hbWU9XCJ0ZXh0LWJhc2UgdGV4dC1ncmF5LTUwMCB0ZXh0LXNtXCI+e2ZlYXR1cmUuZGVzY3JpcHRpb259PC9wPn1cbiAgICAgIDwvUmFkaW9Hcm91cC5MYWJlbD5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtNCBncmlkIGdyaWQtY29scy0xIGdhcC15LTYgc206Z3JpZC1jb2xzLTMgc206Z2FwLXgtNFwiPlxuICAgICAgICB7W1xuICAgICAgICAgIHsgaWQ6ICdmYWxzZScsIHRpdGxlOiBgRGlzYWJsZSAke2ZlYXR1cmUubmFtZX1gLCBkZXNjcmlwdGlvbjogJ092ZXJyaWRlIHRoZSBmZWF0dXJlIHRvIGJlIGRpc2FibGVkJyB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlkOiAndW5zZXQnLFxuICAgICAgICAgICAgdGl0bGU6ICdEZWZhdWx0JyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnSW5oZXJpdCBlbmFibGVkIHN0YXRlIGZyb20gZGVmYXVsdHMnLFxuICAgICAgICAgICAgZGlzYWJsZWQ6IChmZWF0dXJlLm5vT3ZlcnJpZGUgPz8gZmFsc2UpIHx8IGZlYXR1cmUuZm9yY2UsXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6XG4gICAgICAgICAgICAgIHZhbHVlSW5EZWZhdWx0cyA9PT0gJ3RydWUnID8gKFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1ncmVlbi01MDAgYm9yZGVyLWdyZWVuLTUwMCBmbGV4IGZsZXgtbm93cmFwIHRleHQteHMgZmxleC1yb3cgZ2FwLTEgcm91bmRlZC1zbSBib3JkZXIgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHB4LTIgcHktMVwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+RW5hYmxlZDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtcmVkLTUwMCBib3JkZXItcmVkLTUwMCBmbGV4IGZsZXgtbm93cmFwIHRleHQteHMgZmxleC1yb3cgZ2FwLTEgcm91bmRlZC1zbSBib3JkZXIgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHB4LTIgcHktMVwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+RGlzYWJsZWQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IGlkOiAndHJ1ZScsIHRpdGxlOiBgRW5hYmxlICR7ZmVhdHVyZS5uYW1lfWAsIGRlc2NyaXB0aW9uOiAnT3ZlcnJpZGUgdGhlIGZlYXR1cmUgdG8gYmUgZW5hYmxlZCcgfSxcbiAgICAgICAgXS5tYXAoKG9wdGlvbikgPT4gKFxuICAgICAgICAgIDxSYWRpb0dyb3VwLk9wdGlvblxuICAgICAgICAgICAgY2xhc3NOYW1lPXsoeyBjaGVja2VkLCBhY3RpdmUsIGRpc2FibGVkIH0pID0+XG4gICAgICAgICAgICAgIGNsYXNzTmFtZXMoXG4gICAgICAgICAgICAgICAgY2hlY2tlZCA/ICdib3JkZXItdHJhbnNwYXJlbnQnIDogJ2JvcmRlci1ncmF5LTMwMCcsXG4gICAgICAgICAgICAgICAgIWRpc2FibGVkICYmIGFjdGl2ZSA/ICdib3JkZXItYmx1ZS01MDAgcmluZy0yIHJpbmctYmx1ZS01MDAnIDogJycsXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQgPyAnYm9yZGVyLXRyYW5zcGFyZW50IHJpbmctZ3JheS01MDAgY3Vyc29yLW5vdC1hbGxvd2VkJyA6ICdjdXJzb3ItcG9pbnRlcicsXG4gICAgICAgICAgICAgICAgJ3JlbGF0aXZlIGJnLXdoaXRlIGJvcmRlciByb3VuZGVkLWxnIHNoYWRvdy1zbSBwLTMgZmxleCBmb2N1czpvdXRsaW5lLW5vbmUnXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRpc2FibGVkPXtvcHRpb24uZGlzYWJsZWR9XG4gICAgICAgICAgICBrZXk9e29wdGlvbi5pZH1cbiAgICAgICAgICAgIHZhbHVlPXtvcHRpb24uaWR9XG4gICAgICAgICAgPlxuICAgICAgICAgICAgeyh7IGNoZWNrZWQsIGFjdGl2ZSwgZGlzYWJsZWQgfSkgPT4gKFxuICAgICAgICAgICAgICA8PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBncm93XCI+XG4gICAgICAgICAgICAgICAgICA8UmFkaW9Hcm91cC5MYWJlbCBhcz1cInNwYW5cIiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtbm93cmFwIGZsZXgtcm93IGdhcC0xIGl0ZW1zLWNlbnRlciBzcGFjZS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1ncmF5LTkwMCBncm93IHNocmlua1wiPntvcHRpb24udGl0bGV9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB7b3B0aW9uLmRlZmF1bHRWYWx1ZSAhPSBudWxsID8gb3B0aW9uLmRlZmF1bHRWYWx1ZSA6IG51bGx9XG4gICAgICAgICAgICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lcyghY2hlY2tlZCA/ICdpbnZpc2libGUnIDogJycsICdoLTUgdy01IHRleHQtYmx1ZS01MDAgbWluLXctNCcpfVxuICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjAgMjBcIlxuICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBSdWxlPVwiZXZlbm9kZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTEwIDE4YTggOCAwIDEwMC0xNiA4IDggMCAwMDAgMTZ6bTMuNzA3LTkuMjkzYTEgMSAwIDAwLTEuNDE0LTEuNDE0TDkgMTAuNTg2IDcuNzA3IDkuMjkzYTEgMSAwIDAwLTEuNDE0IDEuNDE0bDIgMmExIDEgMCAwMDEuNDE0IDBsNC00elwiXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxsUnVsZT1cImV2ZW5vZGRcIlxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgPC9SYWRpb0dyb3VwLkxhYmVsPlxuICAgICAgICAgICAgICAgICAgPFJhZGlvR3JvdXAuRGVzY3JpcHRpb24gYXM9XCJzcGFuXCIgY2xhc3NOYW1lPVwibXQtMSBmbGV4IGl0ZW1zLWNlbnRlciB0ZXh0LXNtIHRleHQtZ3JheS01MDBcIj5cbiAgICAgICAgICAgICAgICAgICAge29wdGlvbi5kZXNjcmlwdGlvbn1cbiAgICAgICAgICAgICAgICAgIDwvUmFkaW9Hcm91cC5EZXNjcmlwdGlvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWVzKFxuICAgICAgICAgICAgICAgICAgICAhZGlzYWJsZWQgJiYgYWN0aXZlID8gJ2JvcmRlcicgOiAnYm9yZGVyLTInLFxuICAgICAgICAgICAgICAgICAgICBjaGVja2VkID8gKGRpc2FibGVkID8gJ2JvcmRlci1ncmF5LTUwMCcgOiAnYm9yZGVyLWJsdWUtNTAwJykgOiAnYm9yZGVyLXRyYW5zcGFyZW50JyxcbiAgICAgICAgICAgICAgICAgICAgJ2Fic29sdXRlIC1pbnNldC1weCByb3VuZGVkLWxnIHBvaW50ZXItZXZlbnRzLW5vbmUnXG4gICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L1JhZGlvR3JvdXAuT3B0aW9uPlxuICAgICAgICApKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvUmFkaW9Hcm91cD5cbiAgKTtcbn1cblxuZnVuY3Rpb24gU2hhZG93Q29udGVudCh7IHJvb3QsIGNoaWxkcmVuIH06IHsgY2hpbGRyZW46IFJlYWN0Tm9kZTsgcm9vdDogRWxlbWVudCB9KSB7XG4gIHJldHVybiBSZWFjdERPTS5jcmVhdGVQb3J0YWwoY2hpbGRyZW4sIHJvb3QpO1xufVxuXG4vLy8gUGVybWl0IHVzZXJzIHRvIG92ZXJyaWRlIGZlYXR1cmUgZmxhZ3MgdmlhIGEgR1VJLlxuLy8vIFJlbmRlcnMgYSBzbWFsbCBmbG9hdGluZyBidXR0b24gaW4gbG93ZXIgbGVmdCBvciByaWdodCwgcHJlc3NpbmcgaXQgYnJpbmdzIHVwXG4vLy8gYSBsaXN0IG9mIGZlYXR1cmVzIHRvIHRvZ2dsZSBhbmQgdGhlaXIgY3VycmVudCBvdmVycmlkZSBzdGF0ZS4geW91IGNhbiBvdmVycmlkZSBvbiBvciBvdmVycmlkZSBvZmYsXG4vLy8gb3IgdW5zZXQgdGhlIG92ZXJyaWRlIGFuZCBnbyBiYWNrIHRvIGRlZmF1bHQgdmFsdWUuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbmV4cG9ydCBmdW5jdGlvbiBUb2dnbGVGZWF0dXJlcyh7IGRlZmF1bHRPcGVuID0gZmFsc2UgfTogeyBkZWZhdWx0T3Blbj86IGJvb2xlYW4gfSk6IEpTWC5FbGVtZW50IHwgbnVsbCB7XG4gIGNvbnN0IFtyb290LCBzZXRDb3JlUm9vdF0gPSB1c2VTdGF0ZTxIVE1MRGl2RWxlbWVudCB8IG51bGw+KG51bGwpO1xuXG4gIGNvbnN0IHNldFJvb3QgPSAoaG9zdDogSFRNTERpdkVsZW1lbnQgfCBudWxsKSA9PiB7XG4gICAgaWYgKGhvc3QgPT0gbnVsbCB8fCByb290ICE9IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2hhZG93Um9vdCA9IGhvc3Q/LmF0dGFjaFNoYWRvdyh7IG1vZGU6ICdvcGVuJyB9KTtcbiAgICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgY29uc3QgcmVuZGVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgc3R5bGUudGV4dENvbnRlbnQgPSBzdHlsZXM7XG4gICAgc2hhZG93Um9vdC5hcHBlbmRDaGlsZChzdHlsZSk7XG4gICAgc2hhZG93Um9vdC5hcHBlbmRDaGlsZChyZW5kZXJEaXYpO1xuICAgIHNldENvcmVSb290KHJlbmRlckRpdik7XG4gIH07XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IHJlZj17c2V0Um9vdH0gc3R5bGU9e3sgekluZGV4OiA5OTk5OSwgcG9zaXRpb246ICdmaXhlZCcsIHdpZHRoOiAnMCcsIGhlaWdodDogJzAnLCBib3R0b206IDAgfX0+XG4gICAgICB7cm9vdCAhPSBudWxsID8gKFxuICAgICAgICA8U2hhZG93Q29udGVudCByb290PXtyb290fT5cbiAgICAgICAgICA8VG9nZ2xlRmVhdHVyZVVud3JhcHBlZCBkZWZhdWx0T3Blbj17ZGVmYXVsdE9wZW59IC8+XG4gICAgICAgIDwvU2hhZG93Q29udGVudD5cbiAgICAgICkgOiBudWxsfVxuICAgIDwvZGl2PlxuICApO1xufVxuXG4vLy8gTGlrZSBUb2dnbGVGZWF0dXJlcywgYnV0IGRvZXMgbm90IGluamVjdCBzdHlsZXMgaW50byBhIHNoYWRvdyBET00gcm9vdCBub2RlLlxuLy8vIHVzZWZ1bCBpZiB5b3UncmUgdXNpbmcgdGFpbHdpbmQuXG5leHBvcnQgZnVuY3Rpb24gVG9nZ2xlRmVhdHVyZVVud3JhcHBlZCh7IGRlZmF1bHRPcGVuID0gZmFsc2UgfTogeyBkZWZhdWx0T3Blbj86IGJvb2xlYW4gfSk6IEpTWC5FbGVtZW50IHwgbnVsbCB7XG4gIGNvbnN0IFtvcGVuLCBzZXRPcGVuXSA9IHVzZVN0YXRlKGRlZmF1bHRPcGVuKTtcbiAgY29uc3QgY29udGV4dCA9IHVzZUNvbnRleHQoRmVhdHVyZUNvbnRleHQpO1xuXG4gIGlmIChjb250ZXh0ID09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIFdlIHdhbnQ6IFJlYWwgdmFsdWUgYWZ0ZXIgYWxsIG5lc3RpbmdzLCB2YWx1ZSBvZiB0aGUgb3ZlcnJpZGUuIHdlIHRvZ2dsZSBvdmVycmlkZVxuICBjb25zdCB7IGZlYXR1cmVzRGVzY3JpcHRpb24gfSA9IGNvbnRleHQ7XG5cbiAgaWYgKGZlYXR1cmVzRGVzY3JpcHRpb24ubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwicmVsYXRpdmVcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYWJzb2x1dGUgYm90dG9tLTAgbGVmdC0wIG14LTQgbXktNFwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3NOYW1lPVwiaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIHRleHQtc20gZm9udC1tZWRpdW0gcC0xIGgtOCB3LTggYWxpZ24tbWlkZGxlIGN1cnNvci1wb2ludGVyIHJvdW5kZWQtZnVsbCBiZy1ibHVlLTYwMCB0ZXh0LXdoaXRlICBib3JkZXIgYm9yZGVyLXRyYW5zcGFyZW50IGp1c3RpZnktY2VudGVyIHRleHQtYmFzZSBmb250LW1lZGl1bSBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6cmluZy0yIGZvY3VzOnJpbmctb2Zmc2V0LTIgZm9jdXM6cmluZy1ibHVlLTYwMCBzbTp0ZXh0LXNtXCJcbiAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRPcGVuKHRydWUpfVxuICAgICAgICAgIHRpdGxlPVwiVG9nZ2xlIGZlYXR1cmVzXCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cInctNiBoLTYgbWluLWgtNiBtaW4tdy02XCJcbiAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyMCAyMFwiXG4gICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICBjbGlwUnVsZT1cImV2ZW5vZGRcIlxuICAgICAgICAgICAgICBkPVwiTTMgNmEzIDMgMCAwMTMtM2gxMGExIDEgMCAwMS44IDEuNkwxNC4yNSA4bDIuNTUgMy40QTEgMSAwIDAxMTYgMTNINmExIDEgMCAwMC0xIDF2M2ExIDEgMCAxMS0yIDBWNnpcIlxuICAgICAgICAgICAgICBmaWxsUnVsZT1cImV2ZW5vZGRcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIHshb3BlbiA/IG51bGwgOiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZml4ZWQgei0xMCBpbnNldC0wIG92ZXJmbG93LXktYXV0b1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1lbmQganVzdGlmeS1mbGV4LXN0YXJ0IG14LTggbXktNCBtaW4taC1zY3JlZW4gcHQtNCBweC00IHBiLTEwIHNtOmJsb2NrIHNtOnAtMFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJyZWxhdGl2ZSBpbmxpbmUtYmxvY2sgYWxpZ24tYm90dG9tIGJnLXdoaXRlIHJvdW5kZWQtbGcgcHgtNCBwdC01IHBiLTQgdGV4dC1sZWZ0IG92ZXJmbG93LWhpZGRlbiBzaGFkb3cteGwgdHJhbnNmb3JtIHRyYW5zaXRpb24tYWxsIHNtOm15LTggc206YWxpZ24tbWlkZGxlIHNtOnAtNiBsZzptYXgtdy1bODAlXSBtYXgtdy1mdWxsXCI+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC0xIHNtOm10LTNcIj5cbiAgICAgICAgICAgICAgICAgIDxoMyBjbGFzc05hbWU9XCJmbGV4IGZsZXgtcm93IGdhcC00IGZsZXgtbm93cmFwIGl0ZW1zLWNlbnRlciBzcGFjZS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3JvdyB0ZXh0LWxnIGxlYWRpbmctNiBmb250LW1lZGl1bSB0ZXh0LWdyYXktOTAwXCI+RmVhdHVyZSBGbGFnIE92ZXJyaWRlczwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9oMz5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC1ncmF5LTUwMFwiPlxuICAgICAgICAgICAgICAgICAgICBGZWF0dXJlcyBjYW4gYmUgZW5hYmxlZCBvciBkaXNhYmxlZCB1bmxlc3MgdGhleSBhcmUgZm9yY2VkIHVwc3RyZWFtLiBZb3UgY2FuIGFsc28gcmV2ZXJ0IHRvIGRlZmF1bHQuXG4gICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LTZcIj5cbiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgZ2FwLTlcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bGVnZW5kIGNsYXNzTmFtZT1cInNyLW9ubHlcIj5GZWF0dXJlIEZsYWdzPC9sZWdlbmQ+XG4gICAgICAgICAgICAgICAgICAgICAge2ZlYXR1cmVzRGVzY3JpcHRpb24ubWFwKChmZWF0dXJlKSA9PiAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8VG9nZ2xlRmVhdHVyZSBmZWF0dXJlPXtmZWF0dXJlfSBrZXk9e2ZlYXR1cmUubmFtZX0gLz5cbiAgICAgICAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlciBtdC01IHNtOm10LTZcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImlubGluZS1mbGV4IGl0ZW1zLWNlbnRlciB0ZXh0LXNtIGZvbnQtbWVkaXVtIHB0LTAgcGItMCBwci00IHBsLTQgaC04IGxlYWRpbmctNyBhbGlnbi1taWRkbGUgY3Vyc29yLXBvaW50ZXIgcm91bmRlZC1zbSBiZy1ibHVlLTYwMCB0ZXh0LXdoaXRlIGJvcmRlciBib3JkZXItdHJhbnNwYXJlbnQganVzdGlmeS1jZW50ZXIgdGV4dC1iYXNlIGZvbnQtbWVkaXVtIGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpyaW5nLTIgZm9jdXM6cmluZy1vZmZzZXQtMiBmb2N1czpyaW5nLWJsdWUtNjAwIHNtOnRleHQtc21cIlxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldE9wZW4oZmFsc2UpfVxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgRG9uZVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICl9XG4gICAgPC9kaXY+XG4gICk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAic2lCQUFBLGdFQ0FBLG1EQVlPLFdBQXVCLEVBQXFELENBWm5GLFFBYUUsTUFBTyxDQUNMLEVBQWEsUUFBUSxTQUFTLEVBQUksR0FBTyxFQUFhLFFBQVEsVUFBVSxFQUFJLEdBQVEsT0FDcEYsUUFBYSxRQUFRLGNBQXJCLGNBQWtDLFFBQWxDLE9BQTJDLEVBQzdDLENBQ0YsQ0E0RU8sR0FBTSxHQUFpQixFQUErRCxDQUMzRixHQUFJLFVBQ0osUUFBUyxVQUNULFFBQVMsQ0FBQyxFQUNWLDJCQUE0QixHQUM1QixHQUFJLENBQ0YsT0FBUSxDQUNOLENBQUUsT0FBUSxlQUFnQixL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 +`;function j(...t){return t.filter(Boolean).join(" ")}function we({feature:t}){var c,v,m;let e=Y(w),r=be(l=>{if((e==null?void 0:e.overridesSend)!=null)switch(l){case"true":{e.overridesSend({type:"ENABLE",name:t.name});break}case"false":{e.overridesSend({type:"DISABLE",name:t.name});break}case"unset":{e.overridesSend({type:"UNSET",name:t.name});break}}},[t.name,e]);if(e==null)return null;let{overridesState:a,test:n,defaultsState:i}=e,d=((c=g(i,t.name)[0])!=null?c:"unset").toString(),u=((v=g(a,t.name)[0])!=null?v:"unset").toString(),s=n(t.name);return o.createElement(x,{disabled:t.noOverride,onChange:r,value:u},o.createElement(x.Label,null,o.createElement("h6",{className:"text-gray-900 align-center flex flex-row flex-nowrap items-center gap-2 lg:gap-4 h-7"},o.createElement("span",{className:"font-medium"},"Feature: ",o.createElement("code",null,t.name)),t.noOverride===!0?o.createElement("div",{className:"border-orange-500 text-orange-500 flex flex-nowrap text-xs flex-row gap-1 rounded-sm border items-center justify-center px-2 py-1"},o.createElement("svg",{"aria-hidden":"true",className:"h-4 w-4 min-w-4",fill:"currentColor",viewBox:"0 0 20 20",xmlns:"http://www.w3.org/2000/svg"},o.createElement("path",{clipRule:"evenodd",d:"M5 9V7a5 5 0 0110 0v2a2 2 0 012 2v5a2 2 0 01-2 2H5a2 2 0 01-2-2v-5a2 2 0 012-2zm8-2v2H7V7a3 3 0 016 0z",fillRule:"evenodd"})),o.createElement("div",null,"No Overrides")):null,s===!0?o.createElement("div",{className:"flex flex-nowrap text-xs text-green-500 flex-row gap-1 rounded-sm border items-center justify-center border-green-500 px-2 py-1"},o.createElement("svg",{"aria-hidden":"true",className:"h-4 w-4 min-w-4",fill:"currentColor",viewBox:"0 0 20 20",xmlns:"http://www.w3.org/2000/svg"},o.createElement("path",{clipRule:"evenodd",d:"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z",fillRule:"evenodd"})),o.createElement("div",null,s?"Enabled":"Disabled")):null),t.description==null?null:o.createElement("p",{className:"text-base text-gray-500 text-sm"},t.description)),o.createElement("div",{className:"mt-4 grid grid-cols-1 gap-y-6 sm:grid-cols-3 sm:gap-x-4"},[{id:"false",title:`Disable ${t.name}`,description:"Override the feature to be disabled"},{id:"unset",title:"Default",description:"Inherit enabled state from defaults",disabled:((m=t.noOverride)!=null?m:!1)||t.force,defaultValue:d==="true"?o.createElement("div",{className:"text-green-500 border-green-500 flex flex-nowrap text-xs flex-row gap-1 rounded-sm border items-center justify-center px-2 py-1"},o.createElement("span",null,"Enabled")):o.createElement("div",{className:"text-red-500 border-red-500 flex flex-nowrap text-xs flex-row gap-1 rounded-sm border items-center justify-center px-2 py-1"},o.createElement("span",null,"Disabled"))},{id:"true",title:`Enable ${t.name}`,description:"Override the feature to be enabled"}].map(l=>o.createElement(x.Option,{className:({checked:p,active:S,disabled:b})=>j(p?"border-transparent":"border-gray-300",!b&&S?"border-blue-500 ring-2 ring-blue-500":"",b?"border-transparent ring-gray-500 cursor-not-allowed":"cursor-pointer","relative bg-white border rounded-lg shadow-sm p-3 flex focus:outline-none"),disabled:l.disabled,key:l.id,value:l.id},({checked:p,active:S,disabled:b})=>o.createElement(o.Fragment,null,o.createElement("div",{className:"flex flex-col grow"},o.createElement(x.Label,{as:"span",className:"flex flex-nowrap flex-row gap-1 items-center space-between"},o.createElement("span",{className:"text-sm font-medium text-gray-900 grow shrink"},l.title),l.defaultValue!=null?l.defaultValue:null,o.createElement("svg",{"aria-hidden":"true",className:j(p?"":"invisible","h-5 w-5 text-blue-500 min-w-4"),fill:"currentColor",viewBox:"0 0 20 20",xmlns:"http://www.w3.org/2000/svg"},o.createElement("path",{clipRule:"evenodd",d:"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z",fillRule:"evenodd"}))),o.createElement(x.Description,{as:"span",className:"mt-1 flex items-center text-sm text-gray-500"},l.description)),o.createElement("div",{"aria-hidden":"true",className:j(!b&&S?"border":"border-2",p?b?"border-gray-500":"border-blue-500":"border-transparent","absolute -inset-px rounded-lg pointer-events-none")}))))))}function xe({root:t,children:e}){return he.createPortal(e,t)}function ve({defaultOpen:t=!1,hidden:e=!1}){let[r,a]=W(null),n=i=>{if(i==null||r!=null)return;let d=i==null?void 0:i.attachShadow({mode:"open"}),u=document.createElement("style"),s=document.createElement("div");u.textContent=K,d.appendChild(u),d.appendChild(s),a(s)};return e?null:o.createElement("div",{ref:n,style:{zIndex:99999,position:"fixed",width:"0",height:"0",bottom:0}},r!=null?o.createElement(xe,{root:r},o.createElement(ye,{defaultOpen:t})):null)}function ye({defaultOpen:t=!1,hidden:e=!1}){let[r,a]=W(t),n=Y(w);if(n==null||e)return null;let{featuresDescription:i}=n;return i.length===0?null:o.createElement("div",{className:"relative"},o.createElement("div",{className:"absolute bottom-0 left-0 mx-4 my-4"},o.createElement("button",{className:"inline-flex items-center text-sm font-medium p-1 h-8 w-8 align-middle cursor-pointer rounded-full bg-blue-600 text-white border border-transparent justify-center text-base font-medium focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-600 sm:text-sm",onClick:()=>a(!0),title:"Toggle features",type:"button"},o.createElement("svg",{className:"w-6 h-6 min-h-6 min-w-6",fill:"currentColor",viewBox:"0 0 20 20",xmlns:"http://www.w3.org/2000/svg"},o.createElement("path",{clipRule:"evenodd",d:"M3 6a3 3 0 013-3h10a1 1 0 01.8 1.6L14.25 8l2.55 3.4A1 1 0 0116 13H6a1 1 0 00-1 1v3a1 1 0 11-2 0V6z",fillRule:"evenodd"})))),r?o.createElement("div",{className:"fixed z-10 inset-0 overflow-y-auto"},o.createElement("div",{className:"flex items-end justify-flex-start mx-8 my-4 min-h-screen pt-4 px-4 pb-10 sm:block sm:p-0"},o.createElement("div",{className:"relative inline-block align-bottom bg-white rounded-lg px-4 pt-5 pb-4 text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:p-6 lg:max-w-[80%] max-w-full"},o.createElement("div",null,o.createElement("div",{className:"mt-1 sm:mt-3"},o.createElement("h3",{className:"flex flex-row gap-4 flex-nowrap items-center space-between"},o.createElement("div",{className:"grow text-lg leading-6 font-medium text-gray-900"},"Feature Flag Overrides")),o.createElement("p",{className:"text-sm text-gray-500"},"Features can be enabled or disabled unless they are forced upstream. You can also revert to default."),o.createElement("div",{className:"mt-6"},o.createElement("fieldset",{className:"flex flex-col gap-9"},o.createElement("legend",{className:"sr-only"},"Feature Flags"),i.map(d=>o.createElement(we,{feature:d,key:d.name})))),o.createElement("div",{className:"flex justify-center items-center mt-5 sm:mt-6"},o.createElement("button",{className:"inline-flex items-center text-sm font-medium pt-0 pb-0 pr-4 pl-4 h-8 leading-7 align-middle cursor-pointer rounded-sm bg-blue-600 text-white border border-transparent justify-center text-base font-medium focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-600 sm:text-sm",onClick:()=>a(!1),type:"button"},"Done"))))))):null)}export{me as Disable,fe as Enable,h as EnableContext,ue as Features,F as FeaturesMachine,ve as ToggleFeatures,M as useAllDisabled,L as useAllEnabled,_ as useDisabled,O as useEnabled}; +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL0ZlYXR1cmVzU3RhdGUudHN4IiwgIi4uLy4uLy4uL3NyYy9GZWF0dXJlU3RhdGUudHN4IiwgIi4uLy4uLy4uL3NyYy9GZWF0dXJlcy50c3giLCAiLi4vLi4vLi4vc3JjL0VuYWJsZUNvbnRleHQudHN4IiwgIi4uLy4uLy4uL3NyYy9GZWF0dXJlQ29udGV4dC50c3giLCAiLi4vLi4vLi4vc3JjL3VzZUNvbnNvbGVPdmVycmlkZS50c3giLCAiLi4vLi4vLi4vc3JjL0dsb2JhbEVuYWJsZS50c3giLCAiLi4vLi4vLi4vc3JjL3VzZVBlcnNpc3QudHN4IiwgIi4uLy4uLy4uL3NyYy91c2VUZXN0Q2FsbGJhY2sudHN4IiwgIi4uLy4uLy4uL3NyYy90ZXN0RmVhdHVyZS50c3giLCAiLi4vLi4vLi4vc3JjL0VuYWJsZS50c3giLCAiLi4vLi4vLi4vc3JjL3V0aWxzLnRzIiwgIi4uLy4uLy4uL3NyYy91c2VBbGxFbmFibGVkLnRzeCIsICIuLi8uLi8uLi9zcmMvdXNlRW5hYmxlZC50c3giLCAiLi4vLi4vLi4vc3JjL0Rpc2FibGUudHN4IiwgIi4uLy4uLy4uL3NyYy91c2VBbGxEaXNhYmxlZC50c3giLCAiLi4vLi4vLi4vc3JjL3VzZURpc2FibGVkLnRzeCIsICIuLi8uLi8uLi9zcmMvVG9nZ2xlRmVhdHVyZXMudHN4Il0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBBY3RvclJlZkZyb20sIEludGVycHJldGVyRnJvbSwgU3RhdGVGcm9tLCBhc3NpZ24sIGNyZWF0ZU1hY2hpbmUsIHNwYXduIH0gZnJvbSAneHN0YXRlJztcblxuaW1wb3J0IHsgRmVhdHVyZU1hY2hpbmUsIEZlYXR1cmVEZXNjcmlwdGlvbiwgRmVhdHVyZVZhbHVlLCB2YWx1ZUZvclN0YXRlIH0gZnJvbSAnLi9GZWF0dXJlU3RhdGUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZlYXR1cmVzQ29udGV4dCB7XG4gIC8vIGZlYXR1cmVzIGFyZSBsYXllcmVkOlxuICAvLyAgLSBkZWZhdWx0czogaWYgbm90aGluZyBlbHNlIG1hdGNoZXMsIHByb3ZpZGVkIGEgdmFsdWUgZm9yIGZlYXR1cmVcbiAgLy8gIC0gYnJvd3NlcjogYnJvd3Nlci1sb2NhbCB2YWx1ZXMgZm9yIGZlYXR1cmVzIChrZXB0IGluIGxvY2FsIHN0b3JhZ2UsIGV0YylcbiAgLy8gIC0gdXNlcjogdmFsdWVzIGZyb20gdGhlIHVzZXIncyBwcm9maWxlLCBpZiBhbnlcbiAgLy8gIC0gb3JnOiB2YWx1ZSBmcm9tIHRoZSBvcmcncyBwcm9maWxlLCBpZiBhbnlcbiAgZmVhdHVyZXM6IHsgW3g6IHN0cmluZ106IEFjdG9yUmVmRnJvbTx0eXBlb2YgRmVhdHVyZU1hY2hpbmU+IH07XG59XG5cbmV4cG9ydCB0eXBlIEZlYXR1cmVzQWN0aW9uID1cbiAgfCB7IHR5cGU6ICdERV9JTklUJyB9XG4gIHwgeyB0eXBlOiAnRElTQUJMRSc7IG5hbWU6IHN0cmluZyB9XG4gIHwgeyB0eXBlOiAnRU5BQkxFJzsgbmFtZTogc3RyaW5nIH1cbiAgfCB7IHR5cGU6ICdJTklUJzsgZmVhdHVyZXM6IHJlYWRvbmx5IEZlYXR1cmVEZXNjcmlwdGlvbltdIH1cbiAgfCB7IHR5cGU6ICdTRVRfQUxMJzsgZmVhdHVyZXM6IHsgW2tleTogc3RyaW5nXTogRmVhdHVyZVZhbHVlIH0gfVxuICB8IHsgdHlwZTogJ1NFVCc7IG5hbWU6IHN0cmluZzsgdmFsdWU6IEZlYXR1cmVWYWx1ZSB9XG4gIHwgeyB0eXBlOiAnVE9HR0xFJzsgbmFtZTogc3RyaW5nIH1cbiAgfCB7IHR5cGU6ICdVTlNFVCc7IG5hbWU6IHN0cmluZyB9O1xuXG5leHBvcnQgaW50ZXJmYWNlIEZlYXR1cmVzVHlwZVN0YXRlIHtcbiAgdmFsdWU6ICdyZWFkeSc7XG4gIGNvbnRleHQ6IEZlYXR1cmVzQ29udGV4dDtcbn1cblxuZXhwb3J0IHR5cGUgRmVhdHVyZXNTdGF0ZSA9IFN0YXRlRnJvbTx0eXBlb2YgRmVhdHVyZXNNYWNoaW5lPjtcbmV4cG9ydCB0eXBlIEZlYXR1cmVzRGlzcGF0Y2ggPSBJbnRlcnByZXRlckZyb208dHlwZW9mIEZlYXR1cmVzTWFjaGluZT5bJ3NlbmQnXTtcblxuZXhwb3J0IGZ1bmN0aW9uIHZhbHVlT2ZGZWF0dXJlKGZlYXR1cmVzU3RhdGU6IEZlYXR1cmVzU3RhdGUsIGZlYXR1cmU6IHN0cmluZyk6IFtGZWF0dXJlVmFsdWUsIGJvb2xlYW5dIHtcbiAgaWYgKGZlYXR1cmVzU3RhdGUuY29udGV4dC5mZWF0dXJlc1tmZWF0dXJlXSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIFt1bmRlZmluZWQsIGZhbHNlXTtcbiAgfVxuICBjb25zdCBmZWF0dXJlU3RhdGUgPSBmZWF0dXJlc1N0YXRlLmNvbnRleHQuZmVhdHVyZXNbZmVhdHVyZV0uZ2V0U25hcHNob3QoKTtcbiAgaWYgKGZlYXR1cmVTdGF0ZSAhPSBudWxsKSB7XG4gICAgcmV0dXJuIHZhbHVlRm9yU3RhdGUoZmVhdHVyZVN0YXRlKTtcbiAgfVxuICByZXR1cm4gW3VuZGVmaW5lZCwgZmFsc2VdO1xufVxuXG4vLy8gc3RhdGUgbWFjaGluZSB0aGF0IG1hbmFnZXMgYSBzZXQgb2YgZmVhdHVyZXMgd2l0aCB1c2VyLCBvcmcsIGFuZCBsb2NhbCBvdmVycmlkZXNcbmV4cG9ydCBjb25zdCBGZWF0dXJlc01hY2hpbmUgPSBjcmVhdGVNYWNoaW5lPEZlYXR1cmVzQ29udGV4dCwgRmVhdHVyZXNBY3Rpb24sIEZlYXR1cmVzVHlwZVN0YXRlPih7XG4gIGlkOiAnZmVhdHVyZXMnLFxuICBpbml0aWFsOiAnaWRsZScsXG4gIHByZWRpY3RhYmxlQWN0aW9uQXJndW1lbnRzOiB0cnVlLFxuICBjb250ZXh0OiB7XG4gICAgZmVhdHVyZXM6IHt9LFxuICB9LFxuICBzdGF0ZXM6IHtcbiAgICBpZGxlOiB7XG4gICAgICBvbjoge1xuICAgICAgICBJTklUOiB7XG4gICAgICAgICAgdGFyZ2V0OiAncmVhZHknLFxuICAgICAgICAgIGNvbmQ6IChfLCBlKSA9PiBlLmZlYXR1cmVzLmxlbmd0aCA+IDAsXG4gICAgICAgICAgYWN0aW9uczogYXNzaWduKHtcbiAgICAgICAgICAgIGZlYXR1cmVzOiAoY29udGV4dCwgZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgZmVhdHVyZXM6IHR5cGVvZiBjb250ZXh0LmZlYXR1cmVzID0ge307XG5cbiAgICAgICAgICAgICAgZm9yIChjb25zdCBmZWF0dXJlIG9mIGV2ZW50LmZlYXR1cmVzKSB7XG4gICAgICAgICAgICAgICAgZmVhdHVyZXNbZmVhdHVyZS5uYW1lXSA9IHNwYXduKEZlYXR1cmVNYWNoaW5lLCB7XG4gICAgICAgICAgICAgICAgICBuYW1lOiBmZWF0dXJlLm5hbWUsXG4gICAgICAgICAgICAgICAgICBzeW5jOiB0cnVlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGZlYXR1cmVzW2ZlYXR1cmUubmFtZV0uc2VuZCh7IHR5cGU6ICdJTklUJywgZmVhdHVyZSB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gZmVhdHVyZXM7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuXG4gICAgLy8gdGhlIGZlYXR1cmVzIGFyZSBsb2FkZWQgYW5kIHJlYWR5IHRvIGJlIHVzZWRcbiAgICByZWFkeToge1xuICAgICAgb246IHtcbiAgICAgICAgREVfSU5JVDogeyB0YXJnZXQ6ICdpZGxlJywgYWN0aW9uczogYXNzaWduKHsgZmVhdHVyZXM6IChfLCBfXykgPT4gKHt9KSB9KSB9LFxuICAgICAgICBTRVRfQUxMOiB7XG4gICAgICAgICAgYWN0aW9uczogYXNzaWduKHtcbiAgICAgICAgICAgIGZlYXR1cmVzOiAoY3R4LCBlKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGZlYXR1cmVzID0geyAuLi5jdHguZmVhdHVyZXMgfTtcbiAgICAgICAgICAgICAgLy8gQWxsIGNvbmZpZ3VyZWQgZmVhdHVyZXMgYXJlIHNldCB0byBvbi9vZmYgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICAgIE9iamVjdC5rZXlzKGZlYXR1cmVzKS5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgZmVhdHVyZXNbbmFtZV0uc2VuZCh7IHR5cGU6ICdTRVQnLCB2YWx1ZTogZS5mZWF0dXJlc1tuYW1lXSA/PyB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICByZXR1cm4gZmVhdHVyZXM7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuXG4gICAgICAgIC8vIFNldCBhIGZlYXR1cmUgdG8gYSB2YWx1ZVxuICAgICAgICBTRVQ6IHtcbiAgICAgICAgICBhY3Rpb25zOiAoY3R4LCBlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmZWF0dXJlID0gY3R4LmZlYXR1cmVzW2UubmFtZV07XG4gICAgICAgICAgICBpZiAoZmVhdHVyZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIGZlYXR1cmUuc2VuZCh7IHR5cGU6ICdTRVQnLCB2YWx1ZTogZS52YWx1ZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuXG4gICAgICAgIC8vIHRvZ2dsZSBhIGZlYXR1cmVcbiAgICAgICAgVE9HR0xFOiB7XG4gICAgICAgICAgYWN0aW9uczogKGN0eCwgZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmVhdHVyZSA9IGN0eC5mZWF0dXJlc1tlLm5hbWVdO1xuICAgICAgICAgICAgaWYgKGZlYXR1cmUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICBmZWF0dXJlLnNlbmQoeyB0eXBlOiAnVE9HR0xFJyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuXG4gICAgICAgIC8vIHdoZW4gYSBmZWF0dXJlIGlzIGVuYWJsZWQsIHNlbmQgdGhlIGVuYWJsZSBtZXNzYWdlIHRvIHRoZSBhY3RvclxuICAgICAgICBFTkFCTEU6IHtcbiAgICAgICAgICBhY3Rpb25zOiAoY3R4LCBlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmZWF0dXJlID0gY3R4LmZlYXR1cmVzW2UubmFtZV07XG4gICAgICAgICAgICBpZiAoZmVhdHVyZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIGZlYXR1cmUuc2VuZCh7IHR5cGU6ICdFTkFCTEUnIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8gd2hlbiBhIGZlYXR1cmUgaXMgZGlzYWJsZWQsIHNlbmQgdGhlIGRpc2FibGUgbWVzc2FnZSB0byB0aGUgYWN0b3JcbiAgICAgICAgRElTQUJMRToge1xuICAgICAgICAgIGFjdGlvbnM6IChjdHgsIGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZlYXR1cmUgPSBjdHguZmVhdHVyZXNbZS5uYW1lXTtcbiAgICAgICAgICAgIGlmIChmZWF0dXJlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgZmVhdHVyZS5zZW5kKHsgdHlwZTogJ0RJU0FCTEUnIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8gd2hlbiBhIGZlYXR1cmUgaXMgdW5zZXQsIHNlbmQgdGhlIHVuc2V0IG1lc3NhZ2UgdG8gdGhlIGFjdG9yXG4gICAgICAgIFVOU0VUOiB7XG4gICAgICAgICAgYWN0aW9uczogKGN0eCwgZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmVhdHVyZSA9IGN0eC5mZWF0dXJlc1tlLm5hbWVdO1xuICAgICAgICAgICAgaWYgKGZlYXR1cmUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICBmZWF0dXJlLnNlbmQoeyB0eXBlOiAnVU5TRVQnIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59KTtcbiIsICJpbXBvcnQgeyBhc3NpZ24sIGNyZWF0ZU1hY2hpbmUsIERvbmVJbnZva2VFdmVudCwgSW50ZXJwcmV0ZXJGcm9tLCBTdGF0ZUZyb20gfSBmcm9tICd4c3RhdGUnO1xuXG4vKipcbiAqIEZlYXR1cmUgaXMgZWl0aGVyIG9uLCBvZmYsIG9yICd1bnNldCcsXG4gKiB3aGljaCBtZWFucyBpdCB3aWxsIGdvIHRvIHRoZSBkZWZhdWx0IHZhbHVlIG9yIHRoZSBsZXNzIHNwZWNpZmljIHZhbHVlLlxuICovXG5leHBvcnQgdHlwZSBGZWF0dXJlVmFsdWUgPSBmYWxzZSB8IHRydWUgfCB1bmRlZmluZWQ7XG5cbmV4cG9ydCB0eXBlIEZlYXR1cmVTdGF0ZSA9IFN0YXRlRnJvbTx0eXBlb2YgRmVhdHVyZU1hY2hpbmU+O1xuZXhwb3J0IHR5cGUgRmVhdHVyZURpc3BhdGNoID0gSW50ZXJwcmV0ZXJGcm9tPHR5cGVvZiBGZWF0dXJlTWFjaGluZT5bJ3NlbmQnXTtcblxuLy8vIEdpdmVuIGEgZmVhdHVyZXN0YXRlLCBkZXRlcm1pbmUgdGhlIHZhbHVlIChvbiwgb2ZmLCBvciB1bnNldClcbmV4cG9ydCBmdW5jdGlvbiB2YWx1ZUZvclN0YXRlKGZlYXR1cmVTdGF0ZTogRmVhdHVyZVN0YXRlKTogW0ZlYXR1cmVWYWx1ZSwgYm9vbGVhbl0ge1xuICByZXR1cm4gW1xuICAgIGZlYXR1cmVTdGF0ZS5tYXRjaGVzKCdlbmFibGVkJykgPyB0cnVlIDogZmVhdHVyZVN0YXRlLm1hdGNoZXMoJ2Rpc2FibGVkJykgPyBmYWxzZSA6IHVuZGVmaW5lZCxcbiAgICBmZWF0dXJlU3RhdGUuY29udGV4dC5mZWF0dXJlRGVzYz8uZm9yY2UgPz8gZmFsc2UsXG4gIF07XG59XG5cbi8qKlxuICogRGVmaW5pdGlvbiBvZiBhIGZlYXR1cmUgdGhhdCBjYW4gYmUgZW5hYmxlZCBvciBkaXNhYmxlZC5cbiAqIEsgaXMgdGhlIHR5cGUgb2YgdGhlIGtleSB0aGF0IGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhlIGZlYXR1cmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmVhdHVyZURlc2NyaXB0aW9uPEsgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+IHtcbiAgcmVhZG9ubHkgbmFtZTogSztcbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLy8vIElmIHNldCwgd2lsbCBiZSB1c2VkIHRvIHVwZGF0ZSB0aGUgZmVhdHVyZSBkZWZhdWx0IHN0YXRlIGluc3RlYWQgb2Ygc2ltcGx5IG92ZXJyaWRpbmcuXG4gIC8vLyBGb3IgZXhhbXBsZSwgeW91IG1pZ2h0IHVzZSB0aGlzIHRvIHVwZGF0ZSBhIGZlYXR1cmUgZmxhZyBvbiBhIGJhY2tlbmQgc2VydmVyLlxuICAvLy8gd2hlbiBzZXQsIHRoZSBmZWF0dXJlIHdpbGwgYmUgdXBkYXRlZCBvbiB0aGUgYmFja2VuZCBzZXJ2ZXIsIGFuZCB0aGUgcmVzdWx0IG9mIHRoZSBhc3luY1xuICAvLy8gd2lsbCBiZSB1c2VkIGZvciB0aGUgZmluYWwgc3RhdGUgYWZ0ZXIgdGhlIGNoYW5nZS4gd2hpbGUgY2hhbmdpbmcsIHRoZSBmZWF0dXJlIHdpbGwgYmVcbiAgLy8vIGluIHRoZSAnY2hhbmdpbmcnIHN0YXRlLiBBbHNvIG5vdGUgdGhhdCB0aGUgZmVhdHVyZSB3aWxsIGJlIGNoYW5nZWQgYXQgdGhlIFwiZGVmYXVsdFwiIGxheWVyLlxuICByZWFkb25seSBvbkNoYW5nZURlZmF1bHQ/OiAobmFtZTogSywgbmV3VmFsdWU6IEZlYXR1cmVWYWx1ZSkgPT4gUHJvbWlzZTxGZWF0dXJlVmFsdWU+O1xuXG4gIC8vLyBpZiBzZXQgdHJ1ZSwgd2lsbCBmb3JjZSB0aGUgZmllbGQgdG8gd2hhdCBpdCBpcyBzZXQgaGVyZSB0aHJvdWdoIGxheWVycyBvZiBzdGF0ZXMuXG4gIC8vLyB1c2VmdWwgdG8gaW52ZXJ0IHRoZSBsYXllcnMsIHNpbWlsYXIgdG8gIWltcG9ydGFudCBpbiBDU1MuXG4gIHJlYWRvbmx5IGZvcmNlPzogYm9vbGVhbjtcblxuICAvLy8gSWYgc2V0IHRvIHRydWUsIHRoZSBmZWF0dXJlIHdpbGwgbm90IGJlIG92ZXJyaWRhYmxlIGJ5IHRoZSB1c2VyLlxuICByZWFkb25seSBub092ZXJyaWRlPzogYm9vbGVhbjtcblxuICAvLy8gY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB3aGF0IHNob3VsZCBoYXBwZW4gaWYgdGhlIGZlYXR1cmUgaXMgbm90IHNldCB0byBhIHBhcnRpY3VsYXIgdmFsdWUuXG4gIHJlYWRvbmx5IGRlZmF1bHRWYWx1ZT86IEZlYXR1cmVWYWx1ZTtcbn1cblxuaW50ZXJmYWNlIEZlYXR1cmVDb250ZXh0IHtcbiAgZmVhdHVyZURlc2M/OiBGZWF0dXJlRGVzY3JpcHRpb247XG59XG5cbnR5cGUgRmVhdHVyZVR5cGVTdGF0ZSA9XG4gIHwge1xuICAgICAgdmFsdWU6ICdhc3luY0RlbmFibGVkJztcbiAgICAgIGNvbnRleHQ6IEZlYXR1cmVDb250ZXh0O1xuICAgIH1cbiAgfCB7XG4gICAgICB2YWx1ZTogJ2FzeW5jRGlzYWJsZWQnO1xuICAgICAgY29udGV4dDogRmVhdHVyZUNvbnRleHQ7XG4gICAgfVxuICB8IHtcbiAgICAgIHZhbHVlOiAnYXN5bmNVbnNwZWNpZWQnO1xuICAgICAgY29udGV4dDogRmVhdHVyZUNvbnRleHQ7XG4gICAgfVxuICB8IHtcbiAgICAgIHZhbHVlOiAnZGlzYWJsZWQnO1xuICAgICAgY29udGV4dDogRmVhdHVyZUNvbnRleHQ7XG4gICAgfVxuICB8IHtcbiAgICAgIHZhbHVlOiAnZW5hYmxlZCc7XG4gICAgICBjb250ZXh0OiBGZWF0dXJlQ29udGV4dDtcbiAgICB9XG4gIHwge1xuICAgICAgdmFsdWU6ICdpbml0aWFsJztcbiAgICAgIGNvbnRleHQ6IG5ldmVyO1xuICAgIH1cbiAgfCB7XG4gICAgICB2YWx1ZTogJ3Vuc3BlY2llZCc7XG4gICAgICBjb250ZXh0OiBGZWF0dXJlQ29udGV4dDtcbiAgICB9O1xuXG4vKipcbiAqIEFjdGlvbnMgdGhhdCBjYW4gYmUgcGVyZm9ybWVkIG9uIGEgZmVhdHVyZS5cbiAqL1xuZXhwb3J0IHR5cGUgRmVhdHVyZUFjdGlvbiA9XG4gIHwgeyB0eXBlOiAnRElTQUJMRScgfVxuICB8IHsgdHlwZTogJ0VOQUJMRScgfVxuICB8IHsgdHlwZTogJ0lOSVQnOyBmZWF0dXJlOiBGZWF0dXJlRGVzY3JpcHRpb24gfVxuICB8IHsgdHlwZTogJ1NFVCc7IHZhbHVlOiBGZWF0dXJlVmFsdWUgfVxuICB8IHsgdHlwZTogJ1RPR0dMRScgfVxuICB8IHsgdHlwZTogJ1VOU0VUJyB9O1xuXG4vKipcbiAqIEZ1bGx5IGRlc2NyaWJlIHRoZSBzdGF0ZXMgYSBmZWF0dXJlIGNhbiBiZSBpblxuICovXG5leHBvcnQgY29uc3QgRmVhdHVyZU1hY2hpbmUgPSBjcmVhdGVNYWNoaW5lPEZlYXR1cmVDb250ZXh0LCBGZWF0dXJlQWN0aW9uLCBGZWF0dXJlVHlwZVN0YXRlPih7XG4gIGlkOiAnZmVhdHVyZScsXG4gIGluaXRpYWw6ICdpbml0aWFsJyxcbiAgY29udGV4dDoge30sXG4gIHByZWRpY3RhYmxlQWN0aW9uQXJndW1lbnRzOiB0cnVlLFxuICBvbjoge1xuICAgIEVOQUJMRTogW1xuICAgICAgeyB0YXJnZXQ6ICdhc3luY0VuYWJsZWQnLCBjb25kOiAoY3R4KSA9PiBjdHguZmVhdHVyZURlc2M/Lm9uQ2hhbmdlRGVmYXVsdCAhPSBudWxsIH0sXG4gICAgICB7IHRhcmdldDogJ2VuYWJsZWQnIH0sXG4gICAgXSxcblxuICAgIFRPR0dMRTogW1xuICAgICAgeyB0YXJnZXQ6ICdhc3luY0VuYWJsZWQnLCBjb25kOiAoY3R4KSA9PiBjdHguZmVhdHVyZURlc2M/Lm9uQ2hhbmdlRGVmYXVsdCAhPSBudWxsIH0sXG4gICAgICB7IHRhcmdldDogJ2VuYWJsZWQnIH0sXG4gICAgXSxcblxuICAgIERJU0FCTEU6IFtcbiAgICAgIHsgdGFyZ2V0OiAnYXN5bmNEaXNhYmxlZCcsIGNvbmQ6IChjdHgpID0+IGN0eC5mZWF0dXJlRGVzYz8ub25DaGFuZ2VEZWZhdWx0ICE9IG51bGwgfSxcbiAgICAgIHsgdGFyZ2V0OiAnZGlzYWJsZWQnIH0sXG4gICAgXSxcblxuICAgIFVOU0VUOiBbXG4gICAgICB7IHRhcmdldDogJ2FzeW5jVW5zcGVjaWVkJywgY29uZDogKGN0eCkgPT4gY3R4LmZlYXR1cmVEZXNjPy5vbkNoYW5nZURlZmF1bHQgIT0gbnVsbCB9LFxuICAgICAgeyB0YXJnZXQ6ICd1bnNwZWNpZmllZCcgfSxcbiAgICBdLFxuXG4gICAgU0VUOiBbXG4gICAgICB7XG4gICAgICAgIHRhcmdldDogJ2FzeW5jRW5hYmxlZCcsXG4gICAgICAgIGNvbmQ6IChjdHgsIGUpID0+IGUudmFsdWUgPT09IHRydWUgJiYgY3R4LmZlYXR1cmVEZXNjPy5vbkNoYW5nZURlZmF1bHQgIT0gbnVsbCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHRhcmdldDogJ2FzeW5jRGlzYWJsZWQnLFxuICAgICAgICBjb25kOiAoY3R4LCBlKSA9PiBlLnZhbHVlID09PSBmYWxzZSAmJiBjdHguZmVhdHVyZURlc2M/Lm9uQ2hhbmdlRGVmYXVsdCAhPSBudWxsLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdGFyZ2V0OiAnYXN5bmNVbnNwZWNpZWQnLFxuICAgICAgICBjb25kOiAoY3R4LCBfZSkgPT4gY3R4LmZlYXR1cmVEZXNjPy5vbkNoYW5nZURlZmF1bHQgIT0gbnVsbCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHRhcmdldDogJ2VuYWJsZWQnLFxuICAgICAgICBjb25kOiAoX2N0eCwgZSkgPT4gZS52YWx1ZSA9PT0gdHJ1ZSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHRhcmdldDogJ2Rpc2FibGVkJyxcbiAgICAgICAgY29uZDogKF9jdHgsIGUpID0+IGUudmFsdWUgPT09IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIHsgdGFyZ2V0OiAndW5zcGVjaWZpZWQnIH0sXG4gICAgXSxcbiAgfSxcblxuICBzdGF0ZXM6IHtcbiAgICBpbml0aWFsOiB7XG4gICAgICBvbjoge1xuICAgICAgICBJTklUOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uczogYXNzaWduKHsgZmVhdHVyZURlc2M6IChfLCBlKSA9PiBlLmZlYXR1cmUgfSksXG4gICAgICAgICAgICB0YXJnZXQ6ICdlbmFibGVkJyxcbiAgICAgICAgICAgIGNvbmQ6IChfLCBlKSA9PiBlLmZlYXR1cmUuZGVmYXVsdFZhbHVlID09PSB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uczogYXNzaWduKHsgZmVhdHVyZURlc2M6IChfLCBlKSA9PiBlLmZlYXR1cmUgfSksXG4gICAgICAgICAgICB0YXJnZXQ6ICd1bnNwZWNpZmllZCcsXG4gICAgICAgICAgICBjb25kOiAoXywgZSkgPT4gZS5mZWF0dXJlLmRlZmF1bHRWYWx1ZSA9PT0gdW5kZWZpbmVkLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uczogYXNzaWduKHsgZmVhdHVyZURlc2M6IChfLCBlKSA9PiBlLmZlYXR1cmUgfSksXG4gICAgICAgICAgICB0YXJnZXQ6ICdkaXNhYmxlZCcsXG4gICAgICAgICAgICBjb25kOiAoXywgZSkgPT4gZS5mZWF0dXJlLmRlZmF1bHRWYWx1ZSA9PT0gZmFsc2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIHVuc3BlY2lmaWVkOiB7fSxcbiAgICBkaXNhYmxlZDoge30sXG4gICAgZW5hYmxlZDoge30sXG5cbiAgICBhc3luY0Rpc2FibGVkOiB7XG4gICAgICBpbnZva2U6IHtcbiAgICAgICAgaWQ6ICdzZXQtb2ZmLXVwc3RyZWFtJyxcbiAgICAgICAgc3JjOiBhc3luYyAoY3R4KSA9PiB7XG4gICAgICAgICAgY29uc3Qgb25jaGFuZ2UgPSBjdHguZmVhdHVyZURlc2M/Lm9uQ2hhbmdlRGVmYXVsdDtcbiAgICAgICAgICBpZiAob25jaGFuZ2UgIT0gbnVsbCAmJiBjdHguZmVhdHVyZURlc2MgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG9uY2hhbmdlKGN0eC5mZWF0dXJlRGVzYy5uYW1lLCBmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH0sXG4gICAgICAgIG9uRG9uZTogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRhcmdldDogJ2VuYWJsZWQnLFxuICAgICAgICAgICAgY29uZDogKF9jdHgsIGU6IERvbmVJbnZva2VFdmVudDxGZWF0dXJlVmFsdWU+KSA9PiBlLmRhdGEgPT09IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0YXJnZXQ6ICdkaXNhYmxlZCcsXG4gICAgICAgICAgICBjb25kOiAoX2N0eCwgZTogRG9uZUludm9rZUV2ZW50PEZlYXR1cmVWYWx1ZT4pID0+IGUuZGF0YSA9PT0gZmFsc2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IHRhcmdldDogJ3Vuc3BlY2lmaWVkJyB9LFxuICAgICAgICBdLFxuICAgICAgICBvbkVycm9yOiAndW5zcGVjaWZpZWQnLFxuICAgICAgfSxcbiAgICB9LFxuXG4gICAgYXN5bmNVbnNwZWNpZWQ6IHtcbiAgICAgIGludm9rZToge1xuICAgICAgICBpZDogJ3NldC11bnNldC11cHN0cmVhbScsXG4gICAgICAgIHNyYzogYXN5bmMgKGN0eCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG9uY2hhbmdlID0gY3R4LmZlYXR1cmVEZXNjPy5vbkNoYW5nZURlZmF1bHQ7XG4gICAgICAgICAgaWYgKG9uY2hhbmdlICE9IG51bGwgJiYgY3R4LmZlYXR1cmVEZXNjICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBvbmNoYW5nZShjdHguZmVhdHVyZURlc2MubmFtZSwgdW5kZWZpbmVkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfSxcbiAgICAgICAgb25Eb25lOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdGFyZ2V0OiAnZW5hYmxlZCcsXG4gICAgICAgICAgICBjb25kOiAoX2N0eCwgZTogRG9uZUludm9rZUV2ZW50PEZlYXR1cmVWYWx1ZT4pID0+IGUuZGF0YSA9PT0gdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRhcmdldDogJ2Rpc2FibGVkJyxcbiAgICAgICAgICAgIGNvbmQ6IChfY3R4LCBlOiBEb25lSW52b2tlRXZlbnQ8RmVhdHVyZVZhbHVlPikgPT4gZS5kYXRhID09PSBmYWxzZSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHsgdGFyZ2V0OiAndW5zcGVjaWZpZWQnIH0sXG4gICAgICAgIF0sXG4gICAgICAgIG9uRXJyb3I6ICd1bnNwZWNpZmllZCcsXG4gICAgICB9LFxuICAgIH0sXG5cbiAgICBhc3luY0VuYWJsZWQ6IHtcbiAgICAgIGludm9rZToge1xuICAgICAgICBpZDogJ3NldC1vbi11cHN0cmVhbScsXG4gICAgICAgIHNyYzogYXN5bmMgKGN0eCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG9uY2hhbmdlID0gY3R4LmZlYXR1cmVEZXNjPy5vbkNoYW5nZURlZmF1bHQ7XG4gICAgICAgICAgaWYgKG9uY2hhbmdlICE9IG51bGwgJiYgY3R4LmZlYXR1cmVEZXNjICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBvbmNoYW5nZShjdHguZmVhdHVyZURlc2MubmFtZSwgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH0sXG4gICAgICAgIG9uRG9uZTogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRhcmdldDogJ2VuYWJsZWQnLFxuICAgICAgICAgICAgY29uZDogKF9jdHgsIGU6IERvbmVJbnZva2VFdmVudDxGZWF0dXJlVmFsdWU+KSA9PiBlLmRhdGEgPT09IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0YXJnZXQ6ICdkaXNhYmxlZCcsXG4gICAgICAgICAgICBjb25kOiAoX2N0eCwgZTogRG9uZUludm9rZUV2ZW50PEZlYXR1cmVWYWx1ZT4pID0+IGUuZGF0YSA9PT0gZmFsc2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IHRhcmdldDogJ3Vuc3BlY2lmaWVkJyB9LFxuICAgICAgICBdLFxuICAgICAgICBvbkVycm9yOiAndW5zcGVjaWZpZWQnLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxufSk7XG4iLCAiaW1wb3J0IFJlYWN0LCB7IHVzZU1lbW8sIFJlYWN0Tm9kZSwgdXNlRWZmZWN0LCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCB7IHVzZU1hY2hpbmUgfSBmcm9tICdAeHN0YXRlL3JlYWN0JztcblxuaW1wb3J0IHsgRW5hYmxlQ29udGV4dCB9IGZyb20gJy4vRW5hYmxlQ29udGV4dCc7XG5pbXBvcnQgeyBGZWF0dXJlQ29udGV4dCB9IGZyb20gJy4vRmVhdHVyZUNvbnRleHQnO1xuaW1wb3J0IHsgRmVhdHVyZXNNYWNoaW5lIH0gZnJvbSAnLi9GZWF0dXJlc1N0YXRlJztcbmltcG9ydCB7IEZlYXR1cmVEZXNjcmlwdGlvbiB9IGZyb20gJy4vRmVhdHVyZVN0YXRlJztcbmltcG9ydCB1c2VDb25zb2xlT3ZlcnJpZGUgZnJvbSAnLi91c2VDb25zb2xlT3ZlcnJpZGUnO1xuaW1wb3J0IHVzZVBlcnNpc3QsIHsgS0VZIH0gZnJvbSAnLi91c2VQZXJzaXN0JztcbmltcG9ydCB1c2VUZXN0Q2FsbGJhY2sgZnJvbSAnLi91c2VUZXN0Q2FsbGJhY2snO1xuXG5pbnRlcmZhY2UgRmVhdHVyZVByb3BzIHtcbiAgcmVhZG9ubHkgZmVhdHVyZXM6IHJlYWRvbmx5IEZlYXR1cmVEZXNjcmlwdGlvbltdO1xuICByZWFkb25seSBjaGlsZHJlbj86IFJlYWN0Tm9kZTtcbiAgcmVhZG9ubHkgZGlzYWJsZUNvbnNvbGU/OiBib29sZWFuO1xuICByZWFkb25seSBzdG9yYWdlPzogU3RvcmFnZTtcbn1cblxuLyoqXG4gKiBBIG1vcmUgYmF0dGVyaWVzLWVuYWJsZWQgcGFyZW50IGNvbXBvbmVudCB0aGF0IGtlZXBzIHRyYWNrIG9mIGZlYXR1cmUgc3RhdGVcbiAqIGludGVybmFsbHksIGFuZCBjcmVhdGVzIHdpbmRvdy5mZWF0dXJlLmVuYWJsZShcImZcIikgYW5kIHdpbmRvdy5mZWF0dXJlLmRpc2FibGUoXCJmXCIpLlxuICogS2VlcHMgdHJhY2sgb2Ygb3ZlcnJpZGVzIGFuZCBkZWZhdWx0cywgd2l0aCBkZWZhdWx0cyBwb3RlbnRpYWxseSBjb21pbmcgZnJvbSB5b3VyIHByb3BzXG4gKiBhbmQgb3ZlcnJpZGVzIGJlaW5nIHBlcnNpc3RlZCB0byB5b3VyIGNob2ljZSBvZiBzdG9yYWdlIGxheWVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gRmVhdHVyZXMoe1xuICBjaGlsZHJlbixcbiAgZmVhdHVyZXMsXG4gIGRpc2FibGVDb25zb2xlID0gZmFsc2UsXG4gIHN0b3JhZ2UgPSB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UsXG59OiBGZWF0dXJlUHJvcHMpOiBKU1guRWxlbWVudCB7XG4gIC8vIENhcHR1cmUgb25seSBmaXJzdCB2YWx1ZTsgd2UgZG9uJ3QgY2FyZSBhYm91dCBmdXR1cmUgdXBkYXRlc1xuICBjb25zdCBmZWF0dXJlc1JlZiA9IHVzZVJlZihmZWF0dXJlcyk7XG4gIGNvbnN0IFtvdmVycmlkZXNTdGF0ZSwgb3ZlcnJpZGVzU2VuZF0gPSB1c2VNYWNoaW5lKEZlYXR1cmVzTWFjaGluZSk7XG4gIGNvbnN0IFtkZWZhdWx0c1N0YXRlLCBkZWZhdWx0c1NlbmRdID0gdXNlTWFjaGluZShGZWF0dXJlc01hY2hpbmUpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgLy8vIExvYWQgZGVmYXVsdHNcbiAgICBkZWZhdWx0c1NlbmQoeyB0eXBlOiAnSU5JVCcsIGZlYXR1cmVzIH0pO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBkZWZhdWx0c1NlbmQoeyB0eXBlOiAnREVfSU5JVCcgfSk7XG4gICAgfTtcbiAgfSwgW2RlZmF1bHRzU2VuZCwgZmVhdHVyZXNdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGxldCBmOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuIHwgdW5kZWZpbmVkPiA9IHt9O1xuICAgIGlmIChzdG9yYWdlICE9IG51bGwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGZlYXR1cmVzSnNvbiA9IHN0b3JhZ2UuZ2V0SXRlbShLRVkpO1xuICAgICAgICBpZiAoZmVhdHVyZXNKc29uICE9IG51bGwpIHtcbiAgICAgICAgICBjb25zdCBmaCA9IEpTT04ucGFyc2UoZmVhdHVyZXNKc29uKTtcbiAgICAgICAgICBmID0gZmgub3ZlcnJpZGVzO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIENhbid0IHBhcnNlIG9yIGdldCBvciBvdGhlcndpc2U7IGlnbm9yZVxuICAgICAgICBjb25zb2xlLmVycm9yKCdlcnJvciBpbiBsb2NhbFN0b3JhZ2UnLCBlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBvdmVycmlkZXNTZW5kKHtcbiAgICAgIHR5cGU6ICdJTklUJyxcbiAgICAgIGZlYXR1cmVzOiBmZWF0dXJlc1JlZi5jdXJyZW50XG4gICAgICAgIC5maWx0ZXIoKHgpID0+IHgubm9PdmVycmlkZSAhPT0gdHJ1ZSlcbiAgICAgICAgLm1hcCgoeCkgPT4gKHsgbmFtZTogeC5uYW1lLCBkZXNjcmlwdGlvbjogeC5kZXNjcmlwdGlvbiwgZGVmYXVsdFZhbHVlOiBmPy5beC5uYW1lXSA/PyB1bmRlZmluZWQgfSkpLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIG92ZXJyaWRlc1NlbmQoeyB0eXBlOiAnREVfSU5JVCcgfSk7XG4gICAgfTtcbiAgfSwgW2ZlYXR1cmVzUmVmLCBvdmVycmlkZXNTZW5kLCBzdG9yYWdlXSk7XG5cbiAgdXNlUGVyc2lzdChzdG9yYWdlLCBmZWF0dXJlc1JlZi5jdXJyZW50LCBvdmVycmlkZXNTdGF0ZSk7XG5cbiAgY29uc3QgdGVzdENhbGxiYWNrID0gdXNlVGVzdENhbGxiYWNrKG92ZXJyaWRlc1N0YXRlLCBkZWZhdWx0c1N0YXRlKTtcbiAgdXNlQ29uc29sZU92ZXJyaWRlKCFkaXNhYmxlQ29uc29sZSwgZmVhdHVyZXNSZWYuY3VycmVudCwgdGVzdENhbGxiYWNrLCBkZWZhdWx0c1NlbmQpO1xuXG4gIGNvbnN0IGZlYXR1cmVWYWx1ZSA9IHVzZU1lbW8oXG4gICAgKCkgPT4gKHtcbiAgICAgIG92ZXJyaWRlc1NlbmQsXG4gICAgICBkZWZhdWx0c1NlbmQsXG4gICAgICBmZWF0dXJlc0Rlc2NyaXB0aW9uOiBmZWF0dXJlc1JlZi5jdXJyZW50LFxuICAgICAgb3ZlcnJpZGVzU3RhdGUsXG4gICAgICBkZWZhdWx0c1N0YXRlLFxuICAgICAgdGVzdDogdGVzdENhbGxiYWNrLFxuICAgIH0pLFxuICAgIFtvdmVycmlkZXNTZW5kLCBkZWZhdWx0c1NlbmQsIG92ZXJyaWRlc1N0YXRlLCBkZWZhdWx0c1N0YXRlLCB0ZXN0Q2FsbGJhY2tdXG4gICk7XG5cbiAgcmV0dXJuIChcbiAgICA8RmVhdHVyZUNvbnRleHQuUHJvdmlkZXIgdmFsdWU9e2ZlYXR1cmVWYWx1ZX0+XG4gICAgICA8RW5hYmxlQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17dGVzdENhbGxiYWNrfT57Y2hpbGRyZW59PC9FbmFibGVDb250ZXh0LlByb3ZpZGVyPlxuICAgIDwvRmVhdHVyZUNvbnRleHQuUHJvdmlkZXI+XG4gICk7XG59XG4iLCAiaW1wb3J0IHsgY3JlYXRlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHsgRmVhdHVyZVZhbHVlIH0gZnJvbSAnLi9GZWF0dXJlU3RhdGUnO1xuXG5leHBvcnQgdHlwZSBFbmFibGVDb250ZXh0VHlwZSA9IChmZWF0dXJlOiBzdHJpbmcpID0+IEZlYXR1cmVWYWx1ZTtcblxuLyoqXG4gKiBDb250YWluZWQgZnVuY3Rpb24gY2FuIGNoZWNrIHdoZXRoZXIgYSBnaXZlbiBmZWF0dXJlIGlzIGVuYWJsZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBFbmFibGVDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxFbmFibGVDb250ZXh0VHlwZT4oKF9zKSA9PiBmYWxzZSk7XG4iLCAiaW1wb3J0IHsgY3JlYXRlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHsgRmVhdHVyZXNEaXNwYXRjaCwgRmVhdHVyZXNTdGF0ZSB9IGZyb20gJy4vRmVhdHVyZXNTdGF0ZSc7XG5pbXBvcnQgeyBGZWF0dXJlRGVzY3JpcHRpb24sIEZlYXR1cmVWYWx1ZSB9IGZyb20gJy4vRmVhdHVyZVN0YXRlJztcblxuZXhwb3J0IGNvbnN0IEZlYXR1cmVDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxGZWF0dXJlQ29udGV4dFR5cGUgfCBudWxsPihudWxsKTtcblxuLy8vIEdpdmUgYWNjZXNzIHRvIHRoZSBvdmVycmlkZXMgbGF5ZXJcbmV4cG9ydCBpbnRlcmZhY2UgRmVhdHVyZUNvbnRleHRUeXBlIHtcbiAgLy8gTWFrZSBjaGFuZ2VzIHRvIHRoZSBvdmVycmlkZXNcbiAgb3ZlcnJpZGVzU2VuZDogRmVhdHVyZXNEaXNwYXRjaDtcblxuICAvLyBNYWtlIGNoYW5nZXMgdG8gZGVmYXVsdHNcbiAgZGVmYXVsdHNTZW5kOiBGZWF0dXJlc0Rpc3BhdGNoO1xuXG4gIGZlYXR1cmVzRGVzY3JpcHRpb246IHJlYWRvbmx5IEZlYXR1cmVEZXNjcmlwdGlvbltdO1xuXG4gIC8vIFN0YXRlIGlzIGluIGxheWVyczsgb3ZlcnJpZGVzIGFuZCBkZWZhdWx0c1xuICBvdmVycmlkZXNTdGF0ZTogRmVhdHVyZXNTdGF0ZTtcbiAgZGVmYXVsdHNTdGF0ZTogRmVhdHVyZXNTdGF0ZTtcblxuICAvLy8gVGVzdCB3aXRoIHByb3BlciBmYWxsYmFjayBhbmQgcmVzcGVjdGluZyB0aGUgdXNlcidzIGZvcmNlIHByZWZlcmVuY2VcbiAgdGVzdDogKGZsYWc6IHN0cmluZykgPT4gRmVhdHVyZVZhbHVlO1xufVxuIiwgImltcG9ydCB7IHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHsgRmVhdHVyZXNEaXNwYXRjaCB9IGZyb20gJy4vRmVhdHVyZXNTdGF0ZSc7XG5pbXBvcnQgeyBGZWF0dXJlRGVzY3JpcHRpb24sIEZlYXR1cmVWYWx1ZSB9IGZyb20gJy4vRmVhdHVyZVN0YXRlJztcbmltcG9ydCB7IEdsb2JhbEVuYWJsZSB9IGZyb20gJy4vR2xvYmFsRW5hYmxlJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlQ29uc29sZU92ZXJyaWRlKFxuICBjb25zb2xlT3ZlcnJpZGU6IGJvb2xlYW4sXG4gIGZlYXR1cmVzOiByZWFkb25seSBGZWF0dXJlRGVzY3JpcHRpb25bXSxcbiAgdGVzdEZlYXR1cmU6IChfOiBzdHJpbmcpID0+IEZlYXR1cmVWYWx1ZSxcbiAgZGlzcGF0Y2g6IEZlYXR1cmVzRGlzcGF0Y2hcbik6IHZvaWQge1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghY29uc29sZU92ZXJyaWRlKSB7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAvKiBlbXB0eSAqL1xuICAgICAgfTtcbiAgICB9XG4gICAgd2luZG93LmZlYXR1cmUgPSBuZXcgR2xvYmFsRW5hYmxlKGRpc3BhdGNoLCB0ZXN0RmVhdHVyZSwgZmVhdHVyZXMpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBpZiAod2luZG93LmZlYXR1cmUgIT0gbnVsbCkge1xuICAgICAgICBkZWxldGUgd2luZG93LmZlYXR1cmU7XG4gICAgICB9XG4gICAgfTtcbiAgfSwgW2ZlYXR1cmVzLCBkaXNwYXRjaCwgY29uc29sZU92ZXJyaWRlLCB0ZXN0RmVhdHVyZV0pO1xufVxuIiwgImltcG9ydCB7IEZlYXR1cmVzRGlzcGF0Y2ggfSBmcm9tICcuL0ZlYXR1cmVzU3RhdGUnO1xuaW1wb3J0IHsgRmVhdHVyZURlc2NyaXB0aW9uLCBGZWF0dXJlVmFsdWUgfSBmcm9tICcuL0ZlYXR1cmVTdGF0ZSc7XG5cbmV4cG9ydCBjbGFzcyBHbG9iYWxFbmFibGUge1xuICBwcml2YXRlIHJlYWRvbmx5IGZlYXR1cmVEZXNjOiByZWFkb25seSBGZWF0dXJlRGVzY3JpcHRpb25bXTtcbiAgcHJpdmF0ZSByZWFkb25seSBkaXNwYXRjaDogRmVhdHVyZXNEaXNwYXRjaDtcbiAgcHJpdmF0ZSByZWFkb25seSB0ZXN0RmVhdHVyZTogKHZhbHVlOiBzdHJpbmcpID0+IEZlYXR1cmVWYWx1ZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBkaXNwYXRjaDogRmVhdHVyZXNEaXNwYXRjaCxcbiAgICB0ZXN0RmVhdHVyZTogKF86IHN0cmluZykgPT4gRmVhdHVyZVZhbHVlLFxuICAgIGZlYXR1cmVEZXNjOiByZWFkb25seSBGZWF0dXJlRGVzY3JpcHRpb25bXVxuICApIHtcbiAgICB0aGlzLmZlYXR1cmVEZXNjID0gZmVhdHVyZURlc2M7XG4gICAgdGhpcy5kaXNwYXRjaCA9IGRpc3BhdGNoO1xuICAgIHRoaXMudGVzdEZlYXR1cmUgPSB0ZXN0RmVhdHVyZTtcbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGUoZmVhdHVyZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwYXRjaCh7IHR5cGU6ICdUT0dHTEUnLCBuYW1lOiBmZWF0dXJlIH0pO1xuICB9XG5cbiAgcHVibGljIGVuYWJsZShmZWF0dXJlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BhdGNoKHsgdHlwZTogJ0VOQUJMRScsIG5hbWU6IGZlYXR1cmUgfSk7XG4gIH1cblxuICBwdWJsaWMgdW5zZXQoZmVhdHVyZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwYXRjaCh7IHR5cGU6ICdVTlNFVCcsIG5hbWU6IGZlYXR1cmUgfSk7XG4gIH1cblxuICBwdWJsaWMgZGlzYWJsZShmZWF0dXJlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BhdGNoKHsgdHlwZTogJ0RJU0FCTEUnLCBuYW1lOiBmZWF0dXJlIH0pO1xuICB9XG5cbiAgcHVibGljIHNldEFsbChmZWF0dXJlczogeyBba2V5OiBzdHJpbmddOiBGZWF0dXJlVmFsdWUgfSk6IHZvaWQge1xuICAgIHRoaXMuZGlzcGF0Y2goeyB0eXBlOiAnU0VUX0FMTCcsIGZlYXR1cmVzIH0pO1xuICB9XG5cbiAgcHVibGljIGxpc3RGZWF0dXJlcygpOiByZWFkb25seSBbc3RyaW5nLCBGZWF0dXJlVmFsdWVdW10ge1xuICAgIHJldHVybiB0aGlzLmZlYXR1cmVEZXNjLm1hcCgoZikgPT4gW2YubmFtZSwgdGhpcy50ZXN0RmVhdHVyZShmLm5hbWUpXSk7XG4gIH1cbn1cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgZmVhdHVyZT86IEdsb2JhbEVuYWJsZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IHVzZU1lbW8sIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHsgRmVhdHVyZXNTdGF0ZSwgdmFsdWVPZkZlYXR1cmUgfSBmcm9tICcuL0ZlYXR1cmVzU3RhdGUnO1xuaW1wb3J0IHsgRmVhdHVyZURlc2NyaXB0aW9uLCBGZWF0dXJlVmFsdWUgfSBmcm9tICcuL0ZlYXR1cmVTdGF0ZSc7XG5cbmV4cG9ydCBjb25zdCBLRVkgPSAncmVhY3QtZW5hYmxlOmZlYXR1cmUtdmFsdWVzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlUGVyc2lzdChcbiAgc3RvcmFnZTogU3RvcmFnZSB8IHVuZGVmaW5lZCxcbiAgZmVhdHVyZXM6IHJlYWRvbmx5IEZlYXR1cmVEZXNjcmlwdGlvbltdLFxuICBvdmVycmlkZVN0YXRlOiBGZWF0dXJlc1N0YXRlXG4pOiB2b2lkIHtcbiAgY29uc3Qgb3ZlcnJpZGVzID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgbmV3T3ZlcnJpZGVzOiB7IFtrZXk6IHN0cmluZ106IEZlYXR1cmVWYWx1ZSB9ID0ge307XG4gICAgaWYgKG92ZXJyaWRlU3RhdGUubWF0Y2hlcygncmVhZHknKSkge1xuICAgICAgZm9yIChjb25zdCBmZWF0dXJlIG9mIGZlYXR1cmVzKSB7XG4gICAgICAgIGNvbnN0IFt2YWx1ZV0gPSB2YWx1ZU9mRmVhdHVyZShvdmVycmlkZVN0YXRlLCBmZWF0dXJlLm5hbWUpO1xuICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgIG5ld092ZXJyaWRlc1tmZWF0dXJlLm5hbWVdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ld092ZXJyaWRlcztcbiAgfSwgW2ZlYXR1cmVzLCBvdmVycmlkZVN0YXRlXSk7XG5cbiAgY29uc3Qgc3RyU3RhdGUgPSBPYmplY3Qua2V5cyhvdmVycmlkZXMpLmxlbmd0aCA9PT0gMCB8fCBzdG9yYWdlID09IG51bGwgPyAne30nIDogSlNPTi5zdHJpbmdpZnkoeyBvdmVycmlkZXMgfSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICB0cnkge1xuICAgICAgaWYgKHN0b3JhZ2UgIT0gbnVsbCAmJiBvdmVycmlkZVN0YXRlLm1hdGNoZXMoJ3JlYWR5JykpIHtcbiAgICAgICAgc3RvcmFnZS5zZXRJdGVtKEtFWSwgc3RyU3RhdGUpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIENhbid0IHNldCBmb3Igc29tZSByZWFzb25cbiAgICB9XG4gIH0sIFtvdmVycmlkZVN0YXRlLCBzdG9yYWdlLCBzdHJTdGF0ZV0pO1xufVxuIiwgImltcG9ydCB7IHVzZUNhbGxiYWNrIH0gZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgeyBGZWF0dXJlc1N0YXRlIH0gZnJvbSAnLi9GZWF0dXJlc1N0YXRlJztcbmltcG9ydCB0ZXN0RmVhdHVyZSBmcm9tICcuL3Rlc3RGZWF0dXJlJztcblxuLy8vIEEgY2FsbGJhY2sgdGhhdCBjYW4gYmUgY2FsbGVkIHRvIHRlc3QgaWYgYSBmZWF0dXJlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWRcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZVRlc3RDYWxsYmFjayhcbiAgZGVmYXVsdHNTdGF0ZTogRmVhdHVyZXNTdGF0ZSxcbiAgb3ZlcnJpZGVzU3RhdGU6IEZlYXR1cmVzU3RhdGVcbik6IChmZWF0dXJlOiBzdHJpbmcpID0+IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICByZXR1cm4gdXNlQ2FsbGJhY2soKGY6IHN0cmluZykgPT4gdGVzdEZlYXR1cmUoZiwgW2RlZmF1bHRzU3RhdGUsIG92ZXJyaWRlc1N0YXRlXSksIFtkZWZhdWx0c1N0YXRlLCBvdmVycmlkZXNTdGF0ZV0pO1xufVxuIiwgImltcG9ydCB7IEZlYXR1cmVzU3RhdGUsIHZhbHVlT2ZGZWF0dXJlIH0gZnJvbSAnLi9GZWF0dXJlc1N0YXRlJztcbmltcG9ydCB7IEZlYXR1cmVWYWx1ZSB9IGZyb20gJy4vRmVhdHVyZVN0YXRlJztcblxuLyoqIERldGVybWluZSBpZiB0aGUgZmVhdHVyZSBpcyBlbmFibGVkIGluIG9uZSBvZiB0aGUgc3RhdGUgbWFjaGluZXMsIGluIG9yZGVyXG4gKlxuICogQHBhcmFtIHN0YXRlIFRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBtYWNoaW5lXG4gKiBAcGFyYW0gZmVhdHVyZSBUaGUgZmVhdHVyZSB0byBjaGVja1xuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRlc3RGZWF0dXJlKGZlYXR1cmU6IHN0cmluZywgc3RhdGVzOiBGZWF0dXJlc1N0YXRlW10pOiBGZWF0dXJlVmFsdWUge1xuICBjb25zdCB2YWx1ZXMgPSBzdGF0ZXMubWFwKChzdGF0ZSkgPT4gdmFsdWVPZkZlYXR1cmUoc3RhdGUsIGZlYXR1cmUpKTtcblxuICAvLyBsb29rIGZvciBiZXN0IGZvcmNlZCBvcHRpb24sIGluIG9yZGVyXG4gIGZvciAoY29uc3QgW2ZlYXR1cmVWYWx1ZSwgZmVhdHVyZUZvcmNlZF0gb2YgdmFsdWVzKSB7XG4gICAgaWYgKGZlYXR1cmVWYWx1ZSAhPSBudWxsICYmIGZlYXR1cmVGb3JjZWQpIHtcbiAgICAgIHJldHVybiBmZWF0dXJlVmFsdWU7XG4gICAgfVxuICB9XG5cbiAgLy8gbG9vayBmb3IgYmVzdCBub24tZm9yY2VkIG9wdGlvbiwgaW4gb3JkZXJcbiAgZm9yIChjb25zdCBbZmVhdHVyZVZhbHVlXSBvZiB2YWx1ZXMpIHtcbiAgICBpZiAoZmVhdHVyZVZhbHVlICE9IG51bGwpIHtcbiAgICAgIHJldHVybiBmZWF0dXJlVmFsdWU7XG4gICAgfVxuICB9XG5cbiAgLy8gdW5zZXQgaWYgbm90aGluZyBoaXRcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiIsICJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCB7IHVzZUFsbEVuYWJsZWQgfSBmcm9tICcuL3VzZUFsbEVuYWJsZWQnO1xuaW1wb3J0IHsgdXNlRW5hYmxlZCB9IGZyb20gJy4vdXNlRW5hYmxlZCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW5hYmxlUHJvcHMge1xuICByZWFkb25seSBmZWF0dXJlPzogc3RyaW5nW10gfCBzdHJpbmc7XG4gIHJlYWRvbmx5IGFsbEZlYXR1cmVzPzogc3RyaW5nW107XG4gIGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGU7XG59XG5cbi8qKlxuICogRmVhdHVyZSB3aWxsIGJlIGVuYWJsZWQgaWYgYW55IGZlYXR1cmUgaW4gdGhlIGxpc3QgYXJlIGVuYWJsZWQsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFbmFibGUoeyBmZWF0dXJlID0gW10sIGFsbEZlYXR1cmVzID0gW10sIGNoaWxkcmVuIH06IEVuYWJsZVByb3BzKTogSlNYLkVsZW1lbnQgfCBudWxsIHtcbiAgY29uc3QgaXNBbnkgPSB1c2VFbmFibGVkKGZlYXR1cmUpO1xuICBjb25zdCBpc0FsbCA9IHVzZUFsbEVuYWJsZWQoYWxsRmVhdHVyZXMpO1xuXG4gIGlmIChpc0FueSB8fCBpc0FsbCkge1xuICAgIHJldHVybiA8PntjaGlsZHJlbn08Lz47XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbiIsICJpbXBvcnQgeyB1c2VDb250ZXh0LCB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgeyBFbmFibGVDb250ZXh0VHlwZSwgRW5hYmxlQ29udGV4dCB9IGZyb20gJy4vRW5hYmxlQ29udGV4dCc7XG5cbi8vIEhlbHBlcjogZ2V0IHJpZCBvZiBzb21lIGJvaWxlcnBsYXRlLlxuLy8ganVzdCBpbnB1dCBtYXNoaW5nIGFuZCBzYW5pdGF0aW9uLCByZW1vdmluZyBleHRyYSByZW5kZXJzLCBhbmQgZ2V0dGluZyB0ZXN0IGZ1bmN0aW9uXG5leHBvcnQgZnVuY3Rpb24gdXNlVGVzdEFuZENvbnZlcnQoaW5wdXQ/OiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwpOiBbRW5hYmxlQ29udGV4dFR5cGUsIHN0cmluZ1tdXSB7XG4gIGNvbnN0IHRlc3QgPSB1c2VDb250ZXh0KEVuYWJsZUNvbnRleHQpO1xuXG4gIC8vIFdlIG1lbW9pemUganVzdCB0byBwcmV2ZW50IHJlLXJlbmRlcnMgc2luY2UgdGhpcyBjb3VsZCBiZSBhdCB0aGUgbGVhZiBvZiBhIHRyZWVcbiAgY29uc3QgY29udmVydGVkID0gdXNlTWVtbygoKSA9PiAoaW5wdXQgPT0gbnVsbCA/IFtdIDogQXJyYXkuaXNBcnJheShpbnB1dCkgPyBpbnB1dCA6IFtpbnB1dF0pLCBbaW5wdXRdKTtcblxuICByZXR1cm4gW3Rlc3QsIGNvbnZlcnRlZF07XG59XG4iLCAiaW1wb3J0IHsgdXNlVGVzdEFuZENvbnZlcnQgfSBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiByZXR1cm5zIHRydWUgaWZmIGFsbCBzcGVjaWZpZWQgZmVhdHVyZXMgYXJlIGVuYWJsZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUFsbEVuYWJsZWQoYWxsRmVhdHVyZXM6IHN0cmluZ1tdIHwgc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IFt0ZXN0LCBxdWVyeUFsbFByZXNlbnRdID0gdXNlVGVzdEFuZENvbnZlcnQoYWxsRmVhdHVyZXMpO1xuICByZXR1cm4gcXVlcnlBbGxQcmVzZW50Lmxlbmd0aCA+IDAgJiYgcXVlcnlBbGxQcmVzZW50LmV2ZXJ5KHRlc3QpO1xufVxuIiwgImltcG9ydCB7IHVzZVRlc3RBbmRDb252ZXJ0IH0gZnJvbSAnLi91dGlscyc7XG5cbi8qKlxuICogcmV0dXJucyB0cnVlIGlmZiBhbnkgc3BlY2lmaWVkIGZlYXR1cmUgaXMgZW5hYmxlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlRW5hYmxlZChmZWF0dXJlOiBzdHJpbmdbXSB8IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBbdGVzdCwgcXVlcnlBbnlQcmVzZW50XSA9IHVzZVRlc3RBbmRDb252ZXJ0KGZlYXR1cmUpO1xuICByZXR1cm4gcXVlcnlBbnlQcmVzZW50LnNvbWUodGVzdCk7XG59XG4iLCAiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5cbmltcG9ydCB7IEVuYWJsZVByb3BzIH0gZnJvbSBcIi4vRW5hYmxlXCI7XG5pbXBvcnQgeyB1c2VBbGxEaXNhYmxlZCB9IGZyb20gXCIuL3VzZUFsbERpc2FibGVkXCI7XG5pbXBvcnQgeyB1c2VEaXNhYmxlZCB9IGZyb20gXCIuL3VzZURpc2FibGVkXCI7XG5cbi8qKlxuICogRmVhdHVyZSB3aWxsIGJlIGRpc2FibGVkIGlmIGFueSBpbiB0aGUgbGlzdCBhcmUgZW5hYmxlZFxuICovXG5leHBvcnQgY29uc3QgRGlzYWJsZTogUmVhY3QuRkM8RW5hYmxlUHJvcHM+ID0gKHtcbiAgZmVhdHVyZSA9IFtdLFxuICBhbGxGZWF0dXJlcyA9IFtdLFxuICBjaGlsZHJlblxufSkgPT4ge1xuICBjb25zdCBpc0FueSA9IHVzZURpc2FibGVkKGZlYXR1cmUpO1xuICBjb25zdCBpc0FsbCA9IHVzZUFsbERpc2FibGVkKGFsbEZlYXR1cmVzKTtcblxuICBpZiAoaXNBbnkgfHwgaXNBbGwpIHtcbiAgICByZXR1cm4gPD57Y2hpbGRyZW59PC8+O1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59O1xuIiwgImltcG9ydCB7IHVzZVRlc3RBbmRDb252ZXJ0IH0gZnJvbSAnLi91dGlscyc7XG5cbi8qKlxuICogcmV0dXJucyB0cnVlIGlmZiBhbGwgc3BlY2lmaWVkIGZlYXR1cmVzIGFyZSBkaXNhYmxlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlQWxsRGlzYWJsZWQod2l0aG91dEFsbDogc3RyaW5nW10gfCBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgW3Rlc3QsIHF1ZXJ5QWxsV2l0aG91dF0gPSB1c2VUZXN0QW5kQ29udmVydCh3aXRob3V0QWxsKTtcbiAgcmV0dXJuIHdpdGhvdXRBbGwubGVuZ3RoID4gMCAmJiBxdWVyeUFsbFdpdGhvdXQuZXZlcnkoKHgpID0+ICEodGVzdCh4KSA/PyBmYWxzZSkpO1xufVxuIiwgImltcG9ydCB7IHVzZVRlc3RBbmRDb252ZXJ0IH0gZnJvbSAnLi91dGlscyc7XG5cbi8qKlxuICogcmV0dXJucyB0cnVlIGlmZiBhbnkgc3BlY2lmaWVkIGZlYXR1cmUgaXMgZGlzYWJsZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZURpc2FibGVkKHdpdGhvdXQ6IHN0cmluZ1tdIHwgc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IFt0ZXN0LCBxdWVyeUFueVdpdGhvdXRdID0gdXNlVGVzdEFuZENvbnZlcnQod2l0aG91dCk7XG4gIHJldHVybiBxdWVyeUFueVdpdGhvdXQuc29tZSgoeCkgPT4gISh0ZXN0KHgpID8/IGZhbHNlKSk7XG59XG4iLCAiaW1wb3J0IFJlYWN0LCB7IHVzZUNvbnRleHQsIHVzZVN0YXRlLCB1c2VDYWxsYmFjaywgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbSc7XG5cbmltcG9ydCB7IFJhZGlvR3JvdXAgfSBmcm9tICdAaGVhZGxlc3N1aS9yZWFjdCc7XG5cbmltcG9ydCB7IEZlYXR1cmVDb250ZXh0IH0gZnJvbSAnLi9GZWF0dXJlQ29udGV4dCc7XG5pbXBvcnQgeyB2YWx1ZU9mRmVhdHVyZSB9IGZyb20gJy4vRmVhdHVyZXNTdGF0ZSc7XG5pbXBvcnQgeyBGZWF0dXJlRGVzY3JpcHRpb24gfSBmcm9tICcuL0ZlYXR1cmVTdGF0ZSc7XG4vLyBAdHMtZXhwZWN0LWVycm9yIGJ1bmRsZXIgd2lsbCB0YWtlIGNhcmUgb2YgdGhpc1xuaW1wb3J0IHN0eWxlcyBmcm9tICcuL3RhaWx3aW5kLmNzcyc7XG5cbmZ1bmN0aW9uIGNsYXNzTmFtZXMoLi4uY2xhc3Nlczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gY2xhc3Nlcy5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xufVxuXG5mdW5jdGlvbiBUb2dnbGVGZWF0dXJlKHsgZmVhdHVyZSB9OiB7IGZlYXR1cmU6IEZlYXR1cmVEZXNjcmlwdGlvbiB9KTogSlNYLkVsZW1lbnQgfCBudWxsIHtcbiAgY29uc3QgY29udGV4dCA9IHVzZUNvbnRleHQoRmVhdHVyZUNvbnRleHQpO1xuICBjb25zdCBoYW5kbGVDaGFuZ2VTZWxlY3Rpb24gPSB1c2VDYWxsYmFjayhcbiAgICAodmFsdWU6ICdmYWxzZScgfCAndHJ1ZScgfCAndW5zZXQnKSA9PiB7XG4gICAgICBpZiAoY29udGV4dD8ub3ZlcnJpZGVzU2VuZCAhPSBudWxsKSB7XG4gICAgICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgICAgICBjYXNlICd0cnVlJzoge1xuICAgICAgICAgICAgY29udGV4dC5vdmVycmlkZXNTZW5kKHsgdHlwZTogJ0VOQUJMRScsIG5hbWU6IGZlYXR1cmUubmFtZSB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdmYWxzZSc6IHtcbiAgICAgICAgICAgIGNvbnRleHQub3ZlcnJpZGVzU2VuZCh7IHR5cGU6ICdESVNBQkxFJywgbmFtZTogZmVhdHVyZS5uYW1lIH0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3Vuc2V0Jzoge1xuICAgICAgICAgICAgY29udGV4dC5vdmVycmlkZXNTZW5kKHsgdHlwZTogJ1VOU0VUJywgbmFtZTogZmVhdHVyZS5uYW1lIH0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBbZmVhdHVyZS5uYW1lLCBjb250ZXh0XVxuICApO1xuXG4gIGlmIChjb250ZXh0ID09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHsgb3ZlcnJpZGVzU3RhdGUsIHRlc3Q6IHRlc3RGZWF0dXJlLCBkZWZhdWx0c1N0YXRlIH0gPSBjb250ZXh0O1xuXG4gIGNvbnN0IHZhbHVlSW5EZWZhdWx0cyA9ICh2YWx1ZU9mRmVhdHVyZShkZWZhdWx0c1N0YXRlLCBmZWF0dXJlLm5hbWUpWzBdID8/ICd1bnNldCcpLnRvU3RyaW5nKCkgYXNcbiAgICB8ICdmYWxzZSdcbiAgICB8ICd0cnVlJ1xuICAgIHwgJ3Vuc2V0JztcblxuICBjb25zdCB2YWx1ZUluT3ZlcnJpZGVzID0gKHZhbHVlT2ZGZWF0dXJlKG92ZXJyaWRlc1N0YXRlLCBmZWF0dXJlLm5hbWUpWzBdID8/ICd1bnNldCcpLnRvU3RyaW5nKCkgYXNcbiAgICB8ICdmYWxzZSdcbiAgICB8ICd0cnVlJ1xuICAgIHwgJ3Vuc2V0JztcblxuICBjb25zdCBhY3R1YWxDaGVja2VkID0gdGVzdEZlYXR1cmUoZmVhdHVyZS5uYW1lKTtcblxuICByZXR1cm4gKFxuICAgIDxSYWRpb0dyb3VwIGRpc2FibGVkPXtmZWF0dXJlLm5vT3ZlcnJpZGV9IG9uQ2hhbmdlPXtoYW5kbGVDaGFuZ2VTZWxlY3Rpb259IHZhbHVlPXt2YWx1ZUluT3ZlcnJpZGVzfT5cbiAgICAgIDxSYWRpb0dyb3VwLkxhYmVsPlxuICAgICAgICA8aDYgY2xhc3NOYW1lPVwidGV4dC1ncmF5LTkwMCBhbGlnbi1jZW50ZXIgZmxleCBmbGV4LXJvdyBmbGV4LW5vd3JhcCBpdGVtcy1jZW50ZXIgZ2FwLTIgbGc6Z2FwLTQgaC03XCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZm9udC1tZWRpdW1cIj5cbiAgICAgICAgICAgIEZlYXR1cmU6IDxjb2RlPntmZWF0dXJlLm5hbWV9PC9jb2RlPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICB7ZmVhdHVyZS5ub092ZXJyaWRlID09PSB0cnVlID8gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJib3JkZXItb3JhbmdlLTUwMCB0ZXh0LW9yYW5nZS01MDAgZmxleCBmbGV4LW5vd3JhcCB0ZXh0LXhzIGZsZXgtcm93IGdhcC0xIHJvdW5kZWQtc20gYm9yZGVyIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBweC0yIHB5LTFcIj5cbiAgICAgICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaC00IHctNCBtaW4tdy00XCJcbiAgICAgICAgICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDIwIDIwXCJcbiAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICBjbGlwUnVsZT1cImV2ZW5vZGRcIlxuICAgICAgICAgICAgICAgICAgZD1cIk01IDlWN2E1IDUgMCAwMTEwIDB2MmEyIDIgMCAwMTIgMnY1YTIgMiAwIDAxLTIgMkg1YTIgMiAwIDAxLTItMnYtNWEyIDIgMCAwMTItMnptOC0ydjJIN1Y3YTMgMyAwIDAxNiAwelwiXG4gICAgICAgICAgICAgICAgICBmaWxsUnVsZT1cImV2ZW5vZGRcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICA8ZGl2Pk5vIE92ZXJyaWRlczwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAge2FjdHVhbENoZWNrZWQgPT09IHRydWUgPyAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1ub3dyYXAgdGV4dC14cyB0ZXh0LWdyZWVuLTUwMCBmbGV4LXJvdyBnYXAtMSByb3VuZGVkLXNtIGJvcmRlciBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgYm9yZGVyLWdyZWVuLTUwMCBweC0yIHB5LTFcIj5cbiAgICAgICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaC00IHctNCBtaW4tdy00XCJcbiAgICAgICAgICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDIwIDIwXCJcbiAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICBjbGlwUnVsZT1cImV2ZW5vZGRcIlxuICAgICAgICAgICAgICAgICAgZD1cIk0xMCAxOGE4IDggMCAxMDAtMTYgOCA4IDAgMDAwIDE2em0zLjcwNy05LjI5M2ExIDEgMCAwMC0xLjQxNC0xLjQxNEw5IDEwLjU4NiA3LjcwNyA5LjI5M2ExIDEgMCAwMC0xLjQxNCAxLjQxNGwyIDJhMSAxIDAgMDAxLjQxNCAwbDQtNHpcIlxuICAgICAgICAgICAgICAgICAgZmlsbFJ1bGU9XCJldmVub2RkXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgPGRpdj57YWN0dWFsQ2hlY2tlZCA/ICdFbmFibGVkJyA6ICdEaXNhYmxlZCd9PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgPC9oNj5cbiAgICAgICAge2ZlYXR1cmUuZGVzY3JpcHRpb24gPT0gbnVsbCA/IG51bGwgOiA8cCBjbGFzc05hbWU9XCJ0ZXh0LWJhc2UgdGV4dC1ncmF5LTUwMCB0ZXh0LXNtXCI+e2ZlYXR1cmUuZGVzY3JpcHRpb259PC9wPn1cbiAgICAgIDwvUmFkaW9Hcm91cC5MYWJlbD5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtNCBncmlkIGdyaWQtY29scy0xIGdhcC15LTYgc206Z3JpZC1jb2xzLTMgc206Z2FwLXgtNFwiPlxuICAgICAgICB7W1xuICAgICAgICAgIHsgaWQ6ICdmYWxzZScsIHRpdGxlOiBgRGlzYWJsZSAke2ZlYXR1cmUubmFtZX1gLCBkZXNjcmlwdGlvbjogJ092ZXJyaWRlIHRoZSBmZWF0dXJlIHRvIGJlIGRpc2FibGVkJyB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlkOiAndW5zZXQnLFxuICAgICAgICAgICAgdGl0bGU6ICdEZWZhdWx0JyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnSW5oZXJpdCBlbmFibGVkIHN0YXRlIGZyb20gZGVmYXVsdHMnLFxuICAgICAgICAgICAgZGlzYWJsZWQ6IChmZWF0dXJlLm5vT3ZlcnJpZGUgPz8gZmFsc2UpIHx8IGZlYXR1cmUuZm9yY2UsXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6XG4gICAgICAgICAgICAgIHZhbHVlSW5EZWZhdWx0cyA9PT0gJ3RydWUnID8gKFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1ncmVlbi01MDAgYm9yZGVyLWdyZWVuLTUwMCBmbGV4IGZsZXgtbm93cmFwIHRleHQteHMgZmxleC1yb3cgZ2FwLTEgcm91bmRlZC1zbSBib3JkZXIgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHB4LTIgcHktMVwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+RW5hYmxlZDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtcmVkLTUwMCBib3JkZXItcmVkLTUwMCBmbGV4IGZsZXgtbm93cmFwIHRleHQteHMgZmxleC1yb3cgZ2FwLTEgcm91bmRlZC1zbSBib3JkZXIgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHB4LTIgcHktMVwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+RGlzYWJsZWQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IGlkOiAndHJ1ZScsIHRpdGxlOiBgRW5hYmxlICR7ZmVhdHVyZS5uYW1lfWAsIGRlc2NyaXB0aW9uOiAnT3ZlcnJpZGUgdGhlIGZlYXR1cmUgdG8gYmUgZW5hYmxlZCcgfSxcbiAgICAgICAgXS5tYXAoKG9wdGlvbikgPT4gKFxuICAgICAgICAgIDxSYWRpb0dyb3VwLk9wdGlvblxuICAgICAgICAgICAgY2xhc3NOYW1lPXsoeyBjaGVja2VkLCBhY3RpdmUsIGRpc2FibGVkIH0pID0+XG4gICAgICAgICAgICAgIGNsYXNzTmFtZXMoXG4gICAgICAgICAgICAgICAgY2hlY2tlZCA/ICdib3JkZXItdHJhbnNwYXJlbnQnIDogJ2JvcmRlci1ncmF5LTMwMCcsXG4gICAgICAgICAgICAgICAgIWRpc2FibGVkICYmIGFjdGl2ZSA/ICdib3JkZXItYmx1ZS01MDAgcmluZy0yIHJpbmctYmx1ZS01MDAnIDogJycsXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQgPyAnYm9yZGVyLXRyYW5zcGFyZW50IHJpbmctZ3JheS01MDAgY3Vyc29yLW5vdC1hbGxvd2VkJyA6ICdjdXJzb3ItcG9pbnRlcicsXG4gICAgICAgICAgICAgICAgJ3JlbGF0aXZlIGJnLXdoaXRlIGJvcmRlciByb3VuZGVkLWxnIHNoYWRvdy1zbSBwLTMgZmxleCBmb2N1czpvdXRsaW5lLW5vbmUnXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRpc2FibGVkPXtvcHRpb24uZGlzYWJsZWR9XG4gICAgICAgICAgICBrZXk9e29wdGlvbi5pZH1cbiAgICAgICAgICAgIHZhbHVlPXtvcHRpb24uaWR9XG4gICAgICAgICAgPlxuICAgICAgICAgICAgeyh7IGNoZWNrZWQsIGFjdGl2ZSwgZGlzYWJsZWQgfSkgPT4gKFxuICAgICAgICAgICAgICA8PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBncm93XCI+XG4gICAgICAgICAgICAgICAgICA8UmFkaW9Hcm91cC5MYWJlbCBhcz1cInNwYW5cIiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtbm93cmFwIGZsZXgtcm93IGdhcC0xIGl0ZW1zLWNlbnRlciBzcGFjZS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1ncmF5LTkwMCBncm93IHNocmlua1wiPntvcHRpb24udGl0bGV9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB7b3B0aW9uLmRlZmF1bHRWYWx1ZSAhPSBudWxsID8gb3B0aW9uLmRlZmF1bHRWYWx1ZSA6IG51bGx9XG4gICAgICAgICAgICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lcyghY2hlY2tlZCA/ICdpbnZpc2libGUnIDogJycsICdoLTUgdy01IHRleHQtYmx1ZS01MDAgbWluLXctNCcpfVxuICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjAgMjBcIlxuICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBSdWxlPVwiZXZlbm9kZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTEwIDE4YTggOCAwIDEwMC0xNiA4IDggMCAwMDAgMTZ6bTMuNzA3LTkuMjkzYTEgMSAwIDAwLTEuNDE0LTEuNDE0TDkgMTAuNTg2IDcuNzA3IDkuMjkzYTEgMSAwIDAwLTEuNDE0IDEuNDE0bDIgMmExIDEgMCAwMDEuNDE0IDBsNC00elwiXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxsUnVsZT1cImV2ZW5vZGRcIlxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgPC9SYWRpb0dyb3VwLkxhYmVsPlxuICAgICAgICAgICAgICAgICAgPFJhZGlvR3JvdXAuRGVzY3JpcHRpb24gYXM9XCJzcGFuXCIgY2xhc3NOYW1lPVwibXQtMSBmbGV4IGl0ZW1zLWNlbnRlciB0ZXh0LXNtIHRleHQtZ3JheS01MDBcIj5cbiAgICAgICAgICAgICAgICAgICAge29wdGlvbi5kZXNjcmlwdGlvbn1cbiAgICAgICAgICAgICAgICAgIDwvUmFkaW9Hcm91cC5EZXNjcmlwdGlvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWVzKFxuICAgICAgICAgICAgICAgICAgICAhZGlzYWJsZWQgJiYgYWN0aXZlID8gJ2JvcmRlcicgOiAnYm9yZGVyLTInLFxuICAgICAgICAgICAgICAgICAgICBjaGVja2VkID8gKGRpc2FibGVkID8gJ2JvcmRlci1ncmF5LTUwMCcgOiAnYm9yZGVyLWJsdWUtNTAwJykgOiAnYm9yZGVyLXRyYW5zcGFyZW50JyxcbiAgICAgICAgICAgICAgICAgICAgJ2Fic29sdXRlIC1pbnNldC1weCByb3VuZGVkLWxnIHBvaW50ZXItZXZlbnRzLW5vbmUnXG4gICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L1JhZGlvR3JvdXAuT3B0aW9uPlxuICAgICAgICApKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvUmFkaW9Hcm91cD5cbiAgKTtcbn1cblxuZnVuY3Rpb24gU2hhZG93Q29udGVudCh7IHJvb3QsIGNoaWxkcmVuIH06IHsgY2hpbGRyZW46IFJlYWN0Tm9kZTsgcm9vdDogRWxlbWVudCB9KSB7XG4gIHJldHVybiBSZWFjdERPTS5jcmVhdGVQb3J0YWwoY2hpbGRyZW4sIHJvb3QpO1xufVxuXG4vLy8gUGVybWl0IHVzZXJzIHRvIG92ZXJyaWRlIGZlYXR1cmUgZmxhZ3MgdmlhIGEgR1VJLlxuLy8vIFJlbmRlcnMgYSBzbWFsbCBmbG9hdGluZyBidXR0b24gaW4gbG93ZXIgbGVmdCBvciByaWdodCwgcHJlc3NpbmcgaXQgYnJpbmdzIHVwXG4vLy8gYSBsaXN0IG9mIGZlYXR1cmVzIHRvIHRvZ2dsZSBhbmQgdGhlaXIgY3VycmVudCBvdmVycmlkZSBzdGF0ZS4geW91IGNhbiBvdmVycmlkZSBvbiBvciBvdmVycmlkZSBvZmYsXG4vLy8gb3IgdW5zZXQgdGhlIG92ZXJyaWRlIGFuZCBnbyBiYWNrIHRvIGRlZmF1bHQgdmFsdWUuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbmV4cG9ydCBmdW5jdGlvbiBUb2dnbGVGZWF0dXJlcyh7IGRlZmF1bHRPcGVuID0gZmFsc2UsIGhpZGRlbiA9IGZhbHNlIH06IHsgZGVmYXVsdE9wZW4/OiBib29sZWFuOyBoaWRkZW4/OiBib29sZWFuIH0pOiBKU1guRWxlbWVudCB8IG51bGwge1xuICBjb25zdCBbcm9vdCwgc2V0Q29yZVJvb3RdID0gdXNlU3RhdGU8SFRNTERpdkVsZW1lbnQgfCBudWxsPihudWxsKTtcblxuICBjb25zdCBzZXRSb290ID0gKGhvc3Q6IEhUTUxEaXZFbGVtZW50IHwgbnVsbCkgPT4ge1xuICAgIGlmIChob3N0ID09IG51bGwgfHwgcm9vdCAhPSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNoYWRvd1Jvb3QgPSBob3N0Py5hdHRhY2hTaGFkb3coeyBtb2RlOiAnb3BlbicgfSk7XG4gICAgY29uc3Qgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgIGNvbnN0IHJlbmRlckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHN0eWxlLnRleHRDb250ZW50ID0gc3R5bGVzO1xuICAgIHNoYWRvd1Jvb3QuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuICAgIHNoYWRvd1Jvb3QuYXBwZW5kQ2hpbGQocmVuZGVyRGl2KTtcbiAgICBzZXRDb3JlUm9vdChyZW5kZXJEaXYpO1xuICB9O1xuXG4gIGlmIChoaWRkZW4pIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPGRpdiByZWY9e3NldFJvb3R9IHN0eWxlPXt7IHpJbmRleDogOTk5OTksIHBvc2l0aW9uOiAnZml4ZWQnLCB3aWR0aDogJzAnLCBoZWlnaHQ6ICcwJywgYm90dG9tOiAwIH19PlxuICAgICAge3Jvb3QgIT0gbnVsbCA/IChcbiAgICAgICAgPFNoYWRvd0NvbnRlbnQgcm9vdD17cm9vdH0+XG4gICAgICAgICAgPFRvZ2dsZUZlYXR1cmVVbndyYXBwZWQgZGVmYXVsdE9wZW49e2RlZmF1bHRPcGVufSAvPlxuICAgICAgICA8L1NoYWRvd0NvbnRlbnQ+XG4gICAgICApIDogbnVsbH1cbiAgICA8L2Rpdj5cbiAgKTtcbn1cblxuLy8vIExpa2UgVG9nZ2xlRmVhdHVyZXMsIGJ1dCBkb2VzIG5vdCBpbmplY3Qgc3R5bGVzIGludG8gYSBzaGFkb3cgRE9NIHJvb3Qgbm9kZS5cbi8vLyB1c2VmdWwgaWYgeW91J3JlIHVzaW5nIHRhaWx3aW5kLlxuZXhwb3J0IGZ1bmN0aW9uIFRvZ2dsZUZlYXR1cmVVbndyYXBwZWQoeyBkZWZhdWx0T3BlbiA9IGZhbHNlLCBoaWRkZW4gPSBmYWxzZSB9OiB7IGRlZmF1bHRPcGVuPzogYm9vbGVhbjsgaGlkZGVuPzogYm9vbGVhbiB9KTogSlNYLkVsZW1lbnQgfCBudWxsIHtcbiAgY29uc3QgW29wZW4sIHNldE9wZW5dID0gdXNlU3RhdGUoZGVmYXVsdE9wZW4pO1xuICBjb25zdCBjb250ZXh0ID0gdXNlQ29udGV4dChGZWF0dXJlQ29udGV4dCk7XG5cbiAgaWYgKGNvbnRleHQgPT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKGhpZGRlbikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gV2Ugd2FudDogUmVhbCB2YWx1ZSBhZnRlciBhbGwgbmVzdGluZ3MsIHZhbHVlIG9mIHRoZSBvdmVycmlkZS4gd2UgdG9nZ2xlIG92ZXJyaWRlXG4gIGNvbnN0IHsgZmVhdHVyZXNEZXNjcmlwdGlvbiB9ID0gY29udGV4dDtcblxuICBpZiAoZmVhdHVyZXNEZXNjcmlwdGlvbi5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJyZWxhdGl2ZVwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJhYnNvbHV0ZSBib3R0b20tMCBsZWZ0LTAgbXgtNCBteS00XCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBjbGFzc05hbWU9XCJpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIgdGV4dC1zbSBmb250LW1lZGl1bSBwLTEgaC04IHctOCBhbGlnbi1taWRkbGUgY3Vyc29yLXBvaW50ZXIgcm91bmRlZC1mdWxsIGJnLWJsdWUtNjAwIHRleHQtd2hpdGUgIGJvcmRlciBib3JkZXItdHJhbnNwYXJlbnQganVzdGlmeS1jZW50ZXIgdGV4dC1iYXNlIGZvbnQtbWVkaXVtIGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpyaW5nLTIgZm9jdXM6cmluZy1vZmZzZXQtMiBmb2N1czpyaW5nLWJsdWUtNjAwIHNtOnRleHQtc21cIlxuICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldE9wZW4odHJ1ZSl9XG4gICAgICAgICAgdGl0bGU9XCJUb2dnbGUgZmVhdHVyZXNcIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICA+XG4gICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgY2xhc3NOYW1lPVwidy02IGgtNiBtaW4taC02IG1pbi13LTZcIlxuICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDIwIDIwXCJcbiAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgIGNsaXBSdWxlPVwiZXZlbm9kZFwiXG4gICAgICAgICAgICAgIGQ9XCJNMyA2YTMgMyAwIDAxMy0zaDEwYTEgMSAwIDAxLjggMS42TDE0LjI1IDhsMi41NSAzLjRBMSAxIDAgMDExNiAxM0g2YTEgMSAwIDAwLTEgMXYzYTEgMSAwIDExLTIgMFY2elwiXG4gICAgICAgICAgICAgIGZpbGxSdWxlPVwiZXZlbm9kZFwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgeyFvcGVuID8gbnVsbCA6IChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmaXhlZCB6LTEwIGluc2V0LTAgb3ZlcmZsb3cteS1hdXRvXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWVuZCBqdXN0aWZ5LWZsZXgtc3RhcnQgbXgtOCBteS00IG1pbi1oLXNjcmVlbiBwdC00IHB4LTQgcGItMTAgc206YmxvY2sgc206cC0wXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlIGlubGluZS1ibG9jayBhbGlnbi1ib3R0b20gYmctd2hpdGUgcm91bmRlZC1sZyBweC00IHB0LTUgcGItNCB0ZXh0LWxlZnQgb3ZlcmZsb3ctaGlkZGVuIHNoYWRvdy14bCB0cmFuc2Zvcm0gdHJhbnNpdGlvbi1hbGwgc206bXktOCBzbTphbGlnbi1taWRkbGUgc206cC02IGxnOm1heC13LVs4MCVdIG1heC13LWZ1bGxcIj5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LTEgc206bXQtM1wiPlxuICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzTmFtZT1cImZsZXggZmxleC1yb3cgZ2FwLTQgZmxleC1ub3dyYXAgaXRlbXMtY2VudGVyIHNwYWNlLWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJncm93IHRleHQtbGcgbGVhZGluZy02IGZvbnQtbWVkaXVtIHRleHQtZ3JheS05MDBcIj5GZWF0dXJlIEZsYWcgT3ZlcnJpZGVzPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2gzPlxuICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LWdyYXktNTAwXCI+XG4gICAgICAgICAgICAgICAgICAgIEZlYXR1cmVzIGNhbiBiZSBlbmFibGVkIG9yIGRpc2FibGVkIHVubGVzcyB0aGV5IGFyZSBmb3JjZWQgdXBzdHJlYW0uIFlvdSBjYW4gYWxzbyByZXZlcnQgdG8gZGVmYXVsdC5cbiAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtNlwiPlxuICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBnYXAtOVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxsZWdlbmQgY2xhc3NOYW1lPVwic3Itb25seVwiPkZlYXR1cmUgRmxhZ3M8L2xlZ2VuZD5cbiAgICAgICAgICAgICAgICAgICAgICB7ZmVhdHVyZXNEZXNjcmlwdGlvbi5tYXAoKGZlYXR1cmUpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxUb2dnbGVGZWF0dXJlIGZlYXR1cmU9e2ZlYXR1cmV9IGtleT17ZmVhdHVyZS5uYW1lfSAvPlxuICAgICAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIG10LTUgc206bXQtNlwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIHRleHQtc20gZm9udC1tZWRpdW0gcHQtMCBwYi0wIHByLTQgcGwtNCBoLTggbGVhZGluZy03IGFsaWduLW1pZGRsZSBjdXJzb3ItcG9pbnRlciByb3VuZGVkLXNtIGJnLWJsdWUtNjAwIHRleHQtd2hpdGUgYm9yZGVyIGJvcmRlci10cmFuc3BhcmVudCBqdXN0aWZ5LWNlbnRlciB0ZXh0LWJhc2UgZm9udC1tZWRpdW0gZm9jdXM6b3V0bGluZS1ub25lIGZvY3VzOnJpbmctMiBmb2N1czpyaW5nLW9mZnNldC0yIGZvY3VzOnJpbmctYmx1ZS02MDAgc206dGV4dC1zbVwiXG4gICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0T3BlbihmYWxzZSl9XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICBEb25lXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICJzaUJBQUEsZ0VDQUEsbURBWU8sV0FBdUIsRUFBcUQsQ0FabkYsUUFhRSxNQUFPLENBQ0wsRUFBYSxRQUFRLFNBQVMsRUFBSSxHQUFPLEVBQWEsUUFBUSxVQUFVLEVBQUksR0FBUSxPQUNwRixRQUFhLFFB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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBUUEsY0FBdUIsRUFBMkIsQ0FDaEQsTUFBTyxHQUFRLE9BQU8sT0FBTyxFQUFFLEtBQUssR0FBRyxD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 diff --git a/dist/esm/src/index.js.map b/dist/esm/src/index.js.map index 1e025d1..1c21f71 100644 --- a/dist/esm/src/index.js.map +++ b/dist/esm/src/index.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../../../src/FeaturesState.tsx", "../../../src/FeatureState.tsx", "../../../src/Features.tsx", "../../../src/EnableContext.tsx", "../../../src/FeatureContext.tsx", "../../../src/useConsoleOverride.tsx", "../../../src/GlobalEnable.tsx", "../../../src/usePersist.tsx", "../../../src/useTestCallback.tsx", "../../../src/testFeature.tsx", "../../../src/Enable.tsx", "../../../src/utils.ts", "../../../src/useAllEnabled.tsx", "../../../src/useEnabled.tsx", "../../../src/Disable.tsx", "../../../src/useAllDisabled.tsx", "../../../src/useDisabled.tsx", "../../../src/ToggleFeatures.tsx"], - "sourcesContent": ["import { ActorRefFrom, InterpreterFrom, StateFrom, assign, createMachine, spawn } from 'xstate';\n\nimport { FeatureMachine, FeatureDescription, FeatureValue, valueForState } from './FeatureState';\n\nexport interface FeaturesContext {\n // features are layered:\n // - defaults: if nothing else matches, provided a value for feature\n // - browser: browser-local values for features (kept in local storage, etc)\n // - user: values from the user's profile, if any\n // - org: value from the org's profile, if any\n features: { [x: string]: ActorRefFrom };\n}\n\nexport type FeaturesAction =\n | { type: 'DE_INIT' }\n | { type: 'DISABLE'; name: string }\n | { type: 'ENABLE'; name: string }\n | { type: 'INIT'; features: readonly FeatureDescription[] }\n | { type: 'SET_ALL'; features: { [key: string]: FeatureValue } }\n | { type: 'SET'; name: string; value: FeatureValue }\n | { type: 'TOGGLE'; name: string }\n | { type: 'UNSET'; name: string };\n\nexport interface FeaturesTypeState {\n value: 'ready';\n context: FeaturesContext;\n}\n\nexport type FeaturesState = StateFrom;\nexport type FeaturesDispatch = InterpreterFrom['send'];\n\nexport function valueOfFeature(featuresState: FeaturesState, feature: string): [FeatureValue, boolean] {\n if (featuresState.context.features[feature] == null) {\n return [undefined, false];\n }\n const featureState = featuresState.context.features[feature].getSnapshot();\n if (featureState != null) {\n return valueForState(featureState);\n }\n return [undefined, false];\n}\n\n/// state machine that manages a set of features with user, org, and local overrides\nexport const FeaturesMachine = createMachine({\n id: 'features',\n initial: 'idle',\n predictableActionArguments: true,\n context: {\n features: {},\n },\n states: {\n idle: {\n on: {\n INIT: {\n target: 'ready',\n cond: (_, e) => e.features.length > 0,\n actions: assign({\n features: (context, event) => {\n const features: typeof context.features = {};\n\n for (const feature of event.features) {\n features[feature.name] = spawn(FeatureMachine, {\n name: feature.name,\n sync: true,\n });\n features[feature.name].send({ type: 'INIT', feature });\n }\n return features;\n },\n }),\n },\n },\n },\n\n // the features are loaded and ready to be used\n ready: {\n on: {\n DE_INIT: { target: 'idle', actions: assign({ features: (_, __) => ({}) }) },\n SET_ALL: {\n actions: assign({\n features: (ctx, e) => {\n const features = { ...ctx.features };\n // All configured features are set to on/off or undefined\n Object.keys(features).forEach((name) => {\n features[name].send({ type: 'SET', value: e.features[name] ?? undefined });\n });\n return features;\n },\n }),\n },\n\n // Set a feature to a value\n SET: {\n actions: (ctx, e) => {\n const feature = ctx.features[e.name];\n if (feature != null) {\n feature.send({ type: 'SET', value: e.value });\n }\n },\n },\n\n // toggle a feature\n TOGGLE: {\n actions: (ctx, e) => {\n const feature = ctx.features[e.name];\n if (feature != null) {\n feature.send({ type: 'TOGGLE' });\n }\n },\n },\n\n // when a feature is enabled, send the enable message to the actor\n ENABLE: {\n actions: (ctx, e) => {\n const feature = ctx.features[e.name];\n if (feature != null) {\n feature.send({ type: 'ENABLE' });\n }\n },\n },\n\n // when a feature is disabled, send the disable message to the actor\n DISABLE: {\n actions: (ctx, e) => {\n const feature = ctx.features[e.name];\n if (feature != null) {\n feature.send({ type: 'DISABLE' });\n }\n },\n },\n\n // when a feature is unset, send the unset message to the actor\n UNSET: {\n actions: (ctx, e) => {\n const feature = ctx.features[e.name];\n if (feature != null) {\n feature.send({ type: 'UNSET' });\n }\n },\n },\n },\n },\n },\n});\n", "import { assign, createMachine, DoneInvokeEvent, InterpreterFrom, StateFrom } from 'xstate';\n\n/**\n * Feature is either on, off, or 'unset',\n * which means it will go to the default value or the less specific value.\n */\nexport type FeatureValue = false | true | undefined;\n\nexport type FeatureState = StateFrom;\nexport type FeatureDispatch = InterpreterFrom['send'];\n\n/// Given a featurestate, determine the value (on, off, or unset)\nexport function valueForState(featureState: FeatureState): [FeatureValue, boolean] {\n return [\n featureState.matches('enabled') ? true : featureState.matches('disabled') ? false : undefined,\n featureState.context.featureDesc?.force ?? false,\n ];\n}\n\n/**\n * Definition of a feature that can be enabled or disabled.\n * K is the type of the key that is used to identify the feature.\n */\nexport interface FeatureDescription {\n readonly name: K;\n readonly description?: string;\n\n /// If set, will be used to update the feature default state instead of simply overriding.\n /// For example, you might use this to update a feature flag on a backend server.\n /// when set, the feature will be updated on the backend server, and the result of the async\n /// will be used for the final state after the change. while changing, the feature will be\n /// in the 'changing' state. Also note that the feature will be changed at the \"default\" layer.\n readonly onChangeDefault?: (name: K, newValue: FeatureValue) => Promise;\n\n /// if set true, will force the field to what it is set here through layers of states.\n /// useful to invert the layers, similar to !important in CSS.\n readonly force?: boolean;\n\n /// If set to true, the feature will not be overridable by the user.\n readonly noOverride?: boolean;\n\n /// can be used to specify what should happen if the feature is not set to a particular value.\n readonly defaultValue?: FeatureValue;\n}\n\ninterface FeatureContext {\n featureDesc?: FeatureDescription;\n}\n\ntype FeatureTypeState =\n | {\n value: 'asyncDenabled';\n context: FeatureContext;\n }\n | {\n value: 'asyncDisabled';\n context: FeatureContext;\n }\n | {\n value: 'asyncUnspecied';\n context: FeatureContext;\n }\n | {\n value: 'disabled';\n context: FeatureContext;\n }\n | {\n value: 'enabled';\n context: FeatureContext;\n }\n | {\n value: 'initial';\n context: never;\n }\n | {\n value: 'unspecied';\n context: FeatureContext;\n };\n\n/**\n * Actions that can be performed on a feature.\n */\nexport type FeatureAction =\n | { type: 'DISABLE' }\n | { type: 'ENABLE' }\n | { type: 'INIT'; feature: FeatureDescription }\n | { type: 'SET'; value: FeatureValue }\n | { type: 'TOGGLE' }\n | { type: 'UNSET' };\n\n/**\n * Fully describe the states a feature can be in\n */\nexport const FeatureMachine = createMachine({\n id: 'feature',\n initial: 'initial',\n context: {},\n predictableActionArguments: true,\n on: {\n ENABLE: [\n { target: 'asyncEnabled', cond: (ctx) => ctx.featureDesc?.onChangeDefault != null },\n { target: 'enabled' },\n ],\n\n TOGGLE: [\n { target: 'asyncEnabled', cond: (ctx) => ctx.featureDesc?.onChangeDefault != null },\n { target: 'enabled' },\n ],\n\n DISABLE: [\n { target: 'asyncDisabled', cond: (ctx) => ctx.featureDesc?.onChangeDefault != null },\n { target: 'disabled' },\n ],\n\n UNSET: [\n { target: 'asyncUnspecied', cond: (ctx) => ctx.featureDesc?.onChangeDefault != null },\n { target: 'unspecified' },\n ],\n\n SET: [\n {\n target: 'asyncEnabled',\n cond: (ctx, e) => e.value === true && ctx.featureDesc?.onChangeDefault != null,\n },\n {\n target: 'asyncDisabled',\n cond: (ctx, e) => e.value === false && ctx.featureDesc?.onChangeDefault != null,\n },\n {\n target: 'asyncUnspecied',\n cond: (ctx, _e) => ctx.featureDesc?.onChangeDefault != null,\n },\n {\n target: 'enabled',\n cond: (_ctx, e) => e.value === true,\n },\n {\n target: 'disabled',\n cond: (_ctx, e) => e.value === false,\n },\n { target: 'unspecified' },\n ],\n },\n\n states: {\n initial: {\n on: {\n INIT: [\n {\n actions: assign({ featureDesc: (_, e) => e.feature }),\n target: 'enabled',\n cond: (_, e) => e.feature.defaultValue === true,\n },\n {\n actions: assign({ featureDesc: (_, e) => e.feature }),\n target: 'unspecified',\n cond: (_, e) => e.feature.defaultValue === undefined,\n },\n {\n actions: assign({ featureDesc: (_, e) => e.feature }),\n target: 'disabled',\n cond: (_, e) => e.feature.defaultValue === false,\n },\n ],\n },\n },\n\n unspecified: {},\n disabled: {},\n enabled: {},\n\n asyncDisabled: {\n invoke: {\n id: 'set-off-upstream',\n src: async (ctx) => {\n const onchange = ctx.featureDesc?.onChangeDefault;\n if (onchange != null && ctx.featureDesc != null) {\n return onchange(ctx.featureDesc.name, false);\n }\n return undefined;\n },\n onDone: [\n {\n target: 'enabled',\n cond: (_ctx, e: DoneInvokeEvent) => e.data === true,\n },\n {\n target: 'disabled',\n cond: (_ctx, e: DoneInvokeEvent) => e.data === false,\n },\n { target: 'unspecified' },\n ],\n onError: 'unspecified',\n },\n },\n\n asyncUnspecied: {\n invoke: {\n id: 'set-unset-upstream',\n src: async (ctx) => {\n const onchange = ctx.featureDesc?.onChangeDefault;\n if (onchange != null && ctx.featureDesc != null) {\n return onchange(ctx.featureDesc.name, undefined);\n }\n return undefined;\n },\n onDone: [\n {\n target: 'enabled',\n cond: (_ctx, e: DoneInvokeEvent) => e.data === true,\n },\n {\n target: 'disabled',\n cond: (_ctx, e: DoneInvokeEvent) => e.data === false,\n },\n { target: 'unspecified' },\n ],\n onError: 'unspecified',\n },\n },\n\n asyncEnabled: {\n invoke: {\n id: 'set-on-upstream',\n src: async (ctx) => {\n const onchange = ctx.featureDesc?.onChangeDefault;\n if (onchange != null && ctx.featureDesc != null) {\n return onchange(ctx.featureDesc.name, true);\n }\n return undefined;\n },\n onDone: [\n {\n target: 'enabled',\n cond: (_ctx, e: DoneInvokeEvent) => e.data === true,\n },\n {\n target: 'disabled',\n cond: (_ctx, e: DoneInvokeEvent) => e.data === false,\n },\n { target: 'unspecified' },\n ],\n onError: 'unspecified',\n },\n },\n },\n});\n", "import React, { useMemo, ReactNode, useEffect, useRef } from 'react';\n\nimport { useMachine } from '@xstate/react';\n\nimport { EnableContext } from './EnableContext';\nimport { FeatureContext } from './FeatureContext';\nimport { FeaturesMachine } from './FeaturesState';\nimport { FeatureDescription } from './FeatureState';\nimport useConsoleOverride from './useConsoleOverride';\nimport usePersist, { KEY } from './usePersist';\nimport useTestCallback from './useTestCallback';\n\ninterface FeatureProps {\n readonly features: readonly FeatureDescription[];\n readonly children?: ReactNode;\n readonly disableConsole?: boolean;\n readonly storage?: Storage;\n}\n\n/**\n * A more batteries-enabled parent component that keeps track of feature state\n * internally, and creates window.feature.enable(\"f\") and window.feature.disable(\"f\").\n * Keeps track of overrides and defaults, with defaults potentially coming from your props\n * and overrides being persisted to your choice of storage layer.\n */\nexport function Features({\n children,\n features,\n disableConsole = false,\n storage = window.sessionStorage,\n}: FeatureProps): JSX.Element {\n // Capture only first value; we don't care about future updates\n const featuresRef = useRef(features);\n const [overridesState, overridesSend] = useMachine(FeaturesMachine);\n const [defaultsState, defaultsSend] = useMachine(FeaturesMachine);\n\n useEffect(() => {\n /// Load defaults\n defaultsSend({ type: 'INIT', features });\n return () => {\n defaultsSend({ type: 'DE_INIT' });\n };\n }, [defaultsSend, features]);\n\n useEffect(() => {\n let f: Record = {};\n if (storage != null) {\n try {\n const featuresJson = storage.getItem(KEY);\n if (featuresJson != null) {\n const fh = JSON.parse(featuresJson);\n f = fh.overrides;\n }\n } catch (e) {\n // Can't parse or get or otherwise; ignore\n console.error('error in localStorage', e);\n }\n }\n\n overridesSend({\n type: 'INIT',\n features: featuresRef.current\n .filter((x) => x.noOverride !== true)\n .map((x) => ({ name: x.name, description: x.description, defaultValue: f?.[x.name] ?? undefined })),\n });\n\n return () => {\n overridesSend({ type: 'DE_INIT' });\n };\n }, [featuresRef, overridesSend, storage]);\n\n usePersist(storage, featuresRef.current, overridesState);\n\n const testCallback = useTestCallback(overridesState, defaultsState);\n useConsoleOverride(!disableConsole, featuresRef.current, testCallback, defaultsSend);\n\n const featureValue = useMemo(\n () => ({\n overridesSend,\n defaultsSend,\n featuresDescription: featuresRef.current,\n overridesState,\n defaultsState,\n test: testCallback,\n }),\n [overridesSend, defaultsSend, overridesState, defaultsState, testCallback]\n );\n\n return (\n \n {children}\n \n );\n}\n", "import { createContext } from 'react';\n\nimport { FeatureValue } from './FeatureState';\n\nexport type EnableContextType = (feature: string) => FeatureValue;\n\n/**\n * Contained function can check whether a given feature is enabled.\n */\nexport const EnableContext = createContext((_s) => false);\n", "import { createContext } from 'react';\n\nimport { FeaturesDispatch, FeaturesState } from './FeaturesState';\nimport { FeatureDescription, FeatureValue } from './FeatureState';\n\nexport const FeatureContext = createContext(null);\n\n/// Give access to the overrides layer\nexport interface FeatureContextType {\n // Make changes to the overrides\n overridesSend: FeaturesDispatch;\n\n // Make changes to defaults\n defaultsSend: FeaturesDispatch;\n\n featuresDescription: readonly FeatureDescription[];\n\n // State is in layers; overrides and defaults\n overridesState: FeaturesState;\n defaultsState: FeaturesState;\n\n /// Test with proper fallback and respecting the user's force preference\n test: (flag: string) => FeatureValue;\n}\n", "import { useEffect } from 'react';\n\nimport { FeaturesDispatch } from './FeaturesState';\nimport { FeatureDescription, FeatureValue } from './FeatureState';\nimport { GlobalEnable } from './GlobalEnable';\n\nexport default function useConsoleOverride(\n consoleOverride: boolean,\n features: readonly FeatureDescription[],\n testFeature: (_: string) => FeatureValue,\n dispatch: FeaturesDispatch\n): void {\n useEffect(() => {\n if (!consoleOverride) {\n return () => {\n /* empty */\n };\n }\n window.feature = new GlobalEnable(dispatch, testFeature, features);\n return () => {\n if (window.feature != null) {\n delete window.feature;\n }\n };\n }, [features, dispatch, consoleOverride, testFeature]);\n}\n", "import { FeaturesDispatch } from './FeaturesState';\nimport { FeatureDescription, FeatureValue } from './FeatureState';\n\nexport class GlobalEnable {\n private readonly featureDesc: readonly FeatureDescription[];\n private readonly dispatch: FeaturesDispatch;\n private readonly testFeature: (value: string) => FeatureValue;\n\n constructor(\n dispatch: FeaturesDispatch,\n testFeature: (_: string) => FeatureValue,\n featureDesc: readonly FeatureDescription[]\n ) {\n this.featureDesc = featureDesc;\n this.dispatch = dispatch;\n this.testFeature = testFeature;\n }\n\n public toggle(feature: string): void {\n this.dispatch({ type: 'TOGGLE', name: feature });\n }\n\n public enable(feature: string): void {\n this.dispatch({ type: 'ENABLE', name: feature });\n }\n\n public unset(feature: string): void {\n this.dispatch({ type: 'UNSET', name: feature });\n }\n\n public disable(feature: string): void {\n this.dispatch({ type: 'DISABLE', name: feature });\n }\n\n public setAll(features: { [key: string]: FeatureValue }): void {\n this.dispatch({ type: 'SET_ALL', features });\n }\n\n public listFeatures(): readonly [string, FeatureValue][] {\n return this.featureDesc.map((f) => [f.name, this.testFeature(f.name)]);\n }\n}\ndeclare global {\n interface Window {\n feature?: GlobalEnable;\n }\n}\n", "import { useMemo, useEffect } from 'react';\n\nimport { FeaturesState, valueOfFeature } from './FeaturesState';\nimport { FeatureDescription, FeatureValue } from './FeatureState';\n\nexport const KEY = 'react-enable:feature-values';\n\nexport default function usePersist(\n storage: Storage | undefined,\n features: readonly FeatureDescription[],\n overrideState: FeaturesState\n): void {\n const overrides = useMemo(() => {\n const newOverrides: { [key: string]: FeatureValue } = {};\n if (overrideState.matches('ready')) {\n for (const feature of features) {\n const [value] = valueOfFeature(overrideState, feature.name);\n if (value != null) {\n newOverrides[feature.name] = value;\n }\n }\n }\n return newOverrides;\n }, [features, overrideState]);\n\n const strState = Object.keys(overrides).length === 0 || storage == null ? '{}' : JSON.stringify({ overrides });\n\n useEffect(() => {\n try {\n if (storage != null && overrideState.matches('ready')) {\n storage.setItem(KEY, strState);\n }\n } catch (e) {\n // Can't set for some reason\n }\n }, [overrideState, storage, strState]);\n}\n", "import { useCallback } from 'react';\n\nimport { FeaturesState } from './FeaturesState';\nimport testFeature from './testFeature';\n\n/// A callback that can be called to test if a feature is enabled or disabled\nexport default function useTestCallback(\n defaultsState: FeaturesState,\n overridesState: FeaturesState\n): (feature: string) => boolean | undefined {\n return useCallback((f: string) => testFeature(f, [defaultsState, overridesState]), [defaultsState, overridesState]);\n}\n", "import { FeaturesState, valueOfFeature } from './FeaturesState';\nimport { FeatureValue } from './FeatureState';\n\n/** Determine if the feature is enabled in one of the state machines, in order\n *\n * @param state The current state of the machine\n * @param feature The feature to check\n */\n\nexport default function testFeature(feature: string, states: FeaturesState[]): FeatureValue {\n const values = states.map((state) => valueOfFeature(state, feature));\n\n // look for best forced option, in order\n for (const [featureValue, featureForced] of values) {\n if (featureValue != null && featureForced) {\n return featureValue;\n }\n }\n\n // look for best non-forced option, in order\n for (const [featureValue] of values) {\n if (featureValue != null) {\n return featureValue;\n }\n }\n\n // unset if nothing hit\n return undefined;\n}\n", "import * as React from 'react';\n\nimport { useAllEnabled } from './useAllEnabled';\nimport { useEnabled } from './useEnabled';\n\nexport interface EnableProps {\n readonly feature?: string[] | string;\n readonly allFeatures?: string[];\n children: React.ReactNode;\n}\n\n/**\n * Feature will be enabled if any feature in the list are enabled,\n */\nexport function Enable({ feature = [], allFeatures = [], children }: EnableProps): JSX.Element | null {\n const isAny = useEnabled(feature);\n const isAll = useAllEnabled(allFeatures);\n\n if (isAny || isAll) {\n return <>{children};\n }\n\n return null;\n}\n", "import { useContext, useMemo } from 'react';\n\nimport { EnableContextType, EnableContext } from './EnableContext';\n\n// Helper: get rid of some boilerplate.\n// just input mashing and sanitation, removing extra renders, and getting test function\nexport function useTestAndConvert(input?: string[] | string | null): [EnableContextType, string[]] {\n const test = useContext(EnableContext);\n\n // We memoize just to prevent re-renders since this could be at the leaf of a tree\n const converted = useMemo(() => (input == null ? [] : Array.isArray(input) ? input : [input]), [input]);\n\n return [test, converted];\n}\n", "import { useTestAndConvert } from './utils';\n\n/**\n * returns true iff all specified features are enabled\n */\nexport function useAllEnabled(allFeatures: string[] | string): boolean {\n const [test, queryAllPresent] = useTestAndConvert(allFeatures);\n return queryAllPresent.length > 0 && queryAllPresent.every(test);\n}\n", "import { useTestAndConvert } from './utils';\n\n/**\n * returns true iff any specified feature is enabled\n */\nexport function useEnabled(feature: string[] | string): boolean {\n const [test, queryAnyPresent] = useTestAndConvert(feature);\n return queryAnyPresent.some(test);\n}\n", "import * as React from \"react\";\n\nimport { EnableProps } from \"./Enable\";\nimport { useAllDisabled } from \"./useAllDisabled\";\nimport { useDisabled } from \"./useDisabled\";\n\n/**\n * Feature will be disabled if any in the list are enabled\n */\nexport const Disable: React.FC = ({\n feature = [],\n allFeatures = [],\n children\n}) => {\n const isAny = useDisabled(feature);\n const isAll = useAllDisabled(allFeatures);\n\n if (isAny || isAll) {\n return <>{children};\n }\n\n return null;\n};\n", "import { useTestAndConvert } from './utils';\n\n/**\n * returns true iff all specified features are disabled\n */\nexport function useAllDisabled(withoutAll: string[] | string): boolean {\n const [test, queryAllWithout] = useTestAndConvert(withoutAll);\n return withoutAll.length > 0 && queryAllWithout.every((x) => !(test(x) ?? false));\n}\n", "import { useTestAndConvert } from './utils';\n\n/**\n * returns true iff any specified feature is disabled\n */\nexport function useDisabled(without: string[] | string): boolean {\n const [test, queryAnyWithout] = useTestAndConvert(without);\n return queryAnyWithout.some((x) => !(test(x) ?? false));\n}\n", "import React, { useContext, useState, useCallback, ReactNode } from 'react';\nimport ReactDOM from 'react-dom';\n\nimport { RadioGroup } from '@headlessui/react';\n\nimport { FeatureContext } from './FeatureContext';\nimport { valueOfFeature } from './FeaturesState';\nimport { FeatureDescription } from './FeatureState';\n// @ts-expect-error bundler will take care of this\nimport styles from './tailwind.css';\n\nfunction classNames(...classes: string[]): string {\n return classes.filter(Boolean).join(' ');\n}\n\nfunction ToggleFeature({ feature }: { feature: FeatureDescription }): JSX.Element | null {\n const context = useContext(FeatureContext);\n const handleChangeSelection = useCallback(\n (value: 'false' | 'true' | 'unset') => {\n if (context?.overridesSend != null) {\n switch (value) {\n case 'true': {\n context.overridesSend({ type: 'ENABLE', name: feature.name });\n break;\n }\n case 'false': {\n context.overridesSend({ type: 'DISABLE', name: feature.name });\n break;\n }\n case 'unset': {\n context.overridesSend({ type: 'UNSET', name: feature.name });\n break;\n }\n }\n }\n },\n [feature.name, context]\n );\n\n if (context == null) {\n return null;\n }\n\n const { overridesState, test: testFeature, defaultsState } = context;\n\n const valueInDefaults = (valueOfFeature(defaultsState, feature.name)[0] ?? 'unset').toString() as\n | 'false'\n | 'true'\n | 'unset';\n\n const valueInOverrides = (valueOfFeature(overridesState, feature.name)[0] ?? 'unset').toString() as\n | 'false'\n | 'true'\n | 'unset';\n\n const actualChecked = testFeature(feature.name);\n\n return (\n \n \n
\n \n Feature: {feature.name}\n \n {feature.noOverride === true ? (\n
\n \n \n \n
No Overrides
\n
\n ) : null}\n {actualChecked === true ? (\n
\n \n \n \n
{actualChecked ? 'Enabled' : 'Disabled'}
\n
\n ) : null}\n
\n {feature.description == null ? null :

{feature.description}

}\n
\n
\n {[\n { id: 'false', title: `Disable ${feature.name}`, description: 'Override the feature to be disabled' },\n {\n id: 'unset',\n title: 'Default',\n description: 'Inherit enabled state from defaults',\n disabled: (feature.noOverride ?? false) || feature.force,\n defaultValue:\n valueInDefaults === 'true' ? (\n
\n Enabled\n
\n ) : (\n
\n Disabled\n
\n ),\n },\n { id: 'true', title: `Enable ${feature.name}`, description: 'Override the feature to be enabled' },\n ].map((option) => (\n \n classNames(\n checked ? 'border-transparent' : 'border-gray-300',\n !disabled && active ? 'border-blue-500 ring-2 ring-blue-500' : '',\n disabled ? 'border-transparent ring-gray-500 cursor-not-allowed' : 'cursor-pointer',\n 'relative bg-white border rounded-lg shadow-sm p-3 flex focus:outline-none'\n )\n }\n disabled={option.disabled}\n key={option.id}\n value={option.id}\n >\n {({ checked, active, disabled }) => (\n <>\n
\n \n {option.title}\n {option.defaultValue != null ? option.defaultValue : null}\n \n \n \n \n \n {option.description}\n \n
\n \n \n )}\n \n ))}\n
\n
\n );\n}\n\nfunction ShadowContent({ root, children }: { children: ReactNode; root: Element }) {\n return ReactDOM.createPortal(children, root);\n}\n\n/// Permit users to override feature flags via a GUI.\n/// Renders a small floating button in lower left or right, pressing it brings up\n/// a list of features to toggle and their current override state. you can override on or override off,\n/// or unset the override and go back to default value.\n// eslint-disable-next-line no-undef\nexport function ToggleFeatures({ defaultOpen = false }: { defaultOpen?: boolean }): JSX.Element | null {\n const [root, setCoreRoot] = useState(null);\n\n const setRoot = (host: HTMLDivElement | null) => {\n if (host == null || root != null) {\n return;\n }\n const shadowRoot = host?.attachShadow({ mode: 'open' });\n const style = document.createElement('style');\n const renderDiv = document.createElement('div');\n style.textContent = styles;\n shadowRoot.appendChild(style);\n shadowRoot.appendChild(renderDiv);\n setCoreRoot(renderDiv);\n };\n\n return (\n
\n {root != null ? (\n \n \n \n ) : null}\n
\n );\n}\n\n/// Like ToggleFeatures, but does not inject styles into a shadow DOM root node.\n/// useful if you're using tailwind.\nexport function ToggleFeatureUnwrapped({ defaultOpen = false }: { defaultOpen?: boolean }): JSX.Element | null {\n const [open, setOpen] = useState(defaultOpen);\n const context = useContext(FeatureContext);\n\n if (context == null) {\n return null;\n }\n\n // We want: Real value after all nestings, value of the override. we toggle override\n const { featuresDescription } = context;\n\n if (featuresDescription.length === 0) {\n return null;\n }\n\n return (\n
\n
\n setOpen(true)}\n title=\"Toggle features\"\n type=\"button\"\n >\n \n \n \n \n
\n {!open ? null : (\n
\n
\n
\n
\n
\n

\n
Feature Flag Overrides
\n

\n

\n Features can be enabled or disabled unless they are forced upstream. You can also revert to default.\n

\n
\n
\n Feature Flags\n {featuresDescription.map((feature) => (\n \n ))}\n
\n
\n
\n setOpen(false)}\n type=\"button\"\n >\n Done\n \n
\n
\n
\n
\n
\n
\n )}\n
\n );\n}\n"], - "mappings": "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", + "sourcesContent": ["import { ActorRefFrom, InterpreterFrom, StateFrom, assign, createMachine, spawn } from 'xstate';\n\nimport { FeatureMachine, FeatureDescription, FeatureValue, valueForState } from './FeatureState';\n\nexport interface FeaturesContext {\n // features are layered:\n // - defaults: if nothing else matches, provided a value for feature\n // - browser: browser-local values for features (kept in local storage, etc)\n // - user: values from the user's profile, if any\n // - org: value from the org's profile, if any\n features: { [x: string]: ActorRefFrom };\n}\n\nexport type FeaturesAction =\n | { type: 'DE_INIT' }\n | { type: 'DISABLE'; name: string }\n | { type: 'ENABLE'; name: string }\n | { type: 'INIT'; features: readonly FeatureDescription[] }\n | { type: 'SET_ALL'; features: { [key: string]: FeatureValue } }\n | { type: 'SET'; name: string; value: FeatureValue }\n | { type: 'TOGGLE'; name: string }\n | { type: 'UNSET'; name: string };\n\nexport interface FeaturesTypeState {\n value: 'ready';\n context: FeaturesContext;\n}\n\nexport type FeaturesState = StateFrom;\nexport type FeaturesDispatch = InterpreterFrom['send'];\n\nexport function valueOfFeature(featuresState: FeaturesState, feature: string): [FeatureValue, boolean] {\n if (featuresState.context.features[feature] == null) {\n return [undefined, false];\n }\n const featureState = featuresState.context.features[feature].getSnapshot();\n if (featureState != null) {\n return valueForState(featureState);\n }\n return [undefined, false];\n}\n\n/// state machine that manages a set of features with user, org, and local overrides\nexport const FeaturesMachine = createMachine({\n id: 'features',\n initial: 'idle',\n predictableActionArguments: true,\n context: {\n features: {},\n },\n states: {\n idle: {\n on: {\n INIT: {\n target: 'ready',\n cond: (_, e) => e.features.length > 0,\n actions: assign({\n features: (context, event) => {\n const features: typeof context.features = {};\n\n for (const feature of event.features) {\n features[feature.name] = spawn(FeatureMachine, {\n name: feature.name,\n sync: true,\n });\n features[feature.name].send({ type: 'INIT', feature });\n }\n return features;\n },\n }),\n },\n },\n },\n\n // the features are loaded and ready to be used\n ready: {\n on: {\n DE_INIT: { target: 'idle', actions: assign({ features: (_, __) => ({}) }) },\n SET_ALL: {\n actions: assign({\n features: (ctx, e) => {\n const features = { ...ctx.features };\n // All configured features are set to on/off or undefined\n Object.keys(features).forEach((name) => {\n features[name].send({ type: 'SET', value: e.features[name] ?? undefined });\n });\n return features;\n },\n }),\n },\n\n // Set a feature to a value\n SET: {\n actions: (ctx, e) => {\n const feature = ctx.features[e.name];\n if (feature != null) {\n feature.send({ type: 'SET', value: e.value });\n }\n },\n },\n\n // toggle a feature\n TOGGLE: {\n actions: (ctx, e) => {\n const feature = ctx.features[e.name];\n if (feature != null) {\n feature.send({ type: 'TOGGLE' });\n }\n },\n },\n\n // when a feature is enabled, send the enable message to the actor\n ENABLE: {\n actions: (ctx, e) => {\n const feature = ctx.features[e.name];\n if (feature != null) {\n feature.send({ type: 'ENABLE' });\n }\n },\n },\n\n // when a feature is disabled, send the disable message to the actor\n DISABLE: {\n actions: (ctx, e) => {\n const feature = ctx.features[e.name];\n if (feature != null) {\n feature.send({ type: 'DISABLE' });\n }\n },\n },\n\n // when a feature is unset, send the unset message to the actor\n UNSET: {\n actions: (ctx, e) => {\n const feature = ctx.features[e.name];\n if (feature != null) {\n feature.send({ type: 'UNSET' });\n }\n },\n },\n },\n },\n },\n});\n", "import { assign, createMachine, DoneInvokeEvent, InterpreterFrom, StateFrom } from 'xstate';\n\n/**\n * Feature is either on, off, or 'unset',\n * which means it will go to the default value or the less specific value.\n */\nexport type FeatureValue = false | true | undefined;\n\nexport type FeatureState = StateFrom;\nexport type FeatureDispatch = InterpreterFrom['send'];\n\n/// Given a featurestate, determine the value (on, off, or unset)\nexport function valueForState(featureState: FeatureState): [FeatureValue, boolean] {\n return [\n featureState.matches('enabled') ? true : featureState.matches('disabled') ? false : undefined,\n featureState.context.featureDesc?.force ?? false,\n ];\n}\n\n/**\n * Definition of a feature that can be enabled or disabled.\n * K is the type of the key that is used to identify the feature.\n */\nexport interface FeatureDescription {\n readonly name: K;\n readonly description?: string;\n\n /// If set, will be used to update the feature default state instead of simply overriding.\n /// For example, you might use this to update a feature flag on a backend server.\n /// when set, the feature will be updated on the backend server, and the result of the async\n /// will be used for the final state after the change. while changing, the feature will be\n /// in the 'changing' state. Also note that the feature will be changed at the \"default\" layer.\n readonly onChangeDefault?: (name: K, newValue: FeatureValue) => Promise;\n\n /// if set true, will force the field to what it is set here through layers of states.\n /// useful to invert the layers, similar to !important in CSS.\n readonly force?: boolean;\n\n /// If set to true, the feature will not be overridable by the user.\n readonly noOverride?: boolean;\n\n /// can be used to specify what should happen if the feature is not set to a particular value.\n readonly defaultValue?: FeatureValue;\n}\n\ninterface FeatureContext {\n featureDesc?: FeatureDescription;\n}\n\ntype FeatureTypeState =\n | {\n value: 'asyncDenabled';\n context: FeatureContext;\n }\n | {\n value: 'asyncDisabled';\n context: FeatureContext;\n }\n | {\n value: 'asyncUnspecied';\n context: FeatureContext;\n }\n | {\n value: 'disabled';\n context: FeatureContext;\n }\n | {\n value: 'enabled';\n context: FeatureContext;\n }\n | {\n value: 'initial';\n context: never;\n }\n | {\n value: 'unspecied';\n context: FeatureContext;\n };\n\n/**\n * Actions that can be performed on a feature.\n */\nexport type FeatureAction =\n | { type: 'DISABLE' }\n | { type: 'ENABLE' }\n | { type: 'INIT'; feature: FeatureDescription }\n | { type: 'SET'; value: FeatureValue }\n | { type: 'TOGGLE' }\n | { type: 'UNSET' };\n\n/**\n * Fully describe the states a feature can be in\n */\nexport const FeatureMachine = createMachine({\n id: 'feature',\n initial: 'initial',\n context: {},\n predictableActionArguments: true,\n on: {\n ENABLE: [\n { target: 'asyncEnabled', cond: (ctx) => ctx.featureDesc?.onChangeDefault != null },\n { target: 'enabled' },\n ],\n\n TOGGLE: [\n { target: 'asyncEnabled', cond: (ctx) => ctx.featureDesc?.onChangeDefault != null },\n { target: 'enabled' },\n ],\n\n DISABLE: [\n { target: 'asyncDisabled', cond: (ctx) => ctx.featureDesc?.onChangeDefault != null },\n { target: 'disabled' },\n ],\n\n UNSET: [\n { target: 'asyncUnspecied', cond: (ctx) => ctx.featureDesc?.onChangeDefault != null },\n { target: 'unspecified' },\n ],\n\n SET: [\n {\n target: 'asyncEnabled',\n cond: (ctx, e) => e.value === true && ctx.featureDesc?.onChangeDefault != null,\n },\n {\n target: 'asyncDisabled',\n cond: (ctx, e) => e.value === false && ctx.featureDesc?.onChangeDefault != null,\n },\n {\n target: 'asyncUnspecied',\n cond: (ctx, _e) => ctx.featureDesc?.onChangeDefault != null,\n },\n {\n target: 'enabled',\n cond: (_ctx, e) => e.value === true,\n },\n {\n target: 'disabled',\n cond: (_ctx, e) => e.value === false,\n },\n { target: 'unspecified' },\n ],\n },\n\n states: {\n initial: {\n on: {\n INIT: [\n {\n actions: assign({ featureDesc: (_, e) => e.feature }),\n target: 'enabled',\n cond: (_, e) => e.feature.defaultValue === true,\n },\n {\n actions: assign({ featureDesc: (_, e) => e.feature }),\n target: 'unspecified',\n cond: (_, e) => e.feature.defaultValue === undefined,\n },\n {\n actions: assign({ featureDesc: (_, e) => e.feature }),\n target: 'disabled',\n cond: (_, e) => e.feature.defaultValue === false,\n },\n ],\n },\n },\n\n unspecified: {},\n disabled: {},\n enabled: {},\n\n asyncDisabled: {\n invoke: {\n id: 'set-off-upstream',\n src: async (ctx) => {\n const onchange = ctx.featureDesc?.onChangeDefault;\n if (onchange != null && ctx.featureDesc != null) {\n return onchange(ctx.featureDesc.name, false);\n }\n return undefined;\n },\n onDone: [\n {\n target: 'enabled',\n cond: (_ctx, e: DoneInvokeEvent) => e.data === true,\n },\n {\n target: 'disabled',\n cond: (_ctx, e: DoneInvokeEvent) => e.data === false,\n },\n { target: 'unspecified' },\n ],\n onError: 'unspecified',\n },\n },\n\n asyncUnspecied: {\n invoke: {\n id: 'set-unset-upstream',\n src: async (ctx) => {\n const onchange = ctx.featureDesc?.onChangeDefault;\n if (onchange != null && ctx.featureDesc != null) {\n return onchange(ctx.featureDesc.name, undefined);\n }\n return undefined;\n },\n onDone: [\n {\n target: 'enabled',\n cond: (_ctx, e: DoneInvokeEvent) => e.data === true,\n },\n {\n target: 'disabled',\n cond: (_ctx, e: DoneInvokeEvent) => e.data === false,\n },\n { target: 'unspecified' },\n ],\n onError: 'unspecified',\n },\n },\n\n asyncEnabled: {\n invoke: {\n id: 'set-on-upstream',\n src: async (ctx) => {\n const onchange = ctx.featureDesc?.onChangeDefault;\n if (onchange != null && ctx.featureDesc != null) {\n return onchange(ctx.featureDesc.name, true);\n }\n return undefined;\n },\n onDone: [\n {\n target: 'enabled',\n cond: (_ctx, e: DoneInvokeEvent) => e.data === true,\n },\n {\n target: 'disabled',\n cond: (_ctx, e: DoneInvokeEvent) => e.data === false,\n },\n { target: 'unspecified' },\n ],\n onError: 'unspecified',\n },\n },\n },\n});\n", "import React, { useMemo, ReactNode, useEffect, useRef } from 'react';\n\nimport { useMachine } from '@xstate/react';\n\nimport { EnableContext } from './EnableContext';\nimport { FeatureContext } from './FeatureContext';\nimport { FeaturesMachine } from './FeaturesState';\nimport { FeatureDescription } from './FeatureState';\nimport useConsoleOverride from './useConsoleOverride';\nimport usePersist, { KEY } from './usePersist';\nimport useTestCallback from './useTestCallback';\n\ninterface FeatureProps {\n readonly features: readonly FeatureDescription[];\n readonly children?: ReactNode;\n readonly disableConsole?: boolean;\n readonly storage?: Storage;\n}\n\n/**\n * A more batteries-enabled parent component that keeps track of feature state\n * internally, and creates window.feature.enable(\"f\") and window.feature.disable(\"f\").\n * Keeps track of overrides and defaults, with defaults potentially coming from your props\n * and overrides being persisted to your choice of storage layer.\n */\nexport function Features({\n children,\n features,\n disableConsole = false,\n storage = window.sessionStorage,\n}: FeatureProps): JSX.Element {\n // Capture only first value; we don't care about future updates\n const featuresRef = useRef(features);\n const [overridesState, overridesSend] = useMachine(FeaturesMachine);\n const [defaultsState, defaultsSend] = useMachine(FeaturesMachine);\n\n useEffect(() => {\n /// Load defaults\n defaultsSend({ type: 'INIT', features });\n return () => {\n defaultsSend({ type: 'DE_INIT' });\n };\n }, [defaultsSend, features]);\n\n useEffect(() => {\n let f: Record = {};\n if (storage != null) {\n try {\n const featuresJson = storage.getItem(KEY);\n if (featuresJson != null) {\n const fh = JSON.parse(featuresJson);\n f = fh.overrides;\n }\n } catch (e) {\n // Can't parse or get or otherwise; ignore\n console.error('error in localStorage', e);\n }\n }\n\n overridesSend({\n type: 'INIT',\n features: featuresRef.current\n .filter((x) => x.noOverride !== true)\n .map((x) => ({ name: x.name, description: x.description, defaultValue: f?.[x.name] ?? undefined })),\n });\n\n return () => {\n overridesSend({ type: 'DE_INIT' });\n };\n }, [featuresRef, overridesSend, storage]);\n\n usePersist(storage, featuresRef.current, overridesState);\n\n const testCallback = useTestCallback(overridesState, defaultsState);\n useConsoleOverride(!disableConsole, featuresRef.current, testCallback, defaultsSend);\n\n const featureValue = useMemo(\n () => ({\n overridesSend,\n defaultsSend,\n featuresDescription: featuresRef.current,\n overridesState,\n defaultsState,\n test: testCallback,\n }),\n [overridesSend, defaultsSend, overridesState, defaultsState, testCallback]\n );\n\n return (\n \n {children}\n \n );\n}\n", "import { createContext } from 'react';\n\nimport { FeatureValue } from './FeatureState';\n\nexport type EnableContextType = (feature: string) => FeatureValue;\n\n/**\n * Contained function can check whether a given feature is enabled.\n */\nexport const EnableContext = createContext((_s) => false);\n", "import { createContext } from 'react';\n\nimport { FeaturesDispatch, FeaturesState } from './FeaturesState';\nimport { FeatureDescription, FeatureValue } from './FeatureState';\n\nexport const FeatureContext = createContext(null);\n\n/// Give access to the overrides layer\nexport interface FeatureContextType {\n // Make changes to the overrides\n overridesSend: FeaturesDispatch;\n\n // Make changes to defaults\n defaultsSend: FeaturesDispatch;\n\n featuresDescription: readonly FeatureDescription[];\n\n // State is in layers; overrides and defaults\n overridesState: FeaturesState;\n defaultsState: FeaturesState;\n\n /// Test with proper fallback and respecting the user's force preference\n test: (flag: string) => FeatureValue;\n}\n", "import { useEffect } from 'react';\n\nimport { FeaturesDispatch } from './FeaturesState';\nimport { FeatureDescription, FeatureValue } from './FeatureState';\nimport { GlobalEnable } from './GlobalEnable';\n\nexport default function useConsoleOverride(\n consoleOverride: boolean,\n features: readonly FeatureDescription[],\n testFeature: (_: string) => FeatureValue,\n dispatch: FeaturesDispatch\n): void {\n useEffect(() => {\n if (!consoleOverride) {\n return () => {\n /* empty */\n };\n }\n window.feature = new GlobalEnable(dispatch, testFeature, features);\n return () => {\n if (window.feature != null) {\n delete window.feature;\n }\n };\n }, [features, dispatch, consoleOverride, testFeature]);\n}\n", "import { FeaturesDispatch } from './FeaturesState';\nimport { FeatureDescription, FeatureValue } from './FeatureState';\n\nexport class GlobalEnable {\n private readonly featureDesc: readonly FeatureDescription[];\n private readonly dispatch: FeaturesDispatch;\n private readonly testFeature: (value: string) => FeatureValue;\n\n constructor(\n dispatch: FeaturesDispatch,\n testFeature: (_: string) => FeatureValue,\n featureDesc: readonly FeatureDescription[]\n ) {\n this.featureDesc = featureDesc;\n this.dispatch = dispatch;\n this.testFeature = testFeature;\n }\n\n public toggle(feature: string): void {\n this.dispatch({ type: 'TOGGLE', name: feature });\n }\n\n public enable(feature: string): void {\n this.dispatch({ type: 'ENABLE', name: feature });\n }\n\n public unset(feature: string): void {\n this.dispatch({ type: 'UNSET', name: feature });\n }\n\n public disable(feature: string): void {\n this.dispatch({ type: 'DISABLE', name: feature });\n }\n\n public setAll(features: { [key: string]: FeatureValue }): void {\n this.dispatch({ type: 'SET_ALL', features });\n }\n\n public listFeatures(): readonly [string, FeatureValue][] {\n return this.featureDesc.map((f) => [f.name, this.testFeature(f.name)]);\n }\n}\ndeclare global {\n interface Window {\n feature?: GlobalEnable;\n }\n}\n", "import { useMemo, useEffect } from 'react';\n\nimport { FeaturesState, valueOfFeature } from './FeaturesState';\nimport { FeatureDescription, FeatureValue } from './FeatureState';\n\nexport const KEY = 'react-enable:feature-values';\n\nexport default function usePersist(\n storage: Storage | undefined,\n features: readonly FeatureDescription[],\n overrideState: FeaturesState\n): void {\n const overrides = useMemo(() => {\n const newOverrides: { [key: string]: FeatureValue } = {};\n if (overrideState.matches('ready')) {\n for (const feature of features) {\n const [value] = valueOfFeature(overrideState, feature.name);\n if (value != null) {\n newOverrides[feature.name] = value;\n }\n }\n }\n return newOverrides;\n }, [features, overrideState]);\n\n const strState = Object.keys(overrides).length === 0 || storage == null ? '{}' : JSON.stringify({ overrides });\n\n useEffect(() => {\n try {\n if (storage != null && overrideState.matches('ready')) {\n storage.setItem(KEY, strState);\n }\n } catch (e) {\n // Can't set for some reason\n }\n }, [overrideState, storage, strState]);\n}\n", "import { useCallback } from 'react';\n\nimport { FeaturesState } from './FeaturesState';\nimport testFeature from './testFeature';\n\n/// A callback that can be called to test if a feature is enabled or disabled\nexport default function useTestCallback(\n defaultsState: FeaturesState,\n overridesState: FeaturesState\n): (feature: string) => boolean | undefined {\n return useCallback((f: string) => testFeature(f, [defaultsState, overridesState]), [defaultsState, overridesState]);\n}\n", "import { FeaturesState, valueOfFeature } from './FeaturesState';\nimport { FeatureValue } from './FeatureState';\n\n/** Determine if the feature is enabled in one of the state machines, in order\n *\n * @param state The current state of the machine\n * @param feature The feature to check\n */\n\nexport default function testFeature(feature: string, states: FeaturesState[]): FeatureValue {\n const values = states.map((state) => valueOfFeature(state, feature));\n\n // look for best forced option, in order\n for (const [featureValue, featureForced] of values) {\n if (featureValue != null && featureForced) {\n return featureValue;\n }\n }\n\n // look for best non-forced option, in order\n for (const [featureValue] of values) {\n if (featureValue != null) {\n return featureValue;\n }\n }\n\n // unset if nothing hit\n return undefined;\n}\n", "import * as React from 'react';\n\nimport { useAllEnabled } from './useAllEnabled';\nimport { useEnabled } from './useEnabled';\n\nexport interface EnableProps {\n readonly feature?: string[] | string;\n readonly allFeatures?: string[];\n children: React.ReactNode;\n}\n\n/**\n * Feature will be enabled if any feature in the list are enabled,\n */\nexport function Enable({ feature = [], allFeatures = [], children }: EnableProps): JSX.Element | null {\n const isAny = useEnabled(feature);\n const isAll = useAllEnabled(allFeatures);\n\n if (isAny || isAll) {\n return <>{children};\n }\n\n return null;\n}\n", "import { useContext, useMemo } from 'react';\n\nimport { EnableContextType, EnableContext } from './EnableContext';\n\n// Helper: get rid of some boilerplate.\n// just input mashing and sanitation, removing extra renders, and getting test function\nexport function useTestAndConvert(input?: string[] | string | null): [EnableContextType, string[]] {\n const test = useContext(EnableContext);\n\n // We memoize just to prevent re-renders since this could be at the leaf of a tree\n const converted = useMemo(() => (input == null ? [] : Array.isArray(input) ? input : [input]), [input]);\n\n return [test, converted];\n}\n", "import { useTestAndConvert } from './utils';\n\n/**\n * returns true iff all specified features are enabled\n */\nexport function useAllEnabled(allFeatures: string[] | string): boolean {\n const [test, queryAllPresent] = useTestAndConvert(allFeatures);\n return queryAllPresent.length > 0 && queryAllPresent.every(test);\n}\n", "import { useTestAndConvert } from './utils';\n\n/**\n * returns true iff any specified feature is enabled\n */\nexport function useEnabled(feature: string[] | string): boolean {\n const [test, queryAnyPresent] = useTestAndConvert(feature);\n return queryAnyPresent.some(test);\n}\n", "import * as React from \"react\";\n\nimport { EnableProps } from \"./Enable\";\nimport { useAllDisabled } from \"./useAllDisabled\";\nimport { useDisabled } from \"./useDisabled\";\n\n/**\n * Feature will be disabled if any in the list are enabled\n */\nexport const Disable: React.FC = ({\n feature = [],\n allFeatures = [],\n children\n}) => {\n const isAny = useDisabled(feature);\n const isAll = useAllDisabled(allFeatures);\n\n if (isAny || isAll) {\n return <>{children};\n }\n\n return null;\n};\n", "import { useTestAndConvert } from './utils';\n\n/**\n * returns true iff all specified features are disabled\n */\nexport function useAllDisabled(withoutAll: string[] | string): boolean {\n const [test, queryAllWithout] = useTestAndConvert(withoutAll);\n return withoutAll.length > 0 && queryAllWithout.every((x) => !(test(x) ?? false));\n}\n", "import { useTestAndConvert } from './utils';\n\n/**\n * returns true iff any specified feature is disabled\n */\nexport function useDisabled(without: string[] | string): boolean {\n const [test, queryAnyWithout] = useTestAndConvert(without);\n return queryAnyWithout.some((x) => !(test(x) ?? false));\n}\n", "import React, { useContext, useState, useCallback, ReactNode } from 'react';\nimport ReactDOM from 'react-dom';\n\nimport { RadioGroup } from '@headlessui/react';\n\nimport { FeatureContext } from './FeatureContext';\nimport { valueOfFeature } from './FeaturesState';\nimport { FeatureDescription } from './FeatureState';\n// @ts-expect-error bundler will take care of this\nimport styles from './tailwind.css';\n\nfunction classNames(...classes: string[]): string {\n return classes.filter(Boolean).join(' ');\n}\n\nfunction ToggleFeature({ feature }: { feature: FeatureDescription }): JSX.Element | null {\n const context = useContext(FeatureContext);\n const handleChangeSelection = useCallback(\n (value: 'false' | 'true' | 'unset') => {\n if (context?.overridesSend != null) {\n switch (value) {\n case 'true': {\n context.overridesSend({ type: 'ENABLE', name: feature.name });\n break;\n }\n case 'false': {\n context.overridesSend({ type: 'DISABLE', name: feature.name });\n break;\n }\n case 'unset': {\n context.overridesSend({ type: 'UNSET', name: feature.name });\n break;\n }\n }\n }\n },\n [feature.name, context]\n );\n\n if (context == null) {\n return null;\n }\n\n const { overridesState, test: testFeature, defaultsState } = context;\n\n const valueInDefaults = (valueOfFeature(defaultsState, feature.name)[0] ?? 'unset').toString() as\n | 'false'\n | 'true'\n | 'unset';\n\n const valueInOverrides = (valueOfFeature(overridesState, feature.name)[0] ?? 'unset').toString() as\n | 'false'\n | 'true'\n | 'unset';\n\n const actualChecked = testFeature(feature.name);\n\n return (\n \n \n
\n \n Feature: {feature.name}\n \n {feature.noOverride === true ? (\n
\n \n \n \n
No Overrides
\n
\n ) : null}\n {actualChecked === true ? (\n
\n \n \n \n
{actualChecked ? 'Enabled' : 'Disabled'}
\n
\n ) : null}\n
\n {feature.description == null ? null :

{feature.description}

}\n
\n
\n {[\n { id: 'false', title: `Disable ${feature.name}`, description: 'Override the feature to be disabled' },\n {\n id: 'unset',\n title: 'Default',\n description: 'Inherit enabled state from defaults',\n disabled: (feature.noOverride ?? false) || feature.force,\n defaultValue:\n valueInDefaults === 'true' ? (\n
\n Enabled\n
\n ) : (\n
\n Disabled\n
\n ),\n },\n { id: 'true', title: `Enable ${feature.name}`, description: 'Override the feature to be enabled' },\n ].map((option) => (\n \n classNames(\n checked ? 'border-transparent' : 'border-gray-300',\n !disabled && active ? 'border-blue-500 ring-2 ring-blue-500' : '',\n disabled ? 'border-transparent ring-gray-500 cursor-not-allowed' : 'cursor-pointer',\n 'relative bg-white border rounded-lg shadow-sm p-3 flex focus:outline-none'\n )\n }\n disabled={option.disabled}\n key={option.id}\n value={option.id}\n >\n {({ checked, active, disabled }) => (\n <>\n
\n \n {option.title}\n {option.defaultValue != null ? option.defaultValue : null}\n \n \n \n \n \n {option.description}\n \n
\n \n \n )}\n \n ))}\n
\n
\n );\n}\n\nfunction ShadowContent({ root, children }: { children: ReactNode; root: Element }) {\n return ReactDOM.createPortal(children, root);\n}\n\n/// Permit users to override feature flags via a GUI.\n/// Renders a small floating button in lower left or right, pressing it brings up\n/// a list of features to toggle and their current override state. you can override on or override off,\n/// or unset the override and go back to default value.\n// eslint-disable-next-line no-undef\nexport function ToggleFeatures({ defaultOpen = false, hidden = false }: { defaultOpen?: boolean; hidden?: boolean }): JSX.Element | null {\n const [root, setCoreRoot] = useState(null);\n\n const setRoot = (host: HTMLDivElement | null) => {\n if (host == null || root != null) {\n return;\n }\n const shadowRoot = host?.attachShadow({ mode: 'open' });\n const style = document.createElement('style');\n const renderDiv = document.createElement('div');\n style.textContent = styles;\n shadowRoot.appendChild(style);\n shadowRoot.appendChild(renderDiv);\n setCoreRoot(renderDiv);\n };\n\n if (hidden) {\n return null;\n }\n\n return (\n
\n {root != null ? (\n \n \n \n ) : null}\n
\n );\n}\n\n/// Like ToggleFeatures, but does not inject styles into a shadow DOM root node.\n/// useful if you're using tailwind.\nexport function ToggleFeatureUnwrapped({ defaultOpen = false, hidden = false }: { defaultOpen?: boolean; hidden?: boolean }): JSX.Element | null {\n const [open, setOpen] = useState(defaultOpen);\n const context = useContext(FeatureContext);\n\n if (context == null) {\n return null;\n }\n\n if (hidden) {\n return null;\n }\n\n // We want: Real value after all nestings, value of the override. we toggle override\n const { featuresDescription } = context;\n\n if (featuresDescription.length === 0) {\n return null;\n }\n\n return (\n
\n
\n setOpen(true)}\n title=\"Toggle features\"\n type=\"button\"\n >\n \n \n \n \n
\n {!open ? null : (\n
\n
\n
\n
\n
\n

\n
Feature Flag Overrides
\n

\n

\n Features can be enabled or disabled unless they are forced upstream. You can also revert to default.\n

\n
\n
\n Feature Flags\n {featuresDescription.map((feature) => (\n \n ))}\n
\n
\n
\n setOpen(false)}\n type=\"button\"\n >\n Done\n \n
\n
\n
\n
\n
\n
\n )}\n
\n );\n}\n"], + "mappings": "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", "names": [] } diff --git a/package.json b/package.json index 69341f0..3b05d5e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-enable", - "version": "3.1.0", + "version": "3.1.1", "description": "feature flags to enable and disable functionality at runtime in a react application", "main": "dist/cjs/src/index.js", "module": "dist/esm/src/index.js", diff --git a/src/tailwind.css b/src/tailwind.css index 4eb227e..412ed6c 100644 --- a/src/tailwind.css +++ b/src/tailwind.css @@ -744,6 +744,10 @@ select { display: grid; } +.hidden { + display: none; +} + .h-7 { height: 1.75rem; }