@ditojs/admin 2.2.7-debug.1 → 2.2.7-debug.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,5 +2,5 @@
2
2
  `))},notifyErrors(e){this.notify({type:"error",title:"Validation Errors",text:e||"Please correct the highlighted errors."})},resetData(){Object.assign(this.data,st(this.schema,{},this)),this.clearErrors()},setData(e){for(const t in e)if(t in this.data){this.data[t]=e[t];for(const o of this.getComponentsByName(t))o.markDirty()}},filterData(e){const t={};for(const[o,s]of Object.entries(e))(c.isArray(s)||c.isObject(s))&&this.getComponentsByName(o).some(i=>i.providesData)||(t[o]=s);return t},processData({target:e="clipboard",schemaOnly:t=!0}={}){return Xn(this.schema,this.sourceSchema,this.data,this.dataPath,{component:this,schemaOnly:t,target:e})},_register(e){var t;(t=this.$schemaParentComponent())==null||t._registerSchemaComponent(this,e)},_registerComponent(e,t){var o;this._registerEntry(this.componentsRegistry,e,t),(o=this.parentSchemaComponent)==null||o._registerComponent(e,t)},_registerPane(e,t){this._registerEntry(this.panesRegistry,e,t)},_registerPanel(e,t){this._registerEntry(this.panelsRegistry,e,t)},_registerEntry(e,t,o){const s=t.$uid;o?e[s]=t:delete e[s]},_listEntriesByDataPath(e){return Object.values(e).reduce((t,o)=>{const{dataPath:s}=o;return(t[s]||(t[s]=[])).push(o),t},{})},_getEntries(e,t,o){return c.normalizeDataPath(t).startsWith(this.dataPath)?this._getEntriesByDataPath(e,t,o):this._getEntriesByName(e,t,o)},_getEntriesByDataPath(e,t,o){return this._filterEntries(e[c.normalizeDataPath(t)]||[],o)},_getEntriesByName(e,t,o){return this._filterEntries(e[F(this.dataPath,t)]||[],o)},_filterEntries(e,t){return t?e.filter(t):e}}}),Qs=b(Js,[["render",Ys]]);function Gs(e,t,o,s,a,i){const r=n.resolveComponent("DitoEditButtons"),l=n.resolveComponent("DitoSchema");return n.openBlock(),n.createBlock(l,{class:n.normalizeClass(["dito-schema-inlined",{"dito-schema-compact":e.isCompact}]),schema:e.schema,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,label:e.isCompact?null:e.label,inlined:!0,disabled:e.disabled,collapsed:e.collapsed,collapsible:e.collapsible,generateLabels:!e.isCompact},{"edit-buttons":n.withCtx(()=>[e.deletable||e.draggable||e.editable?(n.openBlock(),n.createBlock(r,{key:0,deletable:e.deletable,draggable:e.draggable,editable:e.editable,editPath:e.editPath,schema:e.schema,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,onDelete:t[0]||(t[0]=d=>e.$emit("delete"))},null,8,["deletable","draggable","editable","editPath","schema","dataPath","data","meta","store"])):n.createCommentVNode("",!0)]),_:1},8,["schema","dataPath","data","meta","store","label","disabled","collapsed","collapsible","generateLabels","class"])}const $c="",Xs=C.component("DitoSchemaInlined",{emits:["delete"],props:{schema:{type:Object,required:!0},dataPath:{type:String,required:!0},data:{type:Object,required:!0},meta:{type:Object,required:!0},store:{type:Object,required:!0},label:{type:[String,Object],default:null},disabled:{type:Boolean,required:!0},collapsed:{type:Boolean,default:!1},collapsible:{type:Boolean,default:!1},draggable:{type:Boolean,default:!1},editable:{type:Boolean,default:!1},deletable:{type:Boolean,default:!1},editPath:{type:String,default:null}},computed:{isCompact(){return et(this.schema)},hasLabel(){return!this.isCompact&&!!this.label}}}),Zs=b(Xs,[["render",Gs]]),vs={key:0,class:"dito-pane"},xs={key:0,class:"dito-break"},ea={key:2,class:"dito-break"};function ta(e,t,o,s,a,i){const r=n.resolveComponent("DitoContainer");return e.isPopulated&&e.componentSchemas.length>0?n.withDirectives((n.openBlock(),n.createElementBlock("div",vs,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.componentSchemas,({schema:l,dataPath:d,nestedDataPath:h,nested:u,store:p})=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[l.break==="before"?(n.openBlock(),n.createElementBlock("div",xs)):n.createCommentVNode("",!0),e.shouldRender(l)?(n.openBlock(),n.createBlock(r,{key:h,schema:l,dataPath:d,data:e.data,meta:e.meta,store:p,single:e.isSingleComponent,nested:u,disabled:e.disabled,generateLabels:e.generateLabels},null,8,["schema","dataPath","data","meta","store","single","nested","disabled","generateLabels"])):n.createCommentVNode("",!0),l.break==="after"?(n.openBlock(),n.createElementBlock("div",ea)):n.createCommentVNode("",!0)],64))),256))],512)),[[n.vShow,e.visible]]):n.createCommentVNode("",!0)}const Bc="",na=C.component("DitoPane",{provide(){return{$tabComponent:()=>this.tabComponent}},props:{schema:{type:Object,required:!0},dataPath:{type:String,default:""},data:{type:Object,default:null},meta:{type:Object,required:!0},store:{type:Object,required:!0},tab:{type:String,default:null},single:{type:Boolean,default:!1},visible:{type:Boolean,default:!0},disabled:{type:Boolean,default:!1},generateLabels:{type:Boolean,default:!0}},computed:{tabComponent(){return this.tab?this:this.$tabComponent()},componentSchemas(){var t,o;const e=(t=this.sourceSchema)==null?void 0:t.wrapPrimitives;return Object.entries(((o=this.schema)==null?void 0:o.components)||{}).map(([s,a])=>{a.name=s;const i=tt(a),r=F(this.dataPath,s);return{schema:a,dataPath:i&&!e?r:this.dataPath,nestedDataPath:r,nested:i,store:i?this.getChildStore(s):this.store}})},panelEntries(){return this.componentSchemas.flatMap(({schema:e,nestedDataPath:t})=>Zn(this.api,e,t,this.schemaComponent,this.tabComponent))},isSingleComponent(){return this.single&&this.componentSchemas.length===1}},created(){this._register(!0)},unmounted(){this._register(!1)},methods:{_register(e){this.schemaComponent._registerPane(this,e)},focus(){this.tab&&this.$router.push({hash:`#${this.tab}`})}}}),oa=b(na,[["render",ta]]);function sa(e){const t=c.isString(e)&&e.match(/^\s*([+-]?\d+)\s*\/\s*([+-]?\d+)\s*$/);if(t){const[,o,s]=t;return parseFloat(o)/parseFloat(s)}else return parseFloat(e)}function aa(e,t,o,s,a,i){const r=n.resolveComponent("DitoLabel"),l=n.resolveComponent("DitoErrors");return n.withDirectives((n.openBlock(),n.createElementBlock("div",{class:n.normalizeClass(["dito-container",e.containerClass]),style:n.normalizeStyle(e.containerStyle)},[e.hasLabel?(n.openBlock(),n.createBlock(r,{key:0,label:e.label,dataPath:e.labelDataPath,class:n.normalizeClass(e.componentClass)},null,8,["label","dataPath","class"])):n.createCommentVNode("",!0),(n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.typeComponent),{class:n.normalizeClass(["dito-component",e.componentClass]),schema:e.schema,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,single:e.single,nested:e.nested,disabled:e.componentDisabled,onErrors:e.onErrors},null,40,["schema","dataPath","data","meta","store","single","nested","disabled","class","onErrors"])),n.createVNode(l,{errors:e.errors},null,8,["errors"])],6)),[[n.vShow,e.componentVisible]])}const Dc="",ra=C.component("DitoContainer",{props:{schema:{type:Object,required:!0},dataPath:{type:String,default:""},data:{type:[Object,Array],required:!0},meta:{type:Object,required:!0},store:{type:Object,required:!0},single:{type:Boolean,default:!1},nested:{type:Boolean,default:!0},disabled:{type:Boolean,required:!0},generateLabels:{type:Boolean,default:!0}},data(){return{errors:null}},computed:{context(){return new V(this,{nested:this.nested})},typeComponent(){return ne(this.schema.type)},hasLabel(){var t;const{label:e}=this.schema;return e!==!1&&(!!e||this.generateLabels&&((t=this.typeComponent)==null?void 0:t.generateLabel))},label(){return this.hasLabel?this.getLabel(this.schema):null},labelDataPath(){return this.nested?this.dataPath:null},componentWidth:y("width",{type:[String,Number],default(){var e;return(e=this.typeComponent)==null?void 0:e.defaultWidth},get(e){return e===void 0?1:c.isString(e)?e.match(/^\s*[<>]?\s*(.*)$/)[1]:e}}),componentWidthOperator:y("width",{type:String,get(e){return c.isString(e)&&e.match(/^\s*([<>]?)/)[1]||null}}),componentVisible:y("visible",{type:Boolean,default(){var e;return(e=this.typeComponent)==null?void 0:e.defaultVisible}}),componentDisabled:y("disabled",{type:Boolean,default:!1,get(e){return e||this.disabled}}),containerClass(){const{class:e}=this.schema,t="dito-container";return{[`${t}--single`]:this.single,[`${t}--has-label`]:this.hasLabel,[`${t}--align-bottom`]:Gn(this.schema),[`${t}--omit-padding`]:Qn(this.schema),...c.isString(e)?{[e]:!0}:e}},componentBasis(){const e=this.componentWidth,t=[null,"auto","fill"].includes(e)?"auto":/%$/.test(e)?parseFloat(e):/[a-z]/.test(e)?e:sa(e)*100;return c.isNumber(t)?`${t}%`:t},containerStyle(){const e=this.componentWidthOperator===">"||this.componentWidth==="fill",t=this.componentWidthOperator==="<";return{flex:`${e?1:0} ${t?1:0} ${this.componentBasis}`}},componentClass(){const e=this.componentBasis==="auto";return{"dito-single":this.single,"dito-disabled":this.componentDisabled,"dito-width-fill":!e||this.componentWidth==="fill","dito-width-auto":e,"dito-has-errors":!!this.errors}}},methods:{onErrors(e){this.errors=e}}}),ia=b(ra,[["render",aa]]),la={class:"dito-tabs"};function da(e,t,o,s,a,i){const r=n.resolveComponent("RouterLink");return n.openBlock(),n.createElementBlock("div",la,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.tabs,(l,d)=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[e.shouldRender(l)?(n.openBlock(),n.createBlock(r,{class:n.normalizeClass(["dito-link",{"dito-active":e.selectedTab===d}]),key:d,to:{hash:`#${d}`}},{default:n.withCtx(()=>[n.createTextVNode(n.toDisplayString(e.getLabel(l,d)),1)]),_:2},1032,["to","class"])):n.createCommentVNode("",!0)],64))),256))])}const wc="",ca=C.component("DitoTabs",{props:{tabs:{type:Object,default:null},selectedTab:{type:String,default:null}}}),ha=b(ca,[["render",da]]);function ua(e,t,o,s,a,i){const r=n.resolveComponent("DitoButtons"),l=n.resolveComponent("DitoSchema");return n.withDirectives((n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.panelTag),{class:"dito-panel",onSubmit:t[0]||(t[0]=n.withModifiers(()=>{},["prevent"]))},{default:n.withCtx(()=>[n.createVNode(l,{class:"dito-panel__schema",schema:e.panelSchema,dataPath:e.panelDataPath,data:e.panelData,meta:e.meta,store:e.store,disabled:e.disabled,hasOwnData:e.hasOwnData},{before:n.withCtx(()=>[n.createElementVNode("h2",{class:n.normalizeClass(["dito-panel__header",{"dito-panel__header--sticky":e.sticky}])},[n.createElementVNode("span",null,n.toDisplayString(e.getLabel(e.schema)),1),n.createVNode(r,{class:"dito-buttons-small",buttons:e.panelButtonSchemas,dataPath:e.panelDataPath,data:e.panelData,meta:e.meta,store:e.store,disabled:e.disabled},null,8,["buttons","dataPath","data","meta","store","disabled"])],2)]),buttons:n.withCtx(()=>[n.createVNode(r,{buttons:e.buttonSchemas,dataPath:e.panelDataPath,data:e.panelData,meta:e.meta,store:e.store,disabled:e.disabled},null,8,["buttons","dataPath","data","meta","store","disabled"])]),_:1},8,["schema","dataPath","data","meta","store","disabled","hasOwnData"])]),_:1},544)),[[n.vShow,e.visible&&(!e.panelTabComponent||e.panelTabComponent.visible)]])}const Vc="",pa=C.component("DitoPanel",{mixins:[mt],provide(){return{$panelComponent:()=>this,$tabComponent:()=>this.panelTabComponent}},props:{schema:{type:Object,required:!0},dataPath:{type:String,required:!0},data:{type:Object,required:!0},meta:{type:Object,required:!0},store:{type:Object,required:!0},disabled:{type:Boolean,required:!0},panelTabComponent:{type:Object,default:null}},data(){return{ownData:null}},computed:{panelComponent(){return this},tabComponent(){return this.panelTabComponent},buttonSchemas(){return G(this.schema.buttons)},panelButtonSchemas(){return G(this.schema.panelButtons)},target(){return this.schema.target||this.dataPath},hasOwnData(){return!!this.ownData},panelData(){return this.ownData||this.data},panelSchema(){if(this.hasOwnData)return this.schema;{const{data:e,...t}=this.schema;return t}},panelTag(){return this.hasOwnData?"form":"div"},panelDataPath(){return this.hasOwnData?this.dataPath:this.schemaComponent.dataPath},visible:y("visible",{type:Boolean,default:!0}),sticky:y("sticky",{type:Boolean,default:!1})},created(){this._register(!0);const{data:e}=this.schema;e&&(this.ownData=c.isFunction(e)?e(this.context):e)},unmounted(){this._register(!1)},methods:{_register(e){this.schemaComponent._registerPanel(this,e)}}}),ma=b(pa,[["render",ua]]),fa={key:0,class:"dito-panels"};function ga(e,t,o,s,a,i){const r=n.resolveComponent("DitoPanel");return e.panels.length>0?(n.openBlock(),n.createElementBlock("div",fa,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.panels,({schema:l,dataPath:d,tabComponent:h})=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[e.shouldRender(l)?(n.openBlock(),n.createBlock(r,{key:e.getPanelKey(d,h),schema:l,dataPath:d,data:e.data,meta:e.meta,store:e.getChildStore(l.name),disabled:l.disabled!=null?l.disabled:e.disabled,panelTabComponent:h},null,8,["schema","dataPath","data","meta","store","disabled","panelTabComponent"])):n.createCommentVNode("",!0)],64))),256))])):n.createCommentVNode("",!0)}const Sc="",ba=C.component("DitoPanels",{props:{panels:{type:Array,default:null},data:{type:Object,required:!0},meta:{type:Object,required:!0},store:{type:Object,required:!0},disabled:{type:Boolean,required:!0}},methods:{getPanelKey(e,t){return t?`${t.tab}_${e}`:e}}}),ya=b(ba,[["render",ga]]);function Et(e){return e&&c.asArray(e).some(t=>t.type!==n.Comment)}function ka(e,t={}){return e=c.isString(e)?n.useSlots()[e]:e,Et(e==null?void 0:e(t))}const Ca={key:0,class:"dito-buttons"},$a={key:0,class:"dito-container"};function Ba(e,t,o,s,a,i){var d,h;const r=n.resolveComponent("DitoContainer"),l=n.resolveComponent("DitoVnode");return e.buttonSchemas||e.hasSlotContent(e.$slots.default)?(n.openBlock(),n.createElementBlock("div",Ca,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.buttonSchemas,(u,p)=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[e.shouldRender(u)?(n.openBlock(),n.createBlock(r,{key:p,schema:u,dataPath:p,data:e.data,meta:e.meta,store:e.getChildStore(u.name),disabled:e.disabled,generateLabels:!1},null,8,["schema","dataPath","data","meta","store","disabled"])):n.createCommentVNode("",!0)],64))),256)),(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList((h=(d=e.$slots).default)==null?void 0:h.call(d),u=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[e.hasVNodeContent(u)?(n.openBlock(),n.createElementBlock("div",$a,[n.createVNode(l,{vnode:u},null,8,["vnode"])])):n.createCommentVNode("",!0)],64))),256))])):n.createCommentVNode("",!0)}const Pc="",Da=C.component("DitoButtons",{provide:{$tabComponent:()=>null},props:{buttons:{type:Object,default:null},dataPath:{type:String,default:""},data:{type:[Object,Array],default:null},meta:{type:Object,default:()=>({})},store:{type:Object,default:()=>({})},disabled:{type:Boolean,default:!1}},computed:{buttonSchemas(){const{dataPath:e,buttons:t}=this;return t?Object.values(t).reduce((o,s)=>(o[F(e,s.name)]=s,o),{}):null}},methods:{hasSlotContent:ka,hasVNodeContent:Et}}),wa=b(Da,[["render",Ba]]);function Va(e,t,o,s,a,i){const r=n.resolveComponent("RouterLink"),l=n.resolveComponent("DitoCreateButton"),d=n.resolveComponent("DitoButtons");return n.openBlock(),n.createBlock(d,{class:"dito-edit-buttons dito-buttons-round",buttons:e.buttons,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,onClick:t[1]||(t[1]=n.withModifiers(()=>{},["stop"]))},{default:n.withCtx(()=>[e.isDraggable?(n.openBlock(),n.createElementBlock("a",n.mergeProps({key:0,class:"dito-button"},e.getButtonAttributes(e.verbs.drag)),null,16)):n.createCommentVNode("",!0),e.isEditable?(n.openBlock(),n.createBlock(r,n.mergeProps({key:1,class:"dito-button",to:{path:e.editPath}},e.getButtonAttributes(e.verbs.edit)),null,16,["to"])):n.createCommentVNode("",!0),e.isCreatable?(n.openBlock(),n.createBlock(l,{key:2,schema:e.schema,path:e.createPath,verb:e.verbs.create,text:e.createButtonText},null,8,["schema","path","verb","text"])):n.createCommentVNode("",!0),e.isDeletable?(n.openBlock(),n.createElementBlock("button",n.mergeProps({key:3,class:"dito-button",type:"button"},e.getButtonAttributes(e.verbs.delete),{onClick:t[0]||(t[0]=h=>e.$emit("delete"))}),null,16)):n.createCommentVNode("",!0)]),_:1},8,["buttons","dataPath","data","meta","store"])}const Ec="",Sa=C.component("DitoEditButtons",{emits:["delete"],props:{draggable:{type:Boolean,default:!1},editable:{type:Boolean,default:!1},creatable:{type:Boolean,default:!1},deletable:{type:Boolean,default:!1},editPath:{type:String,default:null},createPath:{type:String,default:null},buttons:{type:Object,default:null},schema:{type:Object,required:!0},dataPath:{type:String,required:!0},data:{type:[Object,Array],default:null},meta:{type:Object,required:!0},store:{type:Object,required:!0}},computed:{formLabel(){return this.getLabel(this.schema.form)},isDraggable(){return this.hasOption("draggable")},isEditable(){return this.hasOption("editable")&&!!this.editPath},isCreatable(){return this.hasOption("creatable")&&!!this.createPath},isDeletable(){return this.hasOption("deletable")},createButtonText(){var e;return((e=this.schema.creatable)==null?void 0:e.label)||this.formLabel&&`${c.capitalize(this.verbs.create)} ${this.formLabel}`||null}},methods:{hasOption(e){return!!(this[e]&&this.schema[e]!==!1)}}}),Pa=b(Sa,[["render",Va]]),Ea={class:"dito-create-button"},Na=["title"],Oa=["onMousedown","onMouseup"],Fa=["type","title"];function La(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("div",Ea,[e.showPulldown?(n.openBlock(),n.createElementBlock(n.Fragment,{key:0},[n.createElementVNode("button",{class:n.normalizeClass(["dito-button",`dito-button-${e.verb}`]),type:"button",title:e.labelize(e.verb),onMousedown:t[0]||(t[0]=n.withModifiers(r=>e.onPulldownMouseDown(),["stop"]))},n.toDisplayString(e.text),43,Na),n.createElementVNode("ul",{class:n.normalizeClass(["dito-pulldown",{"dito-open":e.pulldown.open}])},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.forms,(r,l)=>(n.openBlock(),n.createElementBlock("li",null,[e.shouldRender(r)?n.withDirectives((n.openBlock(),n.createElementBlock("a",{key:0,class:n.normalizeClass(e.getFormClass(r,l)),onMousedown:n.withModifiers(d=>e.onPulldownMouseDown(l),["stop"]),onMouseup:d=>e.onPulldownMouseUp(l)},n.toDisplayString(e.getLabel(r)),43,Oa)),[[n.vShow,e.shouldShow(r)]]):n.createCommentVNode("",!0)]))),256))],2)],64)):(n.openBlock(),n.createElementBlock("button",{key:1,class:n.normalizeClass(["dito-button",`dito-button-${e.verb}`]),type:e.isInlined?"button":"submit",title:e.labelize(e.verb),onClick:t[1]||(t[1]=r=>e.createItem(e.forms.default))},n.toDisplayString(e.text),11,Fa))])}const Nc="",Ta=C.component("DitoCreateButton",{mixins:[St],props:{schema:{type:Object,required:!0},path:{type:String,required:!0},verb:{type:String,required:!0},text:{type:String,default:null}},computed:{forms(){return H(this.schema,this.context)},isInlined(){return we(this.schema)},showPulldown(){return Object.keys(this.forms).length>1||!this.forms.default}},methods:{createItem(e,t=null){if(this.shouldRender(e)&&!this.shouldDisable(e))this.isInlined?this.sourceComponent.createItem(e,t):this.$router.push({path:`${this.path}/create`,query:{type:t}});else throw new Error("Not allowed to create item for given form")},getFormClass(e,t){return{[`dito-type-${t}`]:!0,"dito-disabled":this.shouldDisable(e)}},onPulldownSelect(e){this.createItem(this.forms[e],e),this.setPulldownOpen(!1)}}}),ja=b(Ta,[["render",La]]),_a={key:0,class:"dito-clipboard dito-buttons dito-buttons-round"},Ma=["disabled"],Ra=["disabled"];function qa(e,t,o,s,a,i){return e.clipboard?(n.openBlock(),n.createElementBlock("div",_a,[n.createElementVNode("button",{class:"dito-button dito-button-copy",ref:"copyData",type:"button",title:"Copy Data",disabled:!e.copyEnabled,onClick:t[0]||(t[0]=(...r)=>e.onCopy&&e.onCopy(...r))},null,8,Ma),n.createElementVNode("button",{class:"dito-button dito-button-paste",type:"button",title:"Paste Data",disabled:!e.pasteEnabled,onClick:t[1]||(t[1]=(...r)=>e.onPaste&&e.onPaste(...r))},null,8,Ra)])):n.createCommentVNode("",!0)}const Ia=C.component("DitoClipboard",{mixins:[x],props:{clipboard:{type:[Boolean,Object],default:!1},dataPath:{type:String,required:!0},data:{type:[Object,Array],default:null}},data(){return{copyEnabled:!1,pasteEnabled:!1,fixClipboard:!0}},computed:{clipboardOptions(){return c.isObject(this.clipboard)?this.clipboard:{}},copyData(){const{copy:e}=this.clipboardOptions;return e?t=>e.call(this,new V(this,{clipboardData:t})):t=>c.clone(t)},pasteData(){const{paste:e}=this.clipboardOptions;return e?t=>e.call(this,new V(this,{clipboardData:t})):t=>t}},mounted(){this.domOn(document,{copy:this.checkClipboard}),this.domOn(window,{focus:this.checkClipboard}),this.$watch("data",{immediate:!0,handler:(e,t)=>{e!==t&&this.checkClipboard()}})},methods:{async getClipboardData(e){var a,i,r,l,d;let{clipboardData:t}=this.appState;try{const h=await((i=(a=navigator.clipboard)==null?void 0:a.readText)==null?void 0:i.call(a));this.fixClipboard&&h&&(await((l=(r=navigator.clipboard)==null?void 0:r.writeText)==null?void 0:l.call(r,h)),this.fixClipboard=!1),h&&(t=JSON.parse(h))}catch(h){e&&(console.error(h,h.name,h.message),h.name==="SyntaxError"&&alert(c.deindent`
3
3
  The data in the clipboard appears to be malformed:
4
4
  ${h.message}
5
- `))}const{$schema:o,...s}=t||{};return o===((d=this.schemaComponent)==null?void 0:d.schema.name)?s:null},async checkClipboard(){this.copyEnabled=!!this.data,this.pasteEnabled=!!await this.getClipboardData(!1)},async onCopy(){var t,o,s;let e=(t=this.schemaComponent)==null?void 0:t.clipboardData;try{e=e&&this.copyData(e),this.appState.clipboardData=e;try{const a=JSON.stringify(e,null,2);await((s=(o=navigator.clipboard)==null?void 0:o.writeText)==null?void 0:s.call(o,a)),await this.checkClipboard()}catch(a){console.error(a,a.name,a.message)}}catch(a){console.error(a),alert(a.message)}},async onPaste(){let e=await this.getClipboardData(!0);try{e=e&&this.pasteData(e),e&&this.schemaComponent.setData(e)}catch(t){console.error(t),alert(t.message)}}}}),za=b(Ia,[["render",qa]]),Nt={data(){return{isLoading:!1}},methods:{setLoading(e,{updateRoot:t=!1,updateView:o=!1}={}){!this.isLoading^!e&&(this.isLoading=!!e,t&&this.rootComponent.registerLoading(e),o&&this.viewComponent.setLoading(this.isLoading))}}},Ot={mixins:[Ne,Nt],provide(){return{$resourceComponent:()=>this,$verbs:()=>this.verbs,$isPopulated:()=>this.hasData}},data(){return{loadedData:null}},computed:{resourceComponent(){return this},resource(){return this.getResource()},providesData(){return!!this.resource},linksToView(){return!1},isTransient(){const e=this.formComponent;return!this.providesData&&!this.linksToView||e&&(e.isTransient||e.isCreating)},transientNote(){return this.isTransient&&"<b>Note</b>: the parent still needs to be saved in order to persist this change."},shouldLoad(){return!this.isTransient&&!this.isLoading},hasData(){return!!this.loadedData},verbs(){return this.getVerbs()},paginationRange(){const{paginate:e}=this.sourceSchema;if(this.isListSource&&e){const{page:t=0}=this.query||{},o=t*e;return[o,o+e-1]}return null},queryParams(){const e=this.paginationRange,{page:t,...o}=this.query||{};return{...o,...e&&{range:e.join(",")}}}},created(){(this.providesData||this.isCreating)&&this.setupData()},methods:{getResource(){var e,t;return T((e=this.sourceSchema)==null?void 0:e.resource,{type:"collection",parent:((t=this.parentFormComponent)==null?void 0:t.resource)??null})},getVerbs(){const e=this.$verbs();return this.isTransient?{...e,create:"add",created:"added",save:"apply",saved:"applied",delete:"remove",deleted:"removed"}:e},clearData(){this.loadedData=null},setData(e){this.loadedData=e},setupData(){this.ensureData()},ensureData(){this.shouldLoad&&(this.hasData?this.reloadData():this.loadData(!0))},reloadData(){this.loadData(!1)},loadData(e){this.isTransient||(e&&this.clearData(),this.requestData())},createData(e,t){return st(e,t?{type:t}:{},this)},requestData(){const e=this.queryParams;this.handleRequest({method:"get",query:e},(t,o)=>{var s;if(t){if(o){const{data:a}=o;if((a==null?void 0:a.type)==="FilterValidation"&&((s=this.onFilterErrors)!=null&&s.call(this,a.errors)))return!0;if(this.isUnauthorizedError(o))return!0}}else this.setData(o.data),this.emitSchemaEvent("load")})},isValidationError(e){return(e==null?void 0:e.status)===400},isUnauthorizedError(e){return(e==null?void 0:e.status)===401},async handleRequest({method:e,resource:t=this.resource,query:o,data:s},a){const i={updateRoot:!0,updateView:this.isInView};this.setLoading(!0,i);const r={method:e,resource:t,data:s,query:o};try{const l=await this.sendRequest(r);a(null,l)}catch(l){const{response:d}=l;if(!a(l,d)){const h=d==null?void 0:d.data,u=c.isString(h==null?void 0:h.type)?c.labelize(h.type):"Error",p=(h==null?void 0:h.message)??l;this.notify({type:"error",title:u,text:p})}}this.setLoading(!1,i)},getPayloadData(e,t){return["post","put","patch"].includes(t)&&(e.getSchemaValue(["resource","data"])||e.processedItem)},async submit(e){const t=T(e.schema.resource,{parent:this.resource});if(t){const{method:o}=t,s=this.getPayloadData(e,o);return this.submitResource(e,t,o,s)}return!1},async submitResource(e,t,o,s,{setData:a=!1,onSuccess:i,onError:r,notifySuccess:l=()=>this.notify({type:"success",title:"Request Successful",text:"Request was successfully sent."}),notifyError:d=h=>this.notify({type:"error",title:"Request Error",text:[`Unable to send request${h?":":""}`,(h==null?void 0:h.message)||h]})}={}){return new Promise(h=>{this.handleRequest({method:o,resource:t,data:s},async(u,p)=>{const g=p==null?void 0:p.data;if(u){const f=this.isValidationError(p)&&g.errors;if(f)await this.showValidationErrors(f,!0);else{const m=c.isObject(g)?g:u;r==null||r(m),await this.emitButtonEvent(e,"error",{notify:d,error:m})}h(!1)}else a&&g&&this.setData(g),i==null||i(),await this.emitButtonEvent(e,"success",{notify:l}),h(!0)})})},async emitButtonEvent(e,t,{notify:o,error:s}){const a=new V(e,{nested:!1,data:this.data,itemLabel:this.itemLabel,error:s}),i=await e.emitEvent(t,{context:a});return o&&i===void 0&&!a.wasNotified&&o(s),i}}};function Aa(e){return new URL(`file:${e}`).pathname}const Ua=["data-resource"],Ha={type:"submit",disabled:""};function Wa(e,t,o,s,a,i){const r=n.resolveComponent("RouterView"),l=n.resolveComponent("DitoButtons"),d=n.resolveComponent("DitoSchema");return n.openBlock(),n.createElementBlock("div",{class:n.normalizeClass(["dito-form dito-scroll-parent",{"dito-form-nested":e.isNestedRoute}]),"data-resource":e.sourceSchema.path},[e.isLastUnnestedRoute||e.isNestedRoute?n.createCommentVNode("",!0):n.withDirectives((n.openBlock(),n.createBlock(r,{key:0},null,512)),[[n.vShow,!e.isActive]]),n.withDirectives((n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.isNestedRoute?"div":"form"),{class:"dito-scroll",onSubmit:t[0]||(t[0]=n.withModifiers(()=>{},["prevent"]))},{default:n.withCtx(()=>[n.createVNode(d,{schema:e.schema,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,disabled:e.isLoading,menuHeader:!0},{buttons:n.withCtx(()=>[n.createVNode(l,{class:"dito-buttons-round dito-buttons-main dito-buttons-large",buttons:e.buttonSchemas,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,disabled:e.isLoading},null,8,["buttons","dataPath","data","meta","store","disabled"])]),_:1},8,["schema","dataPath","data","meta","store","disabled"]),n.withDirectives(n.createElementVNode("button",Ha,null,512),[[n.vShow,!1]])]),_:1},544)),[[n.vShow,e.isActive]])],10,Ua)}const Ka=C.component("DitoForm",{mixins:[ft,Ot],data(){return{createdData:null,clonedData:void 0,sourceKey:null,isForm:!0}},computed:{verbs(){const e=this.getVerbs(),{isCreating:t,providesData:o}=this;return{...e,submit:t?e.create:e.save,submitted:t?e.created:e.saved,cancel:o?e.cancel:e.close,cancelled:o?e.cancelled:e.closed}},schema(){return this.getItemFormSchema(this.sourceSchema,this.data||{type:this.type},this.context)||{}},buttonSchemas(){return G(c.merge({cancel:{type:"button",events:{click:()=>this.cancel()}},submit:!this.isMutating&&{type:"submit",closeForm:!0,events:{click:({component:e})=>e.submit()}}},this.schema.buttons))},isActive(){return this.isLastRoute||this.isLastUnnestedRoute},isTransient(){return!this.providesData},isCreating(){return this.param==="create"},isDirty(){var e;return!this.isMutating&&!!((e=this.mainSchemaComponent)!=null&&e.isDirty)},isMutating(){return!!this.sourceSchema.mutate},selectedTab(){var e;return((e=this.mainSchemaComponent)==null?void 0:e.selectedTab)||null},type(){return this.$route.query.type},itemId(){return this.isCreating?null:this.param??null},method(){return this.isCreating?"post":"patch"},resource(){const e=this.getResource();return Ce(this.itemId,e)||e},breadcrumbPrefix(){return c.capitalize(this.isCreating?this.verbs.create:this.verbs.edit)},data(){return this.createdData||this.loadedData||this.inheritedData||null},dataPath(){return this.getDataPathFrom(this.dataComponent)},sourceData(){let e=this.routeRecord?this.parentRouteComponent.data:null;if(e){const t=c.parseDataPath(this.getDataPathFrom(this.parentRouteComponent)),o=this.routeRecord.path.split("/"),s=o.slice(o.length-t.length);this.sourceKey=null;const a=t[t.length-1];X(this.sourceSchema)&&a==="create"&&t.length--;for(let i=0,r=t.length;i<r&&e;i++){const l=t[i],d=/^:id/.test(s[i])?l==="create"?null:this.findItemIdIndex(this.sourceSchema,e,l):l;i===r-1?this.sourceKey=d:e=e[d]}}return e},inheritedData(){if(this.isTransient&&this.clonedData===void 0&&this.sourceData&&this.sourceKey!==null){let e=this.sourceData[this.sourceKey];return this.isMutating||(this.clonedData=e=c.clone(e)),e===null&&!this.isCreating&&X(this.sourceSchema)&&this.$router.push({path:`${this.path}/create`}),e}return this.clonedData},hasData(){return!!this.data},itemLabel(){return this.getItemLabel(this.sourceSchema,this.data,{extended:!0})}},watch:{sourceData:"clearClonedData",create:"setupData"},methods:{emitSchemaEvent(e,t){return this.mainSchemaComponent.emitEvent(e,t)},getDataPathFrom(e){return this.api.denormalizePath(this.path.slice((e.isView?0:e.path.length)+1))},setupData(){this.isCreating?this.createdData||(this.createdData=this.createData(this.schema,this.type)):this.ensureData()},setSourceData(e){if(this.sourceData&&this.sourceKey!==null){const{mainSchemaComponent:t}=this;return this.sourceData[this.sourceKey]=t.filterData(e),t.onChange(),!0}return!1},addSourceData(e){var t;return X(this.sourceSchema)?this.setSourceData(e):!!((t=this.sourceData)!=null&&t.push(e))},clearData(){this.setData(null)},setData(e){this.isTransient?this.setSourceData(e):(this.createdData=null,this.loadedData=e)},clearClonedData(e,t){e!==t&&(this.clonedData=void 0)},async cancel(){return this.close()},async close(){return this.navigate(this.parentRouteComponent.path)},getSubmitVerb(e=!0){return this.isCreating?e?"create":"created":e?"submit":"submitted"},async submit(e,{validate:t=!0,closeForm:o=!1}={}){if(t&&!this.validateAll())return!1;const s=h=>this.verbs[this.getSubmitVerb(h)],a=T(e.schema.resource,{parent:this.resource}),i=a||this.resource,r=(i==null?void 0:i.method)||this.method,l=this.getPayloadData(e,r);let d;if(!a&&this.isTransient?d=await this.submitTransient(e,i,r,l,{onSuccess:()=>this.emitSchemaEvent(this.getSubmitVerb()),onError:h=>this.emitSchemaEvent("error",{context:{error:h}}),notifySuccess:()=>{const h=s(!1);this.notify({type:"info",title:this.isCreating?`Item ${c.capitalize(h)}`:`Change ${c.capitalize(h)}`,text:[this.isCreating?`${this.itemLabel} was ${h}.`:`Changes to ${this.itemLabel} were ${h}.`,this.transientNote]})},notifyError:()=>{const h=s(!0);this.notify({type:"error",title:"Request Error",text:`Unable to ${h} ${this.itemLabel}.`})}}):d=await this.submitResource(e,i,r,l,{setData:!0,onSuccess:()=>this.emitSchemaEvent(this.getSubmitVerb()),onError:h=>this.emitSchemaEvent("error",{context:{error:h}}),notifySuccess:()=>{const h=s(!1);this.notify({type:"success",title:`Successfully ${c.capitalize(h)}`,text:`${this.itemLabel} was ${h}.`})},notifyError:h=>{const u=s(!0);this.notify({type:"error",title:"Request Error",text:[`Unable to ${u} ${this.itemLabel}${h?":":""}`,(h==null?void 0:h.message)||h]})}}),d){if(this.resetValidation(),o||e.closeForm)this.close();else if(this.isCreating){const h=this.getItemId(this.schema,this.data);this.$router.replace({path:Aa(`${this.path}/../${h}`)})}}return d},async submitTransient(e,t,o,s,{onSuccess:a,onError:i,notifySuccess:r,notifyError:l}){const d=this.isCreating?this.addSourceData(s):this.setSourceData(s);if(d)a==null||a(),await this.emitButtonEvent(e,"success",{notify:r});else{const h="Could not submit transient item";i==null||i(h),await this.emitButtonEvent(e,"error",{notify:l,error:h})}return d}}}),Ft=b(Ka,[["render",Wa]]),Oc="",Ya=C.component("DitoFormNested",{extends:Ft}),Ja={key:0,class:"dito-errors"};function Qa(e,t,o,s,a,i){return e.errors?(n.openBlock(),n.createElementBlock("div",Ja,[n.createElementVNode("ul",null,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.errors,r=>(n.openBlock(),n.createElementBlock("li",null,n.toDisplayString(r),1))),256))])])):n.createCommentVNode("",!0)}const Fc="",Ga=C.component("DitoErrors",{props:{errors:{type:Array,default:null}}}),Xa=b(Ga,[["render",Qa]]),Za={class:"dito-scopes"},va=["title","onClick"];function xa(e,t,o,s,a,i){const r=n.resolveComponent("RouterLink");return n.openBlock(),n.createElementBlock("div",Za,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.scopes,(l,d)=>(n.openBlock(),n.createBlock(r,{key:d,to:e.getScopeLink(l),custom:""},{default:n.withCtx(({navigate:h})=>[n.createElementVNode("button",{class:n.normalizeClass(["dito-button",{"dito-selected":l.name===e.query.scope}]),type:"button",title:l.hint||e.getLabel(l),onClick:h},n.toDisplayString(e.getLabel(l)),11,va)]),_:2},1032,["to"]))),128))])}const Lc="",er=C.component("DitoScopes",{props:{query:{type:Object,required:!0},scopes:{type:Object,required:!0}},methods:{getScopeLink(e){const t={...this.query,scope:e.name};return t.page&&(t.page=0),this.getQueryLink(t)}}}),tr=b(er,[["render",xa]]);function nr(e,t,o,s,a,i){const r=n.resolveComponent("Pagination");return n.openBlock(),n.createBlock(r,{page:e.page,"onUpdate:page":t[0]||(t[0]=l=>e.page=l),pageSize:e.limit,total:e.total},null,8,["page","pageSize","total"])}const or=C.component("DitoPagination",{components:{Pagination:ts},props:{query:{type:Object,required:!0},limit:{type:Number,required:!0},total:{type:Number,required:!0}},computed:{page:{get(){return(+this.query.page||0)+1},set(e){this.page!==e&&this.$router.push(this.getQueryLink({...this.query,page:e-1}))}}}}),sr=b(or,[["render",nr]]),Oe={mixins:[Ne],data(){return{dragging:!1}},methods:{getSortableOptions(e=!1){return{animation:150,handle:".dito-button-drag",dragClass:"dito-sortable-active",chosenClass:"dito-sortable-chosen",ghostClass:"dito-sortable-ghost",fallbackClass:"dito-sortable-fallback",forceFallback:e,onStart:this.onStartDrag,onEnd:this.onEndDrag}},onStartDrag(){this.dragging=!0},onEndDrag({oldIndex:e,newIndex:t}){this.dragging=!1,e!==t&&this.onChange()},updateOrder(e,t,o){const{orderKey:s}=e;if(s){const a=(o==null?void 0:o[0])||0;for(let i=0;i<t.length;i++)t[i][s]=i+a}return t}}},ar=["id"],rr={key:0,class:"dito-tree-header"},ir=["innerHTML"],lr={key:1,class:"dito-tree-info"},dr={key:1,class:"dito-tree-leaf"},cr=["innerHTML"],hr={key:2,class:"dito-buttons dito-buttons-small"},ur={key:1,class:"dito-properties"};function pr(e,t,o,s,a,i){const r=n.resolveComponent("DitoLabel"),l=n.resolveComponent("DitoTableCell"),d=n.resolveComponent("DitoTreeItem",!0),h=n.resolveComponent("DitoDraggable");return n.openBlock(),n.createElementBlock("div",{class:n.normalizeClass(["dito-tree-item",{"dito-dragging":e.dragging,"dito-active":e.active}]),id:e.dataPath,style:n.normalizeStyle(e.level>0&&{"--level":e.level})},[e.label?(n.openBlock(),n.createElementBlock("div",rr,[e.numEntries?(n.openBlock(),n.createElementBlock("div",{key:0,class:"dito-tree-branch",onClick:t[0]||(t[0]=n.withModifiers(u=>e.opened=!e.opened,["stop"]))},[e.numEntries?(n.openBlock(),n.createElementBlock("div",{key:0,class:n.normalizeClass(["dito-chevron",{"dito-opened":e.opened}])},null,2)):n.createCommentVNode("",!0),n.createElementVNode("div",{class:"dito-tree-label",innerHTML:e.label},null,8,ir),e.details?(n.openBlock(),n.createElementBlock("div",lr,n.toDisplayString(e.details),1)):n.createCommentVNode("",!0)])):(n.openBlock(),n.createElementBlock("div",dr,[n.createElementVNode("div",{class:"dito-tree-label",innerHTML:e.label},null,8,cr)])),e.hasEditButtons?(n.openBlock(),n.createElementBlock("div",hr,[e.draggable?(n.openBlock(),n.createElementBlock("a",n.mergeProps({key:0,class:"dito-button"},e.getButtonAttributes(e.verbs.drag)),null,16)):n.createCommentVNode("",!0),e.editable?(n.openBlock(),n.createElementBlock("button",n.mergeProps({key:1,class:"dito-button",type:"button"},e.getButtonAttributes(e.verbs.edit),{onClick:t[1]||(t[1]=(...u)=>e.onEdit&&e.onEdit(...u))}),null,16)):n.createCommentVNode("",!0),e.deletable?(n.openBlock(),n.createElementBlock("button",n.mergeProps({key:2,class:"dito-button",type:"button"},e.getButtonAttributes(e.verbs.delete),{onClick:t[2]||(t[2]=(...u)=>e.onDelete&&e.onDelete(...u))}),null,16)):n.createCommentVNode("",!0)])):n.createCommentVNode("",!0)])):n.createCommentVNode("",!0),e.properties?n.withDirectives((n.openBlock(),n.createElementBlock("table",ur,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.properties,u=>(n.openBlock(),n.createElementBlock("tr",null,[n.createElementVNode("td",null,[u.label!==!1?(n.openBlock(),n.createBlock(r,{key:0,dataPath:e.getPropertyDataPath(u),label:e.getLabel(u)},null,8,["dataPath","label"])):n.createCommentVNode("",!0)]),n.createVNode(l,{cell:u,schema:u,dataPath:e.getPropertyDataPath(u),data:e.data,meta:e.nestedMeta,store:e.store,disabled:e.disabled},null,8,["cell","schema","dataPath","data","meta","store","disabled"])]))),256))],512)),[[n.vShow,e.opened]]):n.createCommentVNode("",!0),e.childrenSchema?n.withDirectives((n.openBlock(),n.createBlock(h,{key:2,modelValue:e.updateOrder(e.childrenSchema,e.childrenList),options:e.getSortableOptions(!0),draggable:e.childrenDraggable,"onUpdate:modelValue":t[3]||(t[3]=u=>e.childrenList=u)},{default:n.withCtx(()=>[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.childrenItems,(u,p)=>(n.openBlock(),n.createBlock(d,{key:e.getItemUid(e.childrenSchema,u.data),schema:e.childrenSchema,dataPath:e.getItemDataPath(e.childrenSchema,p),data:u.data,path:u.path,open:u.open,active:u.active,draggable:e.childrenDraggable,label:e.getItemLabel(e.childrenSchema,u.data,{index:p}),level:e.level+1},null,8,["schema","dataPath","data","path","open","active","draggable","label","level"]))),128))]),_:1},8,["modelValue","options","draggable"])),[[n.vShow,e.opened]]):n.createCommentVNode("",!0)],14,ar)}const Tc="",mr=C.component("DitoTreeItem",{mixins:[Oe],inject:["container"],props:{schema:{type:Object,required:!0},dataPath:{type:String,required:!0},data:{type:[Array,Object],default:null},path:{type:String,default:""},open:{type:Boolean,default:!1},active:{type:Boolean,default:!1},draggable:{type:Boolean,default:!1},label:{type:String,default:null},level:{type:Number,default:0}},data(){return{opened:this.open||this.schema.open}},computed:{meta(){return this.container.meta},store(){return this.container.store},disabled(){return this.container.disabled},nestedMeta(){return{...this.meta,schema:this.schema}},properties(){return W(this.schema.properties)},childrenSchema(){return this.schema.children},childrenList(){var t;const e=(t=this.childrenSchema)==null?void 0:t.name;return e&&this.data[e]},childrenDraggable(){var e;return((e=this.childrenList)==null?void 0:e.length)>1&&this.getSchemaValue("draggable",{type:Boolean,default:!1,schema:this.childrenSchema})},numChildren(){var e;return((e=this.childrenList)==null?void 0:e.length)||0},numProperties(){var e;return((e=this.properties)==null?void 0:e.length)||0},numEntries(){return this.numProperties+this.numChildren},childrenItems(){const{childrenSchema:e,childrenList:t}=this;if(e&&t){const{editPath:o}=this.container,s=!this.path&&e.open;return this.updateOrder(e,t.map((a,i)=>{const r=e.path&&`${this.path}/${e.path}/${i}`,l=s||o.startsWith(r)&&r.length<o.length;return{data:a,path:r,open:l,active:o===r}}))}return[]},details(){const{numChildren:e}=this;return e&&`${e} ${e===1?"item":"items"}`},hasEditButtons(){return this.draggable||this.editable||this.deletable},creatable:y("creatable",{type:Boolean,default:!1,get(e){return e&&I(this.schema)}}),editable:y("editable",{type:Boolean,default:!1,get(e){return e&&I(this.schema)}}),deletable:y("deletable",{type:Boolean,default:!1})},methods:{getPropertyDataPath(e){return F(this.dataPath,e.name)},onEdit(){this.$router.push({path:`${this.container.path}${this.path}`,query:this.$route.query})},onDelete(){},onChange(){this.container.onChange()}}}),fr=b(mr,[["render",pr]]),gr={class:"dito-table-head"},br=["onClick"],yr=n.createElementVNode("div",{class:"dito-order-arrows"},null,-1),kr={key:1},Cr={key:0},$r=[n.createElementVNode("span",null,null,-1)];function Br(e,t,o,s,a,i){const r=n.resolveComponent("RouterLink");return n.openBlock(),n.createElementBlock("thead",gr,[n.createElementVNode("tr",null,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.columns,l=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[e.shouldRender(l)?(n.openBlock(),n.createElementBlock("th",{key:0,class:n.normalizeClass(e.getColumnClass(l))},[l.sortable?(n.openBlock(),n.createBlock(r,{key:0,to:e.getSortLink(l),custom:""},{default:n.withCtx(({navigate:d})=>[n.createElementVNode("button",{class:n.normalizeClass(["dito-button",e.getSortClass(l)]),type:"button",onClick:d},[yr,n.createElementVNode("span",null,n.toDisplayString(e.getLabel(l)),1)],10,br)]),_:2},1032,["to"])):(n.openBlock(),n.createElementBlock("span",kr,n.toDisplayString(e.getLabel(l)),1))],2)):n.createCommentVNode("",!0)],64))),256)),e.hasEditButtons?(n.openBlock(),n.createElementBlock("th",Cr,$r)):n.createCommentVNode("",!0)])])}const _c="",Dr=C.component("DitoTableHead",{props:{query:{type:Object,required:!0},columns:{type:Object,required:!0},hasEditButtons:{type:Boolean,required:!0}},computed:{sort(){const e=(this.query.order||"").split(/\s+/);return{name:e[0],order:e[1]}}},methods:{getColumnClass(e){return`dito-column-${c.hyphenate(e.name)}`},getSortClass(e){return this.sort.name===e.name?`dito-selected dito-order-${this.sort.order}`:null},getSortLink(e){const t=this.sort.name===e.name&&this.sort.order==="asc"?"desc":"asc";return this.getQueryLink({...this.query,order:`${e.name} ${t}`})}}}),wr=b(Dr,[["render",Br]]),Vr=["innerHTML"];function Sr(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("td",{class:n.normalizeClass(e.cell.class),style:n.normalizeStyle(e.cell.style)},[e.cell.component?(n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.cell.component),{key:0,schema:e.schema,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,nested:e.nested,disabled:e.disabled},null,8,["schema","dataPath","data","meta","store","nested","disabled"])):(n.openBlock(),n.createElementBlock("span",{key:1,innerHTML:e.renderCell(e.data)},null,8,Vr))],6)}const Pr=C.component("DitoTableCell",{props:{cell:{type:Object,required:!0},schema:{type:Object,required:!0},dataPath:{type:String,required:!0},data:{type:Object,required:!0},meta:{type:Object,required:!0},store:{type:Object,required:!0},nested:{type:Boolean,default:!0},disabled:{type:Boolean,default:!1}},methods:{renderCell(e){const{name:t,render:o}=this.cell,s=e[t];return o?o.call(this,new V(this,{name:t,value:s,data:e,dataPath:F(this.dataPath,t)})):c.escapeHtml(s)}}}),Er=b(Pr,[["render",Sr]]);var Nr=Object.defineProperty,he=Object.getOwnPropertySymbols,Lt=Object.prototype.hasOwnProperty,Tt=Object.prototype.propertyIsEnumerable,jt=(e,t,o)=>t in e?Nr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:o}):e[t]=o,_t=(e,t)=>{for(var o in t||(t={}))Lt.call(t,o)&&jt(e,o,t[o]);if(he)for(var o of he(t))Tt.call(t,o)&&jt(e,o,t[o]);return e},Or=(e,t)=>{var o={};for(var s in e)Lt.call(e,s)&&t.indexOf(s)<0&&(o[s]=e[s]);if(e!=null&&he)for(var s of he(e))t.indexOf(s)<0&&Tt.call(e,s)&&(o[s]=e[s]);return o};function Fr(e,t,o={}){let s;const a=o,{document:i=q.defaultDocument}=a,r=Or(a,["document"]),l={onUpdate:u=>{Lr(t,u.oldIndex,u.newIndex)}},d=()=>{const u=typeof e=="string"?i==null?void 0:i.querySelector(e):q.unrefElement(e);u&&(s=new Kt(u,_t(_t({},l),r)))},h=()=>s==null?void 0:s.destroy();return q.tryOnMounted(d),q.tryOnScopeDispose(h),{stop:h,start:d}}function Lr(e,t,o){const s=q.toValue(e);if(o>=0&&o<s.length){const a=s.splice(t,1)[0];L.nextTick(()=>s.splice(o,0,a))}}const Tr=L.defineComponent({name:"UseSortable",model:{prop:"modelValue",event:"update:modelValue"},props:{modelValue:{type:Array,required:!0},tag:{type:String,default:"div"},options:{type:Object,required:!0}},setup(e,{slots:t}){const o=q.useVModel(e,"modelValue"),s=L.ref(),a=L.reactive(Fr(s,o,e.options));return()=>{if(t.default)return L.h(e.tag,{ref:s},t.default(a))}}});function jr(e,t,o,s,a,i){const r=n.resolveComponent("UseSortable");return e.draggable?(n.openBlock(),n.createBlock(r,{key:0,tag:e.tag,modelValue:e.modelValue,options:e.options,"onUpdate:modelValue":t[0]||(t[0]=l=>e.$emit("update:modelValue",l))},{default:n.withCtx(()=>[n.renderSlot(e.$slots,"default")]),_:3},8,["tag","modelValue","options"])):(n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.tag),{key:1},{default:n.withCtx(()=>[n.renderSlot(e.$slots,"default")]),_:3}))}const _r=C.component("DitoDraggable",{components:{UseSortable:Tr},emits:["update:modelValue"],props:{modelValue:{type:Array,required:!0},tag:{type:String,default:"div"},options:{type:Object,required:!0},draggable:{type:Boolean,default:!0}}}),Mr=b(_r,[["render",jr]]);function Mt({vnode:e}){return e}Mt.props={vnode:{type:Object,required:!0}};const Rr=C.component("DitoVnode",Mt),qr=Object.freeze(Object.defineProperty({__proto__:null,DitoAccount:Rs,DitoButtons:wa,DitoClipboard:za,DitoContainer:ia,DitoCreateButton:ja,DitoDialog:wt,DitoDraggable:Mr,DitoEditButtons:Pa,DitoElement:zs,DitoErrors:Xa,DitoForm:Ft,DitoFormNested:Ya,DitoHeader:Ls,DitoLabel:Ws,DitoMenu:Vs,DitoPagination:sr,DitoPane:oa,DitoPanel:ma,DitoPanels:ya,DitoRoot:Ee,DitoSchema:Qs,DitoSchemaInlined:Zs,DitoScopes:tr,DitoTableCell:Er,DitoTableHead:wr,DitoTabs:ha,DitoTreeItem:fr,DitoVNode:Rr,DitoView:gt},Symbol.toStringTag,{value:"Module"})),D={extends:C,mixins:[J],nativeField:!1,textField:!1,defaultValue:null,defaultNested:!0,defaultVisible:!0,generateLabel:!0,excludeValue:!1,ignoreMissingValue:null,alignBottom:!0,omitPadding:!1,component:C.component,get:ne,register(e,t={}){e=c.asArray(e);const o=this.component(`DitoType${c.camelize(e[0],!0)}`,t);for(const s of e)_n(s,o);return o}},Ir=["id","type","title"];function zr(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("button",n.mergeProps({class:["dito-button",e.buttonClass],id:e.dataPath,ref:"element",type:e.type,title:e.title},e.attributes),n.toDisplayString(e.text),17,Ir)}const Ar=D.register(["button","submit"],{defaultValue:()=>{},excludeValue:!0,generateLabel:!1,defaultWidth:"auto",computed:{verb(){return this.verbs[this.name]},buttonClass(){return this.verb?`dito-button-${this.verb}`:null},text:y("text",{type:String}),title(){return this.text||c.labelize(this.verb)},closeForm:y("closeForm",{type:Boolean,default:!1})},methods:{getEvents(){const{onFocus:e,onBlur:t,onClick:o}=this;return{onFocus:e,onBlur:t,onClick:o}},async submit(e){var t;return(t=this.resourceComponent)==null?void 0:t.submit(this,e)},async onClick(){await this.emitEvent("click",{parent:this.schemaComponent})===void 0&&Ie(this.schema)&&await this.submit()}}}),Ur=b(Ar,[["render",zr]]),Hr=["id"];function Wr(e,t,o,s,a,i){return n.withDirectives((n.openBlock(),n.createElementBlock("input",n.mergeProps({class:"dito-checkbox",id:e.dataPath,ref:"element","onUpdate:modelValue":t[0]||(t[0]=r=>e.value=r),type:"checkbox"},e.attributes),null,16,Hr)),[[n.vModelCheckbox,e.value]])}const Mc="",Kr=D.register("checkbox",{nativeField:!0}),Yr=b(Kr,[["render",Wr]]),Rt={mixins:[Nt],data(){return{isLoading:!1,asyncDataEntries:{}}},methods:{handleDataSchema(e,t,{resolveCounter:o=1,...s}={}){var l,d;c.isObject(e)||(e={data:e});let{data:a=void 0,dataPath:i=null}=e;const r=(l=this.asyncDataEntries)[t]||(l[t]=n.reactive({dependencyFunction:null,resolveCounter:0,resolvedData:null,resolving:!1}));if((d=r.dependencyFunction)==null||d.call(r,this.context),r.resolveCounter>0){const{resolvedData:h}=r;return--r.resolveCounter===0&&(r.resolvedData=null),h}if(r.resolving)a=null;else if(a){if(c.isFunction(a)){const h=a(this.context);c.isFunction(h)?(r.dependencyFunction=a,a=h(this.context)):a=h}c.isPromise(a)&&(r.resolving=!0,this.resolveData(a,s).then(h=>{r.resolveCounter=o,r.resolvedData=h,r.resolving=!1}),a=null)}else i&&(a=c.getValueAtDataPath(this.rootData,c.normalizeDataPath(`${this.dataPath}/${i}`)));return a},async resolveData(e,t={}){const o=setTimeout(()=>this.setLoading(!0,t),0);let s=null;try{s=await(c.isFunction(e)?e():e)}catch(a){this.addError(a.message||a)}return clearTimeout(o),this.setLoading(!1,t),s}}},ue={mixins:[Rt],data(){return{hasOptions:!1}},computed:{selectedValue:{get(){const e=o=>this.relate?this.hasOption(o)?this.getValueForOption(o):null:o,t=c.isArray(this.value)?this.value.map(e).filter(o=>o!==null):e(this.value);return this.relate&&this.hasOptions&&(t===null&&this.value!==null||Dn(this.value))&&(this.selectedValue=t),t},set(e){const t=o=>this.relate?this.getOptionForValue(o):o;this.value=c.isArray(e)?e.map(t):t(e)}},selectedOption(){return this.getOptionForValue(this.selectedValue)},options(){const e=this.handleDataSchema(this.schema.options,"options",{resolveCounter:1})??[];if(!c.isArray(e))throw new Error(`Invalid options data, should be array: ${e}`);return this.hasOptions=e.length>0,this.processOptions(e)},activeOptions(){return this.options},relate:y("relate",{type:Boolean,default:!1,callback:!1}),groupBy:y("groupBy",{type:String,default:null}),optionLabel:y("options.label",{type:[String,Function],default:null,get(e){return e||this.getOptionKey("label")||null}}),optionValue:y("options.value",{type:[String,Function],default:null,get(e){return e||this.relate&&"id"||this.getOptionKey("value")||null}}),searchFilter:y("search",{type:[Object,Function],default:null,get(e){if(e){const{filter:t,debounce:o}=c.isFunction(e)?{filter:e}:e;return o?c.debounceAsync(t,o):t}}}),groupByLabel(){return this.groupBy?"label":null},groupByOptions(){return this.groupBy?"options":null}},methods:{getOptionKey(e){const[t]=this.activeOptions;return c.isObject(t)&&e in t?e:null},processOptions(e){if(e.length){if(this.relate)for(const t of e)"id"in t||Bn(t,"id");if(this.groupBy){const t={};e=e.reduce((o,s)=>{const a=s[this.groupBy];let i=t[a];return i||(i=t[a]={[this.groupByLabel]:a,[this.groupByOptions]:[]},o.push(i)),i.options.push(s),o},[])}}return e},hasOption(e){return!!this.getOptionForValue(this.getValueForOption(e))},getOptionForValue(e){const t=(o,s,a)=>{for(const i of o)if(a){const r=t(i.options,s,null);if(r)return r}else if(s===this.getValueForOption(i))return i};return this.optionValue?t(this.activeOptions,e,this.groupBy):e},getValueForOption(e){const{optionValue:t}=this;return c.isString(t)?e==null?void 0:e[t]:c.isFunction(t)?t.call(this,new V(this,{option:e})):e},getLabelForOption(e){const{optionLabel:t}=this;return c.isString(t)?e==null?void 0:e[t]:c.isFunction(t)?t.call(this,new V(this,{option:e})):c.labelize(`${e}`)}},processValue(e,t,o,s){var a;if(e.relate){const i=(a=e.options)==null?void 0:a.dataPath,r=i?c.normalizeDataPath(`${o}/${i}`):null;s.addRelation(o,r,e),r&&s.setSourceRelated(r);const l=d=>d&&{id:d.id};t=c.isArray(t)?t.map(l):l(t)}return t}},Jr=["id"],Qr=["value"];function Gr(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("ul",{class:n.normalizeClass(["dito-checkboxes",`dito-layout-${e.schema.layout||"vertical"}`]),id:e.dataPath},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.options,r=>(n.openBlock(),n.createElementBlock("li",null,[n.createElementVNode("label",null,[n.withDirectives(n.createElementVNode("input",n.mergeProps({class:"dito-checkbox",ref_for:!0,ref:"element","onUpdate:modelValue":t[0]||(t[0]=l=>e.selectedOptions=l),type:"checkbox",value:e.getValueForOption(r)},e.attributes),null,16,Qr),[[n.vModelCheckbox,e.selectedOptions]]),n.createTextVNode(n.toDisplayString(e.getLabelForOption(r)),1)])]))),256))],10,Jr)}const Rc="",Xr=D.register("checkboxes",{mixins:[ue],nativeField:!0,defaultValue:[],computed:{selectedOptions:{get(){return(this.selectedValue||[]).filter(e=>e)},set(e){this.selectedValue=e||[]}}}}),Zr=b(Xr,[["render",Gr]]),vr=["id"];function xr(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("div",{class:"dito-code",id:e.dataPath,ref:"code",style:n.normalizeStyle(e.style)},null,12,vr)}const qc="",ei=D.register("code",{mixins:[x],alignBottom:!1,computed:{lines(){return this.schema.lines||3},style(){return`height: calc(${this.lines}em * var(--line-height))`}},mounted(){const e=new Yt(this.$refs.code,{language:this.schema.language||"javascript",tabSize:this.schema.indentSize||2,lineNumbers:!1});let t=!1,o=!1,s=!1;const a=()=>{!this.focused&&t&&(t=!1,this.onChange())},i=()=>this.onFocus(),r=()=>{this.onBlur(),a()};this.domOn(this.$refs.code.querySelector("textarea"),{focus:i,blur:r});const l=h=>{h!==e.code&&(s=!0,e.updateCode(h))},d=h=>{h!==this.value&&(o=!0,this.value=h,t=!0,a())};e.onUpdate(h=>{s?s=!1:d(h)}),this.$watch("value",h=>{o?o=!1:l(h||"")}),l(this.value||"")},methods:{focusElement(){var e;(e=this.$el.querySelector("textarea"))==null||e.focus()}}}),ti=b(ei,[["render",xr]]),ni=["id"],oi={key:0,class:"dito-color-preview dito-inherit-focus"},si=["disabled"];function ai(e,t,o,s,a,i){const r=n.resolveComponent("SketchPicker"),l=n.resolveComponent("Trigger");return n.openBlock(),n.createBlock(l,{class:"dito-color",show:e.showPopup,"onUpdate:show":t[3]||(t[3]=d=>e.showPopup=d),trigger:"click"},{trigger:n.withCtx(()=>[n.createElementVNode("div",{class:n.normalizeClass(["dito-input",{"dito-focus":e.showPopup}])},[n.withDirectives(n.createElementVNode("input",n.mergeProps({id:e.dataPath,ref:"element","onUpdate:modelValue":t[0]||(t[0]=d=>e.hexValue=d),type:"input",size:"8"},e.attributes),null,16,ni),[[n.vModelText,e.hexValue]]),e.value?(n.openBlock(),n.createElementBlock("div",oi,[n.createElementVNode("div",{style:n.normalizeStyle({background:`#${e.hexValue||"00000000"}`})},null,4)])):n.createCommentVNode("",!0),e.showClearButton?(n.openBlock(),n.createElementBlock("button",{key:1,class:"dito-button-clear dito-button-overlay",disabled:e.disabled,onClick:t[1]||(t[1]=n.withModifiers((...d)=>e.clear&&e.clear(...d),["stop"]))},null,8,si)):n.createCommentVNode("",!0)],2)]),popup:n.withCtx(()=>[n.createVNode(r,{class:"dito-color-picker",modelValue:e.colorValue,"onUpdate:modelValue":t[2]||(t[2]=d=>e.colorValue=d),disableAlpha:!e.alpha,disableFields:!e.inputs,presetColors:e.presets},null,8,["modelValue","disableAlpha","disableFields","presetColors"])]),_:1},8,["show"])}const Ic="",ri=D.register("color",{components:{Trigger:Pe,SketchPicker:Jt.Sketch},data(){return{showPopup:!1,convertedHexValue:null}},computed:{colorValue:{get(){return this.value||{}},set(e){const t=this.colorFormat,o={hex:(e==null?void 0:e.a)<1?"hex8":"hex",rgb:"rgba"}[t]||t;o?this.value=e[o]:this.value=pe(e).toString(t),this.onChange()}},hexValue:{get(){if(this.value==null)this.convertedHexValue=null;else if(!this.focused){const e=pe(this.value);e.isValid()&&(this.convertedHexValue=e.toString(e.getAlpha()<1?"hex8":"hex6").slice(1).toUpperCase())}return this.convertedHexValue},set(e){this.convertedHexValue=e}},colorFormat:y("format",{type:String,default:"hex"}),alpha:y("alpha",{type:Boolean,default:!1}),inputs:y("inputs",{type:Boolean,default:!0}),presets:y("presets",{type:Array,default:["#ffffff","#c3c3c3","#7f7f7f","#000000","#880015","#ed1c24","#ff7f27","#fff200","#22b14c","#00a2e8","#3f48cc","#a349a4","#b97a57","#ffaec9","#ffc90e","#00000000"]})},watch:{focused(e){if(!e&&this.convertedHexValue){const t=pe(`#${this.convertedHexValue}`);t!=null&&t.isValid()&&(this.value=t.toString(this.colorFormat),this.onChange())}}}}),ii=b(ri,[["render",ai]]);function li(e,t,o,s,a,i){return n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.schema.component),n.normalizeProps(n.guardReactiveProps(e.$props)),null,16)}const di=D.register("component",{defaultValue:()=>{},alignBottom:!1,ignoreMissingValue:e=>!("default"in e),async processSchema(e,t){await re(t)}}),ci=b(di,[["render",li]]),hi=["id","name","value","disabled"];function ui(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("input",{class:"dito-text dito-input",id:e.dataPath,ref:"element",name:e.name,type:"text",value:e.value,disabled:e.disabled,readonly:!0},null,8,hi)}const pi=D.register(["computed","data","hidden"],{mixins:[Rt],defaultValue:()=>{},defaultVisible:!1,computed:{value:{get(){const{schema:e}=this;if(e.data||e.dataPath){const t=this.handleDataSchema(e,"schema",{resolveCounter:2});this.data[this.name]=t}return J.computed.value.get.call(this)},set(e){J.computed.value.set.call(this,e)}}}}),mi=b(pi,[["render",ui]]),fi={class:"dito-date"};function gi(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("div",fi,[(n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.getComponent(e.type)),n.mergeProps({id:e.dataPath,ref:"element",modelValue:e.dateValue,"onUpdate:modelValue":t[0]||(t[0]=r=>e.dateValue=r),locale:e.locale,dateFormat:{...e.api.formats.date,...e.dateFormat}},e.attributes),null,16,["id","modelValue","locale","dateFormat"]))])}const bi=D.register(["date","datetime","time"],{components:{DatePicker:kt,TimePicker:$t,DateTimePicker:Yo},nativeField:!0,textField:!0,computed:{dateValue:{get(){const{value:e}=this;return e&&new Date(e)},set(e){this.value=e}},dateFormat:y("dateFormat",{type:Object,default:null})},methods:{getComponent(e){return{date:"date-picker",time:"time-picker",datetime:"date-time-picker"}[e]}},processValue(e,t){return c.isDate(t)?t.toISOString():t}}),yi=b(bi,[["render",gi]]),Y={mixins:[Ot,pt],defaultValue(e){return Z(e)?[]:null},provide(){return{$sourceComponent:()=>this}},data(){return{wrappedPrimitives:null,ignoreRouteChange:!1,unwrappingPrimitives:!1}},computed:{sourceComponent(){return this},isObjectSource(){return X(this.type)},isListSource(){return Z(this.type)},hasData(){return!!this.value},isReady(){return this.hasData||!this.providesData},isInView(){return!!this.viewComponent},wrapPrimitives(){return this.schema.wrapPrimitives},listData:{get(){let e=this.value;this.isObjectSource?e=e!=null?[e]:[]:e=this.unwrapListData(e)||e,e||(e=[]);const{wrapPrimitives:t}=this;return t?(this.unwrappingPrimitives?this.unwrappingPrimitives=!1:this.wrappedPrimitives=e.map(o=>({[t]:o})),this.wrappedPrimitives):e},set(e){this.wrapPrimitives?this.wrappedPrimitives=e:this.value=this.isObjectSource?e&&e.length>0?e[0]:null:e}},objectData:{get(){return this.listData[0]||null},set(e){this.listData=e?[e]:[]}},sourceSchema(){return this.schema},path(){return this.routeComponent.getChildPath(this.schema.path)},defaultQuery(){const{defaultOrder:e}=this;return e?{order:e}:{}},query:$e("query",{get(e){return{...this.defaultQuery,...e}},set(e){var s;const{scope:t=(s=this.defaultScope)==null?void 0:s.name,page:o=this.schema.page}=this.query;return e={...this.query,...t!=null&&{scope:t},...o!=null&&{page:o},...e},c.equals(e,this.$route.query)||(this.ignoreRouteChange=!0,this.$router.replace({query:e,hash:this.$route.hash})),e}}),total:$e("total"),columns(){return W(this.schema.columns)},scopes(){return W(this.schema.scopes)},defaultScope(){let e=null;if(this.scopes)for(const t of Object.values(this.scopes)){if(t.defaultScope)return t;e||(e=t)}return e},defaultOrder(){if(this.columns)for(const e of Object.values(this.columns)){const{defaultSort:t}=e;if(t){const o=c.isString(t)?t:"asc";return`${e.name} ${o}`}}return null},nestedMeta(){return{...this.meta,schema:this.schema}},forms(){return Object.values(H(this.schema,this.context))},view(){return ve(this.schema,this.context)},linksToView(){return!!this.view},buttonSchemas(){return G(this.schema.buttons)},isCompact(){return this.forms.every(et)},isInlined(){return we(this.schema)},paginate:y("paginate",{type:Number}),render:y("render",{type:Function,default:null}),creatable:y("creatable",{type:Boolean,default:!1,get(e){return e&&I(this.schema)?this.isObjectSource?!this.value:!0:!1}}),editable:y("editable",{type:Boolean,default:!1,get(e){return e&&!this.isInlined}}),deletable:y("deletable",{type:Boolean,default:!1}),draggable:y("draggable",{type:Boolean,default:!1,get(e){return this.isListSource&&this.listData.length>1&&e}}),collapsible:y("collapsible",{type:Boolean,default:null,get(e){return this.isInlined&&!!(e??this.collapsed!==null)}}),collapsed:y("collapsed",{type:Boolean,default:null})},watch:{$route(e,t){if(this.ignoreRouteChange){this.ignoreRouteChange=!1;return}t.path===e.path&&t.hash===e.hash&&(this.query=e.query,this.loadData(!1))},wrappedPrimitives:{deep:!0,handler(e,t){const{wrapPrimitives:o}=this;o&&t!==null&&(this.unwrappingPrimitives=!0,this.value=e.map(s=>s[o]))}}},methods:{setupData(){this.query=this.$route.query,this.ensureData()},clearData(){this.total=0,this.value=null},setData(e){!e||this.isListSource&&c.isArray(e)||this.isObjectSource&&c.isObject(e)?this.value=e:this.unwrapListData(e)||c.isObject(e)&&this.isInView&&this.viewComponent.setData(e)},unwrapListData(e){if(this.isListSource&&c.isObject(e)&&c.isNumber(e.total)&&c.isArray(e.results))return this.total=e.total,this.value=e.results,this.value},createItem(e,t){const o=this.createData(e,t);return this.isObjectSource?this.objectData=o:this.listData.push(o),this.collapsible&&this.$nextTick(()=>this.openSchemaComponent(-1)),this.onChange(),o},removeItem(e){if(this.isObjectSource)this.objectData=null,this.onChange();else{const{listData:t}=this,o=t&&t.indexOf(e);o>=0&&(t.splice(o,1),this.onChange())}},deleteItem(e,t){const o=e&&this.getItemLabel(this.schema,e,{index:t,extended:!0}),s=()=>this.notify({type:this.isTransient?"info":"success",title:"Successfully Removed",text:[`${o} was ${this.verbs.deleted}.`,this.transientNote]});if(e&&window.confirm(`Do you really want to ${this.verbs.delete} ${o}?`))if(this.isTransient)this.removeItem(e),s();else{const a=this.getItemId(this.schema,e),i=Ce(a,this.resource);i&&this.handleRequest({method:"delete",resource:i},r=>{r||(this.removeItem(e),s()),this.reloadData()})}},getSchemaComponent(e){const{schemaComponents:t}=this,{length:o}=t;return t[(e%o+o)%o]},openSchemaComponent(e){const t=this.getSchemaComponent(e);t&&(t.opened=!0)},async navigateToComponent(e,t){if(this.collapsible){const o=e.startsWith(this.dataPath)?this.isListSource?c.parseDataPath(e.slice(this.dataPath.length+1))[0]??null:0:null;if(o!==null&&c.isNumber(+o)){const s=this.getSchemaComponent(+o);if(s){const{opened:a}=s;a||(s.opened=!0,await this.$nextTick());const i=s.getComponentsByDataPath(e);if(i.length>0&&((t==null?void 0:t(i))??!0))return!0;s.opened=a}}}return this.navigateToRouteComponent(e,t)},navigateToRouteComponent(e,t){return new Promise((o,s)=>{const a=()=>{const{routeComponents:r}=this.appState,l=r[r.length-1];o((t==null?void 0:t([l]))??!0)},i=c.parseDataPath(e);for(;i.length>0;){const r=this.routeComponent.getChildPath(this.api.normalizePath(c.normalizeDataPath(i))),{matched:l}=this.$router.match(r);l.length&&(this.$route.path===r?a():this.$router.push({path:r}).catch(s).then(()=>{this.$nextTick(a)})),i.pop()}o(!1)})}},async processSchema(e,t,o,s,a,i=!1,r=!1,l=null){Qe(e,t,o);const d=we(t);if(d&&t.resource)throw new Error("Lists with nested forms cannot load data from their own resources");const h=`id${a+1}`,u={api:e,schema:t},p={...u,flatten:r,nested:i,param:h},g=await Hn(e,t,a);if(l&&await l(g,a+1),I(t)&&!d){const f=($,S)=>S?$?`${$}/:${S}`:`:${S}`:$,m=a===0?"":t.path,k={path:f(m,Z(t)&&h),component:C.component(i?"DitoFormNested":"DitoForm"),meta:p};X(t)&&s.push({...k,path:f(m,h)}),m&&s.push({path:m,redirect:".",meta:u});const[P,w]=g.reduce(($,S)=>($[S.meta.flatten?0:1].push(S),$),[[],[]]);if(w.length&&(k.children=w),s.push(k),P.length)for(const $ of P)s.push({...$.redirect?$:k,path:`${k.path}/${$.path}`,meta:{...$.meta,flatten:r}})}},processValue(e,t,o,s){return s.addSource(o,e),t}},Fe={text(e){const t=[{label:"contains",value:"contains"},{label:"equals",value:"equals"},{label:"starts with",value:"starts-with"},{label:"ends with",value:"ends-with"}];return{operator:e.operators?{type:"select",width:"2/5",options:c.isArray(e.operators)?t.filter(o=>e.operators.includes(o.value)):t,clearable:!0}:null,text:{type:"text",width:e.operators?"3/5":"fill",clearable:!0}}},"date-range"(){const e={day:"2-digit",month:"2-digit",year:"numeric"};return{from:{type:"datetime",width:"1/2",dateFormat:e,clearable:!0},to:{type:"datetime",width:"1/2",dateFormat:e,clearable:!0}}}};function ki(e,t,o,s){const{sticky:a,...i}=t,r={type:"panel",label:"Filters",name:"$filters",target:o,disabled:!1,sticky:a,data(){return Bi(r,s.query)},components:Ci(i),buttons:qt(!1),panelButtons:qt(!0),events:{change(){this.applyFilters()}},computed:{filters(){return $i(this.schema,this.data)},hasFilters(){return this.filters.length>0}},methods:{applyFilters(){console.log("applyFilters()",JSON.stringify({data:this.data,filters:this.filters})),s.query={...s.query,filter:this.filters,page:void 0}},clearFilters(){console.log("clearFilters()"),this.resetData(),this.applyFilters()}}};return Je(e,r),r}function qt(e){return{clear:{type:"button",text:e?null:"Clear",disabled:({schemaComponent:t})=>!t.hasFilters,events:{click({schemaComponent:t}){t.clearFilters()}}},submit:{type:"submit",text:e?null:"Filter",visible:!e,events:{click({schemaComponent:t}){t.applyFilters()}}}}}function Ci(e){var o;const t={};for(const s of Object.values(W(e)||{})){const{filter:a,width:i,...r}=s,l=a?(o=Fe[a])==null?void 0:o.call(Fe,s):s.components;if(l){r.type="form",r.components={};for(const[d,h]of Object.entries(l))if(h){const u=h.label||c.labelize(h.name||d);r.components[d]={...h,label:!1,placeholder:u}}t[s.name]={label:r.label,type:"object",width:i,default:()=>({}),form:r,inlined:!0}}else throw new Error(`Invalid filter '${s.name}': Unknown filter type '${a}'.`)}return t}function It(e,t){var s;const o=e.components[t];return(s=o==null?void 0:o.form)==null?void 0:s.components}function $i(e,t){const o=[];for(const s in t){const a=t[s];if(a){const i=Object.keys(It(e,s)).map(r=>a[r]??null);i.some(r=>r!==null)&&o.push(`${s}:${i.map(JSON.stringify).join(",")}`)}}return o}function Bi(e,t){const o={};if(t)for(const a of c.asArray(t.filter)){const[,i,r]=a.match(/^(\w+):(.*)$/);try{o[i]=c.asArray(JSON.parse(`[${r}]`))}catch{}}const s={};for(const a in e.components){const i={},r=o[a];if(r){const l=It(e,a);if(l){let d=0;for(const h in l)i[h]=r[d++]}}s[a]=i}return s}const Di=["id"],wi={key:0,class:"dito-navigation"},Vi={key:1,class:"dito-spacer"},Si=["id"],Pi={key:1},Ei=["innerHTML"],Ni=["innerHTML"],Oi={key:2,class:"dito-cell-edit-buttons"},Fi={key:1},Li=["colspan"];function Ti(e,t,o,s,a,i){const r=n.resolveComponent("DitoScopes"),l=n.resolveComponent("DitoPagination"),d=n.resolveComponent("DitoTableHead"),h=n.resolveComponent("DitoTableCell"),u=n.resolveComponent("DitoSchemaInlined"),p=n.resolveComponent("DitoEditButtons"),g=n.resolveComponent("DitoDraggable");return e.isReady?(n.openBlock(),n.createElementBlock("div",{key:0,class:n.normalizeClass(["dito-list",e.schema.class]),id:e.dataPath,style:n.normalizeStyle(e.schema.style)},[e.scopes||e.hasPagination?(n.openBlock(),n.createElementBlock("div",wi,[e.scopes?(n.openBlock(),n.createBlock(r,{key:0,query:e.query,scopes:e.scopes},null,8,["query","scopes"])):e.hasPagination?(n.openBlock(),n.createElementBlock("div",Vi)):n.createCommentVNode("",!0),e.hasPagination?(n.openBlock(),n.createBlock(l,{key:2,query:e.query,limit:e.paginate,total:e.total||0},null,8,["query","limit","total"])):n.createCommentVNode("",!0)])):n.createCommentVNode("",!0),n.createElementVNode("table",{class:n.normalizeClass(["dito-table",{"dito-table-separators":e.isInlined,"dito-table-larger-padding":e.hasEditButtons&&!e.isInlined,"dito-table-alternate-colors":!e.isInlined,"dito-table-even-count":e.hasEvenCount}])},[e.columns?(n.openBlock(),n.createBlock(d,{key:0,query:e.query,columns:e.columns,hasEditButtons:e.hasEditButtons},null,8,["query","columns","hasEditButtons"])):n.createCommentVNode("",!0),n.createVNode(g,{tag:"tbody",modelValue:e.updateOrder(e.sourceSchema,e.listData,e.paginationRange),options:e.getSortableOptions(!1),draggable:e.draggable,"onUpdate:modelValue":t[0]||(t[0]=f=>e.listData=f)},{default:n.withCtx(()=>[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.listData,(f,m)=>(n.openBlock(),n.createElementBlock("tr",{id:e.getDataPath(m),key:e.getItemUid(e.schema,f)},[e.columns?(n.openBlock(!0),n.createElementBlock(n.Fragment,{key:0},n.renderList(e.columns,k=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[e.shouldRender(k)?(n.openBlock(),n.createBlock(h,{key:k.name,class:n.normalizeClass(e.getCellClass(k)),cell:k,schema:e.schema,dataPath:e.getDataPath(m),data:f,meta:e.nestedMeta,store:e.store,nested:!1,disabled:e.disabled||e.isLoading},null,8,["class","cell","schema","dataPath","data","meta","store","disabled"])):n.createCommentVNode("",!0)],64))),256)):(n.openBlock(),n.createElementBlock("td",Pi,[e.isInlined?(n.openBlock(),n.createBlock(u,{key:0,label:e.getItemLabel(e.schema,f,{index:m,asObject:!0}),schema:e.getItemFormSchema(e.schema,f,e.context),dataPath:e.getDataPath(m),data:f,meta:e.nestedMeta,store:e.getChildStore(m),disabled:e.disabled||e.isLoading,collapsed:e.collapsed,collapsible:e.collapsible,deletable:e.deletable,draggable:e.draggable,editable:e.editable,editPath:e.getEditPath(f,m),onDelete:k=>e.deleteItem(f,m)},null,8,["label","schema","dataPath","data","meta","store","disabled","collapsed","collapsible","deletable","draggable","editable","editPath","onDelete"])):e.schema.component?(n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.schema.component),{key:1,dataPath:e.getDataPath(m),data:f,nested:!1},null,8,["dataPath","data"])):e.render?(n.openBlock(),n.createElementBlock("span",{key:2,innerHTML:e.render(e.getContext(f,m))},null,8,Ei)):(n.openBlock(),n.createElementBlock("span",{key:3,innerHTML:e.getItemLabel(e.schema,f,{index:m})},null,8,Ni))])),e.hasCellEditButtons?(n.openBlock(),n.createElementBlock("td",Oi,[n.createVNode(p,{deletable:e.deletable,draggable:e.draggable,editable:e.editable,editPath:e.getEditPath(f,m),schema:e.getItemFormSchema(e.schema,f,e.context),dataPath:e.getDataPath(m),data:f,meta:e.nestedMeta,store:e.getChildStore(m),onDelete:k=>e.deleteItem(f,m)},null,8,["deletable","draggable","editable","editPath","schema","dataPath","data","meta","store","onDelete"])])):n.createCommentVNode("",!0)],8,Si))),128))]),_:1},8,["modelValue","options","draggable"]),e.hasListButtons&&!e.single?(n.openBlock(),n.createElementBlock("tfoot",Fi,[n.createElementVNode("tr",null,[n.createElementVNode("td",{class:"dito-cell-edit-buttons",colspan:e.numColumns},[n.createVNode(p,{creatable:e.creatable,createPath:e.path,buttons:e.buttonSchemas,schema:e.schema,dataPath:e.dataPath,data:e.listData,meta:e.meta,store:e.store},null,8,["creatable","createPath","buttons","schema","dataPath","data","meta","store"])],8,Li)])])):n.createCommentVNode("",!0)],2),e.hasListButtons&&e.single?(n.openBlock(),n.createBlock(p,{key:1,class:"dito-buttons-main dito-buttons-large",creatable:e.creatable,createPath:e.path,buttons:e.buttonSchemas,schema:e.schema,dataPath:e.dataPath,data:e.listData,meta:e.meta,store:e.store},null,8,["creatable","createPath","buttons","schema","dataPath","data","meta","store"])):n.createCommentVNode("",!0)],14,Di)):n.createCommentVNode("",!0)}const zc="",ji=D.register("list",{mixins:[Y,Oe],alignBottom:!1,getSourceType(e){return e},getPanelSchema(e,t,o,s){const{filters:a}=t;if(a){const i=()=>s.getComponentByDataPath(o,r=>r.type==="list");return ki(e,a,o,{get query(){var r;return(r=i())==null?void 0:r.query},set query(r){const l=i();if(console.log("set query",!!l),l){const d=h=>c.pickBy(h,u=>u!==void 0);console.log("set query",JSON.stringify(d(r)),JSON.stringify(d(l.query))),c.equals(d(r),d(l.query))||(console.log("load data"),l.query=r,l.loadData(!1))}}})}},computed:{hasPagination(){return this.paginate&&this.total>this.paginate},hasListButtons(){return!!(this.buttonSchemas||this.creatable)},hasEditButtons(){const{listData:e}=this;return e.length>0&&(this.editable||this.deletable||this.draggable)},hasCellEditButtons(){return!this.isInlined&&this.hasEditButtons},hasEvenCount(){return!(this.listData.length%2)},numColumns(){return(this.columns?Object.keys(this.columns).length:1)+(this.hasCellEditButtons?1:0)}},methods:{getDataPath(e){return F(this.dataPath,e)},getEditPath(e,t){if(this.editable){const o=Jn(this.schema,this.context)||this.path,s=this.getItemId(this.schema,e,t);return`${o}/${s}`}return null},getCellClass(e){return`dito-cell-${c.hyphenate(e.name)}`},getContext(e,t){return new V(this,{data:e,value:e,index:t,dataPath:this.getDataPath(t)})},onFilterErrors(e){const t=F(this.dataPath,"$filters"),o=this.schemaComponent.getPanelByDataPath(t);if(o)return o.showValidationErrors(e,!0),!0}},async processSchema(e,t,o,s,a,i=!1,r=!1,l=null){await Promise.all([re(t),Ye(t.columns),Y.processSchema(e,t,o,s,a,i,r,l)])}}),_i=b(ji,[["render",Ti]]);function Mi(e,t,o,s,a,i){const r=n.resolveComponent("DitoLabel");return n.openBlock(),n.createBlock(r,{class:"dito-label-component",label:e.value,dataPath:e.dataPath},null,8,["label","dataPath"])}const Ac="",Ri=D.register("label",{excludeValue:!0,generateLabel:!1,alignBottom:!1}),qi=b(Ri,[["render",Mi]]),Ii=["id"],zi=["editor"],Ai={key:0,class:"dito-buttons dito-buttons-toolbar"},Ui={class:"dito-button-group"},Hi=["onClick"];function Wi(e,t,o,s,a,i){const r=n.resolveComponent("Icon"),l=n.resolveComponent("EditorContent");return n.openBlock(),n.createElementBlock("div",{class:"dito-markup",id:e.dataPath},[n.createElementVNode("div",{class:"dito-markup-toolbar",editor:e.editor},[e.groupedButtons.length>0?(n.openBlock(),n.createElementBlock("div",Ai,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.groupedButtons,d=>(n.openBlock(),n.createElementBlock("div",Ui,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(d,({name:h,icon:u,isActive:p,onClick:g})=>(n.openBlock(),n.createElementBlock("button",{class:n.normalizeClass(["dito-button",{"dito-active":p}]),key:h,onClick:g},[n.createVNode(r,{name:u},null,8,["name"])],10,Hi))),128))]))),256))])):n.createCommentVNode("",!0)],8,zi),n.createVNode(l,{class:"dito-markup-editor",ref:"editor",editor:e.editor,style:n.normalizeStyle(e.styles)},null,8,["editor","style"]),e.resizable?(n.openBlock(),n.createElementBlock("div",{key:0,class:"dito-resize",onMousedown:t[0]||(t[0]=n.withModifiers((...d)=>e.onDragResize&&e.onDragResize(...d),["stop","prevent"]))},null,32)):n.createCommentVNode("",!0)],8,Ii)}const Uc="",Ki=D.register("markup",{mixins:[x],components:{EditorContent:ee.EditorContent,Icon:Qo},alignBottom:!1,data(){return{editor:null,height:null}},computed:{lines(){return this.schema.lines||10},styles(){return{height:this.height||`calc(${this.lines}em * var(--line-height))`}},markButtons(){return this.getButtons("marks",{bold:!0,italic:!0,underline:!0,strike:!0,small:!0,code:!0,link:{onClick:e=>this.onClickLink(e)}})},basicNodeButtons(){return this.getButtons("nodes",{paragraph:{ignoreActive:()=>this.otherNodeButtons.some(e=>e.isActive)},heading:{attribute:"level",values:[1,2,3,4,5,6]}})},otherNodeButtons(){return this.getButtons("nodes",{bulletList:!0,orderedList:!0,blockquote:!0,codeBlock:!0})},toolButtons(){return this.getButtons("tools",{undo:!0,redo:!0})},groupedButtons(){const{markButtons:e,basicNodeButtons:t,otherNodeButtons:o,toolButtons:s}=this;return[e,t,o,s].filter(a=>a.length>0)},parseOptions(){return{preserveWhitespace:{collapse:!1,preserve:!0,"preserve-all":"full"}[this.whitespace]}},editorOptions(){return{editable:!this.readyonly,autoFocus:this.autofocus,disableInputRules:!this.enableRules.input,disablePasteRules:!this.enableRules.paste,parseOptions:this.parseOptions}},resizable:y("resizable",{type:Boolean,default:!1}),whitespace:y("whitespace",{type:String,default:"collapse"}),enableRules:y("enableRules",{type:[Object,Boolean],default:!1,get(e){return c.isObject(e)?e:{input:!!e,paste:!!e}}})},watch:{readyonly:"updateEditorOptions",autofocus:"updateEditorOptions",enableRules:"updateEditorOptions"},created(){let e=!1,t=!1;const o=()=>{!this.focused&&e&&(e=!1,this.onChange())},s=()=>this.onFocus(),a=()=>{this.onBlur(),o()},i=c.debounce(l=>{t=!0,this.value=l.getHTML(),e=!0,o()},100),r=({editor:l})=>{i(l),this.onInput()};this.$watch("value",l=>{t?t=!1:this.editor.setContent(l,!1,this.parseOptions)}),this.editor=new ee.Editor({...this.editorOptions,onFocus:s,onBlur:a,onUpdate:r,extensions:this.getExtensions(),content:this.value||""})},unmounted(){this.editor.destroy()},methods:{onDragResize(e){const t=({clientX:r,clientY:l})=>({x:r,y:l});let o=t(e).y,s=parseFloat(getComputedStyle(this.$refs.editor.$el).height);const a=r=>{const{y:l}=t(r);s+=l-o,o=l,this.height=`${Math.max(s,0)}px`},i=this.domOn(document,{mousemove:a,mouseup(r){a(r),i.remove()}})},updateEditorOptions(){this.editor.setOptions(this.editorOptions)},async onClickLink(e){const t=await this.rootComponent.showDialog({components:{href:{type:"url",label:"Link",autofocus:!0},title:{type:"text",label:"Title"}},buttons:{cancel:{},apply:{type:"submit"},remove:{events:{click({dialogComponent:o}){o.resolve(null)}}}},data:ee.getMarkAttributes(this.editor.state,"link")});if(t){let{href:o,title:s}=t;if(o)try{new URL(o)}catch{o=`https://${o}`}e.commands.setLink({href:o,title:s})}else e.commands.unsetLink()},getExtensions(){const{marks:e={},nodes:t={},tools:o={}}=this.schema;return[Qt.Document,Gt.Text,rn.Paragraph,e.bold&&Xt.Bold,e.italic&&vt.Italic,e.underline&&tn.Underline,e.strike&&en.Strike,e.small&&Yi,e.code&&Zt.Code,e.link&&Ji,t.blockquote&&nn.Blockquote,t.codeBlock&&on.CodeBlock,sn.HardBreak,t.heading&&an.Heading.configure({levels:t.heading}),t.horizontalRule&&ln.HorizontalRule,(t.orderedList||t.bulletList)&&hn.ListItem,t.bulletList&&cn.BulletList,t.orderedList&&dn.OrderedList,o.history&&un.History].filter(s=>!!s)},getButtons(e,t){const o=[],s=({name:i,icon:r,attributes:l,ignoreActive:d,onClick:h})=>{o.push({name:i,icon:r,isActive:this.editor.isActive(i,l)&&(d==null||!d()),onClick:()=>{const u=`toggle${c.camelize(i,!0)}`;this.editor.commands[u]&&(h?h(this.editor,l):(g=>this.editor.chain()[u](g).focus().run())(l))}})},a=this.schema[e];if(a)for(const[i,r]of Object.entries(t)){const l=["undo","redo"].includes(i)?"history":i,d=a[l],h=c.underscore(i),u=c.hyphenate(i);if(d){if(r===!0)s({name:h,icon:u});else if(c.isObject(r)){const{attribute:p,values:g,ignoreActive:f,onClick:m}=r;if(p){if(c.isArray(g)&&c.isArray(d))for(const k of g)d.includes(k)&&s({name:h,icon:`${u}-${k}`,attributes:{[p]:k},ignoreActive:f,onClick:m})}else s({name:h,icon:u,ignoreActive:f,onClick:m})}}}return o},focusElement(){var e,t;(t=(e=this.$el).scrollIntoView)==null||t.call(e),this.editor.focus()}}}),Yi=ee.Mark.create({name:"small",parseHTML(){return[{tag:"small"}]},renderHTML(){return["small",0]},addCommands(){return{setSmall:e=>({commands:t})=>t.setMark(this.name,e),toggleSmall:e=>({commands:t})=>t.toggleMark(this.name,e),unsetSmall:()=>({commands:e})=>e.unsetMark(this.name)}}}),Ji=xt.Link.extend({inclusive:!1,schema:{attrs:{href:{default:null},title:{default:null}},parseHTML(){return[{tag:"a",getAttrs:e=>({href:e.getAttribute("href"),title:e.getAttribute("title")})}]},renderHTML(e){return["a",e.attrs,0]}}}),Qi=b(Ki,[["render",Wi]]),Gi=["disabled"];function Xi(e,t,o,s,a,i){const r=n.resolveComponent("VueMultiselect");return n.openBlock(),n.createElementBlock("div",{class:n.normalizeClass(["dito-multiselect",{"dito-multiselect-single":!e.multiple,"dito-multiselect-multiple":e.multiple}])},[n.createVNode(r,n.mergeProps({ref:"element",modelValue:e.selectedOptions,"onUpdate:modelValue":t[0]||(t[0]=l=>e.selectedOptions=l),class:{"multiselect--show-highlight":e.showHighlight},showLabels:!1,placeholder:e.placeholder,tagPlaceholder:"Press enter to add new tag",options:e.populate&&e.activeOptions||[],customLabel:e.getLabelForOption,trackBy:e.optionValue,groupLabel:e.groupByLabel,groupValues:e.groupByOptions,multiple:e.multiple,taggable:e.taggable,searchable:e.searchable,internalSearch:!e.searchFilter,preserveSearch:!!e.searchFilter,clearOnSelect:!e.searchFilter,closeOnSelect:!e.stayOpen,loading:e.isLoading},e.attributes,{onOpen:e.onOpen,onClose:e.onClose,onTag:e.onAddTag,onSearchChange:e.onSearchChange}),null,16,["modelValue","class","placeholder","options","customLabel","trackBy","groupLabel","groupValues","multiple","taggable","searchable","internalSearch","preserveSearch","clearOnSelect","closeOnSelect","loading","onOpen","onClose","onTag","onSearchChange"]),e.showClearButton?(n.openBlock(),n.createElementBlock("button",{key:0,class:"dito-button-clear dito-button-overlay",type:"button",disabled:e.disabled,onClick:t[1]||(t[1]=(...l)=>e.clear&&e.clear(...l))},null,8,Gi)):n.createCommentVNode("",!0)],2)}const Hc="",Zi=D.register("multiselect",{mixins:[ue],components:{VueMultiselect:pn},data(){return{isMounted:!1,searchedOptions:null,populate:!1}},computed:{selectedOptions:{get(){return this.multiple?(this.selectedValue||[]).map(e=>this.getOptionForValue(e)||this.addTagOption(e)).filter(Boolean):this.selectedOption},set(e){this.selectedValue=this.multiple?(e||[]).map(t=>this.getValueForOption(t)):this.getValueForOption(e),this.onChange()}},activeOptions(){return this.searchedOptions||this.options},multiple:y("multiple",{type:Boolean,default:!1}),searchable:y("searchable",{type:Boolean,default:!1}),taggable:y("taggable",{type:Boolean,default:!1}),stayOpen:y("stayOpen",{type:Boolean,default:!1}),placeholder(){let{placeholder:e,searchable:t,taggable:o}=this.schema;return c.isBoolean(e)&&(e=e?void 0:null),e===void 0?t&&o?`Search or add a ${this.label}`:t?`Select or search ${this.label}`:void 0:e},showHighlight(){return this.isMounted&&this.$refs.element.pointerDirty}},mounted(){this.isMounted=!0,this.autofocus&&this.focus()},methods:{addTagOption(e){if(this.taggable){const{optionLabel:t,optionValue:o}=this,s=t&&o?{[t]:e,[o]:e}:e;return this.options.push(s),s}},focusElement(){this.$refs.element.activate()},onOpen(){this.populate=!0},onClose(){this.focused&&this.onBlur()},onBlur(){this.$refs.element.isOpen||J.methods.onBlur.call(this)},onAddTag(e){const t=this.addTagOption(e);t&&this.value.push(this.getValueForOption(t))},async onSearchChange(e){this.searchFilter&&(e?(this.searchedOptions=[],this.searchedOptions=await this.resolveData(()=>this.searchFilter(new V(this,{query:e})))):this.searchedOptions=null)}}}),vi=b(Zi,[["render",Xi]]),Le={computed:{inputValue:{get(){return this.value!==null?this.value:""},set(e){this.value=e!==""?this.isInteger?parseInt(e,10):parseFloat(e):null}},isInteger(){return!1},stepValue(){return this.clearable?null:this.step==null&&!this.isInteger?"any":this.step},decimals:y("decimals",{type:Number}),step:y("step",{type:Number,get(e){return this.isInteger&&e!=null?Math.ceil(e):e}}),min:y("min",{type:Number,get(e){var t;return e=e===void 0?(t=this.getSchemaValue("range",{type:Array}))==null?void 0:t[0]:e,this.isInteger&&e!=null?Math.floor(e):e}}),max:y("max",{type:Number,get(e){var t;return e=e===void 0?(t=this.getSchemaValue("range",{type:Array}))==null?void 0:t[1]:e,this.isInteger&&e!=null?Math.ceil(e):e}}),range:y("range",{type:Array,get(){const{min:e,max:t}=this;return e!=null&&t!=null?[e,t]:void 0},set(e){c.isArray(e)&&([this.min,this.max]=e)}})},methods:{getValidations(){const e={},{range:t,min:o,max:s,decimals:a,step:i}=this;if(t?e.range=t:(o!=null&&(e.min=o),s!=null&&(e.max=s)),a!=null)e.decimals=a;else if(i){const r=(`${i}`.split(".")[1]||"").length;r>0?e.decimals=r:e.integer=!0}return this.isInteger&&(e.integer=!0),e}}},xi=["disabled"];function el(e,t,o,s,a,i){const r=n.resolveComponent("InputField");return n.openBlock(),n.createBlock(r,n.mergeProps({class:"dito-number",id:e.dataPath,ref:"element",modelValue:e.inputValue,"onUpdate:modelValue":t[1]||(t[1]=l=>e.inputValue=l),type:"number"},e.attributes,{min:e.min,max:e.max,step:e.stepValue}),{after:n.withCtx(()=>[e.showClearButton?(n.openBlock(),n.createElementBlock("button",{key:0,class:"dito-button-clear dito-button-overlay",disabled:e.disabled,onClick:t[0]||(t[0]=n.withModifiers((...l)=>e.clear&&e.clear(...l),["stop"]))},null,8,xi)):n.createCommentVNode("",!0)]),_:1},16,["id","modelValue","min","max","step"])}const Wc="",tl=D.register(["number","integer"],{mixins:[Le],components:{InputField:v},nativeField:!0,textField:!0,computed:{isInteger(){return this.type==="integer"}}}),nl=b(tl,[["render",el]]),ol=["id"],sl={key:0,class:"dito-object-content"},al=["innerHTML"],rl=["innerHTML"];function il(e,t,o,s,a,i){const r=n.resolveComponent("DitoSchemaInlined"),l=n.resolveComponent("DitoEditButtons");return e.isReady?(n.openBlock(),n.createElementBlock("div",{key:0,class:n.normalizeClass(["dito-object",e.schema.class]),id:e.dataPath,style:n.normalizeStyle(e.schema.style)},[e.objectData?(n.openBlock(),n.createElementBlock("div",sl,[e.isInlined?(n.openBlock(),n.createBlock(r,{key:0,label:e.objectLabel,schema:e.getItemFormSchema(e.schema,e.objectData,e.context),dataPath:e.dataPath,data:e.objectData,meta:e.nestedMeta,store:e.store,disabled:e.disabled||e.isLoading,collapsed:e.collapsed,collapsible:e.collapsible},null,8,["label","schema","dataPath","data","meta","store","disabled","collapsed","collapsible"])):e.schema.component?(n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.schema.component),{key:1,dataPath:e.dataPath,data:e.objectData,nested:!1},null,8,["dataPath","data"])):e.render?(n.openBlock(),n.createElementBlock("span",{key:2,innerHTML:e.render(e.getContext())},null,8,al)):(n.openBlock(),n.createElementBlock("span",{key:3,innerHTML:e.getItemLabel(e.schema,e.objectData)},null,8,rl))])):n.createCommentVNode("",!0),n.createVNode(l,{creatable:e.creatable,deletable:e.objectData&&e.deletable,editable:e.objectData&&e.editable,createPath:e.path,editPath:e.path,buttons:e.buttonSchemas,schema:e.schema,dataPath:e.dataPath,data:e.objectData,path:e.path,meta:e.meta,store:e.store,onDelete:t[0]||(t[0]=d=>e.deleteItem(e.objectData))},null,8,["creatable","deletable","editable","createPath","editPath","buttons","schema","dataPath","data","path","meta","store"])],14,ol)):n.createCommentVNode("",!0)}const Kc="",ll=D.register("object",{mixins:[Y],alignBottom:!1,getSourceType(e){return e},computed:{objectLabel(){return this.collapsible?this.getItemLabel(this.schema,this.objectData,{asObject:!0}):null}},methods:{getContext(){return new V(this,{data:this.objectData})}},async processSchema(e,t,o,s,a,i=!1,r=!1,l=null){await Promise.all([re(t),Y.processSchema(e,t,o,s,a,i,r,l)])}}),dl=b(ll,[["render",il]]),cl=D.register("panel",{defaultValue:()=>{},excludeValue:!0,generateLabel:!1,alignBottom:!1,omitPadding:!0,getPanelSchema(e,t){const{name:o,...s}=t;return s}}),hl=["id","value","max"];function ul(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("progress",n.mergeProps({class:"dito-progress",id:e.dataPath,ref:"element",value:e.progressValue,max:e.progressMax},e.attributes),null,16,hl)}const pl=D.register("progress",{mixins:[Le],computed:{progressValue(){let{value:e,range:t,step:o}=this;return e!==null?(t&&(e-=t[0]),o&&(e=Math.round(e/o)*o)):e="",e},progressMax(){const{range:e}=this;return e?e[1]-e[0]:null}}}),ml=b(pl,[["render",ul]]),fl=["id"],gl=["value"];function bl(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("ul",{class:n.normalizeClass(["dito-radio-buttons",`dito-layout-${e.schema.layout||"vertical"}`]),id:e.dataPath},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.options,r=>(n.openBlock(),n.createElementBlock("li",null,[n.createElementVNode("label",null,[n.withDirectives(n.createElementVNode("input",n.mergeProps({class:"dito-radio-button",ref_for:!0,ref:"element","onUpdate:modelValue":t[0]||(t[0]=l=>e.selectedValue=l),type:"radio",value:e.getValueForOption(r)},e.attributes),null,16,gl),[[n.vModelRadio,e.selectedValue]]),n.createTextVNode(n.toDisplayString(e.getLabelForOption(r)),1)])]))),256))],10,fl)}const Yc="",yl=D.register("radio",{mixins:[ue],nativeField:!0}),kl=b(yl,[["render",bl]]);function Cl(e,t,o,s,a,i){const r=n.resolveComponent("DitoPane");return n.openBlock(),n.createElementBlock("div",{class:n.normalizeClass(["dito-section",{"dito-section-labelled":!!e.schema.label}])},[n.createVNode(r,{class:"dito-section-pane",schema:e.getItemFormSchema(e.schema,e.item,e.context),dataPath:e.dataPath,data:e.item,meta:e.meta,store:e.store,disabled:e.disabled},null,8,["schema","dataPath","data","meta","store","disabled"])],2)}const Jc="",$l=D.register("section",{defaultValue:()=>{},ignoreMissingValue:e=>!e.nested&&!("default"in e),defaultNested:!1,generateLabel:!1,alignBottom:!1,computed:{item(){return this.nested?this.value:this.data}},methods:{getItemFormSchema:De},async processSchema(e,t,o,s,a){await Q(e,t,s,a)}}),Bl=b($l,[["render",Cl]]),Dl={class:"dito-select"},wl=["id"],Vl=["label"],Sl=["value"],Pl=["value"],El=["value"],Nl=["disabled"];function Ol(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("div",Dl,[n.withDirectives(n.createElementVNode("select",n.mergeProps({id:e.dataPath,ref:"element","onUpdate:modelValue":t[0]||(t[0]=r=>e.selectedValue=r)},e.attributes,{onMousedown:t[1]||(t[1]=r=>e.populate=!0),onFocus:t[2]||(t[2]=r=>e.populate=!0)}),[e.populate?(n.openBlock(!0),n.createElementBlock(n.Fragment,{key:0},n.renderList(e.options,r=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[e.groupBy?(n.openBlock(),n.createElementBlock("optgroup",{key:0,label:r[e.groupByLabel]},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(r[e.groupByOptions],l=>(n.openBlock(),n.createElementBlock("option",{value:e.getValueForOption(l)},n.toDisplayString(e.getLabelForOption(l)),9,Sl))),256))],8,Vl)):(n.openBlock(),n.createElementBlock("option",{key:1,value:e.getValueForOption(r)},n.toDisplayString(e.getLabelForOption(r)),9,Pl))],64))),256)):e.selectedOption?(n.openBlock(),n.createElementBlock("option",{key:1,value:e.selectedValue},n.toDisplayString(e.getLabelForOption(e.selectedOption)),9,El)):n.createCommentVNode("",!0)],16,wl),[[n.vModelSelect,e.selectedValue]]),e.showClearButton?(n.openBlock(),n.createElementBlock("button",{key:0,class:"dito-button-clear dito-button-overlay",disabled:e.disabled,onClick:t[3]||(t[3]=(...r)=>e.clear&&e.clear(...r))},null,8,Nl)):n.createCommentVNode("",!0)])}const Qc="",Fl=D.register("select",{mixins:[ue],nativeField:!0,data(){return{populate:!0}}}),Ll=b(Fl,[["render",Ol]]),Tl={class:"dito-slider"},jl=["id","min","max","step"];function _l(e,t,o,s,a,i){const r=n.resolveComponent("InputField");return n.openBlock(),n.createElementBlock("div",Tl,[n.withDirectives(n.createElementVNode("input",n.mergeProps({class:"dito-range",id:e.dataPath,ref:"element","onUpdate:modelValue":t[0]||(t[0]=l=>e.inputValue=l),type:"range"},e.attributes,{min:e.min,max:e.max,step:e.stepValue}),null,16,jl),[[n.vModelText,e.inputValue]]),e.input?(n.openBlock(),n.createBlock(r,n.mergeProps({key:0,class:"dito-number",modelValue:e.inputValue,"onUpdate:modelValue":t[1]||(t[1]=l=>e.inputValue=l),type:"number"},e.attributes,{min:e.min,max:e.max,step:e.stepValue}),null,16,["modelValue","min","max","step"])):n.createCommentVNode("",!0)])}const Gc="",Ml=D.register("slider",{mixins:[Le],components:{InputField:v},nativeField:!0,computed:{input:y("input",{type:Boolean,default:!0})}}),Rl=b(Ml,[["render",_l]]);function ql(e,t,o,s,a,i){const r=n.resolveComponent("SwitchButton");return n.openBlock(),n.createBlock(r,n.mergeProps({class:"dito-switch",id:e.dataPath,ref:"element",modelValue:e.value,"onUpdate:modelValue":t[0]||(t[0]=l=>e.value=l),labels:e.labels},e.attributes),null,16,["id","modelValue","labels"])}const Xc="",Il=D.register("switch",{defaultValue:!1,defaultWidth:"auto",components:{SwitchButton:is},computed:{labels(){return this.schema.labels}}}),zl=b(Il,[["render",ql]]),Al=["disabled"];function Ul(e,t,o,s,a,i){const r=n.resolveComponent("InputField");return n.openBlock(),n.createBlock(r,n.mergeProps({class:"dito-text",id:e.dataPath,ref:"element",modelValue:e.inputValue,"onUpdate:modelValue":t[1]||(t[1]=l=>e.inputValue=l),type:e.inputType},e.attributes),{after:n.withCtx(()=>[e.showClearButton?(n.openBlock(),n.createElementBlock("button",{key:0,class:"dito-button-clear dito-button-overlay",disabled:e.disabled,onClick:t[0]||(t[0]=n.withModifiers((...l)=>e.clear&&e.clear(...l),["stop"]))},null,8,Al)):n.createCommentVNode("",!0)]),_:1},16,["id","modelValue","type"])}const Hl="****************",Wl=D.register(["text","email","url","hostname","domain","tel","password","creditcard"],{components:{InputField:v},nativeField:!0,textField:!0,ignoreMissingValue:e=>e.type==="password",computed:{inputType(){return{creditcard:"text",hostname:"text",domain:"text"}[this.type]||this.type},inputValue:{get(){return this.type==="password"&&this.value===void 0&&!this.focused?Hl:this.value},set(e){this.value=e}}},methods:{getValidations(){const e={email:"email",url:"url",hostname:"hostname",domain:"domain",password:"password",creditcard:"creditcard"}[this.type];return e?{[e]:!0}:{}}}}),Kl=b(Wl,[["render",Ul]]),Yl=["id","rows"];function Jl(e,t,o,s,a,i){return n.withDirectives((n.openBlock(),n.createElementBlock("textarea",n.mergeProps({class:"dito-textarea dito-input",id:e.dataPath,ref:"element","onUpdate:modelValue":t[0]||(t[0]=r=>e.value=r)},e.attributes,{rows:e.lines,class:{"dito-resizable":e.resizable}}),null,16,Yl)),[[n.vModelText,e.value]])}const Zc="",Ql=D.register("textarea",{nativeField:!0,textField:!0,alignBottom:!1,computed:{lines(){return this.schema.lines||4},resizable:y("resizable",{type:Boolean,default:!1})}}),Gl=b(Ql,[["render",Jl]]),Xl={class:"dito-tree-list"},Zl={class:"dito-tree-panel"},vl={key:0,class:"dito-tree-form-container"};function xl(e,t,o,s,a,i){const r=n.resolveComponent("DitoScopes"),l=n.resolveComponent("DitoTreeItem"),d=n.resolveComponent("RouterView");return n.openBlock(),n.createElementBlock("div",Xl,[e.scopes?(n.openBlock(),n.createBlock(r,{key:0,query:e.query,scopes:e.scopes},null,8,["query","scopes"])):n.createCommentVNode("",!0),n.createElementVNode("div",Zl,[n.createVNode(l,{schema:e.treeSchema,dataPath:e.treeDataPath,data:e.treeData,draggable:e.draggable,open:!0},null,8,["schema","dataPath","data","draggable"]),e.hasEditableForms?(n.openBlock(),n.createElementBlock("div",vl,[n.createVNode(d)])):n.createCommentVNode("",!0)])])}const vc="",ed=D.register(["tree-list","tree-object"],{mixins:[Y],alignBottom:!1,provide(){return{container:this}},getSourceType(e){return e==="tree-object"?"object":"list"},computed:{path(){var e;return(e=this.formComponent)==null?void 0:e.path},editPath(){var e;return this.$route.path.slice((e=this.path)==null?void 0:e.length)},treeData(){return this.isListSource?{[this.name]:this.value}:this.value},treeDataPath(){return this.isListSource?this.dataPath.slice(0,this.dataPath.length-this.name.length):this.dataPath},treeSchema(){return this.isListSource?{children:{name:this.name,...this.schema}}:this.schema},hasEditableForms(){const e=t=>I(t)&&(this.getSchemaValue("editable",{type:Boolean,default:!1,schema:t})||t.children&&e(t.children));return e(this.schema)}},async processSchema(e,t,o,s,a,i=!0,r=!1,l=null){await Promise.all([Ye(t.properties),Y.processSchema(e,t,o,s,a,i,r,(d,h)=>{const{children:u}=t;if(u)return u.type="tree-list",this.processSchema(e,u,u.name,d,h,i,!0,l)})])},getFormSchemasForProcessing(e,t){const{children:o}=e;return H(e,t,o?s=>({...s,components:{...s.components,[o.name]:o}}):null)}}),td=b(ed,[["render",xl]]);function zt(e){return fn.filesize(e,{base:10})}const nd={class:"dito-upload"},od={class:"dito-table dito-table-separators dito-table-background"},sd=n.createElementVNode("thead",{class:"dito-table-head"},[n.createElementVNode("tr",null,[n.createElementVNode("th",null,[n.createElementVNode("span",null,"Name")]),n.createElementVNode("th",null,[n.createElementVNode("span",null,"Size")]),n.createElementVNode("th",null,[n.createElementVNode("span",null,"Status")]),n.createElementVNode("th",null,[n.createElementVNode("span")])])],-1),ad=["innerHTML"],rd={class:"dito-cell-edit-buttons"},id={class:"dito-buttons dito-buttons-round"},ld=["onClick"],dd={colspan:4},cd={class:"dito-upload-footer"},hd=["value"],ud={class:"dito-buttons dito-buttons-round"};function pd(e,t,o,s,a,i){const r=n.resolveComponent("DitoDraggable"),l=n.resolveComponent("VueUpload");return n.openBlock(),n.createElementBlock("div",nd,[n.createElementVNode("table",od,[sd,n.createVNode(r,{modelValue:e.files,"onUpdate:modelValue":t[0]||(t[0]=d=>e.files=d),tag:"tbody",options:e.getSortableOptions(!1),draggable:e.draggable},{default:n.withCtx(()=>[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.files,(d,h)=>(n.openBlock(),n.createElementBlock("tr",{key:d.key},[n.createElementVNode("td",{innerHTML:e.renderFile(d,h)},null,8,ad),n.createElementVNode("td",null,n.toDisplayString(e.formatFileSize(d.size)),1),n.createElementVNode("td",null,[d.upload?(n.openBlock(),n.createElementBlock(n.Fragment,{key:0},[d.upload.error?(n.openBlock(),n.createElementBlock(n.Fragment,{key:0},[n.createTextVNode("Error: "+n.toDisplayString(d.upload.error),1)],64)):d.upload.active?(n.openBlock(),n.createElementBlock(n.Fragment,{key:1},[n.createTextVNode("Uploading...")],64)):d.upload.success?(n.openBlock(),n.createElementBlock(n.Fragment,{key:2},[n.createTextVNode("Uploaded")],64)):n.createCommentVNode("",!0)],64)):(n.openBlock(),n.createElementBlock(n.Fragment,{key:1},[n.createTextVNode("Stored")],64))]),n.createElementVNode("td",rd,[n.createElementVNode("div",id,[e.draggable?(n.openBlock(),n.createElementBlock("a",n.mergeProps({key:0,class:"dito-button"},e.getButtonAttributes(e.verbs.drag)),null,16)):n.createCommentVNode("",!0),e.deletable?(n.openBlock(),n.createElementBlock("button",n.mergeProps({key:1,class:"dito-button",type:"button"},e.getButtonAttributes(e.verbs.delete),{onClick:u=>e.deleteFile(d,h)}),null,16,ld)):n.createCommentVNode("",!0)])])]))),128))]),_:1},8,["modelValue","options","draggable"]),n.createElementVNode("tfoot",null,[n.createElementVNode("tr",null,[n.createElementVNode("td",dd,[n.createElementVNode("div",cd,[e.isUploadActive?(n.openBlock(),n.createElementBlock("progress",{key:0,class:"dito-progress",value:e.uploadProgress,max:"100"},null,8,hd)):n.createCommentVNode("",!0),n.createElementVNode("div",ud,[e.isUploadActive?(n.openBlock(),n.createElementBlock("button",{key:0,class:"dito-button",type:"button",onClick:t[1]||(t[1]=n.withModifiers(d=>e.upload.active=!1,["prevent"]))},"Cancel All")):e.isUploadReady?(n.openBlock(),n.createElementBlock("button",{key:1,class:"dito-button",type:"button",onClick:t[2]||(t[2]=n.withModifiers(d=>e.upload.active=!0,["prevent"]))},"Upload All")):n.createCommentVNode("",!0),n.createVNode(l,{class:"dito-button dito-button-add-upload",ref:"upload",modelValue:e.uploads,"onUpdate:modelValue":t[3]||(t[3]=d=>e.uploads=d),inputId:e.dataPath,name:e.dataPath,disabled:e.disabled,postAction:e.uploadPath,extensions:e.extensions,accept:e.accept,multiple:e.multiple,size:e.maxSize,title:"Upload Files",onInputFilter:e.inputFilter,onInputFile:e.inputFile},null,8,["modelValue","inputId","name","disabled","postAction","extensions","accept","multiple","size","onInputFilter","onInputFile"])])])])])])])])}const xc="",md=D.register("upload",{mixins:[Oe],components:{VueUpload:gn},alignBottom:!1,data(){return{uploads:[]}},computed:{upload(){return this.$refs.upload},files(){return At(this.value)},multiple:y("multiple",{type:Boolean,default:!1,callback:!1}),extensions:y("extensions",{type:[Array,String,RegExp]}),accept:y("accept",{type:Array,get(e){return c.isArray(e)?e.join(","):e}}),maxSize:y("maxSize",{type:[String,Number],get(e){return e?mn(e):void 0}}),draggable:y("draggable",{type:Boolean,default:!1,get(e){return e&&this.files.length>1}}),deletable:y("deletable",{type:Boolean,default:!1}),isUploadReady(){return this.uploads.length&&!(this.upload.active||this.upload.uploaded)},isUploadActive(){return this.uploads.length&&this.upload.active},uploadProgress(){return this.uploads.reduce((e,t)=>e+t.progress,0)/this.uploads.length},uploadPath(){return this.getResourceUrl({type:"upload",path:this.api.normalizePath(this.dataPath)})}},methods:{formatFileSize:zt,renderFile(e,t){const{render:o}=this.schema;return o?o.call(this,new V(this,{value:e,data:this.files,index:t,dataPath:F(this.dataPath,t)})):c.escapeHtml(e.name)},deleteFile(e,t){const{name:o}=e;e&&window.confirm(`Do you really want to ${this.verbs.remove} ${o}?`)&&(this.multiple?this.value.splice(t,1):this.value=null,e.upload&&this.upload.remove(e.upload),this.onChange(),this.notify({type:"info",title:"Successfully Removed",text:`${o} was ${this.verbs.deleted}.`}))},getFileIndex(e){return this.multiple&&this.value?this.value.findIndex(t=>t.id===e.id):-1},addFile(e){this.multiple?this.value?this.value.push(e):this.value=[e]:this.value=e},replaceFile(e,t){if(this.multiple){const o=this.getFileIndex(e);o>=0&&(t?this.value[o]=t:this.value.splice(o,1))}else this.value=t},removeFile(e){this.replaceFile(e,null)},inputFile(e,t){if(e&&!t){const{id:o,name:s,size:a}=e;this.addFile({id:o,name:s,size:a,upload:e})}if(e&&t){const{success:o,error:s}=e;if(o){this.onChange();const a=e.response[0];a?(a.upload=e,this.replaceFile(e,a)):this.removeFile(e)}else if(s){const a={abort:"Upload aborted",denied:"Upload denied",extension:`Unsupported file-type: ${e.name}`,network:"Network error encountered during upload",server:"Server error occurred during upload",size:`File is too large: ${zt(e.size)}`,timeout:"Timeout occurred during upload"}[s]||`Unknown File Upload Error: '${s}'`;this.notify({type:"error",title:"File Upload Error",text:a}),this.removeFile(e)}}},inputFilter(e){var o;const t=e==null?void 0:e.xhr;(o=this.api.cors)!=null&&o.credentials&&t&&!t.withCredentials&&(t.withCredentials=!0)}},processValue(e,t){const o=At(t).map(({upload:s,...a})=>!s||s.success?a:null).filter(s=>s);return e.multiple?o:o[0]||null}});function At(e){return e?c.asArray(e):[]}const fd=Object.freeze(Object.defineProperty({__proto__:null,DitoDitoTypeComponent:ci,DitoTypeButton:Ur,DitoTypeCheckbox:Yr,DitoTypeCheckboxes:Zr,DitoTypeCode:ti,DitoTypeColor:ii,DitoTypeComputed:mi,DitoTypeDate:yi,DitoTypeLabel:qi,DitoTypeList:_i,DitoTypeMarkup:Qi,DitoTypeMultiselect:vi,DitoTypeNumber:nl,DitoTypeObject:dl,DitoTypePanel:cl,DitoTypeProgress:ml,DitoTypeRadio:kl,DitoTypeSection:Bl,DitoTypeSelect:Ll,DitoTypeSlider:Rl,DitoTypeSwitch:zl,DitoTypeText:Kl,DitoTypeTextarea:Gl,DitoTypeTreeList:td,DitoTypeUpload:b(md,[["render",pd]])},Symbol.toStringTag,{value:"Module"})),Ut=new Set;function gd(e){Ut.has(e)||(Ut.add(e),console.warn(e))}function bd(e){const t=e?c.isArray(e)?e:Object.entries(e):[];return new URLSearchParams(t.reduce((o,[s,a])=>{for(const i of c.asArray(a))o.push([s,i]);return o},[])).toString().replaceAll(/%(?:21|24|28|29|2C|2F|3A|3B|3D|3F|40)/g,decodeURIComponent)}const yd=["create","created","save","saved","submit","submitted","delete","deleted","edit","edited","clear","cleared","close","closed","cancel","cancelled","drag","dragged","login","logged in"].reduce((e,t)=>(e[t]=t,e),{});class kd{constructor(t,{dito:o={},api:s,views:a={},...i}={}){this.el=t,this.api=s=c.merge({base:"/"},o.api,s),this.options=i,s.locale||(s.locale="en-US"),s.formats=c.merge({},c.defaultFormats,s.formats),s.request||(s.request=d=>$d(s,d)),s.getApiUrl||(s.getApiUrl=d=>Dd(s,d)),s.isApiUrl||(s.isApiUrl=d=>Bd(s,d)),s.normalizePath||(s.normalizePath=s.normalizePaths?c.hyphenate:d=>d),s.denormalizePath||(s.denormalizePath=s.normalizePaths?c.camelize:d=>d),s.defaults||(s.defaults={});const r=T(s.users,{type:"collection"})||{};r.login=T(r.login||"login",{method:"post",parent:r}),r.logout=T(r.logout||"logout",{method:"post",parent:r}),r.session=T(r.session||"session",{method:"get",parent:r}),s.users=r,s.resources={any(d){const h=this[d==null?void 0:d.type]||this.default;return d&&h.call(this,d)},default(d){const h=this.any(d.parent);return h?`${h}/${d.path}`:d.path},collection(d){return this.default(d)},member(d){return`${d.path}/${d.id}`},upload(d){return`${this.collection(d.parent)}/upload/${d.path}`},...s.resources},s.headers={"Content-Type":"application/json",...s.headers},c.isString(t)&&(t=document.querySelector(t));const l=this.app=n.createApp({components:{DitoRoot:Ee,VueNotifications:R,...qr,...fd},provide:{api:s,$verbs:()=>yd,$views:()=>{},$isPopulated:()=>!0,$parentComponent:()=>null,$schemaComponent:()=>null,$schemaParentComponent:()=>null,$routeComponent:()=>null,$dataComponent:()=>null,$sourceComponent:()=>null,$resourceComponent:()=>null,$dialogComponent:()=>null,$panelComponent:()=>null,$tabComponent:()=>null},render:()=>n.h(Ee,{ref:"root",class:o.settings.rootClass,unresolvedViews:a,options:i})});l.use(R,{name:"notify",componentName:"VueNotifications"}),l.use(O.createRouter({routes:[{name:"catch-all",path:"/:_(.*)",components:{}}],history:O.createWebHistory(o.base),linkActiveClass:"",linkExactActiveClass:""})),t.classList.add("dito-app"),l.mount(t)}register(t,o){return D.register(t,o)}}class Cd extends Error{constructor(t){super(`Request failed with status code: ${t.status} (${t.statusText})`),this.response=t}}async function $d(e,{url:t,method:o="get",params:s=null,query:a=s||null,headers:i=null,data:r=null}){var h,u;s&&gd("request.params is deprecated. Use action.method and action.path instead.");const l=e.isApiUrl(t),d=await fetch(e.getApiUrl({url:t,query:a}),{method:o.toUpperCase(),...r&&{body:JSON.stringify(r)},headers:{...l&&e.headers,...i},credentials:l&&((h=e.cors)!=null&&h.credentials)?"include":"same-origin"});if((u=d.headers.get("Content-Type"))!=null&&u.includes("application/json")&&(d.data=await d.json()),!d.ok)throw new Cd(d);return d}function Bd(e,t){return!c.isAbsoluteUrl(t)||t.startsWith(e.url)}function Dd(e,{url:t,query:o}){c.isAbsoluteUrl(t)||(t=wd(e.url,t));const s=bd(o);return s?`${t}?${s}`:t}function wd(e,t){return`${e.replace(/\/+$/,"")}/${t.replace(/^\/+/,"")}`}return kd});
6
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGl0by1hZG1pbi51bWQuanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9hcHBTdGF0ZS5qcyIsIi4uL3NyYy91dGlscy9kYXRhLmpzIiwiLi4vc3JjL0RpdG9Db250ZXh0LmpzIiwiLi4vc3JjL21peGlucy9FbWl0dGVyTWl4aW4uanMiLCIuLi9zcmMvdXRpbHMvdHlwZS5qcyIsIi4uL3NyYy91dGlscy9yZXNvdXJjZS5qcyIsIi4uL3NyYy9taXhpbnMvRGl0b01peGluLmpzIiwiLi4vc3JjL3ZhbGlkYXRpb25zL19jcmVkaXRjYXJkLmpzIiwiLi4vc3JjL3ZhbGlkYXRpb25zL19kZWNpbWFscy5qcyIsIi4uL3NyYy92YWxpZGF0aW9ucy9fZG9tYWluLmpzIiwiLi4vc3JjL3ZhbGlkYXRpb25zL19lbWFpbC5qcyIsIi4uL3NyYy92YWxpZGF0aW9ucy9faG9zdG5hbWUuanMiLCIuLi9zcmMvdmFsaWRhdGlvbnMvX2ludGVnZXIuanMiLCIuLi9zcmMvdmFsaWRhdGlvbnMvX21heC5qcyIsIi4uL3NyYy92YWxpZGF0aW9ucy9fbWluLmpzIiwiLi4vc3JjL3ZhbGlkYXRpb25zL19wYXNzd29yZC5qcyIsIi4uL3NyYy92YWxpZGF0aW9ucy9fcmFuZ2UuanMiLCIuLi9zcmMvdmFsaWRhdGlvbnMvX3JlcXVpcmVkLmpzIiwiLi4vc3JjL3ZhbGlkYXRpb25zL191cmwuanMiLCIuLi9zcmMvbWl4aW5zL1ZhbGlkYXRpb25NaXhpbi5qcyIsIi4uL3NyYy91dGlscy9hY2Nlc3Nvci5qcyIsIi4uL3NyYy9taXhpbnMvVHlwZU1peGluLmpzIiwiLi4vc3JjL3V0aWxzL3VpZC5qcyIsIi4uL3NyYy91dGlscy9TY2hlbWFHcmFwaC5qcyIsIi4uL3NyYy91dGlscy9zY2hlbWEuanMiLCIuLi9zcmMvdXRpbHMvb3B0aW9ucy5qcyIsIi4uL3NyYy9EaXRvQ29tcG9uZW50LmpzIiwiLi4vc3JjL0RpdG9Vc2VyLmpzIiwiLi4vc3JjL21peGlucy9TY2hlbWFQYXJlbnRNaXhpbi5qcyIsIi4uL3NyYy9taXhpbnMvVmFsaWRhdG9yTWl4aW4uanMiLCIuLi9zcmMvbWl4aW5zL1JvdXRlTWl4aW4uanMiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvVmlldy52dWUiLCIuLi8uLi91aS9zcmMvdXRpbHMvZGF0ZS5qcyIsIi4uLy4uL3VpL3NyYy9jb21wb25lbnRzL0NhbGVuZGFyLnZ1ZSIsIi4uLy4uL3VpL3NyYy91dGlscy9ldmVudC5qcyIsIi4uLy4uL3VpL3NyYy9jb21wb25lbnRzL1RyaWdnZXIudnVlIiwiLi4vLi4vdWkvc3JjL2NvbXBvbmVudHMvSW5wdXRGaWVsZC52dWUiLCIuLi8uLi91aS9zcmMvY29tcG9uZW50cy9EYXRlUGlja2VyLnZ1ZSIsIi4uLy4uL3VpL3NyYy91dGlscy9zY3JvbGwuanMiLCIuLi8uLi91aS9zcmMvdXRpbHMvc2VsZWN0aW9uLmpzIiwiLi4vLi4vdWkvc3JjL2NvbXBvbmVudHMvVGltZVBpY2tlci52dWUiLCIuLi8uLi91aS9zcmMvY29tcG9uZW50cy9EYXRlVGltZVBpY2tlci52dWUiLCIuLi8uLi91aS9zcmMvY29tcG9uZW50cy9JY29uLnZ1ZSIsIi4uLy4uL3VpL3NyYy9jb21wb25lbnRzL1BhZ2luYXRpb24udnVlIiwiLi4vLi4vdWkvc3JjL2NvbXBvbmVudHMvU3dpdGNoQnV0dG9uLnZ1ZSIsIi4uLy4uL3VpL3NyYy90cmFuc2l0aW9ucy9UcmFuc2l0aW9uSGVpZ2h0LnZ1ZSIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9AdnVldXNlL2ludGVncmF0aW9ucy91c2VGb2N1c1RyYXAvY29tcG9uZW50Lm1qcyIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9EaWFsb2cudnVlIiwiLi4vc3JjL21peGlucy9Eb21NaXhpbi5qcyIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9Sb290LnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9NZW51LnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9TcGlubmVyLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9IZWFkZXIudnVlIiwiLi4vc3JjL21peGlucy9QdWxsZG93bk1peGluLmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b0FjY291bnQudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b0VsZW1lbnQudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b0xhYmVsLnZ1ZSIsIi4uL3NyYy9taXhpbnMvSXRlbU1peGluLmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b1NjaGVtYS52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvU2NoZW1hSW5saW5lZC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvUGFuZS52dWUiLCIuLi9zcmMvdXRpbHMvbWF0aC5qcyIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9Db250YWluZXIudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b1RhYnMudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b1BhbmVsLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9QYW5lbHMudnVlIiwiLi4vc3JjL3V0aWxzL3Z1ZS5qcyIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9CdXR0b25zLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9FZGl0QnV0dG9ucy52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvQ3JlYXRlQnV0dG9uLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9DbGlwYm9hcmQudnVlIiwiLi4vc3JjL21peGlucy9Mb2FkaW5nTWl4aW4uanMiLCIuLi9zcmMvbWl4aW5zL1Jlc291cmNlTWl4aW4uanMiLCIuLi9zcmMvdXRpbHMvcGF0aC5qcyIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9Gb3JtLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9Gb3JtTmVzdGVkLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9FcnJvcnMudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b1Njb3Blcy52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvUGFnaW5hdGlvbi52dWUiLCIuLi9zcmMvbWl4aW5zL1NvcnRhYmxlTWl4aW4uanMiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvVHJlZUl0ZW0udnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b1RhYmxlSGVhZC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvVGFibGVDZWxsLnZ1ZSIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9AdnVldXNlL2ludGVncmF0aW9ucy91c2VTb3J0YWJsZS9jb21wb25lbnQubWpzIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b0RyYWdnYWJsZS52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvVk5vZGUudnVlIiwiLi4vc3JjL0RpdG9UeXBlQ29tcG9uZW50LmpzIiwiLi4vc3JjL3R5cGVzL0RpdG9UeXBlQnV0dG9uLnZ1ZSIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZUNoZWNrYm94LnZ1ZSIsIi4uL3NyYy9taXhpbnMvRGF0YU1peGluLmpzIiwiLi4vc3JjL21peGlucy9PcHRpb25zTWl4aW4uanMiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVDaGVja2JveGVzLnZ1ZSIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZUNvZGUudnVlIiwiLi4vc3JjL3R5cGVzL0RpdG9UeXBlQ29sb3IudnVlIiwiLi4vc3JjL3R5cGVzL0RpdG9UeXBlQ29tcG9uZW50LnZ1ZSIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZUNvbXB1dGVkLnZ1ZSIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZURhdGUudnVlIiwiLi4vc3JjL21peGlucy9Tb3VyY2VNaXhpbi5qcyIsIi4uL3NyYy91dGlscy9maWx0ZXIuanMiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVMaXN0LnZ1ZSIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZUxhYmVsLnZ1ZSIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZU1hcmt1cC52dWUiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVNdWx0aXNlbGVjdC52dWUiLCIuLi9zcmMvbWl4aW5zL051bWJlck1peGluLmpzIiwiLi4vc3JjL3R5cGVzL0RpdG9UeXBlTnVtYmVyLnZ1ZSIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZU9iamVjdC52dWUiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVQYW5lbC52dWUiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVQcm9ncmVzcy52dWUiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVSYWRpby52dWUiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVTZWN0aW9uLnZ1ZSIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZVNlbGVjdC52dWUiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVTbGlkZXIudnVlIiwiLi4vc3JjL3R5cGVzL0RpdG9UeXBlU3dpdGNoLnZ1ZSIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZVRleHQudnVlIiwiLi4vc3JjL3R5cGVzL0RpdG9UeXBlVGV4dGFyZWEudnVlIiwiLi4vc3JjL3R5cGVzL0RpdG9UeXBlVHJlZUxpc3QudnVlIiwiLi4vc3JjL3V0aWxzL3VuaXRzLmpzIiwiLi4vc3JjL3R5cGVzL0RpdG9UeXBlVXBsb2FkLnZ1ZSIsIi4uL3NyYy91dGlscy9kZXByZWNhdGUuanMiLCIuLi9zcmMvdXRpbHMvcm91dGUuanMiLCIuLi9zcmMvdmVyYnMuanMiLCIuLi9zcmMvRGl0b0FkbWluLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlYWN0aXZlIH0gZnJvbSAndnVlJ1xuXG5leHBvcnQgZGVmYXVsdCByZWFjdGl2ZSh7XG4gIHRpdGxlOiAnJyxcbiAgcm91dGVDb21wb25lbnRzOiBbXSxcbiAgdXNlcjogbnVsbCxcbiAgbG9hZENhY2hlOiB7fSwgLy8gU2VlIFR5cGVNaXhpbi5sb2FkKClcbiAgYWN0aXZlTGFiZWw6IG51bGwsXG4gIGNsaXBib2FyZERhdGE6IG51bGxcbn0pXG4iLCJpbXBvcnQge1xuICBpc0ludGVnZXIsXG4gIHBhcnNlRGF0YVBhdGgsXG4gIGdldFZhbHVlQXREYXRhUGF0aCxcbiAgbm9ybWFsaXplRGF0YVBhdGhcbn0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGVuZERhdGFQYXRoKGRhdGFQYXRoLCB0b2tlbikge1xuICByZXR1cm4gZGF0YVBhdGhcbiAgICA/IGAke2RhdGFQYXRofS8ke3Rva2VufWBcbiAgICA6IHRva2VuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVBhcmVudERhdGFQYXRoKGRhdGFQYXRoKSB7XG4gIGNvbnN0IHBhdGggPSBwYXJzZURhdGFQYXRoKGRhdGFQYXRoKVxuICBwYXRoPy5wb3AoKVxuICByZXR1cm4gcGF0aFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFyZW50RGF0YVBhdGgoZGF0YVBhdGgpIHtcbiAgcmV0dXJuIG5vcm1hbGl6ZURhdGFQYXRoKHBhcnNlUGFyZW50RGF0YVBhdGgoZGF0YVBhdGgpKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VJdGVtRGF0YVBhdGgoZGF0YVBhdGgsIG5lc3RlZCA9IGZhbHNlKSB7XG4gIHJldHVybiBuZXN0ZWQgPyBwYXJzZVBhcmVudERhdGFQYXRoKGRhdGFQYXRoKSA6IHBhcnNlRGF0YVBhdGgoZGF0YVBhdGgpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJdGVtRGF0YVBhdGgoZGF0YVBhdGgsIG5lc3RlZCA9IGZhbHNlKSB7XG4gIHJldHVybiBub3JtYWxpemVEYXRhUGF0aChwYXJzZUl0ZW1EYXRhUGF0aChkYXRhUGF0aCwgbmVzdGVkKSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUGFyZW50SXRlbURhdGFQYXRoKGRhdGFQYXRoLCBuZXN0ZWQgPSBmYWxzZSkge1xuICBjb25zdCBwYXRoID0gcGFyc2VJdGVtRGF0YVBhdGgoZGF0YVBhdGgsIG5lc3RlZClcbiAgaWYgKHBhdGgpIHtcbiAgICAvLyBSZW1vdmUgdGhlIHBhcmVudCB0b2tlbi4gSWYgaXQncyBhIG51bWJlciwgdGhlbiB3ZSdyZSBkZWFsaW5nIHdpdGggYW5cbiAgICAvLyBhcnJheSBhbmQgbmVlZCB0byByZW1vdmUgbW9yZSB0b2tlbnMgdW50aWwgd2UgbWVldCB0aGUgYWN0dWFsIHBhcmVudDpcbiAgICBsZXQgdG9rZW5cbiAgICBkbyB7XG4gICAgICB0b2tlbiA9IHBhdGgucG9wKClcbiAgICB9IHdoaWxlICh0b2tlbiAhPSBudWxsICYmIGlzSW50ZWdlcigrdG9rZW4pKVxuICAgIC8vIElmIHRoZSByZW1vdmVkIHRva2VuIGlzIHZhbGlkLCB3ZSBjYW4gZ2V0IHRoZSBwYXJlbnQgZGF0YTpcbiAgICBpZiAodG9rZW4gIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHBhdGhcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhcmVudEl0ZW1EYXRhUGF0aChkYXRhUGF0aCwgbmVzdGVkID0gZmFsc2UpIHtcbiAgcmV0dXJuIG5vcm1hbGl6ZURhdGFQYXRoKHBhcnNlUGFyZW50SXRlbURhdGFQYXRoKGRhdGFQYXRoLCBuZXN0ZWQpKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SXRlbShyb290SXRlbSwgZGF0YVBhdGgsIG5lc3RlZCA9IGZhbHNlKSB7XG4gIGNvbnN0IHBhdGggPSBwYXJzZUl0ZW1EYXRhUGF0aChkYXRhUGF0aCwgbmVzdGVkKVxuICByZXR1cm4gcGF0aCA/IGdldFZhbHVlQXREYXRhUGF0aChyb290SXRlbSwgcGF0aCkgOiBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYXJlbnRJdGVtKHJvb3RJdGVtLCBkYXRhUGF0aCwgbmVzdGVkID0gZmFsc2UpIHtcbiAgY29uc3QgcGF0aCA9IHBhcnNlUGFyZW50SXRlbURhdGFQYXRoKGRhdGFQYXRoLCBuZXN0ZWQpXG4gIHJldHVybiBwYXRoID8gZ2V0VmFsdWVBdERhdGFQYXRoKHJvb3RJdGVtLCBwYXRoKSA6IG51bGxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExhc3REYXRhUGF0aFRva2VuKGRhdGFQYXRoKSB7XG4gIGNvbnN0IHBhdGggPSBwYXJzZURhdGFQYXRoKGRhdGFQYXRoKVxuICByZXR1cm4gcGF0aFtwYXRoLmxlbmd0aCAtIDFdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXN0RGF0YVBhdGhOYW1lKGRhdGFQYXRoKSB7XG4gIGNvbnN0IHRva2VuID0gZ2V0TGFzdERhdGFQYXRoVG9rZW4oZGF0YVBhdGgpXG4gIHJldHVybiB0b2tlbiA9PSBudWxsIHx8IGlzSW50ZWdlcigrdG9rZW4pID8gbnVsbCA6IHRva2VuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXN0RGF0YVBhdGhJbmRleChkYXRhUGF0aCkge1xuICBjb25zdCB0b2tlbiA9IGdldExhc3REYXRhUGF0aFRva2VuKGRhdGFQYXRoKVxuICBjb25zdCBpbmRleCA9IHRva2VuID09IG51bGwgPyBudWxsIDogK3Rva2VuXG4gIHJldHVybiBpc0ludGVnZXIoaW5kZXgpID8gaW5kZXggOiBudWxsXG59XG5cbmxldCB0ZW1wb3JhcnlJZCA9IDBcbmV4cG9ydCBmdW5jdGlvbiBzZXRUZW1wb3JhcnlJZChkYXRhLCBpZEtleSA9ICdpZCcpIHtcbiAgLy8gVGVtcG9yYXJ5IGlkcyBhcmUgbWFya2VkIHdpdGggYSAnQCcgYXQgdGhlIGJlZ2lubmluZy5cbiAgZGF0YVtpZEtleV0gPSBgQCR7Kyt0ZW1wb3JhcnlJZH1gXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1RlbXBvcmFyeUlkKGlkKSB7XG4gIHJldHVybiAvXkAvLnRlc3QoaWQpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1JlZmVyZW5jZShkYXRhLCBpZEtleSA9ICdpZCcpIHtcbiAgLy8gUmV0dXJucyB0cnVlIGlmIHZhbHVlIGlzIGFuIG9iamVjdCB0aGF0IGhvbGRzIG5vdGhpbmcgbW9yZSB0aGFuIGFuIGlkLlxuICByZXR1cm4gZGF0YT8uW2lkS2V5XSAhPSBudWxsICYmIE9iamVjdC5rZXlzKGRhdGEpLmxlbmd0aCA9PT0gMVxufVxuIiwiaW1wb3J0IHsgdG9SYXcgfSBmcm9tICd2dWUnXG5pbXBvcnQgeyBpc0Z1bmN0aW9uIH0gZnJvbSAnQGRpdG9qcy91dGlscydcbmltcG9ydCB7XG4gIGdldEl0ZW1EYXRhUGF0aCxcbiAgZ2V0UGFyZW50SXRlbURhdGFQYXRoLFxuICBnZXRQYXJlbnRJdGVtLFxuICBnZXRJdGVtLFxuICBnZXRMYXN0RGF0YVBhdGhOYW1lLFxuICBnZXRMYXN0RGF0YVBhdGhJbmRleFxufSBmcm9tICcuL3V0aWxzL2RhdGEuanMnXG5cbmNvbnN0IHsgaGFzT3duUHJvcGVydHkgfSA9IE9iamVjdC5wcm90b3R5cGVcblxuLy8gYERpdG9Db250ZXh0YCBpbnN0YW5jZXMgYXJlIGEgdGhpbiB3cmFwcGVyIGFyb3VuZCByYXcgYGNvbnRleHRgIG9iamVjdHMsXG4vLyB3aGljaCB0aGVtc2VsdmVzIGFjdHVhbGx5IGluaGVyaXQgZnJvbSB0aGUgbGlua2VkIGBjb21wb25lbnRgIGluc3RhbmNlLCBzb1xuLy8gdGhhdCB0aGV5IG9ubHkgbmVlZCB0byBwcm92aWRlIHRoZSB2YWx1ZXMgdGhhdCBzaG91bGQgYmUgZGlmZmVyZW50IHRoYW5cbi8vIGluIHRoZSB1bmRlcmx5aW5nIGNvbXBvbmVudC4gSW4gb3JkZXIgdG8gbm90IGV4cG9zZSBhbGwgZmllbGRzIGZyb20gdGhlXG4vLyBjb21wb25lbnQsIHRoZSB3cmFwcGVyIGlzIGludHJvZHVjZWQ6XG4vLyBVc2UgV2Vha01hcCBmb3IgdGhlIHJhdyBgY29udGV4dGAgb2JqZWN0cywgc28gd2UgZG9uJ3QgaGF2ZSB0byBwb2xsdXRlIHRoZVxuLy8gYWN0dWFsIGBEaXRvQ29udGV4dGAgaW5zdGFuY2Ugd2l0aCBpdC5cbmNvbnN0IGNvbnRleHRzID0gbmV3IFdlYWtNYXAoKVxuXG5mdW5jdGlvbiBnZXQoY29udGV4dCwga2V5LCBkZWZhdWx0VmFsdWUpIHtcbiAgY29uc3Qgb2JqZWN0ID0gY29udGV4dHMuZ2V0KHRvUmF3KGNvbnRleHQpKVxuICBjb25zdCB2YWx1ZSA9IG9iamVjdFtrZXldXG4gIC8vIElmIGBvYmplY3RgIGV4cGxpY2l0bHkgc2V0cyB0aGUga2V5IHRvIGB1bmRlZmluZWRgLCByZXR1cm4gaXQuXG4gIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkIHx8IGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpXG4gICAgPyB2YWx1ZVxuICAgIDogaXNGdW5jdGlvbihkZWZhdWx0VmFsdWUpXG4gICAgICA/IGRlZmF1bHRWYWx1ZSgpXG4gICAgICA6IGRlZmF1bHRWYWx1ZVxufVxuXG5mdW5jdGlvbiBzZXQoY29udGV4dCwga2V5LCB2YWx1ZSkge1xuICBjb250ZXh0cy5nZXQodG9SYXcoY29udGV4dCkpW2tleV0gPSB2YWx1ZVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEaXRvQ29udGV4dCB7XG4gIGNvbnN0cnVjdG9yKGNvbXBvbmVudCwgY29udGV4dCkge1xuICAgIC8vIFVzZSB0aGUgcHJvdmlkZWQgcGFyYW1zIG9iamVjdCAvIGZ1bmN0aW9uLCBvciBjcmVhdGUgYSBuZXcgb25lOlxuICAgIGNvbnRleHQgPSBjb250ZXh0XG4gICAgICA/IGlzRnVuY3Rpb24oY29udGV4dClcbiAgICAgICAgPyBjb250ZXh0KClcbiAgICAgICAgOiB7IC4uLmNvbnRleHQgfVxuICAgICAgOiB7fVxuICAgIC8vIElmIG5vdCBleHBsaWNpdGx5IHNldCAodG8gZmFsc2UpLCBkZWZhdWx0IHRvIHRydWUgc28gd2UgZG9uJ3QgZmFsbCBiYWNrXG4gICAgLy8gdG8gYGNvbXBvbmVudGAgZm9yIGl0cyB2YWx1ZS5cbiAgICBjb250ZXh0Lm5lc3RlZCA/Pz0gdHJ1ZVxuICAgIGNvbnRleHQuY29tcG9uZW50ID0gY29tcG9uZW50XG4gICAgLy8gSGF2ZSBgb2JqZWN0YCBpbmhlcml0IGZyb20gdGhlIGBjb21wb25lbnRgIGluc3RhbmNlLCBzbyBpdCBjYW4gb3ZlcnJpZGVcbiAgICAvLyBpdHMgdmFsdWVzIGFuZCBzdGlsbCByZXRyaWV2ZSBmcm9tIGl0LCBhbmQgYXNzb2NpYXRlIGl0IHdpdGggYHRoaXNgXG4gICAgLy8gdGhyb3VnaCBgY29udGV4dHNgIG1hcDpcbiAgICBjb25zdCBvYmplY3QgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YoY29udGV4dCwgY29tcG9uZW50KVxuICAgIC8vIE5vIG5lZWQgZm9yIGB0b1Jhdyh0aGlzKWAgaGVyZSBhcyBpdCdzIGFsd2F5cyByYXcgaW5zaWRlIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICBjb250ZXh0cy5zZXQodGhpcywgb2JqZWN0KVxuICB9XG5cbiAgc3RhdGljIGdldChjb21wb25lbnQsIGNvbnRleHQpIHtcbiAgICByZXR1cm4gY29udGV4dCBpbnN0YW5jZW9mIERpdG9Db250ZXh0XG4gICAgICA/IGNvbnRleHRcbiAgICAgIDogbmV3IERpdG9Db250ZXh0KGNvbXBvbmVudCwgY29udGV4dClcbiAgfVxuXG4gIC8vIGBuZXN0ZWRgIGlzIGB0cnVlYCB3aGVuIHRoZSBkYXRhLXBhdGggcG9pbnRzIGEgdmFsdWUgaW5zaWRlIGFuIGl0ZW0sIGFuZFxuICAvLyBgZmFsc2VgIHdoZW4gaXQgcG9pbnRzIHRvIHRoZSBpdGVtIGl0c2VsZi5cbiAgZ2V0IG5lc3RlZCgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICduZXN0ZWQnLCB0cnVlKVxuICB9XG5cbiAgZ2V0IHNjaGVtYSgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdzY2hlbWEnLCBudWxsKVxuICB9XG5cbiAgZ2V0IHZhbHVlKCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ3ZhbHVlJywgdW5kZWZpbmVkKVxuICB9XG5cbiAgZ2V0IGRhdGFQYXRoKCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ2RhdGFQYXRoJywgJycpXG4gIH1cblxuICBnZXQgbmFtZSgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICduYW1lJywgKCkgPT4gZ2V0TGFzdERhdGFQYXRoTmFtZSh0aGlzLmRhdGFQYXRoKSlcbiAgfVxuXG4gIGdldCBpbmRleCgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdpbmRleCcsICgpID0+IGdldExhc3REYXRhUGF0aEluZGV4KHRoaXMuZGF0YVBhdGgpKVxuICB9XG5cbiAgZ2V0IGl0ZW1EYXRhUGF0aCgpIHtcbiAgICByZXR1cm4gZ2V0SXRlbURhdGFQYXRoKHRoaXMuZGF0YVBhdGgsIHRoaXMubmVzdGVkKVxuICB9XG5cbiAgZ2V0IHBhcmVudEl0ZW1EYXRhUGF0aCgpIHtcbiAgICByZXR1cm4gZ2V0UGFyZW50SXRlbURhdGFQYXRoKHRoaXMuZGF0YVBhdGgsIHRoaXMubmVzdGVkKVxuICB9XG5cbiAgZ2V0IGl0ZW1JbmRleCgpIHtcbiAgICByZXR1cm4gZ2V0TGFzdERhdGFQYXRoSW5kZXgodGhpcy5pdGVtRGF0YVBhdGgpXG4gIH1cblxuICBnZXQgcGFyZW50SXRlbUluZGV4KCkge1xuICAgIHJldHVybiBnZXRMYXN0RGF0YVBhdGhJbmRleCh0aGlzLnBhcmVudEl0ZW1EYXRhUGF0aClcbiAgfVxuXG4gIC8vIE5PVEU6IFdoaWxlIGludGVybmFsbHksIHdlIHNwZWFrIG9mIGBkYXRhYCwgaW4gdGhlIEFQSSBzdXJmYWNlIHRoZVxuICAvLyB0ZXJtIGBpdGVtYCBpcyB1c2VkIGZvciB0aGUgZGF0YSB0aGF0IHJlbGF0ZXMgdG8gZWRpdGluZyBvYmplY3RzOlxuICAvLyBJZiBgZGF0YWAgaXNuJ3QgcHJvdmlkZWQsIHdlIGNhbiBkZXRlcm1pbmUgaXQgZnJvbSByb290RGF0YSAmIGRhdGFQYXRoOlxuICBnZXQgaXRlbSgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdkYXRhJywgKCkgPT5cbiAgICAgIGdldEl0ZW0odGhpcy5yb290SXRlbSwgdGhpcy5kYXRhUGF0aCwgdGhpcy5uZXN0ZWQpXG4gICAgKVxuICB9XG5cbiAgLy8gTk9URTogYHBhcmVudEl0ZW1gIGlzbid0IHRoZSBjbG9zZXN0IGRhdGEgcGFyZW50IHRvIGBpdGVtYCwgaXQncyB0aGVcbiAgLy8gY2xvc2VzdCBwYXJlbnQgdGhhdCBpc24ndCBhbiBhcnJheSwgZS5nLiBmb3IgcmVsYXRpb25zIG9yIG5lc3RlZCBKU09OIGRhdGEuXG4gIC8vIFRoaXMgaXMgd2h5IHRoZSB0ZXJtIGBpdGVtYCB3YXMgY2hvc2VuIG92ZXIgYGRhdGFgLCBlLmcuIFZTIHRoZSB1c2Ugb2ZcbiAgLy8gYHBhcmVudERhdGFgIGluIHNlcnZlci1zaWRlZCB2YWxpZGF0aW9uLCB3aGljaCBpcyB0aGUgY2xvc2VzdCBwYXJlbnQuIElmXG4gIC8vIG5lZWRlZCwgd2UgY291bGQgZXhwb3NlIHRoaXMgZGF0YSBoZXJlIHRvbywgYXMgd2UgY2FuIGRvIGFsbCBzb3J0cyBvZiBkYXRhXG4gIC8vIHByb2Nlc3Npbmcgd2l0aCBgcm9vdERhdGFgIGFuZCBgZGF0YVBhdGhgLlxuICBnZXQgcGFyZW50SXRlbSgpIHtcbiAgICBjb25zdCBpdGVtID0gKFxuICAgICAgZ2V0UGFyZW50SXRlbSh0aGlzLnJvb3RJdGVtLCB0aGlzLmRhdGFQYXRoLCB0aGlzLm5lc3RlZCkgfHxcbiAgICAgIG51bGxcbiAgICApXG4gICAgcmV0dXJuIGl0ZW0gIT09IHRoaXMuaXRlbSA/IGl0ZW0gOiBudWxsXG4gIH1cblxuICBnZXQgcm9vdEl0ZW0oKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAncm9vdERhdGEnLCBudWxsKVxuICB9XG5cbiAgZ2V0IHByb2Nlc3NlZEl0ZW0oKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAncHJvY2Vzc2VkRGF0YScsIG51bGwpXG4gIH1cblxuICBnZXQgY2xpcGJvYXJkSXRlbSgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdjbGlwYm9hcmREYXRhJywgbnVsbClcbiAgfVxuXG4gIGdldCB1c2VyKCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ3VzZXInLCBudWxsKVxuICB9XG5cbiAgZ2V0IGFwaSgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdhcGknLCBudWxsKVxuICB9XG5cbiAgZ2V0IHZpZXdzKCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ3ZpZXdzJywgbnVsbClcbiAgfVxuXG4gIGdldCBpdGVtTGFiZWwoKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAnaXRlbUxhYmVsJywgbnVsbClcbiAgfVxuXG4gIGdldCBmb3JtTGFiZWwoKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAnZm9ybUxhYmVsJywgbnVsbClcbiAgfVxuXG4gIC8vIE5PVEU6IExpa2UgJ29wdGlvbnMnLCB0aGUgYXNzb2NpYXRlZCBjb21wb25lbnQgZG9lc24ndCBhbHdheXMgZXhpc3QsIGUuZy5cbiAgLy8gaW4gbmVzdGVkIGZvcm1zIGR1cmluZyBgcHJvY2Vzc0RhdGEoKWAuIEJ1dCBgc2NoZW1hYCBpcyBndWFyYW50ZWVkIHRvXG4gIC8vIGFsd2F5cyBiZSBhdmFpbGFibGUuXG4gIGdldCBjb21wb25lbnQoKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAnY29tcG9uZW50JywgbnVsbClcbiAgfVxuXG4gIC8vIFRPRE86IEFkZCBgY29tcG9uZW50U2NoZW1hYCBnZXR0ZXIgZm9yIHRoZSBzY2hlbWEgb2YgdGhlIGN1cnJlbnQgY29tcG9uZW50LFxuICAvLyBldmVuIHdoZW4gdGhlIGNvbXBvbmVudCBpc24ndCBhY3R1YWxseSBpbnN0YW50aWF0ZWQuIENvbnNpZGVyIGFkZGluZ1xuICAvLyBgc291cmNlU2NoZW1hYCBhcyB3ZWxsP1xuXG4gIC8vIFRPRE86IEZpeCB1bmNsZWFyIG5hbWluZzogV2hpY2ggc2NoZW1hIGlzIHRoaXMsIHRoYXQgb2YgdGhlIGNvbXBvbmVudCBvciBvZlxuICAvLyBpdHMgcGFyZW50PyBJc24ndCBleHBvc2luZyBgZm9ybUNvbXBvbmVudGAgYW5kIGB2aWV3Q29tcG9uZW50YCBlbm91Z2gsIG9uY2VcbiAgLy8gd2Ugb2ZmZXIgYWNjZXNzIHRvIHRoZWlyIGNvbXBvbmVudHMgdGhlcmUgdGhyb3VnaCBgZ2V0Q29tcG9uZW50KClgICYgY28uIG9uXG4gIC8vIGBEaXRvTWl4aW5gIHBlcmhhcHM/ICBBbHNvLCB0aGVyZSBjb3VsZCBiZSBhIGB0YWJDb21wb25lbnRgIGdldHRlciBmb3JcbiAgLy8gc2NoZW1hcyBpbiB0YWJzP1xuICBnZXQgc2NoZW1hQ29tcG9uZW50KCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ3NjaGVtYUNvbXBvbmVudCcsIG51bGwpXG4gIH1cblxuICBnZXQgZm9ybUNvbXBvbmVudCgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdmb3JtQ29tcG9uZW50JywgbnVsbClcbiAgfVxuXG4gIGdldCB2aWV3Q29tcG9uZW50KCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ3ZpZXdDb21wb25lbnQnLCBudWxsKVxuICB9XG5cbiAgZ2V0IGRpYWxvZ0NvbXBvbmVudCgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdkaWFsb2dDb21wb25lbnQnLCBudWxsKVxuICB9XG5cbiAgZ2V0IHBhbmVsQ29tcG9uZW50KCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ3BhbmVsQ29tcG9uZW50JywgbnVsbClcbiAgfVxuXG4gIGdldCByZXNvdXJjZUNvbXBvbmVudCgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdyZXNvdXJjZUNvbXBvbmVudCcsIG51bGwpXG4gIH1cblxuICBnZXQgc291cmNlQ29tcG9uZW50KCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ3NvdXJjZUNvbXBvbmVudCcsIG51bGwpXG4gIH1cblxuICAvLyBXaGVuIHVzZWQgaW4gT3B0aW9uc01peGluIGZvciBgc2NoZW1hLm9wdGlvbnMudmFsdWUoKWAsXG4gIC8vIGBzY2hlbWEub3B0aW9ucy5sYWJlbCgpYCBhbmQgIGBzY2hlbWEuc2VhcmNoLmZpbHRlcigpYCBjYWxsYmFja3M6XG4gIGdldCBvcHRpb24oKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAnb3B0aW9uJywgdW5kZWZpbmVkKVxuICB9XG5cbiAgZ2V0IG9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAnb3B0aW9ucycsIHVuZGVmaW5lZClcbiAgfVxuXG4gIC8vIFRPRE86IFJlbmFtZSB0aGlzIHRvIGBzZWFyY2hUZXJtYCBvciBgc2VhcmNoUXVlcnlgLCB0byBwZXJoYXBzIGZyZWUgYHF1ZXJ5YFxuICAvLyBmb3IgdGhlIGFjdHVhbCBgcmVzb3VyY2VDb21wb25lbnQucXVlcnlgIG9iamVjdD9cbiAgZ2V0IHF1ZXJ5KCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ3F1ZXJ5JywgdW5kZWZpbmVkKVxuICB9XG5cbiAgLy8gVGhlIGVycm9yIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIGluIHRoZSBjb250ZXh0IG9mIGJ1dHRvbnMgdGhhdCBzZW5kXG4gIC8vIHJlcXVlc3RzLCBzZWUgYFJlc291cmNlTWl4aW4uZW1pdEJ1dHRvbkV2ZW50KClgOlxuICBnZXQgZXJyb3IoKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAnZXJyb3InLCB1bmRlZmluZWQpXG4gIH1cblxuICBnZXQgd2FzTm90aWZpZWQoKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAnd2FzTm90aWZpZWQnLCBmYWxzZSlcbiAgfVxuXG4gIC8vIEhlbHBlciBNZXRob2RzXG5cbiAgZ2V0IHJlcXVlc3QoKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMgPT4gdGhpcy5jb21wb25lbnQucmVxdWVzdChvcHRpb25zKVxuICB9XG5cbiAgZ2V0IGZvcm1hdCgpIHtcbiAgICByZXR1cm4gKHZhbHVlLCBvcHRpb25zKSA9PiB0aGlzLmNvbXBvbmVudC5mb3JtYXQodmFsdWUsIG9wdGlvbnMpXG4gIH1cblxuICBnZXQgbmF2aWdhdGUoKSB7XG4gICAgcmV0dXJuIGxvY2F0aW9uID0+IHRoaXMuY29tcG9uZW50Lm5hdmlnYXRlKGxvY2F0aW9uKVxuICB9XG5cbiAgZ2V0IGRvd25sb2FkKCkge1xuICAgIHJldHVybiBvcHRpb25zID0+IHRoaXMuY29tcG9uZW50LmRvd25sb2FkKG9wdGlvbnMpXG4gIH1cblxuICBnZXQgZ2V0UmVzb3VyY2VVcmwoKSB7XG4gICAgcmV0dXJuIHJlc291cmNlID0+IHRoaXMuY29tcG9uZW50LmdldFJlc291cmNlVXJsKHJlc291cmNlKVxuICB9XG5cbiAgZ2V0IG5vdGlmeSgpIHtcbiAgICByZXR1cm4gb3B0aW9ucyA9PiB7XG4gICAgICB0aGlzLmNvbXBvbmVudC5ub3RpZnkob3B0aW9ucylcbiAgICAgIHNldCh0aGlzLCAnd2FzTm90aWZpZWQnLCB0cnVlKVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNBcnJheSwgaXNQbGFpbk9iamVjdCB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCB7XG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxpc3RlbmVyczogbnVsbFxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgLy8gQXN5bmMgb24oKSBhbmQgJG9mZigpIG1ldGhvZHMgdGhhdCBrZWVwIHRyYWNrIG9mIHRoZSBldmVudHMgYWRkZWQgL1xuICAgIC8vIHJlbW92ZWQsIGFuZCBwcm92aWRlIGEgaGFzTGlzdGVuZXJzKCkgbWV0aG9kIHRoYXQgY2hlY2tzIGlmIHRoZSBjb21wb25lbnRcbiAgICAvLyBoYXMgbGlzdGVuZXJzIGZvciBhIGdpdmVuIGV2ZW50LlxuXG4gICAgLy8gQWxzbyBhZGRzIHByb3BlciBoYW5kbGluZyBvZiBhc3luYyBldmVudHMsIGluY2x1ZGluZyBhIGFzeW5jIGVtaXQoKSB0aGF0XG4gICAgLy8gZGVhbHMgd2l0aCBwcm9wZXIgZXZlbnQgcXVldWVpbmcuXG4gICAgb24oZXZlbnQsIGNhbGxiYWNrKSB7XG4gICAgICBpZiAoaXNBcnJheShldmVudCkpIHtcbiAgICAgICAgZm9yIChjb25zdCBldiBvZiBldmVudCkge1xuICAgICAgICAgIHRoaXMub24oZXYsIGNhbGxiYWNrKVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QoZXZlbnQpKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGV2ZW50KSB7XG4gICAgICAgICAgdGhpcy5vbihrZXksIGV2ZW50W2tleV0pXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGxpc3RlbmVycyA9ICh0aGlzLmxpc3RlbmVycyB8fD0gT2JqZWN0LmNyZWF0ZShudWxsKSlcbiAgICAgICAgY29uc3QgeyBjYWxsYmFja3MgfSA9IChsaXN0ZW5lcnNbZXZlbnRdIHx8PSB7XG4gICAgICAgICAgY2FsbGJhY2tzOiBbXSxcbiAgICAgICAgICBxdWV1ZTogW11cbiAgICAgICAgfSlcbiAgICAgICAgY2FsbGJhY2tzLnB1c2goY2FsbGJhY2spXG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH0sXG5cbiAgICBvbmNlKGV2ZW50LCBjYWxsYmFjaykge1xuICAgICAgY29uc3Qgb24gPSAoLi4uYXJncykgPT4ge1xuICAgICAgICB0aGlzLm9mZihldmVudCwgb24pXG4gICAgICAgIHJldHVybiBjYWxsYmFjay5hcHBseSh0aGlzLCBhcmdzKVxuICAgICAgfVxuICAgICAgb24uY2FsbGJhY2sgPSBjYWxsYmFjayAvLyBOZWVkZWQgZm9yIGBvZmYoKWAsIHNlZSBiZWxvdy5cbiAgICAgIHJldHVybiB0aGlzLm9uKGV2ZW50LCBvbilcbiAgICB9LFxuXG4gICAgb2ZmKGV2ZW50LCBjYWxsYmFjaykge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAgIC8vIFJlbW92ZSBhbGwgZXZlbnRzXG4gICAgICAgIGRlbGV0ZSB0aGlzLmxpc3RlbmVyc1xuICAgICAgfSBlbHNlIGlmIChpc0FycmF5KGV2ZW50KSkge1xuICAgICAgICBmb3IgKGNvbnN0IGV2IG9mIGV2ZW50KSB7XG4gICAgICAgICAgdGhpcy5vZmYoZXYsIGNhbGxiYWNrKVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QoZXZlbnQpKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGV2ZW50KSB7XG4gICAgICAgICAgdGhpcy5vZmYoa2V5LCBldmVudFtrZXldKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBSZW1vdmUgc3BlY2lmaWMgZXZlbnRcbiAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmxpc3RlbmVycz8uW2V2ZW50XVxuICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICBpZiAoIWNhbGxiYWNrKSB7XG4gICAgICAgICAgICAvLyBSZW1vdmUgYWxsIGhhbmRsZXJzIGZvciB0aGlzIGV2ZW50XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5saXN0ZW5lcnNbZXZlbnRdXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFJlbW92ZSBhIHNwZWNpZmljIGhhbmRsZXI6IGZpbmQgdGhlIGluZGV4IGluIGNhbGxiYWNrc1xuICAgICAgICAgICAgY29uc3QgeyBjYWxsYmFja3MgfSA9IGVudHJ5XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IGNhbGxiYWNrcy5maW5kSW5kZXgoXG4gICAgICAgICAgICAgIC8vIE1hdGNoIGBjYi5jYWxsYmFja2AgYWxzbywgYXMgdXNlZCBieSBgb25jZSgpYCwgc2VlICBhYm92ZTpcbiAgICAgICAgICAgICAgY2IgPT4gY2IgPT09IGNhbGxiYWNrIHx8IGNiLmNhbGxiYWNrID09PSBjYWxsYmFja1xuICAgICAgICAgICAgKVxuICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICBjYWxsYmFja3Muc3BsaWNlKGluZGV4LCAxKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9LFxuXG4gICAgZW1pdChldmVudCwgLi4uYXJncykge1xuICAgICAgLy8gT25seSBxdWV1ZSBldmVudCBpZiB0aGVyZSBhY3R1YWxseSBhcmUgbGlzdGVuZXJzIGZvciBpdC5cbiAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5saXN0ZW5lcnM/LltldmVudF1cbiAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICBjb25zdCB7IHF1ZXVlLCBjYWxsYmFja3MgfSA9IGVudHJ5XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICBjb25zdCBuZXh0ID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgLy8gRW1pdCB0aGUgbmV4dCBldmVudCBpbiB0aGUgcXVldWUgd2l0aCBpdHMgcGFyYW1zLlxuICAgICAgICAgICAgLy8gTm90ZSB0aGF0IGl0IG9ubHkgZ2V0cyByZW1vdmVkIG9uY2UgYG5leHQoKWAgaXMgY2FsbGVkLlxuICAgICAgICAgICAgY29uc3QgZW50cnkgPSBxdWV1ZS5zaGlmdCgpXG4gICAgICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICAgICAgbGV0IHJlc3VsdFxuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNhbGxiYWNrIG9mIGNhbGxiYWNrcykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBjYWxsYmFjay5hcHBseSh0aGlzLCBlbnRyeS5hcmdzKVxuICAgICAgICAgICAgICAgICAgaWYgKHJlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgRXJyb3IgZHVyaW5nIGV2ZW50IGhhbmRsZXIgZm9yICcke2V2ZW50fSc6YCxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gUmVzb2x2ZSB0aGUgcHJvbWlzZSB0aGF0IHdhcyBhZGRlZCB0byB0aGUgcXVldWUgZm9yIHRoZSBldmVudFxuICAgICAgICAgICAgICAvLyB0aGF0IHdhcyBqdXN0IGNvbXBsZXRlZCBieSB0aGUgd3JhcHBlciB0aGF0IGNhbGxlZCBgbmV4dCgpYFxuICAgICAgICAgICAgICBlbnRyeS5yZXNvbHZlKHJlc3VsdClcbiAgICAgICAgICAgICAgbmV4dCgpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHF1ZXVlLnB1c2goeyBhcmdzLCByZXNvbHZlIH0pXG4gICAgICAgICAgLy8gRm9yIG5ldyBxdWV1ZXMgKD0gb25seSBvbmUgZW50cnkpIGVtaXQgdGhlIGZpcnN0IGV2ZW50IGltbWVkaWF0ZWx5LFxuICAgICAgICAgIC8vIHRvIGdldCB0aGUgcXVldWUgcnVubmluZy5cbiAgICAgICAgICBpZiAocXVldWUubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBuZXh0KClcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSxcblxuICAgIC8vIENoZWNrcyBpZiB0aGUgY29tcG9uZW50IGhhcyBsaXN0ZW5lcnMgZm9yIGEgZ2l2ZW4gZXZlbnQgdHlwZTpcbiAgICBoYXNMaXN0ZW5lcnMoZXZlbnQpIHtcbiAgICAgIGlmIChpc0FycmF5KGV2ZW50KSkge1xuICAgICAgICBmb3IgKGNvbnN0IGV2IG9mIGV2ZW50KSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmhhc0xpc3RlbmVycyhldikpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXZlbnQubGVuZ3RoID4gMFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5saXN0ZW5lcnM/LltldmVudF1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZGVsZWdhdGUoZXZlbnQsIHRhcmdldCkge1xuICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICBpZiAoaXNBcnJheShldmVudCkpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGV2IG9mIGV2ZW50KSB7XG4gICAgICAgICAgICB0aGlzLmRlbGVnYXRlKGV2LCB0YXJnZXQpXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMub24oZXZlbnQsICguLi5hcmdzKSA9PiB0YXJnZXQuZW1pdChldmVudCwgLi4uYXJncykpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQge1xuICBpc0FycmF5LFxuICBpc09iamVjdCxcbiAgaXNTdHJpbmcsXG4gIGlzQm9vbGVhbixcbiAgaXNOdW1iZXIsXG4gIGlzRnVuY3Rpb24sXG4gIGlzRGF0ZSxcbiAgaXNSZWdFeHAsXG4gIGFzQXJyYXlcbn0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuY29uc3QgdHlwZUNoZWNrZXJzID0ge1xuICBCb29sZWFuOiBpc0Jvb2xlYW4sXG4gIE51bWJlcjogaXNOdW1iZXIsXG4gIFN0cmluZzogaXNTdHJpbmcsXG4gIERhdGU6IGlzRGF0ZSxcbiAgQXJyYXk6IGlzQXJyYXksXG4gIE9iamVjdDogaXNPYmplY3QsXG4gIFJlZ0V4cDogaXNSZWdFeHAsXG4gIEZ1bmN0aW9uOiBpc0Z1bmN0aW9uXG59XG5cbi8vIERlY2xhcmUgdGhlc2Ugc2VwYXJhdGVseSBmcm9tIHRoZSBgdHlwZUNvbnZlcnRlcnNgIG9iamVjdCwgdG8gcHJldmVudFxuLy8gQmFiZWwgaXNzdWVzIHdpdGggYE9iamVjdGAgb3ZlcnJpZGluZyB0aGUgZ2xvYmFsIGBPYmplY3RgOlxuY29uc3QgdG9Cb29sZWFuID0gdmFsdWUgPT4gISF2YWx1ZVxuY29uc3QgdG9OdW1iZXIgPSB2YWx1ZSA9PiArdmFsdWVcbmNvbnN0IHRvU3RyaW5nID0gdmFsdWUgPT4gU3RyaW5nKHZhbHVlKVxuXG5jb25zdCB0b0RhdGUgPSB2YWx1ZSA9PlxuICBpc0RhdGUodmFsdWUpXG4gICAgPyB2YWx1ZVxuICAgIDogbmV3IERhdGUodmFsdWUpXG5cbmNvbnN0IHRvQXJyYXkgPSB2YWx1ZSA9PlxuICBpc0FycmF5KHZhbHVlKVxuICAgID8gdmFsdWVcbiAgICA6IGlzU3RyaW5nKHZhbHVlKVxuICAgICAgPyB2YWx1ZS5zcGxpdCgnLCcpXG4gICAgICA6IGFzQXJyYXkodmFsdWUpXG5cbmNvbnN0IHRvT2JqZWN0ID0gdmFsdWUgPT5cbiAgaXNPYmplY3QodmFsdWUpXG4gICAgPyB2YWx1ZVxuICAgIDogLy8gSWYgYSBPYmplY3QgaXMgZXhwZWN0ZWQgYnV0IGEgQm9vbGVhbiBwcm92aWRlLCBjb252ZXJ0IHRvIGFuIGVtcHR5XG4gICAgICAvLyBvYmplY3QuIFVzZWQgYnkgYGNyZWF0YWJsZWAgJiBjbywgdGhhdCBjYW4gYmUgYm90aC5cbiAgICAgIHZhbHVlID09PSB0cnVlXG4gICAgICA/IHt9XG4gICAgICA6IG51bGxcblxuY29uc3QgdG9SZWdFeHAgPSB2YWx1ZSA9PlxuICBpc1JlZ0V4cCh2YWx1ZSlcbiAgICA/IHZhbHVlXG4gICAgOiBuZXcgUmVnRXhwKHZhbHVlKVxuXG5jb25zdCB0eXBlQ29udmVydGVycyA9IHtcbiAgQm9vbGVhbjogdG9Cb29sZWFuLFxuICBOdW1iZXI6IHRvTnVtYmVyLFxuICBTdHJpbmc6IHRvU3RyaW5nLFxuICBEYXRlOiB0b0RhdGUsXG4gIEFycmF5OiB0b0FycmF5LFxuICBPYmplY3Q6IHRvT2JqZWN0LFxuICBSZWdFeHA6IHRvUmVnRXhwXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc01hdGNoaW5nVHlwZSh0eXBlcywgdmFsdWUpIHtcbiAgLy8gU2VlIGlmIGFueSBvZiB0aGUgZXhwZWN0IHR5cGVzIG1hdGNoLCByZXR1cm4gaW1tZWRpYXRlbHkgaWYgdGhleSBkbzpcbiAgaWYgKHR5cGVzICYmIHZhbHVlICE9IG51bGwpIHtcbiAgICBmb3IgKGNvbnN0IHR5cGUgb2YgdHlwZXMpIHtcbiAgICAgIGlmICh0eXBlQ2hlY2tlcnNbdHlwZS5uYW1lXT8uKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRUeXBlKHR5cGUsIHZhbHVlKSB7XG4gIGNvbnN0IGNvbnZlcnRlciA9IHR5cGUgJiYgdHlwZUNvbnZlcnRlcnNbdHlwZS5uYW1lIHx8IHR5cGVdXG4gIHJldHVybiBjb252ZXJ0ZXIgPyBjb252ZXJ0ZXIodmFsdWUpIDogdmFsdWVcbn1cbiIsImltcG9ydCB7IGlzT2JqZWN0LCBpc1N0cmluZywgcGlja0J5IH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuZXhwb3J0IGZ1bmN0aW9uIGhhc1Jlc291cmNlKHNjaGVtYSkge1xuICByZXR1cm4gISFnZXRSZXNvdXJjZShzY2hlbWEucmVzb3VyY2UpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZXNvdXJjZShyZXNvdXJjZSwgZGVmYXVsdHMgPSB7fSkge1xuICBjb25zdCB7IHBhcmVudCwgLi4uZGVmcyB9ID0gZGVmYXVsdHNcbiAgcmVzb3VyY2UgPSBpc09iamVjdChyZXNvdXJjZSlcbiAgICA/IHsgLi4uZGVmcywgLi4ucmVzb3VyY2UgfVxuICAgIDogaXNTdHJpbmcocmVzb3VyY2UpXG4gICAgICA/IHsgLi4uZGVmcywgcGF0aDogcmVzb3VyY2UgfVxuICAgICAgOiBudWxsXG4gIC8vIE9ubHkgc2V0IHBhcmVudCBpZiBwYXRoIGRvZXNuJ3Qgc3RhcnQgd2l0aCAnLycsIHNvIHJlbGF0aXZlIFVSTHMgYXJlXG4gIC8vIGRlYWx0IHdpdGggY29ycmVjdGx5LlxuICBpZiAoXG4gICAgcmVzb3VyY2UgJiZcbiAgICBwYXJlbnQgIT09IHVuZGVmaW5lZCAmJlxuICAgIHJlc291cmNlLnBhcmVudCA9PT0gdW5kZWZpbmVkICYmXG4gICAgIXJlc291cmNlLnBhdGg/LnN0YXJ0c1dpdGgoJy8nKVxuICApIHtcbiAgICByZXNvdXJjZS5wYXJlbnQgPSBwYXJlbnRcbiAgICBpZiAoIXJlc291cmNlLnBhdGgpIHtcbiAgICAgIHJlc291cmNlLnBhdGggPSAnLidcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc291cmNlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNZW1iZXJSZXNvdXJjZShpZCwgcmVzb3VyY2UpIHtcbiAgcmV0dXJuIGlkICE9IG51bGwgJiYgcmVzb3VyY2U/LnR5cGUgPT09ICdjb2xsZWN0aW9uJ1xuICAgID8ge1xuICAgICAgICB0eXBlOiAnbWVtYmVyJyxcbiAgICAgICAgLi4ucGlja0J5KFxuICAgICAgICAgIHJlc291cmNlLFxuICAgICAgICAgICh2YWx1ZSwga2V5KSA9PiBbJ21ldGhvZCcsICdwYXRoJywgJ3BhcmVudCddLmluY2x1ZGVzKGtleSlcbiAgICAgICAgKSxcbiAgICAgICAgaWQ6IGAke2lkfWBcbiAgICAgIH1cbiAgICA6IG51bGxcbn1cbiIsImltcG9ydCB7XG4gIGlzT2JqZWN0LFxuICBpc0FycmF5LFxuICBpc1N0cmluZyxcbiAgaXNGdW5jdGlvbixcbiAgYXNBcnJheSxcbiAgZXF1YWxzLFxuICBnZXRWYWx1ZUF0RGF0YVBhdGgsXG4gIGxhYmVsaXplLFxuICBoeXBoZW5hdGUsXG4gIGZvcm1hdFxufSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IGFwcFN0YXRlIGZyb20gJy4uL2FwcFN0YXRlLmpzJ1xuaW1wb3J0IERpdG9Db250ZXh0IGZyb20gJy4uL0RpdG9Db250ZXh0LmpzJ1xuaW1wb3J0IEVtaXR0ZXJNaXhpbiBmcm9tICcuL0VtaXR0ZXJNaXhpbi5qcydcbmltcG9ydCB7IGlzTWF0Y2hpbmdUeXBlLCBjb252ZXJ0VHlwZSB9IGZyb20gJy4uL3V0aWxzL3R5cGUuanMnXG5pbXBvcnQgeyBnZXRSZXNvdXJjZSwgZ2V0TWVtYmVyUmVzb3VyY2UgfSBmcm9tICcuLi91dGlscy9yZXNvdXJjZS5qcydcbmltcG9ydCB7IHJlYWN0aXZlIH0gZnJvbSAndnVlJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQge1xuICBtaXhpbnM6IFtFbWl0dGVyTWl4aW5dLFxuXG4gIGluamVjdDogW1xuICAgICdhcGknLFxuICAgICckdmVyYnMnLFxuICAgICckdmlld3MnLFxuICAgICckaXNQb3B1bGF0ZWQnLFxuICAgICckcGFyZW50Q29tcG9uZW50JyxcbiAgICAnJHNjaGVtYUNvbXBvbmVudCcsXG4gICAgJyRyb3V0ZUNvbXBvbmVudCcsXG4gICAgJyRkYXRhQ29tcG9uZW50JyxcbiAgICAnJHNvdXJjZUNvbXBvbmVudCcsXG4gICAgJyRyZXNvdXJjZUNvbXBvbmVudCcsXG4gICAgJyRkaWFsb2dDb21wb25lbnQnLFxuICAgICckcGFuZWxDb21wb25lbnQnLFxuICAgICckdGFiQ29tcG9uZW50J1xuICBdLFxuXG4gIHByb3ZpZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvdmlkZXNEYXRhXG4gICAgICA/IHtcbiAgICAgICAgICAkcGFyZW50Q29tcG9uZW50OiAoKSA9PiB0aGlzLFxuICAgICAgICAgICRkYXRhQ29tcG9uZW50OiAoKSA9PiB0aGlzXG4gICAgICAgIH1cbiAgICAgIDoge1xuICAgICAgICAgICRwYXJlbnRDb21wb25lbnQ6ICgpID0+IHRoaXNcbiAgICAgICAgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFwcFN0YXRlLFxuICAgICAgb3ZlcnJpZGVzOiBudWxsIC8vIFNlZSBhY2Nlc3Nvci5qc1xuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIHByb3ZpZGVzRGF0YSgpIHtcbiAgICAgIC8vIE5PVEU6IFRoaXMgaXMgb3ZlcnJpZGRlbiBpbiBSZXNvdXJjZU1peGluLCB1c2VkIGJ5IGxpc3RzLlxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSxcblxuICAgIHNvdXJjZVNjaGVtYSgpIHtcbiAgICAgIHJldHVybiB0aGlzLm1ldGE/LnNjaGVtYVxuICAgIH0sXG5cbiAgICB1c2VyKCkge1xuICAgICAgcmV0dXJuIGFwcFN0YXRlLnVzZXJcbiAgICB9LFxuXG4gICAgLy8gJHZlcmJzLCAkdmVyYnMgYW5kICRpc1BvcHVsYXRlZCBhcmUgZGVmaW5lZCBhcyBmdW5jdGlvbnMsIHRvIHByZXNlcnZlXG4gICAgLy8gcmVhY3RpdmVuZXNzIGFjcm9zcyBwcm92aWRlL2luamVjdC5cbiAgICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS92dWVqcy92dWUvaXNzdWVzLzcwMTcjaXNzdWVjb21tZW50LTQ4MDkwNjY5MVxuICAgIHZlcmJzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuJHZlcmJzKClcbiAgICB9LFxuXG4gICAgdmlld3MoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kdmlld3MoKVxuICAgIH0sXG5cbiAgICBpc1BvcHVsYXRlZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLiRpc1BvcHVsYXRlZCgpXG4gICAgfSxcblxuICAgIGxvY2FsZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmFwaS5sb2NhbGVcbiAgICB9LFxuXG4gICAgY29udGV4dCgpIHtcbiAgICAgIHJldHVybiBuZXcgRGl0b0NvbnRleHQodGhpcywgeyBuZXN0ZWQ6IGZhbHNlIH0pXG4gICAgfSxcblxuICAgIHJvb3RDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kcm9vdC4kcmVmcy5yb290XG4gICAgfSxcblxuICAgIC8vIFVzZSBjb21wdXRlZCBwcm9wZXJ0aWVzIGFzIGxpbmtzIHRvIGluamVjdHMsIHNvIERpdG9TY2hlbWEgY2FuXG4gICAgLy8gb3ZlcnJpZGUgdGhlIHByb3BlcnR5IGFuZCByZXR1cm4gYHRoaXNgIGluc3RlYWQgb2YgdGhlIHBhcmVudC5cbiAgICBwYXJlbnRDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kcGFyZW50Q29tcG9uZW50KClcbiAgICB9LFxuXG4gICAgc2NoZW1hQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMuJHNjaGVtYUNvbXBvbmVudCgpXG4gICAgfSxcblxuICAgIHJvdXRlQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMuJHJvdXRlQ29tcG9uZW50KClcbiAgICB9LFxuXG4gICAgZm9ybUNvbXBvbmVudCgpIHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMucm91dGVDb21wb25lbnRcbiAgICAgIHJldHVybiBjb21wb25lbnQ/LmlzRm9ybSA/IGNvbXBvbmVudCA6IG51bGxcbiAgICB9LFxuXG4gICAgdmlld0NvbXBvbmVudCgpIHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMucm91dGVDb21wb25lbnRcbiAgICAgIHJldHVybiBjb21wb25lbnQ/LmlzVmlldyA/IGNvbXBvbmVudCA6IG51bGxcbiAgICB9LFxuXG4gICAgLy8gUmV0dXJucyB0aGUgZmlyc3Qgcm91dGUgY29tcG9uZW50IGluIHRoZSBjaGFpbiBvZiBwYXJlbnRzLCBpbmNsdWRpbmdcbiAgICAvLyB0aGlzIGN1cnJlbnQgY29tcG9uZW50LCB0aGF0IGlzIGxpbmtlZCB0byBhIHJlc291cmNlIChhbmQgdGh1cyBsb2FkcyBpdHNcbiAgICAvLyBvd24gZGF0YSBhbmQgZG9lc24ndCBob2xkIG5lc3RlZCBkYXRhKS5cbiAgICBkYXRhQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMucHJvdmlkZXNEYXRhID8gdGhpcyA6IHRoaXMuJGRhdGFDb21wb25lbnQoKVxuICAgIH0sXG5cbiAgICBzb3VyY2VDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kc291cmNlQ29tcG9uZW50KClcbiAgICB9LFxuXG4gICAgcmVzb3VyY2VDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kcmVzb3VyY2VDb21wb25lbnQoKVxuICAgIH0sXG5cbiAgICBkaWFsb2dDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kZGlhbG9nQ29tcG9uZW50KClcbiAgICB9LFxuXG4gICAgcGFuZWxDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kcGFuZWxDb21wb25lbnQoKVxuICAgIH0sXG5cbiAgICB0YWJDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kdGFiQ29tcG9uZW50KClcbiAgICB9LFxuXG4gICAgcGFyZW50U2NoZW1hQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hQ29tcG9uZW50Py5wYXJlbnRDb21wb25lbnQuc2NoZW1hQ29tcG9uZW50XG4gICAgfSxcblxuICAgIHBhcmVudFJvdXRlQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMucm91dGVDb21wb25lbnQ/LnBhcmVudENvbXBvbmVudC5yb3V0ZUNvbXBvbmVudFxuICAgIH0sXG5cbiAgICBwYXJlbnRGb3JtQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMuZm9ybUNvbXBvbmVudD8ucGFyZW50Q29tcG9uZW50LmZvcm1Db21wb25lbnRcbiAgICB9LFxuXG4gICAgLy8gUmV0dXJucyB0aGUgZGF0YSBvZiB0aGUgZmlyc3Qgcm91dGUgY29tcG9uZW50IGluIHRoZSBjaGFpbiBvZiBwYXJlbnRzXG4gICAgLy8gdGhhdCBsb2FkcyBpdHMgb3duIGRhdGEgZnJvbSBhbiBhc3NvY2lhdGVkIEFQSSByZXNvdXJjZS5cbiAgICByb290RGF0YSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFDb21wb25lbnQ/LmRhdGFcbiAgICB9XG4gIH0sXG5cbiAgYmVmb3JlQ3JlYXRlKCkge1xuICAgIGNvbnN0IHVpZCA9IG5leHRVaWQrK1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnJHVpZCcsIHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHVpZFxuICAgICAgfVxuICAgIH0pXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGxhYmVsaXplLFxuXG4gICAgLy8gVGhlIHN0YXRlIG9mIGNvbXBvbmVudHMgaXMgb25seSBhdmFpbGFibGUgZHVyaW5nIHRoZSBsaWZlLWN5Y2xlIG9mIGFcbiAgICAvLyBjb21wb25lbnQuIFNvbWUgaW5mb3JtYXRpb24gd2UgbmVlZCBhdmFpbGFibGUgbG9uZ2VyIHRoYW4gdGhhdCwgZS5nLlxuICAgIC8vIGBxdWVyeWAgJiBgdG90YWxgIG9uIFR5cGVMaXN0LCBzbyB0aGF0IHdoZW4gdGhlIHVzZXIgbmF2aWdhdGVzIGJhY2sgZnJvbVxuICAgIC8vIGVkaXRpbmcgYW4gaXRlbSBpbiB0aGUgbGlzdCwgdGhlIHN0YXRlIG9mIHRoZSBsaXN0IGlzIHN0aWxsIHRoZSBzYW1lLlxuICAgIC8vIFdlIGNhbid0IHN0b3JlIHRoaXMgaW4gYGRhdGFgLCBhcyB0aGlzIGlzIGFscmVhZHkgdGhlIHB1cmUgZGF0YSBmcm9tIHRoZVxuICAgIC8vIEFQSSBzZXJ2ZXIuIFRoYXQncyB3aGF0IHRoZSBgc3RvcmVgIGlzIGZvcjogTWVtb3J5IHRoYXQncyBhdmFpbGFibGUgYXNcbiAgICAvLyBsb25nIGFzIHRoZSBjdXJyZW50IGVkaXRpbmcgcGF0aCBpcyBzdGlsbCB2YWxpZC4gRm9yIHR5cGUgY29tcG9uZW50cyxcbiAgICAvLyB0aGlzIG1lbW9yeSBpcyBwcm92aWRlZCBieSB0aGUgcGFyZW50LCBzZWUgUm91dGVNaXhpbiBhbmQgRGl0b1BhbmUuXG4gICAgZ2V0U3RvcmUoa2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5zdG9yZVtrZXldXG4gICAgfSxcblxuICAgIHNldFN0b3JlKGtleSwgdmFsdWUpIHtcbiAgICAgIHRoaXMuc3RvcmVba2V5XSA9IHZhbHVlXG4gICAgICByZXR1cm4gdmFsdWVcbiAgICB9LFxuXG4gICAgZ2V0Q2hpbGRTdG9yZShrZXkpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFN0b3JlKGtleSkgfHwgdGhpcy5zZXRTdG9yZShrZXksIHJlYWN0aXZlKHt9KSlcbiAgICB9LFxuXG4gICAgZ2V0U2NoZW1hVmFsdWUoXG4gICAgICBrZXlPckRhdGFQYXRoLFxuICAgICAgeyB0eXBlLCBkZWZhdWx0OiBkZWYsIHNjaGVtYSA9IHRoaXMuc2NoZW1hLCBjYWxsYmFjayA9IHRydWUgfSA9IHt9XG4gICAgKSB7XG4gICAgICBjb25zdCB0eXBlcyA9IHR5cGUgJiYgYXNBcnJheSh0eXBlKVxuICAgICAgLy8gRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIGRhdGEtcGF0aHMgaW4gYGtleU9yRGF0YVBhdGhgIGNhbiBvbmx5IGJlXG4gICAgICAvLyBwcm92aWRlZCBpbiBpbiBhcnJheSBmb3JtYXQgaGVyZTpcbiAgICAgIGxldCB2YWx1ZSA9IHNjaGVtYVxuICAgICAgICA/IGlzQXJyYXkoa2V5T3JEYXRhUGF0aClcbiAgICAgICAgICA/IGdldFZhbHVlQXREYXRhUGF0aChzY2hlbWEsIGtleU9yRGF0YVBhdGgsICgpID0+IHVuZGVmaW5lZClcbiAgICAgICAgICA6IHNjaGVtYVtrZXlPckRhdGFQYXRoXVxuICAgICAgICA6IHVuZGVmaW5lZFxuXG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiBkZWYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoY2FsbGJhY2sgJiYgaXNGdW5jdGlvbihkZWYpICYmICFpc01hdGNoaW5nVHlwZSh0eXBlcywgZGVmKSkge1xuICAgICAgICAgIC8vIFN1cHBvcnQgYGRlZmF1bHQoKWAgZnVuY3Rpb25zIGZvciBhbnkgdHlwZSBleGNlcHQgYEZ1bmN0aW9uYDpcbiAgICAgICAgICBkZWYgPSBkZWYuY2FsbCh0aGlzKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWZcbiAgICAgIH1cblxuICAgICAgaWYgKGlzTWF0Y2hpbmdUeXBlKHR5cGVzLCB2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlXG4gICAgICB9XG4gICAgICAvLyBBbnkgc2NoZW1hIHZhbHVlIGhhbmRsZWQgdGhyb3VnaCBgZ2V0U2NoZW1hVmFsdWUoKWAgY2FuIHByb3ZpZGVcbiAgICAgIC8vIGEgZnVuY3Rpb24gdGhhdCdzIHJlc29sdmVkIHdoZW4gdGhlIHZhbHVlIGlzIGV2YWx1YXRlZDpcbiAgICAgIGlmIChjYWxsYmFjayAmJiBpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlKHRoaXMuY29udGV4dClcbiAgICAgIH1cbiAgICAgIC8vIE5vdyBmaW5hbGx5IHNlZSBpZiB3ZSBjYW4gY29udmVydCB0byB0aGUgZXhwZWN0IHR5cGVzLlxuICAgICAgaWYgKHR5cGVzICYmIHZhbHVlICE9IG51bGwgJiYgIWlzTWF0Y2hpbmdUeXBlKHR5cGVzLCB2YWx1ZSkpIHtcbiAgICAgICAgZm9yIChjb25zdCB0eXBlIG9mIHR5cGVzKSB7XG4gICAgICAgICAgY29uc3QgY29udmVydGVkID0gY29udmVydFR5cGUodHlwZSwgdmFsdWUpXG4gICAgICAgICAgaWYgKGNvbnZlcnRlZCAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZWRcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZVxuICAgIH0sXG5cbiAgICBnZXRMYWJlbChzY2hlbWEsIG5hbWUpIHtcbiAgICAgIHJldHVybiBzY2hlbWFcbiAgICAgICAgPyB0aGlzLmdldFNjaGVtYVZhbHVlKCdsYWJlbCcsIHsgdHlwZTogU3RyaW5nLCBzY2hlbWEgfSkgfHxcbiAgICAgICAgICBsYWJlbGl6ZShuYW1lIHx8IHNjaGVtYS5uYW1lKVxuICAgICAgICA6IGxhYmVsaXplKG5hbWUpIHx8ICcnXG4gICAgfSxcblxuICAgIGdldEJ1dHRvbkF0dHJpYnV0ZXModmVyYikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY2xhc3M6IGBkaXRvLWJ1dHRvbi0ke3ZlcmJ9YCxcbiAgICAgICAgdGl0bGU6IGxhYmVsaXplKHZlcmIpXG4gICAgICB9XG4gICAgfSxcblxuICAgIC8vIFRPRE86IFJlbmFtZSAqTGluaygpIHRvICpSb3V0ZSgpLlxuICAgIGdldFF1ZXJ5TGluayhxdWVyeSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcXVlcnksXG4gICAgICAgIC8vIFByZXNlcnZlIGhhc2ggZm9yIHRhYnM6XG4gICAgICAgIGhhc2g6IHRoaXMuJHJvdXRlLmhhc2hcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc2hvdWxkUmVuZGVyKHNjaGVtYSA9IG51bGwpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFNjaGVtYVZhbHVlKCdpZicsIHtcbiAgICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgICAgZGVmYXVsdDogdHJ1ZSxcbiAgICAgICAgc2NoZW1hXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBzaG91bGRTaG93KHNjaGVtYSA9IG51bGwpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFNjaGVtYVZhbHVlKCd2aXNpYmxlJywge1xuICAgICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgICBkZWZhdWx0OiB0cnVlLFxuICAgICAgICBzY2hlbWFcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIHNob3VsZERpc2FibGUoc2NoZW1hID0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0U2NoZW1hVmFsdWUoJ2Rpc2FibGVkJywge1xuICAgICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgc2NoZW1hXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBnZXRSZXNvdXJjZVBhdGgocmVzb3VyY2UpIHtcbiAgICAgIHJlc291cmNlID0gZ2V0UmVzb3VyY2UocmVzb3VyY2UpXG4gICAgICAvLyBSZXNvdXJjZXMgd2l0aG91dCBhIHBhcmVudCBpbmhlcml0IHRoZSBvbmUgZnJvbSBgZGF0YUNvbXBvbmVudGBcbiAgICAgIC8vIGF1dG9tYXRpY2FsbHkuXG4gICAgICBpZiAocmVzb3VyY2UucGFyZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmVzb3VyY2UucGFyZW50ID0gdGhpcy5kYXRhQ29tcG9uZW50Py5yZXNvdXJjZVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuYXBpLnJlc291cmNlcy5hbnkoZ2V0UmVzb3VyY2UocmVzb3VyY2UpKVxuICAgIH0sXG5cbiAgICBnZXRSZXNvdXJjZVVybChyZXNvdXJjZSkge1xuICAgICAgY29uc3QgdXJsID0gdGhpcy5nZXRSZXNvdXJjZVBhdGgocmVzb3VyY2UpXG4gICAgICByZXR1cm4gdXJsID8gdGhpcy5hcGkuZ2V0QXBpVXJsKHsgdXJsLCBxdWVyeTogcmVzb3VyY2UucXVlcnkgfSkgOiBudWxsXG4gICAgfSxcblxuICAgIGFzeW5jIHNlbmRSZXF1ZXN0KHsgbWV0aG9kLCB1cmwsIHJlc291cmNlLCBxdWVyeSwgZGF0YSwgaW50ZXJuYWwgfSkge1xuICAgICAgdXJsIHx8PSB0aGlzLmdldFJlc291cmNlUGF0aChyZXNvdXJjZSlcbiAgICAgIG1ldGhvZCB8fD0gcmVzb3VyY2U/Lm1ldGhvZFxuICAgICAgY29uc3QgY2hlY2tVc2VyID0gIWludGVybmFsICYmIHRoaXMuYXBpLmlzQXBpVXJsKHVybClcbiAgICAgIGlmIChjaGVja1VzZXIpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5yb290Q29tcG9uZW50LmVuc3VyZVVzZXIoKVxuICAgICAgfVxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmFwaS5yZXF1ZXN0KHsgbWV0aG9kLCB1cmwsIGRhdGEsIHF1ZXJ5IH0pXG4gICAgICAvLyBEZXRlY3QgY2hhbmdlIG9mIHRoZSBvd24gdXNlciwgYW5kIGZldGNoIGl0IGFnYWluIGlmIGl0IHdhcyBjaGFuZ2VkLlxuICAgICAgaWYgKFxuICAgICAgICBjaGVja1VzZXIgJiZcbiAgICAgICAgbWV0aG9kID09PSAncGF0Y2gnICYmXG4gICAgICAgIGVxdWFscyhyZXNvdXJjZSwgZ2V0TWVtYmVyUmVzb3VyY2UodGhpcy51c2VyLmlkLCB0aGlzLmFwaS51c2VycykpXG4gICAgICApIHtcbiAgICAgICAgYXdhaXQgdGhpcy5yb290Q29tcG9uZW50LmZldGNoVXNlcigpXG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzcG9uc2VcbiAgICB9LFxuXG4gICAgc2hvd0RpYWxvZyh7IGNvbXBvbmVudHMsIGJ1dHRvbnMsIGRhdGEsIHNldHRpbmdzIH0pIHtcbiAgICAgIHJldHVybiB0aGlzLnJvb3RDb21wb25lbnQuc2hvd0RpYWxvZyh7XG4gICAgICAgIGNvbXBvbmVudHMsXG4gICAgICAgIGJ1dHRvbnMsXG4gICAgICAgIGRhdGEsXG4gICAgICAgIHNldHRpbmdzXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICByZXF1ZXN0KHsgY2FjaGUsIC4uLm9wdGlvbnMgfSkge1xuICAgICAgLy8gQWxsb3cgY2FjaGluZyBvZiBsb2FkZWQgZGF0YSBvbiB0d28gbGV2ZWxzOlxuICAgICAgLy8gLSAnZ2xvYmFsJzogY2FjaGUgZ2xvYmFsbHksIGZvciB0aGUgZW50aXJlIGFkbWluIHNlc3Npb25cbiAgICAgIC8vIC0gJ2xvY2FsJzogY2FjaGUgbG9jYWxseSB3aXRoaW4gdGhlIGNsb3Nlc3Qgcm91dGUgY29tcG9uZW50IHRoYXQgaXNcbiAgICAgIC8vICAgIGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlIGFuZCBsb2FkcyBpdHMgb3duIGRhdGEuXG4gICAgICBjb25zdCBjYWNoZVBhcmVudCA9IChcbiAgICAgICAgY2FjaGUgJiZcbiAgICAgICAge1xuICAgICAgICAgIGdsb2JhbDogdGhpcy5hcHBTdGF0ZSxcbiAgICAgICAgICBsb2NhbDogdGhpcy5kYXRhQ29tcG9uZW50XG4gICAgICAgIH1bY2FjaGVdXG4gICAgICApXG4gICAgICBjb25zdCBsb2FkQ2FjaGUgPSBjYWNoZVBhcmVudD8ubG9hZENhY2hlXG4gICAgICAvLyBCdWlsZCBhIGNhY2hlIGtleSBmcm9tIHRoZSBjb25maWc6XG4gICAgICBjb25zdCBjYWNoZUtleSA9IChcbiAgICAgICAgbG9hZENhY2hlICYmXG4gICAgICAgIGAke1xuICAgICAgICAgIG9wdGlvbnMubWV0aG9kIHx8ICdnZXQnXG4gICAgICAgIH0gJHtcbiAgICAgICAgICBvcHRpb25zLnVybFxuICAgICAgICB9ICR7XG4gICAgICAgICAgLy8gVE9ETzogYHJlcXVlc3QucGFyYW1zYCB3YXMgZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgYHF1ZXJ5YCBvblxuICAgICAgICAgIC8vIDIwMjItMTEtMDEsIHJlbW92ZSBvbmNlIG5vdCBpbiB1c2UgYW55d2hlcmUgYW55IG1vcmUuXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkob3B0aW9ucy5xdWVyeSB8fCBvcHRpb25zLnBhcmFtcyB8fCAnJylcbiAgICAgICAgfSAke1xuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KG9wdGlvbnMuZGF0YSB8fCAnJylcbiAgICAgICAgfWBcbiAgICAgIClcbiAgICAgIGlmIChsb2FkQ2FjaGUgJiYgKGNhY2hlS2V5IGluIGxvYWRDYWNoZSkpIHtcbiAgICAgICAgcmV0dXJuIGxvYWRDYWNoZVtjYWNoZUtleV1cbiAgICAgIH1cbiAgICAgIC8vIE5PVEU6IE5vIGF3YWl0IGhlcmUsIHJlcyBpcyBhIHByb21pc2UgdGhhdCB3ZSBjYW4gZWFzaWx5IGNhY2hlLlxuICAgICAgLy8gVGhhdCdzIGZpbmUgYmVjYXVzZSBwcm9taXNlcyBjYW4gYmUgcmVzb2x2ZWQgb3ZlciBhbmQgb3ZlciBhZ2Fpbi5cbiAgICAgIGNvbnN0IHJlcyA9IHRoaXMuc2VuZFJlcXVlc3Qob3B0aW9ucylcbiAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4gcmVzcG9uc2UuZGF0YSlcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICAvLyBDb252ZXJ0IGF4aW9zIGVycm9ycyB0byBub3JtYWwgZXJyb3JzXG4gICAgICAgICAgY29uc3QgZGF0YSA9IGVycm9yLnJlc3BvbnNlPy5kYXRhXG4gICAgICAgICAgdGhyb3cgZGF0YVxuICAgICAgICAgICAgPyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihkYXRhLm1lc3NhZ2UpLCBkYXRhKVxuICAgICAgICAgICAgOiBlcnJvclxuICAgICAgICB9KVxuICAgICAgaWYgKGxvYWRDYWNoZSkge1xuICAgICAgICBsb2FkQ2FjaGVbY2FjaGVLZXldID0gcmVzXG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzXG4gICAgfSxcblxuICAgIGZvcm1hdCh2YWx1ZSwge1xuICAgICAgbG9jYWxlID0gdGhpcy5hcGkubG9jYWxlLFxuICAgICAgZGVmYXVsdHMgPSB0aGlzLmFwaS5mb3JtYXRzLFxuICAgICAgLi4ub3B0aW9uc1xuICAgIH0gPSB7fSkge1xuICAgICAgcmV0dXJuIGZvcm1hdCh2YWx1ZSwge1xuICAgICAgICBsb2NhbGUsXG4gICAgICAgIGRlZmF1bHRzLFxuICAgICAgICAuLi5vcHRpb25zXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBuYXZpZ2F0ZShsb2NhdGlvbikge1xuICAgICAgcmV0dXJuIHRoaXMuJHJvdXRlci5wdXNoKGxvY2F0aW9uKVxuICAgIH0sXG5cbiAgICBkb3dubG9hZChvcHRpb25zID0ge30pIHtcbiAgICAgIGlmIChpc1N0cmluZyhvcHRpb25zKSkge1xuICAgICAgICBvcHRpb25zID0geyB1cmw6IG9wdGlvbnMgfVxuICAgICAgfVxuICAgICAgLy8gU2VlOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNDk5MTcwNjYvMTE2MzcwOFxuICAgICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKVxuICAgICAgYS5ocmVmID0gdGhpcy5hcGkuZ2V0QXBpVXJsKG9wdGlvbnMpXG4gICAgICBhLmRvd25sb2FkID0gb3B0aW9ucy5maWxlbmFtZSA/PyBudWxsXG4gICAgICBjb25zdCB7IGJvZHkgfSA9IGRvY3VtZW50XG4gICAgICBib2R5LmFwcGVuZENoaWxkKGEpXG4gICAgICBhLmNsaWNrKClcbiAgICAgIGJvZHkucmVtb3ZlQ2hpbGQoYSlcbiAgICB9LFxuXG4gICAgbm90aWZ5KG9wdGlvbnMpIHtcbiAgICAgIHRoaXMucm9vdENvbXBvbmVudC5ub3RpZnkob3B0aW9ucylcbiAgICB9LFxuXG4gICAgY2xvc2VOb3RpZmljYXRpb25zKCkge1xuICAgICAgdGhpcy5yb290Q29tcG9uZW50LmNsb3NlTm90aWZpY2F0aW9ucygpXG4gICAgfSxcblxuICAgIHNldHVwU2NoZW1hRmllbGRzKCkge1xuICAgICAgdGhpcy5zZXR1cE1ldGhvZHMoKVxuICAgICAgdGhpcy5zZXR1cENvbXB1dGVkKClcbiAgICAgIHRoaXMuc2V0dXBFdmVudHMoKVxuICAgIH0sXG5cbiAgICBzZXR1cE1ldGhvZHMoKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnNjaGVtYS5tZXRob2RzIHx8IHt9KSkge1xuICAgICAgICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICAgICAgICB0aGlzW2tleV0gPSB2YWx1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEludmFsaWQgbWV0aG9kIGRlZmluaXRpb246ICR7a2V5fTogJHt2YWx1ZX1gKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIHNldHVwQ29tcHV0ZWQoKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnNjaGVtYS5jb21wdXRlZCB8fCB7fSkpIHtcbiAgICAgICAgY29uc3QgYWNjZXNzb3IgPSBpc0Z1bmN0aW9uKHZhbHVlKVxuICAgICAgICAgID8geyBnZXQ6IHZhbHVlIH1cbiAgICAgICAgICA6IGlzT2JqZWN0KHZhbHVlKSAmJiBpc0Z1bmN0aW9uKHZhbHVlLmdldClcbiAgICAgICAgICAgID8gdmFsdWVcbiAgICAgICAgICAgIDogbnVsbFxuICAgICAgICBpZiAoYWNjZXNzb3IpIHtcbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywga2V5LCBhY2Nlc3NvcilcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgYEludmFsaWQgY29tcHV0ZWQgcHJvcGVydHkgZGVmaW5pdGlvbjogJHtrZXl9OiAke3ZhbHVlfWBcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc2V0dXBFdmVudHMoKSB7XG4gICAgICBjb25zdCB7IHdhdGNoLCBldmVudHMgfSA9IHRoaXMuc2NoZW1hXG4gICAgICBpZiAod2F0Y2gpIHtcbiAgICAgICAgY29uc3QgaGFuZGxlcnMgPSBpc0Z1bmN0aW9uKHdhdGNoKSA/IHdhdGNoLmNhbGwodGhpcykgOiB3YXRjaFxuICAgICAgICBpZiAoaXNPYmplY3QoaGFuZGxlcnMpKSB7XG4gICAgICAgICAgLy8gSW5zdGFsbCB0aGUgd2F0Y2ggaGFuZGxlcnMgaW4gdGhlIG5leHQgdGljaywgc28gYWxsIGNvbXBvbmVudHMgYXJlXG4gICAgICAgICAgLy8gaW5pdGlhbGl6ZWQgYW5kIHdlIGNhbiBjaGVjayBhZ2FpbnN0IHRoZWlyIG5hbWVzLlxuICAgICAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgY2FsbGJhY2tdIG9mIE9iamVjdC5lbnRyaWVzKGhhbmRsZXJzKSkge1xuICAgICAgICAgICAgICAvLyBFeHBhbmQgcHJvcGVydHkgbmFtZXMgdG8gJ2RhdGEucHJvcGVydHknOlxuICAgICAgICAgICAgICBjb25zdCBleHByID0gdGhpcy5zY2hlbWFDb21wb25lbnQuZ2V0Q29tcG9uZW50QnlOYW1lKGtleSlcbiAgICAgICAgICAgICAgICA/IGBkYXRhLiR7a2V5fWBcbiAgICAgICAgICAgICAgICA6IGtleVxuICAgICAgICAgICAgICB0aGlzLiR3YXRjaChleHByLCBjYWxsYmFjaylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFkZEV2ZW50ID0gKGtleSwgZXZlbnQsIGNhbGxiYWNrKSA9PiB7XG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKGNhbGxiYWNrKSkge1xuICAgICAgICAgIHRoaXMub24oaHlwaGVuYXRlKGV2ZW50KSwgY2FsbGJhY2spXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgSW52YWxpZCBldmVudCBkZWZpbml0aW9uOiAke2tleX06ICR7Y2FsbGJhY2t9YClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnRzKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGV2ZW50cykpIHtcbiAgICAgICAgICBhZGRFdmVudChrZXksIGtleSwgdmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIEFsc28gc2NhbiBzY2hlbWEgZm9yIGBvbltBLVpdYC1zdHlsZSBjYWxsYmFja3MgYW5kIGFkZCB0aGVtXG4gICAgICAvLyBUT0RPOiBEZXByZWNhdGUgb25lIGZvcm1hdCBvciB0aGUgb3RoZXIsIGluIGZhdm91ciBvZiBvbmx5IG9uZSB3YXkgb2ZcbiAgICAgIC8vIGRvaW5nIHRoaW5ncy4gRGVjaWRlIHdoaWNoIG9uZSB0byByZW1vdmUuXG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnNjaGVtYSkpIHtcbiAgICAgICAgaWYgKC9eb25bQS1aXS8udGVzdChrZXkpKSB7XG4gICAgICAgICAgYWRkRXZlbnQoa2V5LCBrZXkuc2xpY2UoMiksIHZhbHVlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIGVtaXRFdmVudChldmVudCwge1xuICAgICAgY29udGV4dCA9IG51bGwsXG4gICAgICBwYXJlbnQgPSBudWxsXG4gICAgfSA9IHt9KSB7XG4gICAgICBjb25zdCBoYXNMaXN0ZW5lcnMgPSB0aGlzLmhhc0xpc3RlbmVycyhldmVudClcbiAgICAgIGNvbnN0IHBhcmVudEhhc0xpc3RlbmVycyA9IHBhcmVudD8uaGFzTGlzdGVuZXJzKGV2ZW50KVxuICAgICAgaWYgKGhhc0xpc3RlbmVycyB8fCBwYXJlbnRIYXNMaXN0ZW5lcnMpIHtcbiAgICAgICAgLy8gVGhlIGVmZmVjdHMgb2Ygc29tZSBldmVudHMgbmVlZCBzb21lIHRpbWUgdG8gcHJvcGFnYXRlIHRocm91Z2ggVnVlLlxuICAgICAgICAvLyBVc2UgJG5leHRUaWNrKCkgdG8gbWFrZSBzdXJlIG91ciBoYW5kbGVycyBzZWUgdGhlc2UgY2hhbmdlcy5cbiAgICAgICAgLy8gRm9yIGV4YW1wbGUsIGBwcm9jZXNzZWRJdGVtYCBpcyBvbmx5IGNvcnJlY3QgYWZ0ZXIgY29tcG9uZW50cyB0aGF0XG4gICAgICAgIC8vIGFyZSBuZXdseSByZW5kZXJlZCBkdWUgdG8gZGF0YSBjaGFuZ2VzIGhhdmUgcmVnaXN0ZXJlZCB0aGVtc2VsdmVzLlxuICAgICAgICBpZiAoWydsb2FkJywgJ2NoYW5nZSddLmluY2x1ZGVzKGV2ZW50KSkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuJG5leHRUaWNrKClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGdldENvbnRleHQgPSAoKSA9PiAoY29udGV4dCA9IERpdG9Db250ZXh0LmdldCh0aGlzLCBjb250ZXh0KSlcbiAgICAgICAgY29uc3QgcmVzID0gaGFzTGlzdGVuZXJzXG4gICAgICAgICAgPyBhd2FpdCB0aGlzLmVtaXQoZXZlbnQsIGdldENvbnRleHQoKSlcbiAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICAvLyBEb24ndCBidWJibGUgdG8gcGFyZW50IGlmIGhhbmRsZWQgZXZlbnQgcmV0dXJuZWQgYGZhbHNlYFxuICAgICAgICBpZiAocGFyZW50SGFzTGlzdGVuZXJzICYmIHJlcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICBwYXJlbnQuZW1pdChldmVudCwgZ2V0Q29udGV4dCgpKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXNcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZW1pdFNjaGVtYUV2ZW50KGV2ZW50LCBwYXJhbXMpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjaGVtYUNvbXBvbmVudC5lbWl0RXZlbnQoZXZlbnQsIHBhcmFtcylcbiAgICB9XG4gIH1cbn1cblxubGV0IG5leHRVaWQgPSAwXG4iLCJpbXBvcnQgeyBpc0NyZWRpdENhcmQgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG5leHBvcnQgY29uc3QgY3JlZGl0Y2FyZCA9IHtcbiAgdmFsaWRhdGU6IHZhbHVlID0+IGlzQ3JlZGl0Q2FyZCh2YWx1ZSksXG4gIG1lc3NhZ2U6ICdpcyBpbnZhbGlkJ1xufVxuIiwiZXhwb3J0IGNvbnN0IGRlY2ltYWxzID0ge1xuICB2YWxpZGF0ZTogKHZhbHVlLCBkZWNpbWFscykgPT4ge1xuICAgIGNvbnN0IG1hdGNoID0gZGVjaW1hbHMgPT09ICcqJyA/ICcrJyA6IGB7MSwke2RlY2ltYWxzfX1gXG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoYF5bLStdP1xcXFxkKihcXFxcLlxcXFxkJHttYXRjaH0pPyRgKS50ZXN0KHZhbHVlKVxuICB9LFxuXG4gIG1lc3NhZ2U6ICh2YWx1ZSwgZGVjaW1hbHMpID0+XG4gICAgYG11c3QgYmUgbnVtZXJpYyBhbmQgbWF5IGNvbnRhaW4gJHtcbiAgICAgICFkZWNpbWFscyB8fCBkZWNpbWFscyA9PT0gJyonID8gJycgOiBkZWNpbWFsc1xuICAgIH0gZGVjaW1hbCBwb2ludHNgXG59XG4iLCJpbXBvcnQgeyBpc0RvbWFpbiB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbmV4cG9ydCBjb25zdCBkb21haW4gPSB7XG4gIHZhbGlkYXRlOiB2YWx1ZSA9PiBpc0RvbWFpbih2YWx1ZSksXG4gIG1lc3NhZ2U6ICdpcyBub3QgYSBkb21haW4nXG59XG4iLCJpbXBvcnQgeyBpc0VtYWlsIH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuZXhwb3J0IGNvbnN0IGVtYWlsID0ge1xuICB2YWxpZGF0ZTogdmFsdWUgPT4gaXNFbWFpbCh2YWx1ZSksXG4gIG1lc3NhZ2U6ICdtdXN0IGJlIGEgdmFsaWQgZW1haWwnXG59XG4iLCJpbXBvcnQgeyBpc0hvc3RuYW1lIH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuZXhwb3J0IGNvbnN0IGhvc3RuYW1lID0ge1xuICB2YWxpZGF0ZTogdmFsdWUgPT4gaXNIb3N0bmFtZSh2YWx1ZSksXG4gIG1lc3NhZ2U6ICdpcyBub3QgYSBob3N0IG5hbWUnXG59XG4iLCJpbXBvcnQgeyBpc0ludGVnZXIgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG5leHBvcnQgY29uc3QgaW50ZWdlciA9IHtcbiAgdmFsaWRhdGU6IHZhbHVlID0+IGlzSW50ZWdlcih2YWx1ZSksXG4gIG1lc3NhZ2U6ICdtdXN0IGJlIHdob2xlIG51bWJlcidcbn1cbiIsImV4cG9ydCBjb25zdCBtYXggPSB7XG4gIHZhbGlkYXRlOiAodmFsdWUsIG1heCkgPT4gdmFsdWUgPD0gbWF4LFxuICBtZXNzYWdlKHZhbHVlLCBtYXgpIHtcbiAgICByZXR1cm4gYG11c3QgYmUgJHttYXh9IG9yIGxlc3NgXG4gIH1cbn1cbiIsImV4cG9ydCBjb25zdCBtaW4gPSB7XG4gIHZhbGlkYXRlOiAodmFsdWUsIG1pbikgPT4gdmFsdWUgPj0gbWluLFxuICBtZXNzYWdlKHZhbHVlLCBtaW4pIHtcbiAgICByZXR1cm4gYG11c3QgYmUgJHttaW59IG9yIG1vcmVgXG4gIH1cbn1cbiIsImV4cG9ydCBjb25zdCBwYXNzd29yZCA9IHtcbiAgLy8gQWxsb3cgYW55IHZhbHVlLiBGb3Igbm93IHRoaXMgaXMgb25seSB1c2VkIGFzIGEgbWFya2VyLCB0byBhbGxvdyB0aGVcbiAgLy8gcmVxdWlyZWQgdmFsaWRhdGlvbiB0byBoYW5kbGUgdW5jaGFuZ2VkIHBhc3N3b3JkcyBzZXBhcmF0ZWx5LlxuICB2YWxpZGF0ZTogKCkgPT4gdHJ1ZVxufVxuIiwiZXhwb3J0IGNvbnN0IHJhbmdlID0ge1xuICB2YWxpZGF0ZTogKHZhbHVlLCBbbWluLCBtYXhdKSA9PiB2YWx1ZSA+PSBtaW4gJiYgdmFsdWUgPD0gbWF4LFxuICBtZXNzYWdlKHZhbHVlLCBbbWluLCBtYXhdKSB7XG4gICAgcmV0dXJuIGBtdXN0IGJlIGJldHdlZW4gJHttaW59IGFuZCAke21heH1gXG4gIH1cbn1cbiIsImV4cG9ydCBjb25zdCByZXF1aXJlZCA9IHtcbiAgdmFsaWRhdGU6ICh2YWx1ZSwgc2V0dGluZ3MsIHsgcGFzc3dvcmQgfSkgPT4gKFxuICAgICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlICE9PSAnJykgfHxcbiAgICAvLyBQYXNzd29yZCBmaWVsZHMgdXNlIGB1bmRlZmluZWRgIGFzIG9wcG9zZWQgdG8gYG51bGxgIHdoZW4gdGhleSdyZSBzZXRcbiAgICAvLyBidXQgdW5jaGFuZ2VkLCBhbGxvdyB0aGlzIHRvIHBhc3MgdGhyb3VnaDpcbiAgICAocGFzc3dvcmQgJiYgdmFsdWUgPT09IHVuZGVmaW5lZClcbiAgKSxcbiAgbWVzc2FnZTogJ2lzIHJlcXVpcmVkJyxcbiAgbnVsbGlzaDogdHJ1ZVxufVxuIiwiaW1wb3J0IHsgaXNVcmwgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG5leHBvcnQgY29uc3QgdXJsID0ge1xuICB2YWxpZGF0ZTogdmFsdWUgPT4gaXNVcmwodmFsdWUpLFxuICBtZXNzYWdlOiAnaXMgbm90IGEgdmFsaWQgVVJMJ1xufVxuIiwiaW1wb3J0IHsgaXNGdW5jdGlvbiB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgKiBhcyB2YWxpZGF0aW9ucyBmcm9tICcuLi92YWxpZGF0aW9ucy9pbmRleC5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgZW1pdHM6IFsnZXJyb3JzJ10sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaXNUb3VjaGVkOiBmYWxzZSxcbiAgICAgIGlzRGlydHk6IGZhbHNlLFxuICAgICAgaXNWYWxpZGF0ZWQ6IGZhbHNlLFxuICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICBlcnJvcnM6IG51bGxcbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIHJlc2V0VmFsaWRhdGlvbigpIHtcbiAgICAgIHRoaXMuaXNUb3VjaGVkID0gZmFsc2VcbiAgICAgIHRoaXMuaXNEaXJ0eSA9IGZhbHNlXG4gICAgICB0aGlzLmlzVmFsaWRhdGVkID0gZmFsc2VcbiAgICAgIHRoaXMuaXNWYWxpZCA9IGZhbHNlXG4gICAgICB0aGlzLmNsZWFyRXJyb3JzKClcbiAgICB9LFxuXG4gICAgdmFsaWRhdGUobm90aWZ5ID0gdHJ1ZSkge1xuICAgICAgbGV0IGlzVmFsaWQgPSB0cnVlXG4gICAgICBpZiAobm90aWZ5KSB7XG4gICAgICAgIHRoaXMuY2xlYXJFcnJvcnMoKVxuICAgICAgfVxuICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gdGhpc1xuICAgICAgLy8gY29uc29sZS5sb2coJ3ZhbGlkYXRlJywgdGhpcy5kYXRhUGF0aCwgdmFsdWUsIHRoaXMudmFsaWRhdGlvbnMpXG4gICAgICBmb3IgKGNvbnN0IFtydWxlLCBzZXR0aW5nXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnZhbGlkYXRpb25zKSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25hbWVzcGFjZVxuICAgICAgICBjb25zdCB2YWxpZGF0b3IgPSB2YWxpZGF0aW9uc1tydWxlXVxuICAgICAgICBpZiAodmFsaWRhdG9yICYmICh2YWxpZGF0b3IubnVsbGlzaCB8fCB2YWx1ZSAhPSBudWxsKSkge1xuICAgICAgICAgIGNvbnN0IHsgdmFsaWRhdGUsIG1lc3NhZ2UgfSA9IHZhbGlkYXRvclxuICAgICAgICAgIGlmICghdmFsaWRhdGUodmFsdWUsIHNldHRpbmcsIHRoaXMudmFsaWRhdGlvbnMpKSB7XG4gICAgICAgICAgICBpc1ZhbGlkID0gZmFsc2VcbiAgICAgICAgICAgIGlmIChub3RpZnkpIHtcbiAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBpc0Z1bmN0aW9uKG1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgPyBtZXNzYWdlKHZhbHVlLCBzZXR0aW5nLCB0aGlzKVxuICAgICAgICAgICAgICAgIDogbWVzc2FnZVxuICAgICAgICAgICAgICB0aGlzLmFkZEVycm9yKGVycm9yLCB0cnVlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG5vdGlmeSkge1xuICAgICAgICB0aGlzLmlzVmFsaWRhdGVkID0gdHJ1ZVxuICAgICAgICB0aGlzLmlzVmFsaWQgPSBpc1ZhbGlkXG4gICAgICB9XG4gICAgICByZXR1cm4gaXNWYWxpZFxuICAgIH0sXG5cbiAgICB2ZXJpZnkoKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZShmYWxzZSlcbiAgICB9LFxuXG4gICAgbWFya1RvdWNoZWQoKSB7XG4gICAgICB0aGlzLmlzVG91Y2hlZCA9IHRydWVcbiAgICB9LFxuXG4gICAgbWFya0RpcnR5KCkge1xuICAgICAgdGhpcy5pc0RpcnR5ID0gdHJ1ZVxuICAgICAgdGhpcy5pc1ZhbGlkYXRlZCA9IGZhbHNlXG4gICAgICB0aGlzLmlzVmFsaWQgPSBmYWxzZVxuICAgICAgLy8gQ2xlYXIgY3VycmVudGx5IGRpc3BsYXllZCBlcnJvcnMgb24gbmV3IGlucHV0LlxuICAgICAgdGhpcy5jbGVhckVycm9ycygpXG4gICAgfSxcblxuICAgIGFkZEVycm9yKGVycm9yLCBhZGRMYWJlbCA9IGZhbHNlKSB7XG4gICAgICB0aGlzLmVycm9ycyB8fD0gW11cbiAgICAgIGlmIChhZGRMYWJlbCkge1xuICAgICAgICBjb25zdCBsYWJlbCA9IHRoaXMubGFiZWwgfHwgdGhpcy5wbGFjZWhvbGRlciB8fCB0aGlzLm5hbWVcbiAgICAgICAgZXJyb3IgPSBgVGhlICR7bGFiZWx9IGZpZWxkICR7ZXJyb3J9LmBcbiAgICAgIH1cbiAgICAgIHRoaXMuZXJyb3JzLnB1c2goZXJyb3IpXG4gICAgICB0aGlzLiRlbWl0KCdlcnJvcnMnLCB0aGlzLmVycm9ycylcbiAgICB9LFxuXG4gICAgc2hvd1ZhbGlkYXRpb25FcnJvcnMoZXJyb3JzLCBmb2N1cykge1xuICAgICAgLy8gQ29udmVydCBmcm9tIEFKViBlcnJvcnMgb2JqZWN0cyB0byBhbiBhcnJheSBvZiBlcnJvciBtZXNzYWdlc1xuICAgICAgdGhpcy5lcnJvcnMgPSBbXVxuICAgICAgZm9yIChjb25zdCB7IG1lc3NhZ2UgfSBvZiBlcnJvcnMpIHtcbiAgICAgICAgdGhpcy5hZGRFcnJvcihtZXNzYWdlLCB0cnVlKVxuICAgICAgfVxuICAgICAgaWYgKGZvY3VzKSB7XG4gICAgICAgIHRoaXMuZm9jdXMoKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9LFxuXG4gICAgZ2V0RXJyb3JzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZXJyb3JzID8gWy4uLnRoaXMuZXJyb3JzXSA6IG51bGxcbiAgICB9LFxuXG4gICAgY2xlYXJFcnJvcnMoKSB7XG4gICAgICB0aGlzLmVycm9ycyA9IG51bGxcbiAgICAgIHRoaXMuJGVtaXQoJ2Vycm9ycycsIHRoaXMuZXJyb3JzKVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgaXNGdW5jdGlvbixcbiAgaXNTdHJpbmcsXG4gIHBhcnNlRGF0YVBhdGgsXG4gIG5vcm1hbGl6ZURhdGFQYXRoXG59IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTY2hlbWFBY2Nlc3NvcihcbiAga2V5T3JEYXRhUGF0aCxcbiAgeyB0eXBlLCBkZWZhdWx0OiBkZWYsIGdldCwgc2V0LCBjYWxsYmFjayA9IHRydWUgfSA9IHt9XG4pIHtcbiAgLy8gYGtleU9yRGF0YVBhdGhgIGNhbiBiZSBhIHNpbXBsZSBwcm9wZXJ0eSBrZXksXG4gIC8vIG9yIGEgZGF0YS1wYXRoIGludG8gc3ViLXByb3BlcnRpZXMsIGJvdGggaW4gYXJyYXkgb3Igc3RyaW5nIGZvcm1hdC5cbiAgaWYgKGlzU3RyaW5nKGtleU9yRGF0YVBhdGgpICYmIGtleU9yRGF0YVBhdGguaW5jbHVkZXMoJy4nKSkge1xuICAgIGtleU9yRGF0YVBhdGggPSBwYXJzZURhdGFQYXRoKGtleU9yRGF0YVBhdGgpXG4gIH1cbiAgLy8gVXNlIHRoZSBub3JtYWxpemVkIGRhdGEgcGF0aCBmb3IgdGhlIGhhbmRsaW5nIG92ZXJyaWRlc1xuICBjb25zdCBuYW1lID0gbm9ybWFsaXplRGF0YVBhdGgoa2V5T3JEYXRhUGF0aClcbiAgcmV0dXJuIHtcbiAgICBnZXQoKSB7XG4gICAgICAvLyBPbmx5IGRldGVybWluZSBzY2hlbWEgdmFsdWUgaWYgd2UgaGF2ZSBubyBnZXR0ZXIsIG9yIHRoZSBnZXR0ZXJcbiAgICAgIC8vIHdhbnRzIHRvIHJlY2VpdmUgdGhlIHZhbHVlIGFuZCBwcm9jZXNzIGl0IGZ1cnRoZXI6XG4gICAgICBjb25zdCB2YWx1ZSA9XG4gICAgICAgICFnZXQgfHwgZ2V0Lmxlbmd0aCA+IDBcbiAgICAgICAgICA/IC8vIE5PVEU6IEJlY2F1c2UgYHNjaGVtYWAgb2JqZWN0cyBhcmUgcmV0cmlldmVkIGZyb20gYG1ldGFgLCB0aGV5XG4gICAgICAgICAgICAvLyBkb24ndCBzZWVtIHRvIGJlIHJlYWN0aXZlLiBUbyBhbGxvdyBjaGFuZ2VkIGluIGBzY2hlbWFgIHZhbHVlcyxcbiAgICAgICAgICAgIC8vIGBzZXQoKWAgc3RvcmVzIGNoYW5nZWQgdmFsdWVzIGluIHRoZSBzZXBhcmF0ZSBgb3ZlcnJpZGVzYCBvYmplY3QuXG4gICAgICAgICAgICB0aGlzLm92ZXJyaWRlcyAmJiBuYW1lIGluIHRoaXMub3ZlcnJpZGVzXG4gICAgICAgICAgICA/IHRoaXMub3ZlcnJpZGVzW25hbWVdXG4gICAgICAgICAgICA6IHRoaXMuZ2V0U2NoZW1hVmFsdWUoa2V5T3JEYXRhUGF0aCwge1xuICAgICAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogZGVmLFxuICAgICAgICAgICAgICAgIGNhbGxiYWNrXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgIHJldHVybiBnZXQgPyBnZXQuY2FsbCh0aGlzLCB2YWx1ZSkgOiB2YWx1ZVxuICAgIH0sXG5cbiAgICBzZXQodmFsdWUpIHtcbiAgICAgIGlmIChzZXQpIHtcbiAgICAgICAgc2V0LmNhbGwodGhpcywgdmFsdWUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm92ZXJyaWRlcyB8fD0ge31cbiAgICAgICAgdGhpcy5vdmVycmlkZXNbbmFtZV0gPSB2YWx1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RvcmVBY2Nlc3NvcihuYW1lLCB7IGRlZmF1bHQ6IGRlZiwgZ2V0LCBzZXQgfSA9IHt9KSB7XG4gIHJldHVybiB7XG4gICAgZ2V0KCkge1xuICAgICAgbGV0IHZhbHVlID0gdGhpcy5nZXRTdG9yZShuYW1lKVxuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgZGVmICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gU3VwcG9ydCBgZGVmYXVsdCgpYCBmdW5jdGlvbnM6XG4gICAgICAgIHZhbHVlID0gaXNGdW5jdGlvbihkZWYpID8gZGVmLmNhbGwodGhpcykgOiBkZWZcbiAgICAgICAgLy8gVHJpZ2dlciBzZXR0ZXIgYnkgc2V0dGluZyB2YWx1ZSBhbmQgYWNjZXNzb3IgdG8gZGVmYXVsdDpcbiAgICAgICAgdGhpc1tuYW1lXSA9IHZhbHVlXG4gICAgICAgIC8vIE5vdyBhY2Nlc3Mgc3RvcmUgYWdhaW4sIGZvciByZWFjdGl2aXR5IHRyYWNraW5nXG4gICAgICAgIHRoaXMuZ2V0U3RvcmUobmFtZSlcbiAgICAgIH1cbiAgICAgIC8vIEFsbG93IHRoZSBwcm92aWRlZCBnZXR0ZXIgdG8gZnVydGhlciBjaGFuZ2Ugb3IgcHJvY2VzcyB0aGUgdmFsdWVcbiAgICAgIC8vIHJldHJpZXZlZCBmcm9tIHRoZSBzdG9yZTpcbiAgICAgIHJldHVybiBnZXQgPyBnZXQuY2FsbCh0aGlzLCB2YWx1ZSkgOiB2YWx1ZVxuICAgIH0sXG5cbiAgICBzZXQodmFsdWUpIHtcbiAgICAgIC8vIEFsbG93IHRoZSBwcm92aWRlZCBzZXR0ZXIgdG8gcmV0dXJuIGEgbmV3IHZhbHVlIHRvIHNldCwgb3IgZG8gdGhlXG4gICAgICAvLyBzZXR0aW5nIGl0c2VsZiwgYW5kIHRoZW4gcmV0dXJuIGB1bmRlZmluZWRgOlxuICAgICAgaWYgKCFzZXQgfHwgKHZhbHVlID0gc2V0LmNhbGwodGhpcywgdmFsdWUpKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuc2V0U3RvcmUobmFtZSwgdmFsdWUpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgRGl0b0NvbnRleHQgZnJvbSAnLi4vRGl0b0NvbnRleHQuanMnXG5pbXBvcnQgVmFsaWRhdGlvbk1peGluIGZyb20gJy4vVmFsaWRhdGlvbk1peGluLmpzJ1xuaW1wb3J0IHsgZ2V0U2NoZW1hQWNjZXNzb3IgfSBmcm9tICcuLi91dGlscy9hY2Nlc3Nvci5qcydcbmltcG9ydCB7IGNvbXB1dGVWYWx1ZSB9IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcbmltcG9ydCB7IGdldEl0ZW0sIGdldFBhcmVudEl0ZW0gfSBmcm9tICcuLi91dGlscy9kYXRhLmpzJ1xuaW1wb3J0IHsgaXNTdHJpbmcsIGFzQXJyYXksIGNhbWVsaXplIH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgbWl4aW5zOiBbVmFsaWRhdGlvbk1peGluXSxcblxuICBwcm9wczoge1xuICAgIHNjaGVtYTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgLy8gTk9URTogV2hpbGUgYGRhdGFQYXRoYCBwb2ludHMgdG8gdGhlIGFjdHVhbCBgdmFsdWVgLCBgZGF0YWAgcmVwcmVzZW50c1xuICAgIC8vIHRoZSBgaXRlbWAgaW4gd2hpY2ggdGhlIGB2YWx1ZWAgaXMgY29udGFpbmVkLCB1bmRlciB0aGUga2V5IGBuYW1lYC5cbiAgICBkYXRhUGF0aDogeyB0eXBlOiBTdHJpbmcsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZGF0YTogeyB0eXBlOiBbT2JqZWN0LCBBcnJheV0sIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgbWV0YTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgc3RvcmU6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHNpbmdsZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIG5lc3RlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhcnNlZFZhbHVlOiB1bmRlZmluZWQsXG4gICAgICBjaGFuZ2VkVmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgIGZvY3VzZWQ6IGZhbHNlXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgbmFtZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjaGVtYS5uYW1lXG4gICAgfSxcblxuICAgIHR5cGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY2hlbWEudHlwZVxuICAgIH0sXG5cbiAgICBjb250ZXh0KCkge1xuICAgICAgcmV0dXJuIG5ldyBEaXRvQ29udGV4dCh0aGlzLCB7IG5lc3RlZDogdGhpcy5uZXN0ZWQgfSlcbiAgICB9LFxuXG4gICAgdmFsdWU6IHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBjb21wdXRlVmFsdWUoXG4gICAgICAgICAgdGhpcy5zY2hlbWEsXG4gICAgICAgICAgdGhpcy5kYXRhLFxuICAgICAgICAgIHRoaXMubmFtZSxcbiAgICAgICAgICB0aGlzLmRhdGFQYXRoLFxuICAgICAgICAgIHsgY29tcG9uZW50OiB0aGlzIH1cbiAgICAgICAgKVxuICAgICAgICBjb25zdCB7IGZvcm1hdCB9ID0gdGhpcy5zY2hlbWFcbiAgICAgICAgLy8gYHNjaGVtYS5mb3JtYXRgIGlzIG9ubHkgZXZlciBjYWxsZWQgaW4gdGhlIGxpZmUtY3ljbGVcbiAgICAgICAgLy8gb2YgdGhlIGNvbXBvbmVudCBhbmQgdGh1cyBpdCdzIG9rIHRvIGJpbmQgaXQgdG8gYHRoaXNgXG4gICAgICAgIHJldHVybiBmb3JtYXRcbiAgICAgICAgICA/IGZvcm1hdC5jYWxsKHRoaXMsIG5ldyBEaXRvQ29udGV4dCh0aGlzLCB7IHZhbHVlIH0pKVxuICAgICAgICAgIDogdmFsdWVcbiAgICAgIH0sXG5cbiAgICAgIHNldCh2YWx1ZSkge1xuICAgICAgICBjb25zdCB7IHBhcnNlIH0gPSB0aGlzLnNjaGVtYVxuICAgICAgICAvLyBgc2NoZW1hLnBhcnNlYCBpcyBvbmx5IGV2ZXIgY2FsbGVkIGluIHRoZSBsaWZlLWN5Y2xlXG4gICAgICAgIC8vIG9mIHRoZSBjb21wb25lbnQgYW5kIHRodXMgaXQncyBvayB0byBiaW5kIGl0IHRvIGB0aGlzYFxuICAgICAgICB0aGlzLnBhcnNlZFZhbHVlID0gcGFyc2VcbiAgICAgICAgICA/IHBhcnNlLmNhbGwodGhpcywgbmV3IERpdG9Db250ZXh0KHRoaXMsIHsgdmFsdWUgfSkpXG4gICAgICAgICAgOiB2YWx1ZVxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdnVlL25vLW11dGF0aW5nLXByb3BzXG4gICAgICAgIHRoaXMuZGF0YVt0aGlzLm5hbWVdID0gdGhpcy5wYXJzZWRWYWx1ZVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBwYXJlbnREYXRhKCkge1xuICAgICAgY29uc3QgZGF0YSA9IGdldFBhcmVudEl0ZW0odGhpcy5yb290RGF0YSwgdGhpcy5kYXRhUGF0aCwgdGhpcy5uZXN0ZWQpXG4gICAgICByZXR1cm4gZGF0YSAhPT0gdGhpcy5kYXRhID8gZGF0YSA6IG51bGxcbiAgICB9LFxuXG4gICAgcHJvY2Vzc2VkRGF0YSgpIHtcbiAgICAgIC8vIFdlIGNhbiBvbmx5IGdldCB0aGUgcHJvY2Vzc2VkIGRhdGEgdGhyb3VnaCB0aGUgc2NoZW1hQ29tcG9uZW50LCBidXRcbiAgICAgIC8vIHRoYXQncyBub3QgbmVjZXNzYXJpbHkgdGhlIGl0ZW0gcmVwcmVzZW50ZWQgYnkgdGhpcyBjb21wb25lbnQuXG4gICAgICAvLyBTb2x1dGlvbjogRmluZCB0aGUgcmVsYXRpdmUgcGF0aCBhbmQgdGhlIHByb2Nlc3NlZCBzdWItaXRlbSBmcm9tIHRoZXJlOlxuICAgICAgY29uc3QgeyBzY2hlbWFDb21wb25lbnQgfSA9IHRoaXNcbiAgICAgIHJldHVybiBnZXRJdGVtKFxuICAgICAgICBzY2hlbWFDb21wb25lbnQucHJvY2Vzc2VkRGF0YSxcbiAgICAgICAgLy8gR2V0IHRoZSBkYXRhUGF0aCByZWxhdGl2ZSB0byB0aGUgc2NoZW1hQ29tcG9uZW50J3MgZGF0YTpcbiAgICAgICAgdGhpcy5kYXRhUGF0aC5zbGljZShzY2hlbWFDb21wb25lbnQuZGF0YVBhdGgubGVuZ3RoKSxcbiAgICAgICAgdGhpcy5uZXN0ZWRcbiAgICAgIClcbiAgICB9LFxuXG4gICAgLy8gVGhlIGZvbGxvd2luZyBjb21wdXRlZCBwcm9wZXJ0aWVzIGFyZSBzaW1pbGFyIHRvIGBEaXRvQ29udGV4dGBcbiAgICAvLyBwcm9wZXJ0aWVzLCBzbyB0aGF0IHdlIGNhbiBhY2Nlc3MgdGhlc2Ugb24gYHRoaXNgIGFzIHdlbGw6XG4gICAgaXRlbSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFcbiAgICB9LFxuXG4gICAgcGFyZW50SXRlbSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnBhcmVudERhdGFcbiAgICB9LFxuXG4gICAgcm9vdEl0ZW0oKSB7XG4gICAgICByZXR1cm4gdGhpcy5yb290RGF0YVxuICAgIH0sXG5cbiAgICBwcm9jZXNzZWRJdGVtKCkge1xuICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc2VkRGF0YVxuICAgIH0sXG5cbiAgICBsYWJlbDogZ2V0U2NoZW1hQWNjZXNzb3IoJ2xhYmVsJywge1xuICAgICAgdHlwZTogW1N0cmluZywgQm9vbGVhbl0sXG4gICAgICBnZXQobGFiZWwpIHtcbiAgICAgICAgcmV0dXJuIGlzU3RyaW5nKGxhYmVsKVxuICAgICAgICAgID8gbGFiZWxcbiAgICAgICAgICA6IGxhYmVsICE9PSBmYWxzZSAmJiB0aGlzLiRvcHRpb25zLmdlbmVyYXRlTGFiZWxcbiAgICAgICAgICAgID8gdGhpcy5nZXRMYWJlbCh0aGlzLnNjaGVtYSlcbiAgICAgICAgICAgIDogbnVsbFxuICAgICAgfVxuICAgIH0pLFxuXG4gICAgd2lkdGg6IGdldFNjaGVtYUFjY2Vzc29yKCd3aWR0aCcsIHtcbiAgICAgIHR5cGU6IFtTdHJpbmcsIE51bWJlcl1cbiAgICB9KSxcblxuICAgIHZpc2libGU6IGdldFNjaGVtYUFjY2Vzc29yKCd2aXNpYmxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiRvcHRpb25zLmRlZmF1bHRWaXNpYmxlXG4gICAgICB9XG4gICAgfSksXG5cbiAgICAvLyBUT0RPOiBSZW5hbWUgdG8gYGV4Y2x1ZGVkYCBmb3IgY29uc2lzdGVudCBuYW1pbmc/XG4gICAgZXhjbHVkZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ2V4Y2x1ZGUnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9KSxcblxuICAgIHJlcXVpcmVkOiBnZXRTY2hlbWFBY2Nlc3NvcigncmVxdWlyZWQnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9KSxcblxuICAgIC8vIFRPRE86IE1vdmUgdGhlc2UgdG8gYSBzdWItY2xhc3MgY29tcG9uZW50IHVzZWQgZm9yIGFsbCBpbnB1dCBjb21wb25lbnRzP1xuICAgIHJlYWRvbmx5OiBnZXRTY2hlbWFBY2Nlc3NvcigncmVhZG9ubHknLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9KSxcblxuICAgIGF1dG9mb2N1czogZ2V0U2NoZW1hQWNjZXNzb3IoJ2F1dG9mb2N1cycsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0pLFxuXG4gICAgLy8gVG8gYmUgdXNlZCBmb3Igc2VsZWN0cyBhbmQgaW5wdXRzIG9ubHk/XG4gICAgY2xlYXJhYmxlOiBnZXRTY2hlbWFBY2Nlc3NvcignY2xlYXJhYmxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSksXG5cbiAgICBwbGFjZWhvbGRlcjogZ2V0U2NoZW1hQWNjZXNzb3IoJ3BsYWNlaG9sZGVyJywge1xuICAgICAgdHlwZTogU3RyaW5nXG4gICAgfSksXG5cbiAgICBhdXRvY29tcGxldGU6IGdldFNjaGVtYUFjY2Vzc29yKCdhdXRvY29tcGxldGUnLCB7XG4gICAgICB0eXBlOiBTdHJpbmdcbiAgICB9KSxcblxuICAgIGV2ZW50cygpIHtcbiAgICAgIGNvbnN0IGV2ZW50cyA9IHRoaXMuZ2V0RXZlbnRzKClcbiAgICAgIC8vIFJlZ2lzdGVyIGNhbGxiYWNrcyBmb3IgYWxsIHByb3ZpZGVzIG5vbi1yZWNvZ25pemVkIGV2ZW50cyxcbiAgICAgIC8vIGFzc3VtaW5nIHRoZXkgYXJlIG5hdGl2ZSBldmVudHMuXG4gICAgICAvLyBUT0RPOiBNb3ZlIHRvIHZ1ZTMtc3R5bGUgYG9uW0EtWl1gIGV2ZW50IGhhbmRsZXJzIG5hbWluZyB0aGF0IGFyZW4ndFxuICAgICAgLy8gbmFtZXNwYWNlZCBpbiBgc2NoZW1hLmV2ZW50c2Agb25jZSB0aGUgdHJhbnNpdGlvbiBpcyBjb21wbGV0ZS5cbiAgICAgIGZvciAoY29uc3QgZXZlbnQgb2YgT2JqZWN0LmtleXModGhpcy5zY2hlbWEuZXZlbnRzIHx8IHt9KSkge1xuICAgICAgICBldmVudHNbYG9uJHtjYW1lbGl6ZShldmVudCwgdHJ1ZSl9YF0gPz89ICgpID0+IHtcbiAgICAgICAgICB0aGlzLmVtaXRFdmVudChldmVudClcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGV2ZW50c1xuICAgIH0sXG5cbiAgICBhdHRyaWJ1dGVzKCkge1xuICAgICAgY29uc3QgeyBuYXRpdmVGaWVsZCwgdGV4dEZpZWxkIH0gPSB0aGlzLiRvcHRpb25zXG5cbiAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSB7XG4gICAgICAgIC4uLnRoaXMuZXZlbnRzLFxuICAgICAgICBkaXNhYmxlZDogdGhpcy5kaXNhYmxlZFxuICAgICAgfVxuXG4gICAgICBpZiAobmF0aXZlRmllbGQpIHtcbiAgICAgICAgYXR0cmlidXRlcy5uYW1lID0gdGhpcy5uYW1lXG4gICAgICAgIGlmICh0aGlzLmxhYmVsKSB7XG4gICAgICAgICAgYXR0cmlidXRlcy50aXRsZSA9IHRoaXMubGFiZWxcbiAgICAgICAgfVxuICAgICAgICBhdHRyaWJ1dGVzLnJlYWRvbmx5ID0gdGhpcy5yZWFkb25seVxuICAgICAgICBhdHRyaWJ1dGVzLmF1dG9mb2N1cyA9IHRoaXMuYXV0b2ZvY3VzXG4gICAgICAgIGlmICh0ZXh0RmllbGQpIHtcbiAgICAgICAgICBhdHRyaWJ1dGVzLnBsYWNlaG9sZGVyID0gdGhpcy5wbGFjZWhvbGRlclxuICAgICAgICAgIGF0dHJpYnV0ZXMuYXV0b2NvbXBsZXRlID0gdGhpcy5hdXRvY29tcGxldGVcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXR0cmlidXRlc1xuICAgIH0sXG5cbiAgICB2YWxpZGF0aW9ucygpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25zID0geyAuLi50aGlzLmdldFZhbGlkYXRpb25zKCkgfVxuICAgICAgaWYgKHRoaXMucmVxdWlyZWQpIHtcbiAgICAgICAgdmFsaWRhdGlvbnMucmVxdWlyZWQgPSB0cnVlXG4gICAgICB9XG4gICAgICAvLyBBbGxvdyBzY2hlbWEgdG8gb3ZlcnJpZGUgZGVmYXVsdCBydWxlcyBhbmQgYWRkIGFueSBuZXcgb25lczpcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuc2NoZW1hLnJ1bGVzIHx8IHt9KSkge1xuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGRlbGV0ZSB2YWxpZGF0aW9uc1trZXldXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsaWRhdGlvbnNba2V5XSA9IHZhbHVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWxpZGF0aW9uc1xuICAgIH0sXG5cbiAgICBzaG93Q2xlYXJCdXR0b24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5jbGVhcmFibGUgJiYgdGhpcy52YWx1ZSAhPSBudWxsXG4gICAgfVxuICB9LFxuXG4gIGNyZWF0ZWQoKSB7XG4gICAgdGhpcy5fcmVnaXN0ZXIodHJ1ZSlcbiAgICB0aGlzLnNldHVwU2NoZW1hRmllbGRzKClcbiAgfSxcblxuICB1bm1vdW50ZWQoKSB7XG4gICAgdGhpcy5fcmVnaXN0ZXIoZmFsc2UpXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIF9yZWdpc3RlcihhZGQpIHtcbiAgICAgIC8vIFByZXZlbnQgdW5uZXN0ZWQgdHlwZSBjb21wb25lbnRzIGZyb20gb3ZlcnJpZGluZyBwYXJlbnQgZGF0YSBwYXRoc1xuICAgICAgaWYgKHRoaXMubmVzdGVkKSB7XG4gICAgICAgIHRoaXMuc2NoZW1hQ29tcG9uZW50Ll9yZWdpc3RlckNvbXBvbmVudCh0aGlzLCBhZGQpXG4gICAgICB9XG4gICAgfSxcblxuICAgIC8vIEBvdmVycmlkYWJsZVxuICAgIGdldEV2ZW50cygpIHtcbiAgICAgIGNvbnN0IHsgb25Gb2N1cywgb25CbHVyLCBvbklucHV0LCBvbkNoYW5nZSB9ID0gdGhpc1xuICAgICAgcmV0dXJuIHsgb25Gb2N1cywgb25CbHVyLCBvbklucHV0LCBvbkNoYW5nZSB9XG4gICAgfSxcblxuICAgIC8vIEBvdmVycmlkYWJsZVxuICAgIGdldFZhbGlkYXRpb25zKCkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9LFxuXG4gICAgLy8gQG92ZXJyaWRhYmxlXG4gICAgZm9jdXNFbGVtZW50KCkge1xuICAgICAgY29uc3QgW2VsZW1lbnRdID0gYXNBcnJheSh0aGlzLiRyZWZzLmVsZW1lbnQpXG4gICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgZWxlbWVudC5mb2N1cygpXG4gICAgICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgaXMgZGlzYWJsZWQsIGBmb2N1cygpYCB3aWxsIGxpa2VseSBub3QgaGF2ZSB0aGVcbiAgICAgICAgICAvLyBkZXNpcmVkIGVmZmVjdC4gVXNlIGBzY3JvbGxJbnRvVmlldygpYCBpZiBhdmFpbGFibGU6XG4gICAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIDsoZWxlbWVudC4kZWwgfHwgZWxlbWVudCkuc2Nyb2xsSW50b1ZpZXc/LigpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBmb2N1cygpIHtcbiAgICAgIC8vIEFsc28gZm9jdXMgdGhpcyBjb21wb25lbnQncyBzY2hlbWEgYW5kIHBhbmVsIGluIGNhc2UgaXQncyBhIHRhYi5cbiAgICAgIHRoaXMuc2NoZW1hQ29tcG9uZW50LmZvY3VzKClcbiAgICAgIHRoaXMudGFiQ29tcG9uZW50Py5mb2N1cygpXG4gICAgICB0aGlzLmZvY3VzRWxlbWVudCgpXG4gICAgfSxcblxuICAgIGNsZWFyKCkge1xuICAgICAgdGhpcy52YWx1ZSA9IG51bGxcbiAgICAgIHRoaXMub25DaGFuZ2UoKVxuICAgIH0sXG5cbiAgICBvbkZvY3VzKCkge1xuICAgICAgdGhpcy5mb2N1c2VkID0gdHJ1ZVxuICAgICAgdGhpcy5tYXJrVG91Y2hlZCgpXG4gICAgICB0aGlzLmVtaXRFdmVudCgnZm9jdXMnKVxuICAgIH0sXG5cbiAgICBvbkJsdXIoKSB7XG4gICAgICB0aGlzLmZvY3VzZWQgPSBmYWxzZVxuICAgICAgdGhpcy52YWxpZGF0ZSgpXG4gICAgICB0aGlzLmVtaXRFdmVudCgnYmx1cicpXG4gICAgfSxcblxuICAgIG9uSW5wdXQoKSB7XG4gICAgICBjb25zb2xlLmxvZygnb25JbnB1dCgpJywgdGhpcy5uYW1lKVxuICAgICAgdGhpcy5tYXJrRGlydHkoKVxuICAgICAgdGhpcy5lbWl0RXZlbnQoJ2lucHV0JylcbiAgICB9LFxuXG4gICAgb25DaGFuZ2UoKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9XG4gICAgICAgIHRoaXMucGFyc2VkVmFsdWUgIT09IHVuZGVmaW5lZCA/IHRoaXMucGFyc2VkVmFsdWUgOiB0aGlzLnZhbHVlXG5cbiAgICAgIGlmICh0aGlzLiRvcHRpb25zLm5hdGl2ZUZpZWxkKSB7XG4gICAgICAgIC8vIEZvciBzb21lIG9kZCByZWFzb24sIHRoZSBuYXRpdmUgY2hhbmdlIGV2ZW50IG5vdyBzb21ldGltZXMgZmlyZXNcbiAgICAgICAgLy8gdHdpY2Ugb24gVnVlMy4gRmlsdGVyIG91dCBzZWNvbmQgY2FsbC5cbiAgICAgICAgLy8gVE9ETzogSW52ZXN0aWdhdGUgd2h5IHRoaXMgaGFwcGVucywgYW5kIGlmIGl0J3MgYSBidWcgaW4gVnVlMy5cbiAgICAgICAgaWYgKHZhbHVlID09PSB0aGlzLmNoYW5nZWRWYWx1ZSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdvbkNoYW5nZSgpIGRvdWJsZScsIHRoaXMubmFtZSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNoYW5nZWRWYWx1ZSA9IHZhbHVlXG4gICAgICB9XG5cbiAgICAgIGNvbnNvbGUubG9nKCdvbkNoYW5nZSgpJywgdGhpcy5uYW1lLCB2YWx1ZSlcbiAgICAgIHRoaXMubWFya0RpcnR5KClcbiAgICAgIHRoaXMuZW1pdEV2ZW50KCdjaGFuZ2UnLCB7XG4gICAgICAgIC8vIFByZXZlbnQgZW5kbGVzcyBwYXJzZSByZWN1cnNpb246XG4gICAgICAgIGNvbnRleHQ6IHsgdmFsdWUgfSxcbiAgICAgICAgLy8gUGFzcyBgc2NoZW1hQ29tcG9uZW50YCBhcyBwYXJlbnQsIHNvIGNoYW5nZSBldmVudHMgY2FuIHByb3BhZ2F0ZSB1cC5cbiAgICAgICAgcGFyZW50OiB0aGlzLnNjaGVtYUNvbXBvbmVudFxuICAgICAgfSlcbiAgICB9XG4gIH1cbn1cbiIsImNvbnN0IHVpZE1hcCA9IG5ldyBXZWFrTWFwKClcblxuLy8gR2VuZXJhdGVkIGFuZCByZW1lbWJlcnMgdW5pcXVlIGlkcyBwZXIgcGFzc2VkIG9iamVjdCB1c2luZyBhIHdlYWsgbWFwLlxubGV0IHVpZCA9IDBcbmV4cG9ydCBmdW5jdGlvbiBnZXRVaWQob2JqZWN0LCBpdGVtSWQpIHtcbiAgbGV0IGlkID0gdWlkTWFwLmdldChvYmplY3QpXG4gIGlmICghaWQpIHtcbiAgICBpZCA9IGl0ZW1JZCB8fCBgQCR7Kyt1aWR9YFxuICAgIHVpZE1hcC5zZXQob2JqZWN0LCBpZClcbiAgfVxuICByZXR1cm4gaWRcbn1cbiIsImltcG9ydCB7IGlzVGVtcG9yYXJ5SWQgfSBmcm9tICcuL2RhdGEuanMnXG5pbXBvcnQge1xuICBpc0ludGVnZXIsXG4gIGFzQXJyYXksXG4gIHBhcnNlRGF0YVBhdGgsXG4gIGdldFZhbHVlQXREYXRhUGF0aFxufSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IHsgbmFub2lkIH0gZnJvbSAnbmFub2lkJ1xuXG4vLyBTY2hlbWFHcmFwaCBpcyBhIGNsYXNzIHRvIGNvbGxlY3Qgc2NoZW1hIGdyYXBoIG1ldGEgaW5mb3JtYXRpb24gaW4gb3JkZXIgdG9cbi8vIHByb2Nlc3Mgc291cmNlcyBhbmQgcmVsYXRpb25zIGZvciB0aGUgZ2l2ZW4gdGFyZ2V0cyAnc2VydmVyJyBhbmQgJ2NsaXBib2FyZCcsXG4vLyBhY2NvcmRpbmcgdG8gdGhlIGZvbGxvd2luZyB0YWJsZTpcbi8vXG4vLyB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCAtLS0tLS0tLS0gfCAtLS0tLS0tLS0gfFxuLy8gfCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc2VydmVyICAgIHwgY2xpcGJvYXJkIHxcbi8vIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IC0tLS0tLS0tLSB8IC0tLS0tLS0tLSB8XG4vLyB8IHR5cGU6ICdyZWxhdGlvbicsIGludGVybmFsOiBmYWxzZSAgICAgICAgICAgfCBrZWVwIGlkICAgfCBrZWVwIGlkICAgfFxuLy8gfCB0eXBlOiAncmVsYXRpb24nLCBpbnRlcm5hbDogdHJ1ZSAgICAgICAgICAgIHwga2VlcCBpZCAgIHwgcmVmLCAjcmVmIHxcbi8vIHwgdHlwZTogJ3JlbGF0aW9uJywgaW50ZXJuYWw6IHRydWUsIHRlbXBvcmFyeSB8IHJlZiwgI3JlZiB8IHJlZiwgI3JlZiB8XG4vLyB8IHR5cGU6ICdzb3VyY2UnLCByZWxhdGVkOiBmYWxzZSAgICAgICAgICAgICAgfCBrZWVwIGlkICAgfCByZW1vdmUgaWQgfFxuLy8gfCB0eXBlOiAnc291cmNlJywgcmVsYXRlZDogZmFsc2UsIHRlbXBvcmFyeSAgIHwgcmVmLCAjaWQgIHwgcmVtb3ZlIGlkIHxcbi8vIHwgdHlwZTogJ3NvdXJjZScsIHJlbGF0ZWQ6IHRydWUgICAgICAgICAgICAgICB8IGtlZXAgaWQgICB8IHJlZiwgI2lkICB8XG4vLyB8IHR5cGU6ICdzb3VyY2UnLCByZWxhdGVkOiB0cnVlLCB0ZW1wb3JhcnkgICAgfCByZWYsICNpZCAgfCByZWYsICNpZCAgfFxuLy8gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgLS0tLS0tLS0tIHwgLS0tLS0tLS0tIHxcblxuZXhwb3J0IGNsYXNzIFNjaGVtYUdyYXBoIHtcbiAgZ3JhcGggPSB7fVxuICByZWZlcmVuY2VzID0ge31cblxuICBzZXQoZGF0YVBhdGgsIHNldHRpbmdzLCBkZWZhdWx0cykge1xuICAgIGRhdGFQYXRoID0gcGFyc2VEYXRhUGF0aChkYXRhUGF0aClcbiAgICBsZXQgc3ViR3JhcGggPSB0aGlzLmdyYXBoXG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIGRhdGFQYXRoKSB7XG4gICAgICBjb25zdCBrZXkgPSBpc0ludGVnZXIoK3BhcnQpID8gJyonIDogcGFydFxuICAgICAgc3ViR3JhcGggPSBzdWJHcmFwaFtrZXldID8/PSB7fVxuICAgIH1cbiAgICBzdWJHcmFwaC4kc2V0dGluZ3MgPSB7XG4gICAgICAuLi5kZWZhdWx0cywgLy8gU2VlIGBhZGRTb3VyY2UoZGF0YVBhdGgpYFxuICAgICAgLi4uc3ViR3JhcGguJHNldHRpbmdzLFxuICAgICAgLi4uc2V0dGluZ3NcbiAgICB9XG4gIH1cblxuICBhZGRTb3VyY2UoZGF0YVBhdGgsIHNjaGVtYSkge1xuICAgIC8vIE9ubHkgc2V0IGByZWxhdGVkOiBmYWxzZWAgdGhyb3VnaCB0aGUgZGVmYXVsdHMsIGFzIGBzZXRTb3VyY2VSZWxhdGVkKClgXG4gICAgLy8gbWF5IGJlIGNhbGxlZCBiZWZvcmUgYGFkZFNvdXJjZSgpYCwgZGVwZW5kaW5nIG9uIHRoZSBncmFwaCBzdHJ1Y3R1cmUuXG4gICAgdGhpcy5zZXQoZGF0YVBhdGgsIHsgdHlwZTogJ3NvdXJjZScsIHNjaGVtYSB9LCB7IHJlbGF0ZWQ6IGZhbHNlIH0pXG4gIH1cblxuICBzZXRTb3VyY2VSZWxhdGVkKGRhdGFQYXRoKSB7XG4gICAgdGhpcy5zZXQoZGF0YVBhdGgsIHtcbiAgICAgIHJlbGF0ZWQ6IHRydWUsXG4gICAgICByZWZlcmVuY2U6IHRoaXMuZ2V0UmVmZXJlbmNlUHJlZml4KGRhdGFQYXRoKVxuICAgIH0pXG4gIH1cblxuICBhZGRSZWxhdGlvbihkYXRhUGF0aCwgcmVsYXRlZERhdGFQYXRoLCBzY2hlbWEpIHtcbiAgICB0aGlzLnNldChkYXRhUGF0aCwge1xuICAgICAgdHlwZTogJ3JlbGF0aW9uJyxcbiAgICAgIHNjaGVtYSxcbiAgICAgIGludGVybmFsOiAhIXJlbGF0ZWREYXRhUGF0aCxcbiAgICAgIHJlZmVyZW5jZTogdGhpcy5nZXRSZWZlcmVuY2VQcmVmaXgocmVsYXRlZERhdGFQYXRoKVxuICAgIH0pXG4gIH1cblxuICBnZXRSZWZlcmVuY2VQcmVmaXgoZGF0YVBhdGgpIHtcbiAgICByZXR1cm4gZGF0YVBhdGhcbiAgICAgID8gKHRoaXMucmVmZXJlbmNlc1tkYXRhUGF0aF0gPz89IG5hbm9pZCg2KSlcbiAgICAgIDogbnVsbFxuICB9XG5cbiAgZmxhdHRlbigpIHtcbiAgICBjb25zdCBmbGF0dGVuID0gZ3JhcGggPT4ge1xuICAgICAgY29uc3QgZW50cmllcyA9IFtdXG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHsgJHNldHRpbmdzLCAuLi5zdWJHcmFwaCB9XSBvZiBPYmplY3QuZW50cmllcyhncmFwaCkpIHtcbiAgICAgICAgaWYgKCRzZXR0aW5ncykge1xuICAgICAgICAgIGVudHJpZXMucHVzaChba2V5LCAkc2V0dGluZ3NdKVxuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgW3N1YktleSwgc2V0dGluZ3NdIG9mIGZsYXR0ZW4oc3ViR3JhcGgpKSB7XG4gICAgICAgICAgZW50cmllcy5wdXNoKFtgJHtrZXl9LyR7c3ViS2V5fWAsIHNldHRpbmdzXSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGVudHJpZXNcbiAgICB9XG5cbiAgICByZXR1cm4gZmxhdHRlbih0aGlzLmdyYXBoKVxuICB9XG5cbiAgcHJvY2Vzcyhzb3VyY2VTY2hlbWEsIGRhdGEsIHsgdGFyZ2V0IH0pIHtcbiAgICBjb25zdCBjbGlwYm9hcmQgPSB0YXJnZXQgPT09ICdjbGlwYm9hcmQnXG4gICAgaWYgKGNsaXBib2FyZCkge1xuICAgICAgZGVsZXRlIGRhdGFbc291cmNlU2NoZW1hLmlkS2V5IHx8ICdpZCddXG4gICAgfVxuICAgIGZvciAoY29uc3QgW2RhdGFQYXRoLCBzZXR0aW5nc10gb2YgdGhpcy5mbGF0dGVuKCkpIHtcbiAgICAgIGNvbnN0IHsgdHlwZSwgc2NoZW1hLCBpbnRlcm5hbCwgcmVsYXRlZCwgcmVmZXJlbmNlIH0gPSBzZXR0aW5nc1xuICAgICAgY29uc3Qgc291cmNlID0gdHlwZSA9PT0gJ3NvdXJjZSdcbiAgICAgIGNvbnN0IHJlbGF0aW9uID0gdHlwZSA9PT0gJ3JlbGF0aW9uJ1xuICAgICAgaWYgKHNvdXJjZSB8fCByZWxhdGlvbiAmJiBpbnRlcm5hbCkge1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSBnZXRWYWx1ZUF0RGF0YVBhdGgoZGF0YSwgZGF0YVBhdGgsICgpID0+IG51bGwpXG4gICAgICAgIGNvbnN0IHJlbW92ZUlkID0gY2xpcGJvYXJkICYmIHNvdXJjZSAmJiAhcmVsYXRlZFxuICAgICAgICBjb25zdCByZWZlcmVuY2VJZCA9IChcbiAgICAgICAgICBjbGlwYm9hcmQgJiYgKFxuICAgICAgICAgICAgcmVsYXRpb24gJiYgaW50ZXJuYWwgfHxcbiAgICAgICAgICAgIHNvdXJjZSAmJiByZWxhdGVkXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgYXNBcnJheSh2YWx1ZXMpLmZsYXQoKSkge1xuICAgICAgICAgIGNvbnN0IGlkS2V5ID0gKFxuICAgICAgICAgICAgc291cmNlICYmIHNjaGVtYS5pZEtleSB8fFxuICAgICAgICAgICAgcmVsYXRpb24gJiYgc2NoZW1hLnJlbGF0ZUJ5IHx8XG4gICAgICAgICAgICAnaWQnXG4gICAgICAgICAgKVxuICAgICAgICAgIGxldCBpZCA9IHZhbHVlPy5baWRLZXldXG4gICAgICAgICAgaWYgKGlkICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChyZW1vdmVJZCkge1xuICAgICAgICAgICAgICBkZWxldGUgdmFsdWVbaWRLZXldXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVmZXJlbmNlSWQgfHwgaXNUZW1wb3JhcnlJZChpZCkpIHtcbiAgICAgICAgICAgICAgaWYgKGlzVGVtcG9yYXJ5SWQoaWQpKSB7XG4gICAgICAgICAgICAgICAgaWQgPSBpZC5zbGljZSgxKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IHJlZktleSA9IGNsaXBib2FyZFxuICAgICAgICAgICAgICAgID8gLy8gQ2xpcGJvYXJkIGp1c3QgbmVlZHMgdGVtcG9yYXJ5IGlkcyB1bmRlciB0aGUgYWN0dWFsIGBpZEtleWBcbiAgICAgICAgICAgICAgICAgIGlkS2V5XG4gICAgICAgICAgICAgICAgOiAvLyBTZXJ2ZXIgd2FudHMgT2JqZWN0aW9uLXN0eWxlICcjaWQnIC8gJyNyZWYnIHBhaXJzLlxuICAgICAgICAgICAgICAgICAgc291cmNlXG4gICAgICAgICAgICAgICAgICA/ICcjaWQnXG4gICAgICAgICAgICAgICAgICA6ICcjcmVmJ1xuICAgICAgICAgICAgICBjb25zdCByZXZWYWx1ZSA9IGNsaXBib2FyZFxuICAgICAgICAgICAgICAgID8gYEAke2lkfWBcbiAgICAgICAgICAgICAgICA6IC8vIEtlZXAgdGhlIGlkcyB1bmlxdWUgaW4gcmVmZXJlbmNlIGdyb3Vwcywgc2luY2UgdGhleVxuICAgICAgICAgICAgICAgICAgLy8gcmVmZXJlbmNlIGFjcm9zcyB0aGUgZnVsbCBncmFwaC5cbiAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZVxuICAgICAgICAgICAgICAgICAgPyBgJHtyZWZlcmVuY2V9LSR7aWR9YFxuICAgICAgICAgICAgICAgICAgOiBpZCAvLyBBIHRlbXBvcmFyeSBpZCB3aXRob3V0IGEgcmVsYXRlZCwganVzdCBwcmVzZXJ2ZSBpdC5cbiAgICAgICAgICAgICAgdmFsdWVbcmVmS2V5XSA9IHJldlZhbHVlXG4gICAgICAgICAgICAgIGlmIChyZWZLZXkgIT09IGlkS2V5KSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHZhbHVlW2lkS2V5XVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhXG4gIH1cbn1cbiIsImltcG9ydCBEaXRvQ29udGV4dCBmcm9tICcuLi9EaXRvQ29udGV4dC5qcydcbmltcG9ydCBEaXRvTWl4aW4gZnJvbSAnLi4vbWl4aW5zL0RpdG9NaXhpbi5qcydcbmltcG9ydCBUeXBlTWl4aW4gZnJvbSAnLi4vbWl4aW5zL1R5cGVNaXhpbi5qcydcbmltcG9ydCB7IGdldFVpZCB9IGZyb20gJy4vdWlkLmpzJ1xuaW1wb3J0IHsgU2NoZW1hR3JhcGggfSBmcm9tICcuL1NjaGVtYUdyYXBoLmpzJ1xuaW1wb3J0IHsgYXBwZW5kRGF0YVBhdGgsIGlzVGVtcG9yYXJ5SWQgfSBmcm9tICcuL2RhdGEuanMnXG5pbXBvcnQge1xuICBpc09iamVjdCxcbiAgaXNTdHJpbmcsXG4gIGlzQXJyYXksXG4gIGlzRnVuY3Rpb24sXG4gIGlzUHJvbWlzZSxcbiAgaXNNb2R1bGUsXG4gIGNsb25lLFxuICBtZXJnZSxcbiAgY2FtZWxpemUsXG4gIG1hcENvbmN1cnJlbnRseVxufSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IHsgbWFya1JhdyB9IGZyb20gJ3Z1ZSdcblxuY29uc3QgdHlwZUNvbXBvbmVudHMgPSB7fVxuY29uc3QgdW5rbm93blR5cGVSZXBvcnRlZCA9IHt9XG5cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlclR5cGVDb21wb25lbnQodHlwZSwgY29tcG9uZW50KSB7XG4gIHR5cGVDb21wb25lbnRzW3R5cGVdID0gY29tcG9uZW50XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUeXBlQ29tcG9uZW50KHR5cGUsIGFsbG93TnVsbCA9IGZhbHNlKSB7XG4gIGNvbnN0IGNvbXBvbmVudCA9IHR5cGVDb21wb25lbnRzW3R5cGVdIHx8IG51bGxcbiAgaWYgKCFjb21wb25lbnQgJiYgIWFsbG93TnVsbCAmJiAhdW5rbm93blR5cGVSZXBvcnRlZFt0eXBlXSkge1xuICAgIC8vIFJlcG9ydCBlYWNoIG1pc3NpbmcgdHlwZSBvbmx5IG9uY2UsIHRvIGF2b2lkIGZsb29kaW5nIHRoZSBjb25zb2xlOlxuICAgIHVua25vd25UeXBlUmVwb3J0ZWRbdHlwZV0gPSB0cnVlXG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIERpdG8gY29tcG9uZW50IHR5cGU6ICcke3R5cGV9J2ApXG4gIH1cbiAgcmV0dXJuIGNvbXBvbmVudFxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXRlcmF0ZVNjaGVtYUNvbXBvbmVudHMoc2NoZW1hcywgY2FsbGJhY2spIHtcbiAgZm9yIChjb25zdCBzY2hlbWEgb2Ygc2NoZW1hcykge1xuICAgIGlmIChpc1NpbmdsZUNvbXBvbmVudFZpZXcoc2NoZW1hKSkge1xuICAgICAgY29uc3QgcmVzID0gY2FsbGJhY2soc2NoZW1hLmNvbXBvbmVudCwgc2NoZW1hLm5hbWUsIDApXG4gICAgICBpZiAocmVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHJlc1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IFtuYW1lLCBjb21wb25lbnRdIG9mIE9iamVjdC5lbnRyaWVzKHNjaGVtYS5jb21wb25lbnRzIHx8IHt9KSkge1xuICAgICAgICBjb25zdCByZXMgPSBjYWxsYmFjayhjb21wb25lbnQsIG5hbWUsIDEpXG4gICAgICAgIGlmIChyZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiByZXNcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXRlcmF0ZU5lc3RlZFNjaGVtYUNvbXBvbmVudHMoc2NoZW1hLCBjYWxsYmFjaykge1xuICByZXR1cm4gc2NoZW1hXG4gICAgPyBpdGVyYXRlU2NoZW1hQ29tcG9uZW50cyhbc2NoZW1hLCAuLi5nZXRUYWJTY2hlbWFzKHNjaGVtYSldLCBjYWxsYmFjaylcbiAgICA6IHVuZGVmaW5lZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFNjaGVtYUNvbXBvbmVudChzY2hlbWEsIGNhbGxiYWNrKSB7XG4gIHJldHVybiAoXG4gICAgaXRlcmF0ZU5lc3RlZFNjaGVtYUNvbXBvbmVudHMoXG4gICAgICBzY2hlbWEsXG4gICAgICBjb21wb25lbnQgPT4gKGNhbGxiYWNrKGNvbXBvbmVudCkgPyBjb21wb25lbnQgOiB1bmRlZmluZWQpXG4gICAgKSB8fCBudWxsXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNvbWVTY2hlbWFDb21wb25lbnQoc2NoZW1hLCBjYWxsYmFjaykge1xuICByZXR1cm4gKFxuICAgIGl0ZXJhdGVOZXN0ZWRTY2hlbWFDb21wb25lbnRzKFxuICAgICAgc2NoZW1hLFxuICAgICAgY29tcG9uZW50ID0+IChjYWxsYmFjayhjb21wb25lbnQpID8gdHJ1ZSA6IHVuZGVmaW5lZClcbiAgICApID09PSB0cnVlXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV2ZXJ5U2NoZW1hQ29tcG9uZW50KHNjaGVtYSwgY2FsbGJhY2spIHtcbiAgcmV0dXJuIChcbiAgICBpdGVyYXRlTmVzdGVkU2NoZW1hQ29tcG9uZW50cyhcbiAgICAgIHNjaGVtYSxcbiAgICAgIGNvbXBvbmVudCA9PiAoY2FsbGJhY2soY29tcG9uZW50KSA/IHVuZGVmaW5lZCA6IGZhbHNlKVxuICAgICkgIT09IGZhbHNlXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU2NoZW1hKHNjaGVtYSkge1xuICByZXR1cm4gaXNPYmplY3Qoc2NoZW1hKSAmJiBpc1N0cmluZyhzY2hlbWEudHlwZSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRm9ybShzY2hlbWEpIHtcbiAgcmV0dXJuIGlzU2NoZW1hKHNjaGVtYSkgJiYgc2NoZW1hLnR5cGUgPT09ICdmb3JtJ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNWaWV3KHNjaGVtYSkge1xuICByZXR1cm4gaXNTY2hlbWEoc2NoZW1hKSAmJiBzY2hlbWEudHlwZSA9PT0gJ3ZpZXcnXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1RhYihzY2hlbWEpIHtcbiAgcmV0dXJuIGlzU2NoZW1hKHNjaGVtYSkgJiYgc2NoZW1hLnR5cGUgPT09ICd0YWInXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1BhbmVsKHNjaGVtYSkge1xuICByZXR1cm4gaXNTY2hlbWEoc2NoZW1hKSAmJiBzY2hlbWEudHlwZSA9PT0gJ3BhbmVsJ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2NoZW1hSWRlbnRpZmllcihzY2hlbWEpIHtcbiAgcmV0dXJuIHNjaGVtYS5uYW1lIHx8IHNjaGVtYS5sYWJlbCB8fCBzY2hlbWEudHlwZVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVNjaGVtYShzY2hlbWEsIHVud3JhcE1vZHVsZSA9IGZhbHNlKSB7XG4gIGlmIChpc0Z1bmN0aW9uKHNjaGVtYSkpIHtcbiAgICBzY2hlbWEgPSBzY2hlbWEoKVxuICB9XG4gIGlmIChpc1Byb21pc2Uoc2NoZW1hKSkge1xuICAgIHNjaGVtYSA9IGF3YWl0IHNjaGVtYVxuICB9XG4gIGlmIChpc01vZHVsZShzY2hlbWEpKSB7XG4gICAgLy8gQ29weSB0byBjb252ZXJ0IGZyb20gbW9kdWxlIHRvIG9iamVjdDpcbiAgICBzY2hlbWEgPSB7IC4uLnNjaGVtYSB9XG4gICAgLy8gVW53cmFwIGRlZmF1bHQgb3IgbmFtZWQgc2NoZW1hXG4gICAgaWYgKCFzY2hlbWEubmFtZSAmJiAodW53cmFwTW9kdWxlIHx8IHNjaGVtYS5kZWZhdWx0KSkge1xuICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHNjaGVtYSlcbiAgICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb25zdCBuYW1lID0ga2V5c1swXVxuICAgICAgICBzY2hlbWEgPSBzY2hlbWFbbmFtZV1cbiAgICAgICAgaWYgKG5hbWUgIT09ICdkZWZhdWx0Jykge1xuICAgICAgICAgIHNjaGVtYS5uYW1lID0gbmFtZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBzY2hlbWFcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVTY2hlbWFzKFxuICB1bnJlc29sdmVkU2NoZW1hcyxcbiAgcmVzb2x2ZUl0ZW0gPSByZXNvbHZlU2NoZW1hXG4pIHtcbiAgbGV0IHNjaGVtYXMgPSBpc0Z1bmN0aW9uKHVucmVzb2x2ZWRTY2hlbWFzKVxuICAgID8gdW5yZXNvbHZlZFNjaGVtYXMoKVxuICAgIDogdW5yZXNvbHZlZFNjaGVtYXNcbiAgc2NoZW1hcyA9IGF3YWl0IHJlc29sdmVTY2hlbWEoc2NoZW1hcywgZmFsc2UpXG4gIGlmIChpc0FycmF5KHNjaGVtYXMpKSB7XG4gICAgLy8gVHJhbnNsYXRlIGFuIGFycmF5IG9mIGR5bmFtaWMgaW1wb3J0LCBlYWNoIGltcG9ydGluZyBvbmUgbmFtZWQgc2NoZW1hXG4gICAgLy8gbW9kdWxlIHRvIGFuIG9iamVjdCB3aXRoIG5hbWVkIGVudHJpZXMuXG4gICAgc2NoZW1hcyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIGF3YWl0IG1hcENvbmN1cnJlbnRseShcbiAgICAgICAgc2NoZW1hcyxcbiAgICAgICAgYXN5bmMgaXRlbSA9PiB7XG4gICAgICAgICAgY29uc3Qgc2NoZW1hID0gYXdhaXQgcmVzb2x2ZUl0ZW0oaXRlbSwgdHJ1ZSlcbiAgICAgICAgICByZXR1cm4gW3NjaGVtYS5uYW1lLCBzY2hlbWFdXG4gICAgICAgIH1cbiAgICAgIClcbiAgICApXG4gIH0gZWxzZSBpZiAoaXNPYmplY3Qoc2NoZW1hcykpIHtcbiAgICBzY2hlbWFzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgYXdhaXQgbWFwQ29uY3VycmVudGx5KFxuICAgICAgICBPYmplY3QuZW50cmllcyhzY2hlbWFzKSxcbiAgICAgICAgYXN5bmMgKFtrZXksIGl0ZW1dKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc2NoZW1hID0gYXdhaXQgcmVzb2x2ZUl0ZW0oaXRlbSwgdHJ1ZSlcbiAgICAgICAgICByZXR1cm4gW2tleSwgc2NoZW1hXVxuICAgICAgICB9XG4gICAgICApXG4gICAgKVxuICB9XG4gIHJldHVybiBzY2hlbWFzXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlU2NoZW1hQ29tcG9uZW50KHNjaGVtYSkge1xuICAvLyBSZXNvbHZlcyBhc3luYyBzY2hlbWEgY29tcG9uZW50cyBhbmQgYWRkcyBEaXRvTWl4aW4gYW5kIFR5cGVNaXhpbiB0byB0aGVtLlxuICBsZXQgeyBjb21wb25lbnQgfSA9IHNjaGVtYVxuICBpZiAoY29tcG9uZW50KSB7XG4gICAgY29tcG9uZW50ID0gYXdhaXQgcmVzb2x2ZVNjaGVtYShjb21wb25lbnQsIHRydWUpXG4gICAgaWYgKGNvbXBvbmVudCkge1xuICAgICAgLy8gUHJldmVudCB3YXJuaW5nOiBcIlZ1ZSByZWNlaXZlZCBhIENvbXBvbmVudCB3aGljaCB3YXMgbWFkZSBhIHJlYWN0aXZlXG4gICAgICAvLyBvYmplY3QuIFRoaXMgY2FuIGxlYWQgdG8gdW5uZWNlc3NhcnkgcGVyZm9ybWFuY2Ugb3ZlcmhlYWQsIGFuZCBzaG91bGRcbiAgICAgIC8vIGJlIGF2b2lkZWQgYnkgbWFya2luZyB0aGUgY29tcG9uZW50IHdpdGggYG1hcmtSYXdgXCI6XG4gICAgICBzY2hlbWEuY29tcG9uZW50ID0gbWFya1Jhdyh7XG4gICAgICAgIC4uLmNvbXBvbmVudCxcbiAgICAgICAgbWl4aW5zOiBbRGl0b01peGluLCBUeXBlTWl4aW4sIC4uLihjb21wb25lbnQubWl4aW5zIHx8IFtdKV1cbiAgICAgIH0pXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlU2NoZW1hQ29tcG9uZW50cyhzY2hlbWFzKSB7XG4gIC8vIGBzY2hlbWFzYCBhcmUgb2YgdGhlIHNhbWUgcG9zc2libGUgZm9ybXMgYXMgcGFzc2VkIHRvIGBnZXROYW1lZFNjaGVtYXMoKWBcbiAgYXdhaXQgbWFwQ29uY3VycmVudGx5KE9iamVjdC52YWx1ZXMoc2NoZW1hcyB8fCB7fSksIHJlc29sdmVTY2hlbWFDb21wb25lbnQpXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9jZXNzU2NoZW1hQ29tcG9uZW50cyhcbiAgYXBpLFxuICBzY2hlbWEsXG4gIHJvdXRlcyA9IG51bGwsXG4gIGxldmVsID0gMFxuKSB7XG4gIGNvbnN0IHByb21pc2VzID0gW11cbiAgY29uc3QgcHJvY2VzcyA9IChjb21wb25lbnQsIG5hbWUsIHJlbGF0aXZlTGV2ZWwpID0+IHtcbiAgICBwcm9taXNlcy5wdXNoKFxuICAgICAgcHJvY2Vzc1NjaGVtYUNvbXBvbmVudChcbiAgICAgICAgYXBpLFxuICAgICAgICBjb21wb25lbnQsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHJvdXRlcyxcbiAgICAgICAgbGV2ZWwgKyByZWxhdGl2ZUxldmVsXG4gICAgICApXG4gICAgKVxuICB9XG5cbiAgaXRlcmF0ZU5lc3RlZFNjaGVtYUNvbXBvbmVudHMoc2NoZW1hLCBwcm9jZXNzKVxuICBpdGVyYXRlU2NoZW1hQ29tcG9uZW50cyhnZXRQYW5lbFNjaGVtYXMoc2NoZW1hKSwgcHJvY2VzcylcblxuICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcylcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NTY2hlbWFDb21wb25lbnQoXG4gIGFwaSxcbiAgc2NoZW1hLFxuICBuYW1lLFxuICByb3V0ZXMgPSBudWxsLFxuICBsZXZlbCA9IDBcbikge1xuICBwcm9jZXNzU2NoZW1hRGVmYXVsdHMoYXBpLCBzY2hlbWEpXG5cbiAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIC8vIEFsc28gcHJvY2VzcyBuZXN0ZWQgcGFuZWwgc2NoZW1hcy5cbiAgICBtYXBDb25jdXJyZW50bHkoXG4gICAgICBnZXRQYW5lbFNjaGVtYXMoc2NoZW1hKSxcbiAgICAgIHBhbmVsID0+IHByb2Nlc3NTY2hlbWFDb21wb25lbnRzKGFwaSwgcGFuZWwsIHJvdXRlcywgbGV2ZWwpXG4gICAgKSxcbiAgICAvLyBEZWxlZ2F0ZSBzY2hlbWEgcHJvY2Vzc2luZyB0byB0aGUgYWN0dWFsIHR5cGUgY29tcG9uZW50cy5cbiAgICBnZXRUeXBlT3B0aW9ucyhzY2hlbWEpPy5wcm9jZXNzU2NoZW1hPy4oXG4gICAgICBhcGksXG4gICAgICBzY2hlbWEsXG4gICAgICBuYW1lLFxuICAgICAgcm91dGVzLFxuICAgICAgbGV2ZWxcbiAgICApXG4gIF0pXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9jZXNzVmlldyhjb21wb25lbnQsIGFwaSwgc2NoZW1hLCBuYW1lKSB7XG4gIGlmICghaXNWaWV3KHNjaGVtYSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdmlldyBzY2hlbWE6ICcke2dldFNjaGVtYUlkZW50aWZpZXIoc2NoZW1hKX0nYClcbiAgfVxuICBwcm9jZXNzUm91dGVTY2hlbWEoYXBpLCBzY2hlbWEsIG5hbWUpXG4gIHByb2Nlc3NTY2hlbWFEZWZhdWx0cyhhcGksIHNjaGVtYSlcbiAgYXdhaXQgcHJvY2Vzc05lc3RlZFNjaGVtYXMoYXBpLCBzY2hlbWEpXG4gIGNvbnN0IGNoaWxkcmVuID0gW11cbiAgYXdhaXQgcHJvY2Vzc1NjaGVtYUNvbXBvbmVudHMoYXBpLCBzY2hlbWEsIGNoaWxkcmVuLCAwKVxuICByZXR1cm4ge1xuICAgIHBhdGg6IGAvJHtzY2hlbWEucGF0aH1gLFxuICAgIGNoaWxkcmVuLFxuICAgIGNvbXBvbmVudCxcbiAgICBtZXRhOiB7XG4gICAgICBhcGksXG4gICAgICBzY2hlbWFcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NTY2hlbWFEZWZhdWx0cyhhcGksIHNjaGVtYSkge1xuICBsZXQgZGVmYXVsdHMgPSBhcGkuZGVmYXVsdHNbc2NoZW1hLnR5cGVdXG4gIGlmIChkZWZhdWx0cykge1xuICAgIGlmIChpc0Z1bmN0aW9uKGRlZmF1bHRzKSkge1xuICAgICAgZGVmYXVsdHMgPSBkZWZhdWx0cyhzY2hlbWEpXG4gICAgfVxuICAgIGlmIChpc09iamVjdChkZWZhdWx0cykpIHtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRlZmF1bHRzKSkge1xuICAgICAgICBpZiAoc2NoZW1hW2tleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHNjaGVtYVtrZXldID0gdmFsdWVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzY2hlbWFba2V5XSA9IG1lcmdlKHZhbHVlLCBzY2hlbWFba2V5XSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc05lc3RlZFNjaGVtYURlZmF1bHRzKGFwaSwgc2NoZW1hKSB7XG4gIC8vIFByb2Nlc3MgZGVmYXVsdHMgZm9yIG5lc3RlZCBzY2hlbWFzLiBOb3RlIHRoYXQgdGhpcyBpcyBhbHNvIGRvbmUgd2hlblxuICAvLyBjYWxsaW5nIGBwcm9jZXNzU2NoZW1hQ29tcG9uZW50cygpYCwgYnV0IHRoYXQgZnVuY3Rpb24gaXMgYXN5bmMsIGFuZCB3ZVxuICAvLyBuZWVkIGEgc3luYyB2ZXJzaW9uIHRoYXQgb25seSBoYW5kbGVzIHRoZSBkZWZhdWx0cyBmb3IgZmlsdGVycywgc2VlXG4gIC8vIGBnZXRGaWx0ZXJzUGFuZWwoKWAuXG4gIGl0ZXJhdGVOZXN0ZWRTY2hlbWFDb21wb25lbnRzKHNjaGVtYSwgY29tcG9uZW50ID0+IHtcbiAgICBwcm9jZXNzU2NoZW1hRGVmYXVsdHMoYXBpLCBjb21wb25lbnQpXG4gICAgY29uc3QgZm9ybXMgPSBnZXRGb3JtU2NoZW1hcyhjb21wb25lbnQpXG4gICAgZm9yIChjb25zdCBmb3JtIG9mIE9iamVjdC52YWx1ZXMoZm9ybXMpKSB7XG4gICAgICBwcm9jZXNzTmVzdGVkU2NoZW1hRGVmYXVsdHMoYXBpLCBmb3JtKVxuICAgIH1cbiAgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NSb3V0ZVNjaGVtYShhcGksIHNjaGVtYSwgbmFtZSkge1xuICAvLyBVc2VkIGZvciB2aWV3IGFuZCBzb3VyY2Ugc2NoZW1hcywgc2VlIFNvdXJjZU1peGluLlxuICBzY2hlbWEubmFtZSA9IG5hbWVcbiAgc2NoZW1hLnBhdGggfHw9IGFwaS5ub3JtYWxpemVQYXRoKG5hbWUpXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9jZXNzRm9ybXMoYXBpLCBzY2hlbWEsIGxldmVsKSB7XG4gIC8vIEZpcnN0IHJlc29sdmUgdGhlIGZvcm1zIGFuZCBzdG9yZSB0aGUgcmVzdWx0cyBiYWNrIG9uIHRoZSBzY2hlbWEuXG4gIGxldCB7IGZvcm0sIGZvcm1zLCBjb21wb25lbnRzIH0gPSBzY2hlbWFcbiAgaWYgKGZvcm1zKSB7XG4gICAgZm9ybXMgPSBzY2hlbWEuZm9ybXMgPSBhd2FpdCByZXNvbHZlU2NoZW1hcyhmb3JtcywgZm9ybSA9PlxuICAgICAgcHJvY2Vzc0Zvcm0oYXBpLCBmb3JtKVxuICAgIClcbiAgfSBlbHNlIGlmIChmb3JtKSB7XG4gICAgZm9ybSA9IHNjaGVtYS5mb3JtID0gYXdhaXQgcHJvY2Vzc0Zvcm0oYXBpLCBmb3JtKVxuICB9IGVsc2UgaWYgKGNvbXBvbmVudHMpIHtcbiAgICAvLyBOT1RFOiBQcm9jZXNzaW5nIGZvcm1zIGluIGNvbXB1dGVkIGNvbXBvbmVudHMgaXMgbm90IHN1cHBvcnRlZCwgc2luY2UgaXRcbiAgICAvLyBvbmx5IGNhbiBiZSBjb21wdXRlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGFjdHVhbCBkYXRhLlxuICAgIGlmIChpc09iamVjdChjb21wb25lbnRzKSkge1xuICAgICAgZm9ybSA9IHsgY29tcG9uZW50cyB9XG4gICAgfVxuICB9XG5cbiAgZm9ybXMgfHw9IHsgZGVmYXVsdDogZm9ybSB9IC8vIE9ubHkgdXNlZCBmb3IgcHJvY2VzcyBsb29wIGJlbG93LlxuICBjb25zdCBjaGlsZHJlbiA9IFtdXG4gIGZvciAoY29uc3QgZm9ybSBvZiBPYmplY3QudmFsdWVzKGZvcm1zKSkge1xuICAgIGF3YWl0IHByb2Nlc3NTY2hlbWFDb21wb25lbnRzKGFwaSwgZm9ybSwgY2hpbGRyZW4sIGxldmVsKVxuICB9XG4gIHJldHVybiBjaGlsZHJlblxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0Zvcm0oYXBpLCBzY2hlbWEpIHtcbiAgc2NoZW1hID0gYXdhaXQgcmVzb2x2ZVNjaGVtYShzY2hlbWEsIHRydWUpXG4gIGlmICghaXNGb3JtKHNjaGVtYSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZm9ybSBzY2hlbWE6ICcke2dldFNjaGVtYUlkZW50aWZpZXIoc2NoZW1hKX0nYClcbiAgfVxuICBwcm9jZXNzU2NoZW1hRGVmYXVsdHMoYXBpLCBzY2hlbWEpXG4gIGF3YWl0IHByb2Nlc3NOZXN0ZWRTY2hlbWFzKGFwaSwgc2NoZW1hKVxuICByZXR1cm4gc2NoZW1hXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9jZXNzVGFiKGFwaSwgc2NoZW1hKSB7XG4gIHNjaGVtYSA9IGF3YWl0IHJlc29sdmVTY2hlbWEoc2NoZW1hLCB0cnVlKVxuICBpZiAoIWlzVGFiKHNjaGVtYSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdGFiIHNjaGVtYTogJyR7Z2V0U2NoZW1hSWRlbnRpZmllcihzY2hlbWEpfSdgKVxuICB9XG4gIHByb2Nlc3NTY2hlbWFEZWZhdWx0cyhhcGksIHNjaGVtYSlcbiAgcmV0dXJuIHNjaGVtYVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc1BhbmVsKGFwaSwgc2NoZW1hKSB7XG4gIHNjaGVtYSA9IGF3YWl0IHJlc29sdmVTY2hlbWEoc2NoZW1hLCB0cnVlKVxuICBpZiAoIWlzUGFuZWwoc2NoZW1hKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYW5lbCBzY2hlbWE6ICcke2dldFNjaGVtYUlkZW50aWZpZXIoc2NoZW1hKX0nYClcbiAgfVxuICBwcm9jZXNzU2NoZW1hRGVmYXVsdHMoYXBpLCBzY2hlbWEpXG4gIHJldHVybiBzY2hlbWFcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NOZXN0ZWRTY2hlbWFzKGFwaSwgc2NoZW1hKSB7XG4gIGNvbnN0IHsgdGFicywgcGFuZWxzIH0gPSBzY2hlbWFcbiAgaWYgKHRhYnMpIHtcbiAgICBzY2hlbWEudGFicyA9IGF3YWl0IHJlc29sdmVTY2hlbWFzKFxuICAgICAgdGFicyxcbiAgICAgIHRhYiA9PiBwcm9jZXNzVGFiKGFwaSwgdGFiKVxuICAgIClcbiAgfVxuICBpZiAocGFuZWxzKSB7XG4gICAgc2NoZW1hLnBhbmVscyA9IGF3YWl0IHJlc29sdmVTY2hlbWFzKFxuICAgICAgcGFuZWxzLFxuICAgICAgcGFuZWwgPT4gcHJvY2Vzc1BhbmVsKGFwaSwgcGFuZWwpXG4gICAgKVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNGb3JtU2NoZW1hKHNjaGVtYSkge1xuICAvLyBTdXBwb3J0IGJvdGggc2luZ2xlIGZvcm0gYW5kIG11bHRpcGxlIGZvcm1zIG5vdGF0aW9uLCBhcyB3ZWxsIGFzIGlubGluZWRcbiAgLy8gY29tcG9uZW50cy5cbiAgcmV0dXJuIChcbiAgICBpc1NjaGVtYShzY2hlbWEpICYmXG4gICAgaXNPYmplY3Qoc2NoZW1hLmZvcm0gfHwgc2NoZW1hLmZvcm1zIHx8IHNjaGVtYS5jb21wb25lbnRzKVxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNNdWx0aXBsZUZvcm1TY2hlbWFzKHNjaGVtYSkge1xuICByZXR1cm4gKFxuICAgIGlzU2NoZW1hKHNjaGVtYSkgJiZcbiAgICBPYmplY3Qua2V5cyhzY2hlbWE/LmZvcm1zIHx8IHt9KS5sZW5ndGggPiAxXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU2luZ2xlQ29tcG9uZW50VmlldyhzY2hlbWEpIHtcbiAgcmV0dXJuIChcbiAgICBpc1ZpZXcoc2NoZW1hKSAmJlxuICAgIGlzT2JqZWN0KHNjaGVtYS5jb21wb25lbnQpXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFZpZXdGb3JtU2NoZW1hKHNjaGVtYSwgY29udGV4dCkge1xuICBjb25zdCB7IHZpZXcgfSA9IHNjaGVtYVxuICBjb25zdCB2aWV3U2NoZW1hID0gdmlldyAmJiBjb250ZXh0LnZpZXdzW3ZpZXddXG4gIHJldHVybiB2aWV3U2NoZW1hXG4gICAgPyAvLyBOT1RFOiBWaWV3cyBjYW4gaGF2ZSB0YWJzLCBpbiB3aGljaCBjYXNlIHRoZSB2aWV3IGNvbXBvbmVudCBpcyBuZXN0ZWRcbiAgICAgIC8vIGluIG9uZSBvZiB0aGUgdGFicywgZ28gZmluZCBpdC5cbiAgICAgIGZpbmRTY2hlbWFDb21wb25lbnQodmlld1NjaGVtYSwgaGFzRm9ybVNjaGVtYSkgfHwgbnVsbFxuICAgIDogbnVsbFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Vmlld1NjaGVtYShzY2hlbWEsIGNvbnRleHQpIHtcbiAgcmV0dXJuIGdldFZpZXdGb3JtU2NoZW1hKHNjaGVtYSwgY29udGV4dClcbiAgICA/IGNvbnRleHQudmlld3Nbc2NoZW1hLnZpZXddXG4gICAgOiBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRWaWV3RWRpdFBhdGgoc2NoZW1hLCBjb250ZXh0KSB7XG4gIGNvbnN0IHZpZXcgPSBnZXRWaWV3U2NoZW1hKHNjaGVtYSwgY29udGV4dClcbiAgcmV0dXJuIHZpZXdcbiAgICA/IGlzU2luZ2xlQ29tcG9uZW50Vmlldyh2aWV3KVxuICAgICAgPyBgLyR7dmlldy5wYXRofWBcbiAgICAgIDogYC8ke3ZpZXcucGF0aH0vJHt2aWV3LnBhdGh9YFxuICAgIDogbnVsbFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybVNjaGVtYXMoc2NoZW1hLCBjb250ZXh0LCBtb2RpZnlGb3JtKSB7XG4gIGNvbnN0IHZpZXdTY2hlbWEgPSBjb250ZXh0ICYmIGdldFZpZXdGb3JtU2NoZW1hKHNjaGVtYSwgY29udGV4dClcbiAgaWYgKHZpZXdTY2hlbWEpIHtcbiAgICBzY2hlbWEgPSB2aWV3U2NoZW1hXG4gIH0gZWxzZSBpZiAoc2NoZW1hLnZpZXcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gdmlldzogJyR7c2NoZW1hLnZpZXd9J2ApXG4gIH1cblxuICBsZXQgeyBmb3JtLCBmb3JtcywgY29tcG9uZW50cywgY29tcGFjdCB9ID0gc2NoZW1hXG4gIGlmICghZm9ybSAmJiAhZm9ybXMpIHtcbiAgICBpZiAoY29tcG9uZW50cykge1xuICAgICAgLy8gQ29udmVydCBpbmxpbmVkIGNvbXBvbmVudHMgdG8gZm9ybXMsIHN1cHBvcnRpbmcgYGNvbXBhY3RgIHNldHRpbmcuXG4gICAgICBmb3JtID0geyBjb21wb25lbnRzLCBjb21wYWN0IH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTm8gYGZvcm1zYCwgYGZvcm1gIG9yIGBjb21wb25lbnRzYCwgcmV0dXJuIGFuZCBlbXB0eSBgZm9ybXNgIG9iamVjdC5cbiAgICAgIHJldHVybiB7fVxuICAgIH1cbiAgfVxuICBmb3JtcyB8fD0geyBkZWZhdWx0OiBmb3JtIH1cbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhmb3JtcykubWFwKChbdHlwZSwgZm9ybV0pID0+IHtcbiAgICAgIC8vIFN1cHBvcnQgYHNjaGVtYS5jb21wb25lbnRzYCBjYWxsYmFja3MgdG8gY3JlYXRlIGNvbXBvbmVudHMgb24gdGhlIGZseS5cbiAgICAgIGlmIChjb250ZXh0ICYmIGlzRnVuY3Rpb24oZm9ybS5jb21wb25lbnRzKSkge1xuICAgICAgICBmb3JtID0ge1xuICAgICAgICAgIC4uLmZvcm0sXG4gICAgICAgICAgY29tcG9uZW50czogZm9ybS5jb21wb25lbnRzKGNvbnRleHQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBbdHlwZSwgbW9kaWZ5Rm9ybT8uKGZvcm0pID8/IGZvcm1dXG4gICAgfSlcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SXRlbUZvcm1TY2hlbWFGcm9tRm9ybXMoZm9ybXMsIGl0ZW0pIHtcbiAgcmV0dXJuIGZvcm1zW2l0ZW0/LnR5cGVdIHx8IGZvcm1zLmRlZmF1bHQgfHwgbnVsbFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SXRlbUZvcm1TY2hlbWEoc2NoZW1hLCBpdGVtLCBjb250ZXh0KSB7XG4gIHJldHVybiBnZXRJdGVtRm9ybVNjaGVtYUZyb21Gb3JtcyhnZXRGb3JtU2NoZW1hcyhzY2hlbWEsIGNvbnRleHQpLCBpdGVtKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDb21wYWN0KHNjaGVtYSkge1xuICByZXR1cm4gISFzY2hlbWEuY29tcGFjdFxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNJbmxpbmVkKHNjaGVtYSkge1xuICByZXR1cm4gISEoc2NoZW1hLmlubGluZWQgfHwgc2NoZW1hLmNvbXBvbmVudHMpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc05lc3RlZChzY2hlbWEpIHtcbiAgcmV0dXJuICEhKHNjaGVtYS5uZXN0ZWQgfHwgZ2V0VHlwZU9wdGlvbnMoc2NoZW1hKT8uZGVmYXVsdE5lc3RlZCA9PT0gdHJ1ZSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9taXRQYWRkaW5nKHNjaGVtYSkge1xuICByZXR1cm4gISFnZXRUeXBlT3B0aW9ucyhzY2hlbWEpPy5vbWl0UGFkZGluZ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWxpZ25Cb3R0b20oc2NoZW1hKSB7XG4gIHJldHVybiAhIWdldFR5cGVPcHRpb25zKHNjaGVtYSk/LmFsaWduQm90dG9tXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWZhdWx0VmFsdWUoc2NoZW1hKSB7XG4gIC8vIFN1cHBvcnQgZGVmYXVsdCB2YWx1ZXMgYm90aCBvbiBzY2hlbWEgYW5kIG9uIGNvbXBvbmVudCBsZXZlbC5cbiAgLy8gTk9URTogQXQgdGhlIHRpbWUgb2YgY3JlYXRpb24sIGNvbXBvbmVudHMgbWF5IG5vdCBiZSBpbnN0YW50aWF0ZWQsIChlLmcuIGlmXG4gIC8vIGVudHJpZXMgYXJlIGNyZWF0ZWQgdGhyb3VnaCBuZXN0ZWQgZm9ybXMsIHRoZSBwYXJlbnQgZm9ybSBpc24ndCBtb3VudGVkKSBzb1xuICAvLyB3ZSBjYW4ndCB1c2UgYGRhdGFQYXRoYCB0byBnZXQgdG8gY29tcG9uZW50cywgYW5kIHRoZSBgZGVmYXVsdFZhbHVlYCBmcm9tXG4gIC8vIHRoZXJlLiBUaGF0J3Mgd2h5IGBkZWZhdWx0VmFsdWVgIGlzIGRlZmluZWQgc3RhdGljYWxseSBpbiB0aGUgY29tcG9uZW50czpcbiAgY29uc3QgZGVmYXVsdFZhbHVlID0gc2NoZW1hLmRlZmF1bHRcbiAgY29uc3QgdmFsdWUgPVxuICAgIGRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkXG4gICAgICA/IGRlZmF1bHRWYWx1ZVxuICAgICAgOiBnZXRUeXBlT3B0aW9ucyhzY2hlbWEpPy5kZWZhdWx0VmFsdWVcbiAgcmV0dXJuIGlzRnVuY3Rpb24odmFsdWUpXG4gICAgPyB2YWx1ZShzY2hlbWEpXG4gICAgOiBjbG9uZSh2YWx1ZSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZU1pc3NpbmdWYWx1ZShzY2hlbWEpIHtcbiAgY29uc3QgdHlwZU9wdGlvbnMgPSBnZXRUeXBlT3B0aW9ucyhzY2hlbWEpXG4gIHJldHVybiAhIShcbiAgICB0eXBlT3B0aW9ucz8uZXhjbHVkZVZhbHVlIHx8IHR5cGVPcHRpb25zPy5pZ25vcmVNaXNzaW5nVmFsdWU/LihzY2hlbWEpXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldERlZmF1bHRWYWx1ZXMoc2NoZW1hLCBkYXRhID0ge30sIGNvbXBvbmVudCkge1xuICBjb25zdCBvcHRpb25zID0geyBjb21wb25lbnQsIHJvb3REYXRhOiBkYXRhIH1cblxuICBjb25zdCBwcm9jZXNzQmVmb3JlID0gKHNjaGVtYSwgZGF0YSwgbmFtZSkgPT4ge1xuICAgIGlmICghKG5hbWUgaW4gZGF0YSkgJiYgIWlnbm9yZU1pc3NpbmdWYWx1ZShzY2hlbWEpKSB7XG4gICAgICBkYXRhW25hbWVdID0gZ2V0RGVmYXVsdFZhbHVlKHNjaGVtYSlcbiAgICB9XG4gIH1cblxuICAvLyBTZXRzIHVwIGEgZGF0YSBvYmplY3QgdGhhdCBoYXMga2V5cyB3aXRoIGRlZmF1bHQgdmFsdWVzIGZvciBhbGxcbiAgLy8gZm9ybSBmaWVsZHMsIHNvIHRoZXkgY2FuIGJlIGNvcnJlY3RseSB3YXRjaGVkIGZvciBjaGFuZ2VzLlxuICByZXR1cm4gcHJvY2Vzc1NjaGVtYURhdGEoXG4gICAgc2NoZW1hLFxuICAgIGRhdGEsXG4gICAgbnVsbCxcbiAgICBudWxsLFxuICAgIHByb2Nlc3NCZWZvcmUsXG4gICAgbnVsbCxcbiAgICBvcHRpb25zXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVWYWx1ZShzY2hlbWEsIGRhdGEsIG5hbWUsIGRhdGFQYXRoLCB7XG4gIGNvbXBvbmVudCA9IG51bGwsXG4gIHJvb3REYXRhID0gY29tcG9uZW50Py5yb290RGF0YVxufSA9IHt9KSB7XG4gIGNvbnN0IHsgY29tcHV0ZSB9ID0gc2NoZW1hXG4gIGlmIChjb21wdXRlKSB7XG4gICAgY29uc3QgdmFsdWUgPSBjb21wdXRlKFxuICAgICAgRGl0b0NvbnRleHQuZ2V0KGNvbXBvbmVudCwge1xuICAgICAgICBzY2hlbWEsXG4gICAgICAgIC8vIE92ZXJyaWRlIHZhbHVlIHRvIHByZXZlbnQgZW5kbGVzcyByZWN1cnNpb24gdGhyb3VnaCBjYWxsaW5nIHRoZVxuICAgICAgICAvLyBnZXR0ZXIgZm9yIGB0aGlzLnZhbHVlYCBpbiBgRGl0b0NvbnRleHRgOlxuICAgICAgICB2YWx1ZTogZGF0YVtuYW1lXSxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgZGF0YSxcbiAgICAgICAgZGF0YVBhdGgsXG4gICAgICAgIHJvb3REYXRhXG4gICAgICB9KVxuICAgIClcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gQWNjZXNzIGBkYXRhW25hbWVdYCBkaXJlY3RseSBpbnN0ZWFkIG9mIGB0aGlzLnZhbHVlID0g4oCmYCB0byB1cGRhdGUgdGhlXG4gICAgICAvLyB2YWx1ZSB3aXRob3V0IGNhbGxpbmcgcGFyc2UoKTpcbiAgICAgIGRhdGFbbmFtZV0gPSB2YWx1ZVxuICAgIH1cbiAgfVxuICAvLyBJZiB0aGUgdmFsdWUgaXMgc3RpbGwgbWlzc2luZyBhZnRlciBjb21wdXRlLCBzZXQgdGhlIGRlZmF1bHQgZm9yIGl0OlxuICBpZiAoIShuYW1lIGluIGRhdGEpICYmICFpZ25vcmVNaXNzaW5nVmFsdWUoc2NoZW1hKSkge1xuICAgIGRhdGFbbmFtZV0gPSBnZXREZWZhdWx0VmFsdWUoc2NoZW1hKVxuICB9XG4gIC8vIE5vdyBhY2Nlc3MgdGhlIHZhbHVlLiBUaGlzIGlzIGltcG9ydGFudCBmb3IgcmVhY3Rpdml0eSBhbmQgbmVlZHMgdG9cbiAgLy8gaGFwcGVuIGFmdGVyIGFsbCBwcmlvciBtYW5pcHVsYXRpb24gb2YgYGRhdGFbbmFtZV1gLCBzZWUgYWJvdmU6XG4gIHJldHVybiBkYXRhW25hbWVdXG59XG5cbmZ1bmN0aW9uIGNsb25lSXRlbShzb3VyY2VTY2hlbWEsIGl0ZW0sIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMuc2NoZW1hT25seSkge1xuICAgIGNvbnN0IGNvcHkgPSB7fVxuICAgIGNvbnN0IHsgaWRLZXkgPSAnaWQnLCBvcmRlcktleSB9ID0gc291cmNlU2NoZW1hXG4gICAgY29uc3QgaWQgPSBpdGVtW2lkS2V5XVxuICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb3B5W2lkS2V5XSA9IGlkXG4gICAgfVxuICAgIC8vIENvcHkgb3ZlciB0eXBlIGluIGNhc2UgdGhlcmUgYXJlIG11bHRpcGxlIGZvcm1zIHRvIGNob29zZSBmcm9tLlxuICAgIGlmIChoYXNNdWx0aXBsZUZvcm1TY2hlbWFzKHNvdXJjZVNjaGVtYSkpIHtcbiAgICAgIGNvcHkudHlwZSA9IGl0ZW0udHlwZVxuICAgIH1cbiAgICBpZiAob3JkZXJLZXkpIHtcbiAgICAgIGNvcHlbb3JkZXJLZXldID0gaXRlbVtvcmRlcktleV1cbiAgICB9XG4gICAgcmV0dXJuIGNvcHlcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4geyAuLi5pdGVtIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc0RhdGEoc2NoZW1hLCBzb3VyY2VTY2hlbWEsIGRhdGEsIGRhdGFQYXRoLCB7XG4gIGNvbXBvbmVudCxcbiAgc2NoZW1hT25seSwgLy8gd2hldGhlciB0byBvbmx5IGluY2x1ZGUgZGF0YSBjb3ZlcmVkIGJ5IHRoZSBzY2hlbWEsIG9yIGFsbCBkYXRhXG4gIHRhcmdldFxufSA9IHt9KSB7XG4gIGNvbnN0IG9wdGlvbnMgPSB7IGNvbXBvbmVudCwgc2NoZW1hT25seSwgdGFyZ2V0LCByb290RGF0YTogZGF0YSB9XG4gIGNvbnN0IHByb2Nlc3NlZERhdGEgPSBjbG9uZUl0ZW0oc291cmNlU2NoZW1hLCBkYXRhLCBvcHRpb25zKVxuICBjb25zdCBncmFwaCA9IG5ldyBTY2hlbWFHcmFwaCgpXG5cbiAgY29uc3QgcHJvY2Vzc0JlZm9yZSA9IChzY2hlbWEsIGRhdGEsIG5hbWUsIGRhdGFQYXRoLCBwcm9jZXNzZWREYXRhKSA9PiB7XG4gICAgbGV0IHZhbHVlID0gY29tcHV0ZVZhbHVlKHNjaGVtYSwgZGF0YSwgbmFtZSwgZGF0YVBhdGgsIG9wdGlvbnMpXG4gICAgLy8gVGhlIHNjaGVtYSBleHBlY3RzIHRoZSBgd3JhcFByaW1pdGl2ZXNgIHRyYW5zZm9ybWF0aW9ucyB0byBiZSBwcmVzZW50IG9uXG4gICAgLy8gdGhlIGRhdGEgdGhhdCBpdCBpcyBhcHBsaWVkIG9uLCBzbyB3YXJwIGJlZm9yZSBhbmQgdW53cmFwIGFmdGVyLlxuICAgIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgICAgY29uc3QgeyB3cmFwUHJpbWl0aXZlcywgb3JkZXJLZXksIGlkS2V5ID0gJ2lkJyB9ID0gc2NoZW1hXG4gICAgICBpZiAod3JhcFByaW1pdGl2ZXMpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5tYXAoZW50cnkgPT4gKHtcbiAgICAgICAgICBbd3JhcFByaW1pdGl2ZXNdOiBlbnRyeVxuICAgICAgICB9KSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEFsd2F5cyBzaGFsbG93LWNsb25lIGFycmF5IHZhbHVlczpcbiAgICAgICAgdmFsdWUgPSBbLi4udmFsdWVdXG4gICAgICB9XG4gICAgICBpZiAob3JkZXJLZXkgJiYgdGFyZ2V0ID09PSAnY2xpcGJvYXJkJykge1xuICAgICAgICAvLyBTb3J0IHRoZSBkYXRhIGJhY2sgaW50byB0aGUgbmF0dXJhbCBzZXF1ZW5jZSBhcyBkZWZpbmVkIGJ5IHRoZWlyIGlkcyxcbiAgICAgICAgLy8gc28gY29weS1wYXN0aW5nIGJldHdlZW4gc2VydmVycyAoZS5nLiBuZXN0ZWQgZm9udC1jdXRzIG9uIExpbmV0bylcbiAgICAgICAgLy8gbmF0dXJhbGx5IGdldHMgbWFwcGVkIHRvIHRoZSBzYW1lIGVudHJpZXMgaW4gdGhlIGdyYXBoLlxuICAgICAgICB2YWx1ZS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgY29uc3QgaWQxID0gYT8uW2lkS2V5XVxuICAgICAgICAgIGNvbnN0IGlkMiA9IGI/LltpZEtleV1cbiAgICAgICAgICByZXR1cm4gaWQxID09IG51bGwgfHwgaXNUZW1wb3JhcnlJZChpZDEpXG4gICAgICAgICAgICA/IDFcbiAgICAgICAgICAgIDogaWQyID09IG51bGwgfHwgaXNUZW1wb3JhcnlJZChpZDIpXG4gICAgICAgICAgICAgID8gLTFcbiAgICAgICAgICAgICAgOiBpZDEgLSBpZDJcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gICAgcHJvY2Vzc2VkRGF0YVtuYW1lXSA9IHZhbHVlXG4gIH1cblxuICBjb25zdCBwcm9jZXNzQWZ0ZXIgPSAoc2NoZW1hLCBkYXRhLCBuYW1lLCBkYXRhUGF0aCwgcHJvY2Vzc2VkRGF0YSkgPT4ge1xuICAgIGNvbnN0IHsgd3JhcFByaW1pdGl2ZXMsIGV4Y2x1ZGUsIHByb2Nlc3MgfSA9IHNjaGVtYVxuICAgIGxldCB2YWx1ZSA9IHByb2Nlc3NlZERhdGFbbmFtZV1cblxuICAgIGNvbnN0IHR5cGVPcHRpb25zID0gZ2V0VHlwZU9wdGlvbnMoc2NoZW1hKVxuXG4gICAgLy8gTk9URTogV2UgZG9uJ3QgY2FjaGUgdGhpcyBjb250ZXh0LCBzaW5jZSBgdmFsdWVgIGlzIGNoYW5naW5nLlxuICAgIGNvbnN0IGdldENvbnRleHQgPSAoKSA9PlxuICAgICAgRGl0b0NvbnRleHQuZ2V0KGNvbXBvbmVudCwge1xuICAgICAgICBzY2hlbWEsXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBuYW1lLFxuICAgICAgICBkYXRhLFxuICAgICAgICBkYXRhUGF0aCxcbiAgICAgICAgcm9vdERhdGE6IG9wdGlvbnMucm9vdERhdGEsXG4gICAgICAgIC8vIFBhc3MgdGhlIGFscmVhZHkgcHJvY2Vzc2VkIGRhdGEgdG8gYHByb2Nlc3MoKWAsIHNvIGl0IGNhbiBiZSBtb2RpZmllZFxuICAgICAgICAvLyB0aHJvdWdoIGBwcm9jZXNzZWRJdGVtYCBmcm9tIHRoZXJlLlxuICAgICAgICBwcm9jZXNzZWREYXRhXG4gICAgICB9KVxuXG4gICAgLy8gRmlyc3QgdW53cmFwIHRoZSB3cmFwcGVkIHByaW1pdGl2ZXMgYWdhaW4sIHRvIGJyaW5nIHRoZSBkYXRhIGJhY2sgaW50b1xuICAgIC8vIGl0cyBuYXRpdmUgZm9ybS4gU2UgYHByb2Nlc3NCZWZvcmUoKWAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICBpZiAod3JhcFByaW1pdGl2ZXMgJiYgaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHZhbHVlID0gdmFsdWUubWFwKG9iamVjdCA9PiBvYmplY3Rbd3JhcFByaW1pdGl2ZXNdKVxuICAgIH1cblxuICAgIC8vIEhhbmRsZSB0aGUgdXNlcidzIGBwcm9jZXNzKClgIGNhbGxiYWNrIGZpcnN0LCBpZiBvbmUgaXMgcHJvdmlkZWQsIHNvIHRoYXRcbiAgICAvLyBpdCBjYW4gbW9kaWZ5IGRhdGEgaW4gYHByb2Nlc3NlZERhdGFgIGV2ZW4gaWYgaXQgcHJvdmlkZXMgYGV4Y2x1ZGU6IHRydWVgXG4gICAgaWYgKHByb2Nlc3MpIHtcbiAgICAgIHZhbHVlID0gcHJvY2VzcyhnZXRDb250ZXh0KCkpXG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdHlwZU9wdGlvbnM/LmV4Y2x1ZGVWYWx1ZSB8fFxuICAgICAgLy8gU3VwcG9ydCBmdW5jdGlvbnMgbmV4dCB0byBib29sZWFucyBmb3IgYHNjaGVtYS5leGNsdWRlYDpcbiAgICAgIGV4Y2x1ZGUgPT09IHRydWUgfHxcbiAgICAgIGlzRnVuY3Rpb24oZXhjbHVkZSkgJiYgZXhjbHVkZShnZXRDb250ZXh0KCkpXG4gICAgKSB7XG4gICAgICBkZWxldGUgcHJvY2Vzc2VkRGF0YVtuYW1lXVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBFYWNoIGNvbXBvbmVudCB0eXBlIGNhbiBwcm92aWRlIGl0cyBvd24gc3RhdGljIGBwcm9jZXNzVmFsdWUoKWAgbWV0aG9kXG4gICAgICAvLyB0byBjb252ZXJ0IHRoZSBkYXRhIGZvciBzdG9yYWdlLlxuICAgICAgY29uc3QgcHJvY2Vzc1ZhbHVlID0gdHlwZU9wdGlvbnM/LnByb2Nlc3NWYWx1ZVxuICAgICAgaWYgKHByb2Nlc3NWYWx1ZSkge1xuICAgICAgICB2YWx1ZSA9IHByb2Nlc3NWYWx1ZShzY2hlbWEsIHZhbHVlLCBkYXRhUGF0aCwgZ3JhcGgpXG4gICAgICB9XG4gICAgICBwcm9jZXNzZWREYXRhW25hbWVdID0gdmFsdWVcbiAgICB9XG4gIH1cblxuICBwcm9jZXNzU2NoZW1hRGF0YShcbiAgICBzY2hlbWEsXG4gICAgZGF0YSxcbiAgICBkYXRhUGF0aCxcbiAgICBwcm9jZXNzZWREYXRhLFxuICAgIHByb2Nlc3NCZWZvcmUsXG4gICAgcHJvY2Vzc0FmdGVyLFxuICAgIG9wdGlvbnNcbiAgKVxuXG4gIHJldHVybiBncmFwaC5wcm9jZXNzKHNvdXJjZVNjaGVtYSwgcHJvY2Vzc2VkRGF0YSwgb3B0aW9ucylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NTY2hlbWFEYXRhKFxuICBzY2hlbWEsXG4gIGRhdGEsXG4gIGRhdGFQYXRoLFxuICBwcm9jZXNzZWREYXRhLFxuICBwcm9jZXNzQmVmb3JlLFxuICBwcm9jZXNzQWZ0ZXIsXG4gIG9wdGlvbnNcbikge1xuICBjb25zdCBwcm9jZXNzQ29tcG9uZW50cyA9IGNvbXBvbmVudHMgPT4ge1xuICAgIGNvbnN0IGdldERhdGFQYXRoID0gKGRhdGFQYXRoLCB0b2tlbikgPT5cbiAgICAgIGRhdGFQYXRoICE9IG51bGxcbiAgICAgICAgPyBhcHBlbmREYXRhUGF0aChkYXRhUGF0aCwgdG9rZW4pXG4gICAgICAgIDogbnVsbFxuXG4gICAgaWYgKGNvbXBvbmVudHMpIHtcbiAgICAgIGZvciAoY29uc3QgW25hbWUsIGNvbXBvbmVudFNjaGVtYV0gb2YgT2JqZWN0LmVudHJpZXMoY29tcG9uZW50cykpIHtcbiAgICAgICAgaWYgKCFpc05lc3RlZChjb21wb25lbnRTY2hlbWEpKSB7XG4gICAgICAgICAgLy8gUmVjdXJzaXZlbHkgcHJvY2VzcyBkYXRhIG9uIHVubmVzdGVkIGNvbXBvbmVudHMuXG4gICAgICAgICAgcHJvY2Vzc1NjaGVtYURhdGEoXG4gICAgICAgICAgICBjb21wb25lbnRTY2hlbWEsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgZGF0YVBhdGgsXG4gICAgICAgICAgICBwcm9jZXNzZWREYXRhLFxuICAgICAgICAgICAgcHJvY2Vzc0JlZm9yZSxcbiAgICAgICAgICAgIHByb2Nlc3NBZnRlcixcbiAgICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgY29tcG9uZW50RGF0YVBhdGggPSBnZXREYXRhUGF0aChkYXRhUGF0aCwgbmFtZSlcblxuICAgICAgICAgIGNvbnN0IHByb2Nlc3NJdGVtID0gKGl0ZW0sIGluZGV4ID0gbnVsbCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGF0YVBhdGggPVxuICAgICAgICAgICAgICBpbmRleCAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gZ2V0RGF0YVBhdGgoY29tcG9uZW50RGF0YVBhdGgsIGluZGV4KVxuICAgICAgICAgICAgICAgIDogY29tcG9uZW50RGF0YVBhdGhcbiAgICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSBEaXRvQ29udGV4dC5nZXQob3B0aW9ucy5jb21wb25lbnQsIHtcbiAgICAgICAgICAgICAgc2NoZW1hOiBjb21wb25lbnRTY2hlbWEsXG4gICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgIHZhbHVlOiBpdGVtLFxuICAgICAgICAgICAgICBkYXRhUGF0aCxcbiAgICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICAgIHJvb3REYXRhOiBvcHRpb25zLnJvb3REYXRhXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgY29uc3QgZ2V0Rm9ybXMgPSAoXG4gICAgICAgICAgICAgIGdldFR5cGVPcHRpb25zKGNvbXBvbmVudFNjaGVtYSk/LmdldEZvcm1TY2hlbWFzRm9yUHJvY2Vzc2luZyB8fFxuICAgICAgICAgICAgICBnZXRGb3JtU2NoZW1hc1xuICAgICAgICAgICAgKVxuICAgICAgICAgICAgY29uc3QgZm9ybXMgPSBnZXRGb3Jtcyhjb21wb25lbnRTY2hlbWEsIGNvbnRleHQpXG4gICAgICAgICAgICBjb25zdCBmb3JtID0gZ2V0SXRlbUZvcm1TY2hlbWFGcm9tRm9ybXMoZm9ybXMsIGl0ZW0pXG4gICAgICAgICAgICBpZiAoZm9ybSkge1xuICAgICAgICAgICAgICBjb25zdCBwcm9jZXNzZWRJdGVtID0gcHJvY2Vzc2VkRGF0YVxuICAgICAgICAgICAgICAgID8gY2xvbmVJdGVtKGNvbXBvbmVudFNjaGVtYSwgaXRlbSwgb3B0aW9ucylcbiAgICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NTY2hlbWFEYXRhKFxuICAgICAgICAgICAgICAgIGZvcm0sXG4gICAgICAgICAgICAgICAgaXRlbSxcbiAgICAgICAgICAgICAgICBkYXRhUGF0aCxcbiAgICAgICAgICAgICAgICBwcm9jZXNzZWRJdGVtLFxuICAgICAgICAgICAgICAgIHByb2Nlc3NCZWZvcmUsXG4gICAgICAgICAgICAgICAgcHJvY2Vzc0FmdGVyLFxuICAgICAgICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gSXRlbXMgd2l0aG91dCBmb3JtcyBzdGlsbCBnZXQgZnVsbHkgKGJ1dCBzaGFsbG93bHkpIGNsb25lZC5cbiAgICAgICAgICAgICAgLy8gVE9ETzogRmluZCBvdXQgb2YgdGhpcyBpcyBhY3R1YWxseSBuZWVkZWQgLyB1c2VkIGF0IGFsbD9cbiAgICAgICAgICAgICAgcmV0dXJuIHsgLi4uaXRlbSB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcHJvY2Vzc0JlZm9yZT8uKFxuICAgICAgICAgICAgY29tcG9uZW50U2NoZW1hLFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBjb21wb25lbnREYXRhUGF0aCxcbiAgICAgICAgICAgIHByb2Nlc3NlZERhdGFcbiAgICAgICAgICApXG4gICAgICAgICAgbGV0IHZhbHVlID0gcHJvY2Vzc2VkRGF0YSA/IHByb2Nlc3NlZERhdGFbbmFtZV0gOiBkYXRhW25hbWVdXG4gICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgaGFzRm9ybVNjaGVtYShjb21wb25lbnRTY2hlbWEpKSB7XG4gICAgICAgICAgICAvLyBSZWN1cnNpdmVseSBwcm9jZXNzIGRhdGEgb24gbmVzdGVkIGZvcm0gaXRlbXMuXG4gICAgICAgICAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgLy8gT3B0aW1pemF0aW9uOiBObyBuZWVkIHRvIGNvbGxlY3QgdmFsdWVzIGlmIHdlJ3JlIG5vdCBjbG9uaW5nIVxuICAgICAgICAgICAgICB2YWx1ZSA9IHByb2Nlc3NlZERhdGFcbiAgICAgICAgICAgICAgICA/IHZhbHVlLm1hcChwcm9jZXNzSXRlbSlcbiAgICAgICAgICAgICAgICA6IHZhbHVlLmZvckVhY2gocHJvY2Vzc0l0ZW0pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB2YWx1ZSA9IHByb2Nlc3NJdGVtKHZhbHVlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByb2Nlc3NlZERhdGEpIHtcbiAgICAgICAgICAgICAgcHJvY2Vzc2VkRGF0YVtuYW1lXSA9IHZhbHVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHByb2Nlc3NBZnRlcj8uKFxuICAgICAgICAgICAgY29tcG9uZW50U2NoZW1hLFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBjb21wb25lbnREYXRhUGF0aCxcbiAgICAgICAgICAgIHByb2Nlc3NlZERhdGFcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm9jZXNzQ29tcG9uZW50cyhzY2hlbWEuY29tcG9uZW50cylcbiAgZm9yIChjb25zdCB0YWIgb2YgZ2V0VGFiU2NoZW1hcyhzY2hlbWEpKSB7XG4gICAgcHJvY2Vzc0NvbXBvbmVudHModGFiLmNvbXBvbmVudHMpXG4gIH1cbiAgZm9yIChjb25zdCBwYW5lbCBvZiBnZXRQYW5lbFNjaGVtYXMoc2NoZW1hKSkge1xuICAgIHByb2Nlc3NDb21wb25lbnRzKHBhbmVsLmNvbXBvbmVudHMpXG4gIH1cblxuICByZXR1cm4gcHJvY2Vzc2VkRGF0YSB8fCBkYXRhXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXROYW1lZFNjaGVtYXMoc2NoZW1hcywgZGVmYXVsdHMpIHtcbiAgY29uc3QgdG9PYmplY3QgPSAoYXJyYXksIHRvU2NoZW1hKSA9PiB7XG4gICAgcmV0dXJuIGFycmF5Lmxlbmd0aCA+IDBcbiAgICAgID8gYXJyYXkucmVkdWNlKChvYmplY3QsIHZhbHVlKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc2NoZW1hID0gdG9TY2hlbWEodmFsdWUpXG4gICAgICAgICAgaWYgKHNjaGVtYSkge1xuICAgICAgICAgICAgb2JqZWN0W3NjaGVtYS5uYW1lXSA9XG4gICAgICAgICAgICAgIHNjaGVtYSAmJiBkZWZhdWx0c1xuICAgICAgICAgICAgICAgID8geyAuLi5kZWZhdWx0cywgLi4uc2NoZW1hIH1cbiAgICAgICAgICAgICAgICA6IHNjaGVtYVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gb2JqZWN0XG4gICAgICAgIH0sIHt9KVxuICAgICAgOiBudWxsXG4gIH1cblxuICByZXR1cm4gaXNBcnJheShzY2hlbWFzKVxuICAgID8gdG9PYmplY3Qoc2NoZW1hcywgdmFsdWUgPT5cbiAgICAgICAgaXNPYmplY3QodmFsdWUpXG4gICAgICAgICAgPyB2YWx1ZVxuICAgICAgICAgIDoge1xuICAgICAgICAgICAgICBuYW1lOiBjYW1lbGl6ZSh2YWx1ZSwgZmFsc2UpXG4gICAgICAgICAgICB9XG4gICAgICApXG4gICAgOiBpc09iamVjdChzY2hlbWFzKVxuICAgICAgPyB0b09iamVjdChcbiAgICAgICAgICBPYmplY3QuZW50cmllcyhzY2hlbWFzKSxcbiAgICAgICAgICAoW25hbWUsIHZhbHVlXSkgPT5cbiAgICAgICAgICAgIGlzT2JqZWN0KHZhbHVlKVxuICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAuLi52YWx1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgOiBpc1N0cmluZyh2YWx1ZSlcbiAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHZhbHVlXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiBudWxsXG4gICAgICAgIClcbiAgICAgIDogbnVsbFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QnV0dG9uU2NoZW1hcyhidXR0b25zKSB7XG4gIHJldHVybiBnZXROYW1lZFNjaGVtYXMoXG4gICAgYnV0dG9ucyxcbiAgICB7IHR5cGU6ICdidXR0b24nIH0gLy8gRGVmYXVsdHNcbiAgKVxufVxuXG5mdW5jdGlvbiBnZXRUeXBlKHNjaGVtYU9yVHlwZSkge1xuICByZXR1cm4gaXNPYmplY3Qoc2NoZW1hT3JUeXBlKSA/IHNjaGVtYU9yVHlwZS50eXBlIDogc2NoZW1hT3JUeXBlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUeXBlT3B0aW9ucyhzY2hlbWFPclR5cGUpIHtcbiAgcmV0dXJuIGdldFR5cGVDb21wb25lbnQoZ2V0VHlwZShzY2hlbWFPclR5cGUpLCB0cnVlKSA/PyBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTb3VyY2VUeXBlKHNjaGVtYU9yVHlwZSkge1xuICByZXR1cm4gKFxuICAgIGdldFR5cGVPcHRpb25zKHNjaGVtYU9yVHlwZSk/LmdldFNvdXJjZVR5cGU/LihnZXRUeXBlKHNjaGVtYU9yVHlwZSkpID8/XG4gICAgbnVsbFxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYW5lbEVudHJ5KHNjaGVtYSwgZGF0YVBhdGggPSBudWxsLCB0YWJDb21wb25lbnQgPSBudWxsKSB7XG4gIHJldHVybiBzY2hlbWFcbiAgICA/IHtcbiAgICAgICAgc2NoZW1hLFxuICAgICAgICAvLyBJZiB0aGUgcGFuZWwgcHJvdmlkZXMgaXRzIG93biBuYW1lLCBhcHBlbmQgaXQgdG8gdGhlIGRhdGFQYXRoLlxuICAgICAgICAvLyBUaGlzIGlzIHVzZWQgZS5nLiBmb3IgJGZpbHRlcnMgcGFuZWxzLlxuICAgICAgICBkYXRhUGF0aDpcbiAgICAgICAgICBkYXRhUGF0aCAhPSBudWxsICYmIHNjaGVtYS5uYW1lXG4gICAgICAgICAgICA/IGFwcGVuZERhdGFQYXRoKGRhdGFQYXRoLCBzY2hlbWEubmFtZSlcbiAgICAgICAgICAgIDogZGF0YVBhdGgsXG4gICAgICAgIHRhYkNvbXBvbmVudFxuICAgICAgfVxuICAgIDogbnVsbFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFuZWxFbnRyaWVzKFxuICBwYW5lbFNjaGVtYXMsXG4gIGRhdGFQYXRoID0gbnVsbCxcbiAgdGFiQ29tcG9uZW50ID0gbnVsbCxcbiAgcGFuZWxFbnRyaWVzID0gW11cbikge1xuICBpZiAocGFuZWxTY2hlbWFzKSB7XG4gICAgZm9yIChjb25zdCBba2V5LCBzY2hlbWFdIG9mIE9iamVjdC5lbnRyaWVzKHBhbmVsU2NoZW1hcykpIHtcbiAgICAgIGNvbnN0IGVudHJ5ID0gZ2V0UGFuZWxFbnRyeShcbiAgICAgICAgc2NoZW1hLFxuICAgICAgICBkYXRhUGF0aCAhPSBudWxsID8gYXBwZW5kRGF0YVBhdGgoZGF0YVBhdGgsIGtleSkgOiBudWxsLFxuICAgICAgICB0YWJDb21wb25lbnRcbiAgICAgIClcbiAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICBwYW5lbEVudHJpZXMucHVzaChlbnRyeSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHBhbmVsRW50cmllc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGFiU2NoZW1hcyhzY2hlbWEpIHtcbiAgcmV0dXJuIHNjaGVtYT8udGFicyA/IE9iamVjdC52YWx1ZXMoc2NoZW1hLnRhYnMpIDogW11cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhbmVsU2NoZW1hcyhzY2hlbWEpIHtcbiAgcmV0dXJuIHNjaGVtYT8ucGFuZWxzID8gT2JqZWN0LnZhbHVlcyhzY2hlbWEucGFuZWxzKSA6IFtdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbGxQYW5lbEVudHJpZXMoXG4gIGFwaSxcbiAgc2NoZW1hLFxuICBkYXRhUGF0aCA9IG51bGwsXG4gIHNjaGVtYUNvbXBvbmVudCA9IG51bGwsXG4gIHRhYkNvbXBvbmVudCA9IG51bGxcbikge1xuICBjb25zdCBwYW5lbFNjaGVtYSA9IGdldFR5cGVPcHRpb25zKHNjaGVtYSk/LmdldFBhbmVsU2NoZW1hPy4oXG4gICAgYXBpLFxuICAgIHNjaGVtYSxcbiAgICBkYXRhUGF0aCxcbiAgICBzY2hlbWFDb21wb25lbnRcbiAgKVxuICBjb25zdCBwYW5lbEVudHJpZXMgPSBwYW5lbFNjaGVtYVxuICAgID8gW2dldFBhbmVsRW50cnkocGFuZWxTY2hlbWEsIGRhdGFQYXRoLCB0YWJDb21wb25lbnQpXVxuICAgIDogW11cbiAgLy8gQWxsb3cgZWFjaCBjb21wb25lbnQgdG8gcHJvdmlkZSBpdHMgb3duIHNldCBvZiBwYW5lbHMsIGluXG4gIC8vIGFkZGl0aW9uIHRvIHRoZSBkZWZhdWx0IG9uZSAoZS5nLiBnZXRGaWx0ZXJzUGFuZWwoKSwgJGZpbHRlcnMpOlxuICBnZXRQYW5lbEVudHJpZXMoc2NoZW1hPy5wYW5lbHMsIGRhdGFQYXRoLCB0YWJDb21wb25lbnQsIHBhbmVsRW50cmllcylcbiAgcmV0dXJuIHBhbmVsRW50cmllc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3RTb3VyY2Uoc2NoZW1hT3JUeXBlKSB7XG4gIHJldHVybiBnZXRTb3VyY2VUeXBlKHNjaGVtYU9yVHlwZSkgPT09ICdvYmplY3QnXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0xpc3RTb3VyY2Uoc2NoZW1hT3JUeXBlKSB7XG4gIHJldHVybiBnZXRTb3VyY2VUeXBlKHNjaGVtYU9yVHlwZSkgPT09ICdsaXN0J1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SXRlbUlkKHNvdXJjZVNjaGVtYSwgaXRlbSkge1xuICBjb25zdCBpZCA9IGl0ZW1bc291cmNlU2NoZW1hLmlkS2V5IHx8ICdpZCddXG4gIHJldHVybiBpZCAhPSBudWxsID8gU3RyaW5nKGlkKSA6IHVuZGVmaW5lZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SXRlbVVpZChzb3VyY2VTY2hlbWEsIGl0ZW0pIHtcbiAgLy8gVHJ5IHRvIHVzZSB0aGUgaXRlbSBpZCBhcyB0aGUgdWlkLCBmYWxsaW5nIGJhY2sgb24gYXV0by1nZW5lcmF0ZWQgaWRzLCBidXRcbiAgLy8gZWl0aGVyIHdheSwgcGFzcyB0aHJvdWdoIGBnZXRVaWQoKWAgc28gdGhhdCB0aGUgaWRzIGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlXG4gIC8vIGl0ZW0gdGhyb3VnaCBhIHdlYWsgbWFwLCBhcyB0aGUgaWRzIGNhbiBiZSBmaWx0ZXJlZCBvdXQgaW4gYHByb2Nlc3NEYXRhKClgXG4gIC8vIHdoaWxlIHRoZSBjb21wb25lbnRzIHRoYXQgdXNlIHRoZSB1aWRzIGFzIGtleSBhcmUgc3RpbGwgdmlzaWJsZS5cbiAgcmV0dXJuIGdldFVpZChpdGVtLCBnZXRJdGVtSWQoc291cmNlU2NoZW1hLCBpdGVtKSlcbn1cbiIsIi8vIEEgbWluaS1yZXBsaWNhdGlvbiBvZiB2dWUncyBpbnRlcm5hbCBgcmVzb2x2ZU1lcmdlZE9wdGlvbnMoKWAgYnV0IG9ubHlcbi8vIGhhbmRsaW5nIG91ciBvd24gYWRkZWQgb3B0aW9ucyBwcm9wZXJ0aWVzIGFuZCBtZXJnaW5nIHRoZW0gZWFybHkgaW5zdGVhZFxuLy8gb2YgbGF6aWx5LlxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZU1lcmdlZE9wdGlvbnMob3B0aW9ucykge1xuICBjb25zdCB7IG1peGlucyB9ID0gb3B0aW9uc1xuICByZXR1cm4gbWl4aW5zIHx8IG9wdGlvbnMuZXh0ZW5kc1xuICAgID8gbWVyZ2VPcHRpb25zKFxuICAgICAgICB7IC4uLm9wdGlvbnMgfSxcbiAgICAgICAgb3B0aW9uc1xuICAgICAgKVxuICAgIDogb3B0aW9uc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VPcHRpb25zKHRvLCBmcm9tKSB7XG4gIGlmIChmcm9tLmV4dGVuZHMpIHtcbiAgICBtZXJnZU9wdGlvbnModG8sIGZyb20uZXh0ZW5kcylcbiAgfVxuICBpZiAoZnJvbS5taXhpbnMpIHtcbiAgICBmb3IgKGNvbnN0IG1peGluIG9mIGZyb20ubWl4aW5zKSB7XG4gICAgICBtZXJnZU9wdGlvbnModG8sIG1peGluKVxuICAgIH1cbiAgfVxuICBmb3IgKGNvbnN0IGtleSBvZiBkaXRvT3B0aW9uS2V5cykge1xuICAgIGlmIChrZXkgaW4gZnJvbSkge1xuICAgICAgdG9ba2V5XSA9IGZyb21ba2V5XVxuICAgIH1cbiAgfVxuICByZXR1cm4gdG9cbn1cblxuY29uc3QgZGl0b09wdGlvbktleXMgPSBbXG4gICdkZWZhdWx0VmFsdWUnLFxuICAnZGVmYXVsdE5lc3RlZCcsXG4gICdkZWZhdWx0VmlzaWJsZScsXG4gICdnZW5lcmF0ZUxhYmVsJyxcbiAgJ2V4Y2x1ZGVWYWx1ZScsXG4gICdpZ25vcmVNaXNzaW5nVmFsdWUnLFxuICAnYWxpZ25Cb3R0b20nLFxuICAnb21pdFBhZGRpbmcnLFxuICAncHJvY2Vzc1ZhbHVlJyxcbiAgJ3Byb2Nlc3NTY2hlbWEnLFxuICAnZ2V0UGFuZWxTY2hlbWEnLFxuICAnZ2V0Rm9ybVNjaGVtYXNGb3JQcm9jZXNzaW5nJyxcbiAgLy8gVnVlIDMgLyBWdWUtcm91dGVyIDQgZm9yZ2V0cyB0aGVzZS5cbiAgLy8gVE9ETzogQ3JlYXRlIGJ1Zy1yZXBvcnQ/XG4gICdiZWZvcmVSb3V0ZVVwZGF0ZScsXG4gICdiZWZvcmVSb3V0ZUxlYXZlJ1xuXVxuIiwiaW1wb3J0IERpdG9NaXhpbiBmcm9tICcuL21peGlucy9EaXRvTWl4aW4uanMnXG5pbXBvcnQgeyBnZXRUeXBlQ29tcG9uZW50IH0gZnJvbSAnLi91dGlscy9zY2hlbWEuanMnXG5pbXBvcnQgeyByZXNvbHZlTWVyZ2VkT3B0aW9ucyB9IGZyb20gJy4vdXRpbHMvb3B0aW9ucy5qcydcbmltcG9ydCB7IGlzUGxhaW5PYmplY3QgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG5jb25zdCBjb21wb25lbnRzID0ge31cblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgbWl4aW5zOiBbRGl0b01peGluXSxcbiAgLy8gTWFrZSBzdXJlIHRoYXQgcmVnaXN0ZXJlZCBjb21wb25lbnRzIGFyZSBwcmVzZW50IGluIGFsbCBEaXRvQ29tcG9uZW50LlxuICBjb21wb25lbnRzLFxuXG4gIGNvbXBvbmVudChuYW1lLCBkZWZpbml0aW9uKSB7XG4gICAgaWYgKGRlZmluaXRpb24pIHtcbiAgICAgIGlmIChpc1BsYWluT2JqZWN0KGRlZmluaXRpb24pKSB7XG4gICAgICAgIGRlZmluaXRpb24gPSByZXNvbHZlTWVyZ2VkT3B0aW9ucyh7XG4gICAgICAgICAgZXh0ZW5kczogdGhpcyxcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIC4uLmRlZmluaXRpb25cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGNvbXBvbmVudHNbbmFtZV0gPSBkZWZpbml0aW9uXG4gICAgfVxuICAgIGlmICghKG5hbWUgaW4gY29tcG9uZW50cykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ29tcG9uZW50IFwiJHtuYW1lfVwiIG5vdCByZWdpc3RlcmVkYClcbiAgICB9XG4gICAgcmV0dXJuIGNvbXBvbmVudHNbbmFtZV1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0VHlwZUNvbXBvbmVudFxuICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBEaXRvVXNlciB7XG4gIGhhc1JvbGUoLi4ucm9sZXMpIHtcbiAgICBpZiAodGhpcy5yb2xlcykge1xuICAgICAgZm9yIChjb25zdCByb2xlIG9mIHJvbGVzKSB7XG4gICAgICAgIGlmICh0aGlzLnJvbGVzLmluY2x1ZGVzKHJvbGUpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuIiwiLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgcHJvdmlkZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJHNjaGVtYVBhcmVudENvbXBvbmVudDogKCkgPT4gdGhpc1xuICAgIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzY2hlbWFDb21wb25lbnRzOiBbXVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIG1haW5TY2hlbWFDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY2hlbWFDb21wb25lbnRzWzBdXG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICAvLyBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgYERpdG9TY2hlbWEuY3JlYXRlZCgpL3VubW91bnRlZCgpYCBvbiBpdHNcbiAgICAvLyBgJHNjaGVtYVBhcmVudENvbXBvbmVudGAsIGlmIHRoZSBwYXJlbnQgdXNlcyB0aGUgYFNjaGVtYVBhcmVudE1peGluYDpcbiAgICBfcmVnaXN0ZXJTY2hlbWFDb21wb25lbnQoc2NoZW1hQ29tcG9uZW50LCBhZGQpIHtcbiAgICAgIGNvbnN0IHsgc2NoZW1hQ29tcG9uZW50cyB9ID0gdGhpc1xuICAgICAgaWYgKGFkZCkge1xuICAgICAgICBzY2hlbWFDb21wb25lbnRzLnB1c2goc2NoZW1hQ29tcG9uZW50KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2NoZW1hQ29tcG9uZW50cy5zcGxpY2Uoc2NoZW1hQ29tcG9uZW50cy5pbmRleE9mKHNjaGVtYUNvbXBvbmVudCksIDEpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgU2NoZW1hUGFyZW50TWl4aW4gZnJvbSAnLi9TY2hlbWFQYXJlbnRNaXhpbi5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgbWl4aW5zOiBbU2NoZW1hUGFyZW50TWl4aW5dLFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgZXJyb3JzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hQ29tcG9uZW50cy5yZWR1Y2UoXG4gICAgICAgIChyZXN1bHQsIHsgZXJyb3JzIH0pID0+XG4gICAgICAgICAgZXJyb3JzICYmIHJlc3VsdCA/IHJlc3VsdC5jb25jYXQoZXJyb3JzKSA6IGVycm9ycyxcbiAgICAgICAgbnVsbFxuICAgICAgKVxuICAgIH0sXG5cbiAgICBpc1RvdWNoZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY2hlbWFDb21wb25lbnRzLnNvbWUoaXQgPT4gaXQuaXNUb3VjaGVkKVxuICAgIH0sXG5cbiAgICBpc0RpcnR5KCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hQ29tcG9uZW50cy5zb21lKGl0ID0+IGl0LmlzRGlydHkpXG4gICAgfSxcblxuICAgIGlzVmFsaWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY2hlbWFDb21wb25lbnRzLmV2ZXJ5KGl0ID0+IGl0LmlzVmFsaWQpXG4gICAgfSxcblxuICAgIGlzVmFsaWRhdGVkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hQ29tcG9uZW50cy5ldmVyeShpdCA9PiBpdC5pc1ZhbGlkKVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgdmFsaWRhdGVBbGwobWF0Y2gsIG5vdGlmeSA9IHRydWUpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjaGVtYUNvbXBvbmVudHMuZXZlcnkoaXQgPT4gaXQudmFsaWRhdGVBbGwobWF0Y2gsIG5vdGlmeSkpXG4gICAgfSxcblxuICAgIHZlcmlmeUFsbChtYXRjaCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hQ29tcG9uZW50cy5ldmVyeShpdCA9PiBpdC52ZXJpZnlBbGwobWF0Y2gpKVxuICAgIH0sXG5cbiAgICByZXNldFZhbGlkYXRpb24oKSB7XG4gICAgICB0aGlzLnNjaGVtYUNvbXBvbmVudHMuZm9yRWFjaChpdCA9PiBpdC5yZXNldFZhbGlkYXRpb24oKSlcbiAgICB9LFxuXG4gICAgY2xlYXJFcnJvcnMoKSB7XG4gICAgICB0aGlzLnNjaGVtYUNvbXBvbmVudHMuZm9yRWFjaChpdCA9PiBpdC5jbGVhckVycm9ycygpKVxuICAgIH0sXG5cbiAgICBzaG93VmFsaWRhdGlvbkVycm9ycyhlcnJvcnMsIGZvY3VzKSB7XG4gICAgICB0aGlzLnNjaGVtYUNvbXBvbmVudHMuZm9yRWFjaChcbiAgICAgICAgaXQgPT4gaXQuc2hvd1ZhbGlkYXRpb25FcnJvcnMoZXJyb3JzLCBmb2N1cylcbiAgICAgIClcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBWYWxpZGF0b3JNaXhpbiBmcm9tICcuLi9taXhpbnMvVmFsaWRhdG9yTWl4aW4uanMnXG5pbXBvcnQgeyBnZXRDb21tb25QcmVmaXggfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQge1xuICBtaXhpbnM6IFtWYWxpZGF0b3JNaXhpbl0sXG5cbiAgcHJvdmlkZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJHJvdXRlQ29tcG9uZW50OiAoKSA9PiB0aGlzXG4gICAgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlbG9hZDogZmFsc2UsXG4gICAgICAvLyBFYWNoIHJvdXRlLWNvbXBvbmVudCBkZWZpbmVzIGEgc3RvcmUgdGhhdCBnZXRzIHBhc3NlZCBvbiB0byBpdHNcbiAgICAgIC8vIGNoaWxkIGNvbXBvbmVudHMsIHNvIHRoZXkgY2FuIHN0b3JlIHZhbHVlcyBpbiB0aGVtIHRoYXQgbGl2ZSBiZXlvbmRcbiAgICAgIC8vIHRoZWlyIGxpZmUtY3ljbGUuIFNlZTogRGl0b1BhbmUsIFNvdXJjZU1peGluXG4gICAgICBzdG9yZToge30sXG4gICAgICBsb2FkQ2FjaGU6IHt9IC8vIFNlZSBUeXBlTWl4aW4ubG9hZCgpXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgcm91dGVDb21wb25lbnQoKSB7XG4gICAgICAvLyBPdmVycmlkZSBEaXRvTWl4aW4ncyByb3V0ZUNvbXBvbmVudCgpIHdoaWNoIHVzZXMgdGhlIGluamVjdGVkIHZhbHVlLlxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9LFxuXG4gICAgcm91dGVMZXZlbCgpIHtcbiAgICAgIGxldCBsZXZlbCA9IDBcbiAgICAgIGxldCByb3V0ZUNvbXBvbmVudCA9IHRoaXNcbiAgICAgIHdoaWxlICgocm91dGVDb21wb25lbnQgPSByb3V0ZUNvbXBvbmVudC5wYXJlbnRDb21wb25lbnQucm91dGVDb21wb25lbnQpKSB7XG4gICAgICAgIGxldmVsKytcbiAgICAgIH1cbiAgICAgIHJldHVybiBsZXZlbFxuICAgIH0sXG5cbiAgICByb3V0ZVJlY29yZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLiRyb3V0ZS5tYXRjaGVkW3RoaXMucm91dGVMZXZlbF1cbiAgICB9LFxuXG4gICAgaXNMYXN0Um91dGUoKSB7XG4gICAgICAvLyBSZXR1cm5zIHRydWUgd2hlbiB0aGlzIHJvdXRlciBjb21wb25lbnQgaXMgdGhlIGxhc3Qgb25lIGluIHRoZSByb3V0ZS5cbiAgICAgIGNvbnN0IHsgbWF0Y2hlZCB9ID0gdGhpcy4kcm91dGVcbiAgICAgIHJldHVybiB0aGlzLnJvdXRlUmVjb3JkID09PSBtYXRjaGVkW21hdGNoZWQubGVuZ3RoIC0gMV1cbiAgICB9LFxuXG4gICAgaXNMYXN0VW5uZXN0ZWRSb3V0ZSgpIHtcbiAgICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHJvdXRlIGNvbXBvbmVudCBpcyB0aGUgbGFzdCBvbmUgaW4gdGhlIHJvdXRlIHRoYXRcbiAgICAgIC8vIG5lZWRzIGl0cyBvd24gcm91dGVyLXZpZXcgKD0gaXMgbm90IG5lc3RlZCkuXG4gICAgICBjb25zdCB7IG1hdGNoZWQgfSA9IHRoaXMuJHJvdXRlXG4gICAgICBmb3IgKGxldCBpID0gbWF0Y2hlZC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBjb25zdCByZWNvcmQgPSBtYXRjaGVkW2ldXG4gICAgICAgIGlmICghcmVjb3JkLm1ldGEubmVzdGVkKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucm91dGVSZWNvcmQgPT09IHJlY29yZFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9LFxuXG4gICAgaXNOZXN0ZWRSb3V0ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLm1ldGEubmVzdGVkXG4gICAgfSxcblxuICAgIGlzVmlldygpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0sXG5cbiAgICBtZXRhKCkge1xuICAgICAgcmV0dXJuIHRoaXMucm91dGVSZWNvcmQ/Lm1ldGFcbiAgICB9LFxuXG4gICAgcGF0aCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFJvdXRlUGF0aCh0aGlzLnJvdXRlUmVjb3JkLnBhdGgpXG4gICAgfSxcblxuICAgIGxhYmVsKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0TGFiZWwodGhpcy5zY2hlbWEpXG4gICAgfSxcblxuICAgIGJyZWFkY3J1bWIoKSB7XG4gICAgICBjb25zdCB7IGJyZWFkY3J1bWIgfSA9IHRoaXMuc2NoZW1hIHx8IHt9XG4gICAgICByZXR1cm4gYnJlYWRjcnVtYiB8fCBgJHt0aGlzLmJyZWFkY3J1bWJQcmVmaXh9ICR7dGhpcy5sYWJlbH1gXG4gICAgfSxcblxuICAgIGJyZWFkY3J1bWJQcmVmaXgoKSB7XG4gICAgICByZXR1cm4gJydcbiAgICB9LFxuXG4gICAgcGFyYW0oKSB7XG4gICAgICAvLyBXb3JrYXJvdW5kIGZvciB2dWUtcm91dGVyIG5vdCBiZWluZyBhYmxlIHRvIG1hcCBtdWx0aXBsZSB1cmwgcGFyYW1ldGVyc1xuICAgICAgLy8gd2l0aCB0aGUgc2FtZSBuYW1lIHRvIG11bHRpcGxlIGNvbXBvbmVudHMsIHNlZTpcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS92dWVqcy92dWUtcm91dGVyL2lzc3Vlcy8xMzQ1XG4gICAgICByZXR1cm4gdGhpcy4kcm91dGUucGFyYW1zW3RoaXMubWV0YT8ucGFyYW1dIHx8IG51bGxcbiAgICB9LFxuXG4gICAgLy8gQG92ZXJyaWRhYmxlLCBzZWUgRGl0b0Zvcm1cbiAgICBpc011dGF0aW5nKCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9LFxuXG4gIGJlZm9yZVJvdXRlVXBkYXRlKHRvLCBmcm9tLCBuZXh0KSB7XG4gICAgdGhpcz8uYmVmb3JlUm91dGVDaGFuZ2UodG8sIGZyb20sIG5leHQpXG4gIH0sXG5cbiAgYmVmb3JlUm91dGVMZWF2ZSh0bywgZnJvbSwgbmV4dCkge1xuICAgIHRoaXM/LmJlZm9yZVJvdXRlQ2hhbmdlKHRvLCBmcm9tLCBuZXh0KVxuICB9LFxuXG4gIGNyZWF0ZWQoKSB7XG4gICAgLy8gS2VlcCBhIHNoYXJlZCBzdGFjayBvZiByb290IGNvbXBvbmVudHMgZm9yIERpdG9UcmFpbCB0byB1c2UgdG8gcmVuZGVyXG4gICAgLy8gbGFiZWxzLiBDYW4ndCByZWx5IG9uICRyb3V0ZS5tYXRjaGVkW2ldLmluc3RhbmNlcy5kZWZhdWx0IHVuZm9ydHVuYXRlbHksXG4gICAgLy8gYXMgaW5zdGFuY2VzIGFyZW4ndCBpbW1lZGlhdGVseSByZWFkeSwgYW5kIGluc3RhbmNlcyBpcyBub3QgcmVhY3RpdmUuXG4gICAgdGhpcy5hcHBTdGF0ZS5yb3V0ZUNvbXBvbmVudHMucHVzaCh0aGlzKVxuICB9LFxuXG4gIHVubW91bnRlZCgpIHtcbiAgICBjb25zdCB7IHJvdXRlQ29tcG9uZW50cyB9ID0gdGhpcy5hcHBTdGF0ZVxuICAgIHJvdXRlQ29tcG9uZW50cy5zcGxpY2Uocm91dGVDb21wb25lbnRzLmluZGV4T2YodGhpcyksIDEpXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGJlZm9yZVJvdXRlQ2hhbmdlKHRvLCBmcm9tLCBuZXh0KSB7XG4gICAgICBsZXQgb2sgPSB0cnVlXG4gICAgICBjb25zdCBpc0Nsb3NpbmcgPSAoXG4gICAgICAgIC8vIE9ubHkgaGFuZGxlIHRoaXMgcm91dGUgY2hhbmdlIGlmIHRoZSBmb3JtIGlzIGFjdHVhbGx5IG1hcHBlZCB0byB0aGVcbiAgICAgICAgLy8gYGZyb21gIHJvdXRlLCBidXQgaW5jbHVkZSBwYXJlbnQgZm9ybXMgb2YgY2xvc2luZyBuZXN0ZWQgZm9ybXMgYXMgYXNcbiAgICAgICAgLy8gd2VsbCwgYnkgbWF0Y2hpbmcgdGhlIHRoZSBzdGFydCBvZiBmcm9tL3RvIHBhdGggYWdhaW5zdCBgdGhpcy5wYXRoYDpcbiAgICAgICAgZnJvbS5wYXRoLnN0YXJ0c1dpdGgodGhpcy5wYXRoKSAmJlxuICAgICAgICAhdG8ucGF0aC5zdGFydHNXaXRoKHRoaXMucGF0aCkgJiZcbiAgICAgICAgLy8gRXhjbHVkZSBoYXNoIGNoYW5nZXMgb25seSAoPSB0YWIgY2hhbmdlcyk6XG4gICAgICAgIGZyb20ucGF0aCAhPT0gdG8ucGF0aCAmJiAoXG4gICAgICAgICAgdGhpcy5pc0Z1bGxSb3V0ZUNoYW5nZSh0bywgZnJvbSkgfHxcbiAgICAgICAgICAvLyBEZWNpZGUgaWYgd2UncmUgbW92aW5nIHRvd2FyZHMgYSBuZXcgbmVzdGVkIGZvcm0sIG9yIGNsb3NpbmcgL1xuICAgICAgICAgIC8vIHJlcGxhY2luZyBhbiBhbHJlYWR5IG9wZW4gb25lIGJ5IGNvbXBhcmluZyBwYXRoIGxlbmd0aHMuXG4gICAgICAgICAgLy8gVGhlIGNhc2Ugb2YgYD1gIG1hdGNoZXMgdGhlIHJlcGxhY2luZyBvZiBhbiBhbHJlYWR5IG9wZW4gb25lLlxuICAgICAgICAgIHRvLnBhdGgubGVuZ3RoIDw9IGZyb20ucGF0aC5sZW5ndGhcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgaWYgKGlzQ2xvc2luZykge1xuICAgICAgICBpZiAodGhpcy5pc011dGF0aW5nKSB7XG4gICAgICAgICAgLy8gRm9yIGFjdGl2ZSBkaXJlY3RseSBtdXRhdGluZyAobmVzdGVkKSBmb3JtcyB0aGF0IHdlcmUgbm90IHZhbGlkYXRlZFxuICAgICAgICAgIC8vIHlldCwgdmFsaWRhdGUgdGhlbSBvbmNlLiBJZiB0aGUgdXNlciB0aGVuIHN0aWxsIHdhbnRzIHRvIGxlYXZlXG4gICAgICAgICAgLy8gdGhlbSwgdGhleSBjYW4gY2xpY2sgY2xvc2UgLyBuYXZpZ2F0ZSBhd2F5IGFnYWluLlxuICAgICAgICAgIG9rID0gKFxuICAgICAgICAgICAgdGhpcy5pc1ZhbGlkYXRlZCB8fFxuICAgICAgICAgICAgdGhpcy52YWxpZGF0ZUFsbCgpXG4gICAgICAgICAgKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFRoZSBmb3JtIGRvZXNuJ3QgZGlyZWN0bHkgbXV0YXRlIGRhdGEuIElmIGl0IGlzIGRpcnR5LCBhc2sgaWYgdXNlclxuICAgICAgICAgIC8vIHdhbnRzIHRvIHBlcnNpc3QgZGF0YSBmaXJzdC5cbiAgICAgICAgICBpZiAodGhpcy5pc0RpcnR5KSB7XG4gICAgICAgICAgICBvayA9IHdpbmRvdy5jb25maXJtKFxuICAgICAgICAgICAgICBgWW91IGhhdmUgdW5zYXZlZCBjaGFuZ2VzLiBEbyB5b3UgcmVhbGx5IHdhbnQgdG8gJHtcbiAgICAgICAgICAgICAgICB0aGlzLnZlcmJzLmNhbmNlbFxuICAgICAgICAgICAgICB9P2BcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG5leHQob2spXG4gICAgfSxcblxuICAgIGdldFJvdXRlUGF0aCh0ZW1wbGF0ZVBhdGgpIHtcbiAgICAgIC8vIE1hcHMgdGhlIHJvdXRlJ3MgYWN0dWFsIHBhdGggdG8gdGhlIG1hdGNoZWQgcm91dGVzIGJ5IGNvdW50aW5nIGl0c1xuICAgICAgLy8gcGFydHMgc2VwYXJhdGVkIGJ5ICcvJywgc3BsaXR0aW5nIHRoZSBwYXRoIGludG8gdGhlIG1hcHBlZCBwYXJ0c1xuICAgICAgLy8gY29udGFpbmluZyBhY3R1YWwgcGFyYW1ldGVycy5cbiAgICAgIHJldHVybiB0aGlzLiRyb3V0ZS5wYXRoXG4gICAgICAgIC5zcGxpdCgnLycpXG4gICAgICAgIC5zbGljZSgwLCB0ZW1wbGF0ZVBhdGguc3BsaXQoJy8nKS5sZW5ndGgpXG4gICAgICAgIC5qb2luKCcvJylcbiAgICB9LFxuXG4gICAgZ2V0Q2hpbGRQYXRoKHBhdGgpIHtcbiAgICAgIHJldHVybiBgJHt0aGlzLnBhdGh9LyR7cGF0aH1gXG4gICAgfSxcblxuICAgIGlzRnVsbFJvdXRlQ2hhbmdlKHRvLCBmcm9tKSB7XG4gICAgICAvLyBUaGUgcm91dGUgcGF0aCBpcyB0aGUgcGF0aCB1cCB0byB0aGUgZmlyc3QgLyAoZXhjbHVkaW5nIHRoZSBpbml0aWFsIC8pOlxuICAgICAgY29uc3Qgcm9vdFBhdGggPSB0aGlzLnBhdGgubWF0Y2goL14oXFwvW14vXSopLylbMV1cbiAgICAgIHJldHVybiAhZ2V0Q29tbW9uUHJlZml4KHRvLnBhdGgsIGZyb20ucGF0aCkuc3RhcnRzV2l0aChyb290UGF0aClcbiAgICB9XG4gIH1cbn1cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG50ZW1wbGF0ZShcbiAgdi1pZj1cInVzZXJcIlxuKVxuICAvLy0gT25seSByZW5kZXIgRGl0b1ZpZXcgd2hlbiBpdCBpcyBhY3RpdmUsIG90aGVyd2lzZSBhIG5vcm1hbCByb3V0ZXItdmlld1xuICAvLy0gaW5zdGVhZCwgdG8gbmVzdCBmdXJ0aGVyIHJvdXRlIGNvbXBvbmVudHMuXG4gIC8vLSBOT1RFOiBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBoYW5kbGluZyBpbiBEaXRvRm9ybSwgd2hlcmUgYHYtc2hvd2AgaXNcbiAgLy8tIHVzZWQgdG8gYWx3YXlzIHJlbmRlciBmb3JtcyBldmVuIHdoZW4gb3RoZXIgbmVzdGVkIGZvcm1zIGFyZSBwcmVzZW50LlxuICBSb3V0ZXJWaWV3KFxuICAgIHYtaWY9XCIhaXNMYXN0Um91dGVcIlxuICAgIDprZXk9XCJuYW1lXCJcbiAgKVxuICAuZGl0by12aWV3LmRpdG8tc2Nyb2xsLXBhcmVudChcbiAgICB2LWVsc2UtaWY9XCJzaG91bGRSZW5kZXIodmlld1NjaGVtYSlcIlxuICAgIDpkYXRhLXJlc291cmNlPVwic291cmNlU2NoZW1hLnBhdGhcIlxuICApXG4gICAgRGl0b1NjaGVtYS5kaXRvLXNjcm9sbChcbiAgICAgIDpzY2hlbWE9XCJ2aWV3U2NoZW1hXCJcbiAgICAgIDpkYXRhPVwiZGF0YVwiXG4gICAgICA6bWV0YT1cIm1ldGFcIlxuICAgICAgOnN0b3JlPVwiZ2V0Q2hpbGRTdG9yZShuYW1lKVwiXG4gICAgICA6ZGlzYWJsZWQ9XCJpc0xvYWRpbmdcIlxuICAgICAgOmdlbmVyYXRlTGFiZWxzPVwiZmFsc2VcIlxuICAgICAgOm1lbnVIZWFkZXI9XCJ0cnVlXCJcbiAgICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCBSb3V0ZU1peGluIGZyb20gJy4uL21peGlucy9Sb3V0ZU1peGluLmpzJ1xuaW1wb3J0IHsgc29tZVNjaGVtYUNvbXBvbmVudCwgaXNTaW5nbGVDb21wb25lbnRWaWV3IH0gZnJvbSAnLi4vdXRpbHMvc2NoZW1hLmpzJ1xuaW1wb3J0IHsgaGFzUmVzb3VyY2UgfSBmcm9tICcuLi91dGlscy9yZXNvdXJjZS5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvVmlldycsIHtcbiAgbWl4aW5zOiBbUm91dGVNaXhpbl0sXG5cbiAgcHJvdmlkZSgpIHtcbiAgICAvLyBSZWRpcmVjdCAkc291cmNlQ29tcG9uZW50IGFuZCAkcmVzb3VyY2VDb21wb25lbnQgdG8gdGhlIG1haW4gY29tcG9uZW50OlxuICAgIHJldHVybiB7XG4gICAgICAkc291cmNlQ29tcG9uZW50OiAoKSA9PiB0aGlzLm1haW5Db21wb25lbnQ/LnNvdXJjZUNvbXBvbmVudCB8fCBudWxsLFxuICAgICAgJHJlc291cmNlQ29tcG9uZW50OiAoKSA9PiB0aGlzLm1haW5Db21wb25lbnQ/LnJlc291cmNlQ29tcG9uZW50IHx8IG51bGxcbiAgICB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLy8gVXBkYXRlZCBmcm9tIExvYWRpbmdNaXhpbiB0aHJvdWdoIGBzZXRMb2FkaW5nKGlzTG9hZGluZylgOlxuICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICAgIC8vIE5PVEU6IERhdGEgaXMgc2hhcmVkIGFjcm9zcyBhbGwgdmlld3MgYmVjYXVzZSB0aGUgcm91dGVyIHJlY3ljbGVzIHRoZVxuICAgICAgLy8gRGl0b1ZpZXcgY29tcG9uZW50LlxuICAgICAgZGF0YToge31cbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBzY2hlbWEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5tZXRhLnNjaGVtYVxuICAgIH0sXG5cbiAgICBuYW1lKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hLm5hbWVcbiAgICB9LFxuXG4gICAgaXNWaWV3KCkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9LFxuXG4gICAgaXNTaW5nbGVDb21wb25lbnRWaWV3KCkge1xuICAgICAgcmV0dXJuIGlzU2luZ2xlQ29tcG9uZW50Vmlldyh0aGlzLnNjaGVtYSlcbiAgICB9LFxuXG4gICAgbWFpbkNvbXBvbmVudCgpIHtcbiAgICAgIHJldHVybiB0aGlzLm1haW5TY2hlbWFDb21wb25lbnQuZ2V0Q29tcG9uZW50QnlEYXRhUGF0aCh0aGlzLm5hbWUpXG4gICAgfSxcblxuICAgIHZpZXdTY2hlbWEoKSB7XG4gICAgICBjb25zdCB7IGNvbXBvbmVudCwgLi4uc2NoZW1hIH0gPSB0aGlzLnNjaGVtYVxuICAgICAgLy8gVHJhbnNsYXRlIHNpbmdsZS1jb21wb25lbnQgc2NoZW1hcyBpbnRvIG11bHRpLWNvbXBvbmVudCBzY2hlbWFzLFxuICAgICAgLy8gc28gdGhleSBjYW4gYmUgcmVuZGVyZWQgZGlyZWN0bHkgdGhyb3VnaCBEaXRvU2NoZW1hIGFsc286XG4gICAgICByZXR1cm4gdGhpcy5pc1NpbmdsZUNvbXBvbmVudFZpZXdcbiAgICAgICAgPyB7XG4gICAgICAgICAgICAuLi5zY2hlbWEsXG4gICAgICAgICAgICBjb21wb25lbnRzOiB7XG4gICAgICAgICAgICAgIFtzY2hlbWEubmFtZV06IHtcbiAgICAgICAgICAgICAgICBuYW1lOiBzY2hlbWEubmFtZSxcbiAgICAgICAgICAgICAgICBsYWJlbDogZmFsc2UsXG4gICAgICAgICAgICAgICAgLi4uY29tcG9uZW50XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIDogc2NoZW1hXG4gICAgfSxcblxuICAgIHByb3ZpZGVzRGF0YSgpIHtcbiAgICAgIHJldHVybiBzb21lU2NoZW1hQ29tcG9uZW50KHRoaXMudmlld1NjaGVtYSwgaGFzUmVzb3VyY2UpXG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgJHJvdXRlKHRvLCBmcm9tKSB7XG4gICAgICAvLyBTZWUgaWYgdGhlIHJvdXRlIGNoYW5nZXMgY29tcGxldGVseSwgYW5kIGNsZWFyIHRoZSBkYXRhIGlmIGl0IGRvZXMuXG4gICAgICBpZiAodGhpcy5pc0Z1bGxSb3V0ZUNoYW5nZSh0bywgZnJvbSkpIHtcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZVxuICAgICAgICB0aGlzLmRhdGEgPSB7fVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgc2V0RGF0YShkYXRhKSB7XG4gICAgICB0aGlzLmRhdGEgPSBkYXRhXG4gICAgfSxcblxuICAgIGdldENoaWxkUGF0aChwYXRoKSB7XG4gICAgICAvLyBMaXN0cyBpbnNpZGUgc2luZ2xlLWNvbXBvbmVudCB2aWV3cyB1c2UgdGhlIHZpZXcncyBwYXRoIGZvciBzdWItcGF0aHM6XG4gICAgICByZXR1cm4gdGhpcy5pc1NpbmdsZUNvbXBvbmVudFZpZXdcbiAgICAgICAgPyB0aGlzLnBhdGhcbiAgICAgICAgOiBgJHt0aGlzLnBhdGh9LyR7cGF0aH1gXG4gICAgfSxcblxuICAgIHNldExvYWRpbmcoaXNMb2FkaW5nKSB7XG4gICAgICB0aGlzLmlzTG9hZGluZyA9ICEhaXNMb2FkaW5nXG4gICAgfVxuICB9XG59KVxuPC9zY3JpcHQ+XG4iLCJpbXBvcnQgeyBpc0RhdGUgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG5leHBvcnQgZnVuY3Rpb24gY29weURhdGUoZGF0ZSwge1xuICB5ZWFyID0gZGF0ZT8uZ2V0RnVsbFllYXIoKSA/PyAwLFxuICBtb250aCA9IGRhdGU/LmdldE1vbnRoKCkgPz8gMCxcbiAgZGF5ID0gZGF0ZT8uZ2V0RGF0ZSgpID8/IDAsXG4gIGhvdXIgPSBkYXRlPy5nZXRIb3VycygpID8/IDAsXG4gIG1pbnV0ZSA9IGRhdGU/LmdldE1pbnV0ZXMoKSA/PyAwLFxuICBzZWNvbmQgPSBkYXRlPy5nZXRTZWNvbmRzKCkgPz8gMCxcbiAgbWlsbGlzZWNvbmQgPSBkYXRlPy5nZXRNaWxsaXNlY29uZHMoKSA/PyAwXG59ID0ge30pIHtcbiAgcmV0dXJuIG5ldyBEYXRlKHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29uZClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnREYXRlKGRhdGUpIHtcbiAgcmV0dXJuIGlzRGF0ZShkYXRlKSA/IGRhdGUgOiBkYXRlID8gbmV3IERhdGUoZGF0ZSkgOiBudWxsXG59XG4iLCI8IS0tIERlcml2ZWQgZnJvbSBBVFVJLCBhbmQgZnVydGhlciBleHRlbmRlZDogaHR0cHM6Ly9hbGlxaW4uZ2l0aHViLmlvL2F0dWkvIC0tPlxuPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLWNhbGVuZGFyXG4gIC5kaXRvLWNhbGVuZGFyLXBvcHVwXG4gICAgLmRpdG8tY2FsZW5kYXItaW5uZXJcbiAgICAgIHRlbXBsYXRlKFxuICAgICAgICB2LWlmPVwiY3VycmVudE1vZGUgPT09ICdkYXknXCJcbiAgICAgIClcbiAgICAgICAgLmRpdG8tY2FsZW5kYXItaGVhZGVyXG4gICAgICAgICAgYS5kaXRvLWNhbGVuZGFyLXN0ZXAtcHJldi5kaXRvLWNhbGVuZGFyLXN0ZXAteWVhcihcbiAgICAgICAgICAgIEBjbGljaz1cInN0ZXBZZWFyKC0xKVwiXG4gICAgICAgICAgKVxuICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zdGVwLXByZXYuZGl0by1jYWxlbmRhci1zdGVwLW1vbnRoKFxuICAgICAgICAgICAgQGNsaWNrPVwic3RlcE1vbnRoKC0xKVwiXG4gICAgICAgICAgKVxuICAgICAgICAgIHNwYW5cbiAgICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zZWxlY3QteWVhcihcbiAgICAgICAgICAgICAgQGNsaWNrPVwic2V0TW9kZSgneWVhcicpXCJcbiAgICAgICAgICAgICkge3sgZGF0ZVRvU3RyaW5nKGN1cnJlbnRWYWx1ZSwgeyB5ZWFyOiAxIH0pIH19XG4gICAgICAgICAgICBhLmRpdG8tY2FsZW5kYXItc2VsZWN0LW1vbnRoKFxuICAgICAgICAgICAgICBAY2xpY2s9XCJzZXRNb2RlKCdtb250aCcpXCJcbiAgICAgICAgICAgICkge3sgZGF0ZVRvU3RyaW5nKGN1cnJlbnRWYWx1ZSwgeyBtb250aDogMSB9KSB9fVxuICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zdGVwLW5leHQuZGl0by1jYWxlbmRhci1zdGVwLW1vbnRoKFxuICAgICAgICAgICAgQGNsaWNrPVwic3RlcE1vbnRoKDEpXCJcbiAgICAgICAgICApXG4gICAgICAgICAgYS5kaXRvLWNhbGVuZGFyLXN0ZXAtbmV4dC5kaXRvLWNhbGVuZGFyLXN0ZXAteWVhcihcbiAgICAgICAgICAgIEBjbGljaz1cInN0ZXBZZWFyKDEpXCJcbiAgICAgICAgICApXG4gICAgICAgIC5kaXRvLWNhbGVuZGFyLWJvZHlcbiAgICAgICAgICAuZGl0by1jYWxlbmRhci13ZWVrZGF5c1xuICAgICAgICAgICAgc3BhbihcbiAgICAgICAgICAgICAgdi1mb3I9XCJ3ZWVrZGF5IGluIHdlZWtkYXlOYW1lc1wiXG4gICAgICAgICAgICApIHt7IHdlZWtkYXkuc2hvcnQgfX1cbiAgICAgICAgICAuZGl0by1jYWxlbmRhci1kYXRlc1xuICAgICAgICAgICAgc3BhbihcbiAgICAgICAgICAgICAgdi1mb3I9XCJkYXRlIGluIGRhdGVSYW5nZVwiXG4gICAgICAgICAgICAgIDpjbGFzcz1cImRhdGUuc3RhdGUgJiYgYGRpdG8tY2FsZW5kYXItaXRlbS0ke2RhdGUuc3RhdGV9YFwiXG4gICAgICAgICAgICAgIEBjbGljaz1cInNlbGVjdERhdGUoZGF0ZS5kYXRlLCBkYXRlLnN0YXRlLCB0cnVlKVwiXG4gICAgICAgICAgICApIHt7IGRhdGUudGV4dCB9fVxuICAgICAgICAuZGl0by1jYWxlbmRhci1mb290ZXJcbiAgICAgICAgICBhLmRpdG8tY2FsZW5kYXItc2VsZWN0LXRvZGF5KFxuICAgICAgICAgICAgcm9sZT1cImJ1dHRvblwiXG4gICAgICAgICAgICA6dGl0bGU9XCJkYXRlVG9TdHJpbmcobmV3IERhdGUoKSwgeyB5ZWFyOiAxLCBtb250aDogMSwgZGF5OiAxIH0pXCJcbiAgICAgICAgICAgIEBjbGljaz1cInNlbGVjdERhdGUobmV3IERhdGUoKSlcIlxuICAgICAgICAgIClcbiAgICAgIHRlbXBsYXRlKFxuICAgICAgICB2LWVsc2UtaWY9XCJjdXJyZW50TW9kZSA9PT0gJ21vbnRoJ1wiXG4gICAgICApXG4gICAgICAgIC5kaXRvLWNhbGVuZGFyLWhlYWRlclxuICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zdGVwLXByZXYoXG4gICAgICAgICAgICBAY2xpY2s9XCJzdGVwWWVhcigtMSlcIlxuICAgICAgICAgIClcbiAgICAgICAgICBzcGFuXG4gICAgICAgICAgICBhLmRpdG8tY2FsZW5kYXItc2VsZWN0LXllYXIoXG4gICAgICAgICAgICAgIEBjbGljaz1cInNldE1vZGUoJ3llYXInKVwiXG4gICAgICAgICAgICApIHt7IGRhdGVUb1N0cmluZyhjdXJyZW50VmFsdWUsIHsgeWVhcjogMSB9KSB9fVxuICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zdGVwLW5leHQoXG4gICAgICAgICAgICBAY2xpY2s9XCJzdGVwWWVhcigxKVwiXG4gICAgICAgICAgKVxuICAgICAgICAuZGl0by1jYWxlbmRhci1ib2R5XG4gICAgICAgICAgLmRpdG8tY2FsZW5kYXItbW9udGhzXG4gICAgICAgICAgICBzcGFuKFxuICAgICAgICAgICAgICB2LWZvcj1cIihtb250aCwgaW5kZXgpIGluIG1vbnRoTmFtZXNcIlxuICAgICAgICAgICAgICA6Y2xhc3M9XCJnZXRNb250aENsYXNzKGluZGV4KVwiXG4gICAgICAgICAgICAgIEBjbGljaz1cInNlbGVjdE1vbnRoKGluZGV4KVwiXG4gICAgICAgICAgICApIHt7IG1vbnRoLnNob3J0IH19XG4gICAgICB0ZW1wbGF0ZShcbiAgICAgICAgdi1lbHNlLWlmPVwiY3VycmVudE1vZGUgPT09ICd5ZWFyJ1wiXG4gICAgICApXG4gICAgICAgIC5kaXRvLWNhbGVuZGFyLWhlYWRlclxuICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zdGVwLXByZXYoXG4gICAgICAgICAgICBAY2xpY2s9XCJzdGVwRGVjYWRlKC0xKVwiXG4gICAgICAgICAgKVxuICAgICAgICAgIHNwYW4ge3sgZGVjYWRlVG9TdHJpbmcoY3VycmVudFZhbHVlKSB9fVxuICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zdGVwLW5leHQoXG4gICAgICAgICAgICBAY2xpY2s9XCJzdGVwRGVjYWRlKDEpXCJcbiAgICAgICAgICApXG4gICAgICAgIC5kaXRvLWNhbGVuZGFyLWJvZHlcbiAgICAgICAgICAuZGl0by1jYWxlbmRhci15ZWFyc1xuICAgICAgICAgICAgc3BhbihcbiAgICAgICAgICAgICAgdi1mb3I9XCJ5ZWFyIGluIHllYXJSYW5nZVwiXG4gICAgICAgICAgICAgIDpjbGFzcz1cImdldFllYXJDbGFzcyh5ZWFyKVwiXG4gICAgICAgICAgICAgIEBjbGljaz1cInNlbGVjdFllYXIoeWVhcilcIlxuICAgICAgICAgICAgKSB7eyB5ZWFyIH19XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IHsgY29weURhdGUgfSBmcm9tICcuLi91dGlscy9kYXRlLmpzJ1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGVtaXRzOiBbJ3VwZGF0ZTptb2RlbFZhbHVlJ10sXG5cbiAgcHJvcHM6IHtcbiAgICBtb2RlbFZhbHVlOiB7IHR5cGU6IERhdGUsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBsb2NhbGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnZW4tVVMnIH0sXG4gICAgZGlzYWJsZWREYXRlOiB7IHR5cGU6IEZ1bmN0aW9uLCBkZWZhdWx0OiAoKSA9PiBmYWxzZSB9LFxuICAgIG1vZGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnZGF5JyB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICBjb25zdCB7IHdlZWtkYXlOYW1lcywgbW9udGhOYW1lcyB9ID0gZ2V0TG9jYWxlTmFtZXModGhpcy5sb2NhbGUpXG4gICAgcmV0dXJuIHtcbiAgICAgIHdlZWtkYXlOYW1lcyxcbiAgICAgIG1vbnRoTmFtZXMsXG4gICAgICBkYXRlUmFuZ2U6IFtdLFxuICAgICAgeWVhclJhbmdlOiBbXSxcbiAgICAgIGN1cnJlbnRWYWx1ZTogKFxuICAgICAgICB0aGlzLm1vZGVsVmFsdWUgfHxcbiAgICAgICAgLy8gSWYgbm8gdmFsdWUgaXMgcHJvdmlkZWQsIHVzZSBjdXJyZW50IGRhdGUgYnV0IGNsZWFyIHRpbWUgZmllbGRzOlxuICAgICAgICBjb3B5RGF0ZShuZXcgRGF0ZSgpLCB7IGhvdXI6IDAsIG1pbnV0ZTogMCwgc2Vjb25kOiAwLCBtaWxsaXNlY29uZDogMCB9KVxuICAgICAgKSxcbiAgICAgIGN1cnJlbnRNb2RlOiB0aGlzLm1vZGVcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBtb2RlbFZhbHVlKHRvLCBmcm9tKSB7XG4gICAgICBpZiAoK3RvICE9PSArZnJvbSkge1xuICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IHRvIHx8IG5ldyBEYXRlKClcbiAgICAgICAgdGhpcy51cGRhdGVEYXRlUmFuZ2UoKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBjdXJyZW50VmFsdWUodG8sIGZyb20pIHtcbiAgICAgIGlmICgrdG8gIT09ICtmcm9tKSB7XG4gICAgICAgIHRoaXMudXBkYXRlRGF0ZVJhbmdlKClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZGlzYWJsZWREYXRlOiAndXBkYXRlRGF0ZVJhbmdlJyxcblxuICAgIG1vZGUobW9kZSkge1xuICAgICAgdGhpcy5jdXJyZW50TW9kZSA9IG1vZGVcbiAgICB9XG4gIH0sXG5cbiAgbW91bnRlZCgpIHtcbiAgICB0aGlzLnVwZGF0ZURhdGVSYW5nZSgpXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGdldE1vbnRoQ2xhc3MobW9udGgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgICdkaXRvLWNhbGVuZGFyLWl0ZW0tYWN0aXZlJzogKFxuICAgICAgICAgIHRoaXMubW9kZWxWYWx1ZSAmJlxuICAgICAgICAgIG1vbnRoID09PSB0aGlzLm1vZGVsVmFsdWUuZ2V0TW9udGgoKSAmJlxuICAgICAgICAgIHRoaXMuY3VycmVudFZhbHVlLmdldEZ1bGxZZWFyKCkgPT09IHRoaXMubW9kZWxWYWx1ZS5nZXRGdWxsWWVhcigpXG4gICAgICAgICksXG4gICAgICAgICdkaXRvLWNhbGVuZGFyLWl0ZW0tY3VycmVudCc6IG1vbnRoID09PSB0aGlzLmN1cnJlbnRWYWx1ZS5nZXRNb250aCgpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGdldFllYXJDbGFzcyh5ZWFyKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAnZGl0by1jYWxlbmRhci1pdGVtLWFjdGl2ZSc6IChcbiAgICAgICAgICB0aGlzLm1vZGVsVmFsdWUgJiYgeWVhciA9PT0gdGhpcy5tb2RlbFZhbHVlLmdldEZ1bGxZZWFyKClcbiAgICAgICAgKSxcbiAgICAgICAgJ2RpdG8tY2FsZW5kYXItaXRlbS1jdXJyZW50JzogeWVhciA9PT0gdGhpcy5jdXJyZW50VmFsdWUuZ2V0RnVsbFllYXIoKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzZXREYXRlKG92ZXJyaWRlcykge1xuICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSBjb3B5RGF0ZSh0aGlzLmN1cnJlbnRWYWx1ZSwgb3ZlcnJpZGVzKVxuICAgIH0sXG5cbiAgICBzdGVwRGVjYWRlKHN0ZXApIHtcbiAgICAgIHRoaXMuc2V0RGF0ZSh7XG4gICAgICAgIHllYXI6IHRoaXMuY3VycmVudFZhbHVlLmdldEZ1bGxZZWFyKCkgKyBzdGVwICogMTBcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIHNldE1vZGUobW9kZSkge1xuICAgICAgdGhpcy5jdXJyZW50TW9kZSA9IG1vZGVcbiAgICB9LFxuXG4gICAgc3RlcE1vbnRoKHN0ZXApIHtcbiAgICAgIGNvbnN0IHsgY3VycmVudFZhbHVlIH0gPSB0aGlzXG4gICAgICBjb25zdCB7IHllYXIsIG1vbnRoIH0gPSB0aGlzLmdldFllYXJNb250aChcbiAgICAgICAgY3VycmVudFZhbHVlLmdldEZ1bGxZZWFyKCksXG4gICAgICAgIGN1cnJlbnRWYWx1ZS5nZXRNb250aCgpICsgc3RlcFxuICAgICAgKVxuICAgICAgdGhpcy5zZXREYXRlKHtcbiAgICAgICAgbW9udGgsXG4gICAgICAgIGRheTogTWF0aC5taW4oXG4gICAgICAgICAgdGhpcy5nZXREYXlzSW5Nb250aCh5ZWFyLCBtb250aCksXG4gICAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUuZ2V0RGF0ZSgpXG4gICAgICAgIClcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIHN0ZXBZZWFyKHN0ZXApIHtcbiAgICAgIHRoaXMuc2V0RGF0ZSh7XG4gICAgICAgIHllYXI6IHRoaXMuY3VycmVudFZhbHVlLmdldEZ1bGxZZWFyKCkgKyBzdGVwXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBzZWxlY3REYXRlKGRhdGUsIHN0YXRlLCBjb3B5ID0gZmFsc2UpIHtcbiAgICAgIGlmIChzdGF0ZSAhPT0gJ2Rpc2FibGVkJykge1xuICAgICAgICBpZiAoY29weSkge1xuICAgICAgICAgIHRoaXMuc2V0RGF0ZSh7XG4gICAgICAgICAgICB5ZWFyOiBkYXRlLmdldEZ1bGxZZWFyKCksXG4gICAgICAgICAgICBtb250aDogZGF0ZS5nZXRNb250aCgpLFxuICAgICAgICAgICAgZGF5OiBkYXRlLmdldERhdGUoKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSBkYXRlXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnLCB0aGlzLmN1cnJlbnRWYWx1ZSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc2VsZWN0TW9udGgobW9udGgpIHtcbiAgICAgIHRoaXMuc2V0TW9kZSgnZGF5JylcbiAgICAgIC8vIFNldCBkYXkgdG8gMSB0byBhdm9pZCBzZWxlY3RpbmcgYSBkYXRlIHRoYXQgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGVcbiAgICAgIC8vIG5ldyBtb250aCwgZS5nLiBGZWIgMzEgLT4gTWFyIDMuXG4gICAgICB0aGlzLnNldERhdGUoeyBtb250aCwgZGF5OiAxIH0pXG4gICAgfSxcblxuICAgIHNlbGVjdFllYXIoeWVhcikge1xuICAgICAgdGhpcy5zZXRNb2RlKCdtb250aCcpXG4gICAgICB0aGlzLnNldERhdGUoeyB5ZWFyIH0pXG4gICAgfSxcblxuICAgIGdldFllYXJNb250aCh5ZWFyLCBtb250aCkge1xuICAgICAgaWYgKG1vbnRoID4gMTEpIHtcbiAgICAgICAgeWVhcisrXG4gICAgICAgIG1vbnRoID0gMFxuICAgICAgfSBlbHNlIGlmIChtb250aCA8IDApIHtcbiAgICAgICAgeWVhci0tXG4gICAgICAgIG1vbnRoID0gMTFcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IHllYXIsIG1vbnRoIH1cbiAgICB9LFxuXG4gICAgZGF0ZVRvU3RyaW5nKGRhdGUsIHsgeWVhciwgbW9udGgsIGRheSB9KSB7XG4gICAgICByZXR1cm4gZGF0ZS50b0xvY2FsZVN0cmluZyh0aGlzLmxvY2FsZSwge1xuICAgICAgICB5ZWFyOiB5ZWFyICYmICdudW1lcmljJyxcbiAgICAgICAgbW9udGg6IG1vbnRoICYmICdsb25nJyxcbiAgICAgICAgZGF5OiBkYXkgJiYgJ251bWVyaWMnXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBkZWNhZGVUb1N0cmluZyhkYXRlKSB7XG4gICAgICBjb25zdCB5ZWFyID0gdGhpcy5nZXRGaXJzdFllYXJPZkRlY2FkZShkYXRlLmdldEZ1bGxZZWFyKCkpXG4gICAgICByZXR1cm4gYCR7eWVhcn0g4oCTICR7eWVhciArIDl9YFxuICAgIH0sXG5cbiAgICBnZXREYXlzSW5Nb250aCh5ZWFyLCBtb250aCkge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlKHllYXIsIG1vbnRoICsgMSwgMCkuZ2V0RGF0ZSgpXG4gICAgfSxcblxuICAgIGdldEZpcnN0WWVhck9mRGVjYWRlKHllYXIpIHtcbiAgICAgIGNvbnN0IHllYXJTdHIgPSB5ZWFyLnRvU3RyaW5nKClcbiAgICAgIHJldHVybiArYCR7eWVhclN0ci5zbGljZSgwLCAtMSl9MGBcbiAgICB9LFxuXG4gICAgbmF2aWdhdGUoeyBob3IsIHZlciwgZW50ZXIgfSkge1xuICAgICAgY29uc3QgeyBjdXJyZW50TW9kZSwgY3VycmVudFZhbHVlIH0gPSB0aGlzXG4gICAgICBpZiAoaG9yIHx8IHZlcikge1xuICAgICAgICBzd2l0Y2ggKGN1cnJlbnRNb2RlKSB7XG4gICAgICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgICAgIHRoaXMuc2V0RGF0ZSh7XG4gICAgICAgICAgICAgIGRheTogY3VycmVudFZhbHVlLmdldERhdGUoKSArIGhvciArIHZlciAqIDdcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgJ21vbnRoJzpcbiAgICAgICAgICAgIHRoaXMuc2V0RGF0ZSh7XG4gICAgICAgICAgICAgIG1vbnRoOiBjdXJyZW50VmFsdWUuZ2V0TW9udGgoKSArIGhvciArIHZlciAqIDZcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICAgICAgdGhpcy5zZXREYXRlKHtcbiAgICAgICAgICAgICAgeWVhcjogY3VycmVudFZhbHVlLmdldEZ1bGxZZWFyKCkgKyBob3IgKyB2ZXIgKiA1XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfSBlbHNlIGlmIChlbnRlcikge1xuICAgICAgICBzd2l0Y2ggKGN1cnJlbnRNb2RlKSB7XG4gICAgICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0RGF0ZShjdXJyZW50VmFsdWUpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgJ21vbnRoJzpcbiAgICAgICAgICAgIHRoaXMuc2V0TW9kZSgnZGF5JylcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSAneWVhcic6XG4gICAgICAgICAgICB0aGlzLnNldE1vZGUoJ21vbnRoJylcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgdXBkYXRlRGF0ZVJhbmdlKCkge1xuICAgICAgdGhpcy5kYXRlUmFuZ2UgPSBbXVxuICAgICAgdGhpcy55ZWFyUmFuZ2UgPSBbXVxuXG4gICAgICBjb25zdCB7IGN1cnJlbnRWYWx1ZSB9ID0gdGhpc1xuICAgICAgY29uc3QgeWVhciA9IGN1cnJlbnRWYWx1ZS5nZXRGdWxsWWVhcigpXG4gICAgICBjb25zdCBtb250aCA9IGN1cnJlbnRWYWx1ZS5nZXRNb250aCgpXG4gICAgICBjb25zdCBzdGFydFllYXIgPSB0aGlzLmdldEZpcnN0WWVhck9mRGVjYWRlKHllYXIpXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEwOyBpKyspIHtcbiAgICAgICAgdGhpcy55ZWFyUmFuZ2UucHVzaChzdGFydFllYXIgKyBpKVxuICAgICAgfVxuICAgICAgY29uc3QgY3Vyck1vbnRoRmlyc3REYXkgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgMSlcbiAgICAgIGxldCBmaXJzdERheVdlZWsgPSBjdXJyTW9udGhGaXJzdERheS5nZXREYXkoKSArIDFcbiAgICAgIGlmIChmaXJzdERheVdlZWsgPT09IDApIHtcbiAgICAgICAgZmlyc3REYXlXZWVrID0gN1xuICAgICAgfVxuICAgICAgY29uc3QgbnVtRGF5cyA9IHRoaXMuZ2V0RGF5c0luTW9udGgoeWVhciwgbW9udGgpXG4gICAgICBpZiAoZmlyc3REYXlXZWVrID4gMSkge1xuICAgICAgICBjb25zdCBwcmV2TW9udGggPSB0aGlzLmdldFllYXJNb250aCh5ZWFyLCBtb250aCAtIDEpXG4gICAgICAgIGNvbnN0IHByZXZNb250aE51bURheXMgPSB0aGlzLmdldERheXNJbk1vbnRoKFxuICAgICAgICAgIHByZXZNb250aC55ZWFyLFxuICAgICAgICAgIHByZXZNb250aC5tb250aFxuICAgICAgICApXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgZmlyc3REYXlXZWVrOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBkYXkgPSBwcmV2TW9udGhOdW1EYXlzIC0gZmlyc3REYXlXZWVrICsgaSArIDFcbiAgICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUocHJldk1vbnRoLnllYXIsIHByZXZNb250aC5tb250aCwgZGF5KVxuICAgICAgICAgIHRoaXMuZGF0ZVJhbmdlLnB1c2goe1xuICAgICAgICAgICAgdGV4dDogZGF5LFxuICAgICAgICAgICAgZGF0ZSxcbiAgICAgICAgICAgIHN0YXRlOiB0aGlzLmRpc2FibGVkRGF0ZShkYXRlKSA/ICdkaXNhYmxlZCcgOiAnZ3JheSdcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKVxuICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gbnVtRGF5czsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgaSlcbiAgICAgICAgY29uc3QgaXNEYXkgPSBkYXRlID0+IChcbiAgICAgICAgICBkYXRlICYmXG4gICAgICAgICAgZGF0ZS5nZXREYXRlKCkgPT09IGkgJiZcbiAgICAgICAgICBkYXRlLmdldEZ1bGxZZWFyKCkgPT09IHllYXIgJiZcbiAgICAgICAgICBkYXRlLmdldE1vbnRoKCkgPT09IG1vbnRoXG4gICAgICAgIClcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBpc0RheSh0aGlzLm1vZGVsVmFsdWUpXG4gICAgICAgICAgPyAnYWN0aXZlJ1xuICAgICAgICAgIDogaXNEYXkodG9kYXkpXG4gICAgICAgICAgICA/ICd0b2RheSdcbiAgICAgICAgICAgIDogdGhpcy5kaXNhYmxlZERhdGUoZGF0ZSlcbiAgICAgICAgICAgICAgPyAnZGlzYWJsZWQnXG4gICAgICAgICAgICAgIDogaXNEYXkoY3VycmVudFZhbHVlKVxuICAgICAgICAgICAgICAgID8gJ2N1cnJlbnQnXG4gICAgICAgICAgICAgICAgOiBudWxsXG4gICAgICAgIHRoaXMuZGF0ZVJhbmdlLnB1c2goe1xuICAgICAgICAgIHRleHQ6IGksXG4gICAgICAgICAgZGF0ZSxcbiAgICAgICAgICBzdGF0ZVxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBjb25zdCBuZXh0TW9udGhOZWVkID0gNDIgLSB0aGlzLmRhdGVSYW5nZS5sZW5ndGhcbiAgICAgIGlmIChuZXh0TW9udGhOZWVkID4gMCkge1xuICAgICAgICBjb25zdCBuZXh0TW9udGggPSB0aGlzLmdldFllYXJNb250aCh5ZWFyLCBtb250aCArIDEpXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IG5leHRNb250aE5lZWQ7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShuZXh0TW9udGgueWVhciwgbmV4dE1vbnRoLm1vbnRoLCBpKVxuICAgICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5kaXNhYmxlZERhdGUoZGF0ZSkgPyAnZGlzYWJsZWQnIDogJ2dyYXknXG4gICAgICAgICAgdGhpcy5kYXRlUmFuZ2UucHVzaCh7XG4gICAgICAgICAgICB0ZXh0OiBpLFxuICAgICAgICAgICAgZGF0ZSxcbiAgICAgICAgICAgIHN0YXRlXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5jb25zdCBsb2NhbGVOYW1lcyA9IHt9XG5cbi8vIENhbGxpbmcgYHRvTG9jYWxlU3RyaW5nKClgIHRoaXMgbXVjaCBhcHBlYXJzIHRvIGJlIGV4cGVuc2l2ZSwgc28gY2FjaGUgaXQ6XG5mdW5jdGlvbiBnZXRMb2NhbGVOYW1lcyhsb2NhbGUpIHtcbiAgbGV0IG5hbWVzID0gbG9jYWxlTmFtZXNbbG9jYWxlXVxuICBpZiAoIW5hbWVzKSB7XG4gICAgY29uc3Qgd2Vla2RheU5hbWVzID0gW11cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDc7IGkrKykge1xuICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKDAsIDAsIGkpXG4gICAgICB3ZWVrZGF5TmFtZXMucHVzaCh7XG4gICAgICAgIGxvbmc6IGRhdGUudG9Mb2NhbGVTdHJpbmcobG9jYWxlLCB7IHdlZWtkYXk6ICdsb25nJyB9KSxcbiAgICAgICAgc2hvcnQ6IGRhdGUudG9Mb2NhbGVTdHJpbmcobG9jYWxlLCB7IHdlZWtkYXk6ICdzaG9ydCcgfSlcbiAgICAgIH0pXG4gICAgfVxuICAgIGNvbnN0IG1vbnRoTmFtZXMgPSBbXVxuICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IDEyOyBpKyspIHtcbiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgwLCBpLCAwKVxuICAgICAgbW9udGhOYW1lcy5wdXNoKHtcbiAgICAgICAgbG9uZzogZGF0ZS50b0xvY2FsZVN0cmluZyhsb2NhbGUsIHsgbW9udGg6ICdsb25nJyB9KSxcbiAgICAgICAgc2hvcnQ6IGRhdGUudG9Mb2NhbGVTdHJpbmcobG9jYWxlLCB7IG1vbnRoOiAnc2hvcnQnIH0pXG4gICAgICB9KVxuICAgIH1cbiAgICBuYW1lcyA9IGxvY2FsZU5hbWVzW2xvY2FsZV0gPSB7XG4gICAgICB3ZWVrZGF5TmFtZXMsXG4gICAgICBtb250aE5hbWVzXG4gICAgfVxuICB9XG4gIHJldHVybiBuYW1lc1xufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tY2FsZW5kYXIge1xuICBtaW4td2lkdGg6IDI0MHB4O1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xufVxuXG4uZGl0by1jYWxlbmRhci1wb3B1cCB7XG4gIGJvcmRlcjogJGJvcmRlci1zdHlsZTtcbiAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG4gIGJhY2tncm91bmQ6ICRjb2xvci13aGl0ZTtcbiAgYm94LXNoYWRvdzogJHNoYWRvdy13aW5kb3c7XG4gIHotaW5kZXg6IDEwMDA7XG59XG5cbi5kaXRvLWNhbGVuZGFyLWJvZHkge1xuICBwYWRkaW5nOiAwIDAuNWVtO1xuXG4gIHNwYW4ge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICB3aWR0aDogY2FsYygxMDAlIC8gNyk7XG4gICAgaGVpZ2h0OiAkaW5wdXQtaGVpZ2h0O1xuICAgIGxpbmUtaGVpZ2h0OiBjYWxjKCN7JGlucHV0LWhlaWdodH0gLSAycHgpO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG4gICAgYm9yZGVyOiAkYm9yZGVyLXdpZHRoIHNvbGlkIHRyYW5zcGFyZW50O1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgfVxuXG4gIC5kaXRvLWNhbGVuZGFyLWl0ZW0tdG9kYXkge1xuICAgIGJvcmRlcjogJGJvcmRlci13aWR0aCBzb2xpZCAkY29sb3ItYWN0aXZlO1xuICAgIGNvbG9yOiAkY29sb3ItYWN0aXZlO1xuICB9XG5cbiAgLmRpdG8tY2FsZW5kYXItaXRlbS1hY3RpdmUge1xuICAgICYsXG4gICAgJjpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kOiAkY29sb3ItYWN0aXZlO1xuICAgICAgY29sb3I6IHdoaXRlO1xuICAgIH1cbiAgfVxuXG4gIC5kaXRvLWNhbGVuZGFyLWl0ZW0tZGlzYWJsZWQge1xuICAgIGJhY2tncm91bmQ6IHdoaXRlO1xuICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgfVxuXG4gIC5kaXRvLWNhbGVuZGFyLWl0ZW0tZGlzYWJsZWQsXG4gIC5kaXRvLWNhbGVuZGFyLWl0ZW0tZ3JheSB7XG4gICAgY29sb3I6ICM5OTk5OTk7XG4gIH1cbn1cblxuLmRpdG8tY2FsZW5kYXItbW9udGhzLFxuLmRpdG8tY2FsZW5kYXIteWVhcnMge1xuICBzcGFuIHtcbiAgICB3aWR0aDogY2FsYygxMDAlIC8gNCk7XG4gICAgbWFyZ2luOiAwLjVlbSAwO1xuICB9XG59XG5cbi5kaXRvLWNhbGVuZGFyLXllYXJzIHNwYW4ge1xuICB3aWR0aDogY2FsYygxMDAlIC8gNSk7XG59XG5cbi5kaXRvLWNhbGVuZGFyIGEsXG4uZGl0by1jYWxlbmRhci1kYXRlcyBzcGFuLFxuLmRpdG8tY2FsZW5kYXItbW9udGhzIHNwYW4sXG4uZGl0by1jYWxlbmRhci15ZWFycyBzcGFuIHtcbiAgQGluY2x1ZGUgdXNlci1zZWxlY3Qobm9uZSk7XG5cbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG4uZGl0by1jYWxlbmRhci1oZWFkZXIgc3BhbiB7XG4gIGN1cnNvcjogZGVmYXVsdDtcblxuICBhIHtcbiAgICBwYWRkaW5nOiAwIDAuMmVtO1xuICB9XG59XG5cbi5kaXRvLWNhbGVuZGFyLWRhdGVzIHNwYW46aG92ZXIsXG4uZGl0by1jYWxlbmRhci1tb250aHMgc3Bhbjpob3Zlcixcbi5kaXRvLWNhbGVuZGFyLXllYXJzIHNwYW46aG92ZXIsXG4uZGl0by1jYWxlbmRhcjpub3QoOmhvdmVyKSAuZGl0by1jYWxlbmRhci1pdGVtLWN1cnJlbnQge1xuICBiYWNrZ3JvdW5kOiAkY29sb3ItaGlnaGxpZ2h0O1xufVxuXG4uZGl0by1jYWxlbmRhci13ZWVrZGF5cyBzcGFuIHtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIEBpbmNsdWRlIHVzZXItc2VsZWN0KG5vbmUpO1xufVxuXG4uZGl0by1jYWxlbmRhci1oZWFkZXIsXG4uZGl0by1jYWxlbmRhci1mb290ZXIge1xuICBAZXh0ZW5kICVpbnB1dC1oZWlnaHQ7XG5cbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG59XG5cbi5kaXRvLWNhbGVuZGFyLWZvb3RlciB7XG4gIGJvcmRlci10b3A6ICRib3JkZXItc3R5bGU7XG59XG5cbi5kaXRvLWNhbGVuZGFyLWhlYWRlciB7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICBib3JkZXItYm90dG9tOiAkYm9yZGVyLXN0eWxlO1xuICBkaXNwbGF5OiBmbGV4O1xuXG4gID4gc3BhbiB7XG4gICAgbWFyZ2luOiBhdXRvO1xuICAgIHBhZGRpbmc6IDAgMC41ZW07XG4gIH1cblxuICBhIHtcbiAgICBmb250LXdlaWdodDogYm9sZDtcblxuICAgICY6aG92ZXIge1xuICAgICAgY29sb3I6ICRjb2xvci1hY3RpdmU7XG4gICAgfVxuICB9XG59XG5cbi5kaXRvLWNhbGVuZGFyLXN0ZXAtcHJldixcbi5kaXRvLWNhbGVuZGFyLXN0ZXAtbmV4dCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgd2lkdGg6IDUlO1xuICBtaW4td2lkdGg6IDJlbTtcbiAgbWF4LXdpZHRoOiAzZW07XG5cbiAgJjo6YWZ0ZXIge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBsZWZ0OiAwO1xuICAgIHJpZ2h0OiAwO1xuICAgIGZvbnQtc2l6ZTogMS4yNWVtO1xuICB9XG59XG5cbi5kaXRvLWNhbGVuZGFyLXN0ZXAtcHJldiB7XG4gICY6OmFmdGVyIHtcbiAgICBjb250ZW50OiAn4oC5JztcbiAgfVxuXG4gICYuZGl0by1jYWxlbmRhci1zdGVwLXllYXI6OmFmdGVyIHtcbiAgICBjb250ZW50OiAnwqsnO1xuICB9XG59XG5cbi5kaXRvLWNhbGVuZGFyLXN0ZXAtbmV4dCB7XG4gICY6OmFmdGVyIHtcbiAgICBjb250ZW50OiAn4oC6JztcbiAgfVxuXG4gICYuZGl0by1jYWxlbmRhci1zdGVwLXllYXI6OmFmdGVyIHtcbiAgICBjb250ZW50OiAnwrsnO1xuICB9XG59XG5cbi5kaXRvLWNhbGVuZGFyLXNlbGVjdC10b2RheSB7XG4gICY6OmFmdGVyIHtcbiAgICBjb250ZW50OiAnTm93JztcbiAgfVxufVxuPC9zdHlsZT5cbiIsImV4cG9ydCBmdW5jdGlvbiBhZGRFdmVudHModGFyZ2V0LCBldmVudHMpIHtcbiAgZm9yIChjb25zdCB0eXBlIGluIGV2ZW50cykge1xuICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGV2ZW50c1t0eXBlXSwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIHtcbiAgICByZW1vdmUoKSB7XG4gICAgICBmb3IgKGNvbnN0IHR5cGUgaW4gZXZlbnRzKSB7XG4gICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGV2ZW50c1t0eXBlXSwgZmFsc2UpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRLZXkoZXZlbnQpIHtcbiAgcmV0dXJuIHtcbiAgICAzNzogJ2xlZnQnLFxuICAgIDM4OiAndXAnLFxuICAgIDM5OiAncmlnaHQnLFxuICAgIDQwOiAnZG93bicsXG4gICAgMTM6ICdlbnRlcidcbiAgfVtldmVudC5rZXlDb2RlXVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0S2V5TmF2aWdhdGlvbihldmVudCkge1xuICBjb25zdCBrZXkgPSBnZXRLZXkoZXZlbnQpXG4gIHJldHVybiB7XG4gICAgaG9yOiB7IGxlZnQ6IC0xLCByaWdodDogMSB9W2tleV0gfHwgMCxcbiAgICB2ZXI6IHsgdXA6IC0xLCBkb3duOiAxIH1ba2V5XSB8fCAwLFxuICAgIGVudGVyOiBrZXkgPT09ICdlbnRlcidcbiAgfVxufVxuIiwiPCEtLSBEZXJpdmVkIGZyb20gQVRVSSwgYW5kIGZ1cnRoZXIgZXh0ZW5kZWQ6IGh0dHBzOi8vYWxpcWluLmdpdGh1Yi5pby9hdHVpLyAtLT5cbjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by10cmlnZ2VyLWNvbnRhaW5lclxuICAuZGl0by10cmlnZ2VyKFxuICAgIHYtaWY9XCJhbHdheXNTaG93XCJcbiAgICByZWY9XCJ0cmlnZ2VyXCJcbiAgICA6Y2xhc3M9XCJ0cmlnZ2VyQ2xhc3NcIlxuICApXG4gICAgc2xvdChuYW1lPVwidHJpZ2dlclwiKVxuICAuZGl0by10cmlnZ2VyKFxuICAgIHYtZWxzZS1pZj1cInRyaWdnZXIgPT09ICdjbGljaydcIlxuICAgIHJlZj1cInRyaWdnZXJcIlxuICAgIDpjbGFzcz1cInRyaWdnZXJDbGFzc1wiXG4gICAgQGNsaWNrPVwib25DbGlja1wiXG4gIClcbiAgICBzbG90KG5hbWU9XCJ0cmlnZ2VyXCIpXG4gIC5kaXRvLXRyaWdnZXIoXG4gICAgdi1lbHNlLWlmPVwidHJpZ2dlciA9PT0gJ2hvdmVyJ1wiXG4gICAgcmVmPVwidHJpZ2dlclwiXG4gICAgOmNsYXNzPVwidHJpZ2dlckNsYXNzXCJcbiAgICBAbW91c2VlbnRlcj1cIm9uSG92ZXIodHJ1ZSlcIlxuICAgIEBtb3VzZWxlYXZlPVwib25Ib3ZlcihmYWxzZSlcIlxuICApXG4gICAgc2xvdChuYW1lPVwidHJpZ2dlclwiKVxuICAuZGl0by10cmlnZ2VyKFxuICAgIHYtZWxzZS1pZj1cInRyaWdnZXIgPT09ICdmb2N1cycgfHwgdHJpZ2dlciA9PT0gJ2Fsd2F5cydcIlxuICAgIHJlZj1cInRyaWdnZXJcIlxuICAgIDpjbGFzcz1cInRyaWdnZXJDbGFzc1wiXG4gIClcbiAgICBzbG90KG5hbWU9XCJ0cmlnZ2VyXCIpXG4gIFRyYW5zaXRpb24oOm5hbWU9XCJ0cmFuc2l0aW9uXCIpXG4gICAgLmRpdG8tcG9wdXAoXG4gICAgICB2LWlmPVwidHJpZ2dlciA9PT0gJ2hvdmVyJ1wiXG4gICAgICB2LXNob3c9XCJzaG93UG9wdXBcIlxuICAgICAgcmVmPVwicG9wdXBcIlxuICAgICAgOmNsYXNzPVwicG9wdXBDbGFzc1wiXG4gICAgICA6c3R5bGU9XCJwb3B1cFN0eWxlXCJcbiAgICAgIEBtb3VzZWVudGVyPVwib25Ib3Zlcih0cnVlKVwiXG4gICAgICBAbW91c2VsZWF2ZT1cIm9uSG92ZXIoZmFsc2UpXCJcbiAgICApXG4gICAgICBzbG90KFxuICAgICAgICB2LWlmPVwic2hvd1BvcHVwXCJcbiAgICAgICAgbmFtZT1cInBvcHVwXCJcbiAgICAgIClcbiAgICAuZGl0by1wb3B1cChcbiAgICAgIHYtZWxzZVxuICAgICAgdi1zaG93PVwic2hvd1BvcHVwXCJcbiAgICAgIHJlZj1cInBvcHVwXCJcbiAgICAgIDpjbGFzcz1cInBvcHVwQ2xhc3NcIlxuICAgICAgOnN0eWxlPVwicG9wdXBTdHlsZVwiXG4gICAgKVxuICAgICAgc2xvdChcbiAgICAgICAgdi1pZj1cInNob3dQb3B1cFwiXG4gICAgICAgIG5hbWU9XCJwb3B1cFwiXG4gICAgICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IHsgaXNTdHJpbmcsIGh5cGhlbmF0ZSB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgeyBhZGRFdmVudHMgfSBmcm9tICcuLi91dGlscy9ldmVudC5qcydcblxuZXhwb3J0IGRlZmF1bHQge1xuICBlbWl0czogWyd1cGRhdGU6c2hvdyddLFxuXG4gIHByb3BzOiB7XG4gICAgdHJpZ2dlcjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdjbGljaycgfSxcbiAgICB0cmFuc2l0aW9uOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ3NsaWRlJyB9LFxuICAgIHBsYWNlbWVudDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdib3R0b20nIH0sXG4gICAgc2hvdzogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgdGFyZ2V0OiB7IHR5cGU6IFtTdHJpbmcsIEhUTUxFbGVtZW50XSwgZGVmYXVsdDogbnVsbCB9LFxuICAgIGN1c3RvbUNsYXNzOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIHpJbmRleDogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IDAgfSxcbiAgICBrZWVwSW5WaWV3OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWUgfSxcbiAgICBoaWRlV2hlbkNsaWNrT3V0c2lkZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgYWx3YXlzU2hvdzogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGNvdmVyOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgaGlkZURlbGF5OiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMCB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2hvd1BvcHVwOiB0aGlzLnNob3csXG4gICAgICBwb3B1cFBsYWNlbWVudDogdGhpcy5wbGFjZW1lbnRcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICB0cmlnZ2VyQ2xhc3MoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAnZGl0by10cmlnZ2VyLWRpc2FibGVkJzogdGhpcy5kaXNhYmxlZFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBwb3B1cENsYXNzKCkge1xuICAgICAgY29uc3QgY2xhc3NlcyA9IHtcbiAgICAgICAgW2BkaXRvLXBvcHVwLSR7aHlwaGVuYXRlKHRoaXMucGxhY2VtZW50KX1gXTogdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY3VzdG9tQ2xhc3MpIHtcbiAgICAgICAgY2xhc3Nlc1t0aGlzLmN1c3RvbUNsYXNzXSA9IHRydWVcbiAgICAgIH1cbiAgICAgIHJldHVybiBjbGFzc2VzXG4gICAgfSxcblxuICAgIHBvcHVwU3R5bGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy56SW5kZXggPyBgei1pbmRleDogJHt0aGlzLnpJbmRleH1gIDogJydcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBzaG93KHNob3cpIHtcbiAgICAgIHRoaXMuc2hvd1BvcHVwID0gc2hvdyB8fCB0aGlzLmFsd2F5c1Nob3dcbiAgICB9LFxuXG4gICAgc2hvd1BvcHVwKHRvLCBmcm9tKSB7XG4gICAgICBpZiAodG8gXiBmcm9tKSB7XG4gICAgICAgIHRoaXMuJGVtaXQoJ3VwZGF0ZTpzaG93JywgdG8pXG4gICAgICAgIGlmICh0bykge1xuICAgICAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHRoaXMudXBkYXRlUG9zaXRpb24oKSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtb3VudGVkKCkge1xuICAgIGNvbnN0IHsgdHJpZ2dlciwgcG9wdXAgfSA9IHRoaXMuJHJlZnNcbiAgICBpZiAodGhpcy50cmlnZ2VyID09PSAnZm9jdXMnKSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSB0cmlnZ2VyLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0LCB0ZXh0YXJlYScpXG4gICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgIHRoaXMuZm9jdXNFdmVudHMgPSBhZGRFdmVudHModGFyZ2V0LCB7XG4gICAgICAgICAgZm9jdXM6ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2hvd1BvcHVwID0gdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgYmx1cjogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zaG93UG9wdXAgPSBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5oaWRlV2hlbkNsaWNrT3V0c2lkZSAmJiAhdGhpcy5hbHdheXNTaG93KSB7XG4gICAgICAvLyBVc2UgJ21vdXNldXAnIGluc3RlYWQgb2YgJ2NsaWNrJywgc2luY2UgY2xpY2sgYXBwZWFycyB0byBoYXBwZW4gYWZ0ZXJcbiAgICAgIC8vIHRoZSBET00gaW5zaWRlIG9mIHBvcHVwcyBjb3VsZCBjaGFuZ2UgaW4gYSB3YXkgc28gdGhhdCB0aGUgY2hlY2tcbiAgICAgIC8vIGBwb3B1cC5jb250YWlucyhldmVudC50YXJnZXQpYCB3b3VsZCBmYWlsOlxuICAgICAgdGhpcy5jbG9zZUV2ZW50cyA9IGFkZEV2ZW50cyh3aW5kb3csIHtcbiAgICAgICAgbW91c2V1cDogZXZlbnQgPT4ge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuc2hvd1BvcHVwICYmXG4gICAgICAgICAgICAhcG9wdXAuY29udGFpbnMoZXZlbnQudGFyZ2V0KSAmJlxuICAgICAgICAgICAgIXRyaWdnZXIuY29udGFpbnMoZXZlbnQudGFyZ2V0KVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5zaG93UG9wdXAgPSBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBibHVyOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zaG93UG9wdXAgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmICh0aGlzLmFsd2F5c1Nob3cpIHtcbiAgICAgIHRoaXMuc2hvd1BvcHVwID0gdHJ1ZVxuICAgIH1cbiAgfSxcblxuICBjcmVhdGVkKCkge1xuICAgIHRoaXMuc2hvd1BvcHVwID0gdGhpcy5zaG93XG4gIH0sXG5cbiAgdW5tb3VudGVkKCkge1xuICAgIHRoaXMuZm9jdXNFdmVudHM/LnJlbW92ZSgpXG4gICAgdGhpcy5jbG9zZUV2ZW50cz8ucmVtb3ZlKClcbiAgICB0aGlzLm1vdXNlTGVhdmVUaW1lciA9IG51bGxcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgdXBkYXRlUG9zaXRpb24oKSB7XG4gICAgICBjb25zdCB7IHRyaWdnZXIsIHBvcHVwIH0gPSB0aGlzLiRyZWZzXG4gICAgICBpZiAodGhpcy5zaG93ICYmIHBvcHVwLm9mZnNldFdpZHRoID09PSAwKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy51cGRhdGVQb3NpdGlvbigpLCAwKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgdGFyZ2V0ID0gaXNTdHJpbmcodGhpcy50YXJnZXQpXG4gICAgICAgID8gdGhpcy4kcmVmc1t0aGlzLnRhcmdldF1cbiAgICAgICAgOiB0aGlzLnRhcmdldFxuICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICAvLyBBY3R1YWxseSByZXNpemUgdGhlIHBvcHVwJ3MgZmlyc3QgY2hpbGQsIHNvIHRoZXkgY2FuIHNldCBzaXplIGxpbWl0cy5cbiAgICAgICAgY29uc3QgZWwgPSB0YXJnZXQgPT09IHBvcHVwID8gdHJpZ2dlciA6IHBvcHVwLmZpcnN0RWxlbWVudENoaWxkXG4gICAgICAgIGlmIChlbCkge1xuICAgICAgICAgIGVsLnN0eWxlLndpZHRoID0gZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXQpLndpZHRoXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgYm91bmRzID0gKHRhcmdldCB8fCB0cmlnZ2VyKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgY29uc3QgdHJpZ2dlckxlZnQgPSBib3VuZHMubGVmdCArIHdpbmRvdy5zY3JvbGxYXG4gICAgICBjb25zdCB0cmlnZ2VyVG9wID0gYm91bmRzLnRvcCArIHdpbmRvdy5zY3JvbGxZXG4gICAgICBjb25zdCB0cmlnZ2VyV2lkdGggPSBib3VuZHMud2lkdGhcbiAgICAgIGNvbnN0IHRyaWdnZXJIZWlnaHQgPSBib3VuZHMuaGVpZ2h0XG4gICAgICBjb25zdCBwb3B1cFdpZHRoID0gcG9wdXAub2Zmc2V0V2lkdGhcbiAgICAgIGNvbnN0IHBvcHVwSGVpZ2h0ID0gcG9wdXAub2Zmc2V0SGVpZ2h0XG5cbiAgICAgIGxldCBbcGFydDEsIHBhcnQyXSA9IHRoaXMucG9wdXBQbGFjZW1lbnQuc3BsaXQoJy0nKSB8fCBbXVxuICAgICAgaWYgKHRoaXMua2VlcEluVmlldykge1xuICAgICAgICBjb25zdCB3aW5XaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoXG4gICAgICAgIGNvbnN0IHdpbkhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodFxuICAgICAgICBpZiAocGFydDEgPT09ICd0b3AnKSB7XG4gICAgICAgICAgaWYgKHRyaWdnZXJUb3AgPCBwb3B1cEhlaWdodCkge1xuICAgICAgICAgICAgcGFydDEgPSAnYm90dG9tJ1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChwYXJ0MSA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgICBpZiAod2luSGVpZ2h0IC0gdHJpZ2dlclRvcCAtIHRyaWdnZXJIZWlnaHQgPCBwb3B1cEhlaWdodCkge1xuICAgICAgICAgICAgcGFydDEgPSAndG9wJ1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChwYXJ0MSA9PT0gJ2xlZnQnKSB7XG4gICAgICAgICAgaWYgKHRyaWdnZXJMZWZ0IDwgcG9wdXBXaWR0aCkge1xuICAgICAgICAgICAgcGFydDEgPSAncmlnaHQnXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHBhcnQxID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgaWYgKHdpbldpZHRoIC0gdHJpZ2dlckxlZnQgLSB0cmlnZ2VyV2lkdGggPCBwb3B1cFdpZHRoKSB7XG4gICAgICAgICAgICBwYXJ0MSA9ICdsZWZ0J1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXJ0MiA9PT0gJ3RvcCcpIHtcbiAgICAgICAgICBpZiAod2luSGVpZ2h0IC0gdHJpZ2dlclRvcCA8IHBvcHVwSGVpZ2h0KSB7XG4gICAgICAgICAgICBwYXJ0MiA9ICdib3R0b20nXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHBhcnQyID09PSAnYm90dG9tJykge1xuICAgICAgICAgIGlmICh0cmlnZ2VyVG9wICsgdHJpZ2dlckhlaWdodCA8IHBvcHVwSGVpZ2h0KSB7XG4gICAgICAgICAgICBwYXJ0MiA9ICd0b3AnXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHBhcnQyID09PSAnbGVmdCcpIHtcbiAgICAgICAgICBpZiAod2luV2lkdGggLSB0cmlnZ2VyTGVmdCA8IHBvcHVwV2lkdGgpIHtcbiAgICAgICAgICAgIHBhcnQyID0gJ3JpZ2h0J1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChwYXJ0MiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgIGlmICh0cmlnZ2VyTGVmdCArIHRyaWdnZXJXaWR0aCA8IHBvcHVwV2lkdGgpIHtcbiAgICAgICAgICAgIHBhcnQyID0gJ2xlZnQnXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxldCBsZWZ0ID0gMFxuICAgICAgbGV0IHRvcCA9IDBcbiAgICAgIHN3aXRjaCAocGFydDEpIHtcbiAgICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgICB0b3AgLT0gcG9wdXBIZWlnaHRcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdsZWZ0JzpcbiAgICAgICAgICBsZWZ0IC09IHBvcHVwV2lkdGhcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgICAgbGVmdCArPSB0cmlnZ2VyV2lkdGhcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICAgIHRvcCArPSB0cmlnZ2VySGVpZ2h0XG4gICAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAocGFydDIpIHtcbiAgICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICAgIGxlZnQgLT0gcG9wdXBXaWR0aCAtIHRyaWdnZXJXaWR0aFxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgICAgdG9wIC09IHBvcHVwSGVpZ2h0IC0gdHJpZ2dlckhlaWdodFxuICAgICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jb3Zlcikge1xuICAgICAgICBpZiAocGFydDEgPT09ICd0b3AnKSB7XG4gICAgICAgICAgdG9wICs9IHRyaWdnZXJIZWlnaHRcbiAgICAgICAgfSBlbHNlIGlmIChwYXJ0MSA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgICB0b3AgLT0gdHJpZ2dlckhlaWdodFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGFyZ2V0ICYmIHRhcmdldCAhPT0gdHJpZ2dlcikge1xuICAgICAgICBjb25zdCB0cmlnZ2VyQm91bmRzID0gdHJpZ2dlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgICBsZWZ0ICs9IHRyaWdnZXJMZWZ0IC0gdHJpZ2dlckJvdW5kcy5sZWZ0XG4gICAgICAgIHRvcCArPSB0cmlnZ2VyVG9wIC0gdHJpZ2dlckJvdW5kcy50b3BcbiAgICAgIH1cbiAgICAgIHBvcHVwLnN0eWxlLmxlZnQgPSBgJHtsZWZ0fXB4YFxuICAgICAgcG9wdXAuc3R5bGUudG9wID0gYCR7dG9wfXB4YFxuICAgIH0sXG5cbiAgICBvbkNsaWNrKCkge1xuICAgICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgIHRoaXMuc2hvd1BvcHVwID0gIXRoaXMuc2hvd1BvcHVwXG4gICAgICB9XG4gICAgfSxcblxuICAgIG9uSG92ZXIoZW50ZXIpIHtcbiAgICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5tb3VzZUxlYXZlVGltZXIpXG4gICAgICAgIGlmIChlbnRlcikge1xuICAgICAgICAgIHRoaXMuc2hvd1BvcHVwID0gdHJ1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0aGlzLmhpZGVEZWxheSkge1xuICAgICAgICAgICAgdGhpcy5tb3VzZUxlYXZlVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5zaG93UG9wdXAgPSBmYWxzZVxuICAgICAgICAgICAgfSwgdGhpcy5oaWRlRGVsYXkpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd1BvcHVwID0gZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5AaW1wb3J0ICcuLi9zdHlsZXMvdHJhbnNpdGlvbnMvaW5kZXguc2Nzcyc7XG5cbi5kaXRvLXRyaWdnZXItY29udGFpbmVyIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG4uZGl0by10cmlnZ2VyLWRpc2FibGVkIHtcbiAgY29sb3I6ICRjb2xvci1kaXNhYmxlZDtcbiAgYm9yZGVyLWNvbG9yOiAkYm9yZGVyLWNvbG9yO1xuICBjdXJzb3I6IGRlZmF1bHQ7XG5cbiAgKiB7XG4gICAgY3Vyc29yOiBkZWZhdWx0ICFpbXBvcnRhbnQ7XG4gICAgQGluY2x1ZGUgdXNlci1zZWxlY3Qobm9uZSk7XG5cbiAgICAmOmZvY3VzIHtcbiAgICAgIGJveC1zaGFkb3c6IG5vbmU7XG4gICAgfVxuICB9XG59XG5cbi5kaXRvLXBvcHVwIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIHotaW5kZXg6IDEwMDA7XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLWlucHV0XG4gIHNsb3QobmFtZT1cImJlZm9yZVwiKVxuICBpbnB1dChcbiAgICA6aWQ9XCJpZFwiXG4gICAgcmVmPVwiaW5wdXRcIlxuICAgIHYtbW9kZWw9XCJjdXJyZW50VmFsdWVcIlxuICAgIDp0eXBlPVwidHlwZVwiXG4gICAgOm5hbWU9XCJuYW1lXCJcbiAgICA6dGl0bGU9XCJ0aXRsZVwiXG4gICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgIDpyZWFkb25seT1cInJlYWRvbmx5XCJcbiAgICA6YXV0b2ZvY3VzPVwiYXV0b2ZvY3VzXCJcbiAgICA6cGxhY2Vob2xkZXI9XCJwbGFjZWhvbGRlclwiXG4gICAgOmF1dG9jb21wbGV0ZT1cImF1dG9jb21wbGV0ZVwiXG4gICAgOmFyaWEtbGFiZWw9XCJ0aXRsZVwiXG4gICAgdi1iaW5kPVwiJGF0dHJzXCJcbiAgKVxuICBzbG90KG5hbWU9XCJhZnRlclwiKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgZW1pdHM6IFsndXBkYXRlOm1vZGVsVmFsdWUnXSxcblxuICBwcm9wczoge1xuICAgIG1vZGVsVmFsdWU6IHsgdHlwZTogW1N0cmluZywgTnVtYmVyXSwgZGVmYXVsdDogbnVsbCB9LFxuICAgIHR5cGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAndGV4dCcgfSxcbiAgICBpZDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBuYW1lOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIHRpdGxlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgcmVhZG9ubHk6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBhdXRvZm9jdXM6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBwbGFjZWhvbGRlcjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBhdXRvY29tcGxldGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnb2ZmJyB9XG4gICAgLypcbiAgICBjbGVhcmFibGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfVxuICAgIHN1ZmZpeEljb246IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgcHJlZml4SWNvbjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfVxuICAgICovXG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY3VycmVudFZhbHVlOiB0aGlzLm1vZGVsVmFsdWUsXG4gICAgICBob3ZlcmluZzogZmFsc2UsXG4gICAgICBmb2N1c2VkOiBmYWxzZVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIHNpemUoKSB7XG4gICAgICAvLyBEZXRlcm1pbmUgc2l6ZSBiYXNlZCBvbiBtaW4gJiBtYXggc2V0dGluZ3MsIGlmIHRoZXkncmUgcHJvdmlkZWQuXG4gICAgICBjb25zdCB7IHNpemUsIG1pbiwgbWF4IH0gPSB0aGlzLiRhdHRyc1xuICAgICAgY29uc3QgZ2V0TGVuZ3RoID0gdmFsdWUgPT4gKHZhbHVlICE9IG51bGwgPyBgJHt2YWx1ZX1gLmxlbmd0aCA6IDApXG4gICAgICByZXR1cm4gc2l6ZSB8fCBnZXRMZW5ndGgobWluKSB8fCBnZXRMZW5ndGgobWF4KSB8fCB1bmRlZmluZWRcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBtb2RlbFZhbHVlKHRvLCBmcm9tKSB7XG4gICAgICBpZiAodG8gIT09IGZyb20pIHtcbiAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSB0b1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBjdXJyZW50VmFsdWUoY3VycmVudFZhbHVlKSB7XG4gICAgICBpZiAoY3VycmVudFZhbHVlICE9PSB0aGlzLm1vZGVsVmFsdWUpIHtcbiAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnLCBjdXJyZW50VmFsdWUpXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBmb2N1cygpIHtcbiAgICAgIHRoaXMuJHJlZnMuaW5wdXQuZm9jdXMoKVxuICAgIH0sXG5cbiAgICBibHVyKCkge1xuICAgICAgdGhpcy4kcmVmcy5pbnB1dC5ibHVyKClcbiAgICB9XG4gIH1cbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLWlucHV0IHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG5cbiAgQGV4dGVuZCAlaW5wdXQ7XG5cbiAgaW5wdXQge1xuICAgIC8vIEluaGVyaXQgYWxsIHN0eWxpbmcgZnJvbSAuZGl0by1pbnB1dFxuICAgIGFsbDogaW5oZXJpdDtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgYm9yZGVyOiAwO1xuICAgIG1hcmdpbjogMDtcbiAgICBwYWRkaW5nOiAwO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPCEtLSBEZXJpdmVkIGZyb20gQVRVSSwgYW5kIGZ1cnRoZXIgZXh0ZW5kZWQ6IGh0dHBzOi8vYWxpcWluLmdpdGh1Yi5pby9hdHVpLyAtLT5cbjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG5UcmlnZ2VyLmRpdG8tZGF0ZS1waWNrZXIoXG4gIHJlZj1cInRyaWdnZXJcIlxuICB2LW1vZGVsOnNob3c9XCJzaG93UG9wdXBcIlxuICB0cmlnZ2VyPVwiY2xpY2tcIlxuICB2LWJpbmQ9XCJ7IHRyYW5zaXRpb24sIHBsYWNlbWVudCwgZGlzYWJsZWQsIHRhcmdldCB9XCJcbilcbiAgdGVtcGxhdGUoI3RyaWdnZXIpXG4gICAgSW5wdXRGaWVsZC5kaXRvLWRhdGUtcGlja2VyLWlucHV0KFxuICAgICAgcmVmPVwiaW5wdXRcIlxuICAgICAgdi1tb2RlbD1cImN1cnJlbnRUZXh0XCJcbiAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgIHJlYWRvbmx5XG4gICAgICA6Y2xhc3M9XCJ7ICdkaXRvLWZvY3VzJzogc2hvd1BvcHVwIH1cIlxuICAgICAgdi1iaW5kPVwieyBwbGFjZWhvbGRlciwgZGlzYWJsZWQgfVwiXG4gICAgICBAZm9jdXM9XCJpbnB1dEZvY3VzZWQgPSB0cnVlXCJcbiAgICAgIEBibHVyPVwiaW5wdXRGb2N1c2VkID0gZmFsc2VcIlxuICAgICAgQGtleWRvd249XCJvbktleURvd25cIlxuICAgIClcbiAgLy8gaWNvbih0eXBlPVwiY2FsZW5kYXJcIiA6Y29sb3I9XCJpY29uQ29sb3JcIilcbiAgdGVtcGxhdGUoI3BvcHVwKVxuICAgIENhbGVuZGFyLmRpdG8tZGF0ZS1waWNrZXItcG9wdXAoXG4gICAgICByZWY9XCJjYWxlbmRhclwiXG4gICAgICB2LW1vZGVsPVwiY3VycmVudFZhbHVlXCJcbiAgICAgIHYtYmluZD1cInsgbG9jYWxlLCBkaXNhYmxlZERhdGUgfVwiXG4gICAgKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCB7IGZvcm1hdCwgZGVmYXVsdEZvcm1hdHMgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IFRyaWdnZXIgZnJvbSAnLi9UcmlnZ2VyLnZ1ZSdcbmltcG9ydCBDYWxlbmRhciBmcm9tICcuL0NhbGVuZGFyLnZ1ZSdcbmltcG9ydCBJbnB1dEZpZWxkIGZyb20gJy4vSW5wdXRGaWVsZC52dWUnXG5pbXBvcnQgeyBnZXRLZXlOYXZpZ2F0aW9uIH0gZnJvbSAnLi4vdXRpbHMvZXZlbnQuanMnXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgY29tcG9uZW50czogeyBUcmlnZ2VyLCBDYWxlbmRhciwgSW5wdXRGaWVsZCB9LFxuICBlbWl0czogWyd1cGRhdGU6bW9kZWxWYWx1ZScsICd1cGRhdGU6c2hvdycsICdmb2N1cycsICdibHVyJ10sXG5cbiAgcHJvcHM6IHtcbiAgICBtb2RlbFZhbHVlOiB7IHR5cGU6IERhdGUsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICB0cmFuc2l0aW9uOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ3NsaWRlJyB9LFxuICAgIHBsYWNlbWVudDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdib3R0b20tbGVmdCcgfSxcbiAgICBwbGFjZWhvbGRlcjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBsb2NhbGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnZW4tVVMnIH0sXG4gICAgZGF0ZUZvcm1hdDogeyB0eXBlOiBPYmplY3QsIGRlZmF1bHQ6ICgpID0+IGRlZmF1bHRGb3JtYXRzLmRhdGUgfSxcbiAgICBzaG93OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICB0YXJnZXQ6IHsgdHlwZTogW1N0cmluZywgSFRNTEVsZW1lbnRdLCBkZWZhdWx0OiAndHJpZ2dlcicgfSxcbiAgICBkaXNhYmxlZERhdGU6IHsgdHlwZTogRnVuY3Rpb24sIGRlZmF1bHQ6ICgpID0+IGZhbHNlIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjdXJyZW50VmFsdWU6IHRoaXMubW9kZWxWYWx1ZSxcbiAgICAgIHNob3dQb3B1cDogdGhpcy5zaG93LFxuICAgICAgaW5wdXRGb2N1c2VkOiBmYWxzZSxcbiAgICAgIGNoYW5nZWQ6IGZhbHNlXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgZm9jdXNlZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlucHV0Rm9jdXNlZCB8fCB0aGlzLnNob3dQb3B1cFxuICAgIH0sXG5cbiAgICBjdXJyZW50VGV4dCgpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGZvcm1hdCh0aGlzLmN1cnJlbnRWYWx1ZSwge1xuICAgICAgICAgIGxvY2FsZTogdGhpcy5sb2NhbGUsXG4gICAgICAgICAgZGF0ZTogdGhpcy5kYXRlRm9ybWF0LFxuICAgICAgICAgIHRpbWU6IGZhbHNlXG4gICAgICAgIH0pIHx8ICcnXG4gICAgICApXG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgbW9kZWxWYWx1ZSh0bywgZnJvbSkge1xuICAgICAgaWYgKCt0byAhPT0gK2Zyb20pIHtcbiAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSB0b1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBjdXJyZW50VmFsdWUoY3VycmVudFZhbHVlKSB7XG4gICAgICBpZiAoK2N1cnJlbnRWYWx1ZSAhPT0gK3RoaXMubW9kZWxWYWx1ZSkge1xuICAgICAgICB0aGlzLmNoYW5nZWQgPSB0cnVlXG4gICAgICAgIHRoaXMuc2hvd1BvcHVwID0gZmFsc2VcbiAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnLCBjdXJyZW50VmFsdWUpXG4gICAgICB9XG4gICAgfSxcblxuICAgIHNob3coc2hvdykge1xuICAgICAgdGhpcy5zaG93UG9wdXAgPSBzaG93XG4gICAgfSxcblxuICAgIHNob3dQb3B1cCh0bywgZnJvbSkge1xuICAgICAgaWYgKHRvIF4gZnJvbSkge1xuICAgICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6c2hvdycsIHRvKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBmb2N1c2VkKHRvLCBmcm9tKSB7XG4gICAgICBpZiAodG8gXiBmcm9tKSB7XG4gICAgICAgIHRoaXMuJGVtaXQodG8gPyAnZm9jdXMnIDogJ2JsdXInKVxuICAgICAgICBpZiAoIXRvICYmIHRoaXMuY2hhbmdlZCkge1xuICAgICAgICAgIC8vIFRPRE86IFRoaXMgc2VlbXMgdG8gY29udHJhZGljdCB0aGUgYGN1cnJlbnRWYWx1ZSgpYCB3YXRjaGVyIGFib3ZlLlxuICAgICAgICAgIC8vICAgICAgIElzIHRoaXMgbmVlZGVkIGF0IGFsbD9cbiAgICAgICAgICB0aGlzLmNoYW5nZWQgPSBmYWxzZVxuICAgICAgICAgIHRoaXMuJGVtaXQoJ3VwZGF0ZTptb2RlbFZhbHVlJywgdGhpcy5jdXJyZW50VmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIG9uS2V5RG93bihldmVudCkge1xuICAgICAgaWYgKHRoaXMuJHJlZnMuY2FsZW5kYXI/Lm5hdmlnYXRlKGdldEtleU5hdmlnYXRpb24oZXZlbnQpKSkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGZvY3VzKCkge1xuICAgICAgdGhpcy4kcmVmcy5pbnB1dC5mb2N1cygpXG4gICAgfSxcblxuICAgIGJsdXIoKSB7XG4gICAgICB0aGlzLiRyZWZzLmlucHV0LmJsdXIoKVxuICAgIH1cbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tZGF0ZS1waWNrZXIge1xuICBtaW4td2lkdGg6IDEwZW07XG5cbiAgLmRpdG8taW5wdXQge1xuICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIHdpZHRoOiAxMDAlO1xuICB9XG59XG5cbi5kaXRvLWRhdGUtcGlja2VyLXBvcHVwIHtcbiAgbWFyZ2luOiAkcG9wdXAtbWFyZ2luO1xufVxuPC9zdHlsZT5cbiIsImV4cG9ydCBmdW5jdGlvbiBzY3JvbGxUbyhlbGVtZW50LCB0bywgZHVyYXRpb24pIHtcbiAgY29uc3QgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gKFxuICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcbiAgICBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gc2V0VGltZW91dChhcmd1bWVudHNbMF0sIDEwKVxuICAgIH1cbiAgKVxuICBpZiAoZHVyYXRpb24gPD0gMCkge1xuICAgIGVsZW1lbnQuc2Nyb2xsVG9wID0gdG9cbiAgfSBlbHNlIHtcbiAgICBjb25zdCBkaWZmZXJlbmNlID0gdG8gLSBlbGVtZW50LnNjcm9sbFRvcFxuICAgIGNvbnN0IHBlclRpY2sgPSBkaWZmZXJlbmNlIC8gZHVyYXRpb24gKiAxMFxuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICBlbGVtZW50LnNjcm9sbFRvcCA9IGVsZW1lbnQuc2Nyb2xsVG9wICsgcGVyVGlja1xuICAgICAgaWYgKGVsZW1lbnQuc2Nyb2xsVG9wID09PSB0bykgcmV0dXJuXG4gICAgICBzY3JvbGxUbyhlbGVtZW50LCB0bywgZHVyYXRpb24gLSAxMClcbiAgICB9KVxuICB9XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gc2V0U2VsZWN0aW9uKGZpZWxkLCBzdGFydCwgZW5kKSB7XG4gIGlmIChmaWVsZC5jcmVhdGVUZXh0UmFuZ2UpIHtcbiAgICBjb25zdCByYW5nZSA9IGZpZWxkLmNyZWF0ZVRleHRSYW5nZSgpXG4gICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSlcbiAgICByYW5nZS5tb3ZlU3RhcnQoJ2NoYXJhY3RlcicsIHN0YXJ0KVxuICAgIHJhbmdlLm1vdmVFbmQoJ2NoYXJhY3RlcicsIGVuZClcbiAgICByYW5nZS5zZWxlY3QoKVxuICAgIGZpZWxkLmZvY3VzKClcbiAgfSBlbHNlIGlmIChmaWVsZC5zZXRTZWxlY3Rpb25SYW5nZSkge1xuICAgIGZpZWxkLmZvY3VzKClcbiAgICBmaWVsZC5zZXRTZWxlY3Rpb25SYW5nZShzdGFydCwgZW5kKVxuICB9IGVsc2UgaWYgKCdzZWxlY3Rpb25TdGFydCcgaW4gZmllbGQpIHtcbiAgICBmaWVsZC5zZWxlY3Rpb25TdGFydCA9IHN0YXJ0XG4gICAgZmllbGQuc2VsZWN0aW9uRW5kID0gZW5kXG4gICAgZmllbGQuZm9jdXMoKVxuICB9XG59XG4iLCI8IS0tIERlcml2ZWQgZnJvbSBBVFVJLCBhbmQgZnVydGhlciBleHRlbmRlZDogaHR0cHM6Ly9hbGlxaW4uZ2l0aHViLmlvL2F0dWkvIC0tPlxuPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cblRyaWdnZXIuZGl0by10aW1lLXBpY2tlcihcbiAgcmVmPVwidHJpZ2dlclwiXG4gIHYtbW9kZWw6c2hvdz1cInNob3dQb3B1cFwiXG4gIHRyaWdnZXI9XCJjbGlja1wiXG4gIHYtYmluZD1cInsgdHJhbnNpdGlvbiwgcGxhY2VtZW50LCBkaXNhYmxlZCwgdGFyZ2V0IH1cIlxuKVxuICB0ZW1wbGF0ZSgjdHJpZ2dlcilcbiAgICBJbnB1dEZpZWxkLmRpdG8tdGltZS1waWNrZXItaW5wdXQoXG4gICAgICByZWY9XCJpbnB1dFwiXG4gICAgICB2LW1vZGVsPVwiY3VycmVudFRleHRcIlxuICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgcmVhZG9ubHlcbiAgICAgIDpjbGFzcz1cInsgJ2RpdG8tZm9jdXMnOiBzaG93UG9wdXAgfVwiXG4gICAgICB2LWJpbmQ9XCJ7IHBsYWNlaG9sZGVyLCBkaXNhYmxlZCB9XCJcbiAgICAgIEBmb2N1cz1cImlucHV0Rm9jdXNlZCA9IHRydWVcIlxuICAgICAgQGJsdXI9XCJpbnB1dEZvY3VzZWQgPSBmYWxzZVwiXG4gICAgICBAa2V5ZG93bj1cIm9uS2V5RG93blwiXG4gICAgKVxuICAgIC8vLSBpY29uKHR5cGU9XCJ0aW1lXCJcbiAgICAvLy0gOmNvbG9yPVwiZGlzYWJsZWQgPyAnI2JmYmZiZicgOiAodGV4dCA/ICcjNjY2JyA6ICcjYmZiZmJmJylcIlxuICAgIC8vLSApXG4gIHRlbXBsYXRlKCNwb3B1cClcbiAgICAuZGl0by10aW1lLXBpY2tlci1wb3B1cFxuICAgICAgLmRpdG8tdGltZS1waWNrZXItcGFuZWxcbiAgICAgICAgdWwuZGl0by10aW1lLXBpY2tlci1ob3VyKFxuICAgICAgICAgIHJlZj1cImhvdXJcIlxuICAgICAgICAgIEBtb3VzZW92ZXI9XCJzZWxlY3Rpb24gPSAwXCJcbiAgICAgICAgKVxuICAgICAgICAgIHRlbXBsYXRlKFxuICAgICAgICAgICAgdi1mb3I9XCJpbmRleCBpbiAyNFwiXG4gICAgICAgICAgKVxuICAgICAgICAgICAgbGkoXG4gICAgICAgICAgICAgIHYtaWY9XCIhZGlzYWJsZWRIb3VyKGluZGV4IC0gMSlcIlxuICAgICAgICAgICAgICA6Y2xhc3M9XCJ7IHNlbGVjdGVkOiBob3VyID09PSBpbmRleCAtIDEgfVwiXG4gICAgICAgICAgICAgIEBjbGljaz1cImhvdXIgPSBpbmRleCAtIDFcIlxuICAgICAgICAgICAgKSB7eyBsZWZ0UGFkKGluZGV4IC0gMSkgfX1cbiAgICAgIC5kaXRvLXRpbWUtcGlja2VyLXBhbmVsXG4gICAgICAgIHVsLmRpdG8tdGltZS1waWNrZXItbWludXRlKFxuICAgICAgICAgIHJlZj1cIm1pbnV0ZVwiXG4gICAgICAgICAgQG1vdXNlb3Zlcj1cInNlbGVjdGlvbiA9IDFcIlxuICAgICAgICApXG4gICAgICAgICAgdGVtcGxhdGUoXG4gICAgICAgICAgICB2LWZvcj1cImluZGV4IGluIDYwXCJcbiAgICAgICAgICApXG4gICAgICAgICAgICBsaShcbiAgICAgICAgICAgICAgdi1pZj1cIiFkaXNhYmxlZE1pbnV0ZShpbmRleCAtIDEpXCJcbiAgICAgICAgICAgICAgOmNsYXNzPVwieyBzZWxlY3RlZDogbWludXRlID09PSBpbmRleCAtIDEgfVwiXG4gICAgICAgICAgICAgIEBjbGljaz1cIm1pbnV0ZSA9IGluZGV4IC0gMVwiXG4gICAgICAgICAgICApIHt7IGxlZnRQYWQoaW5kZXggLSAxKSB9fVxuICAgICAgLmRpdG8tdGltZS1waWNrZXItcGFuZWxcbiAgICAgICAgdWwuZGl0by10aW1lLXBpY2tlci1zZWNvbmQoXG4gICAgICAgICAgcmVmPVwic2Vjb25kXCJcbiAgICAgICAgICBAbW91c2VvdmVyPVwic2VsZWN0aW9uID0gMlwiXG4gICAgICAgIClcbiAgICAgICAgICB0ZW1wbGF0ZShcbiAgICAgICAgICAgIHYtZm9yPVwiaW5kZXggaW4gNjBcIlxuICAgICAgICAgIClcbiAgICAgICAgICAgIGxpKFxuICAgICAgICAgICAgICB2LWlmPVwiIWRpc2FibGVkU2Vjb25kKGluZGV4IC0gMSlcIlxuICAgICAgICAgICAgICA6Y2xhc3M9XCJ7IHNlbGVjdGVkOiBzZWNvbmQgPT09IGluZGV4IC0gMSB9XCJcbiAgICAgICAgICAgICAgQGNsaWNrPVwic2Vjb25kID0gaW5kZXggLSAxXCJcbiAgICAgICAgICAgICkge3sgbGVmdFBhZChpbmRleCAtIDEpIH19XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IFRyaWdnZXIgZnJvbSAnLi9UcmlnZ2VyLnZ1ZSdcbmltcG9ydCBJbnB1dEZpZWxkIGZyb20gJy4vSW5wdXRGaWVsZC52dWUnXG5pbXBvcnQgeyBjb3B5RGF0ZSB9IGZyb20gJy4uL3V0aWxzL2RhdGUuanMnXG5pbXBvcnQgeyBzY3JvbGxUbyB9IGZyb20gJy4uL3V0aWxzL3Njcm9sbC5qcydcbmltcG9ydCB7IHNldFNlbGVjdGlvbiB9IGZyb20gJy4uL3V0aWxzL3NlbGVjdGlvbi5qcydcbmltcG9ydCB7IGdldEtleU5hdmlnYXRpb24gfSBmcm9tICcuLi91dGlscy9ldmVudC5qcydcblxuZXhwb3J0IGRlZmF1bHQge1xuICBjb21wb25lbnRzOiB7IFRyaWdnZXIsIElucHV0RmllbGQgfSxcbiAgZW1pdHM6IFsndXBkYXRlOm1vZGVsVmFsdWUnLCAndXBkYXRlOnNob3cnLCAnY2hhbmdlJywgJ2ZvY3VzJywgJ2JsdXInXSxcblxuICBwcm9wczoge1xuICAgIG1vZGVsVmFsdWU6IHsgdHlwZTogRGF0ZSwgZGVmYXVsdDogbnVsbCB9LFxuICAgIHRyYW5zaXRpb246IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnc2xpZGUnIH0sXG4gICAgcGxhY2VtZW50OiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2JvdHRvbS1sZWZ0JyB9LFxuICAgIHBsYWNlaG9sZGVyOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIHNob3c6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIHRhcmdldDogeyB0eXBlOiBbU3RyaW5nLCBIVE1MRWxlbWVudF0sIGRlZmF1bHQ6ICd0cmlnZ2VyJyB9LFxuICAgIGRpc2FibGVkSG91cjogeyB0eXBlOiBGdW5jdGlvbiwgZGVmYXVsdDogKCkgPT4gZmFsc2UgfSxcbiAgICBkaXNhYmxlZE1pbnV0ZTogeyB0eXBlOiBGdW5jdGlvbiwgZGVmYXVsdDogKCkgPT4gZmFsc2UgfSxcbiAgICBkaXNhYmxlZFNlY29uZDogeyB0eXBlOiBGdW5jdGlvbiwgZGVmYXVsdDogKCkgPT4gZmFsc2UgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGN1cnJlbnRWYWx1ZTogdGhpcy5tb2RlbFZhbHVlLFxuICAgICAgc2hvd1BvcHVwOiB0aGlzLnNob3csXG4gICAgICBpbnB1dEZvY3VzZWQ6IGZhbHNlLFxuICAgICAgc2VsZWN0aW9uOiAwLFxuICAgICAgY2hhbmdlZDogZmFsc2VcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBmb2N1c2VkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW5wdXRGb2N1c2VkIHx8IHRoaXMuc2hvd1BvcHVwXG4gICAgfSxcblxuICAgIGN1cnJlbnRUZXh0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFZhbHVlXG4gICAgICAgID8gYCR7XG4gICAgICAgICAgICB0aGlzLmxlZnRQYWQodGhpcy5ob3VyKVxuICAgICAgICAgIH06JHtcbiAgICAgICAgICAgIHRoaXMubGVmdFBhZCh0aGlzLm1pbnV0ZSlcbiAgICAgICAgICB9OiR7XG4gICAgICAgICAgICB0aGlzLmxlZnRQYWQodGhpcy5zZWNvbmQpXG4gICAgICAgICAgfWBcbiAgICAgICAgOiAnJ1xuICAgIH0sXG5cbiAgICBjdXJyZW50RGF0ZSgpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRoaXMuY3VycmVudFZhbHVlIHx8XG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBEYXRlKCkgb2JqZWN0IHdpdGggdGhlIHRpbWUgc2V0IHRvIDAsIHRvIGJlIHVzZWQgd2hlblxuICAgICAgICAvLyBmaXJzdCBzZXR0aW5nIGFueSBvZiB0aGUgdGltZXMsIGZvciBtZWFuaW5nZnVsIGRhdGVzIGluIGNhc2UgdGhlXG4gICAgICAgIC8vIG9iamVjdCBpcyBzaGFyZWQgd2l0aCBhIERhdGVQaWNrZXIsIGUuZy4gdGhyb3VnaCBEYXRlVGltZVBpY2tlci5cbiAgICAgICAgY29weURhdGUobmV3IERhdGUoKSwgeyBob3VyOiAwLCBtaW51dGU6IDAsIHNlY29uZDogMCwgbWlsbGlzZWNvbmQ6IDAgfSlcbiAgICAgIClcbiAgICB9LFxuXG4gICAgaG91cjoge1xuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50RGF0ZS5nZXRIb3VycygpXG4gICAgICB9LFxuXG4gICAgICBzZXQoaG91cikge1xuICAgICAgICB0aGlzLnNldFRpbWUoeyBob3VyIH0pXG4gICAgICB9XG4gICAgfSxcblxuICAgIG1pbnV0ZToge1xuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50RGF0ZS5nZXRNaW51dGVzKClcbiAgICAgIH0sXG5cbiAgICAgIHNldChtaW51dGUpIHtcbiAgICAgICAgdGhpcy5zZXRUaW1lKHsgbWludXRlIH0pXG4gICAgICB9XG4gICAgfSxcblxuICAgIHNlY29uZDoge1xuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50RGF0ZS5nZXRTZWNvbmRzKClcbiAgICAgIH0sXG5cbiAgICAgIHNldChzZWNvbmQpIHtcbiAgICAgICAgdGhpcy5zZXRUaW1lKHsgc2Vjb25kIH0pXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgbW9kZWxWYWx1ZSh0bywgZnJvbSkge1xuICAgICAgaWYgKCt0byAhPT0gK2Zyb20pIHtcbiAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSB0b1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBjdXJyZW50VmFsdWUoZGF0ZSkge1xuICAgICAgaWYgKCtkYXRlICE9PSArdGhpcy5tb2RlbFZhbHVlKSB7XG4gICAgICAgIHRoaXMuY2hhbmdlZCA9IHRydWVcbiAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnLCBkYXRlKVxuICAgICAgICB0aGlzLnNjcm9sbEFsbCgpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGN1cnJlbnRUZXh0OiAndXBkYXRlU2VsZWN0aW9uJyxcblxuICAgIHNlbGVjdGlvbjogJ3VwZGF0ZVNlbGVjdGlvbicsXG5cbiAgICBzaG93KHNob3cpIHtcbiAgICAgIHRoaXMuc2hvd1BvcHVwID0gc2hvd1xuICAgIH0sXG5cbiAgICBzaG93UG9wdXAodG8sIGZyb20pIHtcbiAgICAgIGlmICh0bykge1xuICAgICAgICB0aGlzLnVwZGF0ZVNlbGVjdGlvbigpXG4gICAgICAgIHRoaXMuc2Nyb2xsQWxsKDApXG4gICAgICB9XG4gICAgICBpZiAodG8gXiBmcm9tKSB7XG4gICAgICAgIHRoaXMuJGVtaXQoJ3VwZGF0ZTpzaG93JywgdG8pXG4gICAgICB9XG4gICAgfSxcblxuICAgIGZvY3VzZWQodG8sIGZyb20pIHtcbiAgICAgIGlmICh0byBeIGZyb20pIHtcbiAgICAgICAgdGhpcy4kZW1pdCh0byA/ICdmb2N1cycgOiAnYmx1cicpXG4gICAgICAgIGlmICghdG8gJiYgdGhpcy5jaGFuZ2VkKSB7XG4gICAgICAgICAgdGhpcy5jaGFuZ2VkID0gZmFsc2VcbiAgICAgICAgICB0aGlzLiRlbWl0KCdjaGFuZ2UnLCB0aGlzLmN1cnJlbnRWYWx1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgbGVmdFBhZCh2YWx1ZSkge1xuICAgICAgcmV0dXJuICgnMCcgKyB2YWx1ZSkuc2xpY2UoLTIpXG4gICAgfSxcblxuICAgIHNldFRpbWUob3ZlcnJpZGVzKSB7XG4gICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IGNvcHlEYXRlKHRoaXMuY3VycmVudERhdGUsIHtcbiAgICAgICAgLi4ub3ZlcnJpZGVzLFxuICAgICAgICBtaWxsaXNlY29uZDogMFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgdXBkYXRlU2VsZWN0aW9uKGZvcmNlID0gZmFsc2UpIHtcbiAgICAgIGlmICh0aGlzLnNob3dQb3B1cCB8fCBmb3JjZSkge1xuICAgICAgICBjb25zdCBzdGFydCA9IDMgKiB0aGlzLnNlbGVjdGlvblxuICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiBzZXRTZWxlY3Rpb24odGhpcy4kcmVmcy5pbnB1dCwgc3RhcnQsIHN0YXJ0ICsgMikpXG4gICAgICB9XG4gICAgfSxcblxuICAgIHNjcm9sbEFsbChkdXJhdGlvbiA9IDEwMCkge1xuICAgICAgY29uc3Qgc2Nyb2xsID0gKHJlZiwgdmFsdWUpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy4kcmVmc1tyZWZdXG4gICAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgICAvLyBGaXJzdCBhbmQgbGFzdCBvbmUgYWRkIDMgdGltZXMgdGhlIG1hcmdpblxuICAgICAgICAgIGNvbnN0IGxpbmVIZWlnaHQgPSB0YXJnZXQuc2Nyb2xsSGVpZ2h0IC8gKHRhcmdldC5jaGlsZHJlbi5sZW5ndGggKyA2KVxuICAgICAgICAgIHNjcm9sbFRvKHRhcmdldCwgTWF0aC5yb3VuZCh2YWx1ZSAqIGxpbmVIZWlnaHQpLCBkdXJhdGlvbilcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICBzY3JvbGwoJ2hvdXInLCB0aGlzLmhvdXIpXG4gICAgICAgIHNjcm9sbCgnbWludXRlJywgdGhpcy5taW51dGUpXG4gICAgICAgIHNjcm9sbCgnc2Vjb25kJywgdGhpcy5zZWNvbmQpXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBvbktleURvd24oZXZlbnQpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkID0gWydob3VyJywgJ21pbnV0ZScsICdzZWNvbmQnXVt0aGlzLnNlbGVjdGlvbl1cbiAgICAgIGlmIChzZWxlY3RlZCkge1xuICAgICAgICBjb25zdCB7IGhvciwgdmVyLCBlbnRlciB9ID0gZ2V0S2V5TmF2aWdhdGlvbihldmVudClcbiAgICAgICAgaWYgKGhvcikge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5zZWxlY3Rpb24gKyBob3JcbiAgICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IHZhbHVlIDwgMCA/IDIgOiB2YWx1ZSA+IDIgPyAwIDogdmFsdWVcbiAgICAgICAgfSBlbHNlIGlmICh2ZXIpIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXNbc2VsZWN0ZWRdICsgdmVyXG4gICAgICAgICAgY29uc3QgeyBsZW5ndGggfSA9IHRoaXMuJHJlZnNbc2VsZWN0ZWRdLmNoaWxkcmVuXG4gICAgICAgICAgdGhpc1tzZWxlY3RlZF0gPVxuICAgICAgICAgICAgdmFsdWUgPCAwXG4gICAgICAgICAgICAgID8gdmFsdWUgKyBsZW5ndGhcbiAgICAgICAgICAgICAgOiB2YWx1ZSA+PSBsZW5ndGhcbiAgICAgICAgICAgICAgICA/IHZhbHVlIC0gbGVuZ3RoXG4gICAgICAgICAgICAgICAgOiB2YWx1ZVxuICAgICAgICB9XG4gICAgICAgIGlmIChlbnRlcikge1xuICAgICAgICAgIHRoaXMuc2hvd1BvcHVwID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICBpZiAoaG9yIHx8IHZlciB8fCBlbnRlcikge1xuICAgICAgICAgIHRoaXMudXBkYXRlU2VsZWN0aW9uKHRydWUpXG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGZvY3VzKCkge1xuICAgICAgdGhpcy4kcmVmcy5pbnB1dC5mb2N1cygpXG4gICAgfSxcblxuICAgIGJsdXIoKSB7XG4gICAgICB0aGlzLiRyZWZzLmlucHV0LmJsdXIoKVxuICAgIH1cbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tdGltZS1waWNrZXIge1xuICAuZGl0by1pbnB1dCB7XG4gICAgd2lkdGg6IDEwMCU7XG4gIH1cbn1cblxuLmRpdG8tdGltZS1waWNrZXItcG9wdXAge1xuICBtYXgtd2lkdGg6IDE2MHB4O1xuICBtYXJnaW46ICRwb3B1cC1tYXJnaW47XG59XG5cbiR0aW1lLXBpY2tlci1saW5lLWhlaWdodDogMjRweDtcblxuLmRpdG8tdGltZS1waWNrZXIge1xuICAuZGl0by1pbnB1dCB7XG4gICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtcztcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgd2lkdGg6IDEwMCU7XG5cbiAgICAuZGl0by1pY29uLXRpbWUge1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICB0b3A6IDA7XG4gICAgICByaWdodDogN3B4O1xuICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgIH1cbiAgfVxufVxuXG4uZGl0by10aW1lLXBpY2tlci1wb3B1cCB7XG4gIGxpc3Qtc3R5bGU6IG5vbmU7XG4gIGJhY2tncm91bmQ6ICRjb2xvci13aGl0ZTtcbiAgYm9yZGVyOiAkYm9yZGVyLXN0eWxlO1xuICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcbiAgYm94LXNoYWRvdzogJHNoYWRvdy13aW5kb3c7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG5cbi5kaXRvLXRpbWUtcGlja2VyLXBvcHVwIC5kaXRvLXRpbWUtcGlja2VyLXBhbmVsIHtcbiAgZmxvYXQ6IGxlZnQ7XG4gIGJvcmRlcjogJGJvcmRlci1zdHlsZTtcbiAgYm9yZGVyLXdpZHRoOiAwIDFweCAwO1xuICBtYXJnaW4tbGVmdDogLTFweDtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgd2lkdGg6IGNhbGMoMTAwJSAvIDMgKyAxcHgpO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuXG4gICY6bGFzdC1jaGlsZCB7XG4gICAgYm9yZGVyLXJpZ2h0OiAwO1xuICB9XG5cbiAgdWwge1xuICAgIG92ZXJmbG93LXg6IGhpZGRlbjtcbiAgICBvdmVyZmxvdy15OiBhdXRvO1xuICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgbWFyZ2luOiAwO1xuICAgIC8vIEhpZGUgc2Nyb2xsYmFyOlxuICAgIGJveC1zaXppbmc6IGNvbnRlbnQtYm94O1xuICAgIHBhZGRpbmc6IDAgMTdweCAwIDA7XG4gICAgaGVpZ2h0OiA3ICogJHRpbWUtcGlja2VyLWxpbmUtaGVpZ2h0O1xuXG4gICAgJiA+IGxpIHtcbiAgICAgIGJveC1zaXppbmc6IGNvbnRlbnQtYm94O1xuICAgICAgYmFja2dyb3VuZDogJGNvbG9yLXdoaXRlO1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBoZWlnaHQ6ICR0aW1lLXBpY2tlci1saW5lLWhlaWdodDtcbiAgICAgIGxpbmUtaGVpZ2h0OiAkdGltZS1waWNrZXItbGluZS1oZWlnaHQ7XG4gICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zO1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICBAaW5jbHVkZSB1c2VyLXNlbGVjdChub25lKTtcblxuICAgICAgJjpmaXJzdC1jaGlsZCB7XG4gICAgICAgIG1hcmdpbi10b3A6IDMgKiAkdGltZS1waWNrZXItbGluZS1oZWlnaHQ7XG4gICAgICB9XG5cbiAgICAgICY6bGFzdC1jaGlsZCB7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDMgKiAkdGltZS1waWNrZXItbGluZS1oZWlnaHQ7XG4gICAgICB9XG5cbiAgICAgICY6aG92ZXIge1xuICAgICAgICBiYWNrZ3JvdW5kOiAkY29sb3ItaGlnaGxpZ2h0O1xuICAgICAgfVxuXG4gICAgICAmLnNlbGVjdGVkLFxuICAgICAgJi5zZWxlY3RlZDpob3ZlciB7XG4gICAgICAgIGNvbG9yOiAkY29sb3ItdGV4dC1pbnZlcnRlZDtcbiAgICAgICAgYmFja2dyb3VuZDogJGNvbG9yLWFjdGl2ZTtcbiAgICAgIH1cblxuICAgICAgJi5kaXNhYmxlZCB7XG4gICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgICAgY29sb3I6ICRjb2xvci1kaXNhYmxlZDtcbiAgICAgIH1cblxuICAgICAgJi5kaXNhYmxlZDpob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1kYXRlLXRpbWUtcGlja2VyKHJlZj1cInBpY2tlclwiKVxuICAuZGl0by1waWNrZXJzKDpjbGFzcz1cInsgJ2RpdG8tZm9jdXMnOiBmb2N1c2VkIH1cIilcbiAgICBEYXRlUGlja2VyKFxuICAgICAgcmVmPVwiZGF0ZVwiXG4gICAgICB2LW1vZGVsPVwiY3VycmVudFZhbHVlXCJcbiAgICAgIHYtbW9kZWw6c2hvdz1cInNob3dEYXRlXCJcbiAgICAgIHBsYWNlbWVudD1cImJvdHRvbS1sZWZ0XCJcbiAgICAgIDp0YXJnZXQ9XCIkcmVmcy5waWNrZXJcIlxuICAgICAgdi1iaW5kPVwieyB0cmFuc2l0aW9uLCBwbGFjZWhvbGRlciwgbG9jYWxlLCBkYXRlRm9ybWF0LCBkaXNhYmxlZCB9XCJcbiAgICAgIEBmb2N1cz1cImRhdGVGb2N1c2VkID0gdHJ1ZVwiXG4gICAgICBAYmx1cj1cImRhdGVGb2N1c2VkID0gZmFsc2VcIlxuICAgIClcbiAgICBUaW1lUGlja2VyKFxuICAgICAgcmVmPVwidGltZVwiXG4gICAgICB2LW1vZGVsPVwiY3VycmVudFZhbHVlXCJcbiAgICAgIHYtbW9kZWw6c2hvdz1cInNob3dUaW1lXCJcbiAgICAgIHBsYWNlaG9sZGVyPVwiXCJcbiAgICAgIHBsYWNlbWVudD1cImJvdHRvbS1yaWdodFwiXG4gICAgICA6dGFyZ2V0PVwiJHJlZnMucGlja2VyXCJcbiAgICAgIHYtYmluZD1cInsgdHJhbnNpdGlvbiwgZGlzYWJsZWQgfVwiXG4gICAgICBAZm9jdXM9XCJ0aW1lRm9jdXNlZCA9IHRydWVcIlxuICAgICAgQGJsdXI9XCJ0aW1lRm9jdXNlZCA9IGZhbHNlXCJcbiAgICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IHsgZGVmYXVsdEZvcm1hdHMgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IERhdGVQaWNrZXIgZnJvbSAnLi9EYXRlUGlja2VyLnZ1ZSdcbmltcG9ydCBUaW1lUGlja2VyIGZyb20gJy4vVGltZVBpY2tlci52dWUnXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgY29tcG9uZW50czogeyBEYXRlUGlja2VyLCBUaW1lUGlja2VyIH0sXG4gIGVtaXRzOiBbJ3VwZGF0ZTptb2RlbFZhbHVlJywgJ2NoYW5nZScsICdmb2N1cycsICdibHVyJ10sXG5cbiAgcHJvcHM6IHtcbiAgICBtb2RlbFZhbHVlOiB7IHR5cGU6IERhdGUsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICB0cmFuc2l0aW9uOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ3NsaWRlJyB9LFxuICAgIHBsYWNlaG9sZGVyOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIGRhdGVGb3JtYXQ6IHsgdHlwZTogT2JqZWN0LCBkZWZhdWx0OiAoKSA9PiBkZWZhdWx0Rm9ybWF0cy5kYXRlIH0sXG4gICAgbG9jYWxlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2VuLVVTJyB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjdXJyZW50VmFsdWU6IHRoaXMubW9kZWxWYWx1ZSxcbiAgICAgIHNob3dEYXRlOiBmYWxzZSxcbiAgICAgIHNob3dUaW1lOiBmYWxzZSxcbiAgICAgIGRhdGVGb2N1c2VkOiBmYWxzZSxcbiAgICAgIHRpbWVGb2N1c2VkOiBmYWxzZSxcbiAgICAgIGNoYW5nZWQ6IGZhbHNlXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgZm9jdXNlZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGVGb2N1c2VkIHx8IHRoaXMudGltZUZvY3VzZWRcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBtb2RlbFZhbHVlKHRvLCBmcm9tKSB7XG4gICAgICBpZiAoK3RvICE9PSArZnJvbSkge1xuICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IHRvXG4gICAgICB9XG4gICAgfSxcblxuICAgIGN1cnJlbnRWYWx1ZShkYXRlKSB7XG4gICAgICBpZiAoK2RhdGUgIT09ICt0aGlzLm1vZGVsVmFsdWUpIHtcbiAgICAgICAgdGhpcy5jaGFuZ2VkID0gdHJ1ZVxuICAgICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6bW9kZWxWYWx1ZScsIGRhdGUpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGZvY3VzZWQodG8sIGZyb20pIHtcbiAgICAgIGlmICh0byBeIGZyb20pIHtcbiAgICAgICAgdGhpcy4kZW1pdCh0byA/ICdmb2N1cycgOiAnYmx1cicpXG4gICAgICAgIGlmICghdG8gJiYgdGhpcy5jaGFuZ2VkKSB7XG4gICAgICAgICAgdGhpcy5jaGFuZ2VkID0gZmFsc2VcbiAgICAgICAgICB0aGlzLiRlbWl0KCdjaGFuZ2UnLCB0aGlzLmN1cnJlbnRWYWx1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZm9jdXMoKSB7XG4gICAgICB0aGlzLiRyZWZzLmRhdGUuZm9jdXMoKVxuICAgIH0sXG5cbiAgICBibHVyKCkge1xuICAgICAgdGhpcy4kcmVmcy5kYXRlLmJsdXIoKVxuICAgICAgdGhpcy4kcmVmcy50aW1lLmJsdXIoKVxuICAgIH1cbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tZGF0ZS10aW1lLXBpY2tlciB7XG4gIC5kaXRvLXBpY2tlcnMge1xuICAgIEBleHRlbmQgJWlucHV0O1xuXG4gICAgcGFkZGluZzogMDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuXG4gICAgLmRpdG8taW5wdXQge1xuICAgICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAgIGJvcmRlcjogMDtcbiAgICB9XG4gIH1cblxuICAuZGl0by1kYXRlLXBpY2tlciB7XG4gICAgd2lkdGg6IDYwJTtcbiAgICBtaW4td2lkdGg6IDYuOWVtO1xuXG4gICAgLmRpdG8taW5wdXQge1xuICAgICAgcGFkZGluZy1yaWdodDogMDtcbiAgICB9XG4gIH1cblxuICAuZGl0by10aW1lLXBpY2tlciB7XG4gICAgd2lkdGg6IDQwJTtcbiAgICBtaW4td2lkdGg6IDUuNGVtO1xuXG4gICAgLmRpdG8taW5wdXQge1xuICAgICAgcGFkZGluZy1sZWZ0OiAwO1xuICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbmkuZGl0by1pY29uKDpjbGFzcz1cImBkaXRvLWljb24tJHtuYW1lfWBcIilcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5leHBvcnQgZGVmYXVsdCB7XG4gIHByb3BzOiB7XG4gICAgbmFtZToge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgcmVxdWlyZWQ6IHRydWVcbiAgICB9XG4gIH1cbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi8vIGB5YXJuIGJ1aWxkOmljb25zYCBjb252ZXJ0cyB0aGUgaWNvbiBTVkcgZmlsZXMgdG8gc2lsZW50IGNsYXNzZXMgaW5zaWRlXG4vLyBgc3JjL3N0eWxlcy9taXhpbnMvX2ljb25zLnNjc3NgLCBtYWtpbmcgdGhlbSBhdmFpbGFibGUgdG8gYWxsIG90aGVyIHNhc3Ncbi8vIGNvZGUgdGhyb3VnaCBgX2ltcG9ydHNgLlxuLy8gSW4gb3JkZXIgdG8gYmUgYWJsZSB0byB1c2UgdGhlbSBhcyBub3JtYWwgQ1NTIGNsYXNzZXMsIGNvbnZlcnQgdGhlbSBoZXJlOlxuQGVhY2ggJG5hbWUgaW4gJGljb25zIHtcbiAgLmRpdG8taWNvbi0jeyRuYW1lfSB7XG4gICAgQGV4dGVuZCAlaWNvbi0jeyRuYW1lfTtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjwhLS0gZXNsaW50LWRpc2FibGUgdnVlL25vLXRlbXBsYXRlLXNoYWRvdyAtLT5cbjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1wYWdpbmF0aW9uXG4gIC5kaXRvLXBhZ2luYXRpb24tdG90YWwoXG4gICAgdi1pZj1cInNob3dUb3RhbFwiXG4gIClcbiAgICB0ZW1wbGF0ZShcbiAgICAgIHYtaWY9XCJ0b3RhbCA+IDBcIlxuICAgICkge3sgZmlyc3QgfX0g4oCTIHt7IGxhc3QgfX1cbiAgICB0ZW1wbGF0ZShcbiAgICAgIHYtZWxzZVxuICAgICkgMFxuICAgIHwgLyB7eyB0b3RhbCB9fVxuICAuZGl0by1idXR0b25zLmRpdG8tYnV0dG9ucy1yb3VuZFxuICAgIGJ1dHRvbi5kaXRvLWJ1dHRvbihcbiAgICAgIHYtZm9yPVwicGFnZSBpbiBwYWdlUmFuZ2VcIlxuICAgICAgOmNsYXNzPVwiZ2V0UGFnZUNsYXNzKHBhZ2UpXCJcbiAgICAgIDpkaXNhYmxlZD1cInBhZ2UuZGlzYWJsZWRcIlxuICAgICAgQGNsaWNrPVwib25DbGlja1BhZ2UocGFnZSlcIlxuICAgIClcbiAgICAgIHNwYW4oXG4gICAgICAgIHYtaWY9XCJwYWdlLnRleHRcIlxuICAgICAgKSB7eyBwYWdlLnRleHQgfX1cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5leHBvcnQgZGVmYXVsdCB7XG4gIGVtaXRzOiBbJ3VwZGF0ZTpwYWdlJ10sXG5cbiAgcHJvcHM6IHtcbiAgICB0b3RhbDogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IDAgfSxcbiAgICBwYWdlOiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMSB9LFxuICAgIHBhZ2VTaXplOiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMTAgfSxcbiAgICBzaG93VG90YWw6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZSB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGFnZVJhbmdlOiBbXSxcbiAgICAgIHNob3dQcmV2OiB0cnVlLFxuICAgICAgc2hvd05leHQ6IHRydWUsXG4gICAgICBudW1QYWdlczogMCxcbiAgICAgIGN1cnJlbnRQYWdlU2l6ZTogdGhpcy5wYWdlU2l6ZSxcbiAgICAgIGN1cnJlbnRQYWdlOiB0aGlzLnBhZ2VcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBmaXJzdCgpIHtcbiAgICAgIHJldHVybiAodGhpcy5jdXJyZW50UGFnZSAtIDEpICogdGhpcy5jdXJyZW50UGFnZVNpemUgKyAxXG4gICAgfSxcblxuICAgIGxhc3QoKSB7XG4gICAgICByZXR1cm4gTWF0aC5taW4odGhpcy5maXJzdCArIHRoaXMuY3VycmVudFBhZ2VTaXplIC0gMSwgdGhpcy50b3RhbClcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICB0b3RhbDogJ3VwZGF0ZVBhZ2VSYW5nZScsXG4gICAgc2hvd1ByZXY6ICd1cGRhdGVQYWdlUmFuZ2UnLFxuICAgIHNob3dOZXh0OiAndXBkYXRlUGFnZVJhbmdlJyxcblxuICAgIHBhZ2UocGFnZSkge1xuICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IHBhZ2VcbiAgICB9LFxuXG4gICAgcGFnZVNpemUocGFnZVNpemUpIHtcbiAgICAgIHRoaXMuY3VycmVudFBhZ2VTaXplID0gcGFnZVNpemVcbiAgICB9LFxuXG4gICAgY3VycmVudFBhZ2VTaXplKGN1cnJlbnRQYWdlU2l6ZSkge1xuICAgICAgdGhpcy5udW1QYWdlcyA9IE1hdGguY2VpbCh0aGlzLnRvdGFsIC8gY3VycmVudFBhZ2VTaXplKVxuICAgICAgaWYgKHRoaXMuY3VycmVudFBhZ2UgPiB0aGlzLm51bVBhZ2VzKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSB0aGlzLm51bVBhZ2VzXG4gICAgICB9XG4gICAgICB0aGlzLnVwZGF0ZVBhZ2VSYW5nZSgpXG4gICAgfSxcblxuICAgIGN1cnJlbnRQYWdlKHRvLCBmcm9tKSB7XG4gICAgICBpZiAodG8gIT09IGZyb20pIHtcbiAgICAgICAgdGhpcy51cGRhdGVQYWdlUmFuZ2UoKVxuICAgICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6cGFnZScsIHRvKVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBjcmVhdGVkKCkge1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSB0aGlzLnBhZ2VcbiAgICB0aGlzLmN1cnJlbnRQYWdlU2l6ZSA9IHRoaXMucGFnZVNpemVcbiAgfSxcblxuICBtb3VudGVkKCkge1xuICAgIHRoaXMudXBkYXRlUGFnZVJhbmdlKClcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgb25DbGlja1BhZ2UocGFnZSkge1xuICAgICAgaWYgKHBhZ2UuaW5kZXggJiYgIXBhZ2UuZGlzYWJsZWQgJiYgcGFnZS5pbmRleCAhPT0gdGhpcy5jdXJyZW50UGFnZSkge1xuICAgICAgICB0aGlzLmN1cnJlbnRQYWdlID0gcGFnZS5pbmRleFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBnZXRQYWdlQ2xhc3MocGFnZSkge1xuICAgICAgY29uc3QgY2xhc3NlcyA9IHtcbiAgICAgICAgJ2RpdG8tc2VsZWN0ZWQnOiBwYWdlLmFjdGl2ZVxuICAgICAgfVxuICAgICAgaWYgKHBhZ2UudHlwZSkge1xuICAgICAgICBjbGFzc2VzW2BkaXRvLWJ1dHRvbi0ke3BhZ2UudHlwZX1gXSA9IHRydWVcbiAgICAgIH1cbiAgICAgIHJldHVybiBjbGFzc2VzXG4gICAgfSxcblxuICAgIHVwZGF0ZVBhZ2VSYW5nZSgpIHtcbiAgICAgIGNvbnN0IHsgc2hvd1ByZXYsIHNob3dOZXh0LCB0b3RhbCwgY3VycmVudFBhZ2VTaXplLCBjdXJyZW50UGFnZSB9ID0gdGhpc1xuICAgICAgY29uc3Qgc2hvd0xlbmd0aCA9IHNob3dQcmV2ICsgc2hvd05leHQgKyAxXG4gICAgICBjb25zdCBudW1QYWdlcyA9ICh0aGlzLm51bVBhZ2VzID0gTWF0aC5jZWlsKHRvdGFsIC8gY3VycmVudFBhZ2VTaXplKSlcblxuICAgICAgbGV0IHN0YXJ0ID0gMVxuICAgICAgbGV0IGVuZCA9IDFcbiAgICAgIGlmIChudW1QYWdlcyA8PSBzaG93TGVuZ3RoKSB7XG4gICAgICAgIGVuZCA9IG51bVBhZ2VzXG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRQYWdlIDw9IHNob3dQcmV2ICsgMSkge1xuICAgICAgICBlbmQgPSBzaG93TGVuZ3RoXG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRQYWdlID49IG51bVBhZ2VzIC0gc2hvd05leHQpIHtcbiAgICAgICAgZW5kID0gbnVtUGFnZXNcbiAgICAgICAgc3RhcnQgPSBudW1QYWdlcyAtIHNob3dMZW5ndGggKyAxXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGFydCA9IGN1cnJlbnRQYWdlIC0gc2hvd1ByZXZcbiAgICAgICAgZW5kID0gY3VycmVudFBhZ2UgKyBzaG93TmV4dFxuICAgICAgfVxuXG4gICAgICBjb25zdCBwYWdlUmFuZ2UgPSBbXVxuICAgICAgcGFnZVJhbmdlLnB1c2goe1xuICAgICAgICBpbmRleDogY3VycmVudFBhZ2UgLSAxLFxuICAgICAgICB0eXBlOiAncHJldicsXG4gICAgICAgIGRpc2FibGVkOiBjdXJyZW50UGFnZSA8PSAxXG4gICAgICB9KVxuICAgICAgaWYgKHN0YXJ0ID49IDIpIHtcbiAgICAgICAgcGFnZVJhbmdlLnB1c2goeyBpbmRleDogMSwgdGV4dDogMSB9KVxuICAgICAgfVxuICAgICAgaWYgKHN0YXJ0ID4gMikge1xuICAgICAgICBwYWdlUmFuZ2UucHVzaCh7XG4gICAgICAgICAgaW5kZXg6IE1hdGgubWF4KDEsIGN1cnJlbnRQYWdlIC0gMTApLFxuICAgICAgICAgIHR5cGU6ICdlbGxpcHNpcy1wcmV2J1xuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSsrKSB7XG4gICAgICAgIHBhZ2VSYW5nZS5wdXNoKHtcbiAgICAgICAgICBpbmRleDogaSxcbiAgICAgICAgICB0ZXh0OiBpLFxuICAgICAgICAgIGFjdGl2ZTogaSA9PT0gY3VycmVudFBhZ2VcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGlmIChlbmQgPCBudW1QYWdlcyAtIDEpIHtcbiAgICAgICAgcGFnZVJhbmdlLnB1c2goe1xuICAgICAgICAgIGluZGV4OiBNYXRoLm1pbihudW1QYWdlcywgY3VycmVudFBhZ2UgKyAxMCksXG4gICAgICAgICAgdHlwZTogJ2VsbGlwc2lzLW5leHQnXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBpZiAoZW5kIDw9IG51bVBhZ2VzIC0gMSkge1xuICAgICAgICBwYWdlUmFuZ2UucHVzaCh7IGluZGV4OiBudW1QYWdlcywgdGV4dDogbnVtUGFnZXMgfSlcbiAgICAgIH1cbiAgICAgIHBhZ2VSYW5nZS5wdXNoKHtcbiAgICAgICAgaW5kZXg6IGN1cnJlbnRQYWdlICsgMSxcbiAgICAgICAgdHlwZTogJ25leHQnLFxuICAgICAgICBkaXNhYmxlZDogY3VycmVudFBhZ2UgPj0gbnVtUGFnZXNcbiAgICAgIH0pXG5cbiAgICAgIHRoaXMucGFnZVJhbmdlID0gcGFnZVJhbmdlXG4gICAgfVxuICB9XG59XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1wYWdpbmF0aW9uIHtcbiAgZGlzcGxheTogZmxleDtcblxuICAuZGl0by1wYWdpbmF0aW9uLXRvdGFsIHtcbiAgICBAaW5jbHVkZSBlbGxpcHNpcztcblxuICAgIG1hcmdpbjogMCAwLjVlbTtcbiAgICBsaW5lLWhlaWdodDogJGlucHV0LWhlaWdodDtcbiAgfVxuXG4gIC5kaXRvLWJ1dHRvbiB7XG4gICAgdHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZSwgY29sb3IgMHMsIGJhY2tncm91bmQgMHMsIGJvcmRlciAwcztcbiAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zO1xuICAgIHBhZGRpbmc6IDAgMC41ZW07XG5cbiAgICAmLXByZXYsXG4gICAgJi1uZXh0IHtcbiAgICAgICY6OmJlZm9yZSB7XG4gICAgICAgIEBleHRlbmQgJWljb24tYXJyb3c7XG4gICAgICB9XG4gICAgfVxuXG4gICAgJi1wcmV2OjpiZWZvcmUge1xuICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoLTEpO1xuICAgIH1cblxuICAgICYtZWxsaXBzaXMtcHJldixcbiAgICAmLWVsbGlwc2lzLW5leHQge1xuICAgICAgJjo6YmVmb3JlIHtcbiAgICAgICAgQGV4dGVuZCAlaWNvbi1lbGxpcHNpcztcbiAgICAgIH1cblxuICAgICAgJjpob3Zlcjo6YmVmb3JlIHtcbiAgICAgICAgQGV4dGVuZCAlaWNvbi1jaGV2cm9ucztcbiAgICAgIH1cblxuICAgICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAgIGJvcmRlcjogMDtcbiAgICAgIHBhZGRpbmc6IDA7XG4gICAgICBtYXJnaW46IDA7XG4gICAgICBjb2xvcjogJGNvbG9yLXRleHQ7XG5cbiAgICAgICY6Zm9jdXMge1xuICAgICAgICBjb2xvcjogJGNvbG9yLWFjdGl2ZTtcbiAgICAgIH1cblxuICAgICAgJjphY3RpdmUge1xuICAgICAgICBib3gtc2hhZG93OiBub25lO1xuICAgICAgfVxuICAgIH1cblxuICAgICYtZWxsaXBzaXMtcHJldjo6YmVmb3JlIHtcbiAgICAgIHRyYW5zZm9ybTogc2NhbGVYKC0xKTtcbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tc3dpdGNoKFxuICA6Y2xhc3M9XCJjbGFzc2VzXCJcbiAgOnN0eWxlPVwic3R5bGVzXCJcbilcbiAgLmRpdG8tc3dpdGNoLXBhbmVcbiAgICBpbnB1dChcbiAgICAgIDppZD1cImlkXCJcbiAgICAgIHJlZj1cImlucHV0XCJcbiAgICAgIHYtYmluZD1cIiRhdHRyc1wiXG4gICAgICB2LW1vZGVsPVwiY2hlY2tlZFwiXG4gICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgOm5hbWU9XCJuYW1lXCJcbiAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICApXG4gICAgLmRpdG8tc3dpdGNoLWJ1dHRvblxuICAgIHNwYW4uZGl0by1zd2l0Y2gtbGFiZWwoXG4gICAgICB2LWlmPVwibGFiZWxzXCJcbiAgICApXG4gICAgICBzbG90KFxuICAgICAgICB2LWlmPVwiY2hlY2tlZFwiXG4gICAgICAgIG5hbWU9XCJjaGVja2VkXCJcbiAgICAgICkge3sgbGFiZWxzLmNoZWNrZWQgfHwgJ29uJyB9fVxuICAgICAgc2xvdChcbiAgICAgICAgdi1lbHNlXG4gICAgICAgIG5hbWU9XCJ1bmNoZWNrZWRcIlxuICAgICAgKSB7eyBsYWJlbHMudW5jaGVja2VkIHx8ICdvZmYnIH19XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuZXhwb3J0IGRlZmF1bHQge1xuICBlbWl0czogWyd1cGRhdGU6bW9kZWxWYWx1ZScsICdjaGFuZ2UnXSxcblxuICBwcm9wczoge1xuICAgIG1vZGVsVmFsdWU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBpZDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBuYW1lOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgbGFiZWxzOiB7IHR5cGU6IFtPYmplY3QsIEJvb2xlYW5dLCBkZWZhdWx0OiBmYWxzZSB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY2hlY2tlZDogdGhpcy5tb2RlbFZhbHVlXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgY2xhc3NlcygpIHtcbiAgICAgIGNvbnN0IHsgY2hlY2tlZCwgZGlzYWJsZWQgfSA9IHRoaXNcbiAgICAgIHJldHVybiB7XG4gICAgICAgICdkaXRvLWNoZWNrZWQnOiBjaGVja2VkLFxuICAgICAgICAnZGl0by1kaXNhYmxlZCc6IGRpc2FibGVkXG4gICAgICB9XG4gICAgfSxcblxuICAgIHN0eWxlcygpIHtcbiAgICAgIGNvbnN0IHsgbGFiZWxzOiB7IGNoZWNrZWQsIHVuY2hlY2tlZCB9ID0ge30gfSA9IHRoaXNcbiAgICAgIC8vIENhbGN1bGF0ZSBgLS1zd2l0Y2gtd2lkdGhgIGluIGByZW1gLCBiYXNlZCBvbiBsYWJlbCBsZW5ndGguXG4gICAgICBjb25zdCBsZW5ndGggPSBNYXRoLm1heCgwLCBjaGVja2VkPy5sZW5ndGgsIHVuY2hlY2tlZD8ubGVuZ3RoKVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJy0tc3dpdGNoLXdpZHRoJzogbGVuZ3RoID8gYCR7bGVuZ3RoICogMS41fXJlbWAgOiBudWxsXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgbW9kZWxWYWx1ZShtb2RlbFZhbHVlKSB7XG4gICAgICB0aGlzLmNoZWNrZWQgPSBtb2RlbFZhbHVlXG4gICAgfSxcblxuICAgIGNoZWNrZWQoY2hlY2tlZCkge1xuICAgICAgaWYgKGNoZWNrZWQgIT09IHRoaXMubW9kZWxWYWx1ZSkge1xuICAgICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6bW9kZWxWYWx1ZScsIGNoZWNrZWQpXG4gICAgICAgIHRoaXMuJGVtaXQoJ2NoYW5nZScsIGNoZWNrZWQpXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBmb2N1cygpIHtcbiAgICAgIHRoaXMuJHJlZnMuaW5wdXQuZm9jdXMoKVxuICAgIH1cbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tc3dpdGNoIHtcbiAgLy8gVXNlIHdob2xlIG11bHRpcGxlcyBvZiBgcmVtYCBmb3Igc2l6ZXMgYW5kIGBweGAgbWFyZ2lucy9wYWRkaW5nIGFsb25nXG4gIC8vIHdpdGggYGNhbGMoKWAgdG8gZW5kIHVwIHdpdGggZXZlbiBwaXhlbCBzaXplcy4gYHJlbWAgaXMgbmVlZGVkIGJlY2F1c2Ugd2VcbiAgLy8gY2hhbmdlIGBmb250LXNpemVgIGluc2lkZSBgLmRpdG8tc3dpdGNoLWJ1dHRvbmBcbiAgLS1zd2l0Y2gtd2lkdGg6IDRyZW07XG4gIC0tc3dpdGNoLWhlaWdodDogMnJlbTtcbiAgLS1zd2l0Y2gtbWFyZ2luOiAycHg7XG4gIC0tc3dpdGNoLXBhZGRpbmc6IDNweDtcbiAgLS1zd2l0Y2gtc3BlZWQ6IDMwMG1zO1xuICAtLWxhYmVsLW1hcmdpbjogMC41ZW07XG4gIC0td2lkdGg6IGNhbGModmFyKC0tc3dpdGNoLXdpZHRoKSAtIDIgKiB2YXIoLS1zd2l0Y2gtbWFyZ2luKSk7XG4gIC0taGVpZ2h0OiBjYWxjKHZhcigtLXN3aXRjaC1oZWlnaHQpIC0gMiAqIHZhcigtLXN3aXRjaC1tYXJnaW4pKTtcbiAgLS1vZmZzZXQ6IGNhbGModmFyKC0td2lkdGgpIC0gdmFyKC0taGVpZ2h0KSk7XG5cbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGhlaWdodDogdmFyKC0tc3dpdGNoLWhlaWdodCk7XG4gIC8vIFRvIG1ha2UgaW5saW5lIGxhYmVscyBhcHBlYXIgb24gY29uc2lzdGVudCBiYXNlbGluZTpcbiAgdmVydGljYWwtYWxpZ246IGJvdHRvbTtcbiAgQGluY2x1ZGUgdXNlci1zZWxlY3Qobm9uZSk7XG5cbiAgLmRpdG8tc3dpdGNoLXBhbmUge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB3aWR0aDogdmFyKC0td2lkdGgpO1xuICAgIGhlaWdodDogdmFyKC0taGVpZ2h0KTtcbiAgfVxuXG4gIC5kaXRvLXN3aXRjaC1wYW5lLFxuICAuZGl0by1zd2l0Y2gtbGFiZWwge1xuICAgIHRvcDogNTAlO1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbiAgfVxuXG4gIGlucHV0IHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgYXBwZWFyYW5jZTogbm9uZTtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgYm9yZGVyLXJhZGl1czogMWVtO1xuICAgIGJhY2tncm91bmQ6ICRjb2xvci1saWdodDtcbiAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMC4zcywgYmFja2dyb3VuZC1jb2xvciAwLjNzO1xuICB9XG5cbiAgLmRpdG8tc3dpdGNoLWJ1dHRvbiB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIC8vIFNldCBmb250LXNpemUgdG8gaGVpZ2h0LCBzbyB3ZSBjYW4gdXNlIHdpZHRoL2hlaWdodCA9IDFlbSBmb3IgY2lyY2xlOlxuICAgIGZvbnQtc2l6ZTogY2FsYyh2YXIoLS1oZWlnaHQpIC0gMiAqIHZhcigtLXN3aXRjaC1wYWRkaW5nKSk7XG4gICAgdG9wOiB2YXIoLS1zd2l0Y2gtcGFkZGluZyk7XG4gICAgbGVmdDogdmFyKC0tc3dpdGNoLXBhZGRpbmcpO1xuICAgIHdpZHRoOiAxZW07XG4gICAgaGVpZ2h0OiAxZW07XG4gICAgYm9yZGVyLXJhZGl1czogMC41ZW07XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBiYWNrZ3JvdW5kOiAkY29sb3Itd2hpdGU7XG4gICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIHZhcigtLXN3aXRjaC1zcGVlZCk7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApO1xuICB9XG5cbiAgLmRpdG8tc3dpdGNoLWJ1dHRvbixcbiAgLmRpdG8tc3dpdGNoLWxhYmVsIHtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgfVxuXG4gIC5kaXRvLXN3aXRjaC1sYWJlbCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHJpZ2h0OiB2YXIoLS1sYWJlbC1tYXJnaW4pO1xuICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gICAgY29sb3I6ICRjb2xvci13aGl0ZTtcbiAgfVxuXG4gICYuZGl0by1jaGVja2VkIHtcbiAgICBpbnB1dCB7XG4gICAgICBiYWNrZ3JvdW5kOiAkY29sb3ItYWN0aXZlO1xuICAgIH1cblxuICAgIC5kaXRvLXN3aXRjaC1idXR0b24ge1xuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKHZhcigtLW9mZnNldCkpO1xuICAgIH1cblxuICAgIC5kaXRvLXN3aXRjaC1sYWJlbCB7XG4gICAgICBsZWZ0OiB2YXIoLS1sYWJlbC1tYXJnaW4pO1xuICAgICAgcmlnaHQ6IHVuc2V0O1xuICAgIH1cbiAgfVxuXG4gICYuZGl0by1kaXNhYmxlZCB7XG4gICAgQGV4dGVuZCAlYnV0dG9uLWRpc2FibGVkO1xuICB9XG5cbiAgJjpmb2N1cy13aXRoaW46bm90KDpob3Zlcikge1xuICAgIC5kaXRvLXN3aXRjaC1idXR0b24ge1xuICAgICAgYm94LXNoYWRvdzogJHNoYWRvdy1mb2N1cztcbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8c2NyaXB0PlxuaW1wb3J0IHsgaCBhcyBjcmVhdGVFbGVtZW50LCBUcmFuc2l0aW9uIH0gZnJvbSAndnVlJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZnVuY3Rpb24gVHJhbnNpdGlvbkhlaWdodCh7IGVuYWJsZWQgfSwgeyBzbG90cyB9KSB7XG4gIHJldHVybiBlbmFibGVkXG4gICAgPyBjcmVhdGVFbGVtZW50KFRyYW5zaXRpb24sIHByb3BzLCBzbG90cylcbiAgICA6IHNsb3RzLmRlZmF1bHQoKVxufVxuXG5UcmFuc2l0aW9uSGVpZ2h0LnByb3BzID0ge1xuICBlbmFibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWUgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBUcmFuc2l0aW9uSGVpZ2h0XG5cbmNvbnN0IHNldFN0eWxlID0gKGVsZW1lbnQsIHN0eWxlKSA9PiBPYmplY3QuYXNzaWduKGVsZW1lbnQuc3R5bGUsIHN0eWxlKVxuXG4vLyBGb3JjZSByZXBhaW50IHRvIG1ha2Ugc3VyZSB0aGUgYW5pbWF0aW9uIGlzIHRyaWdnZXJlZCBjb3JyZWN0bHkuXG5jb25zdCBmb3JjZVJlcGFpbnQgPSBlbGVtZW50ID0+IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkuaGVpZ2h0XG5cbmNvbnN0IHByb3BzID0ge1xuICBuYW1lOiAnaGVpZ2h0JyxcblxuICBvbkFmdGVyRW50ZXIoZWxlbWVudCkge1xuICAgIC8vIEEgdGltZW91dCBiZWZvcmUgc2V0dGluZyBzdHlsZSBpcyBvbmx5IHJlYWxseSBuZWVkZWQgYWZ0ZXIgY2FsbHMgdG9cbiAgICAvLyBgZm9yY2VSZXBhaW50KClgLCBidXQgdXNpbmcgb25lIGhlcmUgdG9vIHByZXNlcnZlcyBleGVjdXRpb24gc2VxdWVuY2Ugc29cbiAgICAvLyB0aGF0IHRoZSBjYWxsIGZyb20gYGVudGVyKClgIGNhbiBuZXZlciBvdXRydW4gdGhlIG9uZSBmcm9tIGBhZnRlckVudGVyKClgXG4gICAgc2V0VGltZW91dCgoKSA9PiBzZXRTdHlsZShlbGVtZW50LCB7IGhlaWdodDogJ2F1dG8nIH0pKVxuICB9LFxuXG4gIG9uRW50ZXIoZWxlbWVudCkge1xuICAgIGNvbnN0IHsgd2lkdGggfSA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudClcbiAgICBzZXRTdHlsZShlbGVtZW50LCB7XG4gICAgICB3aWR0aCxcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgdmlzaWJpbGl0eTogJ2hpZGRlbicsXG4gICAgICBoZWlnaHQ6ICdhdXRvJ1xuICAgIH0pXG4gICAgY29uc3QgeyBoZWlnaHQgfSA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudClcbiAgICBzZXRTdHlsZShlbGVtZW50LCB7XG4gICAgICB3aWR0aDogbnVsbCxcbiAgICAgIHBvc2l0aW9uOiBudWxsLFxuICAgICAgdmlzaWJpbGl0eTogbnVsbCxcbiAgICAgIGhlaWdodDogMFxuICAgIH0pXG4gICAgZm9yY2VSZXBhaW50KGVsZW1lbnQpXG4gICAgc2V0VGltZW91dCgoKSA9PiBzZXRTdHlsZShlbGVtZW50LCB7IGhlaWdodCB9KSlcbiAgfSxcblxuICBvbkxlYXZlKGVsZW1lbnQpIHtcbiAgICBjb25zdCB7IGhlaWdodCB9ID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KVxuICAgIHNldFN0eWxlKGVsZW1lbnQsIHsgaGVpZ2h0IH0pXG4gICAgZm9yY2VSZXBhaW50KGVsZW1lbnQpXG4gICAgc2V0VGltZW91dCgoKSA9PiBzZXRTdHlsZShlbGVtZW50LCB7IGhlaWdodDogMCB9KSlcbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuJGR1cmF0aW9uOiAwLjE1cztcblxuLmhlaWdodC1lbnRlci1hY3RpdmUsXG4uaGVpZ2h0LWxlYXZlLWFjdGl2ZSB7XG4gIHRyYW5zaXRpb246IGhlaWdodCAkZHVyYXRpb24gJGVhc2Utb3V0LXF1YXJ0O1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4uaGVpZ2h0LWVudGVyLWFjdGl2ZSB7XG4gIGFuaW1hdGlvbjogc2xpZGUtZW50ZXIgJGR1cmF0aW9uICRlYXNlLW91dC1xdWFydDtcbn1cblxuLmhlaWdodC1sZWF2ZS1hY3RpdmUge1xuICBhbmltYXRpb246IHNsaWRlLWxlYXZlICRkdXJhdGlvbiAkZWFzZS1vdXQtcXVhcnQ7XG59XG5cbi5oZWlnaHQtZW50ZXItZnJvbSxcbi5oZWlnaHQtbGVhdmUtdG8ge1xuICBoZWlnaHQ6IDA7XG59XG48L3N0eWxlPlxuIiwiaW1wb3J0IHsgZGVmaW5lQ29tcG9uZW50LCByZWYsIHdhdGNoLCBvblNjb3BlRGlzcG9zZSwgaCB9IGZyb20gJ3Z1ZS1kZW1pJztcbmltcG9ydCB7IGNyZWF0ZUZvY3VzVHJhcCB9IGZyb20gJ2ZvY3VzLXRyYXAnO1xuaW1wb3J0IHsgdW5yZWZFbGVtZW50IH0gZnJvbSAnQHZ1ZXVzZS9jb3JlJztcblxuY29uc3QgVXNlRm9jdXNUcmFwID0gLyogQF9fUFVSRV9fICovIC8qICNfX1BVUkVfXyAqLyBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIlVzZUZvY3VzVHJhcFwiLFxuICBwcm9wczogW1wiYXNcIiwgXCJvcHRpb25zXCJdLFxuICBzZXR1cChwcm9wcywgeyBzbG90cyB9KSB7XG4gICAgbGV0IHRyYXA7XG4gICAgY29uc3QgdGFyZ2V0ID0gcmVmKCk7XG4gICAgY29uc3QgYWN0aXZhdGUgPSAoKSA9PiB0cmFwICYmIHRyYXAuYWN0aXZhdGUoKTtcbiAgICBjb25zdCBkZWFjdGl2YXRlID0gKCkgPT4gdHJhcCAmJiB0cmFwLmRlYWN0aXZhdGUoKTtcbiAgICB3YXRjaChcbiAgICAgICgpID0+IHVucmVmRWxlbWVudCh0YXJnZXQpLFxuICAgICAgKGVsKSA9PiB7XG4gICAgICAgIGlmICghZWwpXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0cmFwID0gY3JlYXRlRm9jdXNUcmFwKGVsLCBwcm9wcy5vcHRpb25zIHx8IHt9KTtcbiAgICAgICAgYWN0aXZhdGUoKTtcbiAgICAgIH0sXG4gICAgICB7IGZsdXNoOiBcInBvc3RcIiB9XG4gICAgKTtcbiAgICBvblNjb3BlRGlzcG9zZSgoKSA9PiBkZWFjdGl2YXRlKCkpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBpZiAoc2xvdHMuZGVmYXVsdClcbiAgICAgICAgcmV0dXJuIGgocHJvcHMuYXMgfHwgXCJkaXZcIiwgeyByZWY6IHRhcmdldCB9LCBzbG90cy5kZWZhdWx0KCkpO1xuICAgIH07XG4gIH1cbn0pO1xuXG5leHBvcnQgeyBVc2VGb2N1c1RyYXAgfTtcbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1kaWFsb2coXG4gIHJlZj1cImRpYWxvZ1wiXG4gIHJvbGU9XCJkaWFsb2dcIlxuICBhcmlhLWV4cGFuZGVkPVwidHJ1ZVwiXG4gIGFyaWEtbW9kYWw9XCJ0cnVlXCJcbiAgOnN0eWxlPVwieyAnLS13aWR0aCc6IGAke3NldHRpbmdzLndpZHRofXB4YCB9XCJcbiAgQG1vdXNldXA9XCJvbk1vdXNlVXBcIlxuKVxuICBVc2VGb2N1c1RyYXAuZGl0by1kaWFsb2dfX2ZvY3VzLXRyYXAoXG4gICAgOm9wdGlvbnM9XCJ7IGltbWVkaWF0ZTogdHJ1ZSwgZmFsbGJhY2tGb2N1czogKCkgPT4gJHJlZnMuZGlhbG9nIH1cIlxuICApXG4gICAgZm9ybS5kaXRvLXNjcm9sbC1wYXJlbnQoXG4gICAgICBAc3VibWl0LnByZXZlbnQ9XCJzdWJtaXRcIlxuICAgIClcbiAgICAgIERpdG9TY2hlbWEuZGl0by1zY3JvbGwoXG4gICAgICAgIDpzY2hlbWE9XCJzY2hlbWFcIlxuICAgICAgICA6ZGF0YT1cImRpYWxvZ0RhdGFcIlxuICAgICAgKVxuICAgICAgICB0ZW1wbGF0ZSgjYnV0dG9ucylcbiAgICAgICAgICBEaXRvQnV0dG9ucy5kaXRvLWJ1dHRvbnMtbGFyZ2UoXG4gICAgICAgICAgICA6YnV0dG9ucz1cImJ1dHRvblNjaGVtYXNcIlxuICAgICAgICAgICAgOmRhdGE9XCJkaWFsb2dEYXRhXCJcbiAgICAgICAgICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IHsgY2xvbmUgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IHsgYWRkRXZlbnRzIH0gZnJvbSAnQGRpdG9qcy91aS9zcmMnXG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuaW1wb3J0IHsgZ2V0QnV0dG9uU2NoZW1hcyB9IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcbmltcG9ydCB7IFVzZUZvY3VzVHJhcCB9IGZyb20gJ0B2dWV1c2UvaW50ZWdyYXRpb25zL3VzZUZvY3VzVHJhcC9jb21wb25lbnQnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b0RpYWxvZycsIHtcbiAgY29tcG9uZW50czogeyBVc2VGb2N1c1RyYXAgfSxcbiAgZW1pdHM6IFsncmVtb3ZlJ10sXG5cbiAgcHJvdmlkZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJGRpYWxvZ0NvbXBvbmVudDogKCkgPT4gdGhpc1xuICAgIH1cbiAgfSxcblxuICBwcm9wczoge1xuICAgIGNvbXBvbmVudHM6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGJ1dHRvbnM6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHByb21pc2U6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGRhdGE6IHsgdHlwZTogT2JqZWN0LCBkZWZhdWx0OiAoKSA9PiAoe30pIH0sXG4gICAgc2V0dGluZ3M6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQ6ICgpID0+ICh7XG4gICAgICAgIHdpZHRoOiA0ODAsXG4gICAgICAgIGNsaWNrVG9DbG9zZTogZmFsc2VcbiAgICAgIH0pXG4gICAgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgLy8gTWFrZSBzdXJlIGRpYWxvZyBkYXRhIGNvbnRhaW5zIGFsbCB0aGUgZXhwZWN0ZWQga2V5c1xuICAgIGNvbnN0IGRpYWxvZ0RhdGEgPSBjbG9uZSh0aGlzLmRhdGEpXG4gICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5jb21wb25lbnRzKSB7XG4gICAgICBpZiAoIShrZXkgaW4gZGlhbG9nRGF0YSkpIHtcbiAgICAgICAgZGlhbG9nRGF0YVtrZXldID0gbnVsbFxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgd2luZG93RXZlbnRzOiBudWxsLFxuICAgICAgZGlhbG9nRGF0YVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGRpYWxvZ0NvbXBvbmVudCgpIHtcbiAgICAgIHJldHVybiB0aGlzXG4gICAgfSxcblxuICAgIHNjaGVtYSgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbXBvbmVudHM6IHRoaXMuY29tcG9uZW50c1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBidXR0b25TY2hlbWFzKCkge1xuICAgICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoZ2V0QnV0dG9uU2NoZW1hcyh0aGlzLmJ1dHRvbnMpKS5tYXAoXG4gICAgICAgICAgLy8gUHJvY2VzcyB0aGUgYnV0dG9uIHNjaGVtYXMgdG8gYWRkIGRlZmF1bHQgY2xpY2sgZXZlbnRzXG4gICAgICAgICAgLy8gZm9yIGJvdGggJ3N1Ym1pdCcgYW5kICdjYW5jZWwnIGJ1dHRvbnM6XG4gICAgICAgICAgKFtrZXksIHNjaGVtYV0pID0+IHtcbiAgICAgICAgICAgIGlmIChrZXkgPT09ICdjYW5jZWwnICYmICFzY2hlbWEuZXZlbnRzKSB7XG4gICAgICAgICAgICAgIHNjaGVtYSA9IHtcbiAgICAgICAgICAgICAgICAuLi5zY2hlbWEsXG4gICAgICAgICAgICAgICAgZXZlbnRzOiB7XG4gICAgICAgICAgICAgICAgICBjbGljazogKCkgPT4gdGhpcy5jYW5jZWwoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFtrZXksIHNjaGVtYV1cbiAgICAgICAgICB9XG4gICAgICAgIClcbiAgICAgIClcbiAgICB9LFxuXG4gICAgaGFzQnV0dG9ucygpIHtcbiAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmJ1dHRvblNjaGVtYXMpLmxlbmd0aCA+IDBcbiAgICB9LFxuXG4gICAgaGFzQ2FuY2VsKCkge1xuICAgICAgcmV0dXJuICEhdGhpcy5idXR0b25TY2hlbWFzLmNhbmNlbFxuICAgIH1cbiAgfSxcblxuICBtb3VudGVkKCkge1xuICAgIHRoaXMud2luZG93RXZlbnRzID0gYWRkRXZlbnRzKHdpbmRvdywge1xuICAgICAga2V5dXA6IGV2ZW50ID0+IHtcbiAgICAgICAgaWYgKCh0aGlzLmhhc0NhbmNlbCB8fCAhdGhpcy5oYXNCdXR0b25zKSAmJiBldmVudC5rZXlDb2RlID09PSAyNykge1xuICAgICAgICAgIHRoaXMuY2FuY2VsKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH0sXG5cbiAgdW5tb3VudGVkKCkge1xuICAgIHRoaXMud2luZG93RXZlbnRzLnJlbW92ZSgpXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIHJlbW92ZSgpIHtcbiAgICAgIHRoaXMuJGVtaXQoJ3JlbW92ZScpXG4gICAgfSxcblxuICAgIHJlc29sdmUodmFsdWUpIHtcbiAgICAgIHRoaXMucHJvbWlzZS5yZXNvbHZlKHZhbHVlKVxuICAgICAgdGhpcy5yZW1vdmUoKVxuICAgIH0sXG5cbiAgICByZWplY3QodmFsdWUpIHtcbiAgICAgIHRoaXMucHJvbWlzZS5yZWplY3QodmFsdWUpXG4gICAgICB0aGlzLnJlbW92ZSgpXG4gICAgfSxcblxuICAgIHN1Ym1pdCgpIHtcbiAgICAgIHRoaXMucmVzb2x2ZSh0aGlzLmRpYWxvZ0RhdGEpXG4gICAgfSxcblxuICAgIGNhbmNlbCgpIHtcbiAgICAgIHRoaXMucmVzb2x2ZShudWxsKVxuICAgIH0sXG5cbiAgICBjbG9zZSgpIHtcbiAgICAgIHRoaXMuY2FuY2VsKClcbiAgICB9LFxuXG4gICAgb25Nb3VzZVVwKCkge1xuICAgICAgaWYgKHRoaXMuc2V0dGluZ3MuY2xpY2tUb0Nsb3NlKSB7XG4gICAgICAgIHRoaXMuY2xvc2UoKVxuICAgICAgfVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLWRpYWxvZyB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgZGlzcGxheTogZmxleDtcbiAgaW5zZXQ6IDA7XG4gIHotaW5kZXg6IDIwMDA7XG4gIHBhZGRpbmc6ICRjb250ZW50LXBhZGRpbmc7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAvLyBQcmV2ZW50IHNjcm9sbGluZyBvZiB0aGUgcGFnZSBiZWhpbmQgdGhlIGRpYWxvZzpcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjIpO1xuXG4gICZfX2ZvY3VzLXRyYXAge1xuICAgIG1heC1oZWlnaHQ6IDEwMCU7XG4gIH1cblxuICAvLyBUT0RPOiBgJl9faW5uZXJgXG4gIGZvcm0ge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgYmFja2dyb3VuZDogd2hpdGU7XG4gICAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG4gICAgbWF4LXdpZHRoOiB2YXIoLS13aWR0aCwgNDgwcHgpO1xuICAgIG1heC1oZWlnaHQ6IDEwMCU7XG4gICAgYm94LXNoYWRvdzogMCAyMHB4IDYwcHggLTJweCByZ2JhKDI3LCAzMywgNTgsIDAuNCk7XG4gIH1cbn1cblxuLmRpdG8tZGlhbG9nLWVudGVyLWFjdGl2ZSxcbi5kaXRvLWRpYWxvZy1sZWF2ZS1hY3RpdmUge1xuICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMTVzO1xuXG4gIGZvcm0ge1xuICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjI1cztcbiAgfVxufVxuXG4uZGl0by1kaWFsb2ctZW50ZXItZnJvbSxcbi5kaXRvLWRpYWxvZy1sZWF2ZS10byB7XG4gIG9wYWNpdHk6IDA7XG5cbiAgZm9ybSB7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0yMHB4KTtcbiAgfVxufVxuPC9zdHlsZT5cbiIsImltcG9ydCB7IGlzT2JqZWN0IH0gZnJvbSAnQGRpdG9qcy91dGlscydcbmltcG9ydCB7IGFkZEV2ZW50cyB9IGZyb20gJ0BkaXRvanMvdWkvc3JjJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQge1xuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBkb21IYW5kbGVyczogW11cbiAgICB9XG4gIH0sXG5cbiAgdW5tb3VudGVkKCkge1xuICAgIGZvciAoY29uc3QgeyByZW1vdmUgfSBvZiB0aGlzLmRvbUhhbmRsZXJzKSB7XG4gICAgICByZW1vdmUoKVxuICAgIH1cbiAgICB0aGlzLmRvbUhhbmRsZXJzID0gW11cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZG9tT24oZWxlbWVudCwgdHlwZSwgaGFuZGxlcikge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYWRkRXZlbnRzKFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICBpc09iamVjdCh0eXBlKSA/IHR5cGUgOiB7IFt0eXBlXTogaGFuZGxlciB9XG4gICAgICApXG4gICAgICB0aGlzLmRvbUhhbmRsZXJzLnB1c2gocmVzdWx0KVxuICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cbiAgfVxufVxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLXJvb3RcbiAgVnVlTm90aWZpY2F0aW9ucy5kaXRvLW5vdGlmaWNhdGlvbnMoXG4gICAgcmVmPVwibm90aWZpY2F0aW9uc1wiXG4gICAgcG9zaXRpb249XCJ0b3AgcmlnaHRcIlxuICAgIGNsYXNzZXM9XCJkaXRvLW5vdGlmaWNhdGlvblwiXG4gIClcbiAgVHJhbnNpdGlvbkdyb3VwKG5hbWU9XCJkaXRvLWRpYWxvZ1wiKVxuICAgIERpdG9EaWFsb2coXG4gICAgICB2LWZvcj1cIihkaWFsb2csIGtleSkgaW4gZGlhbG9nc1wiXG4gICAgICA6a2V5PVwia2V5XCJcbiAgICAgIDpjb21wb25lbnRzPVwiZGlhbG9nLmNvbXBvbmVudHNcIlxuICAgICAgOmJ1dHRvbnM9XCJkaWFsb2cuYnV0dG9uc1wiXG4gICAgICA6cHJvbWlzZT1cImRpYWxvZy5wcm9taXNlXCJcbiAgICAgIDpkYXRhPVwiZGlhbG9nLmRhdGFcIlxuICAgICAgOnNldHRpbmdzPVwiZGlhbG9nLnNldHRpbmdzXCJcbiAgICAgIEByZW1vdmU9XCJyZW1vdmVEaWFsb2coa2V5KVwiXG4gICAgKVxuICBEaXRvTWVudVxuICBtYWluLmRpdG8tcGFnZS5kaXRvLXNjcm9sbC1wYXJlbnRcbiAgICBEaXRvSGVhZGVyKFxuICAgICAgOnNwaW5uZXI9XCJvcHRpb25zLnNwaW5uZXJcIlxuICAgICAgOmlzTG9hZGluZz1cImlzTG9hZGluZ1wiXG4gICAgKVxuICAgICAgRGl0b0FjY291bnQoXG4gICAgICAgIHYtaWY9XCJ1c2VyXCJcbiAgICAgIClcbiAgICAgIGEuZGl0by1sb2dpbihcbiAgICAgICAgdi1lbHNlLWlmPVwiYWxsb3dMb2dpblwiXG4gICAgICAgIEBjbGljaz1cInJvb3RDb21wb25lbnQubG9naW4oKVwiXG4gICAgICApXG4gICAgICAgIHNwYW4gTG9naW5cbiAgICBSb3V0ZXJWaWV3XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IHsgYXNBcnJheSwgbWFwQ29uY3VycmVudGx5LCBzdHJpcFRhZ3MgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCBEaXRvVXNlciBmcm9tICcuLi9EaXRvVXNlci5qcydcbmltcG9ydCBEaXRvVmlldyBmcm9tICcuLi9jb21wb25lbnRzL0RpdG9WaWV3LnZ1ZSdcbmltcG9ydCBEaXRvRGlhbG9nIGZyb20gJy4vRGl0b0RpYWxvZy52dWUnXG5pbXBvcnQgRG9tTWl4aW4gZnJvbSAnLi4vbWl4aW5zL0RvbU1peGluLmpzJ1xuaW1wb3J0IHtcbiAgcHJvY2Vzc1ZpZXcsXG4gIHJlc29sdmVTY2hlbWFzLFxuICBwcm9jZXNzU2NoZW1hQ29tcG9uZW50c1xufSBmcm9tICcuLi91dGlscy9zY2hlbWEuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b1Jvb3QnLCB7XG4gIG1peGluczogW0RvbU1peGluXSxcbiAgY29tcG9uZW50czogeyBEaXRvRGlhbG9nIH0sXG5cbiAgcHJvdmlkZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJHZpZXdzOiAoKSA9PiB0aGlzLnJlc29sdmVkVmlld3NcbiAgICB9XG4gIH0sXG5cbiAgcHJvcHM6IHtcbiAgICB1bnJlc29sdmVkVmlld3M6IHsgdHlwZTogW09iamVjdCwgRnVuY3Rpb24sIFByb21pc2VdLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIG9wdGlvbnM6IHsgdHlwZTogT2JqZWN0LCBkZWZhdWx0OiAoKSA9PiAoe30pIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICByZXNvbHZlZFZpZXdzOiB7fSxcbiAgICAgIHJlbW92ZVJvdXRlczogbnVsbCxcbiAgICAgIGRpYWxvZ3M6IHt9LFxuICAgICAgYWxsb3dMb2dpbjogZmFsc2UsXG4gICAgICBsb2FkaW5nQ291bnQ6IDBcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBub3RpZmljYXRpb25zKCkge1xuICAgICAgcmV0dXJuIHRoaXMuJHJlZnMubm90aWZpY2F0aW9uc1xuICAgIH0sXG5cbiAgICBpc0xvYWRpbmcoKSB7XG4gICAgICByZXR1cm4gdGhpcy5sb2FkaW5nQ291bnQgPiAwXG4gICAgfVxuICB9LFxuXG4gIGNyZWF0ZWQoKSB7XG4gICAgdGhpcy5hcHBTdGF0ZS50aXRsZSA9IGRvY3VtZW50LnRpdGxlIHx8ICdEaXRvLmpzIEFkbWluJ1xuICAgIC8vIFdpdGggaG90LXJlbG9hZGluZywgaXQgbG9va3MgbGlrZSBkZXN0cm95ZWQgaG9va3MgYXJlbid0IGFsd2F5cyBjYWxsZWRcbiAgICAvLyBmb3Igcm91dGUgY29tcG9uZW50cyBzbyByZXNldCB0aGUgYXJyYXkgb2YgcmVnaXN0ZXJlZCBjb21wb25lbnRzIGluc3RlYWQuXG4gICAgdGhpcy5hcHBTdGF0ZS5yb3V0ZUNvbXBvbmVudHMgPSBbXVxuICB9LFxuXG4gIGFzeW5jIG1vdW50ZWQoKSB7XG4gICAgLy8gQ2xlYXIgdGhlIGxhYmVsIG1hcmtlZCBhcyBhY3RpdmUgb24gYWxsIG1vdXNlIGFuZCBrZXlib2FyZCBldmVudHMsIGV4Y2VwdFxuICAgIC8vIHRoZSBvbmVzIHRoYXQgRGl0b0xhYmVsIGl0c2VsZiBpbnRlcmNlcHRzLlxuICAgIHRoaXMuZG9tT24oZG9jdW1lbnQsIHtcbiAgICAgIGNsaWNrOiBldmVudCA9PiB7XG4gICAgICAgIGlmICghZXZlbnQudGFyZ2V0LmNsb3Nlc3QoJy5kaXRvLWxhYmVsJykpIHtcbiAgICAgICAgICB0aGlzLmFwcFN0YXRlLmFjdGl2ZUxhYmVsID0gbnVsbFxuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICBrZXl1cDogZXZlbnQgPT4ge1xuICAgICAgICBpZiAoZXZlbnQuY29kZSA9PT0gJ1RhYicpIHtcbiAgICAgICAgICB0aGlzLmFwcFN0YXRlLmFjdGl2ZUxhYmVsID0gbnVsbFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgICB0cnkge1xuICAgICAgdGhpcy5hbGxvd0xvZ2luID0gZmFsc2VcbiAgICAgIGlmIChhd2FpdCB0aGlzLmZldGNoVXNlcigpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVzb2x2ZVZpZXdzKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHRoaXMubG9naW4oKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnIpXG4gICAgfVxuICAgIHRoaXMuYWxsb3dMb2dpbiA9IHRydWVcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgbm90aWZ5KHsgdHlwZSA9ICdpbmZvJywgdGl0bGUsIHRleHQgfSA9IHt9KSB7XG4gICAgICB0aXRsZSB8fD0gKFxuICAgICAgICB7XG4gICAgICAgICAgd2FybmluZzogJ1dhcm5pbmcnLFxuICAgICAgICAgIGVycm9yOiAnRXJyb3InLFxuICAgICAgICAgIGluZm86ICdJbmZvcm1hdGlvbicsXG4gICAgICAgICAgc3VjY2VzczogJ1N1Y2Nlc3MnXG4gICAgICAgIH1bdHlwZV0gfHxcbiAgICAgICAgJ05vdGlmaWNhdGlvbidcbiAgICAgIClcbiAgICAgIHRleHQgPSBgPHA+JHtcbiAgICAgICAgYXNBcnJheSh0ZXh0KS5qb2luKCc8L3A+IDxwPicpXG4gICAgICB9PC9wPmAucmVwbGFjZSgvXFxufFxcclxcbnxcXHIvZywgJzxicj4nKVxuICAgICAgY29uc3QgbG9nID0gKFxuICAgICAgICB7XG4gICAgICAgICAgd2FybmluZzogJ3dhcm4nLFxuICAgICAgICAgIGVycm9yOiAnZXJyb3InLFxuICAgICAgICAgIGluZm86ICdsb2cnLFxuICAgICAgICAgIHN1Y2Nlc3M6ICdsb2cnXG4gICAgICAgIH1bdHlwZV0gfHxcbiAgICAgICAgJ2Vycm9yJ1xuICAgICAgKVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGVbbG9nXShzdHJpcFRhZ3ModGV4dCkpXG4gICAgICBjb25zdCB7IG5vdGlmaWNhdGlvbnMgPSB0cnVlIH0gPSB0aGlzLmFwaVxuICAgICAgaWYgKG5vdGlmaWNhdGlvbnMpIHtcbiAgICAgICAgLy8gQ2FsY3VsYXRlIGRpc3BsYXktZHVyYXRpb24gZm9yIHRoZSBub3RpZmljYXRpb24gYmFzZWQgb24gaXRzIGNvbnRlbnRcbiAgICAgICAgLy8gYW5kIHRoZSBzZXR0aW5nIG9mIHRoZSBgZHVyYXRpb25GYWN0b3JgIGNvbmZpZ3VyYXRpb24uIEl0IGRlZmluZXMgdGhlXG4gICAgICAgIC8vIGFtb3VudCBvZiBtaWxsaXNlY29uZHMgbXVsdGlwbGllZCB3aXRoIHRoZSBhbW91bnQgb2YgY2hhcmFjdGVyc1xuICAgICAgICAvLyBkaXNwbGF5ZWQgaW4gdGhlIG5vdGlmaWNhdGlvbiwgcGx1cyA0MCAoNDAgKyB0aXRsZSArIG1lc3NhZ2UpOlxuICAgICAgICBjb25zdCB7IGR1cmF0aW9uRmFjdG9yID0gMjAgfSA9IG5vdGlmaWNhdGlvbnNcbiAgICAgICAgY29uc3QgZHVyYXRpb24gPSAoNDAgKyB0ZXh0Lmxlbmd0aCArIHRpdGxlLmxlbmd0aCkgKiBkdXJhdGlvbkZhY3RvclxuICAgICAgICB0aGlzLiRub3RpZnkoeyB0eXBlLCB0aXRsZSwgdGV4dCwgZHVyYXRpb24gfSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY2xvc2VOb3RpZmljYXRpb25zKCkge1xuICAgICAgdGhpcy5ub3RpZmljYXRpb25zLmRlc3Ryb3lBbGwoKVxuICAgIH0sXG5cbiAgICByZWdpc3RlckxvYWRpbmcoaXNMb2FkaW5nKSB7XG4gICAgICB0aGlzLmxvYWRpbmdDb3VudCArPSBpc0xvYWRpbmcgPyAxIDogLTFcbiAgICB9LFxuXG4gICAgc2hvd0RpYWxvZyh7IGNvbXBvbmVudHMsIGJ1dHRvbnMsIGRhdGEsIHNldHRpbmdzIH0pIHtcbiAgICAgIC8vIFNob3dzIGEgZGl0by1kaWFsb2cgY29tcG9uZW50IGFuZCB3cmFwcyBpdCBpbiBhIHByb21pc2Ugc28gdGhhdCB0aGVcbiAgICAgIC8vIGJ1dHRvbnMgaW4gdGhlIGRpYWxvZyBjYW4gdXNlIGBkaWFsb2cucmVzb2x2ZSgpYCBhbmQgYGRpYWxvZy5yZWplY3QoKWBcbiAgICAgIC8vIHRvIGNsb3NlIHRoZSBtb2RhbCBkaWFsb2cgYW5kIHJlc29sdmUgLyByZWplY3QgdGhlIHByb21pc2UgYXQgb25jZS5cbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWFzeW5jLXByb21pc2UtZXhlY3V0b3JcbiAgICAgICAgYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIC8vIFByb2Nlc3MgY29tcG9uZW50cyB0byByZXNvbHZlIGFzeW5jIHNjaGVtYXMuXG4gICAgICAgICAgY29uc3Qgcm91dGVzID0gW11cbiAgICAgICAgICBhd2FpdCBwcm9jZXNzU2NoZW1hQ29tcG9uZW50cyh0aGlzLmFwaSwgeyBjb21wb25lbnRzIH0sIHJvdXRlcywgMClcbiAgICAgICAgICBpZiAocm91dGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgJ0RpYWxvZ3MgZG8gbm90IHN1cHBvcnQgY29tcG9uZW50cyB0aGF0IHByb2R1Y2Ugcm91dGVzJ1xuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBrZXkgPSBgZGlhbG9nLSR7KytkaWFsb2dJZH1gXG4gICAgICAgICAgdGhpcy5kaWFsb2dzW2tleV0gPSB7XG4gICAgICAgICAgICBjb21wb25lbnRzLFxuICAgICAgICAgICAgYnV0dG9ucyxcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICBzZXR0aW5ncyxcbiAgICAgICAgICAgIHByb21pc2U6IHsgcmVzb2x2ZSwgcmVqZWN0IH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIClcbiAgICB9LFxuXG4gICAgcmVtb3ZlRGlhbG9nKGtleSkge1xuICAgICAgZGVsZXRlIHRoaXMuZGlhbG9nc1trZXldXG4gICAgfSxcblxuICAgIGFzeW5jIGxvZ2luKCkge1xuICAgICAgdGhpcy5hbGxvd0xvZ2luID0gdHJ1ZVxuICAgICAgY29uc3Qge1xuICAgICAgICBhZGRpdGlvbmFsQ29tcG9uZW50cyxcbiAgICAgICAgcmVkaXJlY3RBZnRlckxvZ2luXG4gICAgICB9ID0gdGhpcy5vcHRpb25zLmxvZ2luIHx8IHt9XG4gICAgICBjb25zdCBsb2dpbkRhdGEgPSBhd2FpdCB0aGlzLnNob3dEaWFsb2coe1xuICAgICAgICBjb21wb25lbnRzOiB7XG4gICAgICAgICAgdXNlcm5hbWU6IHtcbiAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgIGF1dG9mb2N1czogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgcGFzc3dvcmQ6IHtcbiAgICAgICAgICAgIHR5cGU6ICdwYXNzd29yZCdcbiAgICAgICAgICB9LFxuICAgICAgICAgIC4uLmFkZGl0aW9uYWxDb21wb25lbnRzXG4gICAgICAgIH0sXG4gICAgICAgIGJ1dHRvbnM6IHtcbiAgICAgICAgICBjYW5jZWw6IHtcbiAgICAgICAgICAgIHR5cGU6ICdidXR0b24nLFxuICAgICAgICAgICAgdGV4dDogJ0NhbmNlbCdcbiAgICAgICAgICAgIC8vIE5PVEU6IFRoZSBjbGljayBldmVudCBpcyBhZGRlZCBpbiBEaXRvRGlhbG9nLmJ1dHRvblNjaGVtYXMoKVxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBsb2dpbjoge1xuICAgICAgICAgICAgdHlwZTogJ3N1Ym1pdCcsXG4gICAgICAgICAgICB0ZXh0OiAnTG9naW4nXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgaWYgKGxvZ2luRGF0YSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5zZW5kUmVxdWVzdCh7XG4gICAgICAgICAgICByZXNvdXJjZTogdGhpcy5hcGkudXNlcnMubG9naW4sXG4gICAgICAgICAgICBkYXRhOiBsb2dpbkRhdGEsXG4gICAgICAgICAgICBpbnRlcm5hbDogdHJ1ZVxuICAgICAgICAgIH0pXG4gICAgICAgICAgaWYgKHJlZGlyZWN0QWZ0ZXJMb2dpbikge1xuICAgICAgICAgICAgbG9jYXRpb24ucmVwbGFjZShyZWRpcmVjdEFmdGVyTG9naW4pXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0VXNlcihyZXNwb25zZS5kYXRhLnVzZXIpXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJlc29sdmVWaWV3cygpXG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IGVyci5yZXNwb25zZT8uZGF0YT8uZXJyb3JcbiAgICAgICAgICB0aGlzLm5vdGlmeSh7XG4gICAgICAgICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgICAgICAgdGl0bGU6ICdBdXRoZW50aWNhdGlvbiBFcnJvcicsXG4gICAgICAgICAgICB0ZXh0OiBlcnJvciB8fCBlcnJcbiAgICAgICAgICB9KVxuICAgICAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyLCBlcnIucmVzcG9uc2UpXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMubG9naW4oKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIG5hdmlnYXRlSG9tZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLm5hdmlnYXRlKCcvJylcbiAgICB9LFxuXG4gICAgYXN5bmMgbG9nb3V0KCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnNlbmRSZXF1ZXN0KHtcbiAgICAgICAgICByZXNvdXJjZTogdGhpcy5hcGkudXNlcnMubG9nb3V0LFxuICAgICAgICAgIGludGVybmFsOiB0cnVlXG4gICAgICAgIH0pXG4gICAgICAgIGlmIChyZXNwb25zZS5kYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgICB0aGlzLnNldFVzZXIobnVsbClcbiAgICAgICAgICB0aGlzLm5hdmlnYXRlSG9tZSgpXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycilcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgZmV0Y2hVc2VyKCkge1xuICAgICAgbGV0IHVzZXIgPSBudWxsXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuc2VuZFJlcXVlc3Qoe1xuICAgICAgICAgIHJlc291cmNlOiB0aGlzLmFwaS51c2Vycy5zZXNzaW9uLFxuICAgICAgICAgIGludGVybmFsOiB0cnVlXG4gICAgICAgIH0pXG4gICAgICAgIHVzZXIgPSByZXNwb25zZS5kYXRhLnVzZXIgfHwgbnVsbFxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRoaXMubm90aWZ5KHtcbiAgICAgICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgICAgIHRpdGxlOiAnQXV0aGVudGljYXRpb24gRXJyb3InLFxuICAgICAgICAgIHRleHQ6IGVyclxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgdGhpcy5zZXRVc2VyKHVzZXIpXG4gICAgICByZXR1cm4gdXNlclxuICAgIH0sXG5cbiAgICBzZXRVc2VyKHVzZXIpIHtcbiAgICAgIHRoaXMuYXBwU3RhdGUudXNlciA9IChcbiAgICAgICAgdXNlciAmJlxuICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodXNlciwgRGl0b1VzZXIucHJvdG90eXBlKVxuICAgICAgKVxuICAgICAgLy8gQ2xlYXIgcmVzb2x2ZWQgdmlld3Mgd2hlbiB1c2VyIGlzIGxvZ2dlZCBvdXQuXG4gICAgICBpZiAoIXVzZXIpIHtcbiAgICAgICAgdGhpcy5yZXNvbHZlZFZpZXdzID0ge31cbiAgICAgICAgdGhpcy5uYXZpZ2F0ZUhvbWUoKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBlbnN1cmVVc2VyKCkge1xuICAgICAgaWYgKCEoYXdhaXQgdGhpcy5mZXRjaFVzZXIoKSkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5sb2dpbigpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIHJlc29sdmVWaWV3cygpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMucmVzb2x2ZWRWaWV3cyA9IGF3YWl0IHJlc29sdmVTY2hlbWFzKHRoaXMudW5yZXNvbHZlZFZpZXdzKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKCFlcnJvci5yZXF1ZXN0KSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcilcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5sb2dpbigpXG4gICAgICB9XG4gICAgICAvLyBDb2xsZWN0IGFsbCByb3V0ZXMgZnJvbSB0aGUgcm9vdCBzY2hlbWEgY29tcG9uZW50c1xuICAgICAgY29uc3Qgcm91dGVzID0gYXdhaXQgbWFwQ29uY3VycmVudGx5KFxuICAgICAgICBPYmplY3QuZW50cmllcyh0aGlzLnJlc29sdmVkVmlld3MpLFxuICAgICAgICAoW25hbWUsIHNjaGVtYV0pID0+IHByb2Nlc3NWaWV3KERpdG9WaWV3LCB0aGlzLmFwaSwgc2NoZW1hLCBuYW1lKVxuICAgICAgKVxuICAgICAgLy8gTm93IHRoYXQgdGhlIHJvdXRlcyBhcmUgbG9hZGVkLCByZXBsYWNlIGFsbCBleGlzdGluZyByb3V0ZXMgd2l0aCB0aGVcbiAgICAgIC8vIG5ldyByb3V0ZXMsIGFuZCByZXN0b3JlIHRoZSBjdXJyZW50IHBhdGguXG4gICAgICBjb25zdCB7IGZ1bGxQYXRoIH0gPSB0aGlzLiRyb3V0ZVxuICAgICAgdGhpcy5yZW1vdmVSb3V0ZXM/LigpXG4gICAgICB0aGlzLnJlbW92ZVJvdXRlcyA9IGFkZFJvdXRlcyh0aGlzLiRyb3V0ZXIsIFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdyb290JyxcbiAgICAgICAgICBwYXRoOiAnLycsXG4gICAgICAgICAgY29tcG9uZW50czoge31cbiAgICAgICAgfSxcbiAgICAgICAgLi4ucm91dGVzXG4gICAgICBdKVxuICAgICAgdGhpcy4kcm91dGVyLnJlcGxhY2UoZnVsbFBhdGgpXG4gICAgfVxuICB9XG59KVxuXG5sZXQgZGlhbG9nSWQgPSAwXG5cbmZ1bmN0aW9uIGFkZFJvdXRlcyhyb3V0ZXIsIHJvdXRlcykge1xuICBjb25zdCByZW1vdmVycyA9IFtdXG4gIGZvciAoY29uc3Qgcm91dGUgb2Ygcm91dGVzKSB7XG4gICAgY29uc3QgcmVtb3ZlUm91dGUgPSByb3V0ZXIuYWRkUm91dGUocm91dGUpXG4gICAgcmVtb3ZlcnMucHVzaChyZW1vdmVSb3V0ZSlcbiAgfVxuXG4gIHJldHVybiAoKSA9PiB7XG4gICAgZm9yIChjb25zdCByZW1vdmUgb2YgcmVtb3ZlcnMpIHtcbiAgICAgIHJlbW92ZSgpXG4gICAgfVxuICB9XG59XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvc3R5bGUnO1xuXG4uZGl0by1hcHAsXG4uZGl0by1yb290IHtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgZGlzcGxheTogZmxleDtcbn1cblxuLmRpdG8tcm9vdCB7XG4gIC5kaXRvLXBhZ2Uge1xuICAgIGJhY2tncm91bmQ6ICRjb250ZW50LWNvbG9yLWJhY2tncm91bmQ7XG4gICAgLy8gVGhlIHJvb3QtbGV2ZWwgdmlld3MgYW5kIGZvcm1zIG1heSBoYXZlIGEgYC5kaXRvLXNjaGVtYS1oZWFkZXJgIHRoYXRcbiAgICAvLyBzaG91bGQgYXBwZWFyIGxheWVyZWQgb3ZlciBgLmRpdG8tbWVudWAsIHdoaWxlIGhhdmluZyBgb3ZlcmxheTogaGlkZGVuYFxuICAgIC8vIHNldCBieSBgLmRpdG8tc2Nyb2xsLXBhcmVudGAgdG8gZGVsZWdhdGUgc2Nyb2xsaW5nIHRvIGAuZGl0by1zY3JvbGxgLlxuICAgIC8vIEluIG9yZGVyIHRvIG5vdCBoYXZlIHRoZSBoZWFkZXIgY2xpcHBlZCwgYWRqdXN0IHRoZSB0b3AgaGVyZTpcbiAgICA+IC5kaXRvLWZvcm0sXG4gICAgPiAuZGl0by12aWV3IHtcbiAgICAgIG1hcmdpbi10b3A6IC0kbWVudS1oZWlnaHQ7XG4gICAgICBwYWRkaW5nLXRvcDogJG1lbnUtaGVpZ2h0O1xuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG5uYXYuZGl0by1tZW51LmRpdG8tc2Nyb2xsLXBhcmVudFxuICBoMSB7eyBhcHBTdGF0ZS50aXRsZSB9fVxuICB1bC5kaXRvLXNjcm9sbFxuICAgIGxpKFxuICAgICAgdi1mb3I9XCJ2aWV3IGluIHZpZXdzXCJcbiAgICApXG4gICAgICBSb3V0ZXJMaW5rKFxuICAgICAgICB2LWlmPVwic2hvdWxkUmVuZGVyKHZpZXcpXCJcbiAgICAgICAgdi1zbG90PVwieyBpc0FjdGl2ZSwgaHJlZiwgcm91dGUgfVwiXG4gICAgICAgIGN1c3RvbVxuICAgICAgICA6dG89XCJgLyR7dmlldy5wYXRofWBcIlxuICAgICAgKVxuICAgICAgICBhLmRpdG8tbGluayhcbiAgICAgICAgICA6aHJlZj1cImhyZWZcIlxuICAgICAgICAgIDpjbGFzcz1cInsgJ2RpdG8tYWN0aXZlJzogaXNBY3RpdmUgfVwiXG4gICAgICAgICAgQGNsaWNrLnByZXZlbnQ9XCJvbkNsaWNrTGluayhyb3V0ZSlcIlxuICAgICAgICApIHt7IGdldExhYmVsKHZpZXcpIH19XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvTWVudScsIHtcbiAgbWV0aG9kczoge1xuICAgIG9uQ2xpY2tMaW5rKHJvdXRlKSB7XG4gICAgICB0aGlzLiRyb3V0ZXIucHVzaCh7IC4uLnJvdXRlLCBmb3JjZTogdHJ1ZSB9KVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLW1lbnUge1xuICBmbGV4OiBpbml0aWFsO1xuICBmb250LXNpemU6ICRtZW51LWZvbnQtc2l6ZTtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgQGluY2x1ZGUgdXNlci1zZWxlY3Qobm9uZSk7XG5cbiAgdWwge1xuICAgIGJhY2tncm91bmQ6ICRjb2xvci1saWdodGVyO1xuICAgIGJvcmRlci1yaWdodDogJGJvcmRlci1zdHlsZTtcbiAgfVxuXG4gIGEsXG4gIGgxIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgfVxuXG4gIGgxIHtcbiAgICBwYWRkaW5nOiAkbWVudS1wYWRkaW5nO1xuICAgIGxpbmUtaGVpZ2h0OiAkbWVudS1saW5lLWhlaWdodDtcbiAgICBmb250LXdlaWdodDogYm9sZDtcbiAgICBiYWNrZ3JvdW5kOiAkY29sb3ItZGFya2VyO1xuICAgIGJvcmRlci1yaWdodDogJGJvcmRlci13aWR0aCBzb2xpZCAkY29sb3ItZGFya2VzdDtcbiAgICBjb2xvcjogJGNvbG9yLXdoaXRlO1xuICB9XG5cbiAgLmRpdG8tbGluayB7XG4gICAgcGFkZGluZzogJG1lbnUtcGFkZGluZztcbiAgICBsaW5lLWhlaWdodDogJG1lbnUtbGluZS1oZWlnaHQ7XG5cbiAgICAmLmRpdG8tYWN0aXZlIHtcbiAgICAgIGNvbG9yOiAkY29sb3Itd2hpdGU7XG4gICAgICBiYWNrZ3JvdW5kOiAkY29sb3ItYWN0aXZlO1xuICAgIH1cbiAgfVxufVxuXG4uZGl0by1saW5rIHtcbiAgJjpmb2N1czpub3QoOmFjdGl2ZSwgLmRpdG8tYWN0aXZlKSB7XG4gICAgYm94LXNoYWRvdzogJHNoYWRvdy1mb2N1cztcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1zcGlubmVyKFxuICB2LXNob3c9XCJsb2FkaW5nXCJcbilcbiAgLy8tIFRPRE86IENvbnZlcnQgdG8gQkVNXG4gIC52LXB1bHNlLnYtcHVsc2UxKDpzdHlsZT1cIltzcGlubmVyU3R5bGUsIHNwaW5uZXJEZWxheTFdXCIpXG4gIC52LXB1bHNlLnYtcHVsc2UyKDpzdHlsZT1cIltzcGlubmVyU3R5bGUsIHNwaW5uZXJEZWxheTJdXCIpXG4gIC52LXB1bHNlLnYtcHVsc2UzKDpzdHlsZT1cIltzcGlubmVyU3R5bGUsIHNwaW5uZXJEZWxheTNdXCIpXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuZXhwb3J0IGRlZmF1bHQge1xuICBwcm9wczoge1xuICAgIGxvYWRpbmc6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfSxcbiAgICBjb2xvcjoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJyM1ZGM1OTYnXG4gICAgfSxcbiAgICBzaXplOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiAnMTVweCdcbiAgICB9LFxuICAgIG1hcmdpbjoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJzJweCdcbiAgICB9LFxuICAgIHJhZGl1czoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJzEwMCUnXG4gICAgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgLy8gVE9ETzogQ29udmVydCB0byB1c2luZyBvbmx5IGNsYXNzZXNcbiAgICByZXR1cm4ge1xuICAgICAgc3Bpbm5lclN0eWxlOiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogdGhpcy5jb2xvcixcbiAgICAgICAgd2lkdGg6IHRoaXMuc2l6ZSxcbiAgICAgICAgaGVpZ2h0OiB0aGlzLnNpemUsXG4gICAgICAgIG1hcmdpbjogdGhpcy5tYXJnaW4sXG4gICAgICAgIGJvcmRlclJhZGl1czogdGhpcy5yYWRpdXMsXG4gICAgICAgIGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snLFxuICAgICAgICBhbmltYXRpb25OYW1lOiAndi1wdWxzZVN0cmV0Y2hEZWxheScsXG4gICAgICAgIGFuaW1hdGlvbkR1cmF0aW9uOiAnMC43NXMnLFxuICAgICAgICBhbmltYXRpb25JdGVyYXRpb25Db3VudDogJ2luZmluaXRlJyxcbiAgICAgICAgYW5pbWF0aW9uVGltaW5nRnVuY3Rpb246ICdjdWJpYy1iZXppZXIoLjIsLjY4LC4xOCwxLjA4KScsXG4gICAgICAgIGFuaW1hdGlvbkZpbGxNb2RlOiAnYm90aCdcbiAgICAgIH0sXG4gICAgICBzcGlubmVyRGVsYXkxOiB7XG4gICAgICAgIGFuaW1hdGlvbkRlbGF5OiAnMC4xMnMnXG4gICAgICB9LFxuICAgICAgc3Bpbm5lckRlbGF5Mjoge1xuICAgICAgICBhbmltYXRpb25EZWxheTogJzAuMjRzJ1xuICAgICAgfSxcbiAgICAgIHNwaW5uZXJEZWxheTM6IHtcbiAgICAgICAgYW5pbWF0aW9uRGVsYXk6ICcwLjM2cydcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBrZXlmcmFtZXMgdi1wdWxzZVN0cmV0Y2hEZWxheSB7XG4gIDAlLFxuICA4MCUge1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7XG4gICAgb3BhY2l0eTogMTtcbiAgfVxuXG4gIDQ1JSB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgwLjEpO1xuICAgIG9wYWNpdHk6IDAuNztcbiAgfVxufVxuXG5Aa2V5ZnJhbWVzIHYtcHVsc2VTdHJldGNoRGVsYXkge1xuICAwJSxcbiAgODAlIHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xuICAgIG9wYWNpdHk6IDE7XG4gIH1cblxuICA0NSUge1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMC4xKTtcbiAgICBvcGFjaXR5OiAwLjc7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxubmF2LmRpdG8taGVhZGVyXG4gIC5kaXRvLXRyYWlsXG4gICAgdWxcbiAgICAgIGxpKFxuICAgICAgICB2LWZvcj1cIihjb21wb25lbnQsIGluZGV4KSBpbiB0cmFpbFwiXG4gICAgICApXG4gICAgICAgIHRlbXBsYXRlKFxuICAgICAgICAgIHYtaWY9XCJpbmRleCA9PT0gdHJhaWwubGVuZ3RoIC0gMVwiXG4gICAgICAgIClcbiAgICAgICAgICBzcGFuKDpjbGFzcz1cImdldEJyZWFkY3J1bWJDbGFzcyhjb21wb25lbnQpXCIpXG4gICAgICAgICAgICB8IHt7IGNvbXBvbmVudC5icmVhZGNydW1iIH19XG4gICAgICAgIFJvdXRlckxpbmsuZGl0by1icmVhZGNydW1iKFxuICAgICAgICAgIHYtZWxzZVxuICAgICAgICAgIDp0bz1cImNvbXBvbmVudC5wYXRoXCJcbiAgICAgICAgKVxuICAgICAgICAgIHNwYW4oOmNsYXNzPVwiZ2V0QnJlYWRjcnVtYkNsYXNzKGNvbXBvbmVudClcIilcbiAgICAgICAgICAgIHwge3sgY29tcG9uZW50LmJyZWFkY3J1bWIgfX1cbiAgICBEaXRvU3Bpbm5lcihcbiAgICAgIHYtaWY9XCJpc0xvYWRpbmdcIlxuICAgIClcbiAgc2xvdFxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5pbXBvcnQgRGl0b1NwaW5uZXIgZnJvbSAnLi9EaXRvU3Bpbm5lci52dWUnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b0hlYWRlcicsIHtcbiAgY29tcG9uZW50czogeyBEaXRvU3Bpbm5lciB9LFxuXG4gIHByb3BzOiB7XG4gICAgc3Bpbm5lcjoge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdDogbnVsbFxuICAgIH0sXG4gICAgaXNMb2FkaW5nOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICB0cmFpbCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmFwcFN0YXRlLnJvdXRlQ29tcG9uZW50cy5maWx0ZXIoXG4gICAgICAgIGNvbXBvbmVudCA9PiAhIWNvbXBvbmVudC5yb3V0ZVJlY29yZFxuICAgICAgKVxuICAgIH1cbiAgfSxcblxuICBjcmVhdGVkKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHNpemUgPSAnOHB4JyxcbiAgICAgIGNvbG9yID0gJyM5OTknXG4gICAgfSA9IHRoaXMuc3Bpbm5lciB8fCB7fVxuICAgIC8vIFRPRE86IFRoaXMgaXMgYSBoYWNrIHRvIHNldCB0aGUgZGVmYXVsdCBwcm9wcyBmb3IgdGhlIERpdG9TcGlubmVyLlxuICAgIC8vIFBhc3MgdGhlbSBvbiB0aHJvdWdoIHRoZSB0ZW1wbGF0ZSBpbnN0ZWFkIVxuICAgIGNvbnN0IHsgcHJvcHMgfSA9IERpdG9TcGlubmVyXG4gICAgcHJvcHMuc2l6ZS5kZWZhdWx0ID0gc2l6ZVxuICAgIHByb3BzLmNvbG9yLmRlZmF1bHQgPSBjb2xvclxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBnZXRCcmVhZGNydW1iQ2xhc3MoY29tcG9uZW50KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAnZGl0by1kaXJ0eSc6IGNvbXBvbmVudC5pc0RpcnR5XG4gICAgICB9XG4gICAgfVxuICB9XG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8taGVhZGVyIHtcbiAgYmFja2dyb3VuZDogJGNvbG9yLWJsYWNrO1xuICBmb250LXNpemU6ICRtZW51LWZvbnQtc2l6ZTtcbiAgbGluZS1oZWlnaHQ6ICRtZW51LWxpbmUtaGVpZ2h0O1xuICB6LWluZGV4OiAkbWVudS16LWluZGV4O1xuICBAaW5jbHVkZSB1c2VyLXNlbGVjdChub25lKTtcblxuICBzcGFuIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgcGFkZGluZzogJG1lbnUtcGFkZGluZztcbiAgICBjb2xvcjogJGNvbG9yLXdoaXRlO1xuICB9XG5cbiAgLmRpdG8tdHJhaWwge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBoZWlnaHQ6IDNlbTtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBtYXgtd2lkdGg6ICRjb250ZW50LXdpZHRoICsgJGNvbnRlbnQtcGFkZGluZztcblxuICAgIHVsIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgfVxuXG4gICAgYSB7XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIHBhZGRpbmctcmlnaHQ6IDAuNGVtO1xuXG4gICAgICAkYW5nbGU6IDMzZGVnO1xuXG4gICAgICAmOmhvdmVyIHtcbiAgICAgICAgY29sb3I6ICM5OTk5OTk7XG4gICAgICB9XG5cbiAgICAgICY6OmJlZm9yZSxcbiAgICAgICY6OmFmdGVyIHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICBjb250ZW50OiAnJztcbiAgICAgICAgd2lkdGg6IDFweDtcbiAgICAgICAgaGVpZ2h0OiAxLjJlbTtcbiAgICAgICAgcmlnaHQ6IC0xcHg7XG4gICAgICAgIGJhY2tncm91bmQ6ICRjb2xvci1kYXJrO1xuICAgICAgfVxuXG4gICAgICAmOjpiZWZvcmUge1xuICAgICAgICB0b3A6IDUwJTtcbiAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoJGFuZ2xlKTtcbiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogdG9wO1xuICAgICAgfVxuXG4gICAgICAmOjphZnRlciB7XG4gICAgICAgIGJvdHRvbTogNTAlO1xuICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtJGFuZ2xlKTtcbiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogYm90dG9tO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC5kaXRvLXNwaW5uZXIge1xuICAgIG1hcmdpbi10b3A6ICRtZW51LXBhZGRpbmctdmVyO1xuICB9XG5cbiAgLmRpdG8tZGlydHkge1xuICAgICY6OmFmdGVyIHtcbiAgICAgIGNvbnRlbnQ6ICcnO1xuICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogJGNvbG9yLXdoaXRlO1xuICAgICAgd2lkdGg6IDhweDtcbiAgICAgIGhlaWdodDogOHB4O1xuICAgICAgbWFyZ2luOiAycHg7XG4gICAgICBtYXJnaW4tbGVmdDogMC41ZW07XG4gICAgICBib3JkZXItcmFkaXVzOiAxMDAlO1xuICAgIH1cbiAgfVxuXG4gIC5kaXRvLWFjY291bnQsXG4gIC5kaXRvLWxvZ2luIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAwO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgfVxuXG4gIC5kaXRvLWFjY291bnQge1xuICAgIGxlZnQ6ICRjb250ZW50LXdpZHRoICsgJGNvbnRlbnQtcGFkZGluZyAqIDI7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCJpbXBvcnQgRG9tTWl4aW4gZnJvbSAnLi9Eb21NaXhpbi5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgbWl4aW5zOiBbRG9tTWl4aW5dLFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHB1bGxkb3duOiB7XG4gICAgICAgIG9wZW46IGZhbHNlLFxuICAgICAgICBzdGFydFRpbWU6IDAsXG4gICAgICAgIGNoZWNrVGltZTogdHJ1ZSxcbiAgICAgICAgZXZlbnRzOiB7XG4gICAgICAgICAgbW91c2Vkb3duOiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldFB1bGxkb3duT3BlbihmYWxzZSlcbiAgICAgICAgICAgIHRoaXMucHVsbGRvd24uaGFuZGxlcnMucmVtb3ZlKClcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgbW91c2V1cDogKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMub25QdWxsZG93bk1vdXNlVXAobnVsbCkpIHtcbiAgICAgICAgICAgICAgdGhpcy5wdWxsZG93bi5oYW5kbGVycy5yZW1vdmUoKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgaGFuZGxlcnM6IG51bGxcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIG9uUHVsbGRvd25Nb3VzZURvd24odmFsdWUpIHtcbiAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgdGhpcy5zZXRQdWxsZG93bk9wZW4odHJ1ZSlcbiAgICAgICAgdGhpcy5jaGVja1RpbWUgPSB0cnVlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNoZWNrVGltZSA9IGZhbHNlXG4gICAgICB9XG4gICAgfSxcblxuICAgIG9uUHVsbGRvd25Nb3VzZVVwKHZhbHVlKSB7XG4gICAgICBjb25zdCB7IHN0YXJ0VGltZSB9ID0gdGhpcy5wdWxsZG93blxuICAgICAgaWYgKCF0aGlzLmNoZWNrVGltZSB8fCBzdGFydFRpbWUgJiYgKERhdGUubm93KCkgLSBzdGFydFRpbWUgPiAyNTApKSB7XG4gICAgICAgIHRoaXMuc2V0UHVsbGRvd25PcGVuKGZhbHNlKVxuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICB0aGlzLm9uUHVsbGRvd25TZWxlY3QodmFsdWUpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgb25QdWxsZG93blNlbGVjdCgvKiB2YWx1ZSAqLykge1xuICAgICAgLy8gTk9URTogVG8gYmUgb3ZlcnJpZGRlbi5cbiAgICB9LFxuXG4gICAgc2V0UHVsbGRvd25PcGVuKG9wZW4pIHtcbiAgICAgIHRoaXMucHVsbGRvd24ub3BlbiA9IG9wZW5cbiAgICAgIHRoaXMucHVsbGRvd24uc3RhcnRUaW1lID0gb3BlbiA/IERhdGUubm93KCkgOiAwXG4gICAgICBpZiAob3Blbikge1xuICAgICAgICB0aGlzLnB1bGxkb3duLmhhbmRsZXJzID0gdGhpcy5kb21Pbihkb2N1bWVudCwgdGhpcy5wdWxsZG93bi5ldmVudHMpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tYWNjb3VudFxuICBhKFxuICAgIEBtb3VzZWRvd24uc3RvcD1cIm9uUHVsbGRvd25Nb3VzZURvd24oKVwiXG4gIClcbiAgICBzcGFuIHt7IHVzZXIudXNlcm5hbWUgfX1cbiAgdWwuZGl0by1wdWxsZG93big6Y2xhc3M9XCJ7ICdkaXRvLW9wZW4nOiBwdWxsZG93bi5vcGVuIH1cIilcbiAgICBsaShcbiAgICAgIHYtZm9yPVwiKGxhYmVsLCB2YWx1ZSkgb2YgaXRlbXNcIlxuICAgIClcbiAgICAgIGEoXG4gICAgICAgIEBtb3VzZWRvd24uc3RvcD1cIm9uUHVsbGRvd25Nb3VzZURvd24odmFsdWUpXCJcbiAgICAgICAgQG1vdXNldXA9XCJvblB1bGxkb3duTW91c2VVcCh2YWx1ZSlcIlxuICAgICAgKSB7eyBsYWJlbCB9fVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5pbXBvcnQgUHVsbGRvd25NaXhpbiBmcm9tICcuLi9taXhpbnMvUHVsbGRvd25NaXhpbi5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvQWNjb3VudCcsIHtcbiAgbWl4aW5zOiBbUHVsbGRvd25NaXhpbl0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaXRlbXM6IHtcbiAgICAgICAgc2V0dGluZ3M6ICdTZXR0aW5ncycsXG4gICAgICAgIGxvZ291dDogJ0xvZ291dCdcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIG9uUHVsbGRvd25TZWxlY3QodmFsdWUpIHtcbiAgICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgICAgY2FzZSAnbG9nb3V0JzpcbiAgICAgICAgICB0aGlzLnJvb3RDb21wb25lbnQubG9nb3V0KClcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdzZXR0aW5ncyc6XG4gICAgICAgICAgY29uc29sZS5pbmZvKCdUT0RPOiBJbXBsZW1lbnQgU2V0dGluZ3MnKVxuICAgICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuICB9XG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tYWNjb3VudCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcblxuICAuZGl0by1wdWxsZG93biB7XG4gICAgdG9wOiAkcHVsbGRvd24tcGFkZGluZy12ZXI7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuY29tcG9uZW50KFxuICB2LWlmPVwiY29udGVudFwiXG4gIDppcz1cIm9wdGlvbnMudGFnIHx8IHRhZ1wiXG4gIDpjbGFzcz1cImNsYXNzZXNcIlxuICA6c3R5bGU9XCJzdHlsZXNcIlxuKSB7eyBvcHRpb25zLnRleHQgfX1cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuaW1wb3J0IHsgaXNPYmplY3QsIGlzU3RyaW5nLCBhc0FycmF5IH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvRWxlbWVudCcsIHtcbiAgcHJvcHM6IHtcbiAgICB0YWc6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnc3BhbicgfSxcbiAgICBjb250ZW50OiB7IHR5cGU6IFtTdHJpbmcsIE9iamVjdF0sIGRlZmF1bHQ6IG51bGwgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgb3B0aW9ucygpIHtcbiAgICAgIGNvbnN0IHsgY29udGVudCB9ID0gdGhpc1xuICAgICAgcmV0dXJuIGlzT2JqZWN0KGNvbnRlbnQpID8gY29udGVudCA6IHsgdGV4dDogY29udGVudCB9XG4gICAgfSxcblxuICAgIGNsYXNzZXMoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi50aGlzLiRhdHRycy5jbGFzcyxcbiAgICAgICAgLi4uYXNPYmplY3QodGhpcy5vcHRpb25zLmNsYXNzKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzdHlsZXMoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi50aGlzLiRhdHRycy5zdHlsZSxcbiAgICAgICAgLi4uYXNPYmplY3QodGhpcy5vcHRpb25zLnN0eWxlKVxuICAgICAgfVxuICAgIH1cbiAgfVxufSlcblxuZnVuY3Rpb24gYXNPYmplY3QodmFsdWUpIHtcbiAgcmV0dXJuIGFzQXJyYXkodmFsdWUpLnJlZHVjZSgob2JqZWN0LCBlbnRyeSkgPT4ge1xuICAgIGlmIChpc1N0cmluZyhlbnRyeSkpIHtcbiAgICAgIG9iamVjdFtlbnRyeV0gPSB0cnVlXG4gICAgfSBlbHNlIGlmIChpc09iamVjdChlbnRyeSkpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24ob2JqZWN0LCBlbnRyeSlcbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdFxuICB9LCB7fSlcbn1cbjwvc2NyaXB0PlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbmNvbXBvbmVudC5kaXRvLWxhYmVsKFxuICB2LWlmPVwidGV4dCB8fCBjb2xsYXBzaWJsZVwiXG4gIDppcz1cInRhZ1wiXG4gIHYtYmluZD1cImF0dHJpYnV0ZXNcIlxuICA6Y2xhc3M9XCJ7ICdkaXRvLWFjdGl2ZSc6IGlzQWN0aXZlIH1cIlxuKVxuICAuZGl0by1jaGV2cm9uKFxuICAgIHYtaWY9XCJjb2xsYXBzaWJsZVwiXG4gICAgOmNsYXNzPVwieyAnZGl0by1vcGVuZWQnOiAhY29sbGFwc2VkIH1cIlxuICApXG4gIERpdG9FbGVtZW50LmRpdG8tbGFiZWwtcHJlZml4KFxuICAgIHYtZm9yPVwiKHByZWZpeCwgaW5kZXgpIG9mIHByZWZpeGVzXCJcbiAgICA6a2V5PVwiYHByZWZpeC0ke2luZGV4fWBcIlxuICAgIHRhZz1cInNwYW5cIlxuICAgIDpjb250ZW50PVwicHJlZml4XCJcbiAgKVxuICBsYWJlbChcbiAgICA6Zm9yPVwiZGF0YVBhdGhcIlxuICAgIHYtaHRtbD1cInRleHRcIlxuICApXG4gIERpdG9FbGVtZW50LmRpdG8tbGFiZWwtc3VmZml4KFxuICAgIHYtZm9yPVwiKHN1ZmZpeCwgaW5kZXgpIG9mIHN1ZmZpeGVzXCJcbiAgICA6a2V5PVwiYHN1ZmZpeC0ke2luZGV4fWBcIlxuICAgIHRhZz1cInNwYW5cIlxuICAgIDpjb250ZW50PVwic3VmZml4XCJcbiAgKVxuICBzbG90KG5hbWU9XCJlZGl0LWJ1dHRvbnNcIilcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuaW1wb3J0IHsgaXNPYmplY3QsIGFzQXJyYXkgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9MYWJlbCcsIHtcbiAgZW1pdHM6IFsnZXhwYW5kJ10sXG5cbiAgcHJvcHM6IHtcbiAgICBsYWJlbDogeyB0eXBlOiBbU3RyaW5nLCBPYmplY3RdLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgZGF0YVBhdGg6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgY29sbGFwc2VkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgY29sbGFwc2libGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgdGFnKCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29sbGFwc2libGUgPyAnYScgOiAnZGl2J1xuICAgIH0sXG5cbiAgICB0ZXh0KCkge1xuICAgICAgY29uc3QgeyBsYWJlbCB9ID0gdGhpc1xuICAgICAgcmV0dXJuIGlzT2JqZWN0KGxhYmVsKSA/IGxhYmVsPy50ZXh0IDogbGFiZWxcbiAgICB9LFxuXG4gICAgcHJlZml4ZXMoKSB7XG4gICAgICByZXR1cm4gYXNBcnJheSh0aGlzLmxhYmVsPy5wcmVmaXgpXG4gICAgfSxcblxuICAgIHN1ZmZpeGVzKCkge1xuICAgICAgcmV0dXJuIGFzQXJyYXkodGhpcy5sYWJlbD8uc3VmZml4KVxuICAgIH0sXG5cbiAgICBhdHRyaWJ1dGVzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29sbGFwc2libGUgPyB7IG9uQ2xpY2s6IHRoaXMub25DbGljayB9IDoge31cbiAgICB9LFxuXG4gICAgaXNBY3RpdmUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5hcHBTdGF0ZS5hY3RpdmVMYWJlbCA9PT0gdGhpc1xuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgb25DbGljaygpIHtcbiAgICAgIHRoaXMuYXBwU3RhdGUuYWN0aXZlTGFiZWwgPSB0aGlzXG4gICAgICB0aGlzLiRlbWl0KCdleHBhbmQnLCB0aGlzLmNvbGxhcHNlZClcbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1sYWJlbCB7XG4gIC0tbGFiZWwtcGFkZGluZzogMDtcbiAgLy8gRm9yIGJ1dHRvbnMgYW5kIGNoZXZyb24gdG8gYWxpZ24gcmlnaHQ6XG4gIGRpc3BsYXk6IGZsZXg7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgLy8gVmVydGljYWxseSBjZW50ZXIgYWxsIGl0ZW1zIGluIHRoZSBsYWJlbCwgZS5nLiBjaGV2cm9uLCBlZGl0LWJ1dHRvbnMuXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIHBhZGRpbmc6IHZhcigtLWxhYmVsLXBhZGRpbmcpO1xuICBtYXJnaW46IDAgMCAkZm9ybS1zcGFjaW5nLWhhbGYgMDtcblxuICBsYWJlbCB7XG4gICAgZGlzcGxheTogaW5saW5lO1xuICAgIGN1cnNvcjogaW5oZXJpdDtcbiAgICBmb250LXdlaWdodDogYm9sZDtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICB9XG5cbiAgbGFiZWwsXG4gIC5kaXRvLWxhYmVsLXByZWZpeCxcbiAgLmRpdG8tbGFiZWwtc3VmZml4IHtcbiAgICAmOm50aC1sYXN0LWNoaWxkKDIpIHtcbiAgICAgIC8vIFRvIHN0cmV0Y2ggZWl0aGVyIGxhYmVsIG9yIC5kaXRvLWxhYmVsLXN1ZmZpeCB0byBmdWxsIGF2YWlsYWJsZSB3aWR0aFxuICAgICAgLy8gc28gdGhhdCBidXR0b25zIGFsd2F5cyBhcHBlYXIgcmlnaHQtYWxpZ25lZDpcbiAgICAgIGZsZXg6IDEgMSBhdXRvO1xuICAgIH1cblxuICAgICY6OmFmdGVyIHtcbiAgICAgIGNvbnRlbnQ6ICdcXGEwJzsgLy8gJm5ic3A7O1xuICAgIH1cbiAgfVxuXG4gIC5kaXRvLWxhYmVsLXByZWZpeCxcbiAgLmRpdG8tbGFiZWwtc3VmZml4IHtcbiAgICBAaW5jbHVkZSB1c2VyLXNlbGVjdChub25lKTtcbiAgICBAaW5jbHVkZSBlbGxpcHNpcztcbiAgfVxuXG4gIC5kaXRvLWJ1dHRvbnMge1xuICAgIC8vIE1vdmUgdGhlIGxhYmVsIHBhZGRpbmcgaW5zaWRlIC5kaXRvLWJ1dHRvbnMsIHNvIHRoYXQgaXQgY2FwdHVyZXMgYWxsXG4gICAgLy8gbmVhciBtb3VzZSBldmVudHM6XG4gICAgbWFyZ2luOiBjYWxjKC0xICogdmFyKC0tbGFiZWwtcGFkZGluZykpO1xuICAgIG1hcmdpbi1sZWZ0OiAwO1xuICAgIHBhZGRpbmc6IHZhcigtLWxhYmVsLXBhZGRpbmcpO1xuICB9XG5cbiAgJi5kaXRvLXdpZHRoLWZpbGwge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIC8vIEluIG9yZGVyIGZvciBlbGxpcHNpcyB0byB3b3JrIG9uIGxhYmVscyB3aXRob3V0IGFmZmVjdGluZyBvdGhlciBsYXlvdXQsXG4gICAgLy8gd2UgbmVlZCB0byBwb3NpdGlvbiBpdCBhYnNvbHV0ZWx5IGluc2lkZSBpdHMgY29udGFpbmVyLlxuICAgIGxhYmVsIHtcbiAgICAgIEBpbmNsdWRlIGVsbGlwc2lzO1xuXG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICBtYXgtd2lkdGg6IDEwMCU7XG4gICAgfVxuXG4gICAgJjo6YWZ0ZXIge1xuICAgICAgLy8gU2luY2UgPGxhYmVsPiB1c2VzIGBwb3NpdGlvbjogYWJzb2x1dGVgLCBzZXQgY29udGVudCB0byBhIHplcm8td2lkdGhcbiAgICAgIC8vIHNwYWNlIG9uIGl0cyBwYXJlbnQgdG8gZW5mb3JjZSB0aGUgcmlnaHQgdGV4dCBoZWlnaHQgaW4gdGhlIGNvbnRhaW5lclxuICAgICAgY29udGVudDogJ1xcMjAwYic7IC8vIHplcm8td2lkdGggc3BhY2U7XG4gICAgfVxuICB9XG59XG5cbmEuZGl0by1sYWJlbCB7XG4gICY6aG92ZXIge1xuICAgIC5kaXRvLWNoZXZyb24ge1xuICAgICAgY29sb3I6ICRjb2xvci1kYXJrZXI7XG4gICAgfVxuICB9XG5cbiAgJjpmb2N1czpub3QoOmFjdGl2ZSwgLmRpdG8tYWN0aXZlKSB7XG4gICAgLmRpdG8tY2hldnJvbiB7XG4gICAgICAtd2Via2l0LXRleHQtc3Ryb2tlOiAkYm9yZGVyLXdpZHRoICRjb2xvci1hY3RpdmU7XG4gICAgfVxuICAgIC8vIERpc3BsYXkgbGFiZWxzIGluIGNvbXBhY3Qgc2NoZW1hIGFzIGlubGluZS1ibG9ja3MsIHRvIGFsbG93IGNvbXBhY3RcbiAgICAvLyBsYXlvdXRzIHdpdGggYHdpZHRoOiAnYXV0bydgIGVsZW1lbnRzOlxuICAgIC8vIFRPRE86IEZpbmQgYSBiZXR0ZXIgd2F5IHRvIGNvbnRyb2wgdGhpcyBiZWhhdmlvci5cbiAgfVxufVxuXG4uZGl0by1zY2hlbWEtY29tcGFjdCB7XG4gID4gLmRpdG8tc2NoZW1hLWNvbnRlbnQge1xuICAgID4gLmRpdG8tcGFuZSB7XG4gICAgICA+IC5kaXRvLWNvbnRhaW5lciB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZmxvdzogcm93IHdyYXA7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBiYXNlbGluZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCJpbXBvcnQgRGl0b0NvbnRleHQgZnJvbSAnLi4vRGl0b0NvbnRleHQuanMnXG5pbXBvcnQge1xuICBnZXRJdGVtRm9ybVNjaGVtYSxcbiAgZ2V0SXRlbUlkLFxuICBnZXRJdGVtVWlkLFxuICBpc0xpc3RTb3VyY2Vcbn0gZnJvbSAnLi4vdXRpbHMvc2NoZW1hLmpzJ1xuaW1wb3J0IHsgYXBwZW5kRGF0YVBhdGggfSBmcm9tICcuLi91dGlscy9kYXRhLmpzJ1xuaW1wb3J0IHsgaXNPYmplY3QsIGlzU3RyaW5nLCBpc0Z1bmN0aW9uIH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgbWV0aG9kczoge1xuICAgIGdldEl0ZW1Gb3JtU2NoZW1hLFxuXG4gICAgZ2V0SXRlbVVpZCxcblxuICAgIGdldEl0ZW1JZChzb3VyY2VTY2hlbWEsIGl0ZW0sIGluZGV4ID0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNUcmFuc2llbnQgJiYgaW5kZXggIT09IG51bGxcbiAgICAgICAgPyBTdHJpbmcoaW5kZXgpXG4gICAgICAgIDogZ2V0SXRlbUlkKHNvdXJjZVNjaGVtYSwgaXRlbSlcbiAgICB9LFxuXG4gICAgZ2V0SXRlbURhdGFQYXRoKHNvdXJjZVNjaGVtYSwgaW5kZXgpIHtcbiAgICAgIGxldCB7IGRhdGFQYXRoIH0gPSB0aGlzXG4gICAgICBpZiAoc291cmNlU2NoZW1hICE9PSB0aGlzLnNjaGVtYSkge1xuICAgICAgICBkYXRhUGF0aCA9IGFwcGVuZERhdGFQYXRoKGRhdGFQYXRoLCBzb3VyY2VTY2hlbWEubmFtZSlcbiAgICAgIH1cbiAgICAgIGlmIChpbmRleCAhPSBudWxsKSB7XG4gICAgICAgIGRhdGFQYXRoID0gYXBwZW5kRGF0YVBhdGgoZGF0YVBhdGgsIGluZGV4KVxuICAgICAgfVxuICAgICAgcmV0dXJuIGRhdGFQYXRoXG4gICAgfSxcblxuICAgIGZpbmRJdGVtSWRJbmRleChzb3VyY2VTY2hlbWEsIGRhdGEsIGl0ZW1JZCkge1xuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmlzVHJhbnNpZW50XG4gICAgICAgID8gLy8gRm9yIHRyYW5zaWVudCBkYXRhLCB0aGUgaW5kZXggaXMgdXNlZCBhcyB0aGUgaWRcbiAgICAgICAgICBpdGVtSWRcbiAgICAgICAgOiBkYXRhPy5maW5kSW5kZXgoXG4gICAgICAgICAgICAoaXRlbSwgaW5kZXgpID0+IChcbiAgICAgICAgICAgICAgdGhpcy5nZXRJdGVtSWQoc291cmNlU2NoZW1hLCBpdGVtLCBpbmRleCkgPT09IGl0ZW1JZFxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgIHJldHVybiBpbmRleCAhPT0gLTEgPyBpbmRleCA6IG51bGxcbiAgICB9LFxuXG4gICAgZ2V0SXRlbUxhYmVsKHNvdXJjZVNjaGVtYSwgaXRlbSwge1xuICAgICAgaW5kZXggPSBudWxsLFxuICAgICAgZXh0ZW5kZWQgPSBmYWxzZSxcbiAgICAgIGFzT2JqZWN0ID0gZmFsc2VcbiAgICB9ID0ge30pIHtcbiAgICAgIGNvbnN0IHsgaXRlbUxhYmVsIH0gPSBzb3VyY2VTY2hlbWFcbiAgICAgIGlmICghaXRlbSB8fCAhZXh0ZW5kZWQgJiYgaXRlbUxhYmVsID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfVxuXG4gICAgICBsZXQgZGF0YVBhdGhcbiAgICAgIGNvbnN0IGdldERhdGFQYXRoID0gKCkgPT5cbiAgICAgICAgKGRhdGFQYXRoIHx8PSB0aGlzLmdldEl0ZW1EYXRhUGF0aChzb3VyY2VTY2hlbWEsIGluZGV4KSlcblxuICAgICAgbGV0IGZvcm1MYWJlbFxuICAgICAgY29uc3QgZ2V0Rm9ybUxhYmVsID0gKCkgPT5cbiAgICAgICAgKGZvcm1MYWJlbCB8fD0gdGhpcy5nZXRMYWJlbChcbiAgICAgICAgICBnZXRJdGVtRm9ybVNjaGVtYShzb3VyY2VTY2hlbWEsIGl0ZW0sIHRoaXMuY29udGV4dClcbiAgICAgICAgKSlcblxuICAgICAgbGV0IHRleHRcbiAgICAgIGxldCBwcmVmaXhcbiAgICAgIGxldCBzdWZmaXhcbiAgICAgIGlmIChpc0Z1bmN0aW9uKGl0ZW1MYWJlbCkpIHtcbiAgICAgICAgY29uc3QgbGFiZWwgPSBpdGVtTGFiZWwuY2FsbChcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIG5ldyBEaXRvQ29udGV4dCh0aGlzLCB7XG4gICAgICAgICAgICBuZXN0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgZGF0YTogaXRlbSxcbiAgICAgICAgICAgIHZhbHVlOiBpdGVtLFxuICAgICAgICAgICAgaW5kZXgsXG5cbiAgICAgICAgICAgIGdldCBkYXRhUGF0aCgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGdldERhdGFQYXRoKClcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGdldCBmb3JtTGFiZWwoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBnZXRGb3JtTGFiZWwoKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICAgaWYgKGlzT2JqZWN0KGxhYmVsKSkge1xuICAgICAgICAgIDsoeyB0ZXh0LCBwcmVmaXgsIHN1ZmZpeCB9ID0gbGFiZWwpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGV4dCA9IGxhYmVsXG4gICAgICAgIH1cbiAgICAgICAgLy8gSXQncyB1cCB0byBgaXRlbUxhYmVsKClgIGVudGlyZWx5IHRvIHByb2R1Y2UgdGhlIGxhYmVsOlxuICAgICAgICBleHRlbmRlZCA9IGZhbHNlXG4gICAgICB9IGVsc2UgaWYgKGlzU3RyaW5nKGl0ZW1MYWJlbCkgJiYgIShpdGVtTGFiZWwgaW4gaXRlbSkpIHtcbiAgICAgICAgLy8gYGl0ZW1MYWJlbGAgY2FuIGJlIGJvdGggYSBrZXksIG9yIHNpbXBseSBhIGxhYmVsLlxuICAgICAgICB0ZXh0ID0gaXRlbUxhYmVsXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBMb29rIHVwIHRoZSBuYW1lIG9uIHRoZSBpdGVtLCBieSB0aGVzZSBydWxlczpcbiAgICAgICAgLy8gMS4gSWYgYGl0ZW1MYWJlbGAgaXMgYSBzdHJpbmcsIHVzZSBpdCBhcyB0aGUgcHJvcGVydHkga2V5XG4gICAgICAgIC8vIDIuIE90aGVyd2lzZSwgaWYgdGhlcmUgYXJlIGNvbHVtbnMsIHVzZSB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0XG4gICAgICAgIC8vIDMuIE90aGVyd2lzZSwgc2VlIGlmIHRoZSBpdGVtIGhhcyBhIHByb3BlcnR5IG5hbWVkICduYW1lJ1xuICAgICAgICBjb25zdCB7IGNvbHVtbnMgfSA9IHNvdXJjZVNjaGVtYVxuICAgICAgICBjb25zdCBrZXkgPSAoXG4gICAgICAgICAgaXNTdHJpbmcoaXRlbUxhYmVsKSAmJiBpdGVtTGFiZWwgfHxcbiAgICAgICAgICBpc0xpc3RTb3VyY2Uoc291cmNlU2NoZW1hKSAmJiBjb2x1bW5zICYmIE9iamVjdC5rZXlzKGNvbHVtbnMpWzBdIHx8XG4gICAgICAgICAgJ25hbWUnXG4gICAgICAgIClcbiAgICAgICAgdGV4dCA9IGl0ZW1ba2V5XVxuICAgICAgfVxuICAgICAgY29uc3QgaGFkTGFiZWwgPSAhIXRleHRcbiAgICAgIC8vIElmIG5vIGxhYmVsIHdhcyBmb3VuZCBzbyBmYXIsIHRyeSB0byBwcm9kdWNlIG9uZSBmcm9tIHRoZSBpbmRleC5cbiAgICAgIGlmICh0ZXh0ID09IG51bGwpIHtcbiAgICAgICAgLy8gQWx3YXlzIHVzZSBleHRlbmRlZCBzdHlsZSB3aGVuIGF1dG8tZ2VuZXJhdGluZyBsYWJlbHMgZnJvbSBpbmRleC9pZDpcbiAgICAgICAgZXh0ZW5kZWQgPSB0cnVlXG4gICAgICAgIHRleHQgPVxuICAgICAgICAgIGlzTGlzdFNvdXJjZShzb3VyY2VTY2hlbWEpICYmIGluZGV4ICE9PSBudWxsXG4gICAgICAgICAgICA/ICh0ZXh0ID0gYCR7aW5kZXggKyAxfWApXG4gICAgICAgICAgICA6ICcnXG4gICAgICB9XG4gICAgICBpZiAoZXh0ZW5kZWQpIHtcbiAgICAgICAgY29uc3QgZm9ybUxhYmVsID0gZ2V0Rm9ybUxhYmVsKClcbiAgICAgICAgaWYgKGZvcm1MYWJlbCkge1xuICAgICAgICAgIC8vIElmIGEgbGFiZWwgd2FzIHByb3ZpZGVkLCBwdXQgaW4gcXVvdGVzIHdoZW4gcHJlZml4ZWQgd2l0aCB0aGVcbiAgICAgICAgICAvLyBmb3JtIGxhYmVsIGZvciB0aGUgZXh0ZW5kZWQgc3R5bGU6XG4gICAgICAgICAgdGV4dCA9IGAke2Zvcm1MYWJlbH0gJHtoYWRMYWJlbCA/IGAnJHt0ZXh0fSdgIDogdGV4dH1gXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBhc09iamVjdCA/IHsgdGV4dCwgcHJlZml4LCBzdWZmaXggfSA6IHRleHRcbiAgICB9XG4gIH1cbn1cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG5zbG90KG5hbWU9XCJiZWZvcmVcIilcbi5kaXRvLXNjaGVtYShcbiAgdi1iaW5kPVwiJGF0dHJzXCJcbilcbiAgLmRpdG8tc2NoZW1hLWNvbnRlbnRcbiAgICAuZGl0by1zY2hlbWEtaGVhZGVyKFxuICAgICAgdi1pZj1cImhhc0xhYmVsIHx8IGhhc1RhYnMgfHwgY2xpcGJvYXJkXCJcbiAgICAgIDpjbGFzcz1cInsgJ2RpdG8tc2NoZW1hLW1lbnUtaGVhZGVyJzogbWVudUhlYWRlciB9XCJcbiAgICApXG4gICAgICBEaXRvTGFiZWwoXG4gICAgICAgIHYtaWY9XCJoYXNMYWJlbFwiXG4gICAgICAgIDpsYWJlbD1cImxhYmVsXCJcbiAgICAgICAgOmRhdGFQYXRoPVwiZGF0YVBhdGhcIlxuICAgICAgICA6Y29sbGFwc2libGU9XCJjb2xsYXBzaWJsZVwiXG4gICAgICAgIDpjb2xsYXBzZWQ9XCIhb3BlbmVkXCJcbiAgICAgICAgQGV4cGFuZD1cIm9uRXhwYW5kXCJcbiAgICAgIClcbiAgICAgICAgLy8tIFBhc3MgZWRpdC1idXR0b25zIHRocm91Z2ggdG8gZGl0by1sYWJlbCdzIG93biBlZGl0LWJ1dHRvbnMgc2xvdDpcbiAgICAgICAgdGVtcGxhdGUoXG4gICAgICAgICAgdi1pZj1cImlubGluZWRcIlxuICAgICAgICAgICNlZGl0LWJ1dHRvbnNcbiAgICAgICAgKVxuICAgICAgICAgIHNsb3QobmFtZT1cImVkaXQtYnV0dG9uc1wiKVxuICAgICAgRGl0b1RhYnMoXG4gICAgICAgIHYtaWY9XCJ0YWJzXCJcbiAgICAgICAgOnRhYnM9XCJ0YWJzXCJcbiAgICAgICAgOnNlbGVjdGVkVGFiPVwic2VsZWN0ZWRUYWJcIlxuICAgICAgKVxuICAgICAgRGl0b0NsaXBib2FyZChcbiAgICAgICAgOmNsaXBib2FyZD1cImNsaXBib2FyZFwiXG4gICAgICAgIDpkYXRhUGF0aD1cImRhdGFQYXRoXCJcbiAgICAgICAgOmRhdGE9XCJkYXRhXCJcbiAgICAgIClcbiAgICB0ZW1wbGF0ZShcbiAgICAgIHYtaWY9XCJoYXNUYWJzXCJcbiAgICApXG4gICAgICBEaXRvUGFuZS5kaXRvLXBhbmUtdGFiKFxuICAgICAgICB2LWZvcj1cIih0YWJTY2hlbWEsIHRhYikgaW4gdGFic1wiXG4gICAgICAgIHJlZj1cInRhYnNcIlxuICAgICAgICA6a2V5PVwidGFiXCJcbiAgICAgICAgOnZpc2libGU9XCJzZWxlY3RlZFRhYiA9PT0gdGFiXCJcbiAgICAgICAgOnRhYj1cInRhYlwiXG4gICAgICAgIDpzY2hlbWE9XCJ0YWJTY2hlbWFcIlxuICAgICAgICA6ZGF0YVBhdGg9XCJkYXRhUGF0aFwiXG4gICAgICAgIDpkYXRhPVwiZGF0YVwiXG4gICAgICAgIDptZXRhPVwibWV0YVwiXG4gICAgICAgIDpzdG9yZT1cInN0b3JlXCJcbiAgICAgICAgOnNpbmdsZT1cIiFpbmxpbmVkICYmICFoYXNNYWluUGFuZVwiXG4gICAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICAgICAgOmdlbmVyYXRlTGFiZWxzPVwiZ2VuZXJhdGVMYWJlbHNcIlxuICAgICAgKVxuICAgIFRyYW5zaXRpb25IZWlnaHQoOmVuYWJsZWQ9XCJpbmxpbmVkXCIpXG4gICAgICBEaXRvUGFuZS5kaXRvLXBhbmUtbWFpbihcbiAgICAgICAgdi1pZj1cImhhc01haW5QYW5lICYmIG9wZW5lZFwiXG4gICAgICAgIHJlZj1cImNvbXBvbmVudHNcIlxuICAgICAgICA6c2NoZW1hPVwic2NoZW1hXCJcbiAgICAgICAgOmRhdGFQYXRoPVwiZGF0YVBhdGhcIlxuICAgICAgICA6ZGF0YT1cImRhdGFcIlxuICAgICAgICA6bWV0YT1cIm1ldGFcIlxuICAgICAgICA6c3RvcmU9XCJzdG9yZVwiXG4gICAgICAgIDpzaW5nbGU9XCIhaW5saW5lZCAmJiAhaGFzVGFic1wiXG4gICAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICAgICAgOmdlbmVyYXRlTGFiZWxzPVwiZ2VuZXJhdGVMYWJlbHNcIlxuICAgICAgKVxuICAgIHNsb3QoXG4gICAgICB2LWlmPVwiIWlubGluZWQgJiYgaXNQb3B1bGF0ZWRcIlxuICAgICAgbmFtZT1cImJ1dHRvbnNcIlxuICAgIClcbiAgdGVtcGxhdGUoXG4gICAgdi1pZj1cImlubGluZWRcIlxuICApXG4gICAgc2xvdChcbiAgICAgIHYtaWY9XCIhaGFzTGFiZWxcIlxuICAgICAgbmFtZT1cImVkaXQtYnV0dG9uc1wiXG4gICAgKVxuICB0ZW1wbGF0ZShcbiAgICB2LWVsc2UtaWY9XCJpc1BvcHVsYXRlZFwiXG4gIClcbiAgICBEaXRvUGFuZWxzKFxuICAgICAgOnBhbmVscz1cInBhbmVsRW50cmllc1wiXG4gICAgICA6ZGF0YT1cImRhdGFcIlxuICAgICAgOm1ldGE9XCJtZXRhXCJcbiAgICAgIDpzdG9yZT1cInN0b3JlXCJcbiAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICApXG5zbG90KG5hbWU9XCJhZnRlclwiKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCB7XG4gIGlzT2JqZWN0LFxuICBpc0FycmF5LFxuICBpc0Z1bmN0aW9uLFxuICBpc1JlZ0V4cCxcbiAgcGFyc2VEYXRhUGF0aCxcbiAgbm9ybWFsaXplRGF0YVBhdGgsXG4gIGxhYmVsaXplXG59IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgeyBUcmFuc2l0aW9uSGVpZ2h0IH0gZnJvbSAnQGRpdG9qcy91aS9zcmMnXG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuaW1wb3J0IEl0ZW1NaXhpbiBmcm9tICcuLi9taXhpbnMvSXRlbU1peGluLmpzJ1xuaW1wb3J0IHsgYXBwZW5kRGF0YVBhdGgsIGdldFBhcmVudEl0ZW0gfSBmcm9tICcuLi91dGlscy9kYXRhLmpzJ1xuaW1wb3J0IHtcbiAgZ2V0TmFtZWRTY2hlbWFzLFxuICBnZXRQYW5lbEVudHJpZXMsXG4gIHNldERlZmF1bHRWYWx1ZXMsXG4gIHByb2Nlc3NEYXRhXG59IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcbmltcG9ydCB7IGdldFN0b3JlQWNjZXNzb3IgfSBmcm9tICcuLi91dGlscy9hY2Nlc3Nvci5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvU2NoZW1hJywge1xuICBtaXhpbnM6IFtJdGVtTWl4aW5dLFxuICBjb21wb25lbnRzOiB7IFRyYW5zaXRpb25IZWlnaHQgfSxcblxuICBwcm92aWRlKCkge1xuICAgIHJldHVybiB7XG4gICAgICAkc2NoZW1hQ29tcG9uZW50OiAoKSA9PiB0aGlzXG4gICAgfVxuICB9LFxuXG4gIGluamVjdDogW1xuICAgICckc2NoZW1hUGFyZW50Q29tcG9uZW50J1xuICBdLFxuXG4gIHByb3BzOiB7XG4gICAgc2NoZW1hOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBkYXRhUGF0aDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICcnIH0sXG4gICAgZGF0YTogeyB0eXBlOiBPYmplY3QsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBtZXRhOiB7IHR5cGU6IE9iamVjdCwgZGVmYXVsdDogKCkgPT4gKHt9KSB9LFxuICAgIHN0b3JlOiB7IHR5cGU6IE9iamVjdCwgZGVmYXVsdDogKCkgPT4gKHt9KSB9LFxuICAgIGxhYmVsOiB7IHR5cGU6IFtTdHJpbmcsIE9iamVjdF0sIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBpbmxpbmVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBjb2xsYXBzZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBjb2xsYXBzaWJsZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGdlbmVyYXRlTGFiZWxzOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWUgfSxcbiAgICBoYXNPd25EYXRhOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgbWVudUhlYWRlcjogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICBjb25zdCB7IGRhdGEgfSA9IHRoaXMuc2NoZW1hXG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIEFsbG93IHNjaGVtYSB0byBwcm92aWRlIG1vcmUgZGF0YSB0aHJvdWdoIGBzY2hlbWEuZGF0YWAsIHZ1ZS1zdHlsZTpcbiAgICAgIC4uLihcbiAgICAgICAgZGF0YSAmJiBpc0Z1bmN0aW9uKGRhdGEpXG4gICAgICAgICAgPyBkYXRhKHRoaXMuY29udGV4dClcbiAgICAgICAgICA6IGRhdGFcbiAgICAgICksXG4gICAgICBjb21wb25lbnRzUmVnaXN0cnk6IHt9LFxuICAgICAgcGFuZXNSZWdpc3RyeToge30sXG4gICAgICBwYW5lbHNSZWdpc3RyeToge31cbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBzY2hlbWFDb21wb25lbnQoKSB7XG4gICAgICAvLyBPdmVycmlkZSBEaXRvTWl4aW4ncyBzY2hlbWFDb21wb25lbnQoKSB3aGljaCB1c2VzIHRoZSBpbmplY3RlZCB2YWx1ZS5cbiAgICAgIHJldHVybiB0aGlzXG4gICAgfSxcblxuICAgIHBhcmVudFNjaGVtYUNvbXBvbmVudCgpIHtcbiAgICAgIC8vIERvbid0IHJldHVybiB0aGUgYWN0dWFsIHBhcmVudCBzY2hlbWEgaXMgdGhpcyBzY2hlbWEgaGFuZGxlcyBpdHMgb3duXG4gICAgICAvLyBkYXRhLiBUaGlzIHByZXZlbnRzIGRlbGVnYXRpbmcgZXZlbnRzIHRvIHRoZSBwYXJlbnQsIGFuZCByZWdpc3RlcmluZ1xuICAgICAgLy8gY29tcG9uZW50cyB3aXRoIHRoZSBwYXJlbnQgdGhhdCB3b3VsZCBjYXVzZSBpdCB0byBzZXQgaXNEaXJ0eSBmbGFncy5cbiAgICAgIHJldHVybiB0aGlzLmhhc093bkRhdGEgPyBudWxsIDogdGhpcy5wYXJlbnRDb21wb25lbnQuc2NoZW1hQ29tcG9uZW50XG4gICAgfSxcblxuICAgIHBhbmVsRW50cmllcygpIHtcbiAgICAgIGNvbnN0IHBhbmVsRW50cmllcyA9IGdldFBhbmVsRW50cmllcyh0aGlzLnNjaGVtYS5wYW5lbHMsICcnKVxuICAgICAgZm9yIChjb25zdCBwYW5lIG9mIHRoaXMucGFuZXMpIHtcbiAgICAgICAgcGFuZWxFbnRyaWVzLnB1c2goLi4ucGFuZS5wYW5lbEVudHJpZXMpXG4gICAgICB9XG4gICAgICByZXR1cm4gcGFuZWxFbnRyaWVzXG4gICAgfSxcblxuICAgIHRhYnMoKSB7XG4gICAgICByZXR1cm4gZ2V0TmFtZWRTY2hlbWFzKHRoaXMuc2NoZW1hLnRhYnMpXG4gICAgfSxcblxuICAgIHNlbGVjdGVkVGFiKCkge1xuICAgICAgY29uc3QgY3VycmVudFRhYiA9IHRoaXMuJHJvdXRlLmhhc2g/LnNsaWNlKDEpIHx8IG51bGxcbiAgICAgIGNvbnN0IHRhYiA9XG4gICAgICAgIGN1cnJlbnRUYWIgJiYgdGhpcy5zaG91bGRSZW5kZXIodGhpcy50YWJzW2N1cnJlbnRUYWJdKVxuICAgICAgICAgID8gY3VycmVudFRhYlxuICAgICAgICAgIDogdGhpcy5kZWZhdWx0VGFiPy5uYW1lIHx8IG51bGxcbiAgICAgIGlmICh0YWIgIT09IGN1cnJlbnRUYWIpIHtcbiAgICAgICAgLy8gVE9ETzogTW92ZSB0aGlzIHdhdGNoZXIhXG4gICAgICAgIC8vIEFueSB0YWIgY2hhbmdlIG5lZWRzIHRvIGJlIHJlZmxlY3RlZCBpbiB0aGUgcm91dGVyIGFsc28uXG4gICAgICAgIHRoaXMuJHJvdXRlci5yZXBsYWNlKHsgaGFzaDogYCMke3RhYn1gIH0pXG4gICAgICB9XG4gICAgICByZXR1cm4gdGFiXG4gICAgfSxcblxuICAgIGRlZmF1bHRUYWIoKSB7XG4gICAgICBsZXQgZmlyc3QgPSBudWxsXG4gICAgICBpZiAodGhpcy50YWJzKSB7XG4gICAgICAgIGZvciAoY29uc3QgdGFiIG9mIE9iamVjdC52YWx1ZXModGhpcy50YWJzKSkge1xuICAgICAgICAgIGNvbnN0IHsgZGVmYXVsdFRhYiB9ID0gdGFiXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgaXNGdW5jdGlvbihkZWZhdWx0VGFiKVxuICAgICAgICAgICAgICA/IGRlZmF1bHRUYWIodGhpcy5jb250ZXh0KVxuICAgICAgICAgICAgICA6IGRlZmF1bHRUYWJcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiB0YWJcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFmaXJzdCkge1xuICAgICAgICAgICAgZmlyc3QgPSB0YWJcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmaXJzdFxuICAgIH0sXG5cbiAgICBjbGlwYm9hcmQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY2hlbWE/LmNsaXBib2FyZFxuICAgIH0sXG5cbiAgICBwYXJlbnREYXRhKCkge1xuICAgICAgY29uc3QgZGF0YSA9IGdldFBhcmVudEl0ZW0odGhpcy5yb290RGF0YSwgdGhpcy5kYXRhUGF0aCwgZmFsc2UpXG4gICAgICByZXR1cm4gZGF0YSAhPT0gdGhpcy5kYXRhID8gZGF0YSA6IG51bGxcbiAgICB9LFxuXG4gICAgcHJvY2Vzc2VkRGF0YSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NEYXRhKHsgdGFyZ2V0OiAnc2VydmVyJywgc2NoZW1hT25seTogdHJ1ZSB9KVxuICAgIH0sXG5cbiAgICBjbGlwYm9hcmREYXRhKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJHNjaGVtYTogdGhpcy5zY2hlbWEubmFtZSxcbiAgICAgICAgLi4udGhpcy5wcm9jZXNzRGF0YSh7IHRhcmdldDogJ2NsaXBib2FyZCcsIHNjaGVtYU9ubHk6IHRydWUgfSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gVGhlIGZvbGxvd2luZyBjb21wdXRlZCBwcm9wZXJ0aWVzIGFyZSBzaW1pbGFyIHRvIGBEaXRvQ29udGV4dGBcbiAgICAvLyBwcm9wZXJ0aWVzLCBzbyB0aGF0IHdlIGNhbiBhY2Nlc3MgdGhlc2Ugb24gYHRoaXNgIGFzIHdlbGw6XG4gICAgLy8gTk9URTogV2hpbGUgaW50ZXJuYWxseSwgd2Ugc3BlYWsgb2YgYGRhdGFgLCBpbiB0aGUgQVBJIHN1cmZhY2UgdGhlXG4gICAgLy8gdGVybSBgaXRlbWAgaXMgdXNlZCBmb3IgdGhlIGRhdGEgdGhhdCByZWxhdGVzIHRvIGVkaXRpbmcgb2JqZWN0cy5cbiAgICAvLyBOT1RFOiBUaGlzIHNob3VsZCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIGFzOlxuICAgIC8vIHJldHVybiBnZXRJdGVtKHRoaXMucm9vdERhdGEsIHRoaXMuZGF0YVBhdGgsIGZhbHNlKVxuICAgIGl0ZW0oKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhXG4gICAgfSxcblxuICAgIHBhcmVudEl0ZW0oKSB7XG4gICAgICByZXR1cm4gdGhpcy5wYXJlbnREYXRhXG4gICAgfSxcblxuICAgIHJvb3RJdGVtKCkge1xuICAgICAgcmV0dXJuIHRoaXMucm9vdERhdGFcbiAgICB9LFxuXG4gICAgcHJvY2Vzc2VkSXRlbSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NlZERhdGFcbiAgICB9LFxuXG4gICAgY2xpcGJvYXJkSXRlbSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmNsaXBib2FyZERhdGFcbiAgICB9LFxuXG4gICAgZm9ybUxhYmVsKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0TGFiZWwoXG4gICAgICAgIHRoaXMuZ2V0SXRlbUZvcm1TY2hlbWEodGhpcy5zb3VyY2VTY2hlbWEsIHRoaXMuZGF0YSwgdGhpcy5jb250ZXh0KVxuICAgICAgKVxuICAgIH0sXG5cbiAgICBpc0RpcnR5KCkge1xuICAgICAgcmV0dXJuIHRoaXMuc29tZUNvbXBvbmVudChpdCA9PiBpdC5pc0RpcnR5KVxuICAgIH0sXG5cbiAgICBpc1RvdWNoZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zb21lQ29tcG9uZW50KGl0ID0+IGl0LmlzVG91Y2hlZClcbiAgICB9LFxuXG4gICAgaXNWYWxpZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmV2ZXJ5Q29tcG9uZW50KGl0ID0+IGl0LmlzVmFsaWQpXG4gICAgfSxcblxuICAgIGlzVmFsaWRhdGVkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZXZlcnlDb21wb25lbnQoaXQgPT4gaXQuaXNWYWxpZGF0ZWQpXG4gICAgfSxcblxuICAgIGhhc0RhdGEoKSB7XG4gICAgICByZXR1cm4gISF0aGlzLmRhdGFcbiAgICB9LFxuXG4gICAgaGFzTGFiZWwoKSB7XG4gICAgICByZXR1cm4gISF0aGlzLmxhYmVsIHx8IHRoaXMuY29sbGFwc2libGVcbiAgICB9LFxuXG4gICAgaGFzVGFicygpIHtcbiAgICAgIHJldHVybiAhdGhpcy5pbmxpbmVkICYmICEhdGhpcy50YWJzXG4gICAgfSxcblxuICAgIGhhc01haW5QYW5lKCkge1xuICAgICAgY29uc3QgeyBjb21wb25lbnRzIH0gPSB0aGlzLnNjaGVtYVxuICAgICAgcmV0dXJuICEhY29tcG9uZW50cyAmJiBPYmplY3Qua2V5cyhjb21wb25lbnRzKS5sZW5ndGggPiAwXG4gICAgfSxcblxuICAgIG9wZW5lZDogZ2V0U3RvcmVBY2Nlc3Nvcignb3BlbmVkJywge1xuICAgICAgZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmNvbGxhcHNlZFxuICAgICAgfVxuICAgIH0pLFxuXG4gICAgY29tcG9uZW50cygpIHtcbiAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMuY29tcG9uZW50c1JlZ2lzdHJ5KVxuICAgIH0sXG5cbiAgICBwYW5lcygpIHtcbiAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMucGFuZXNSZWdpc3RyeSlcbiAgICB9LFxuXG4gICAgcGFuZWxzKCkge1xuICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5wYW5lbHNSZWdpc3RyeSlcbiAgICB9LFxuXG4gICAgY29tcG9uZW50c0J5RGF0YVBhdGgoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fbGlzdEVudHJpZXNCeURhdGFQYXRoKHRoaXMuY29tcG9uZW50c1JlZ2lzdHJ5KVxuICAgIH0sXG5cbiAgICBwYW5lc0J5RGF0YVBhdGgoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fbGlzdEVudHJpZXNCeURhdGFQYXRoKHRoaXMucGFuZXNSZWdpc3RyeSlcbiAgICB9LFxuXG4gICAgcGFuZWxzQnlEYXRhUGF0aCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9saXN0RW50cmllc0J5RGF0YVBhdGgodGhpcy5wYW5lbHNSZWdpc3RyeSlcbiAgICB9XG4gIH0sXG5cbiAgY3JlYXRlZCgpIHtcbiAgICB0aGlzLl9yZWdpc3Rlcih0cnVlKVxuICAgIHRoaXMuc2V0dXBTY2hlbWFGaWVsZHMoKVxuICAgIC8vIERlbGVnYXRlIGNoYW5nZSBldmVudHMgdGhyb3VnaCB0byBwYXJlbnQgc2NoZW1hOlxuICAgIHRoaXMuZGVsZWdhdGUoJ2NoYW5nZScsIHRoaXMucGFyZW50U2NoZW1hQ29tcG9uZW50KVxuICAgIHRoaXMuZW1pdEV2ZW50KCdpbml0aWFsaXplJykgLy8gTm90IGAnY3JlYXRlJ2AsIHNpbmNlIHRoYXQncyBmb3IgZGF0YS5cbiAgfSxcblxuICB1bm1vdW50ZWQoKSB7XG4gICAgdGhpcy5lbWl0RXZlbnQoJ2Rlc3Ryb3knKVxuICAgIHRoaXMuX3JlZ2lzdGVyKGZhbHNlKVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBnZXRDb21wb25lbnRzQnlEYXRhUGF0aChkYXRhUGF0aCwgbWF0Y2gpIHtcbiAgICAgIHJldHVybiB0aGlzLl9nZXRFbnRyaWVzQnlEYXRhUGF0aChcbiAgICAgICAgdGhpcy5jb21wb25lbnRzQnlEYXRhUGF0aCxcbiAgICAgICAgZGF0YVBhdGgsXG4gICAgICAgIG1hdGNoXG4gICAgICApXG4gICAgfSxcblxuICAgIGdldENvbXBvbmVudEJ5RGF0YVBhdGgoZGF0YVBhdGgsIG1hdGNoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRDb21wb25lbnRzQnlEYXRhUGF0aChkYXRhUGF0aCwgbWF0Y2gpWzBdIHx8IG51bGxcbiAgICB9LFxuXG4gICAgZ2V0Q29tcG9uZW50c0J5TmFtZShkYXRhUGF0aCwgbWF0Y2gpIHtcbiAgICAgIHJldHVybiB0aGlzLl9nZXRFbnRyaWVzQnlOYW1lKHRoaXMuY29tcG9uZW50c0J5RGF0YVBhdGgsIGRhdGFQYXRoLCBtYXRjaClcbiAgICB9LFxuXG4gICAgZ2V0Q29tcG9uZW50QnlOYW1lKG5hbWUsIG1hdGNoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRDb21wb25lbnRzQnlOYW1lKG5hbWUsIG1hdGNoKVswXSB8fCBudWxsXG4gICAgfSxcblxuICAgIGdldENvbXBvbmVudHMoZGF0YVBhdGhPck5hbWUsIG1hdGNoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0RW50cmllcyh0aGlzLmNvbXBvbmVudHNCeURhdGFQYXRoLCBkYXRhUGF0aE9yTmFtZSwgbWF0Y2gpXG4gICAgfSxcblxuICAgIGdldENvbXBvbmVudChkYXRhUGF0aE9yTmFtZSwgbWF0Y2gpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldENvbXBvbmVudHMoZGF0YVBhdGhPck5hbWUsIG1hdGNoKVswXSB8fCBudWxsXG4gICAgfSxcblxuICAgIGdldFBhbmVsc0J5RGF0YVBhdGgoZGF0YVBhdGgsIG1hdGNoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0RW50cmllc0J5RGF0YVBhdGgodGhpcy5wYW5lbHNCeURhdGFQYXRoLCBkYXRhUGF0aCwgbWF0Y2gpXG4gICAgfSxcblxuICAgIGdldFBhbmVsQnlEYXRhUGF0aChkYXRhUGF0aCwgbWF0Y2gpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFBhbmVsc0J5RGF0YVBhdGgoZGF0YVBhdGgsIG1hdGNoKVswXSB8fCBudWxsXG4gICAgfSxcblxuICAgIGdldFBhbmVscyhkYXRhUGF0aE9yTmFtZSwgbWF0Y2gpIHtcbiAgICAgIHJldHVybiB0aGlzLl9nZXRFbnRyaWVzKHRoaXMucGFuZWxzQnlEYXRhUGF0aCwgZGF0YVBhdGhPck5hbWUsIG1hdGNoKVxuICAgIH0sXG5cbiAgICBnZXRQYW5lbChkYXRhUGF0aE9yTmFtZSwgbWF0Y2gpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFBhbmVscyhkYXRhUGF0aE9yTmFtZSwgbWF0Y2gpWzBdIHx8IG51bGxcbiAgICB9LFxuXG4gICAgc29tZUNvbXBvbmVudChjYWxsYmFjaykge1xuICAgICAgcmV0dXJuIHRoaXMuaXNQb3B1bGF0ZWQgJiYgdGhpcy5jb21wb25lbnRzLnNvbWUoY2FsbGJhY2spXG4gICAgfSxcblxuICAgIGV2ZXJ5Q29tcG9uZW50KGNhbGxiYWNrKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1BvcHVsYXRlZCAmJiB0aGlzLmNvbXBvbmVudHMuZXZlcnkoY2FsbGJhY2spXG4gICAgfSxcblxuICAgIG9uRXhwYW5kKGV4cGFuZCkge1xuICAgICAgdGhpcy5lbWl0RXZlbnQoJ2V4cGFuZCcsIHtcbiAgICAgICAgLy8gVE9ETzogQWN0dWFsbHkgZXhwb3NlIHRoaXMgb24gRGl0b0NvbnRleHQ/XG4gICAgICAgIGNvbnRleHQ6IHsgZXhwYW5kIH1cbiAgICAgIH0pXG4gICAgICAvLyBQcmV2ZW50IGNsb3NpbmcgdGhlIHNjaGVtYSB3aXRoIGludmFsaWQgZGF0YSwgc2luY2UgdGhlIGluLWNvbXBvbmVudFxuICAgICAgLy8gdmFsaWRhdGlvbiB3aWxsIG5vdCBiZSBleGVjdXRlZCBvbmNlIGl0J3MgY2xvc2VkLlxuXG4gICAgICAvLyBUT0RPOiBNb3ZlIHZhbGlkYXRpb24gb3V0IG9mIGNvbXBvbmVudHMsIHRvIHNjaGVtYSwganVzdCBsaWtlXG4gICAgICAvLyBwcm9jZXNzaW5nLCBhbmQgdXNlIGBzaG93VmFsaWRhdGlvbkVycm9ycygpYCBmb3IgdGhlIHJlc3VsdGluZyBlcnJvcnMsXG4gICAgICAvLyB0aGVuIHJlbW92ZSB0aGlzIHJlcXVpcmVtZW50LCBzaW5jZSB3ZSBjYW4gdmFsaWRhdGUgY2xvc2VkIGZvcm1zIGFuZFxuICAgICAgLy8gc2NoZW1hcyB0aGVuLlxuICAgICAgaWYgKCF0aGlzLm9wZW5lZCB8fCBleHBhbmQgfHwgdGhpcy52YWxpZGF0ZUFsbCgpKSB7XG4gICAgICAgIHRoaXMub3BlbmVkID0gZXhwYW5kXG4gICAgICB9XG4gICAgfSxcblxuICAgIG9uQ2hhbmdlKCkge1xuICAgICAgdGhpcy5lbWl0RXZlbnQoJ2NoYW5nZScpXG4gICAgfSxcblxuICAgIHJlc2V0VmFsaWRhdGlvbigpIHtcbiAgICAgIGZvciAoY29uc3QgY29tcG9uZW50IG9mIHRoaXMuY29tcG9uZW50cykge1xuICAgICAgICBjb21wb25lbnQucmVzZXRWYWxpZGF0aW9uKClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY2xlYXJFcnJvcnMoKSB7XG4gICAgICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiB0aGlzLmNvbXBvbmVudHMpIHtcbiAgICAgICAgY29tcG9uZW50LmNsZWFyRXJyb3JzKClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZm9jdXMoKSB7XG4gICAgICB0aGlzLnBhcmVudFNjaGVtYUNvbXBvbmVudD8uZm9jdXMoKVxuICAgICAgdGhpcy5vcGVuZWQgPSB0cnVlXG4gICAgfSxcblxuICAgIHZhbGlkYXRlQWxsKG1hdGNoLCBub3RpZnkgPSB0cnVlKSB7XG4gICAgICBjb25zdCB7IGNvbXBvbmVudHNCeURhdGFQYXRoIH0gPSB0aGlzXG4gICAgICBsZXQgZGF0YVBhdGhzXG4gICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgY29uc3QgY2hlY2sgPSBpc0Z1bmN0aW9uKG1hdGNoKVxuICAgICAgICAgID8gbWF0Y2hcbiAgICAgICAgICA6IGlzUmVnRXhwKG1hdGNoKVxuICAgICAgICAgICAgPyBmaWVsZCA9PiBtYXRjaC50ZXN0KGZpZWxkKVxuICAgICAgICAgICAgOiBudWxsXG4gICAgICAgIGRhdGFQYXRocyA9IGNoZWNrXG4gICAgICAgICAgPyBPYmplY3Qua2V5cyhjb21wb25lbnRzQnlEYXRhUGF0aCkuZmlsdGVyKGNoZWNrKVxuICAgICAgICAgIDogaXNBcnJheShtYXRjaClcbiAgICAgICAgICAgID8gbWF0Y2hcbiAgICAgICAgICAgIDogW21hdGNoXVxuICAgICAgfVxuICAgICAgaWYgKG5vdGlmeSkge1xuICAgICAgICB0aGlzLmNsZWFyRXJyb3JzKClcbiAgICAgIH1cbiAgICAgIGxldCBpc1ZhbGlkID0gdHJ1ZVxuICAgICAgbGV0IGZpcnN0ID0gdHJ1ZVxuICAgICAgZGF0YVBhdGhzIHx8PSBPYmplY3Qua2V5cyhjb21wb25lbnRzQnlEYXRhUGF0aClcbiAgICAgIGZvciAoY29uc3QgZGF0YVBhdGggb2YgZGF0YVBhdGhzKSB7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudHMgPSB0aGlzLmdldENvbXBvbmVudHNCeURhdGFQYXRoKGRhdGFQYXRoKVxuICAgICAgICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiBjb21wb25lbnRzKSB7XG4gICAgICAgICAgaWYgKCFjb21wb25lbnQudmFsaWRhdGUobm90aWZ5KSkge1xuICAgICAgICAgICAgLy8gRm9jdXMgZmlyc3QgZXJyb3IgZmllbGRcbiAgICAgICAgICAgIGlmIChub3RpZnkgJiYgZmlyc3QpIHtcbiAgICAgICAgICAgICAgY29tcG9uZW50LmZvY3VzKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpcnN0ID0gZmFsc2VcbiAgICAgICAgICAgIGlzVmFsaWQgPSBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG5vdGlmeSAmJiAhaXNWYWxpZCkge1xuICAgICAgICB0aGlzLm5vdGlmeUVycm9ycygpXG4gICAgICB9XG4gICAgICByZXR1cm4gaXNWYWxpZFxuICAgIH0sXG5cbiAgICB2ZXJpZnlBbGwobWF0Y2gpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlQWxsKG1hdGNoLCBmYWxzZSlcbiAgICB9LFxuXG4gICAgYXN5bmMgc2hvd1ZhbGlkYXRpb25FcnJvcnMoZXJyb3JzLCBmb2N1cykge1xuICAgICAgdGhpcy5jbGVhckVycm9ycygpXG4gICAgICBsZXQgZmlyc3QgPSB0cnVlXG4gICAgICBjb25zdCB1bm1hdGNoZWQgPSBbXVxuICAgICAgZm9yIChjb25zdCBbZGF0YVBhdGgsIGVycnNdIG9mIE9iamVjdC5lbnRyaWVzKGVycm9ycykpIHtcbiAgICAgICAgLy8gSWYgdGhlIHNjaGVtYSBpcyBhIGRhdGEtcm9vdCwgcHJlZml4IGl0cyBvd24gZGF0YVBhdGggdG8gYWxsIGVycm9ycyxcbiAgICAgICAgLy8gc2luY2UgdGhlIGRhdGEgdGhhdCBpdCBzZW5kcyBhbmQgdmFsaWRhdGVzIHdpbGwgYmUgdW5wcmVmaXhlZC5cbiAgICAgICAgY29uc3QgZnVsbERhdGFQYXRoID0gdGhpcy5oYXNPd25EYXRhXG4gICAgICAgICAgPyBhcHBlbmREYXRhUGF0aCh0aGlzLmRhdGFQYXRoLCBkYXRhUGF0aClcbiAgICAgICAgICA6IGRhdGFQYXRoXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMsIHRoaXMuZGF0YVBhdGgsIHRoaXMuaGFzT3duRGF0YSwgZnVsbERhdGFQYXRoKVxuICAgICAgICAvLyBDb252ZXJ0IGZyb20gSmF2YVNjcmlwdCBwcm9wZXJ0eSBhY2Nlc3Mgbm90YXRpb24sIHRvIG91ciBvd24gZm9ybVxuICAgICAgICAvLyBvZiByZWxhdGl2ZSBKU09OIHBvaW50ZXJzIGFzIGRhdGEtcGF0aHM6XG4gICAgICAgIGNvbnN0IGRhdGFQYXRoUGFydHMgPSBwYXJzZURhdGFQYXRoKGZ1bGxEYXRhUGF0aClcbiAgICAgICAgbGV0IGZvdW5kID0gZmFsc2VcbiAgICAgICAgY29uc3QgY29tcG9uZW50cyA9IHRoaXMuZ2V0Q29tcG9uZW50c0J5RGF0YVBhdGgoZGF0YVBhdGhQYXJ0cylcbiAgICAgICAgZm9yIChjb25zdCBjb21wb25lbnQgb2YgY29tcG9uZW50cykge1xuICAgICAgICAgIGlmIChjb21wb25lbnQuc2hvd1ZhbGlkYXRpb25FcnJvcnMoZXJycywgZmlyc3QgJiYgZm9jdXMpKSB7XG4gICAgICAgICAgICBmb3VuZCA9IHRydWVcbiAgICAgICAgICAgIGZpcnN0ID0gZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICAgIC8vIENvdWxkbid0IGZpbmQgYSBjb21wb25lbnQgaW4gYW4gYWN0aXZlIGZvcm0gZm9yIHRoZSBnaXZlbiBkYXRhUGF0aC5cbiAgICAgICAgICAvLyBTZWUgaWYgd2UgY2FuIGZpbmQgYSBjb21wb25lbnQgc2VydmluZyBhIHBhcnQgb2YgdGhlIGRhdGFQYXRoLFxuICAgICAgICAgIC8vIGFuZCB0YWtlIGl0IGZyb20gdGhlcmU6XG4gICAgICAgICAgY29uc3QgcHJvcGVydHkgPSBkYXRhUGF0aFBhcnRzLnBvcCgpXG4gICAgICAgICAgd2hpbGUgKGRhdGFQYXRoUGFydHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50cyA9IHRoaXMuZ2V0Q29tcG9uZW50c0J5RGF0YVBhdGgoZGF0YVBhdGhQYXJ0cylcbiAgICAgICAgICAgIGZvciAoY29uc3QgY29tcG9uZW50IG9mIGNvbXBvbmVudHMpIHtcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGF3YWl0IGNvbXBvbmVudC5uYXZpZ2F0ZVRvQ29tcG9uZW50Py4oXG4gICAgICAgICAgICAgICAgICBmdWxsRGF0YVBhdGgsXG4gICAgICAgICAgICAgICAgICBzdWJDb21wb25lbnRzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZvdW5kID0gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBjb21wb25lbnQgb2Ygc3ViQ29tcG9uZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycnMgPSBlcnJvcnNbY29tcG9uZW50LmRhdGFQYXRoXVxuICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycnMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zaG93VmFsaWRhdGlvbkVycm9ycyhlcnJzLCBmaXJzdCAmJiBmb2N1cylcbiAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm91bmRcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIC8vIEZvdW5kIGEgbmVzdGVkIGZvcm0gdG8gZGlzcGxheSBhdCBsZWFzdCBwYXJ0cyBmbyB0aGUgZXJyb3JzLlxuICAgICAgICAgICAgICAgIC8vIFdlIGNhbid0IHNob3cgYWxsIGVycm9ycyBhdCBvbmNlLCBzbyB3ZSdyZSBkb25lLiBEb24ndCBjYWxsXG4gICAgICAgICAgICAgICAgLy8gYG5vdGlmeUVycm9ycygpYCB5ZXQsIGFzIHdlIGNhbiBvbmx5IGRpc3BsYXkgaXQgb25jZVxuICAgICAgICAgICAgICAgIC8vIGBzaG93VmFsaWRhdGlvbkVycm9ycygpYCB3YXMgY2FsbGVkIGZyb20gYERpdG9Gb3JtLm1vdW50ZWQoKWBcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gU3RpbGwgaGVyZSwgc28ga2VlcCByZW1vdmluZyB0aGUgbGFzdCBwYXJ0IHVudGlsIHdlIGZpbmQgYSBtYXRjaC5cbiAgICAgICAgICAgIGRhdGFQYXRoUGFydHMucG9wKClcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gV2hlbiB0aGUgZXJyb3IgY2FuJ3QgYmUgbWF0Y2hlZCwgYWRkIGl0IHRvIGEgbGlzdCBvZiB1bm1hdGNoZWRcbiAgICAgICAgICAvLyBlcnJvcnMgd2l0aCBkZWNlbnQgbWVzc2FnZSwgdG8gcmVwb3J0IGF0IHRoZSBlbmQuXG4gICAgICAgICAgY29uc3QgZmllbGQgPSBsYWJlbGl6ZShwcm9wZXJ0eSlcbiAgICAgICAgICBmb3IgKGNvbnN0IGVyciBvZiBlcnJzKSB7XG4gICAgICAgICAgICBjb25zdCBwcmVmaXggPSBmaWVsZFxuICAgICAgICAgICAgICA/IGBUaGUgZmllbGQgJHtmaWVsZH1gXG4gICAgICAgICAgICAgIDogYFRoZSAke3RoaXMuZm9ybUxhYmVsfWBcbiAgICAgICAgICAgIHVubWF0Y2hlZC5wdXNoKGAke3ByZWZpeH0gJHtlcnIubWVzc2FnZX1gKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmaXJzdCA9IGZhbHNlXG4gICAgICB9XG4gICAgICBpZiAoIWZpcnN0KSB7XG4gICAgICAgIHRoaXMubm90aWZ5RXJyb3JzKHVubWF0Y2hlZC5qb2luKCdcXG4nKSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgbm90aWZ5RXJyb3JzKG1lc3NhZ2UpIHtcbiAgICAgIHRoaXMubm90aWZ5KHtcbiAgICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgICAgdGl0bGU6ICdWYWxpZGF0aW9uIEVycm9ycycsXG4gICAgICAgIHRleHQ6IG1lc3NhZ2UgfHwgJ1BsZWFzZSBjb3JyZWN0IHRoZSBoaWdobGlnaHRlZCBlcnJvcnMuJ1xuICAgICAgfSlcbiAgICB9LFxuXG4gICAgcmVzZXREYXRhKCkge1xuICAgICAgLy8gV2UgY2FuJ3Qgc2V0IGB0aGlzLmRhdGEgPSAuLi5gIGJlY2F1c2UgaXQncyBhIHByb3BlcnR5LCBidXQgd2UgY2FuIHNldFxuICAgICAgLy8gYWxsIGtub3duIHByb3BlcnRpZXMgb24gaXQgdG8gdGhlIHZhbHVlcyByZXR1cm5lZCBieVxuICAgICAgLy8gYHNldERlZmF1bHRWYWx1ZXMoKWAsIGFzIHRoZXkgYXJlIGFsbCByZWFjdGl2ZSBhbHJlYWR5IGZyb20gdGhlIHN0YXJ0czpcbiAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5kYXRhLCBzZXREZWZhdWx0VmFsdWVzKHRoaXMuc2NoZW1hLCB7fSwgdGhpcykpXG4gICAgICB0aGlzLmNsZWFyRXJyb3JzKClcbiAgICB9LFxuXG4gICAgc2V0RGF0YShkYXRhKSB7XG4gICAgICBmb3IgKGNvbnN0IG5hbWUgaW4gZGF0YSkge1xuICAgICAgICBpZiAobmFtZSBpbiB0aGlzLmRhdGEpIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdnVlL25vLW11dGF0aW5nLXByb3BzXG4gICAgICAgICAgdGhpcy5kYXRhW25hbWVdID0gZGF0YVtuYW1lXVxuICAgICAgICAgIGZvciAoY29uc3QgY29tcG9uZW50IG9mIHRoaXMuZ2V0Q29tcG9uZW50c0J5TmFtZShuYW1lKSkge1xuICAgICAgICAgICAgY29tcG9uZW50Lm1hcmtEaXJ0eSgpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGZpbHRlckRhdGEoZGF0YSkge1xuICAgICAgLy8gRmlsdGVycyBvdXQgYXJyYXlzIGFuZCBvYmplY3RzIHRoYXQgYXJlIGJhY2sgYnkgZGF0YSByZXNvdXJjZXNcbiAgICAgIC8vIHRoZW1zZWx2ZXMsIGFzIHRob3NlIGFyZSBhbHJlYWR5IHRha2luZyBjYXJlIG9mIHRocm91Z2ggdGhlaXIgb3duIEFQSVxuICAgICAgLy8gcmVzb3VyY2UgZW5kLXBvaW50cyBhbmQgc2hvdWxkbid0IGJlIHNldC5cbiAgICAgIGNvbnN0IGNvcHkgPSB7fVxuICAgICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRhdGEpKSB7XG4gICAgICAgIGlmIChpc0FycmF5KHZhbHVlKSB8fCBpc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgICBjb25zdCBjb21wb25lbnRzID0gdGhpcy5nZXRDb21wb25lbnRzQnlOYW1lKG5hbWUpXG4gICAgICAgICAgaWYgKGNvbXBvbmVudHMuc29tZShjb21wb25lbnQgPT4gY29tcG9uZW50LnByb3ZpZGVzRGF0YSkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvcHlbbmFtZV0gPSB2YWx1ZVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNvcHlcbiAgICB9LFxuXG4gICAgcHJvY2Vzc0RhdGEoeyB0YXJnZXQgPSAnY2xpcGJvYXJkJywgc2NoZW1hT25seSA9IHRydWUgfSA9IHt9KSB7XG4gICAgICByZXR1cm4gcHJvY2Vzc0RhdGEoXG4gICAgICAgIHRoaXMuc2NoZW1hLFxuICAgICAgICB0aGlzLnNvdXJjZVNjaGVtYSxcbiAgICAgICAgdGhpcy5kYXRhLFxuICAgICAgICB0aGlzLmRhdGFQYXRoLFxuICAgICAgICB7XG4gICAgICAgICAgLy8gTmVlZGVkIGZvciBEaXRvQ29udGV4dCBoYW5kbGluZyBpbnNpZGUgYHByb2Nlc3NEYXRhYCBhbmRcbiAgICAgICAgICAvLyBgcHJvY2Vzc1NjaGVtYURhdGEoKWA6XG4gICAgICAgICAgY29tcG9uZW50OiB0aGlzLFxuICAgICAgICAgIHNjaGVtYU9ubHksXG4gICAgICAgICAgdGFyZ2V0XG4gICAgICAgIH1cbiAgICAgIClcbiAgICB9LFxuXG4gICAgX3JlZ2lzdGVyKGFkZCkge1xuICAgICAgLy8gYCRzY2hlbWFQYXJlbnRDb21wb25lbnQoKWAgaXMgb25seSBzZXQgaWYgb25lIG9mIHRoZSBhbmNlc3RvcnMgdXNlc1xuICAgICAgLy8gdGhlIGBTY2hlbWFQYXJlbnRNaXhpbmA6XG4gICAgICB0aGlzLiRzY2hlbWFQYXJlbnRDb21wb25lbnQoKT8uX3JlZ2lzdGVyU2NoZW1hQ29tcG9uZW50KHRoaXMsIGFkZClcbiAgICB9LFxuXG4gICAgX3JlZ2lzdGVyQ29tcG9uZW50KGNvbXBvbmVudCwgYWRkKSB7XG4gICAgICB0aGlzLl9yZWdpc3RlckVudHJ5KHRoaXMuY29tcG9uZW50c1JlZ2lzdHJ5LCBjb21wb25lbnQsIGFkZClcbiAgICAgIC8vIE9ubHkgcmVnaXN0ZXIgd2l0aCB0aGUgcGFyZW50IGlmIHNjaGVtYSBzaGFyZXMgZGF0YSB3aXRoIGl0LlxuICAgICAgdGhpcy5wYXJlbnRTY2hlbWFDb21wb25lbnQ/Ll9yZWdpc3RlckNvbXBvbmVudChjb21wb25lbnQsIGFkZClcbiAgICB9LFxuXG4gICAgX3JlZ2lzdGVyUGFuZShwYW5lLCBhZGQpIHtcbiAgICAgIHRoaXMuX3JlZ2lzdGVyRW50cnkodGhpcy5wYW5lc1JlZ2lzdHJ5LCBwYW5lLCBhZGQpXG4gICAgfSxcblxuICAgIF9yZWdpc3RlclBhbmVsKHBhbmVsLCBhZGQpIHtcbiAgICAgIHRoaXMuX3JlZ2lzdGVyRW50cnkodGhpcy5wYW5lbHNSZWdpc3RyeSwgcGFuZWwsIGFkZClcbiAgICB9LFxuXG4gICAgX3JlZ2lzdGVyRW50cnkocmVnaXN0cnksIGVudHJ5LCBhZGQpIHtcbiAgICAgIGNvbnN0IHVpZCA9IGVudHJ5LiR1aWRcbiAgICAgIGlmIChhZGQpIHtcbiAgICAgICAgcmVnaXN0cnlbdWlkXSA9IGVudHJ5XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgcmVnaXN0cnlbdWlkXVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBfbGlzdEVudHJpZXNCeURhdGFQYXRoKHJlZ2lzdHJ5KSB7XG4gICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhyZWdpc3RyeSkucmVkdWNlKChlbnRyaWVzQnlEYXRhUGF0aCwgZW50cnkpID0+IHtcbiAgICAgICAgLy8gTXVsdGlwbGUgZW50cmllcyBjYW4gYmUgbGlua2VkIHRvIHRoZSBzYW1lIGRhdGEtcGF0aCwgZS5nLiB3aGVuXG4gICAgICAgIC8vIHRoZXJlIGFyZSB0YWJzLiBMaW5rIGVhY2ggZGF0YS1wYXRoIHRvIGFuIGFycmF5IG9mIGVudHJpZXMuXG4gICAgICAgIGNvbnN0IHsgZGF0YVBhdGggfSA9IGVudHJ5XG4gICAgICAgIGNvbnN0IGVudHJpZXMgPSAoZW50cmllc0J5RGF0YVBhdGhbZGF0YVBhdGhdIHx8PSBbXSlcbiAgICAgICAgZW50cmllcy5wdXNoKGVudHJ5KVxuICAgICAgICByZXR1cm4gZW50cmllc0J5RGF0YVBhdGhcbiAgICAgIH0sIHt9KVxuICAgIH0sXG5cbiAgICBfZ2V0RW50cmllcyhlbnRyaWVzQnlEYXRhUGF0aCwgZGF0YVBhdGgsIG1hdGNoKSB7XG4gICAgICByZXR1cm4gbm9ybWFsaXplRGF0YVBhdGgoZGF0YVBhdGgpLnN0YXJ0c1dpdGgodGhpcy5kYXRhUGF0aClcbiAgICAgICAgPyB0aGlzLl9nZXRFbnRyaWVzQnlEYXRhUGF0aChlbnRyaWVzQnlEYXRhUGF0aCwgZGF0YVBhdGgsIG1hdGNoKVxuICAgICAgICA6IHRoaXMuX2dldEVudHJpZXNCeU5hbWUoZW50cmllc0J5RGF0YVBhdGgsIGRhdGFQYXRoLCBtYXRjaClcbiAgICB9LFxuXG4gICAgX2dldEVudHJpZXNCeURhdGFQYXRoKGVudHJpZXNCeURhdGFQYXRoLCBkYXRhUGF0aCwgbWF0Y2gpIHtcbiAgICAgIHJldHVybiB0aGlzLl9maWx0ZXJFbnRyaWVzKFxuICAgICAgICBlbnRyaWVzQnlEYXRhUGF0aFtub3JtYWxpemVEYXRhUGF0aChkYXRhUGF0aCldIHx8IFtdLFxuICAgICAgICBtYXRjaFxuICAgICAgKVxuICAgIH0sXG5cbiAgICBfZ2V0RW50cmllc0J5TmFtZShlbnRyaWVzQnlEYXRhUGF0aCwgbmFtZSwgbWF0Y2gpIHtcbiAgICAgIHJldHVybiB0aGlzLl9maWx0ZXJFbnRyaWVzKFxuICAgICAgICBlbnRyaWVzQnlEYXRhUGF0aFthcHBlbmREYXRhUGF0aCh0aGlzLmRhdGFQYXRoLCBuYW1lKV0gfHwgW10sXG4gICAgICAgIG1hdGNoXG4gICAgICApXG4gICAgfSxcblxuICAgIF9maWx0ZXJFbnRyaWVzKGVudHJpZXMsIG1hdGNoKSB7XG4gICAgICByZXR1cm4gbWF0Y2ggPyBlbnRyaWVzLmZpbHRlcihtYXRjaCkgOiBlbnRyaWVzXG4gICAgfVxuICB9XG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tc2NoZW1hIHtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgLy8gVG8gZGlzcGxheSBzY2hlbWEgbmV4dCB0byBwYW5lbHM6XG4gIGRpc3BsYXk6IGZsZXg7XG4gIG1pbi1oZWlnaHQ6IDEwMCU7XG5cbiAgPiAuZGl0by1zY2hlbWEtY29udGVudCB7XG4gICAgZmxleDogMSAxIDEwMCU7XG4gICAgLy8gU28gdGhhdCBzY2hlbWEgYnV0dG9ucyBjYW4gYmUgc3RpY2t5IHRvIHRoZSBib3R0b206XG4gICAgZGlzcGxheTogZ3JpZDtcbiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IG1pbi1jb250ZW50O1xuXG4gICAgPiAqOm9ubHktY2hpbGQge1xuICAgICAgZ3JpZC1yb3ctZW5kOiBub25lO1xuICAgIH1cblxuICAgIG1heC13aWR0aDogJGNvbnRlbnQtd2lkdGg7XG4gICAgcGFkZGluZzogJGNvbnRlbnQtcGFkZGluZztcbiAgfVxuXG4gID4gLmRpdG8tYnV0dG9ucyxcbiAgPiAuZGl0by1wYW5lbHMge1xuICAgIGZsZXg6IDEgMSAwJTtcbiAgfVxuXG4gID4gLmRpdG8tYnV0dG9ucyB7XG4gICAgbWFyZ2luLWxlZnQ6ICRmb3JtLXNwYWNpbmc7XG4gIH1cblxuICA+IC5kaXRvLXBhbmVscyB7XG4gICAgcGFkZGluZzogJGNvbnRlbnQtcGFkZGluZyAkY29udGVudC1wYWRkaW5nICRjb250ZW50LXBhZGRpbmcgMDtcbiAgfVxuXG4gIC8vIERpc3BsYXkgYSBydWxlciBiZXR3ZWVuIHRhYmJlZCBjb21wb25lbnRzIGFuZCB0b3dhcmRzIHRoZSAuZGl0by1idXR0b25zXG4gIC5kaXRvLXBhbmUtdGFiICsgLmRpdG8tcGFuZS1tYWluIHtcbiAgICAmOjpiZWZvcmUge1xuICAgICAgLy8gVXNlIGEgcHNldWRvIGVsZW1lbnQgdG8gZGlzcGxheSBhIHJ1bGVyIHdpdGggcHJvcGVyIG1hcmdpbnNcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgY29udGVudDogJyc7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGJvcmRlci1ib3R0b206ICRib3JkZXItc3R5bGU7XG4gICAgICAvLyBBZGQgcmVtb3ZlZCAkZm9ybS1zcGFjaW5nIGFnYWluIHRvIHRoZSBydWxlclxuICAgICAgbWFyZ2luOiAkY29udGVudC1wYWRkaW5nICRmb3JtLXNwYWNpbmctaGFsZiAkZm9ybS1zcGFjaW5nLWhhbGY7XG4gICAgfVxuICB9XG59XG5cbi5kaXRvLXNjaGVtYS1oZWFkZXIge1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG5cbiAgLmRpdG8tdGFicyxcbiAgLmRpdG8tY2xpcGJvYXJkIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLXNlbGY6IGZsZXgtZW5kO1xuICB9XG5cbiAgLmRpdG8tY2xpcGJvYXJkIHtcbiAgICAmOm9ubHktY2hpbGQge1xuICAgICAgbWFyZ2luLWxlZnQ6IGF1dG87XG4gICAgfVxuXG4gICAgLmRpdG8tYnV0dG9uIHtcbiAgICAgIG1hcmdpbjogMCAwICR0YWItbWFyZ2luICR0YWItbWFyZ2luO1xuICAgIH1cbiAgfVxuXG4gICYuZGl0by1zY2hlbWEtbWVudS1oZWFkZXIge1xuICAgIC8vIEJyaW5nIHRoZSB0YWJzIHVwIHRvIHRoZSBtZW51LlxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBoZWlnaHQ6ICRtZW51LWhlaWdodDtcbiAgICBwYWRkaW5nOiAwICRtZW51LXBhZGRpbmctaG9yO1xuICAgIG1heC13aWR0aDogJGNvbnRlbnQtd2lkdGg7XG4gICAgdG9wOiAwO1xuICAgIGxlZnQ6IDA7XG4gICAgcmlnaHQ6IDA7XG4gICAgei1pbmRleDogJG1lbnUtei1pbmRleDtcbiAgICAvLyBUdXJuIG9mZiBwb2ludGVyIGV2ZW50cyBzbyB0aGF0IERpdG9UcmFpbCBrZWVwcyByZWNlaXZpbmcgZXZlbnRzLi4uXG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgLy8gLi4uYnV0IGFsbG93IGludGVyYWN0aW9uIHdpdGggdGhlIHRhYnMgYW5kIGJ1dHRvbnMgKGUuZy4gY2xpcGJvYXJkKVxuICAgIC8vIGxheWVyZWQgb24gdG9wIG9mIERpdG9UcmFpbC5cbiAgICAuZGl0by10YWJzLFxuICAgIC5kaXRvLWJ1dHRvbnMge1xuICAgICAgcG9pbnRlci1ldmVudHM6IGF1dG87XG4gICAgICBsaW5lLWhlaWdodDogJG1lbnUtbGluZS1oZWlnaHQ7XG4gICAgICBmb250LXNpemU6ICRtZW51LWZvbnQtc2l6ZTtcbiAgICB9XG4gIH1cblxuICBidXR0b24uZGl0by1sYWJlbCB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgLy8gQ2F0Y2ggYWxsIGNsaWNrcywgZXZlbiB3aGVuIGl0IHdvdWxkIGJlIHBhcnRpYWxseSBjb3ZlcmVkIGJ5IHNjaGVtYS5cbiAgICB6LWluZGV4OiAxO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbkRpdG9TY2hlbWEuZGl0by1zY2hlbWEtaW5saW5lZChcbiAgOnNjaGVtYT1cInNjaGVtYVwiXG4gIDpkYXRhUGF0aD1cImRhdGFQYXRoXCJcbiAgOmRhdGE9XCJkYXRhXCJcbiAgOm1ldGE9XCJtZXRhXCJcbiAgOnN0b3JlPVwic3RvcmVcIlxuICA6bGFiZWw9XCJpc0NvbXBhY3QgPyBudWxsIDogbGFiZWxcIlxuICA6aW5saW5lZD1cInRydWVcIlxuICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gIDpjb2xsYXBzZWQ9XCJjb2xsYXBzZWRcIlxuICA6Y29sbGFwc2libGU9XCJjb2xsYXBzaWJsZVwiXG4gIDpnZW5lcmF0ZUxhYmVscz1cIiFpc0NvbXBhY3RcIlxuICA6Y2xhc3M9XCJ7ICdkaXRvLXNjaGVtYS1jb21wYWN0JzogaXNDb21wYWN0IH1cIlxuKVxuICAvLy0gUmVuZGVyIGRpdG8tZWRpdC1idXR0b25zIGZvciBpbmxpbmVkIHNjaGVtYXMgc2VwYXJhdGVseSBmcm9tIGFsbFxuICAvLy0gb3RoZXJzIGluIGBUeXBlTGlzdGAgYXMgYSBzY29wZSwgZm9yIGJldHRlciBoYW5kbGluZyBvZiBsYXlvdXQuXG4gIHRlbXBsYXRlKCNlZGl0LWJ1dHRvbnMpXG4gICAgRGl0b0VkaXRCdXR0b25zKFxuICAgICAgdi1pZj1cImRlbGV0YWJsZSB8fCBkcmFnZ2FibGUgfHwgZWRpdGFibGVcIlxuICAgICAgOmRlbGV0YWJsZT1cImRlbGV0YWJsZVwiXG4gICAgICA6ZHJhZ2dhYmxlPVwiZHJhZ2dhYmxlXCJcbiAgICAgIDplZGl0YWJsZT1cImVkaXRhYmxlXCJcbiAgICAgIDplZGl0UGF0aD1cImVkaXRQYXRoXCJcbiAgICAgIDpzY2hlbWE9XCJzY2hlbWFcIlxuICAgICAgOmRhdGFQYXRoPVwiZGF0YVBhdGhcIlxuICAgICAgOmRhdGE9XCJkYXRhXCJcbiAgICAgIDptZXRhPVwibWV0YVwiXG4gICAgICA6c3RvcmU9XCJzdG9yZVwiXG4gICAgICBAZGVsZXRlPVwiJGVtaXQoJ2RlbGV0ZScpXCJcbiAgICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCB7IGlzQ29tcGFjdCB9IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b1NjaGVtYUlubGluZWQnLCB7XG4gIGVtaXRzOiBbJ2RlbGV0ZSddLFxuXG4gIHByb3BzOiB7XG4gICAgc2NoZW1hOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBkYXRhUGF0aDogeyB0eXBlOiBTdHJpbmcsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZGF0YTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgbWV0YTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgc3RvcmU6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGxhYmVsOiB7IHR5cGU6IFtTdHJpbmcsIE9iamVjdF0sIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGNvbGxhcHNlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGNvbGxhcHNpYmxlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgZHJhZ2dhYmxlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgZWRpdGFibGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBkZWxldGFibGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBlZGl0UGF0aDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgaXNDb21wYWN0KCkge1xuICAgICAgcmV0dXJuIGlzQ29tcGFjdCh0aGlzLnNjaGVtYSlcbiAgICB9LFxuXG4gICAgaGFzTGFiZWwoKSB7XG4gICAgICByZXR1cm4gIXRoaXMuaXNDb21wYWN0ICYmICEhdGhpcy5sYWJlbFxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXNjaGVtYS1pbmxpbmVkIHtcbiAgPiAuZGl0by1zY2hlbWEtY29udGVudCB7XG4gICAgcGFkZGluZzogMDtcblxuICAgID4gLmRpdG8tc2NoZW1hLWhlYWRlciB7XG4gICAgICAvLyBDaGFuZ2Ugc3BhY2luZyBzbyAuZGl0by1sYWJlbCBjb3ZlcnMgdGhlIGZ1bGwgLmRpdG8tc2NoZW1hLWhlYWRlci5cbiAgICAgIG1hcmdpbjogLSRmb3JtLXNwYWNpbmc7XG5cbiAgICAgIC5kaXRvLWxhYmVsIHtcbiAgICAgICAgLy8gQWRkIHJlbW92ZWQgJGZvcm0tc3BhY2luZyBhZ2FpblxuICAgICAgICAtLWxhYmVsLXBhZGRpbmc6ICN7JGZvcm0tc3BhY2luZ307XG5cbiAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgYm94LXNpemluZzogY29udGVudC1ib3g7XG4gICAgICAgIC8vIEJlY2F1c2UgdGFibGVzIGhhdmUgYSBmdW5ueSB3YXkgb2YgYWxsb3dpbmcgdG9vIG11Y2ggd2lkdGggZ3Jvd3RoOlxuICAgICAgICBtYXgtd2lkdGg6ICRjb250ZW50LXdpZHRoO1xuICAgICAgICAvLyBQcmV2ZW50IGNvbGxhcHNpbmcgdG8gbWluLWhlaWdodCB3aGVuIGFsb25lIGluXG4gICAgICAgIC8vIC5kaXRvLXNjaGVtYS1jb250ZW50LCBkdWUgdG8gZ3JpZC10ZW1wbGF0ZS1yb3dzOiBtaW4tY29udGVudFxuICAgICAgICBtaW4taGVpZ2h0OiAyZW07XG4gICAgICB9XG5cbiAgICAgICYgKyAuZGl0by1wYW5lIHtcbiAgICAgICAgLy8gTmVlZGVkIGZvciB0cmFuc2l0aW9uLWhlaWdodCBpbiBEaXRvU2NoZW1hOlxuICAgICAgICBtaW4taGVpZ2h0OiAkZm9ybS1zcGFjaW5nO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjwhLS0gZXNsaW50LWRpc2FibGUgdnVlL25vLXRlbXBsYXRlLXNoYWRvdyAtLT5cbjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1wYW5lKFxuICB2LWlmPVwiaXNQb3B1bGF0ZWQgJiYgY29tcG9uZW50U2NoZW1hcy5sZW5ndGggPiAwXCJcbiAgdi1zaG93PVwidmlzaWJsZVwiXG4pXG4gIHRlbXBsYXRlKFxuICAgIHYtZm9yPWB7XG4gICAgICBzY2hlbWEsXG4gICAgICBkYXRhUGF0aCxcbiAgICAgIG5lc3RlZERhdGFQYXRoLFxuICAgICAgbmVzdGVkLFxuICAgICAgc3RvcmVcbiAgICB9IGluIGNvbXBvbmVudFNjaGVtYXNgXG4gIClcbiAgICAuZGl0by1icmVhayhcbiAgICAgIHYtaWY9XCJzY2hlbWEuYnJlYWsgPT09ICdiZWZvcmUnXCJcbiAgICApXG4gICAgRGl0b0NvbnRhaW5lcihcbiAgICAgIHYtaWY9XCJzaG91bGRSZW5kZXIoc2NoZW1hKVwiXG4gICAgICA6a2V5PVwibmVzdGVkRGF0YVBhdGhcIlxuICAgICAgOnNjaGVtYT1cInNjaGVtYVwiXG4gICAgICA6ZGF0YVBhdGg9XCJkYXRhUGF0aFwiXG4gICAgICA6ZGF0YT1cImRhdGFcIlxuICAgICAgOm1ldGE9XCJtZXRhXCJcbiAgICAgIDpzdG9yZT1cInN0b3JlXCJcbiAgICAgIDpzaW5nbGU9XCJpc1NpbmdsZUNvbXBvbmVudFwiXG4gICAgICA6bmVzdGVkPVwibmVzdGVkXCJcbiAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICAgIDpnZW5lcmF0ZUxhYmVscz1cImdlbmVyYXRlTGFiZWxzXCJcbiAgICApXG4gICAgLmRpdG8tYnJlYWsoXG4gICAgICB2LWlmPVwic2NoZW1hLmJyZWFrID09PSAnYWZ0ZXInXCJcbiAgICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCB7IGFwcGVuZERhdGFQYXRoIH0gZnJvbSAnLi4vdXRpbHMvZGF0YS5qcydcbmltcG9ydCB7IGdldEFsbFBhbmVsRW50cmllcywgaXNOZXN0ZWQgfSBmcm9tICcuLi91dGlscy9zY2hlbWEuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b1BhbmUnLCB7XG4gIHByb3ZpZGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICR0YWJDb21wb25lbnQ6ICgpID0+IHRoaXMudGFiQ29tcG9uZW50XG4gICAgfVxuICB9LFxuXG4gIHByb3BzOiB7XG4gICAgc2NoZW1hOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBkYXRhUGF0aDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICcnIH0sXG4gICAgZGF0YTogeyB0eXBlOiBPYmplY3QsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBtZXRhOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBzdG9yZTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgdGFiOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIHNpbmdsZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIHZpc2libGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZSB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgZ2VuZXJhdGVMYWJlbHM6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZSB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICB0YWJDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy50YWIgPyB0aGlzIDogdGhpcy4kdGFiQ29tcG9uZW50KClcbiAgICB9LFxuXG4gICAgY29tcG9uZW50U2NoZW1hcygpIHtcbiAgICAgIC8vIENvbXB1dGUgYSBjb21wb25lbnRzIGxpc3Qgd2hpY2ggaGFzIHRoZSBkYXRhUGF0aCBiYWtlZCBpbnRvIGl0cyBrZXlzXG4gICAgICAvLyBhbmQgYWRkcyB0aGUga2V5IGFzIHRoZSBuYW1lIHRvIGVhY2ggY29tcG9uZW50LCB1c2VkIGZvciBsYWJlbHMsIGV0Yy5cbiAgICAgIC8vIE5PVEU6IHNjaGVtYSBjYW4gYmUgbnVsbCB3aGlsZSBtdWx0aS1mb3JtIGxpc3RzIGxvYWQgdGhlaXIgZGF0YSxcbiAgICAgIC8vIGJlY2F1c2Ugb25seSB0aGUgYXZhaWxhYmxlIGRhdGEgd2lsbCBkZXRlcm1pbmUgdGhlIHR5cGUgb2YgZm9ybS5cbiAgICAgIC8vIFdoZW4gZWRpdGluZyBwcmltaXRpdmUgdmFsdWVzIHRocm91Z2ggYSBmb3JtLCBkbyBub3QgYXBwZW5kICduYW1lJyB0b1xuICAgICAgLy8gdGhlIGNvbXBvbmVudCdzIGRhdGFQYXRoIHNvIGl0IGNhbiBiZSBtYXBwZWQgdG8gZnJvbSB2YWxpZGF0aW9uIGVycm9ycy5cbiAgICAgIC8vIE5PVEU6IE5vdCBhbGwgc2NoZW1hcyAvIGNvbXBvbmVudHMgaGF2ZSBhIHNvdXJjZVNjaGVtYSwgZS5nLiBkaWFsb2dzLlxuICAgICAgY29uc3Qgd3JhcFByaW1pdGl2ZXMgPSB0aGlzLnNvdXJjZVNjaGVtYT8ud3JhcFByaW1pdGl2ZXNcbiAgICAgIHJldHVybiBPYmplY3QuZW50cmllcyh0aGlzLnNjaGVtYT8uY29tcG9uZW50cyB8fCB7fSkubWFwKFxuICAgICAgICAoW25hbWUsIHNjaGVtYV0pID0+IHtcbiAgICAgICAgICAvLyBBbHdheXMgYWRkIG5hbWUgdG8gY29tcG9uZW50IHNjaGVtYS5cbiAgICAgICAgICBzY2hlbWEubmFtZSA9IG5hbWVcbiAgICAgICAgICAvLyBTaGFyZSBkYXRhUGF0aCBhbmQgc3RvcmUgd2l0aCBwYXJlbnQgaWYgbm90IG5lc3RlZDpcbiAgICAgICAgICBjb25zdCBuZXN0ZWQgPSBpc05lc3RlZChzY2hlbWEpXG4gICAgICAgICAgY29uc3QgbmVzdGVkRGF0YVBhdGggPSBhcHBlbmREYXRhUGF0aCh0aGlzLmRhdGFQYXRoLCBuYW1lKVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzY2hlbWEsXG4gICAgICAgICAgICBkYXRhUGF0aDpcbiAgICAgICAgICAgICAgbmVzdGVkICYmICF3cmFwUHJpbWl0aXZlc1xuICAgICAgICAgICAgICAgID8gbmVzdGVkRGF0YVBhdGhcbiAgICAgICAgICAgICAgICA6IHRoaXMuZGF0YVBhdGgsXG4gICAgICAgICAgICBuZXN0ZWREYXRhUGF0aCxcbiAgICAgICAgICAgIG5lc3RlZCxcbiAgICAgICAgICAgIHN0b3JlOiBuZXN0ZWQgPyB0aGlzLmdldENoaWxkU3RvcmUobmFtZSkgOiB0aGlzLnN0b3JlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApXG4gICAgfSxcblxuICAgIHBhbmVsRW50cmllcygpIHtcbiAgICAgIC8vIEdhdGhlciBhbGwgcGFuZWwgc2NoZW1hcyBmcm9tIGFsbCBjb21wb25lbnQgc2NoZW1hcywgYnkgZmluZGluZyB0aG9zZVxuICAgICAgLy8gdGhhdCB3YW50IHRvIHByb3ZpZGUgYSBwYW5lbC4gU2VlIGBnZXRBbGxQYW5lbEVudHJpZXMoKWAgZm9yIGRldGFpbHMuXG4gICAgICByZXR1cm4gdGhpcy5jb21wb25lbnRTY2hlbWFzLmZsYXRNYXAoXG4gICAgICAgICh7IHNjaGVtYSwgbmVzdGVkRGF0YVBhdGg6IGRhdGFQYXRoIH0pID0+XG4gICAgICAgICAgZ2V0QWxsUGFuZWxFbnRyaWVzKFxuICAgICAgICAgICAgdGhpcy5hcGksXG4gICAgICAgICAgICBzY2hlbWEsXG4gICAgICAgICAgICBkYXRhUGF0aCxcbiAgICAgICAgICAgIHRoaXMuc2NoZW1hQ29tcG9uZW50LFxuICAgICAgICAgICAgdGhpcy50YWJDb21wb25lbnRcbiAgICAgICAgICApXG4gICAgICApXG4gICAgfSxcblxuICAgIGlzU2luZ2xlQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2luZ2xlICYmIHRoaXMuY29tcG9uZW50U2NoZW1hcy5sZW5ndGggPT09IDFcbiAgICB9XG4gIH0sXG5cbiAgY3JlYXRlZCgpIHtcbiAgICB0aGlzLl9yZWdpc3Rlcih0cnVlKVxuICB9LFxuXG4gIHVubW91bnRlZCgpIHtcbiAgICB0aGlzLl9yZWdpc3RlcihmYWxzZSlcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgX3JlZ2lzdGVyKGFkZCkge1xuICAgICAgdGhpcy5zY2hlbWFDb21wb25lbnQuX3JlZ2lzdGVyUGFuZSh0aGlzLCBhZGQpXG4gICAgfSxcblxuICAgIGZvY3VzKCkge1xuICAgICAgaWYgKHRoaXMudGFiKSB7XG4gICAgICAgIHRoaXMuJHJvdXRlci5wdXNoKHsgaGFzaDogYCMke3RoaXMudGFifWAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1wYW5lIHtcbiAgZGlzcGxheTogZmxleDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBmbGV4LWZsb3c6IHJvdyB3cmFwO1xuICBhbGlnbi1jb250ZW50OiBmbGV4LXN0YXJ0O1xuICBhbGlnbi1pdGVtczogYmFzZWxpbmU7XG4gIC8vIFJlbW92ZSB0aGUgcGFkZGluZyBhZGRlZCBieSBgLmRpdG8tY29udGFpbmVyYCBpbnNpZGUgYC5kaXRvLXBhbmVgOlxuICBtYXJnaW46ICgtJGZvcm0tc3BhY2luZykgKC0kZm9ybS1zcGFjaW5nLWhhbGYpO1xuICAvLyBBZGQgcmVtb3ZlZCBob3Jpem9udGFsIG1hcmdpbiBhZ2FpbiB0byBtYXgtd2lkdGg6XG4gIG1heC13aWR0aDogJGNvbnRlbnQtd2lkdGggKyAyICogJGZvcm0tc3BhY2luZy1oYWxmO1xuICAvLyBVc2UgYGZsZXg6IDAlYCBmb3IgYWxsIGAuZGl0by1wYW5lYCBleGNlcHQgYC5kaXRvLXBhbmUtbWFpbmAsXG4gIC8vIHNvIHRoYXQgdGhlIGAuZGl0by1idXR0b25zLW1haW5gIGNhbiBiZSBtb3ZlZCBhbGwgdGhlIHdheSB0byB0aGUgYm90dG9tLlxuICBmbGV4OiAwJTtcblxuICAmLmRpdG8tcGFuZS1tYWluIHtcbiAgICBmbGV4OiAxMDAlO1xuICB9XG5cbiAgLmRpdG8tc2NoZW1hLWhlYWRlcjpub3QoLmRpdG8tc2NoZW1hLW1lbnUtaGVhZGVyKSArICYge1xuICAgIC8vIENsZWFyIHRvcC1tYXJnaW4gaWYgdGhlIGNvbXBvbmVudHMgYXJlIHByZWNlZGVkIGJ5IGEgc2NoZW1hIGhlYWRlci5cbiAgICBtYXJnaW4tdG9wOiAwO1xuICB9XG5cbiAgLmRpdG8tY29udGFpbmVyLS1vbWl0LXBhZGRpbmcgPiAmIHtcbiAgICAvLyBDbGVhciBtYXJnaW5zIHNldCBhYm92ZSBhZ2FpbiBpZiBwYXJlbnQgaXMgb21pdHRpbmcgcGFkZGluZy5cbiAgICBtYXJnaW46IDA7XG4gICAgbWF4LXdpZHRoOiB1bnNldDtcbiAgfVxuXG4gIC5kaXRvLWJyZWFrIHtcbiAgICBmbGV4OiAxMDAlO1xuICAgIGhlaWdodDogMDtcbiAgfVxufVxuPC9zdHlsZT5cbiIsImltcG9ydCB7IGlzU3RyaW5nIH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRnJhY3Rpb24odmFsdWUpIHtcbiAgY29uc3QgbWF0Y2ggPSAoXG4gICAgaXNTdHJpbmcodmFsdWUpICYmXG4gICAgdmFsdWUubWF0Y2goL15cXHMqKFsrLV0/XFxkKylcXHMqXFwvXFxzKihbKy1dP1xcZCspXFxzKiQvKVxuICApXG4gIGlmIChtYXRjaCkge1xuICAgIGNvbnN0IFssIGRpdmlkZW5kLCBkaXZpc29yXSA9IG1hdGNoXG4gICAgcmV0dXJuIHBhcnNlRmxvYXQoZGl2aWRlbmQpIC8gcGFyc2VGbG9hdChkaXZpc29yKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBwYXJzZUZsb2F0KHZhbHVlKVxuICB9XG59XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tY29udGFpbmVyKFxuICB2LXNob3c9XCJjb21wb25lbnRWaXNpYmxlXCJcbiAgOmNsYXNzPVwiY29udGFpbmVyQ2xhc3NcIlxuICA6c3R5bGU9XCJjb250YWluZXJTdHlsZVwiXG4pXG4gIERpdG9MYWJlbChcbiAgICB2LWlmPVwiaGFzTGFiZWxcIlxuICAgIDpsYWJlbD1cImxhYmVsXCJcbiAgICA6ZGF0YVBhdGg9XCJsYWJlbERhdGFQYXRoXCJcbiAgICA6Y2xhc3M9XCJjb21wb25lbnRDbGFzc1wiXG4gIClcbiAgY29tcG9uZW50LmRpdG8tY29tcG9uZW50KFxuICAgIDppcz1cInR5cGVDb21wb25lbnRcIlxuICAgIDpzY2hlbWE9XCJzY2hlbWFcIlxuICAgIDpkYXRhUGF0aD1cImRhdGFQYXRoXCJcbiAgICA6ZGF0YT1cImRhdGFcIlxuICAgIDptZXRhPVwibWV0YVwiXG4gICAgOnN0b3JlPVwic3RvcmVcIlxuICAgIDpzaW5nbGU9XCJzaW5nbGVcIlxuICAgIDpuZXN0ZWQ9XCJuZXN0ZWRcIlxuICAgIDpkaXNhYmxlZD1cImNvbXBvbmVudERpc2FibGVkXCJcbiAgICA6Y2xhc3M9XCJjb21wb25lbnRDbGFzc1wiXG4gICAgQGVycm9ycz1cIm9uRXJyb3JzXCJcbiAgKVxuICBEaXRvRXJyb3JzKDplcnJvcnM9XCJlcnJvcnNcIilcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgeyBpc1N0cmluZywgaXNOdW1iZXIgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCBEaXRvQ29udGV4dCBmcm9tICcuLi9EaXRvQ29udGV4dC5qcydcbmltcG9ydCB7IGdldFNjaGVtYUFjY2Vzc29yIH0gZnJvbSAnLi4vdXRpbHMvYWNjZXNzb3IuanMnXG5pbXBvcnQgeyBnZXRUeXBlQ29tcG9uZW50LCBhbGlnbkJvdHRvbSwgb21pdFBhZGRpbmcgfSBmcm9tICcuLi91dGlscy9zY2hlbWEuanMnXG5pbXBvcnQgeyBwYXJzZUZyYWN0aW9uIH0gZnJvbSAnLi4vdXRpbHMvbWF0aC5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvQ29udGFpbmVyJywge1xuICBwcm9wczoge1xuICAgIHNjaGVtYTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZGF0YVBhdGg6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnJyB9LFxuICAgIGRhdGE6IHsgdHlwZTogW09iamVjdCwgQXJyYXldLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIG1ldGE6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHN0b3JlOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBzaW5nbGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBuZXN0ZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZSB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZ2VuZXJhdGVMYWJlbHM6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZSB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXJyb3JzOiBudWxsXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgY29udGV4dCgpIHtcbiAgICAgIHJldHVybiBuZXcgRGl0b0NvbnRleHQodGhpcywgeyBuZXN0ZWQ6IHRoaXMubmVzdGVkIH0pXG4gICAgfSxcblxuICAgIHR5cGVDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gZ2V0VHlwZUNvbXBvbmVudCh0aGlzLnNjaGVtYS50eXBlKVxuICAgIH0sXG5cbiAgICBoYXNMYWJlbCgpIHtcbiAgICAgIGNvbnN0IHsgbGFiZWwgfSA9IHRoaXMuc2NoZW1hXG4gICAgICByZXR1cm4gKFxuICAgICAgICBsYWJlbCAhPT0gZmFsc2UgJiYgKFxuICAgICAgICAgICEhbGFiZWwgfHxcbiAgICAgICAgICB0aGlzLmdlbmVyYXRlTGFiZWxzICYmIHRoaXMudHlwZUNvbXBvbmVudD8uZ2VuZXJhdGVMYWJlbFxuICAgICAgICApXG4gICAgICApXG4gICAgfSxcblxuICAgIGxhYmVsKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaGFzTGFiZWwgPyB0aGlzLmdldExhYmVsKHRoaXMuc2NoZW1hKSA6IG51bGxcbiAgICB9LFxuXG4gICAgbGFiZWxEYXRhUGF0aCgpIHtcbiAgICAgIC8vIFVubmVzdGVkIHR5cGVzIGRvbid0IGhhdmUgYSBkYXRhUGF0aCBmb3IgdGhlbXNlbHZlcywgZG9uJ3QgdXNlIGl0OlxuICAgICAgcmV0dXJuIHRoaXMubmVzdGVkID8gdGhpcy5kYXRhUGF0aCA6IG51bGxcbiAgICB9LFxuXG4gICAgY29tcG9uZW50V2lkdGg6IGdldFNjaGVtYUFjY2Vzc29yKCd3aWR0aCcsIHtcbiAgICAgIHR5cGU6IFtTdHJpbmcsIE51bWJlcl0sXG4gICAgICBkZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlQ29tcG9uZW50Py5kZWZhdWx0V2lkdGhcbiAgICAgIH0sXG4gICAgICBnZXQod2lkdGgpIHtcbiAgICAgICAgLy8gVXNlIDEwMCUgPT0gMS4wIGFzIGRlZmF1bHQgd2lkdGggd2hlbiBub3RoaW5nIGlzIHNldDpcbiAgICAgICAgcmV0dXJuIHdpZHRoID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IDEuMFxuICAgICAgICAgIDogaXNTdHJpbmcod2lkdGgpXG4gICAgICAgICAgICA/IHdpZHRoLm1hdGNoKC9eXFxzKls8Pl0/XFxzKiguKikkLylbMV0gLy8gUmVtb3ZlIHdpZHRoIG9wZXJhdG9yXG4gICAgICAgICAgICA6IHdpZHRoXG4gICAgICB9XG4gICAgfSksXG5cbiAgICBjb21wb25lbnRXaWR0aE9wZXJhdG9yOiBnZXRTY2hlbWFBY2Nlc3Nvcignd2lkdGgnLCB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBnZXQod2lkdGgpIHtcbiAgICAgICAgcmV0dXJuIGlzU3RyaW5nKHdpZHRoKVxuICAgICAgICAgID8gd2lkdGgubWF0Y2goL15cXHMqKFs8Pl0/KS8pWzFdIHx8IG51bGxcbiAgICAgICAgICA6IG51bGxcbiAgICAgIH1cbiAgICB9KSxcblxuICAgIGNvbXBvbmVudFZpc2libGU6IGdldFNjaGVtYUFjY2Vzc29yKCd2aXNpYmxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGVDb21wb25lbnQ/LmRlZmF1bHRWaXNpYmxlXG4gICAgICB9XG4gICAgfSksXG5cbiAgICBjb21wb25lbnREaXNhYmxlZDogZ2V0U2NoZW1hQWNjZXNzb3IoJ2Rpc2FibGVkJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgZ2V0KGRpc2FibGVkKSB7XG4gICAgICAgIHJldHVybiBkaXNhYmxlZCB8fCB0aGlzLmRpc2FibGVkXG4gICAgICB9XG4gICAgfSksXG5cbiAgICBjb250YWluZXJDbGFzcygpIHtcbiAgICAgIGNvbnN0IHsgY2xhc3M6IGNvbnRhaW5lckNsYXNzIH0gPSB0aGlzLnNjaGVtYVxuICAgICAgY29uc3QgcHJlZml4ID0gJ2RpdG8tY29udGFpbmVyJ1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgW2Ake3ByZWZpeH0tLXNpbmdsZWBdOiB0aGlzLnNpbmdsZSxcbiAgICAgICAgW2Ake3ByZWZpeH0tLWhhcy1sYWJlbGBdOiB0aGlzLmhhc0xhYmVsLFxuICAgICAgICBbYCR7cHJlZml4fS0tYWxpZ24tYm90dG9tYF06IGFsaWduQm90dG9tKHRoaXMuc2NoZW1hKSxcbiAgICAgICAgW2Ake3ByZWZpeH0tLW9taXQtcGFkZGluZ2BdOiBvbWl0UGFkZGluZyh0aGlzLnNjaGVtYSksXG4gICAgICAgIC4uLihcbiAgICAgICAgICBpc1N0cmluZyhjb250YWluZXJDbGFzcylcbiAgICAgICAgICAgID8geyBbY29udGFpbmVyQ2xhc3NdOiB0cnVlIH1cbiAgICAgICAgICAgIDogY29udGFpbmVyQ2xhc3NcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBjb21wb25lbnRCYXNpcygpIHtcbiAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy5jb21wb25lbnRXaWR0aFxuICAgICAgLy8gJ2F1dG8nID0gbm8gZml0dGluZzpcbiAgICAgIGNvbnN0IGJhc2lzID0gW251bGwsICdhdXRvJywgJ2ZpbGwnXS5pbmNsdWRlcyh3aWR0aClcbiAgICAgICAgPyAnYXV0bydcbiAgICAgICAgOiAvJSQvLnRlc3Qod2lkdGgpXG4gICAgICAgICAgPyBwYXJzZUZsb2F0KHdpZHRoKSAvLyBwZXJjZW50YWdlXG4gICAgICAgICAgOiAvW2Etel0vLnRlc3Qod2lkdGgpXG4gICAgICAgICAgICA/IHdpZHRoIC8vIG5hdGl2ZSB1bml0c1xuICAgICAgICAgICAgOiBwYXJzZUZyYWN0aW9uKHdpZHRoKSAqIDEwMCAvLyBmcmFjdGlvblxuICAgICAgcmV0dXJuIGlzTnVtYmVyKGJhc2lzKSA/IGAke2Jhc2lzfSVgIDogYmFzaXNcbiAgICB9LFxuXG4gICAgY29udGFpbmVyU3R5bGUoKSB7XG4gICAgICAvLyBJbnRlcnByZXQgJz41MCUnIGFzICc1MCUsIGZsZXgtZ3JvdzogMWBcbiAgICAgIGNvbnN0IGdyb3cgPSAoXG4gICAgICAgIHRoaXMuY29tcG9uZW50V2lkdGhPcGVyYXRvciA9PT0gJz4nIHx8XG4gICAgICAgIHRoaXMuY29tcG9uZW50V2lkdGggPT09ICdmaWxsJ1xuICAgICAgKVxuICAgICAgLy8gSW50ZXJwcmV0ICc8NTAlJyBhcyAnNTAlLCBmbGV4LXNocmluazogMWBcbiAgICAgIGNvbnN0IHNocmluayA9IHRoaXMuY29tcG9uZW50V2lkdGhPcGVyYXRvciA9PT0gJzwnXG4gICAgICByZXR1cm4ge1xuICAgICAgICBmbGV4OiBgJHtncm93ID8gMSA6IDB9ICR7c2hyaW5rID8gMSA6IDB9ICR7dGhpcy5jb21wb25lbnRCYXNpc31gXG4gICAgICB9XG4gICAgfSxcblxuICAgIGNvbXBvbmVudENsYXNzKCkge1xuICAgICAgY29uc3QgYmFzaXNJc0F1dG8gPSB0aGlzLmNvbXBvbmVudEJhc2lzID09PSAnYXV0bydcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC8vIFRPRE86IEJFTVxuICAgICAgICAnZGl0by1zaW5nbGUnOiB0aGlzLnNpbmdsZSxcbiAgICAgICAgJ2RpdG8tZGlzYWJsZWQnOiB0aGlzLmNvbXBvbmVudERpc2FibGVkLFxuICAgICAgICAnZGl0by13aWR0aC1maWxsJzogIWJhc2lzSXNBdXRvIHx8IHRoaXMuY29tcG9uZW50V2lkdGggPT09ICdmaWxsJyxcbiAgICAgICAgJ2RpdG8td2lkdGgtYXV0byc6IGJhc2lzSXNBdXRvLFxuICAgICAgICAnZGl0by1oYXMtZXJyb3JzJzogISF0aGlzLmVycm9yc1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgb25FcnJvcnMoZXJyb3JzKSB7XG4gICAgICB0aGlzLmVycm9ycyA9IGVycm9yc1xuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLWNvbnRhaW5lciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZmxvdzogY29sdW1uO1xuICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgLy8gTmVlZGVkIGZvciBiZXR0ZXIgdmVydGljYWwgYWxpZ25tZW50OlxuICBhbGlnbi1zZWxmOiBzdHJldGNoO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAvLyBUbyBwcmV2ZW50IGxpc3QgdGFibGVzIGZyb20gYmxvd2luZyBvdXQgb2YgdGhlaXIgZmxleCBib3ggY29udGFpbmVycy5cbiAgbWF4LXdpZHRoOiAxMDAlO1xuICAvLyBDYW5ub3QgdXNlIG1hcmdpbiBoZXJlIGFzIGl0IG5lZWRzIHRvIGJlIHBhcnQgb2YgYm94LXNpemluZyBmb3JcbiAgLy8gcGVyY2VudGFnZXMgaW4gZmxleC1iYXNpcyB0byB3b3JrLlxuICBwYWRkaW5nOiAkZm9ybS1zcGFjaW5nICRmb3JtLXNwYWNpbmctaGFsZjtcblxuICAmOmVtcHR5IHtcbiAgICBwYWRkaW5nOiAwO1xuICB9XG5cbiAgJi0tYWxpZ24tYm90dG9tIHtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGVuZDsgLy8gVG8gYWxpZ24gY29tcG9uZW50cyB3aXRoIGFuZCB3aXRob3V0IGxhYmVscy5cbiAgfVxuXG4gICYtLW9taXQtcGFkZGluZyB7XG4gICAgcGFkZGluZzogMDtcblxuICAgID4gLmRpdG8tbGFiZWwge1xuICAgICAgbWFyZ2luOiAkZm9ybS1zcGFjaW5nICRmb3JtLXNwYWNpbmctaGFsZiAwO1xuICAgIH1cbiAgfVxuXG4gICYtLXNpbmdsZSB7XG4gICAgaGVpZ2h0OiAxMDAlOyAvLyBTbyB0aGF0IGxpc3QgYnV0dG9ucyBjYW4gYmUgc3RpY2t5IGF0IHRoZSBib3R0b207XG4gIH1cbn1cblxuLy8gTk9URTogVGhpcyBpcyBub3QgbmVzdGVkIGluc2lkZSBgLmRpdG8tY29udGFpbmVyYCBzbyB0aGF0IG90aGVyXG4vLyB0eXBlIGNvbXBvbmVudHMgY2FuIG92ZXJyaWRlIGAuZGl0by13aWR0aC1maWxsYCBjbGFzcyAoZmlsdGVyIHByZWNlZGVuY2UpLlxuLmRpdG8tY29tcG9uZW50IHtcbiAgJi5kaXRvLXdpZHRoLWZpbGwge1xuICAgIHdpZHRoOiAxMDAlO1xuXG4gICAgJi5kaXRvLWNoZWNrYm94LFxuICAgICYuZGl0by1yYWRpby1idXR0b24ge1xuICAgICAgLy8gV2ViS2l0IGRvZXNuJ3QgbGlrZSBjaGFuZ2VkIHdpZHRoIG9uIGNoZWNrYm94ZXMgYW5kIHJhZGlvcywgb3ZlcnJpZGU6XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgICB3aWR0aDogYXV0bztcbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tdGFic1xuICB0ZW1wbGF0ZShcbiAgICB2LWZvcj1cIih0YWJTY2hlbWEsIGtleSkgaW4gdGFic1wiXG4gIClcbiAgICBSb3V0ZXJMaW5rLmRpdG8tbGluayhcbiAgICAgIHYtaWY9XCJzaG91bGRSZW5kZXIodGFiU2NoZW1hKVwiXG4gICAgICA6a2V5PVwia2V5XCJcbiAgICAgIDp0bz1cInsgaGFzaDogYCMke2tleX1gIH1cIlxuICAgICAgOmNsYXNzPVwieyAnZGl0by1hY3RpdmUnOiBzZWxlY3RlZFRhYiA9PT0ga2V5IH1cIlxuICAgICkge3sgZ2V0TGFiZWwodGFiU2NoZW1hLCBrZXkpIH19XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvVGFicycsIHtcbiAgcHJvcHM6IHtcbiAgICB0YWJzOiB7IHR5cGU6IE9iamVjdCwgZGVmYXVsdDogbnVsbCB9LFxuICAgIHNlbGVjdGVkVGFiOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4kdGFiLWNvbG9yLWJhY2tncm91bmQ6ICRjb2xvci1saWdodGVzdDtcbiR0YWItY29sb3ItaW5hY3RpdmU6ICRjb2xvci1saWdodDtcbiR0YWItY29sb3ItYWN0aXZlOiAkY29sb3ItbGlnaHRlc3Q7XG4kdGFiLWNvbG9yLWhvdmVyOiAkY29sb3Itd2hpdGU7XG5cbi5kaXRvLXRhYnMge1xuICAvLyBTZWU6IGh0dHBzOi8vY29kZXBlbi5pby90aG9sZXgvcGVuL2h2ZUJ4L1xuICBtYXJnaW4tbGVmdDogYXV0bztcblxuICBhIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBAaW5jbHVkZSB1c2VyLXNlbGVjdChub25lKTtcblxuICAgIGJhY2tncm91bmQ6ICR0YWItY29sb3ItaW5hY3RpdmU7XG4gICAgcGFkZGluZzogJHRhYi1wYWRkaW5nLXZlciAkdGFiLXBhZGRpbmctaG9yO1xuICAgIG1hcmdpbi1sZWZ0OiAkdGFiLW1hcmdpbjtcbiAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAkdGFiLXJhZGl1cztcbiAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogJHRhYi1yYWRpdXM7XG5cbiAgICAmOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQ6ICR0YWItY29sb3ItaG92ZXI7XG4gICAgfVxuXG4gICAgJjphY3RpdmUge1xuICAgICAgYmFja2dyb3VuZDogJHRhYi1jb2xvci1hY3RpdmU7XG4gICAgfVxuXG4gICAgJi5kaXRvLWFjdGl2ZSB7XG4gICAgICBiYWNrZ3JvdW5kOiAkdGFiLWNvbG9yLWJhY2tncm91bmQ7XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi8vLSBPbmx5IHNob3cgcGFuZWxzIGluIHRhYnMgd2hlbiB0aGUgdGFicyBhcmUgYWxzbyB2aXNpYmxlLlxuY29tcG9uZW50LmRpdG8tcGFuZWwoXG4gIHYtc2hvdz1cInZpc2libGUgJiYgKCFwYW5lbFRhYkNvbXBvbmVudCB8fCBwYW5lbFRhYkNvbXBvbmVudC52aXNpYmxlKVwiXG4gIDppcz1cInBhbmVsVGFnXCJcbiAgQHN1Ym1pdC5wcmV2ZW50XG4pXG4gIERpdG9TY2hlbWEuZGl0by1wYW5lbF9fc2NoZW1hKFxuICAgIDpzY2hlbWE9XCJwYW5lbFNjaGVtYVwiXG4gICAgOmRhdGFQYXRoPVwicGFuZWxEYXRhUGF0aFwiXG4gICAgOmRhdGE9XCJwYW5lbERhdGFcIlxuICAgIDptZXRhPVwibWV0YVwiXG4gICAgOnN0b3JlPVwic3RvcmVcIlxuICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICA6aGFzT3duRGF0YT1cImhhc093bkRhdGFcIlxuICApXG4gICAgdGVtcGxhdGUoI2JlZm9yZSlcbiAgICAgIGgyLmRpdG8tcGFuZWxfX2hlYWRlcig6Y2xhc3M9XCJ7ICdkaXRvLXBhbmVsX19oZWFkZXItLXN0aWNreSc6IHN0aWNreSB9XCIpXG4gICAgICAgIHNwYW4ge3sgZ2V0TGFiZWwoc2NoZW1hKSB9fVxuICAgICAgICBEaXRvQnV0dG9ucy5kaXRvLWJ1dHRvbnMtc21hbGwoXG4gICAgICAgICAgOmJ1dHRvbnM9XCJwYW5lbEJ1dHRvblNjaGVtYXNcIlxuICAgICAgICAgIDpkYXRhUGF0aD1cInBhbmVsRGF0YVBhdGhcIlxuICAgICAgICAgIDpkYXRhPVwicGFuZWxEYXRhXCJcbiAgICAgICAgICA6bWV0YT1cIm1ldGFcIlxuICAgICAgICAgIDpzdG9yZT1cInN0b3JlXCJcbiAgICAgICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gICAgICAgIClcbiAgICB0ZW1wbGF0ZSgjYnV0dG9ucylcbiAgICAgIERpdG9CdXR0b25zKFxuICAgICAgICA6YnV0dG9ucz1cImJ1dHRvblNjaGVtYXNcIlxuICAgICAgICA6ZGF0YVBhdGg9XCJwYW5lbERhdGFQYXRoXCJcbiAgICAgICAgOmRhdGE9XCJwYW5lbERhdGFcIlxuICAgICAgICA6bWV0YT1cIm1ldGFcIlxuICAgICAgICA6c3RvcmU9XCJzdG9yZVwiXG4gICAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICAgIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgeyBpc0Z1bmN0aW9uIH0gZnJvbSAnQGRpdG9qcy91dGlscydcbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5pbXBvcnQgVmFsaWRhdG9yTWl4aW4gZnJvbSAnLi4vbWl4aW5zL1ZhbGlkYXRvck1peGluLmpzJ1xuaW1wb3J0IHsgZ2V0QnV0dG9uU2NoZW1hcyB9IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcbmltcG9ydCB7IGdldFNjaGVtYUFjY2Vzc29yIH0gZnJvbSAnLi4vdXRpbHMvYWNjZXNzb3IuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b1BhbmVsJywge1xuICBtaXhpbnM6IFtWYWxpZGF0b3JNaXhpbl0sXG5cbiAgcHJvdmlkZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJHBhbmVsQ29tcG9uZW50OiAoKSA9PiB0aGlzLFxuICAgICAgJHRhYkNvbXBvbmVudDogKCkgPT4gdGhpcy5wYW5lbFRhYkNvbXBvbmVudFxuICAgIH1cbiAgfSxcblxuICBwcm9wczoge1xuICAgIHNjaGVtYTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZGF0YVBhdGg6IHsgdHlwZTogU3RyaW5nLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGRhdGE6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIG1ldGE6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHN0b3JlOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHBhbmVsVGFiQ29tcG9uZW50OiB7IHR5cGU6IE9iamVjdCwgZGVmYXVsdDogbnVsbCB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgb3duRGF0YTogbnVsbFxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIHBhbmVsQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9LFxuXG4gICAgdGFiQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMucGFuZWxUYWJDb21wb25lbnRcbiAgICB9LFxuXG4gICAgYnV0dG9uU2NoZW1hcygpIHtcbiAgICAgIHJldHVybiBnZXRCdXR0b25TY2hlbWFzKHRoaXMuc2NoZW1hLmJ1dHRvbnMpXG4gICAgfSxcblxuICAgIHBhbmVsQnV0dG9uU2NoZW1hcygpIHtcbiAgICAgIHJldHVybiBnZXRCdXR0b25TY2hlbWFzKHRoaXMuc2NoZW1hLnBhbmVsQnV0dG9ucylcbiAgICB9LFxuXG4gICAgdGFyZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hLnRhcmdldCB8fCB0aGlzLmRhdGFQYXRoXG4gICAgfSxcblxuICAgIGhhc093bkRhdGEoKSB7XG4gICAgICByZXR1cm4gISF0aGlzLm93bkRhdGFcbiAgICB9LFxuXG4gICAgcGFuZWxEYXRhKCkge1xuICAgICAgcmV0dXJuIHRoaXMub3duRGF0YSB8fCB0aGlzLmRhdGFcbiAgICB9LFxuXG4gICAgcGFuZWxTY2hlbWEoKSB7XG4gICAgICBpZiAodGhpcy5oYXNPd25EYXRhKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNjaGVtYVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gUmVtb3ZlIGBkYXRhYCBmcm9tIHRoZSBzY2hlbWEsIHNvIHRoYXQgRGl0b1NjaGVtYSBpc24ndCB1c2luZyBpdCB0b1xuICAgICAgICAvLyBwcm9kdWNlIGl0cyBvd24gZGF0YS4gU2VlICRmaWx0ZXJzIHBhbmVsIGZvciBtb3JlIGRldGFpbHMgb24gZGF0YS5cbiAgICAgICAgY29uc3QgeyBkYXRhLCAuLi5zY2hlbWEgfSA9IHRoaXMuc2NoZW1hXG4gICAgICAgIHJldHVybiBzY2hlbWFcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgcGFuZWxUYWcoKSB7XG4gICAgICAvLyBQYW5lbHMgdGhhdCBwcm92aWRlIHRoZWlyIG93biBkYXRhIG5lZWQgdGhlaXIgb3duIGZvcm0uXG4gICAgICByZXR1cm4gdGhpcy5oYXNPd25EYXRhID8gJ2Zvcm0nIDogJ2RpdidcbiAgICB9LFxuXG4gICAgcGFuZWxEYXRhUGF0aCgpIHtcbiAgICAgIC8vIElmIHRoZSBwYW5lbCBwcm92aWRlcyBpdHMgb3duIGRhdGEsIHRoZW4gaXQgbmVlZHMgdG8gcHJlZml4IGFsbFxuICAgICAgLy8gY29tcG9uZW50cyB3aXRoIGl0cyBkYXRhLXBhdGgsIGJ1dCBpZiBpdCBzaGFyZXMgZGF0YSB3aXRoIHRoZSBzY2hlbWFcbiAgICAgIC8vIGNvbXBvbmVudCwgdGhlbiBpdCBzaG91bGQgc2hhcmUgdGhlIGRhdGEtcGF0aCBuYW1lIHNwYWNlIHRvby5cbiAgICAgIHJldHVybiB0aGlzLmhhc093bkRhdGEgPyB0aGlzLmRhdGFQYXRoIDogdGhpcy5zY2hlbWFDb21wb25lbnQuZGF0YVBhdGhcbiAgICB9LFxuXG4gICAgdmlzaWJsZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ3Zpc2libGUnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgIH0pLFxuXG4gICAgc3RpY2t5OiBnZXRTY2hlbWFBY2Nlc3Nvcignc3RpY2t5Jywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSlcbiAgfSxcblxuICBjcmVhdGVkKCkge1xuICAgIHRoaXMuX3JlZ2lzdGVyKHRydWUpXG4gICAgLy8gTk9URTogVGhpcyBpcyBub3QgdGhlIHNhbWUgYXMgYHNjaGVtYS5kYXRhYCBoYW5kbGluZyBpbiBEaXRvU2NoZW1hLFxuICAgIC8vIHdoZXJlIHRoZSBkYXRhIGlzIGFkZGVkIHRvIHRoZSBhY3R1YWwgY29tcG9uZW50LlxuICAgIGNvbnN0IHsgZGF0YSB9ID0gdGhpcy5zY2hlbWFcbiAgICBpZiAoZGF0YSkge1xuICAgICAgdGhpcy5vd25EYXRhID0gaXNGdW5jdGlvbihkYXRhKVxuICAgICAgICA/IGRhdGEodGhpcy5jb250ZXh0KVxuICAgICAgICA6IGRhdGFcbiAgICB9XG4gIH0sXG5cbiAgdW5tb3VudGVkKCkge1xuICAgIHRoaXMuX3JlZ2lzdGVyKGZhbHNlKVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBfcmVnaXN0ZXIoYWRkKSB7XG4gICAgICAvLyBSZWdpc3RlciB0aGUgcGFuZWxzIHNvIHRoYXQgb3RoZXIgY29tcG9uZW50cyBjYW4gZmluZCB0aGVtIGJ5IHRoZWlyXG4gICAgICAvLyBkYXRhLXBhdGgsIGUuZy4gaW4gVHlwZUxpc3Qub25GaWx0ZXJFcnJvcnMoKVxuICAgICAgdGhpcy5zY2hlbWFDb21wb25lbnQuX3JlZ2lzdGVyUGFuZWwodGhpcywgYWRkKVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXBhbmVsIHtcbiAgcGFkZGluZy1ib3R0b206ICRjb250ZW50LXBhZGRpbmc7XG5cbiAgJl9faGVhZGVyIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBwYWRkaW5nOiAkaW5wdXQtcGFkZGluZztcbiAgICBiYWNrZ3JvdW5kOiAkYnV0dG9uLWNvbG9yO1xuICAgIGJvcmRlcjogJGJvcmRlci1zdHlsZTtcbiAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcbiAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG5cbiAgICAmLS1zdGlja3kge1xuICAgICAgJG1hcmdpbjogJGlucHV0LWhlaWdodC1mYWN0b3IgKiAkbGluZS1oZWlnaHQgKiAkZm9udC1zaXplLXNtYWxsICtcbiAgICAgICAgJGZvcm0tc3BhY2luZztcblxuICAgICAgcG9zaXRpb246IHN0aWNreTtcbiAgICAgIHRvcDogJGNvbnRlbnQtcGFkZGluZztcbiAgICAgIG1hcmdpbi1ib3R0b206ICRtYXJnaW47XG4gICAgICB6LWluZGV4OiAxO1xuXG4gICAgICAmICsgKiB7XG4gICAgICAgIG1hcmdpbi10b3A6IC0kbWFyZ2luO1xuICAgICAgfVxuXG4gICAgICAmOjpiZWZvcmUge1xuICAgICAgICBjb250ZW50OiAnJztcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgYmFja2dyb3VuZDogJGNvbnRlbnQtY29sb3ItYmFja2dyb3VuZDtcbiAgICAgICAgbGVmdDogMDtcbiAgICAgICAgcmlnaHQ6IDA7XG4gICAgICAgIGhlaWdodDogJGNvbnRlbnQtcGFkZGluZztcbiAgICAgICAgdG9wOiAtJGNvbnRlbnQtcGFkZGluZztcbiAgICAgICAgbWFyZ2luOiAtJGJvcmRlci13aWR0aDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAuZGl0by1idXR0b25zIHtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIHJpZ2h0OiAkaW5wdXQtcGFkZGluZy12ZXI7XG4gICAgICB0b3A6IDUwJTtcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbiAgICB9XG4gIH1cblxuICAmX19zY2hlbWEge1xuICAgIGZvbnQtc2l6ZTogJGZvbnQtc2l6ZS1zbWFsbDtcbiAgICBiYWNrZ3JvdW5kOiAkY29udGVudC1jb2xvci1iYWNrZ3JvdW5kO1xuICAgIGJvcmRlcjogJGJvcmRlci1zdHlsZTtcbiAgICBib3JkZXItdG9wOiAwO1xuICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6ICRib3JkZXItcmFkaXVzO1xuICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcblxuICAgID4gLmRpdG8tc2NoZW1hLWNvbnRlbnQge1xuICAgICAgcGFkZGluZzogJGZvcm0tc3BhY2luZy1oYWxmICRmb3JtLXNwYWNpbmc7XG5cbiAgICAgIC5kaXRvLWNvbnRhaW5lciB7XG4gICAgICAgIHBhZGRpbmc6ICRmb3JtLXNwYWNpbmctaGFsZjtcbiAgICAgIH1cblxuICAgICAgLmRpdG8tb2JqZWN0IHtcbiAgICAgICAgYm9yZGVyOiAwO1xuICAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgfVxuXG4gICAgICA+IC5kaXRvLWJ1dHRvbnMge1xuICAgICAgICAtLWJ1dHRvbi1tYXJnaW46ICN7JGZvcm0tc3BhY2luZ307XG5cbiAgICAgICAgcGFkZGluZzogJGZvcm0tc3BhY2luZy1oYWxmIDA7XG5cbiAgICAgICAgLmRpdG8tY29udGFpbmVyIHtcbiAgICAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLmRpdG8tbGFiZWwge1xuICAgICAgbWFyZ2luOiAwO1xuXG4gICAgICBsYWJlbCB7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLmRpdG8tcGFuZSB7XG4gICAgICBtYXJnaW46IDAgKC0kZm9ybS1zcGFjaW5nLWhhbGYpO1xuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1wYW5lbHMoXG4gIHYtaWY9XCJwYW5lbHMubGVuZ3RoID4gMFwiXG4pXG4gIHRlbXBsYXRlKFxuICAgIHYtZm9yPVwieyBzY2hlbWEsIGRhdGFQYXRoLCB0YWJDb21wb25lbnQgfSBpbiBwYW5lbHNcIlxuICApXG4gICAgRGl0b1BhbmVsKFxuICAgICAgdi1pZj1cInNob3VsZFJlbmRlcihzY2hlbWEpXCJcbiAgICAgIDprZXk9XCJnZXRQYW5lbEtleShkYXRhUGF0aCwgdGFiQ29tcG9uZW50KVwiXG4gICAgICA6c2NoZW1hPVwic2NoZW1hXCJcbiAgICAgIDpkYXRhUGF0aD1cImRhdGFQYXRoXCJcbiAgICAgIDpkYXRhPVwiZGF0YVwiXG4gICAgICA6bWV0YT1cIm1ldGFcIlxuICAgICAgOnN0b3JlPVwiZ2V0Q2hpbGRTdG9yZShzY2hlbWEubmFtZSlcIlxuICAgICAgOmRpc2FibGVkPVwic2NoZW1hLmRpc2FibGVkICE9IG51bGwgPyBzY2hlbWEuZGlzYWJsZWQgOiBkaXNhYmxlZFwiXG4gICAgICA6cGFuZWxUYWJDb21wb25lbnQ9XCJ0YWJDb21wb25lbnRcIlxuICAgIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9QYW5lbHMnLCB7XG4gIHByb3BzOiB7XG4gICAgcGFuZWxzOiB7IHR5cGU6IEFycmF5LCBkZWZhdWx0OiBudWxsIH0sXG4gICAgZGF0YTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgbWV0YTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgc3RvcmU6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIHJlcXVpcmVkOiB0cnVlIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0UGFuZWxLZXkoZGF0YVBhdGgsIHRhYkNvbXBvbmVudCkge1xuICAgICAgLy8gQWxsb3cgc2VwYXJhdGUgdGFicyB0byB1c2UgcGFuZWxzIG9mIHRoZSBzYW1lIG5hbWUsIGJ5XG4gICAgICAvLyBwcmVmaXhpbmcgdGhlaXIga2V5IHdpdGggdGhlIHRhYiBuYW1lLlxuICAgICAgcmV0dXJuIHRhYkNvbXBvbmVudCA/IGAke3RhYkNvbXBvbmVudC50YWJ9XyR7ZGF0YVBhdGh9YCA6IGRhdGFQYXRoXG4gICAgfVxuICB9XG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tcGFuZWxzIHtcbiAgbWF4LXdpZHRoOiAkY29udGVudC1zaWRlYmFyLXdpZHRoO1xuICBtaW4td2lkdGg6IGNhbGMoJGNvbnRlbnQtc2lkZWJhci13aWR0aCAvIDIpO1xufVxuPC9zdHlsZT5cbiIsImltcG9ydCB7IHVzZVNsb3RzLCBDb21tZW50IH0gZnJvbSAndnVlJ1xuaW1wb3J0IHsgaXNTdHJpbmcsIGFzQXJyYXkgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG5leHBvcnQgZnVuY3Rpb24gaGFzVk5vZGVDb250ZW50KHZub2RlKSB7XG4gIHJldHVybiB2bm9kZSAmJiBhc0FycmF5KHZub2RlKS5zb21lKHZub2RlID0+IHZub2RlLnR5cGUgIT09IENvbW1lbnQpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNTbG90Q29udGVudChzbG90LCBwcm9wcyA9IHt9KSB7XG4gIHNsb3QgPSBpc1N0cmluZyhzbG90KSA/IHVzZVNsb3RzKClbc2xvdF0gOiBzbG90XG4gIHJldHVybiBoYXNWTm9kZUNvbnRlbnQoc2xvdD8uKHByb3BzKSlcbn1cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1idXR0b25zKFxuICB2LWlmPVwiYnV0dG9uU2NoZW1hcyB8fCBoYXNTbG90Q29udGVudCgkc2xvdHMuZGVmYXVsdClcIlxuKVxuICB0ZW1wbGF0ZShcbiAgICB2LWZvcj1cIihidXR0b25TY2hlbWEsIGJ1dHRvbkRhdGFQYXRoKSBpbiBidXR0b25TY2hlbWFzXCJcbiAgKVxuICAgIERpdG9Db250YWluZXIoXG4gICAgICB2LWlmPVwic2hvdWxkUmVuZGVyKGJ1dHRvblNjaGVtYSlcIlxuICAgICAgOmtleT1cImJ1dHRvbkRhdGFQYXRoXCJcbiAgICAgIDpzY2hlbWE9XCJidXR0b25TY2hlbWFcIlxuICAgICAgOmRhdGFQYXRoPVwiYnV0dG9uRGF0YVBhdGhcIlxuICAgICAgOmRhdGE9XCJkYXRhXCJcbiAgICAgIDptZXRhPVwibWV0YVwiXG4gICAgICA6c3RvcmU9XCJnZXRDaGlsZFN0b3JlKGJ1dHRvblNjaGVtYS5uYW1lKVwiXG4gICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gICAgICA6Z2VuZXJhdGVMYWJlbHM9XCJmYWxzZVwiXG4gICAgKVxuICB0ZW1wbGF0ZShcbiAgICB2LWZvcj1cInZub2RlIG9mICRzbG90cy5kZWZhdWx0Py4oKVwiXG4gIClcbiAgICAvLy0gUmVuZGVyIGVhY2ggbm9kZSBpbiB0aGUgZGVmYXVsdCBzbG90IHRocm91Z2ggYGRpdG8tdm5vZGVgLFxuICAgIC8vLSBzbyBpdCBjYW4gYmUgd3JhcHBlZCBpbiBhIGAuZGl0by1jb250YWluZXJgIGNsYXNzLlxuICAgIC5kaXRvLWNvbnRhaW5lcihcbiAgICAgIHYtaWY9XCJoYXNWTm9kZUNvbnRlbnQodm5vZGUpXCJcbiAgICApXG4gICAgICBEaXRvVm5vZGUoOnZub2RlPVwidm5vZGVcIilcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuaW1wb3J0IHsgYXBwZW5kRGF0YVBhdGggfSBmcm9tICcuLi91dGlscy9kYXRhLmpzJ1xuaW1wb3J0IHsgaGFzU2xvdENvbnRlbnQsIGhhc1ZOb2RlQ29udGVudCB9IGZyb20gJy4uL3V0aWxzL3Z1ZS5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvQnV0dG9ucycsIHtcbiAgcHJvdmlkZToge1xuICAgICR0YWJDb21wb25lbnQ6ICgpID0+IG51bGxcbiAgfSxcblxuICBwcm9wczoge1xuICAgIGJ1dHRvbnM6IHsgdHlwZTogT2JqZWN0LCBkZWZhdWx0OiBudWxsIH0sXG4gICAgZGF0YVBhdGg6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnJyB9LFxuICAgIGRhdGE6IHsgdHlwZTogW09iamVjdCwgQXJyYXldLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgbWV0YTogeyB0eXBlOiBPYmplY3QsIGRlZmF1bHQ6ICgpID0+ICh7fSkgfSxcbiAgICBzdG9yZTogeyB0eXBlOiBPYmplY3QsIGRlZmF1bHQ6ICgpID0+ICh7fSkgfSxcbiAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBidXR0b25TY2hlbWFzKCkge1xuICAgICAgLy8gQ29tcHV0ZSBhIGJ1dHRvbnMgbGlzdCB3aGljaCBoYXMgdGhlIGRhdGFQYXRoIGJha2VkIGludG8gaXRzIGtleXMuXG4gICAgICBjb25zdCB7IGRhdGFQYXRoLCBidXR0b25zIH0gPSB0aGlzXG4gICAgICByZXR1cm4gYnV0dG9uc1xuICAgICAgICA/IE9iamVjdC52YWx1ZXMoYnV0dG9ucykucmVkdWNlKChzY2hlbWFzLCBidXR0b24pID0+IHtcbiAgICAgICAgICAgIHNjaGVtYXNbYXBwZW5kRGF0YVBhdGgoZGF0YVBhdGgsIGJ1dHRvbi5uYW1lKV0gPSBidXR0b25cbiAgICAgICAgICAgIHJldHVybiBzY2hlbWFzXG4gICAgICAgICAgfSwge30pXG4gICAgICAgIDogbnVsbFxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgaGFzU2xvdENvbnRlbnQsXG4gICAgaGFzVk5vZGVDb250ZW50XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG4uZGl0by1idXR0b25zIHtcbiAgPiAuZGl0by1jb250YWluZXIge1xuICAgIHBhZGRpbmc6IDA7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLy8tIFNldCBgQGNsaWNrLnN0b3BgIHRvIHByZXZlbnQgY2xpY2sgZXZlbnRzIGZyb20gYnViYmxpbmcgdG8gZGl0by1sYWJlbC5cbkRpdG9CdXR0b25zLmRpdG8tZWRpdC1idXR0b25zLmRpdG8tYnV0dG9ucy1yb3VuZChcbiAgOmJ1dHRvbnM9XCJidXR0b25zXCJcbiAgOmRhdGFQYXRoPVwiZGF0YVBhdGhcIlxuICA6ZGF0YT1cImRhdGFcIlxuICA6bWV0YT1cIm1ldGFcIlxuICA6c3RvcmU9XCJzdG9yZVwiXG4gIEBjbGljay5zdG9wXG4pXG4gIC8vLSBGaXJlZm94IGRvZXNuJ3QgbGlrZSA8YnV0dG9uPiBoZXJlLCBzbyB1c2UgPGE+IGluc3RlYWQ6XG4gIGEuZGl0by1idXR0b24oXG4gICAgdi1pZj1cImlzRHJhZ2dhYmxlXCJcbiAgICB2LWJpbmQ9XCJnZXRCdXR0b25BdHRyaWJ1dGVzKHZlcmJzLmRyYWcpXCJcbiAgKVxuICBSb3V0ZXJMaW5rLmRpdG8tYnV0dG9uKFxuICAgIHYtaWY9XCJpc0VkaXRhYmxlXCJcbiAgICA6dG89XCJ7IHBhdGg6IGVkaXRQYXRoIH1cIlxuICAgIHYtYmluZD1cImdldEJ1dHRvbkF0dHJpYnV0ZXModmVyYnMuZWRpdClcIlxuICApXG4gIERpdG9DcmVhdGVCdXR0b24oXG4gICAgdi1pZj1cImlzQ3JlYXRhYmxlXCJcbiAgICA6c2NoZW1hPVwic2NoZW1hXCJcbiAgICA6cGF0aD1cImNyZWF0ZVBhdGhcIlxuICAgIDp2ZXJiPVwidmVyYnMuY3JlYXRlXCJcbiAgICA6dGV4dD1cImNyZWF0ZUJ1dHRvblRleHRcIlxuICApXG4gIGJ1dHRvbi5kaXRvLWJ1dHRvbihcbiAgICB2LWlmPVwiaXNEZWxldGFibGVcIlxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIHYtYmluZD1cImdldEJ1dHRvbkF0dHJpYnV0ZXModmVyYnMuZGVsZXRlKVwiXG4gICAgQGNsaWNrPVwiJGVtaXQoJ2RlbGV0ZScpXCJcbiAgKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5pbXBvcnQgeyBjYXBpdGFsaXplIH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvRWRpdEJ1dHRvbnMnLCB7XG4gIGVtaXRzOiBbJ2RlbGV0ZSddLFxuXG4gIHByb3BzOiB7XG4gICAgZHJhZ2dhYmxlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgZWRpdGFibGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBjcmVhdGFibGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBkZWxldGFibGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBlZGl0UGF0aDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBjcmVhdGVQYXRoOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIGJ1dHRvbnM6IHsgdHlwZTogT2JqZWN0LCBkZWZhdWx0OiBudWxsIH0sXG4gICAgc2NoZW1hOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBkYXRhUGF0aDogeyB0eXBlOiBTdHJpbmcsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZGF0YTogeyB0eXBlOiBbT2JqZWN0LCBBcnJheV0sIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBtZXRhOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBzdG9yZTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGZvcm1MYWJlbCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldExhYmVsKHRoaXMuc2NoZW1hLmZvcm0pXG4gICAgfSxcblxuICAgIGlzRHJhZ2dhYmxlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaGFzT3B0aW9uKCdkcmFnZ2FibGUnKVxuICAgIH0sXG5cbiAgICBpc0VkaXRhYmxlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaGFzT3B0aW9uKCdlZGl0YWJsZScpICYmICEhdGhpcy5lZGl0UGF0aFxuICAgIH0sXG5cbiAgICBpc0NyZWF0YWJsZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhc09wdGlvbignY3JlYXRhYmxlJykgJiYgISF0aGlzLmNyZWF0ZVBhdGhcbiAgICB9LFxuXG4gICAgaXNEZWxldGFibGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5oYXNPcHRpb24oJ2RlbGV0YWJsZScpXG4gICAgfSxcblxuICAgIGNyZWF0ZUJ1dHRvblRleHQoKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAvLyBBbGxvdyBzY2hlbWEgdG8gb3ZlcnJpZGUgY3JlYXRlIGJ1dHRvbiB0aHJvdWdoIGNyZWF0YWJsZSBvYmplY3Q6XG4gICAgICAgIHRoaXMuc2NoZW1hLmNyZWF0YWJsZT8ubGFiZWwgfHwgKFxuICAgICAgICAgIC8vIEF1dG8tZ2VuZXJhdGUgY3JlYXRlIGJ1dHRvbiBsYWJlbHMgZnJvbSBmcm9tIGxhYmVscyBmb3IgbGlzdFxuICAgICAgICAgIC8vIHNvdXJjZXMgd2l0aCBvbmx5IG9uZSBmb3JtOlxuICAgICAgICAgIHRoaXMuZm9ybUxhYmVsICYmXG4gICAgICAgICAgYCR7Y2FwaXRhbGl6ZSh0aGlzLnZlcmJzLmNyZWF0ZSl9ICR7dGhpcy5mb3JtTGFiZWx9YFxuICAgICAgICApIHx8XG4gICAgICAgIG51bGxcbiAgICAgIClcbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGhhc09wdGlvbihuYW1lKSB7XG4gICAgICAvLyBUaGUgb3B0aW9ucyBvZiB0aGUgb3V0ZXIgY29tcG9uZW50IGFyZSBwYXNzZWQgdG8gdGhlIGJ1dHRvbnMgY29tcG9uZW50XG4gICAgICAvLyB0aHJvdWdoIHByb3BlcnRpZXMgYHRoaXNbbmFtZV1gLCBidXQgY2FuIGJlIGRpc2FibGVkIG9uIGEgcGVyLWZvcm1cbiAgICAgIC8vIGJhc2lzIGJ5IHNldHRpbmcgYHNjaGVtYVtuYW1lXWAgdG8gYGZhbHNlYC5cbiAgICAgIHJldHVybiAhISh0aGlzW25hbWVdICYmIHRoaXMuc2NoZW1hW25hbWVdICE9PSBmYWxzZSlcbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG4uZGl0by1lZGl0LWJ1dHRvbnMge1xuICAvLyBPdmVycmlkZSBjdXJzb3IgZnJvbSBjb2xsYXBzaWJsZSBkaXRvLWxhYmVsOlxuICBjdXJzb3I6IGRlZmF1bHQ7XG4gIGZsZXg6IG5vbmU7XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLWNyZWF0ZS1idXR0b25cbiAgdGVtcGxhdGUoXG4gICAgdi1pZj1cInNob3dQdWxsZG93blwiXG4gIClcbiAgICBidXR0b24uZGl0by1idXR0b24oXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIDpjbGFzcz1cImBkaXRvLWJ1dHRvbi0ke3ZlcmJ9YFwiXG4gICAgICA6dGl0bGU9XCJsYWJlbGl6ZSh2ZXJiKVwiXG4gICAgICBAbW91c2Vkb3duLnN0b3A9XCJvblB1bGxkb3duTW91c2VEb3duKClcIlxuICAgICkge3sgdGV4dCB9fVxuICAgIHVsLmRpdG8tcHVsbGRvd24oOmNsYXNzPVwieyAnZGl0by1vcGVuJzogcHVsbGRvd24ub3BlbiB9XCIpXG4gICAgICBsaShcbiAgICAgICAgdi1mb3I9XCIoZm9ybSwgdHlwZSkgaW4gZm9ybXNcIlxuICAgICAgKVxuICAgICAgICBhKFxuICAgICAgICAgIHYtaWY9XCJzaG91bGRSZW5kZXIoZm9ybSlcIlxuICAgICAgICAgIHYtc2hvdz1cInNob3VsZFNob3coZm9ybSlcIlxuICAgICAgICAgIDpjbGFzcz1cImdldEZvcm1DbGFzcyhmb3JtLCB0eXBlKVwiXG4gICAgICAgICAgQG1vdXNlZG93bi5zdG9wPVwib25QdWxsZG93bk1vdXNlRG93bih0eXBlKVwiXG4gICAgICAgICAgQG1vdXNldXA9XCJvblB1bGxkb3duTW91c2VVcCh0eXBlKVwiXG4gICAgICAgICkge3sgZ2V0TGFiZWwoZm9ybSkgfX1cbiAgYnV0dG9uLmRpdG8tYnV0dG9uKFxuICAgIHYtZWxzZVxuICAgIDp0eXBlPVwiaXNJbmxpbmVkID8gJ2J1dHRvbicgOiAnc3VibWl0J1wiXG4gICAgOmNsYXNzPVwiYGRpdG8tYnV0dG9uLSR7dmVyYn1gXCJcbiAgICA6dGl0bGU9XCJsYWJlbGl6ZSh2ZXJiKVwiXG4gICAgQGNsaWNrPVwiY3JlYXRlSXRlbShmb3Jtcy5kZWZhdWx0KVwiXG4gICkge3sgdGV4dCB9fVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5pbXBvcnQgUHVsbGRvd25NaXhpbiBmcm9tICcuLi9taXhpbnMvUHVsbGRvd25NaXhpbi5qcydcbmltcG9ydCB7IGdldEZvcm1TY2hlbWFzLCBpc0lubGluZWQgfSBmcm9tICcuLi91dGlscy9zY2hlbWEuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b0NyZWF0ZUJ1dHRvbicsIHtcbiAgbWl4aW5zOiBbUHVsbGRvd25NaXhpbl0sXG5cbiAgcHJvcHM6IHtcbiAgICBzY2hlbWE6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHBhdGg6IHsgdHlwZTogU3RyaW5nLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHZlcmI6IHsgdHlwZTogU3RyaW5nLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHRleHQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGZvcm1zKCkge1xuICAgICAgcmV0dXJuIGdldEZvcm1TY2hlbWFzKHRoaXMuc2NoZW1hLCB0aGlzLmNvbnRleHQpXG4gICAgfSxcblxuICAgIGlzSW5saW5lZCgpIHtcbiAgICAgIHJldHVybiBpc0lubGluZWQodGhpcy5zY2hlbWEpXG4gICAgfSxcblxuICAgIHNob3dQdWxsZG93bigpIHtcbiAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmZvcm1zKS5sZW5ndGggPiAxIHx8ICF0aGlzLmZvcm1zLmRlZmF1bHRcbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGNyZWF0ZUl0ZW0oZm9ybSwgdHlwZSA9IG51bGwpIHtcbiAgICAgIGlmICh0aGlzLnNob3VsZFJlbmRlcihmb3JtKSAmJiAhdGhpcy5zaG91bGREaXNhYmxlKGZvcm0pKSB7XG4gICAgICAgIGlmICh0aGlzLmlzSW5saW5lZCkge1xuICAgICAgICAgIHRoaXMuc291cmNlQ29tcG9uZW50LmNyZWF0ZUl0ZW0oZm9ybSwgdHlwZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLiRyb3V0ZXIucHVzaCh7XG4gICAgICAgICAgICBwYXRoOiBgJHt0aGlzLnBhdGh9L2NyZWF0ZWAsXG4gICAgICAgICAgICBxdWVyeTogeyB0eXBlIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBhbGxvd2VkIHRvIGNyZWF0ZSBpdGVtIGZvciBnaXZlbiBmb3JtJylcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZ2V0Rm9ybUNsYXNzKGZvcm0sIHR5cGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIFtgZGl0by10eXBlLSR7dHlwZX1gXTogdHJ1ZSxcbiAgICAgICAgJ2RpdG8tZGlzYWJsZWQnOiB0aGlzLnNob3VsZERpc2FibGUoZm9ybSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgb25QdWxsZG93blNlbGVjdCh0eXBlKSB7XG4gICAgICB0aGlzLmNyZWF0ZUl0ZW0odGhpcy5mb3Jtc1t0eXBlXSwgdHlwZSlcbiAgICAgIHRoaXMuc2V0UHVsbGRvd25PcGVuKGZhbHNlKVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbi5kaXRvLWNyZWF0ZS1idXR0b24ge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG5cbiAgLmRpdG8tcHVsbGRvd24ge1xuICAgIHJpZ2h0OiAwO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLWNsaXBib2FyZC5kaXRvLWJ1dHRvbnMuZGl0by1idXR0b25zLXJvdW5kKFxuICB2LWlmPVwiY2xpcGJvYXJkXCJcbilcbiAgYnV0dG9uLmRpdG8tYnV0dG9uLmRpdG8tYnV0dG9uLWNvcHkoXG4gICAgcmVmPVwiY29weURhdGFcIlxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIHRpdGxlPVwiQ29weSBEYXRhXCJcbiAgICA6ZGlzYWJsZWQ9XCIhY29weUVuYWJsZWRcIlxuICAgIEBjbGljaz1cIm9uQ29weVwiXG4gIClcbiAgYnV0dG9uLmRpdG8tYnV0dG9uLmRpdG8tYnV0dG9uLXBhc3RlKFxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIHRpdGxlPVwiUGFzdGUgRGF0YVwiXG4gICAgOmRpc2FibGVkPVwiIXBhc3RlRW5hYmxlZFwiXG4gICAgQGNsaWNrPVwib25QYXN0ZVwiXG4gIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgeyBpc09iamVjdCwgY2xvbmUsIGRlaW5kZW50IH0gZnJvbSAnQGRpdG9qcy91dGlscydcbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5pbXBvcnQgRGl0b0NvbnRleHQgZnJvbSAnLi4vRGl0b0NvbnRleHQuanMnXG5pbXBvcnQgRG9tTWl4aW4gZnJvbSAnLi4vbWl4aW5zL0RvbU1peGluLmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9DbGlwYm9hcmQnLCB7XG4gIG1peGluczogW0RvbU1peGluXSxcblxuICBwcm9wczoge1xuICAgIGNsaXBib2FyZDogeyB0eXBlOiBbQm9vbGVhbiwgT2JqZWN0XSwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBkYXRhUGF0aDogeyB0eXBlOiBTdHJpbmcsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZGF0YTogeyB0eXBlOiBbT2JqZWN0LCBBcnJheV0sIGRlZmF1bHQ6IG51bGwgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvcHlFbmFibGVkOiBmYWxzZSxcbiAgICAgIHBhc3RlRW5hYmxlZDogZmFsc2UsXG4gICAgICBmaXhDbGlwYm9hcmQ6IHRydWVcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBjbGlwYm9hcmRPcHRpb25zKCkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0KHRoaXMuY2xpcGJvYXJkKSA/IHRoaXMuY2xpcGJvYXJkIDoge31cbiAgICB9LFxuXG4gICAgY29weURhdGEoKSB7XG4gICAgICBjb25zdCB7IGNvcHkgfSA9IHRoaXMuY2xpcGJvYXJkT3B0aW9uc1xuICAgICAgcmV0dXJuIGNvcHlcbiAgICAgICAgPyBjbGlwYm9hcmREYXRhID0+XG4gICAgICAgICAgICBjb3B5LmNhbGwoXG4gICAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICAgIG5ldyBEaXRvQ29udGV4dCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgY2xpcGJvYXJkRGF0YVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICA6IGNsaXBib2FyZERhdGEgPT4gY2xvbmUoY2xpcGJvYXJkRGF0YSlcbiAgICB9LFxuXG4gICAgcGFzdGVEYXRhKCkge1xuICAgICAgY29uc3QgeyBwYXN0ZSB9ID0gdGhpcy5jbGlwYm9hcmRPcHRpb25zXG4gICAgICByZXR1cm4gcGFzdGVcbiAgICAgICAgPyBjbGlwYm9hcmREYXRhID0+XG4gICAgICAgICAgICBwYXN0ZS5jYWxsKFxuICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICBuZXcgRGl0b0NvbnRleHQodGhpcywge1xuICAgICAgICAgICAgICAgIGNsaXBib2FyZERhdGFcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgOiBjbGlwYm9hcmREYXRhID0+IGNsaXBib2FyZERhdGFcbiAgICB9XG4gIH0sXG5cbiAgbW91bnRlZCgpIHtcbiAgICAvLyBDaGVjayBjbGlwYm9hcmQgY29udGVudCB3aGVuZXZlciBzb21ldGhpbmcgZ2V0cyBjb3BpZWQgb3IgdGhlIHdpbmRvdyBnZXRzXG4gICAgLy8gKHJlKWFjdGl2YXRlZCwgYXMgdGhvc2UgYXJlIHRoZSBtb21lbnRzIHdoZW4gdGhlIGNsaXBib2FyZCBjYW4gY2hhbmdlOlxuICAgIHRoaXMuZG9tT24oZG9jdW1lbnQsIHtcbiAgICAgIGNvcHk6IHRoaXMuY2hlY2tDbGlwYm9hcmRcbiAgICB9KVxuICAgIHRoaXMuZG9tT24od2luZG93LCB7XG4gICAgICBmb2N1czogdGhpcy5jaGVja0NsaXBib2FyZFxuICAgIH0pXG4gICAgdGhpcy4kd2F0Y2goJ2RhdGEnLCB7XG4gICAgICAvLyBDaGVjayByaWdodCBhd2F5IGFsc28gaW4gY2FzZSB0aGVyZSdzIGFscmVhZHkgZGF0YSAoZS5nLiBjcmVhdGUgZm9ybSkuXG4gICAgICBpbW1lZGlhdGU6IHRydWUsXG4gICAgICBoYW5kbGVyOiAodG8sIGZyb20pID0+IHtcbiAgICAgICAgaWYgKHRvICE9PSBmcm9tKSB7XG4gICAgICAgICAgdGhpcy5jaGVja0NsaXBib2FyZCgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBhc3luYyBnZXRDbGlwYm9hcmREYXRhKHJlcG9ydCkge1xuICAgICAgLy8gVXNlIHRoZSBpbnRlcm5hbCBjbGlwYm9hcmQgYXMgZmFsbGJhY2suXG4gICAgICBsZXQgeyBjbGlwYm9hcmREYXRhIH0gPSB0aGlzLmFwcFN0YXRlXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBqc29uID0gYXdhaXQgbmF2aWdhdG9yLmNsaXBib2FyZD8ucmVhZFRleHQ/LigpXG4gICAgICAgIGlmICh0aGlzLmZpeENsaXBib2FyZCAmJiBqc29uKSB7XG4gICAgICAgICAgLy8gVGhpcyBhcHBlYXJzIHRvIGJlIG5lZWRlZCBvbiBTYWZhcmkgdG8gcHJldmVudCBhIHN0cmFuZ2UgXCJQYXN0ZVwiXG4gICAgICAgICAgLy8gYnV0dG9uIGZyb20gYXBwZWFyaW5nIHdoZW4gdGhlIGNsaXBib2FyZCBpcyBhY2Nlc3NlZCAod2h5PyEpLlxuICAgICAgICAgIGF3YWl0IG5hdmlnYXRvci5jbGlwYm9hcmQ/LndyaXRlVGV4dD8uKGpzb24pXG4gICAgICAgICAgdGhpcy5maXhDbGlwYm9hcmQgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIGlmIChqc29uKSB7XG4gICAgICAgICAgY2xpcGJvYXJkRGF0YSA9IEpTT04ucGFyc2UoanNvbilcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChyZXBvcnQpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVyciwgZXJyLm5hbWUsIGVyci5tZXNzYWdlKVxuICAgICAgICAgIGlmIChlcnIubmFtZSA9PT0gJ1N5bnRheEVycm9yJykge1xuICAgICAgICAgICAgYWxlcnQoZGVpbmRlbnRgXG4gICAgICAgICAgICAgIFRoZSBkYXRhIGluIHRoZSBjbGlwYm9hcmQgYXBwZWFycyB0byBiZSBtYWxmb3JtZWQ6XG4gICAgICAgICAgICAgICR7ZXJyLm1lc3NhZ2V9XG4gICAgICAgICAgICBgKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgeyAkc2NoZW1hLCAuLi5kYXRhIH0gPSBjbGlwYm9hcmREYXRhIHx8IHt9XG4gICAgICByZXR1cm4gJHNjaGVtYSA9PT0gdGhpcy5zY2hlbWFDb21wb25lbnQ/LnNjaGVtYS5uYW1lID8gZGF0YSA6IG51bGxcbiAgICB9LFxuXG4gICAgYXN5bmMgY2hlY2tDbGlwYm9hcmQoKSB7XG4gICAgICB0aGlzLmNvcHlFbmFibGVkID0gISF0aGlzLmRhdGFcbiAgICAgIC8vIFNlZSBpZiB0aGUgY2xpcGJvYXJkIGNvbnRlbnQgaXMgdmFsaWQgSlNPTiBkYXRhIHRoYXQgaXMgY29tcGF0aWJsZVxuICAgICAgLy8gd2l0aCB0aGUgY3VycmVudCB0YXJnZXQgc2NoZW1hLCBhbmQgb25seSB0aGVuIGFjdGl2YXRlIHRoZSBwYXN0aW5nOlxuICAgICAgdGhpcy5wYXN0ZUVuYWJsZWQgPSAhIShhd2FpdCB0aGlzLmdldENsaXBib2FyZERhdGEoZmFsc2UpKSAvLyBkb24ndCByZXBvcnRcbiAgICB9LFxuXG4gICAgYXN5bmMgb25Db3B5KCkge1xuICAgICAgbGV0IGRhdGEgPSB0aGlzLnNjaGVtYUNvbXBvbmVudD8uY2xpcGJvYXJkRGF0YVxuICAgICAgdHJ5IHtcbiAgICAgICAgZGF0YSA9IGRhdGEgJiYgdGhpcy5jb3B5RGF0YShkYXRhKVxuICAgICAgICAvLyBLZWVwIGFuIGludGVybmFsIGNsaXBib2FyZCBhcyBmYWxsYmFjay5cbiAgICAgICAgdGhpcy5hcHBTdGF0ZS5jbGlwYm9hcmREYXRhID0gZGF0YVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCAyKVxuICAgICAgICAgIGF3YWl0IG5hdmlnYXRvci5jbGlwYm9hcmQ/LndyaXRlVGV4dD8uKGpzb24pXG4gICAgICAgICAgLy8gU2VlIGlmIHdlIGNhbiBhY3RpdmF0ZSB0aGUgcGFzdGUgYnV0dG9uLCBkZXBlbmRpbmcgb24gYnJvd3NlcnM6XG4gICAgICAgICAgYXdhaXQgdGhpcy5jaGVja0NsaXBib2FyZCgpXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyLCBlcnIubmFtZSwgZXJyLm1lc3NhZ2UpXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpXG4gICAgICAgIGFsZXJ0KGVycm9yLm1lc3NhZ2UpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIG9uUGFzdGUoKSB7XG4gICAgICBsZXQgZGF0YSA9IGF3YWl0IHRoaXMuZ2V0Q2xpcGJvYXJkRGF0YSh0cnVlKSAvLyByZXBvcnRcbiAgICAgIHRyeSB7XG4gICAgICAgIGRhdGEgPSBkYXRhICYmIHRoaXMucGFzdGVEYXRhKGRhdGEpXG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgdGhpcy5zY2hlbWFDb21wb25lbnQuc2V0RGF0YShkYXRhKVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKVxuICAgICAgICBhbGVydChlcnJvci5tZXNzYWdlKVxuICAgICAgfVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuIiwiLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaXNMb2FkaW5nOiBmYWxzZVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgc2V0TG9hZGluZyhpc0xvYWRpbmcsIHsgdXBkYXRlUm9vdCA9IGZhbHNlLCB1cGRhdGVWaWV3ID0gZmFsc2UgfSA9IHt9KSB7XG4gICAgICBpZiAoIXRoaXMuaXNMb2FkaW5nIF4gIWlzTG9hZGluZykge1xuICAgICAgICAvLyBCb29sZWFuIHhvclxuICAgICAgICB0aGlzLmlzTG9hZGluZyA9ICEhaXNMb2FkaW5nXG4gICAgICAgIGlmICh1cGRhdGVSb290KSB7XG4gICAgICAgICAgdGhpcy5yb290Q29tcG9uZW50LnJlZ2lzdGVyTG9hZGluZyhpc0xvYWRpbmcpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwZGF0ZVZpZXcpIHtcbiAgICAgICAgICB0aGlzLnZpZXdDb21wb25lbnQuc2V0TG9hZGluZyh0aGlzLmlzTG9hZGluZylcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IEl0ZW1NaXhpbiBmcm9tICcuL0l0ZW1NaXhpbi5qcydcbmltcG9ydCBMb2FkaW5nTWl4aW4gZnJvbSAnLi9Mb2FkaW5nTWl4aW4uanMnXG5pbXBvcnQgeyBzZXREZWZhdWx0VmFsdWVzIH0gZnJvbSAnLi4vdXRpbHMvc2NoZW1hLmpzJ1xuaW1wb3J0IHsgaXNPYmplY3QsIGlzU3RyaW5nLCBsYWJlbGl6ZSB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgeyBnZXRSZXNvdXJjZSB9IGZyb20gJy4uL3V0aWxzL3Jlc291cmNlLmpzJ1xuaW1wb3J0IERpdG9Db250ZXh0IGZyb20gJy4uL0RpdG9Db250ZXh0LmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQge1xuICBtaXhpbnM6IFtJdGVtTWl4aW4sIExvYWRpbmdNaXhpbl0sXG5cbiAgcHJvdmlkZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJHJlc291cmNlQ29tcG9uZW50OiAoKSA9PiB0aGlzLFxuICAgICAgLy8gUGFzcyBsb2NhbCB2ZXJicyBvdmVycmlkZXMgb24gdG8gY2hpbGRyZW4sIHNlZSB2ZXJicygpIGNvbXB1dGVkIHByb3AuXG4gICAgICAkdmVyYnM6ICgpID0+IHRoaXMudmVyYnMsXG4gICAgICAkaXNQb3B1bGF0ZWQ6ICgpID0+IHRoaXMuaGFzRGF0YVxuICAgIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBsb2FkZWREYXRhOiBudWxsXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgcmVzb3VyY2VDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH0sXG5cbiAgICByZXNvdXJjZSgpIHtcbiAgICAgIC8vIFJldHVybnMgdGhlIHJlc291cmNlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHJlc291cmNlIGZvciB0aGVcbiAgICAgIC8vIGFzc29jaWF0ZWQgc291cmNlIHNjaGVtYS5cbiAgICAgIHJldHVybiB0aGlzLmdldFJlc291cmNlKClcbiAgICB9LFxuXG4gICAgcHJvdmlkZXNEYXRhKCkge1xuICAgICAgLy8gVGhpcyBjb21wb25lbnQgaXMgYSBkYXRhLXNvdXJjZSBpZiBpdCBoYXMgYW4gYXNzb2NpYXRlZCBBUEkgcmVzb3VyY2U6XG4gICAgICByZXR1cm4gISF0aGlzLnJlc291cmNlXG4gICAgfSxcblxuICAgIGxpbmtzVG9WaWV3KCkge1xuICAgICAgLy8gUmV0dXJucyBgZmFsc2VgaGVyZSwgYnV0IGlzIG92ZXJyaWRkZW4gdG8gcmV0dXJuIGB0cnVlYCBpblxuICAgICAgLy8gYFNvdXJjZU1peGluYCBmb3IgY29tcG9uZW50IHRoYXQgZG8gbm90IHByb3ZpZGUgdGhlaXIgb3duIGRhdGEsIGJ1dFxuICAgICAgLy8gZWRpdCB0aGVpciBpdGVtcyB0aHJvdWdoIGEgbGlua2VkIHZpZXcuICBJbiB0aGlzIGNhc2UsIHJlYWwgaWRzIG5lZWQgdG9cbiAgICAgIC8vIGJlIHVzZWQuXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9LFxuXG4gICAgaXNUcmFuc2llbnQoKSB7XG4gICAgICAvLyBDaGVjayB0aGUgZm9ybSB0aGF0IHRoaXMgY29tcG9uZW50IGJlbG9uZ3MgdG8gYXMgd2VsbCwgc2luY2UgaXQgbWF5IGJlXG4gICAgICAvLyBpbiBjcmVhdGlvbiBtb2RlLCB3aGljaCBtYWtlcyBpdCB0cmFuc2llbnQuXG4gICAgICAvLyBOT1RFOiBUaGlzIGRvZXMgbm90IGxvb3AgZW5kbGVzc2x5IGJlY2F1c2UgRGl0b0Zvcm0gcmVkZWZpbmVzXG4gICAgICAvLyBgaXNUcmFuc2llbnQoKWAgdG8gb25seSByZXR1cm4gYCF0aGlzLnByb3ZpZGVzRGF0YWAuXG4gICAgICBjb25zdCBmb3JtID0gdGhpcy5mb3JtQ29tcG9uZW50XG4gICAgICByZXR1cm4gKFxuICAgICAgICAhdGhpcy5wcm92aWRlc0RhdGEgJiZcbiAgICAgICAgIXRoaXMubGlua3NUb1ZpZXcgfHxcbiAgICAgICAgZm9ybSAmJiAoXG4gICAgICAgICAgZm9ybS5pc1RyYW5zaWVudCB8fFxuICAgICAgICAgIGZvcm0uaXNDcmVhdGluZ1xuICAgICAgICApXG4gICAgICApXG4gICAgfSxcblxuICAgIHRyYW5zaWVudE5vdGUoKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLmlzVHJhbnNpZW50ICYmIChcbiAgICAgICAgICAnPGI+Tm90ZTwvYj46IHRoZSBwYXJlbnQgc3RpbGwgbmVlZHMgdG8gYmUgc2F2ZWQgJyArXG4gICAgICAgICAgJ2luIG9yZGVyIHRvIHBlcnNpc3QgdGhpcyBjaGFuZ2UuJ1xuICAgICAgICApXG4gICAgICApXG4gICAgfSxcblxuICAgIHNob3VsZExvYWQoKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAhdGhpcy5pc1RyYW5zaWVudCAmJlxuICAgICAgICAhdGhpcy5pc0xvYWRpbmdcbiAgICAgIClcbiAgICB9LFxuXG4gICAgLy8gQG92ZXJyaWRhYmxlXG4gICAgaGFzRGF0YSgpIHtcbiAgICAgIC8vIEJhc2UgZGVmaW5pdGlvbiwgd2lsbCBiZSBvdmVycmlkZGVuIGJ5IERpdG9Gb3JtIGFuZCBTb3VyY2VNaXhpblxuICAgICAgcmV0dXJuICEhdGhpcy5sb2FkZWREYXRhXG4gICAgfSxcblxuICAgIHZlcmJzKCkge1xuICAgICAgLy8gVGhlIGFjdHVhbCBjb2RlIGlzIHRoZSBgZ2V0VmVyYnMoKWAgbWV0aG9kLCBmb3IgZWFzaWVyIG92ZXJyaWRpbmcgb2ZcbiAgICAgIC8vIHRoaXMgY29tcHV0ZWQgcHJvcGVydHkgaW4gY29tcG9uZW50cyB0aGF0IHVzZSB0aGUgUmVzb3VyY2VNaXhpbi5cbiAgICAgIHJldHVybiB0aGlzLmdldFZlcmJzKClcbiAgICB9LFxuXG4gICAgcGFnaW5hdGlvblJhbmdlKCkge1xuICAgICAgLy8gT25seSBhcHBseSBwYWdpbmF0aW9uIHRvIGxpc3RzLlxuICAgICAgY29uc3QgeyBwYWdpbmF0ZTogYW1vdW50IH0gPSB0aGlzLnNvdXJjZVNjaGVtYVxuICAgICAgaWYgKHRoaXMuaXNMaXN0U291cmNlICYmIGFtb3VudCkge1xuICAgICAgICBjb25zdCB7IHBhZ2UgPSAwIH0gPSB0aGlzLnF1ZXJ5IHx8IHt9XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gcGFnZSAqIGFtb3VudFxuICAgICAgICByZXR1cm4gW3N0YXJ0LCBzdGFydCArIGFtb3VudCAtIDFdXG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH0sXG5cbiAgICBxdWVyeVBhcmFtcygpIHtcbiAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5wYWdpbmF0aW9uUmFuZ2VcbiAgICAgIGNvbnN0IHsgcGFnZSwgLi4ucXVlcnkgfSA9IHRoaXMucXVlcnkgfHwge31cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnF1ZXJ5LCAvLyBRdWVyeSBtYXkgb3ZlcnJpZGUgc2NvcGUuXG4gICAgICAgIC4uLihyYW5nZSAmJiB7XG4gICAgICAgICAgLy8gUGFzcyBwYWdpbmF0aW9uIGFzIHJhbmdlLCBzbyB0aGF0IHdlIGF1dG9tYXRpY2FsbHkgZ2V0IE9iamVjdGlvbidzXG4gICAgICAgICAgLy8gcmVzdWx0cyBjb3VudGluZzpcbiAgICAgICAgICByYW5nZTogcmFuZ2Uuam9pbignLCcpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGNyZWF0ZWQoKSB7XG4gICAgLy8gV2hlbiBjcmVhdGluZyBuZXN0ZWQgZGF0YSwgd2Ugc3RpbGwgbmVlZCB0byBjYWxsIHNldHVwRGF0YSgpXG4gICAgaWYgKHRoaXMucHJvdmlkZXNEYXRhIHx8IHRoaXMuaXNDcmVhdGluZykge1xuICAgICAgdGhpcy5zZXR1cERhdGEoKVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0UmVzb3VyY2UoKSB7XG4gICAgICAvLyBUaGlzIGlzIGRlZmluZWQgYXMgYSBtZXRob2Qgc28gdGhlIGNvbXB1dGVkIGByZXNvdXJjZWAgZ2V0dGVyIGNhblxuICAgICAgLy8gYmUgb3ZlcnJpZGRlbiBhbmQgYHN1cGVyYCBmdW5jdGlvbmFsaXR5IGNhbiBzdGlsbCBiZSBhY2Nlc3NlZC5cbiAgICAgIHJldHVybiBnZXRSZXNvdXJjZSh0aGlzLnNvdXJjZVNjaGVtYT8ucmVzb3VyY2UsIHtcbiAgICAgICAgdHlwZTogJ2NvbGxlY3Rpb24nLFxuICAgICAgICBwYXJlbnQ6IHRoaXMucGFyZW50Rm9ybUNvbXBvbmVudD8ucmVzb3VyY2UgPz8gbnVsbFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgZ2V0VmVyYnMoKSB7XG4gICAgICBjb25zdCB2ZXJicyA9IHRoaXMuJHZlcmJzKClcbiAgICAgIHJldHVybiB0aGlzLmlzVHJhbnNpZW50XG4gICAgICAgID8ge1xuICAgICAgICAgICAgLi4udmVyYnMsXG4gICAgICAgICAgICAvLyBPdmVycmlkZSBkZWZhdWx0IHZlcmJzIHdpdGggdGhlaXIgdHJhbnNpZW50IHZlcnNpb25zOlxuICAgICAgICAgICAgY3JlYXRlOiAnYWRkJyxcbiAgICAgICAgICAgIGNyZWF0ZWQ6ICdhZGRlZCcsXG4gICAgICAgICAgICBzYXZlOiAnYXBwbHknLFxuICAgICAgICAgICAgc2F2ZWQ6ICdhcHBsaWVkJyxcbiAgICAgICAgICAgIGRlbGV0ZTogJ3JlbW92ZScsXG4gICAgICAgICAgICBkZWxldGVkOiAncmVtb3ZlZCdcbiAgICAgICAgICB9XG4gICAgICAgIDogdmVyYnNcbiAgICB9LFxuXG4gICAgLy8gQG92ZXJyaWRhYmxlXG4gICAgY2xlYXJEYXRhKCkge1xuICAgICAgdGhpcy5sb2FkZWREYXRhID0gbnVsbFxuICAgIH0sXG5cbiAgICAvLyBAb3ZlcnJpZGFibGVcbiAgICBzZXREYXRhKGRhdGEpIHtcbiAgICAgIHRoaXMubG9hZGVkRGF0YSA9IGRhdGFcbiAgICB9LFxuXG4gICAgc2V0dXBEYXRhKCkge1xuICAgICAgLy8gQWN0dWFsIGNvZGUgaXMgaW4gc2VwYXJhdGUgZnVuY3Rpb24gc28gaXQncyBlYXNlciB0byBvdmVycmlkZVxuICAgICAgLy8gYHNldHVwRGF0YSgpYCBhbmQgYW5kIGNhbGwgYGVuc3VyZURhdGEoKWAgZnJvbSB0aGUgb3ZlcnJpZGVzLFxuICAgICAgLy8gc2VlIERpdG9Gb3JtIGFuZCBTb3VyY2VNaXhpbi5cbiAgICAgIHRoaXMuZW5zdXJlRGF0YSgpXG4gICAgfSxcblxuICAgIGVuc3VyZURhdGEoKSB7XG4gICAgICBpZiAodGhpcy5zaG91bGRMb2FkKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0RhdGEpIHtcbiAgICAgICAgICB0aGlzLnJlbG9hZERhdGEoKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMubG9hZERhdGEodHJ1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICByZWxvYWREYXRhKCkge1xuICAgICAgdGhpcy5sb2FkRGF0YShmYWxzZSlcbiAgICB9LFxuXG4gICAgbG9hZERhdGEoY2xlYXIpIHtcbiAgICAgIGlmICghdGhpcy5pc1RyYW5zaWVudCkge1xuICAgICAgICBpZiAoY2xlYXIpIHtcbiAgICAgICAgICB0aGlzLmNsZWFyRGF0YSgpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZXF1ZXN0RGF0YSgpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGNyZWF0ZURhdGEoc2NoZW1hLCB0eXBlKSB7XG4gICAgICByZXR1cm4gc2V0RGVmYXVsdFZhbHVlcyhzY2hlbWEsIHR5cGUgPyB7IHR5cGUgfSA6IHt9LCB0aGlzKVxuICAgIH0sXG5cbiAgICByZXF1ZXN0RGF0YSgpIHtcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5xdWVyeVBhcmFtc1xuICAgICAgdGhpcy5oYW5kbGVSZXF1ZXN0KHsgbWV0aG9kOiAnZ2V0JywgcXVlcnkgfSwgKGVyciwgcmVzcG9uc2UpID0+IHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBkYXRhPy50eXBlID09PSAnRmlsdGVyVmFsaWRhdGlvbicgJiZcbiAgICAgICAgICAgICAgdGhpcy5vbkZpbHRlckVycm9ycz8uKGRhdGEuZXJyb3JzKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNVbmF1dGhvcml6ZWRFcnJvcihyZXNwb25zZSkpIHtcbiAgICAgICAgICAgICAgLy8gVE9ETzogQ2FuIHdlIHJlYWxseSBzd2FsbG93IHRoZXNlIGVycm9ycz9cbiAgICAgICAgICAgICAgLy8gSXMgY2FsbGluZyBgZW5zdXJlVXNlcigpYCBpbiBgb25CZWZvcmVSZXF1ZXN0KClgIGVub3VnaD9cbiAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zZXREYXRhKHJlc3BvbnNlLmRhdGEpXG4gICAgICAgICAgdGhpcy5lbWl0U2NoZW1hRXZlbnQoJ2xvYWQnKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBpc1ZhbGlkYXRpb25FcnJvcihyZXNwb25zZSkge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlPy5zdGF0dXMgPT09IDQwMFxuICAgIH0sXG5cbiAgICBpc1VuYXV0aG9yaXplZEVycm9yKHJlc3BvbnNlKSB7XG4gICAgICByZXR1cm4gcmVzcG9uc2U/LnN0YXR1cyA9PT0gNDAxXG4gICAgfSxcblxuICAgIGFzeW5jIGhhbmRsZVJlcXVlc3QoXG4gICAgICB7XG4gICAgICAgIG1ldGhvZCxcbiAgICAgICAgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlLFxuICAgICAgICBxdWVyeSxcbiAgICAgICAgZGF0YVxuICAgICAgfSxcbiAgICAgIGNhbGxiYWNrXG4gICAgKSB7XG4gICAgICBjb25zdCBsb2FkaW5nT3B0aW9ucyA9IHtcbiAgICAgICAgdXBkYXRlUm9vdDogdHJ1ZSwgLy8gRGlzcGxheSBzcGlubmVyIGluIGhlYWRlciB3aGVuIGxvYWRpbmcgaW4gcmVzb3VyY2VzXG4gICAgICAgIHVwZGF0ZVZpZXc6IHRoaXMuaXNJblZpZXcgLy8gTm90aWZ5IHZpZXcgb2YgbG9hZGluZyBmb3IgdmlldyBjb21wb25lbnRzXG4gICAgICB9XG4gICAgICB0aGlzLnNldExvYWRpbmcodHJ1ZSwgbG9hZGluZ09wdGlvbnMpXG4gICAgICBjb25zdCByZXF1ZXN0ID0geyBtZXRob2QsIHJlc291cmNlLCBkYXRhLCBxdWVyeSB9XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuc2VuZFJlcXVlc3QocmVxdWVzdClcbiAgICAgICAgLy8gUGFzcyBib3RoIHJlcXVlc3QgYW5kIHJlc3BvbnNlIHRvIHRoZSBjYWxsYmFjaywgc28gdGhleSBjYW4gYmVcbiAgICAgICAgLy8gZXhwb3NlZCB0byBmdXJ0aGVyIGNhbGxiYWNrcyB0aHJvdWdoIERpdG9Db250ZXh0LlxuICAgICAgICBjYWxsYmFjayhudWxsLCByZXNwb25zZSlcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIElmIGNhbGxiYWNrIHJldHVybnMgdHJ1ZSwgZXJyb3JzIHdlcmUgYWxyZWFkeSBoYW5kbGVkLlxuICAgICAgICBjb25zdCB7IHJlc3BvbnNlIH0gPSBlcnJvclxuICAgICAgICBpZiAoIWNhbGxiYWNrKGVycm9yLCByZXNwb25zZSkpIHtcbiAgICAgICAgICBjb25zdCBkYXRhID0gcmVzcG9uc2U/LmRhdGFcbiAgICAgICAgICBjb25zdCB0aXRsZSA9IGlzU3RyaW5nKGRhdGE/LnR5cGUpXG4gICAgICAgICAgICA/IGxhYmVsaXplKGRhdGEudHlwZSlcbiAgICAgICAgICAgIDogJ0Vycm9yJ1xuICAgICAgICAgIGNvbnN0IHRleHQgPSBkYXRhPy5tZXNzYWdlID8/IGVycm9yXG4gICAgICAgICAgdGhpcy5ub3RpZnkoeyB0eXBlOiAnZXJyb3InLCB0aXRsZSwgdGV4dCB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnNldExvYWRpbmcoZmFsc2UsIGxvYWRpbmdPcHRpb25zKVxuICAgIH0sXG5cbiAgICBnZXRQYXlsb2FkRGF0YShidXR0b24sIG1ldGhvZCkge1xuICAgICAgLy8gQ29udmVudGlvbjogb25seSBwb3N0LCBwdXQgYW5kIHBhdGNoIHJlcXVlc3RzIHBhc3MgdGhlIGRhdGEgYXMgcGF5bG9hZC5cbiAgICAgIHJldHVybiAoXG4gICAgICAgIFsncG9zdCcsICdwdXQnLCAncGF0Y2gnXS5pbmNsdWRlcyhtZXRob2QpICYmIChcbiAgICAgICAgICAvLyBUT0RPOiBVc2UgYGhhbmRsZURhdGFTY2hlbWEoKWAgYXN5bmNocm9ub3VzbHkgaGVyZSBpbnN0ZWFkLCB0b1xuICAgICAgICAgIC8vIG9mZmVyIHRoZSBzYW1lIGFtb3VudCBvZiBwb3NzaWJpbGl0aWVzIGZvciBkYXRhIGxvYWRpbmcuXG4gICAgICAgICAgYnV0dG9uLmdldFNjaGVtYVZhbHVlKFsncmVzb3VyY2UnLCAnZGF0YSddKSB8fFxuICAgICAgICAgIGJ1dHRvbi5wcm9jZXNzZWRJdGVtXG4gICAgICAgIClcbiAgICAgIClcbiAgICB9LFxuXG4gICAgYXN5bmMgc3VibWl0KGJ1dHRvbikge1xuICAgICAgY29uc3QgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZShidXR0b24uc2NoZW1hLnJlc291cmNlLCB7XG4gICAgICAgIHBhcmVudDogdGhpcy5yZXNvdXJjZVxuICAgICAgfSlcbiAgICAgIGlmIChyZXNvdXJjZSkge1xuICAgICAgICBjb25zdCB7IG1ldGhvZCB9ID0gcmVzb3VyY2VcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZ2V0UGF5bG9hZERhdGEoYnV0dG9uLCBtZXRob2QpXG4gICAgICAgIHJldHVybiB0aGlzLnN1Ym1pdFJlc291cmNlKGJ1dHRvbiwgcmVzb3VyY2UsIG1ldGhvZCwgZGF0YSlcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0sXG5cbiAgICBhc3luYyBzdWJtaXRSZXNvdXJjZShidXR0b24sIHJlc291cmNlLCBtZXRob2QsIGRhdGEsIHtcbiAgICAgIHNldERhdGEgPSBmYWxzZSxcbiAgICAgIG9uU3VjY2VzcyxcbiAgICAgIG9uRXJyb3IsXG4gICAgICBub3RpZnlTdWNjZXNzID0gKCkgPT5cbiAgICAgICAgdGhpcy5ub3RpZnkoe1xuICAgICAgICAgIHR5cGU6ICdzdWNjZXNzJyxcbiAgICAgICAgICB0aXRsZTogJ1JlcXVlc3QgU3VjY2Vzc2Z1bCcsXG4gICAgICAgICAgdGV4dDogJ1JlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWxseSBzZW50LidcbiAgICAgICAgfSksXG4gICAgICBub3RpZnlFcnJvciA9IGVycm9yID0+XG4gICAgICAgIHRoaXMubm90aWZ5KHtcbiAgICAgICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgICAgIHRpdGxlOiAnUmVxdWVzdCBFcnJvcicsXG4gICAgICAgICAgdGV4dDogW1xuICAgICAgICAgICAgYFVuYWJsZSB0byBzZW5kIHJlcXVlc3Qke2Vycm9yID8gJzonIDogJyd9YCxcbiAgICAgICAgICAgIGVycm9yPy5tZXNzYWdlIHx8IGVycm9yXG4gICAgICAgICAgXVxuICAgICAgICB9KVxuICAgIH0gPSB7fSkge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICB0aGlzLmhhbmRsZVJlcXVlc3QoXG4gICAgICAgICAgeyBtZXRob2QsIHJlc291cmNlLCBkYXRhIH0sXG4gICAgICAgICAgYXN5bmMgKGVyciwgcmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSByZXNwb25zZT8uZGF0YVxuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAvLyBTZWUgaWYgd2UncmUgZGVhbGluZyB3aXRoIGEgRGl0byB2YWxpZGF0aW9uIGVycm9yOlxuICAgICAgICAgICAgICBjb25zdCBlcnJvcnMgPSB0aGlzLmlzVmFsaWRhdGlvbkVycm9yKHJlc3BvbnNlKSAmJiBkYXRhLmVycm9yc1xuICAgICAgICAgICAgICBpZiAoZXJyb3JzKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zaG93VmFsaWRhdGlvbkVycm9ycyhlcnJvcnMsIHRydWUpXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBpc09iamVjdChkYXRhKSA/IGRhdGEgOiBlcnJcbiAgICAgICAgICAgICAgICBvbkVycm9yPy4oZXJyb3IpXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5lbWl0QnV0dG9uRXZlbnQoYnV0dG9uLCAnZXJyb3InLCB7XG4gICAgICAgICAgICAgICAgICBub3RpZnk6IG5vdGlmeUVycm9yLFxuICAgICAgICAgICAgICAgICAgZXJyb3JcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHVuZGVybHlpbmcgZGF0YSBiZWZvcmUgY2FsbGluZyBgbm90aWZ5KClgIG9yXG4gICAgICAgICAgICAgIC8vIGB0aGlzLml0ZW1MYWJlbGAsIHNvIGlkIGlzIHNldCBhZnRlciBjcmVhdGluZyBuZXcgaXRlbXMuXG4gICAgICAgICAgICAgIGlmIChzZXREYXRhICYmIGRhdGEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldERhdGEoZGF0YSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBvblN1Y2Nlc3M/LigpXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuZW1pdEJ1dHRvbkV2ZW50KGJ1dHRvbiwgJ3N1Y2Nlc3MnLCB7XG4gICAgICAgICAgICAgICAgbm90aWZ5OiBub3RpZnlTdWNjZXNzXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIClcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVtaXRCdXR0b25FdmVudChidXR0b24sIGV2ZW50LCB7IG5vdGlmeSwgZXJyb3IgfSkge1xuICAgICAgLy8gQ3JlYXRlIHRoZSBjb250ZXh0IG91dHNpZGUgb2YgYGVtaXRFdmVudCgpYCwgc28gdGhhdFxuICAgICAgLy8gYGNvbnRleHQud2FzTm90aWZpZWRgIGNhbiBiZSBjaGVja2VkIGFmdGVyLlxuICAgICAgY29uc3QgY29udGV4dCA9IG5ldyBEaXRvQ29udGV4dChidXR0b24sIHtcbiAgICAgICAgbmVzdGVkOiBmYWxzZSxcbiAgICAgICAgZGF0YTogdGhpcy5kYXRhLFxuICAgICAgICBpdGVtTGFiZWw6IHRoaXMuaXRlbUxhYmVsLFxuICAgICAgICBlcnJvclxuICAgICAgfSlcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGJ1dHRvbi5lbWl0RXZlbnQoZXZlbnQsIHsgY29udGV4dCB9KVxuICAgICAgaWYgKFxuICAgICAgICBub3RpZnkgJiZcbiAgICAgICAgLy8gUHJldmVudCBkZWZhdWx0IGlmIGFueXRoaW5nIHdhcyByZXR1cm5lZCBmcm9tIHRoZSBldmVudCBoYW5kbGVyLlxuICAgICAgICByZXMgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAvLyBEbyBub3QgZGlzcGxheSBkZWZhdWx0IG5vdGlmaWNhdGlvbiBpZiB0aGUgZXZlbnQgaGFuZGxlciBhbHJlYWR5XG4gICAgICAgIC8vIGRpc3BsYXllZCBhIG5vdGlmaWNhdGlvbi5cbiAgICAgICAgIWNvbnRleHQud2FzTm90aWZpZWRcbiAgICAgICkge1xuICAgICAgICBub3RpZnkoZXJyb3IpXG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzXG4gICAgfVxuICB9XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVBhdGgocGF0aCkge1xuICAvLyBGb3IgcGF0aHMgc3RhcmluZyB3aXRoIGAvYCwgd2UgY2FuIHVzZSB0aGUgbmF0aXZlIGBVUkwoKWAgY2xhc3MgdG8gcmVzb2x2ZVxuICAvLyB0aGUgcGF0aCwgd2hpY2ggd2lsbCBhbHNvIGhhbmRsZSBgLi5gIGFuZCBgLmAgc2VnbWVudHM6XG4gIHJldHVybiBuZXcgVVJMKGBmaWxlOiR7cGF0aH1gKS5wYXRobmFtZVxufVxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLWZvcm0uZGl0by1zY3JvbGwtcGFyZW50KFxuICA6Y2xhc3M9XCJ7ICdkaXRvLWZvcm0tbmVzdGVkJzogaXNOZXN0ZWRSb3V0ZSB9XCJcbiAgOmRhdGEtcmVzb3VyY2U9XCJzb3VyY2VTY2hlbWEucGF0aFwiXG4pXG4gIC8vLSBOT1RFOiBOZXN0ZWQgZm9ybSBjb21wb25lbnRzIGFyZSBrZXB0IGFsaXZlIGJ5IHVzaW5nIGB2LXNob3dgIGluc3RlYWQgb2ZcbiAgLy8tIGB2LWlmYCBoZXJlLCBzbyBldmVudCBoYW5kbGluZyBhbmQgb3RoZXIgdGhpbmdzIHN0aWxsIHdvcmsgd2l0aCBuZXN0ZWRcbiAgLy8tIGVkaXRpbmcuIE9ubHkgcmVuZGVyIGEgcm91dGVyLXZpZXcgaGVyZSBpZiB0aGlzIGlzbid0IHRoZSBsYXN0IGRhdGEgcm91dGVcbiAgLy8tIGFuZCBub3QgYSBuZXN0ZWQgZm9ybSByb3V0ZSwgd2hpY2ggd2lsbCBhcHBlYXIgZWxzZXdoZXJlIGluIGl0cyBvd24gdmlldy5cbiAgUm91dGVyVmlldyhcbiAgICB2LWlmPVwiIShpc0xhc3RVbm5lc3RlZFJvdXRlIHx8IGlzTmVzdGVkUm91dGUpXCJcbiAgICB2LXNob3c9XCIhaXNBY3RpdmVcIlxuICApXG4gIC8vLSBVc2UgYSA8ZGl2PiBmb3IgaW5saW5lZCBmb3JtcywgYXMgd2Ugc2hvdWxkbid0IG5lc3QgYWN0dWFsIDxmb3JtPiB0YWdzLlxuICBjb21wb25lbnQuZGl0by1zY3JvbGwoXG4gICAgdi1zaG93PVwiaXNBY3RpdmVcIlxuICAgIDppcz1cImlzTmVzdGVkUm91dGUgPyAnZGl2JyA6ICdmb3JtJ1wiXG4gICAgQHN1Ym1pdC5wcmV2ZW50XG4gIClcbiAgICBEaXRvU2NoZW1hKFxuICAgICAgOnNjaGVtYT1cInNjaGVtYVwiXG4gICAgICA6ZGF0YVBhdGg9XCJkYXRhUGF0aFwiXG4gICAgICA6ZGF0YT1cImRhdGFcIlxuICAgICAgOm1ldGE9XCJtZXRhXCJcbiAgICAgIDpzdG9yZT1cInN0b3JlXCJcbiAgICAgIDpkaXNhYmxlZD1cImlzTG9hZGluZ1wiXG4gICAgICA6bWVudUhlYWRlcj1cInRydWVcIlxuICAgIClcbiAgICAgIHRlbXBsYXRlKCNidXR0b25zKVxuICAgICAgICBEaXRvQnV0dG9ucy5kaXRvLWJ1dHRvbnMtcm91bmQuZGl0by1idXR0b25zLW1haW4uZGl0by1idXR0b25zLWxhcmdlKFxuICAgICAgICAgIDpidXR0b25zPVwiYnV0dG9uU2NoZW1hc1wiXG4gICAgICAgICAgOmRhdGFQYXRoPVwiZGF0YVBhdGhcIlxuICAgICAgICAgIDpkYXRhPVwiZGF0YVwiXG4gICAgICAgICAgOm1ldGE9XCJtZXRhXCJcbiAgICAgICAgICA6c3RvcmU9XCJzdG9yZVwiXG4gICAgICAgICAgOmRpc2FibGVkPVwiaXNMb2FkaW5nXCJcbiAgICAgICAgKVxuICAgIC8vLSBQcmV2ZW50IGltcGxpY2l0IHN1Ym1pc3Npb24gb2YgdGhlIGZvcm0sIGZvciBleGFtcGxlIHdoZW4gdHlwaW5nIGVudGVyXG4gICAgLy8tIGluIGFuIGlucHV0IGZpZWxkLlxuICAgIC8vLSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNTE1MDc4MDZcbiAgICBidXR0b24oXG4gICAgICB2LXNob3c9XCJmYWxzZVwiXG4gICAgICB0eXBlPVwic3VibWl0XCJcbiAgICAgIGRpc2FibGVkXG4gICAgKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCB7IGNsb25lLCBjYXBpdGFsaXplLCBwYXJzZURhdGFQYXRoLCBtZXJnZSB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuaW1wb3J0IFJvdXRlTWl4aW4gZnJvbSAnLi4vbWl4aW5zL1JvdXRlTWl4aW4uanMnXG5pbXBvcnQgUmVzb3VyY2VNaXhpbiBmcm9tICcuLi9taXhpbnMvUmVzb3VyY2VNaXhpbi5qcydcbmltcG9ydCB7IGdldFJlc291cmNlLCBnZXRNZW1iZXJSZXNvdXJjZSB9IGZyb20gJy4uL3V0aWxzL3Jlc291cmNlLmpzJ1xuaW1wb3J0IHsgZ2V0QnV0dG9uU2NoZW1hcywgaXNPYmplY3RTb3VyY2UgfSBmcm9tICcuLi91dGlscy9zY2hlbWEuanMnXG5pbXBvcnQgeyByZXNvbHZlUGF0aCB9IGZyb20gJy4uL3V0aWxzL3BhdGguanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b0Zvcm0nLCB7XG4gIG1peGluczogW1JvdXRlTWl4aW4sIFJlc291cmNlTWl4aW5dLFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNyZWF0ZWREYXRhOiBudWxsLFxuICAgICAgY2xvbmVkRGF0YTogdW5kZWZpbmVkLFxuICAgICAgc291cmNlS2V5OiBudWxsLFxuICAgICAgaXNGb3JtOiB0cnVlXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgdmVyYnMoKSB7XG4gICAgICAvLyBBZGQgc3VibWl0IC8gc3VibWl0dGVkIHRvIHRoZSB2ZXJicyByZXR1cm5lZCBieSBSZXNvdXJjZU1peGluXG4gICAgICAvLyBOT1RFOiBUaGVzZSBnZXQgcGFzc2VkIG9uIHRvIGNoaWxkcmVuIHRocm91Z2g6XG4gICAgICAvLyBgcHJvdmlkZSgpIC4uLiB7ICR2ZXJiczogKCkgPT4gdGhpcy52ZXJicyB9YCBpbiBSZXNvdXJjZU1peGluXG4gICAgICBjb25zdCB2ZXJicyA9IHRoaXMuZ2V0VmVyYnMoKVxuICAgICAgY29uc3QgeyBpc0NyZWF0aW5nLCBwcm92aWRlc0RhdGEgfSA9IHRoaXNcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnZlcmJzLFxuICAgICAgICBzdWJtaXQ6IGlzQ3JlYXRpbmcgPyB2ZXJicy5jcmVhdGUgOiB2ZXJicy5zYXZlLFxuICAgICAgICBzdWJtaXR0ZWQ6IGlzQ3JlYXRpbmcgPyB2ZXJicy5jcmVhdGVkIDogdmVyYnMuc2F2ZWQsXG4gICAgICAgIGNhbmNlbDogcHJvdmlkZXNEYXRhID8gdmVyYnMuY2FuY2VsIDogdmVyYnMuY2xvc2UsXG4gICAgICAgIGNhbmNlbGxlZDogcHJvdmlkZXNEYXRhID8gdmVyYnMuY2FuY2VsbGVkIDogdmVyYnMuY2xvc2VkXG4gICAgICB9XG4gICAgfSxcblxuICAgIHNjaGVtYSgpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRoaXMuZ2V0SXRlbUZvcm1TY2hlbWEoXG4gICAgICAgICAgdGhpcy5zb3VyY2VTY2hlbWEsXG4gICAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gZGF0YSB5ZXQsIHByb3ZpZGUgYW4gZW1wdHkgb2JqZWN0IHdpdGgganVzdCB0aGVcbiAgICAgICAgICAvLyByaWdodCB0eXBlIHNldCwgc28gdGhlIGZvcm0gY2FuIGFsd2F5cyBiZSBkZXRlcm1pbmVkLlxuICAgICAgICAgIHRoaXMuZGF0YSB8fCB7IHR5cGU6IHRoaXMudHlwZSB9LFxuICAgICAgICAgIHRoaXMuY29udGV4dFxuICAgICAgICApIHx8IHt9XG4gICAgICApIC8vIEFsd2F5cyByZXR1cm4gYSBzY2hlbWEgb2JqZWN0IHNvIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgZm9yIGl0LlxuICAgIH0sXG5cbiAgICBidXR0b25TY2hlbWFzKCkge1xuICAgICAgcmV0dXJuIGdldEJ1dHRvblNjaGVtYXMoXG4gICAgICAgIG1lcmdlKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNhbmNlbDoge1xuICAgICAgICAgICAgICB0eXBlOiAnYnV0dG9uJyxcbiAgICAgICAgICAgICAgZXZlbnRzOiB7XG4gICAgICAgICAgICAgICAgY2xpY2s6ICgpID0+IHRoaXMuY2FuY2VsKClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgc3VibWl0OiAhdGhpcy5pc011dGF0aW5nICYmIHtcbiAgICAgICAgICAgICAgdHlwZTogJ3N1Ym1pdCcsXG4gICAgICAgICAgICAgIC8vIFN1Ym1pdCBidXR0b25zIGNsb3NlIHRoZSBmb3JtIGJ5IGRlZmF1bHQ6XG4gICAgICAgICAgICAgIGNsb3NlRm9ybTogdHJ1ZSxcbiAgICAgICAgICAgICAgZXZlbnRzOiB7XG4gICAgICAgICAgICAgICAgY2xpY2s6ICh7IGNvbXBvbmVudDogYnV0dG9uIH0pID0+IGJ1dHRvbi5zdWJtaXQoKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICB0aGlzLnNjaGVtYS5idXR0b25zXG4gICAgICAgIClcbiAgICAgIClcbiAgICB9LFxuXG4gICAgaXNBY3RpdmUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc0xhc3RSb3V0ZSB8fCB0aGlzLmlzTGFzdFVubmVzdGVkUm91dGVcbiAgICB9LFxuXG4gICAgaXNUcmFuc2llbnQoKSB7XG4gICAgICByZXR1cm4gIXRoaXMucHJvdmlkZXNEYXRhXG4gICAgfSxcblxuICAgIGlzQ3JlYXRpbmcoKSB7XG4gICAgICAvLyB0aGlzLnBhcmFtIGlzIGluaGVyaXRlZCBmcm9tIFJvdXRlTWl4aW5cbiAgICAgIHJldHVybiB0aGlzLnBhcmFtID09PSAnY3JlYXRlJ1xuICAgIH0sXG5cbiAgICBpc0RpcnR5KCkge1xuICAgICAgcmV0dXJuICF0aGlzLmlzTXV0YXRpbmcgJiYgISF0aGlzLm1haW5TY2hlbWFDb21wb25lbnQ/LmlzRGlydHlcbiAgICB9LFxuXG4gICAgaXNNdXRhdGluZygpIHtcbiAgICAgIC8vIFdoZW4gYHNvdXJjZVNjaGVtYS5tdXRhdGVgIGlzIHRydWUsIHRoZSBmb3JtIGVkaXRzIHRoZSBpbmhlcml0ZWQgZGF0YVxuICAgICAgLy8gZGlyZWN0bHkgaW5zdGVhZCBvZiBtYWtpbmcgYSBjb3B5IGZvciBwZXJzaXN0ZW5jZSB1cG9uIHN1Ym1pc3Npb24uXG4gICAgICAvLyBTZWUgYGluaGVyaXRlZERhdGEoKWAgY29tcHV0ZWQgcHJvcGVydHkgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgIHJldHVybiAhIXRoaXMuc291cmNlU2NoZW1hLm11dGF0ZVxuICAgIH0sXG5cbiAgICBzZWxlY3RlZFRhYigpIHtcbiAgICAgIHJldHVybiB0aGlzLm1haW5TY2hlbWFDb21wb25lbnQ/LnNlbGVjdGVkVGFiIHx8IG51bGxcbiAgICB9LFxuXG4gICAgdHlwZSgpIHtcbiAgICAgIC8vIFRoZSB0eXBlIG9mIGZvcm0gdG8gY3JlYXRlLCBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgZm9ybXMgdG8gY2hvb3NlIGZyb20uXG4gICAgICByZXR1cm4gdGhpcy4kcm91dGUucXVlcnkudHlwZVxuICAgIH0sXG5cbiAgICBpdGVtSWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc0NyZWF0aW5nXG4gICAgICAgID8gbnVsbFxuICAgICAgICA6IHRoaXMucGFyYW0gPz8gbnVsbFxuICAgIH0sXG5cbiAgICBtZXRob2QoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc0NyZWF0aW5nID8gJ3Bvc3QnIDogJ3BhdGNoJ1xuICAgIH0sXG5cbiAgICByZXNvdXJjZSgpIHtcbiAgICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5nZXRSZXNvdXJjZSgpXG4gICAgICByZXR1cm4gZ2V0TWVtYmVyUmVzb3VyY2UodGhpcy5pdGVtSWQsIHJlc291cmNlKSB8fCByZXNvdXJjZVxuICAgIH0sXG5cbiAgICBicmVhZGNydW1iUHJlZml4KCkge1xuICAgICAgcmV0dXJuIGNhcGl0YWxpemUodGhpcy5pc0NyZWF0aW5nID8gdGhpcy52ZXJicy5jcmVhdGUgOiB0aGlzLnZlcmJzLmVkaXQpXG4gICAgfSxcblxuICAgIGRhdGEoKSB7XG4gICAgICAvLyBSZXR1cm4gZGlmZmVyZW50IGRhdGEgXCJjb250YWluZXJzXCIgYmFzZWQgb24gZGlmZmVyZW50IHNjZW5hcmlvczpcbiAgICAgIC8vIDEuIGNyZWF0ZWREYXRhLCBpZiB3ZSdyZSBpbiBhIGZvcm0gZm9yIGEgbmV3bHkgY3JlYXRlZCBvYmplY3QuXG4gICAgICAvLyAyLiBsb2FkZWREYXRhLCBpZiB0aGUgZm9ybSBpdHNlbGYgaXMgdGhlIHJvb3Qgb2YgdGhlIGRhdGEgKGUuZy4gd2hlblxuICAgICAgLy8gICAgZGlyZWN0bHkgbG9hZGluZyBhbiBlZGl0aW5nIHJvb3QpLlxuICAgICAgLy8gMy4gVGhlIGRhdGEgaW5oZXJpdGVkIGZyb20gdGhlIHBhcmVudCwgd2hpY2ggaXRzZWxmIG1heSBiZSBlaXRoZXIgYVxuICAgICAgLy8gICAgdmlldyB0aGF0IGxvYWRlZCB0aGUgZGF0YSwgb3IgYSBmb3JtIHRoYXQgZWl0aGVyIGxvYWRlZCB0aGUgZGF0YSwgb3JcbiAgICAgIC8vICAgIGFsc28gaW5oZXJpdGVkIGl0IGZyb20gaXRzIHBhcmVudC4gTm90ZSB0aGF0IHdlIHVzZSBhIGNsb25lIG9mIGl0LFxuICAgICAgLy8gICAgc28sIGRhdGEgY2hhbmdlcyBhcmVuJ3QgYXBwbGllZCB1bnRpbCBzZXRTb3VyY2VEYXRhKCkgaXMgY2FsbGVkLlxuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlZERhdGEgfHwgdGhpcy5sb2FkZWREYXRhIHx8IHRoaXMuaW5oZXJpdGVkRGF0YSB8fCBudWxsXG4gICAgfSxcblxuICAgIGRhdGFQYXRoKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0RGF0YVBhdGhGcm9tKHRoaXMuZGF0YUNvbXBvbmVudClcbiAgICB9LFxuXG4gICAgc291cmNlRGF0YSgpIHtcbiAgICAgIC8vIFBvc3NpYmxlIHBhcmVudHMgYXJlIERpdG9Gb3JtIGZvciBmb3Jtcywgb3IgRGl0b1ZpZXcgZm9yIHJvb3QgbGlzdHMuXG4gICAgICAvLyBCb3RoIGhhdmUgYSBkYXRhIHByb3BlcnR5IHdoaWNoIGFic3RyYWN0cyBhd2F5IGxvYWRpbmcgYW5kIGluaGVyaXRpbmdcbiAgICAgIC8vIG9mIGRhdGEuXG4gICAgICAvLyBGb3JtcyB0aGF0IGFyZSBhYm91dCB0byBiZSBkZXN0cm95ZWQgZHVlIHRvIG5hdmlnYXRpb24gbG9vc2UgdGhlaXJcbiAgICAgIC8vIHJvdXRlLXJlY29yZCwgYnV0IG1pZ2h0IHN0aWxsIHRyaWdnZXIgdGhpcyBnZXR0ZXIuIEZpbHRlciB0aG9zZSBvdXQuXG4gICAgICBsZXQgZGF0YSA9IHRoaXMucm91dGVSZWNvcmQgPyB0aGlzLnBhcmVudFJvdXRlQ29tcG9uZW50LmRhdGEgOiBudWxsXG4gICAgICBpZiAoZGF0YSkge1xuICAgICAgICAvLyBIYW5kbGUgbmVzdGVkIGRhdGEgYnkgc3BsaXR0aW5nIHRoZSBkYXRhUGF0aCwgaXRlcmF0ZSB0aHJvdWdoIHRoZVxuICAgICAgICAvLyBhY3R1YWwgZGF0YSBhbmQgbG9vayBuZXN0IGNoaWxkLWRhdGEgdXAuXG4gICAgICAgIGNvbnN0IGRhdGFQYXJ0cyA9IHBhcnNlRGF0YVBhdGgoXG4gICAgICAgICAgdGhpcy5nZXREYXRhUGF0aEZyb20odGhpcy5wYXJlbnRSb3V0ZUNvbXBvbmVudClcbiAgICAgICAgKVxuICAgICAgICAvLyBDb21wYXJlIGRhdGFQYXJ0cyBhZ2FpbnN0IG1hdGNoZWQgcm91dGVQYXRoIHBhcnRzLCB0byBpZGVudGlmeSB0aG9zZVxuICAgICAgICAvLyBwYXJ0cyB0aGF0IG5lZWQgdG8gYmUgdHJlYXRlZCBsaWtlIGlkcyBhbmQgbWFwcGVkIHRvIGluZGljZXMgaW4gZGF0YS5cbiAgICAgICAgY29uc3QgcGF0aFBhcnRzID0gdGhpcy5yb3V0ZVJlY29yZC5wYXRoLnNwbGl0KCcvJylcbiAgICAgICAgY29uc3Qgcm91dGVQYXJ0cyA9IHBhdGhQYXJ0cy5zbGljZShwYXRoUGFydHMubGVuZ3RoIC0gZGF0YVBhcnRzLmxlbmd0aClcbiAgICAgICAgLy8gVE9ETzogRml4IHNpZGUtZWZmZWN0c1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdnVlL25vLXNpZGUtZWZmZWN0cy1pbi1jb21wdXRlZC1wcm9wZXJ0aWVzXG4gICAgICAgIHRoaXMuc291cmNlS2V5ID0gbnVsbFxuICAgICAgICBjb25zdCBsYXN0RGF0YVBhcnQgPSBkYXRhUGFydHNbZGF0YVBhcnRzLmxlbmd0aCAtIDFdXG4gICAgICAgIGlmIChpc09iamVjdFNvdXJjZSh0aGlzLnNvdXJjZVNjaGVtYSkgJiYgbGFzdERhdGFQYXJ0ID09PSAnY3JlYXRlJykge1xuICAgICAgICAgIC8vIElmIHdlIGhhdmUgYW4gb2JqZWN0IHNvdXJjZSBhbmQgYXJlIGNyZWF0aW5nLCB0aGUgZGF0YVBhdGggbmVlZHMgdG9cbiAgICAgICAgICAvLyBiZSBzaG9ydGVuZWQgYnkgdGhlICdjcmVhdGUnIGVudHJ5LiBUaGlzIGlzbid0IG5lZWRlZCBmb3IgbGlzdFxuICAgICAgICAgIC8vIHNvdXJjZXMsIGFzIHRoZXJlIHRoZSBwYXJhbWV0ZXIgaXMgYWN0dWFsbHkgbWFwcGVkIHRvIHRoZSBpdGVtIGlkLlxuICAgICAgICAgIGRhdGFQYXJ0cy5sZW5ndGgtLVxuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gZGF0YVBhcnRzLmxlbmd0aDsgaSA8IGwgJiYgZGF0YTsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgZGF0YVBhcnQgPSBkYXRhUGFydHNbaV1cbiAgICAgICAgICAvLyBJZiB0aGlzIGlzIGFuIDppZCBwYXJ0LCBmaW5kIHRoZSBpbmRleCBvZiB0aGUgaXRlbSB3aXRoIGdpdmVuIGlkLlxuICAgICAgICAgIGNvbnN0IGtleSA9IC9eOmlkLy50ZXN0KHJvdXRlUGFydHNbaV0pXG4gICAgICAgICAgICA/IGRhdGFQYXJ0ID09PSAnY3JlYXRlJ1xuICAgICAgICAgICAgICA/IG51bGwgLy8gVGhlcmUncyBubyBpbmRleCBmb3IgZW50cmllcyBhYm91dCB0byBiZSBjcmVhdGVkXG4gICAgICAgICAgICAgIDogdGhpcy5maW5kSXRlbUlkSW5kZXgodGhpcy5zb3VyY2VTY2hlbWEsIGRhdGEsIGRhdGFQYXJ0KVxuICAgICAgICAgICAgOiBkYXRhUGFydFxuICAgICAgICAgIC8vIFNraXAgdGhlIGZpbmFsIGxvb2t1cCBidXQgcmVtZW1iZXIgYHNvdXJjZUtleWAsIGFzIHdlIHdhbnQgdGhlXG4gICAgICAgICAgLy8gcGFyZW50IGRhdGEgc28gd2UgY2FuIHJlcGxhY2UgdGhlIGVudHJ5IGF0IGBzb3VyY2VLZXlgIG9uIGl0LlxuICAgICAgICAgIGlmIChpID09PSBsIC0gMSkge1xuICAgICAgICAgICAgLy8gVE9ETzogRml4IHNpZGUtZWZmZWN0c1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgICAgICB0aGlzLnNvdXJjZUtleSA9IGtleVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkYXRhID0gZGF0YVtrZXldXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZGF0YVxuICAgIH0sXG5cbiAgICBpbmhlcml0ZWREYXRhKCkge1xuICAgICAgLy8gRGF0YSBpbmhlcml0ZWQgZnJvbSBwYXJlbnQsIGFuZCBjbG9uZWQgdG8gcHJvdGVjdCBhZ2FpbnN0IHJlYWN0aXZlXG4gICAgICAvLyBjaGFuZ2VzIHVudGlsIGNoYW5nZXMgYXJlIGFwcGxpZWQgdGhyb3VnaCBzZXRTb3VyY2VEYXRhKCksIHVubGVzc1xuICAgICAgLy8gYHNvdXJjZVNjaGVtYS5tdXRhdGVgIGlzIHRydWUsIGluIHdoaWNoIGNhc2UgZGF0YSBpcyBtdXRhdGVkIGRpcmVjdGx5LlxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLmlzVHJhbnNpZW50ICYmXG4gICAgICAgIHRoaXMuY2xvbmVkRGF0YSA9PT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHRoaXMuc291cmNlRGF0YSAmJlxuICAgICAgICB0aGlzLnNvdXJjZUtleSAhPT0gbnVsbFxuICAgICAgKSB7XG4gICAgICAgIGxldCBkYXRhID0gdGhpcy5zb3VyY2VEYXRhW3RoaXMuc291cmNlS2V5XVxuICAgICAgICBpZiAoIXRoaXMuaXNNdXRhdGluZykge1xuICAgICAgICAgIC8vIFVzZSBhIHRyaWNrIHRvIHN0b3JlIGNsb25lZCBpbmhlcml0ZWQgZGF0YSBpbiBjbG9uZWREYXRhLCB0byBtYWtlXG4gICAgICAgICAgLy8gaXQgcmVhY3RpdmUgYW5kIHByZXZlbnQgaXQgZnJvbSBiZWluZyBjbG9uZWQgbXVsdGlwbGUgdGltZXMuXG4gICAgICAgICAgLy8gVE9ETzogRml4IHNpZGUtZWZmZWN0c1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB2dWUvbm8tc2lkZS1lZmZlY3RzLWluLWNvbXB1dGVkLXByb3BlcnRpZXNcbiAgICAgICAgICB0aGlzLmNsb25lZERhdGEgPSBkYXRhID0gY2xvbmUoZGF0YSlcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgZGF0YSA9PT0gbnVsbCAmJlxuICAgICAgICAgICF0aGlzLmlzQ3JlYXRpbmcgJiZcbiAgICAgICAgICBpc09iamVjdFNvdXJjZSh0aGlzLnNvdXJjZVNjaGVtYSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gSWYgZGF0YSBvZiBhbiBvYmplY3Qgc291cmNlIGlzIG51bGwsIHJlZGlyZWN0IHRvIGl0cyBjcmVhdGUgcm91dGUuXG4gICAgICAgICAgLy8gVE9ETzogRml4IHNpZGUtZWZmZWN0c1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB2dWUvbm8tc2lkZS1lZmZlY3RzLWluLWNvbXB1dGVkLXByb3BlcnRpZXNcbiAgICAgICAgICB0aGlzLiRyb3V0ZXIucHVzaCh7IHBhdGg6IGAke3RoaXMucGF0aH0vY3JlYXRlYCB9KVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhXG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5jbG9uZWREYXRhXG4gICAgfSxcblxuICAgIC8vIEBvdmVycmlkZSBSZXNvdXJjZU1peGluLmhhc0RhdGEoKVxuICAgIGhhc0RhdGEoKSB7XG4gICAgICByZXR1cm4gISF0aGlzLmRhdGFcbiAgICB9LFxuXG4gICAgaXRlbUxhYmVsKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0SXRlbUxhYmVsKHRoaXMuc291cmNlU2NoZW1hLCB0aGlzLmRhdGEsIHsgZXh0ZW5kZWQ6IHRydWUgfSlcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBzb3VyY2VEYXRhOiAnY2xlYXJDbG9uZWREYXRhJyxcbiAgICAvLyBOZWVkZWQgZm9yIHRoZSAnY3JlYXRlJyByZWRpcmVjdCBpbiBgaW5oZXJpdGVkRGF0YSgpYCB0byB3b3JrOlxuICAgIGNyZWF0ZTogJ3NldHVwRGF0YSdcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZW1pdFNjaGVtYUV2ZW50KGV2ZW50LCBwYXJhbXMpIHtcbiAgICAgIHJldHVybiB0aGlzLm1haW5TY2hlbWFDb21wb25lbnQuZW1pdEV2ZW50KGV2ZW50LCBwYXJhbXMpXG4gICAgfSxcblxuICAgIGdldERhdGFQYXRoRnJvbShyb3V0ZSkge1xuICAgICAgLy8gR2V0IHRoZSBkYXRhIHBhdGggYnkgZGVub3JtYWxpemVQYXRoIHRoZSByZWxhdGl2ZSByb3V0ZSBwYXRoXG4gICAgICByZXR1cm4gdGhpcy5hcGkuZGVub3JtYWxpemVQYXRoKFxuICAgICAgICB0aGlzLnBhdGhcbiAgICAgICAgICAvLyBEaXRvVmlld3MgaGF2ZSBuZXN0ZWQgcm91dGVzLCBzbyBkb24ndCByZW1vdmUgdGhlaXIgcGF0aC5cbiAgICAgICAgICAuc2xpY2UoKHJvdXRlLmlzVmlldyA/IDAgOiByb3V0ZS5wYXRoLmxlbmd0aCkgKyAxKVxuICAgICAgKVxuICAgIH0sXG5cbiAgICAvLyBAb3ZlcnJpZGUgUmVzb3VyY2VNaXhpbi5zZXR1cERhdGEoKVxuICAgIHNldHVwRGF0YSgpIHtcbiAgICAgIGlmICh0aGlzLmlzQ3JlYXRpbmcpIHtcbiAgICAgICAgdGhpcy5jcmVhdGVkRGF0YSB8fD0gdGhpcy5jcmVhdGVEYXRhKHRoaXMuc2NoZW1hLCB0aGlzLnR5cGUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmVuc3VyZURhdGEoKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzZXRTb3VyY2VEYXRhKGRhdGEpIHtcbiAgICAgIGlmICh0aGlzLnNvdXJjZURhdGEgJiYgdGhpcy5zb3VyY2VLZXkgIT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgeyBtYWluU2NoZW1hQ29tcG9uZW50IH0gPSB0aGlzXG4gICAgICAgIHRoaXMuc291cmNlRGF0YVt0aGlzLnNvdXJjZUtleV0gPSBtYWluU2NoZW1hQ29tcG9uZW50LmZpbHRlckRhdGEoZGF0YSlcbiAgICAgICAgbWFpblNjaGVtYUNvbXBvbmVudC5vbkNoYW5nZSgpXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9LFxuXG4gICAgYWRkU291cmNlRGF0YShkYXRhKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RTb3VyY2UodGhpcy5zb3VyY2VTY2hlbWEpXG4gICAgICAgID8gdGhpcy5zZXRTb3VyY2VEYXRhKGRhdGEpXG4gICAgICAgIDogISF0aGlzLnNvdXJjZURhdGE/LnB1c2goZGF0YSlcbiAgICB9LFxuXG4gICAgLy8gQG92ZXJyaWRlIFJlc291cmNlTWl4aW4uY2xlYXJEYXRhKClcbiAgICBjbGVhckRhdGEoKSB7XG4gICAgICB0aGlzLnNldERhdGEobnVsbClcbiAgICB9LFxuXG4gICAgLy8gQG92ZXJyaWRlIFJlc291cmNlTWl4aW4uc2V0RGF0YSgpXG4gICAgc2V0RGF0YShkYXRhKSB7XG4gICAgICAvLyBzZXREYXRhKCkgaXMgY2FsbGVkIGFmdGVyIHN1Ym1pdCB3aGVuIGRhdGEgaGFzIGNoYW5nZWQuXG4gICAgICBpZiAodGhpcy5pc1RyYW5zaWVudCkge1xuICAgICAgICAvLyBGb3IgY29tcG9uZW50cyB3aXRoIHRyYW5zaWVudCBkYXRhLCBtb2RpZnkgdGhpcy5zb3VyY2VEYXRhLlxuICAgICAgICB0aGlzLnNldFNvdXJjZURhdGEoZGF0YSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY3JlYXRlZERhdGEgPSBudWxsXG4gICAgICAgIHRoaXMubG9hZGVkRGF0YSA9IGRhdGFcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY2xlYXJDbG9uZWREYXRhKHRvLCBmcm9tKSB7XG4gICAgICAvLyBPbmx5IGNsZWFyIGlmIHRoZSB3YXRjaGVkIHNvdXJjZURhdGEgaXRzZWxmIGNoYW5nZXMgaW4gdGhlIGZvcm0uXG4gICAgICBpZiAodG8gIT09IGZyb20pIHtcbiAgICAgICAgdGhpcy5jbG9uZWREYXRhID0gdW5kZWZpbmVkXG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIGNhbmNlbCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmNsb3NlKClcbiAgICB9LFxuXG4gICAgYXN5bmMgY2xvc2UoKSB7XG4gICAgICByZXR1cm4gdGhpcy5uYXZpZ2F0ZSh0aGlzLnBhcmVudFJvdXRlQ29tcG9uZW50LnBhdGgpXG4gICAgfSxcblxuICAgIGdldFN1Ym1pdFZlcmIocHJlc2VudCA9IHRydWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzQ3JlYXRpbmdcbiAgICAgICAgPyBwcmVzZW50XG4gICAgICAgICAgPyAnY3JlYXRlJ1xuICAgICAgICAgIDogJ2NyZWF0ZWQnXG4gICAgICAgIDogcHJlc2VudFxuICAgICAgICAgID8gJ3N1Ym1pdCdcbiAgICAgICAgICA6ICdzdWJtaXR0ZWQnXG4gICAgfSxcblxuICAgIGFzeW5jIHN1Ym1pdChidXR0b24sIHsgdmFsaWRhdGUgPSB0cnVlLCBjbG9zZUZvcm0gPSBmYWxzZSB9ID0ge30pIHtcbiAgICAgIGlmICh2YWxpZGF0ZSAmJiAhdGhpcy52YWxpZGF0ZUFsbCgpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBnZXRWZXJiID0gcHJlc2VudCA9PiB0aGlzLnZlcmJzW3RoaXMuZ2V0U3VibWl0VmVyYihwcmVzZW50KV1cblxuICAgICAgLy8gQWxsb3cgYnV0dG9ucyB0byBvdmVycmlkZSBib3RoIG1ldGhvZCBhbmQgcmVzb3VyY2UgcGF0aCB0byBzdWJtaXQgdG86XG4gICAgICBjb25zdCBidXR0b25SZXNvdXJjZSA9IGdldFJlc291cmNlKGJ1dHRvbi5zY2hlbWEucmVzb3VyY2UsIHtcbiAgICAgICAgcGFyZW50OiB0aGlzLnJlc291cmNlXG4gICAgICB9KVxuICAgICAgY29uc3QgcmVzb3VyY2UgPSBidXR0b25SZXNvdXJjZSB8fCB0aGlzLnJlc291cmNlXG4gICAgICBjb25zdCBtZXRob2QgPSByZXNvdXJjZT8ubWV0aG9kIHx8IHRoaXMubWV0aG9kXG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5nZXRQYXlsb2FkRGF0YShidXR0b24sIG1ldGhvZClcbiAgICAgIGxldCBzdWNjZXNzXG4gICAgICBpZiAoIWJ1dHRvblJlc291cmNlICYmIHRoaXMuaXNUcmFuc2llbnQpIHtcbiAgICAgICAgc3VjY2VzcyA9IGF3YWl0IHRoaXMuc3VibWl0VHJhbnNpZW50KGJ1dHRvbiwgcmVzb3VyY2UsIG1ldGhvZCwgZGF0YSwge1xuICAgICAgICAgIG9uU3VjY2VzczogKCkgPT4gdGhpcy5lbWl0U2NoZW1hRXZlbnQodGhpcy5nZXRTdWJtaXRWZXJiKCkpLFxuICAgICAgICAgIG9uRXJyb3I6IGVycm9yID0+XG4gICAgICAgICAgICB0aGlzLmVtaXRTY2hlbWFFdmVudCgnZXJyb3InLCB7XG4gICAgICAgICAgICAgIGNvbnRleHQ6IHsgZXJyb3IgfVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgbm90aWZ5U3VjY2VzczogKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmVyYiA9IGdldFZlcmIoZmFsc2UpXG4gICAgICAgICAgICB0aGlzLm5vdGlmeSh7XG4gICAgICAgICAgICAgIHR5cGU6ICdpbmZvJyxcbiAgICAgICAgICAgICAgdGl0bGU6IHRoaXMuaXNDcmVhdGluZ1xuICAgICAgICAgICAgICAgID8gYEl0ZW0gJHtjYXBpdGFsaXplKHZlcmIpfWBcbiAgICAgICAgICAgICAgICA6IGBDaGFuZ2UgJHtjYXBpdGFsaXplKHZlcmIpfWAsXG4gICAgICAgICAgICAgIHRleHQ6IFtcbiAgICAgICAgICAgICAgICB0aGlzLmlzQ3JlYXRpbmdcbiAgICAgICAgICAgICAgICAgID8gYCR7dGhpcy5pdGVtTGFiZWx9IHdhcyAke3ZlcmJ9LmBcbiAgICAgICAgICAgICAgICAgIDogYENoYW5nZXMgdG8gJHt0aGlzLml0ZW1MYWJlbH0gd2VyZSAke3ZlcmJ9LmAsXG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2llbnROb3RlXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSxcbiAgICAgICAgICBub3RpZnlFcnJvcjogKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmVyYiA9IGdldFZlcmIodHJ1ZSlcbiAgICAgICAgICAgIHRoaXMubm90aWZ5KHtcbiAgICAgICAgICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgdGl0bGU6ICdSZXF1ZXN0IEVycm9yJyxcbiAgICAgICAgICAgICAgdGV4dDogYFVuYWJsZSB0byAke3ZlcmJ9ICR7dGhpcy5pdGVtTGFiZWx9LmBcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3VjY2VzcyA9IGF3YWl0IHRoaXMuc3VibWl0UmVzb3VyY2UoYnV0dG9uLCByZXNvdXJjZSwgbWV0aG9kLCBkYXRhLCB7XG4gICAgICAgICAgc2V0RGF0YTogdHJ1ZSxcbiAgICAgICAgICBvblN1Y2Nlc3M6ICgpID0+IHRoaXMuZW1pdFNjaGVtYUV2ZW50KHRoaXMuZ2V0U3VibWl0VmVyYigpKSxcbiAgICAgICAgICBvbkVycm9yOiBlcnJvciA9PlxuICAgICAgICAgICAgdGhpcy5lbWl0U2NoZW1hRXZlbnQoJ2Vycm9yJywge1xuICAgICAgICAgICAgICBjb250ZXh0OiB7IGVycm9yIH1cbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIG5vdGlmeVN1Y2Nlc3M6ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZlcmIgPSBnZXRWZXJiKGZhbHNlKVxuICAgICAgICAgICAgdGhpcy5ub3RpZnkoe1xuICAgICAgICAgICAgICB0eXBlOiAnc3VjY2VzcycsXG4gICAgICAgICAgICAgIHRpdGxlOiBgU3VjY2Vzc2Z1bGx5ICR7Y2FwaXRhbGl6ZSh2ZXJiKX1gLFxuICAgICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLml0ZW1MYWJlbH0gd2FzICR7dmVyYn0uYFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9LFxuICAgICAgICAgIG5vdGlmeUVycm9yOiBlcnJvciA9PiB7XG4gICAgICAgICAgICBjb25zdCB2ZXJiID0gZ2V0VmVyYih0cnVlKVxuICAgICAgICAgICAgdGhpcy5ub3RpZnkoe1xuICAgICAgICAgICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgICAgICAgICB0aXRsZTogJ1JlcXVlc3QgRXJyb3InLFxuICAgICAgICAgICAgICB0ZXh0OiBbXG4gICAgICAgICAgICAgICAgYFVuYWJsZSB0byAke3ZlcmJ9ICR7dGhpcy5pdGVtTGFiZWx9JHtlcnJvciA/ICc6JyA6ICcnfWAsXG4gICAgICAgICAgICAgICAgZXJyb3I/Lm1lc3NhZ2UgfHwgZXJyb3JcbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICB0aGlzLnJlc2V0VmFsaWRhdGlvbigpXG4gICAgICAgIGlmIChjbG9zZUZvcm0gfHwgYnV0dG9uLmNsb3NlRm9ybSkge1xuICAgICAgICAgIHRoaXMuY2xvc2UoKVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNDcmVhdGluZykge1xuICAgICAgICAgIC8vIFJlZGlyZWN0IHRvIHRoZSBmb3JtIGVkaXRpbmcgdGhlIG5ld2x5IGNyZWF0ZWQgaXRlbTpcbiAgICAgICAgICBjb25zdCBpZCA9IHRoaXMuZ2V0SXRlbUlkKHRoaXMuc2NoZW1hLCB0aGlzLmRhdGEpXG4gICAgICAgICAgdGhpcy4kcm91dGVyLnJlcGxhY2UoeyBwYXRoOiByZXNvbHZlUGF0aChgJHt0aGlzLnBhdGh9Ly4uLyR7aWR9YCkgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHN1Y2Nlc3NcbiAgICB9LFxuXG4gICAgYXN5bmMgc3VibWl0VHJhbnNpZW50KGJ1dHRvbiwgX3Jlc291cmNlLCBfbWV0aG9kLCBkYXRhLCB7XG4gICAgICBvblN1Y2Nlc3MsXG4gICAgICBvbkVycm9yLFxuICAgICAgbm90aWZ5U3VjY2VzcyxcbiAgICAgIG5vdGlmeUVycm9yXG4gICAgfSkge1xuICAgICAgLy8gSGFuZGxlIHRoZSBkZWZhdWx0IFwic3VibWl0dGluZ1wiIG9mIHRyYW5zaWVudCwgbmVzdGVkIGRhdGE6XG4gICAgICBjb25zdCBzdWNjZXNzID0gdGhpcy5pc0NyZWF0aW5nXG4gICAgICAgID8gdGhpcy5hZGRTb3VyY2VEYXRhKGRhdGEpXG4gICAgICAgIDogdGhpcy5zZXRTb3VyY2VEYXRhKGRhdGEpXG4gICAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICBvblN1Y2Nlc3M/LigpXG4gICAgICAgIGF3YWl0IHRoaXMuZW1pdEJ1dHRvbkV2ZW50KGJ1dHRvbiwgJ3N1Y2Nlc3MnLCB7XG4gICAgICAgICAgbm90aWZ5OiBub3RpZnlTdWNjZXNzXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBlcnJvciA9ICdDb3VsZCBub3Qgc3VibWl0IHRyYW5zaWVudCBpdGVtJ1xuICAgICAgICBvbkVycm9yPy4oZXJyb3IpXG4gICAgICAgIGF3YWl0IHRoaXMuZW1pdEJ1dHRvbkV2ZW50KGJ1dHRvbiwgJ2Vycm9yJywge1xuICAgICAgICAgIG5vdGlmeTogbm90aWZ5RXJyb3IsXG4gICAgICAgICAgZXJyb3JcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdWNjZXNzXG4gICAgfVxuICB9XG59KVxuPC9zY3JpcHQ+XG4iLCI8c2NyaXB0PlxuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCBEaXRvRm9ybSBmcm9tICcuL0RpdG9Gb3JtLnZ1ZSdcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvRm9ybU5lc3RlZCcsIHtcbiAgZXh0ZW5kczogRGl0b0Zvcm1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG4uZGl0by1mb3JtLW5lc3RlZCB7XG4gICYsXG4gIC5kaXRvLXNjcm9sbCB7XG4gICAgLy8gTm8gc2Nyb2xsaW5nIGluc2lkZSBuZXN0ZWQgZm9ybXMsIGFuZCBwcmV2ZW50IG9wZW4gLm11bHRpc2VsZWN0IGZyb21cbiAgICAvLyBiZWluZyBjcm9wcGVkLlxuICAgIG92ZXJmbG93OiB2aXNpYmxlO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLWVycm9ycyhcbiAgdi1pZj1cImVycm9yc1wiXG4pXG4gIHVsXG4gICAgbGkoXG4gICAgICB2LWZvcj1cImVycm9yIG9mIGVycm9yc1wiXG4gICAgKVxuICAgICAgfCB7eyBlcnJvciB9fVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b0Vycm9ycycsIHtcbiAgcHJvcHM6IHtcbiAgICBlcnJvcnM6IHsgdHlwZTogQXJyYXksIGRlZmF1bHQ6IG51bGwgfVxuICB9XG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tZXJyb3JzIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAxO1xuXG4gIHVsIHtcbiAgICBtYXJnaW4tdG9wOiAxcHg7XG4gICAgY29sb3I6ICRjb2xvci1lcnJvcjtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1zY29wZXNcbiAgUm91dGVyTGluayhcbiAgICB2LWZvcj1cIihzY29wZSwga2V5KSBpbiBzY29wZXNcIlxuICAgIDprZXk9XCJrZXlcIlxuICAgIHYtc2xvdD1cInsgbmF2aWdhdGUgfVwiXG4gICAgOnRvPVwiZ2V0U2NvcGVMaW5rKHNjb3BlKVwiXG4gICAgY3VzdG9tXG4gIClcbiAgICBidXR0b24uZGl0by1idXR0b24oXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIDpjbGFzcz1cInsgJ2RpdG8tc2VsZWN0ZWQnOiBzY29wZS5uYW1lID09PSBxdWVyeS5zY29wZSB9XCJcbiAgICAgIDp0aXRsZT1cInNjb3BlLmhpbnQgfHwgZ2V0TGFiZWwoc2NvcGUpXCJcbiAgICAgIEBjbGljaz1cIm5hdmlnYXRlXCJcbiAgICApIHt7IGdldExhYmVsKHNjb3BlKSB9fVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b1Njb3BlcycsIHtcbiAgcHJvcHM6IHtcbiAgICBxdWVyeTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgc2NvcGVzOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBnZXRTY29wZUxpbmsoc2NvcGUpIHtcbiAgICAgIGNvbnN0IHF1ZXJ5ID0geyAuLi50aGlzLnF1ZXJ5LCBzY29wZTogc2NvcGUubmFtZSB9XG4gICAgICBpZiAocXVlcnkucGFnZSkge1xuICAgICAgICBxdWVyeS5wYWdlID0gMFxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuZ2V0UXVlcnlMaW5rKHF1ZXJ5KVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXNjb3BlcyB7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIGRpc3BsYXk6IGZsZXg7XG5cbiAgLmRpdG8tYnV0dG9uIHtcbiAgICBAaW5jbHVkZSBlbGxpcHNpcztcblxuICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gICAgLy8gQSBiaXQgbW9yZSB0aGFuIHRoZSB3aWR0aCBvZiBlbGxpcHNpcywgdG8gcHJldmVudCByZXBsYWNpbmcgc2hvcnQgd29yZHNcbiAgICAvLyB3aXRoIGVsbGlwc2lzLlxuICAgIG1pbi13aWR0aDogM2VtO1xuICAgIGZsZXg6IDAgMSBhdXRvO1xuXG4gICAgJjpmaXJzdC1jaGlsZCB7XG4gICAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAxZW07XG4gICAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAxZW07XG4gICAgICBwYWRkaW5nLWxlZnQ6IDFlbTtcbiAgICB9XG5cbiAgICAmOmxhc3QtY2hpbGQge1xuICAgICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDFlbTtcbiAgICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAxZW07XG4gICAgICBwYWRkaW5nLXJpZ2h0OiAxZW07XG4gICAgfVxuXG4gICAgJiArIC5kaXRvLWJ1dHRvbiB7XG4gICAgICBtYXJnaW4tbGVmdDogLTFweDtcbiAgICB9IC8vIERvbid0IGNvdmVyIHRoZSBmb2N1c2VkIGJvcmRlciBvZiBidXR0b25zOlxuICAgICY6Zm9jdXMge1xuICAgICAgei1pbmRleDogMTtcbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuUGFnaW5hdGlvbihcbiAgdi1tb2RlbDpwYWdlPVwicGFnZVwiXG4gIDpwYWdlU2l6ZT1cImxpbWl0XCJcbiAgOnRvdGFsPVwidG90YWxcIlxuKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCB7IFBhZ2luYXRpb24gfSBmcm9tICdAZGl0b2pzL3VpL3NyYydcbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b1BhZ2luYXRpb24nLCB7XG4gIGNvbXBvbmVudHM6IHsgUGFnaW5hdGlvbiB9LFxuXG4gIHByb3BzOiB7XG4gICAgcXVlcnk6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGxpbWl0OiB7IHR5cGU6IE51bWJlciwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICB0b3RhbDogeyB0eXBlOiBOdW1iZXIsIHJlcXVpcmVkOiB0cnVlIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIHBhZ2U6IHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuICgrdGhpcy5xdWVyeS5wYWdlIHx8IDApICsgMVxuICAgICAgfSxcblxuICAgICAgc2V0KHBhZ2UpIHtcbiAgICAgICAgaWYgKHRoaXMucGFnZSAhPT0gcGFnZSkge1xuICAgICAgICAgIHRoaXMuJHJvdXRlci5wdXNoKFxuICAgICAgICAgICAgdGhpcy5nZXRRdWVyeUxpbmsoe1xuICAgICAgICAgICAgICAuLi50aGlzLnF1ZXJ5LFxuICAgICAgICAgICAgICBwYWdlOiBwYWdlIC0gMVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cbiIsImltcG9ydCBJdGVtTWl4aW4gZnJvbSAnLi9JdGVtTWl4aW4uanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCB7XG4gIG1peGluczogW0l0ZW1NaXhpbl0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZHJhZ2dpbmc6IGZhbHNlXG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBnZXRTb3J0YWJsZU9wdGlvbnMoZm9yY2VGYWxsYmFjayA9IGZhbHNlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhbmltYXRpb246IDE1MCxcbiAgICAgICAgaGFuZGxlOiAnLmRpdG8tYnV0dG9uLWRyYWcnLFxuICAgICAgICBkcmFnQ2xhc3M6ICdkaXRvLXNvcnRhYmxlLWFjdGl2ZScsXG4gICAgICAgIGNob3NlbkNsYXNzOiAnZGl0by1zb3J0YWJsZS1jaG9zZW4nLFxuICAgICAgICBnaG9zdENsYXNzOiAnZGl0by1zb3J0YWJsZS1naG9zdCcsXG4gICAgICAgIGZhbGxiYWNrQ2xhc3M6ICdkaXRvLXNvcnRhYmxlLWZhbGxiYWNrJyxcbiAgICAgICAgZm9yY2VGYWxsYmFjayxcbiAgICAgICAgb25TdGFydDogdGhpcy5vblN0YXJ0RHJhZyxcbiAgICAgICAgb25FbmQ6IHRoaXMub25FbmREcmFnXG4gICAgICB9XG4gICAgfSxcblxuICAgIG9uU3RhcnREcmFnKCkge1xuICAgICAgdGhpcy5kcmFnZ2luZyA9IHRydWVcbiAgICB9LFxuXG4gICAgb25FbmREcmFnKHsgb2xkSW5kZXgsIG5ld0luZGV4IH0pIHtcbiAgICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZVxuICAgICAgaWYgKG9sZEluZGV4ICE9PSBuZXdJbmRleCkge1xuICAgICAgICB0aGlzLm9uQ2hhbmdlKClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgdXBkYXRlT3JkZXIoc291cmNlU2NoZW1hLCBsaXN0LCBwYWdpbmF0aW9uUmFuZ2UpIHtcbiAgICAgIGNvbnN0IHsgb3JkZXJLZXkgfSA9IHNvdXJjZVNjaGVtYVxuICAgICAgaWYgKG9yZGVyS2V5KSB7XG4gICAgICAgIC8vIFJlb3JkZXIgdGhlIGNoYW5nZWQgZW50cmllcyBieSB0aGVpciBvcmRlciBrZXksIHRha2luZyBwYWdpbmF0aW9uXG4gICAgICAgIC8vIG9mZnNldHMgaW50byBhY2NvdW50OlxuICAgICAgICBjb25zdCBvZmZzZXQgPSBwYWdpbmF0aW9uUmFuZ2U/LlswXSB8fCAwXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGxpc3RbaV1bb3JkZXJLZXldID0gaSArIG9mZnNldFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbGlzdFxuICAgIH1cbiAgfVxufVxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLXRyZWUtaXRlbShcbiAgOmlkPVwiZGF0YVBhdGhcIlxuICA6Y2xhc3M9YHtcbiAgICAnZGl0by1kcmFnZ2luZyc6IGRyYWdnaW5nLFxuICAgICdkaXRvLWFjdGl2ZSc6IGFjdGl2ZVxuICB9YFxuICA6c3R5bGU9XCJsZXZlbCA+IDAgJiYgeyAnLS1sZXZlbCc6IGxldmVsIH1cIlxuKVxuICAuZGl0by10cmVlLWhlYWRlcihcbiAgICB2LWlmPVwibGFiZWxcIlxuICApXG4gICAgLmRpdG8tdHJlZS1icmFuY2goXG4gICAgICB2LWlmPVwibnVtRW50cmllc1wiXG4gICAgICBAY2xpY2suc3RvcD1cIm9wZW5lZCA9ICFvcGVuZWRcIlxuICAgIClcbiAgICAgIC5kaXRvLWNoZXZyb24oXG4gICAgICAgIHYtaWY9XCJudW1FbnRyaWVzXCJcbiAgICAgICAgOmNsYXNzPVwieyAnZGl0by1vcGVuZWQnOiBvcGVuZWQgfVwiXG4gICAgICApXG4gICAgICAuZGl0by10cmVlLWxhYmVsKFxuICAgICAgICB2LWh0bWw9XCJsYWJlbFwiXG4gICAgICApXG4gICAgICAuZGl0by10cmVlLWluZm8oXG4gICAgICAgIHYtaWY9XCJkZXRhaWxzXCJcbiAgICAgICkge3sgZGV0YWlscyB9fVxuICAgIC5kaXRvLXRyZWUtbGVhZihcbiAgICAgIHYtZWxzZVxuICAgIClcbiAgICAgIC5kaXRvLXRyZWUtbGFiZWwoXG4gICAgICAgIHYtaHRtbD1cImxhYmVsXCJcbiAgICAgIClcbiAgICAuZGl0by1idXR0b25zLmRpdG8tYnV0dG9ucy1zbWFsbChcbiAgICAgIHYtaWY9XCJoYXNFZGl0QnV0dG9uc1wiXG4gICAgKVxuICAgICAgLy8tIEZpcmVmb3ggZG9lc24ndCBsaWtlIDxidXR0b24+IGhlcmUsIHNvIHVzZSA8YT4gaW5zdGVhZDpcbiAgICAgIGEuZGl0by1idXR0b24oXG4gICAgICAgIHYtaWY9XCJkcmFnZ2FibGVcIlxuICAgICAgICB2LWJpbmQ9XCJnZXRCdXR0b25BdHRyaWJ1dGVzKHZlcmJzLmRyYWcpXCJcbiAgICAgIClcbiAgICAgIGJ1dHRvbi5kaXRvLWJ1dHRvbihcbiAgICAgICAgdi1pZj1cImVkaXRhYmxlXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIHYtYmluZD1cImdldEJ1dHRvbkF0dHJpYnV0ZXModmVyYnMuZWRpdClcIlxuICAgICAgICBAY2xpY2s9XCJvbkVkaXRcIlxuICAgICAgKVxuICAgICAgYnV0dG9uLmRpdG8tYnV0dG9uKFxuICAgICAgICB2LWlmPVwiZGVsZXRhYmxlXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIHYtYmluZD1cImdldEJ1dHRvbkF0dHJpYnV0ZXModmVyYnMuZGVsZXRlKVwiXG4gICAgICAgIEBjbGljaz1cIm9uRGVsZXRlXCJcbiAgICAgIClcbiAgdGFibGUuZGl0by1wcm9wZXJ0aWVzKFxuICAgIHYtaWY9XCJwcm9wZXJ0aWVzXCJcbiAgICB2LXNob3c9XCJvcGVuZWRcIlxuICApXG4gICAgdHIoXG4gICAgICB2LWZvcj1cInByb3BlcnR5IGluIHByb3BlcnRpZXNcIlxuICAgIClcbiAgICAgIHRkXG4gICAgICAgIERpdG9MYWJlbChcbiAgICAgICAgICB2LWlmPVwicHJvcGVydHkubGFiZWwgIT09IGZhbHNlXCJcbiAgICAgICAgICA6ZGF0YVBhdGg9XCJnZXRQcm9wZXJ0eURhdGFQYXRoKHByb3BlcnR5KVwiXG4gICAgICAgICAgOmxhYmVsPVwiZ2V0TGFiZWwocHJvcGVydHkpXCJcbiAgICAgICAgKVxuICAgICAgRGl0b1RhYmxlQ2VsbChcbiAgICAgICAgOmNlbGw9XCJwcm9wZXJ0eVwiXG4gICAgICAgIDpzY2hlbWE9XCJwcm9wZXJ0eVwiXG4gICAgICAgIDpkYXRhUGF0aD1cImdldFByb3BlcnR5RGF0YVBhdGgocHJvcGVydHkpXCJcbiAgICAgICAgOmRhdGE9XCJkYXRhXCJcbiAgICAgICAgOm1ldGE9XCJuZXN0ZWRNZXRhXCJcbiAgICAgICAgOnN0b3JlPVwic3RvcmVcIlxuICAgICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gICAgICApXG4gIERpdG9EcmFnZ2FibGUoXG4gICAgdi1pZj1cImNoaWxkcmVuU2NoZW1hXCJcbiAgICB2LXNob3c9XCJvcGVuZWRcIlxuICAgIDptb2RlbFZhbHVlPVwidXBkYXRlT3JkZXIoY2hpbGRyZW5TY2hlbWEsIGNoaWxkcmVuTGlzdClcIlxuICAgIDpvcHRpb25zPVwiZ2V0U29ydGFibGVPcHRpb25zKHRydWUpXCJcbiAgICA6ZHJhZ2dhYmxlPVwiY2hpbGRyZW5EcmFnZ2FibGVcIlxuICAgIEB1cGRhdGU6bW9kZWxWYWx1ZT1cInZhbHVlID0+IChjaGlsZHJlbkxpc3QgPSB2YWx1ZSlcIlxuICApXG4gICAgRGl0b1RyZWVJdGVtKFxuICAgICAgdi1mb3I9XCIoaXRlbSwgaW5kZXgpIGluIGNoaWxkcmVuSXRlbXNcIlxuICAgICAgOmtleT1cImdldEl0ZW1VaWQoY2hpbGRyZW5TY2hlbWEsIGl0ZW0uZGF0YSlcIlxuICAgICAgOnNjaGVtYT1cImNoaWxkcmVuU2NoZW1hXCJcbiAgICAgIDpkYXRhUGF0aD1cImdldEl0ZW1EYXRhUGF0aChjaGlsZHJlblNjaGVtYSwgaW5kZXgpXCJcbiAgICAgIDpkYXRhPVwiaXRlbS5kYXRhXCJcbiAgICAgIDpwYXRoPVwiaXRlbS5wYXRoXCJcbiAgICAgIDpvcGVuPVwiaXRlbS5vcGVuXCJcbiAgICAgIDphY3RpdmU9XCJpdGVtLmFjdGl2ZVwiXG4gICAgICA6ZHJhZ2dhYmxlPVwiY2hpbGRyZW5EcmFnZ2FibGVcIlxuICAgICAgOmxhYmVsPVwiZ2V0SXRlbUxhYmVsKGNoaWxkcmVuU2NoZW1hLCBpdGVtLmRhdGEsIHsgaW5kZXggfSlcIlxuICAgICAgOmxldmVsPVwibGV2ZWwgKyAxXCJcbiAgICApXG4gICAgLy8tIFRPRE86IENvbnZlcnQgZGl0by10cmVlLWl0ZW0gdG8gdXNlIGRpdG8tbGFiZWwgaW50ZXJuYWxseSwgYW5kIHRoZW5cbiAgICAvLy0gcGFzcyBgYXNPYmplY3Q6IHRydWVgIGluIHRoZSBgZ2V0SXRlbUxhYmVsKClgIGNhbGwgYWJvdmUuXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCBTb3J0YWJsZU1peGluIGZyb20gJy4uL21peGlucy9Tb3J0YWJsZU1peGluLmpzJ1xuaW1wb3J0IHsgYXBwZW5kRGF0YVBhdGggfSBmcm9tICcuLi91dGlscy9kYXRhLmpzJ1xuaW1wb3J0IHsgZ2V0U2NoZW1hQWNjZXNzb3IgfSBmcm9tICcuLi91dGlscy9hY2Nlc3Nvci5qcydcbmltcG9ydCB7IGdldE5hbWVkU2NoZW1hcywgaGFzRm9ybVNjaGVtYSB9IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvVHJlZUl0ZW0nLCB7XG4gIG1peGluczogW1NvcnRhYmxlTWl4aW5dLFxuICBpbmplY3Q6IFsnY29udGFpbmVyJ10sXG5cbiAgcHJvcHM6IHtcbiAgICBzY2hlbWE6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGRhdGFQYXRoOiB7IHR5cGU6IFN0cmluZywgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBkYXRhOiB7IHR5cGU6IFtBcnJheSwgT2JqZWN0XSwgZGVmYXVsdDogbnVsbCB9LFxuICAgIHBhdGg6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnJyB9LFxuICAgIG9wZW46IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBhY3RpdmU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBkcmFnZ2FibGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBsYWJlbDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBsZXZlbDogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IDAgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9wZW5lZDogdGhpcy5vcGVuIHx8IHRoaXMuc2NoZW1hLm9wZW5cbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBtZXRhKCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyLm1ldGFcbiAgICB9LFxuXG4gICAgc3RvcmUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb250YWluZXIuc3RvcmVcbiAgICB9LFxuXG4gICAgZGlzYWJsZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb250YWluZXIuZGlzYWJsZWRcbiAgICB9LFxuXG4gICAgbmVzdGVkTWV0YSgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnRoaXMubWV0YSxcbiAgICAgICAgc2NoZW1hOiB0aGlzLnNjaGVtYVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBwcm9wZXJ0aWVzKCkge1xuICAgICAgcmV0dXJuIGdldE5hbWVkU2NoZW1hcyh0aGlzLnNjaGVtYS5wcm9wZXJ0aWVzKVxuICAgIH0sXG5cbiAgICAvLyBUT0RPOiBTaG91bGQgdGhpcyBiZSBuYW1lZCBgc291cmNlU2NoZW1hYCBpbnN0ZWFkPyBVc2UgU291cmNlTWl4aW4/XG4gICAgY2hpbGRyZW5TY2hlbWEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY2hlbWEuY2hpbGRyZW5cbiAgICB9LFxuXG4gICAgY2hpbGRyZW5MaXN0KCkge1xuICAgICAgY29uc3QgbmFtZSA9IHRoaXMuY2hpbGRyZW5TY2hlbWE/Lm5hbWVcbiAgICAgIHJldHVybiBuYW1lICYmIHRoaXMuZGF0YVtuYW1lXVxuICAgIH0sXG5cbiAgICBjaGlsZHJlbkRyYWdnYWJsZSgpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRoaXMuY2hpbGRyZW5MaXN0Py5sZW5ndGggPiAxICYmXG4gICAgICAgIHRoaXMuZ2V0U2NoZW1hVmFsdWUoJ2RyYWdnYWJsZScsIHtcbiAgICAgICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICAgIHNjaGVtYTogdGhpcy5jaGlsZHJlblNjaGVtYVxuICAgICAgICB9KVxuICAgICAgKVxuICAgIH0sXG5cbiAgICBudW1DaGlsZHJlbigpIHtcbiAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuTGlzdD8ubGVuZ3RoIHx8IDBcbiAgICB9LFxuXG4gICAgbnVtUHJvcGVydGllcygpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXM/Lmxlbmd0aCB8fCAwXG4gICAgfSxcblxuICAgIG51bUVudHJpZXMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5udW1Qcm9wZXJ0aWVzICsgdGhpcy5udW1DaGlsZHJlblxuICAgIH0sXG5cbiAgICBjaGlsZHJlbkl0ZW1zKCkge1xuICAgICAgY29uc3QgeyBjaGlsZHJlblNjaGVtYSwgY2hpbGRyZW5MaXN0IH0gPSB0aGlzXG4gICAgICBpZiAoY2hpbGRyZW5TY2hlbWEgJiYgY2hpbGRyZW5MaXN0KSB7XG4gICAgICAgIGNvbnN0IHsgZWRpdFBhdGggfSA9IHRoaXMuY29udGFpbmVyXG4gICAgICAgIGNvbnN0IGNoaWxkcmVuT3BlbiA9ICF0aGlzLnBhdGggJiYgY2hpbGRyZW5TY2hlbWEub3BlblxuICAgICAgICAvLyBCdWlsZCBhIGNoaWxkcmVuIGxpc3Qgd2l0aCBjaGlsZCBtZXRhIGluZm9ybWF0aW9uIGZvciB0aGUgdGVtcGxhdGUuXG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZU9yZGVyKFxuICAgICAgICAgIGNoaWxkcmVuU2NoZW1hLFxuICAgICAgICAgIGNoaWxkcmVuTGlzdC5tYXAoKGRhdGEsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwYXRoID0gKFxuICAgICAgICAgICAgICBjaGlsZHJlblNjaGVtYS5wYXRoICYmXG4gICAgICAgICAgICAgIGAke3RoaXMucGF0aH0vJHtjaGlsZHJlblNjaGVtYS5wYXRofS8ke2luZGV4fWBcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGNvbnN0IG9wZW4gPSAoXG4gICAgICAgICAgICAgIGNoaWxkcmVuT3BlbiB8fFxuICAgICAgICAgICAgICAvLyBPbmx5IGNvdW50IGFzIFwiaW4gZWRpdCBwYXRoXCIgd2hlbiBpdCdzIG5vdCB0aGUgZnVsbCBlZGl0IHBhdGguXG4gICAgICAgICAgICAgIGVkaXRQYXRoLnN0YXJ0c1dpdGgocGF0aCkgJiYgcGF0aC5sZW5ndGggPCBlZGl0UGF0aC5sZW5ndGhcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGNvbnN0IGFjdGl2ZSA9IGVkaXRQYXRoID09PSBwYXRoXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgICBvcGVuLFxuICAgICAgICAgICAgICBhY3RpdmVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICB9XG4gICAgICByZXR1cm4gW11cbiAgICB9LFxuXG4gICAgZGV0YWlscygpIHtcbiAgICAgIGNvbnN0IHsgbnVtQ2hpbGRyZW4gfSA9IHRoaXNcbiAgICAgIHJldHVybiAoXG4gICAgICAgIG51bUNoaWxkcmVuICYmXG4gICAgICAgIGAke251bUNoaWxkcmVufSAke1xuICAgICAgICAgIG51bUNoaWxkcmVuID09PSAxID8gJ2l0ZW0nIDogJ2l0ZW1zJ1xuICAgICAgICB9YFxuICAgICAgKVxuICAgIH0sXG5cbiAgICBoYXNFZGl0QnV0dG9ucygpIHtcbiAgICAgIHJldHVybiB0aGlzLmRyYWdnYWJsZSB8fCB0aGlzLmVkaXRhYmxlIHx8IHRoaXMuZGVsZXRhYmxlXG4gICAgfSxcblxuICAgIC8vIFRPRE86IFN1cHBvcnQgY3JlYXRhYmxlIVxuICAgIC8vIFRPRE86IEFkZCBzdXBwb3J0IGZvciBjcmVhdGFibGUsIGVkaXRhYmxlIGFuZCBkZWxldGFibGUgb3ZlcnJpZGVzIG9uIHRoZVxuICAgIC8vIGFzc29jaWF0ZWQgZm9ybXMsIGp1c3QgbGlrZSBpbiBgVHlwZUxpc3RgIGFuZCBgVHlwZU9iamVjdGAsIHRocm91Z2hcbiAgICAvLyBgRGl0b0VkaXRCdXR0b25zYC4gSXQgd291bGQgYmUgYmVzdCB0byB1c2UgYERpdG9FZGl0QnV0dG9uc2AgaGVyZSB0b28uXG4gICAgY3JlYXRhYmxlOiBnZXRTY2hlbWFBY2Nlc3NvcignY3JlYXRhYmxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgZ2V0KGNyZWF0YWJsZSkge1xuICAgICAgICByZXR1cm4gY3JlYXRhYmxlICYmIGhhc0Zvcm1TY2hlbWEodGhpcy5zY2hlbWEpXG4gICAgICB9XG4gICAgfSksXG5cbiAgICBlZGl0YWJsZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ2VkaXRhYmxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgZ2V0KGVkaXRhYmxlKSB7XG4gICAgICAgIHJldHVybiBlZGl0YWJsZSAmJiBoYXNGb3JtU2NoZW1hKHRoaXMuc2NoZW1hKVxuICAgICAgfVxuICAgIH0pLFxuXG4gICAgZGVsZXRhYmxlOiBnZXRTY2hlbWFBY2Nlc3NvcignZGVsZXRhYmxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSlcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0UHJvcGVydHlEYXRhUGF0aChwcm9wZXJ0eSkge1xuICAgICAgcmV0dXJuIGFwcGVuZERhdGFQYXRoKHRoaXMuZGF0YVBhdGgsIHByb3BlcnR5Lm5hbWUpXG4gICAgfSxcblxuICAgIG9uRWRpdCgpIHtcbiAgICAgIC8vIEFsbCB3ZSBnb3QgdG8gZG8gaXMgcHVzaCB0aGUgcmlnaHQgZWRpdCBwYXRoIHRvIHRoZSByb3V0ZXIsIHRoZSByZXN0XG4gICAgICAvLyBpcyBoYW5kbGVkIGJ5IG91ciByb3V0ZXMsIGFsbG93aW5nIHJlbG9hZHMgYXMgd2VsbC5cbiAgICAgIHRoaXMuJHJvdXRlci5wdXNoKHtcbiAgICAgICAgcGF0aDogYCR7dGhpcy5jb250YWluZXIucGF0aH0ke3RoaXMucGF0aH1gLFxuICAgICAgICAvLyBQcmVzZXJ2ZSBjdXJyZW50IHF1ZXJ5XG4gICAgICAgIHF1ZXJ5OiB0aGlzLiRyb3V0ZS5xdWVyeVxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgb25EZWxldGUoKSB7XG4gICAgICAvLyBUT0RPOiBJbXBsZW1lbnQhXG4gICAgfSxcblxuICAgIG9uQ2hhbmdlKCkge1xuICAgICAgdGhpcy5jb250YWluZXIub25DaGFuZ2UoKVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXRyZWUtaXRlbSB7XG4gIC0tY2hldnJvbi1pbmRlbnQ6ICN7JGNoZXZyb24taW5kZW50fTtcblxuICA+IC5kaXRvLXRyZWUtaGVhZGVyIHtcbiAgICA+IC5kaXRvLXRyZWUtYnJhbmNoLFxuICAgID4gLmRpdG8tdHJlZS1sZWFmIHtcbiAgICAgIC8vIFVzZSBgLS1sZXZlbGAgQ1NTIHZhcmlhYmxlIHRvIGNhbGN1bGF0ZWQgdGhlIGFjY3VtdWxhdGVkIGluZGVudFxuICAgICAgLy8gcGFkZGluZyBkaXJlY3RseSBpbnN0ZWFkIG9mIGhhdmluZyBpdCBhY2N1bXVsYXRlIGluIG5lc3RlZCBDU1MuXG4gICAgICAvLyBUaGlzIHdheSwgd2UgY2FuIGtlZXAgdGhlIC5kaXRvLWFjdGl2ZSBhcmVhIGNvdmVyIHRoZSBmdWxsIHdpZHRoOlxuICAgICAgcGFkZGluZy1sZWZ0OiBjYWxjKHZhcigtLWNoZXZyb24taW5kZW50KSAqICh2YXIoLS1sZXZlbCwgMSkgLSAxKSk7XG4gICAgfVxuICB9XG5cbiAgLmRpdG8tdHJlZS1icmFuY2gge1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgfVxuXG4gIC5kaXRvLXRyZWUtaGVhZGVyIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgfVxuXG4gIC5kaXRvLXRyZWUtYnJhbmNoLFxuICAuZGl0by10cmVlLWxlYWYge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleDogYXV0bztcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbWFyZ2luOiAxcHggMDtcbiAgICBAaW5jbHVkZSB1c2VyLXNlbGVjdChub25lKTtcbiAgfVxuXG4gIC5kaXRvLXRyZWUtbGFiZWwsXG4gIC5kaXRvLXRyZWUtaW5mbyB7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgfVxuXG4gIC5kaXRvLXRyZWUtaW5mbyB7XG4gICAgcGFkZGluZy1sZWZ0OiAwLjM1ZW07XG4gICAgY29sb3I6IHJnYmEoJGNvbG9yLWJsYWNrLCAwLjIpO1xuICB9XG5cbiAgLmRpdG8tYnV0dG9ucyB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIG1hcmdpbjogMXB4IDAgMXB4IDFlbTtcbiAgfVxuXG4gIC5kaXRvLXRyZWUtaGVhZGVyOmhvdmVyIHtcbiAgICA+IC5kaXRvLWJ1dHRvbnMge1xuICAgICAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbiAgICB9IC8vIEhpZGUgYnV0dG9ucyBkdXJpbmcgZHJhZ2dpbmdcbiAgfVxuXG4gICYuZGl0by1kcmFnZ2luZyB7XG4gICAgLmRpdG8tdHJlZS1oZWFkZXIge1xuICAgICAgPiAuZGl0by1idXR0b25zIHtcbiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gICYuZGl0by1hY3RpdmUge1xuICAgID4gLmRpdG8tdHJlZS1oZWFkZXIge1xuICAgICAgYmFja2dyb3VuZDogJGNvbG9yLWFjdGl2ZTtcbiAgICAgIHBhZGRpbmc6IDAgJGlucHV0LXBhZGRpbmctaG9yO1xuICAgICAgbWFyZ2luOiAwICgtJGlucHV0LXBhZGRpbmctaG9yKTtcblxuICAgICAgPiAuZGl0by10cmVlLWJyYW5jaCB7XG4gICAgICAgID4gLmRpdG8tY2hldnJvbjo6YmVmb3JlIHtcbiAgICAgICAgICBjb2xvcjogJGNvbG9yLXdoaXRlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgID4gKiA+IC5kaXRvLXRyZWUtbGFiZWwge1xuICAgICAgICBjb2xvcjogJGNvbG9yLXdoaXRlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC5kaXRvLXByb3BlcnRpZXMge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIG1hcmdpbi1sZWZ0OiAkY2hldnJvbi1pbmRlbnQ7XG5cbiAgICA+IHRyIHtcbiAgICAgIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTtcbiAgICB9XG5cbiAgICAuZGl0by1sYWJlbCB7XG4gICAgICBtYXJnaW46IDA7XG5cbiAgICAgICY6OmFmdGVyIHtcbiAgICAgICAgY29udGVudDogJzogJztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxudGhlYWQuZGl0by10YWJsZS1oZWFkXG4gIHRyXG4gICAgdGVtcGxhdGUoXG4gICAgICB2LWZvcj1cImNvbHVtbiBpbiBjb2x1bW5zXCJcbiAgICApXG4gICAgICB0aChcbiAgICAgICAgdi1pZj1cInNob3VsZFJlbmRlcihjb2x1bW4pXCJcbiAgICAgICAgOmNsYXNzPVwiZ2V0Q29sdW1uQ2xhc3MoY29sdW1uKVwiXG4gICAgICApXG4gICAgICAgIFJvdXRlckxpbmsoXG4gICAgICAgICAgdi1pZj1cImNvbHVtbi5zb3J0YWJsZVwiXG4gICAgICAgICAgdi1zbG90PVwieyBuYXZpZ2F0ZSB9XCJcbiAgICAgICAgICA6dG89XCJnZXRTb3J0TGluayhjb2x1bW4pXCJcbiAgICAgICAgICBjdXN0b21cbiAgICAgICAgKVxuICAgICAgICAgIGJ1dHRvbi5kaXRvLWJ1dHRvbihcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgOmNsYXNzPVwiZ2V0U29ydENsYXNzKGNvbHVtbilcIlxuICAgICAgICAgICAgQGNsaWNrPVwibmF2aWdhdGVcIlxuICAgICAgICAgIClcbiAgICAgICAgICAgIC5kaXRvLW9yZGVyLWFycm93c1xuICAgICAgICAgICAgc3BhbiB7eyBnZXRMYWJlbChjb2x1bW4pIH19XG4gICAgICAgIHNwYW4oXG4gICAgICAgICAgdi1lbHNlXG4gICAgICAgICkge3sgZ2V0TGFiZWwoY29sdW1uKSB9fVxuICAgIHRoKFxuICAgICAgdi1pZj1cImhhc0VkaXRCdXR0b25zXCJcbiAgICApXG4gICAgICAvLy0gRW1wdHkgPHNwYW4+IGlzIG5lZWRlZCBmb3Igc3R5bGluZywgc2VlIF90YWJsZS5zY3NzXG4gICAgICBzcGFuXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCB7IGh5cGhlbmF0ZSB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b1RhYmxlSGVhZCcsIHtcbiAgcHJvcHM6IHtcbiAgICBxdWVyeTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgY29sdW1uczogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgaGFzRWRpdEJ1dHRvbnM6IHsgdHlwZTogQm9vbGVhbiwgcmVxdWlyZWQ6IHRydWUgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgc29ydCgpIHtcbiAgICAgIGNvbnN0IG9yZGVyID0gKHRoaXMucXVlcnkub3JkZXIgfHwgJycpLnNwbGl0KC9cXHMrLylcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IG9yZGVyWzBdLFxuICAgICAgICBvcmRlcjogb3JkZXJbMV1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGdldENvbHVtbkNsYXNzKGNvbHVtbikge1xuICAgICAgcmV0dXJuIGBkaXRvLWNvbHVtbi0ke2h5cGhlbmF0ZShjb2x1bW4ubmFtZSl9YFxuICAgIH0sXG5cbiAgICBnZXRTb3J0Q2xhc3MoY29sdW1uKSB7XG4gICAgICByZXR1cm4gdGhpcy5zb3J0Lm5hbWUgPT09IGNvbHVtbi5uYW1lXG4gICAgICAgID8gYGRpdG8tc2VsZWN0ZWQgZGl0by1vcmRlci0ke3RoaXMuc29ydC5vcmRlcn1gXG4gICAgICAgIDogbnVsbFxuICAgIH0sXG5cbiAgICBnZXRTb3J0TGluayhjb2x1bW4pIHtcbiAgICAgIC8vIFRvZ2dsZSBvcmRlciBpZiB0aGUgc2FtZSBjb2x1bW4gaXMgY2xpY2tlZCBhZ2Fpbi5cbiAgICAgIGNvbnN0IG9yZGVyID1cbiAgICAgICAgdGhpcy5zb3J0Lm5hbWUgPT09IGNvbHVtbi5uYW1lICYmIHRoaXMuc29ydC5vcmRlciA9PT0gJ2FzYydcbiAgICAgICAgICA/ICdkZXNjJ1xuICAgICAgICAgIDogJ2FzYydcbiAgICAgIHJldHVybiB0aGlzLmdldFF1ZXJ5TGluayh7XG4gICAgICAgIC4uLnRoaXMucXVlcnksXG4gICAgICAgIG9yZGVyOiBgJHtjb2x1bW4ubmFtZX0gJHtvcmRlcn1gXG4gICAgICB9KVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXRhYmxlLWhlYWQge1xuICBAaW5jbHVkZSB1c2VyLXNlbGVjdChub25lKTtcblxuICB0ciB7XG4gICAgdGgge1xuICAgICAgcGFkZGluZzogMDtcbiAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gICAgICB0ZXh0LWFsaWduOiBsZWZ0O1xuICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcblxuICAgICAgLmRpdG8tYnV0dG9uIHtcbiAgICAgICAgLy8gQ29udmVudGlvbjogTmVzdGVkIHNwYW5zIGhhbmRsZSBwYWRkaW5nLCBzZWUgYmVsb3dcbiAgICAgICAgcGFkZGluZzogMDtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIHRleHQtYWxpZ246IGluaGVyaXQ7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gICAgICB9XG5cbiAgICAgIHNwYW4ge1xuICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgICAgIC8vIENvbnZlbnRpb246IE5lc3RlZCBzcGFucyBoYW5kbGUgcGFkZGluZ1xuICAgICAgICBwYWRkaW5nOiAkaW5wdXQtcGFkZGluZztcblxuICAgICAgICAmOmVtcHR5OjphZnRlciB7XG4gICAgICAgICAgLy8gUHJldmVudCBlbXB0eSA8dGg+IGZyb20gY29sbGFwc2luZ1xuICAgICAgICAgIGNvbnRlbnQ6ICdcXDIwMGInOyAvLyB6ZXJvLXdpZHRoIHNwYWNlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgID4gc3BhbiB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG50ZChcbiAgOmNsYXNzPVwiY2VsbC5jbGFzc1wiXG4gIDpzdHlsZT1cImNlbGwuc3R5bGVcIlxuKVxuICAvLy0gVE9ETzogSW1wbGVtZW50IGlubGluZWQgY29tcG9uZW50cyBpbiBjZWxsIG1vZGUhXG4gIGNvbXBvbmVudChcbiAgICB2LWlmPVwiY2VsbC5jb21wb25lbnRcIlxuICAgIDppcz1cImNlbGwuY29tcG9uZW50XCJcbiAgICA6c2NoZW1hPVwic2NoZW1hXCJcbiAgICA6ZGF0YVBhdGg9XCJkYXRhUGF0aFwiXG4gICAgOmRhdGE9XCJkYXRhXCJcbiAgICA6bWV0YT1cIm1ldGFcIlxuICAgIDpzdG9yZT1cInN0b3JlXCJcbiAgICA6bmVzdGVkPVwibmVzdGVkXCJcbiAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gIClcbiAgc3BhbihcbiAgICB2LWVsc2VcbiAgICB2LWh0bWw9XCJyZW5kZXJDZWxsKGRhdGEpXCJcbiAgKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5pbXBvcnQgRGl0b0NvbnRleHQgZnJvbSAnLi4vRGl0b0NvbnRleHQuanMnXG5pbXBvcnQgeyBhcHBlbmREYXRhUGF0aCB9IGZyb20gJy4uL3V0aWxzL2RhdGEuanMnXG5pbXBvcnQgeyBlc2NhcGVIdG1sIH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvVGFibGVDZWxsJywge1xuICBwcm9wczoge1xuICAgIGNlbGw6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHNjaGVtYTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZGF0YVBhdGg6IHsgdHlwZTogU3RyaW5nLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGRhdGE6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIG1ldGE6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHN0b3JlOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBuZXN0ZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZSB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgcmVuZGVyQ2VsbChpdGVtKSB7XG4gICAgICBjb25zdCB7IG5hbWUsIHJlbmRlciB9ID0gdGhpcy5jZWxsXG4gICAgICBjb25zdCB2YWx1ZSA9IGl0ZW1bbmFtZV1cbiAgICAgIHJldHVybiByZW5kZXJcbiAgICAgICAgPyByZW5kZXIuY2FsbChcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICBuZXcgRGl0b0NvbnRleHQodGhpcywge1xuICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgZGF0YTogaXRlbSxcbiAgICAgICAgICAgICAgZGF0YVBhdGg6IGFwcGVuZERhdGFQYXRoKHRoaXMuZGF0YVBhdGgsIG5hbWUpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICAgOiBlc2NhcGVIdG1sKHZhbHVlKVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuIiwiaW1wb3J0IHsgbmV4dFRpY2ssIGRlZmluZUNvbXBvbmVudCwgcmVmLCByZWFjdGl2ZSwgaCB9IGZyb20gJ3Z1ZS1kZW1pJztcbmltcG9ydCB7IHRyeU9uTW91bnRlZCwgdHJ5T25TY29wZURpc3Bvc2UsIHVucmVmRWxlbWVudCwgZGVmYXVsdERvY3VtZW50LCB0b1ZhbHVlLCB1c2VWTW9kZWwgfSBmcm9tICdAdnVldXNlL2NvcmUnO1xuaW1wb3J0IFNvcnRhYmxlIGZyb20gJ3NvcnRhYmxlanMnO1xuXG52YXIgX19kZWZQcm9wID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xudmFyIF9fZ2V0T3duUHJvcFN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xudmFyIF9faGFzT3duUHJvcCA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgX19wcm9wSXNFbnVtID0gT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcbnZhciBfX2RlZk5vcm1hbFByb3AgPSAob2JqLCBrZXksIHZhbHVlKSA9PiBrZXkgaW4gb2JqID8gX19kZWZQcm9wKG9iaiwga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlIH0pIDogb2JqW2tleV0gPSB2YWx1ZTtcbnZhciBfX3NwcmVhZFZhbHVlcyA9IChhLCBiKSA9PiB7XG4gIGZvciAodmFyIHByb3AgaW4gYiB8fCAoYiA9IHt9KSlcbiAgICBpZiAoX19oYXNPd25Qcm9wLmNhbGwoYiwgcHJvcCkpXG4gICAgICBfX2RlZk5vcm1hbFByb3AoYSwgcHJvcCwgYltwcm9wXSk7XG4gIGlmIChfX2dldE93blByb3BTeW1ib2xzKVxuICAgIGZvciAodmFyIHByb3Agb2YgX19nZXRPd25Qcm9wU3ltYm9scyhiKSkge1xuICAgICAgaWYgKF9fcHJvcElzRW51bS5jYWxsKGIsIHByb3ApKVxuICAgICAgICBfX2RlZk5vcm1hbFByb3AoYSwgcHJvcCwgYltwcm9wXSk7XG4gICAgfVxuICByZXR1cm4gYTtcbn07XG52YXIgX19vYmpSZXN0ID0gKHNvdXJjZSwgZXhjbHVkZSkgPT4ge1xuICB2YXIgdGFyZ2V0ID0ge307XG4gIGZvciAodmFyIHByb3AgaW4gc291cmNlKVxuICAgIGlmIChfX2hhc093blByb3AuY2FsbChzb3VyY2UsIHByb3ApICYmIGV4Y2x1ZGUuaW5kZXhPZihwcm9wKSA8IDApXG4gICAgICB0YXJnZXRbcHJvcF0gPSBzb3VyY2VbcHJvcF07XG4gIGlmIChzb3VyY2UgIT0gbnVsbCAmJiBfX2dldE93blByb3BTeW1ib2xzKVxuICAgIGZvciAodmFyIHByb3Agb2YgX19nZXRPd25Qcm9wU3ltYm9scyhzb3VyY2UpKSB7XG4gICAgICBpZiAoZXhjbHVkZS5pbmRleE9mKHByb3ApIDwgMCAmJiBfX3Byb3BJc0VudW0uY2FsbChzb3VyY2UsIHByb3ApKVxuICAgICAgICB0YXJnZXRbcHJvcF0gPSBzb3VyY2VbcHJvcF07XG4gICAgfVxuICByZXR1cm4gdGFyZ2V0O1xufTtcbmZ1bmN0aW9uIHVzZVNvcnRhYmxlKGVsLCBsaXN0LCBvcHRpb25zID0ge30pIHtcbiAgbGV0IHNvcnRhYmxlO1xuICBjb25zdCBfYSA9IG9wdGlvbnMsIHsgZG9jdW1lbnQgPSBkZWZhdWx0RG9jdW1lbnQgfSA9IF9hLCByZXNldE9wdGlvbnMgPSBfX29ialJlc3QoX2EsIFtcImRvY3VtZW50XCJdKTtcbiAgY29uc3QgZGVmYXVsdE9wdGlvbnMgPSB7XG4gICAgb25VcGRhdGU6IChlKSA9PiB7XG4gICAgICBtb3ZlQXJyYXlFbGVtZW50KGxpc3QsIGUub2xkSW5kZXgsIGUubmV3SW5kZXgpO1xuICAgIH1cbiAgfTtcbiAgY29uc3Qgc3RhcnQgPSAoKSA9PiB7XG4gICAgY29uc3QgdGFyZ2V0ID0gdHlwZW9mIGVsID09PSBcInN0cmluZ1wiID8gZG9jdW1lbnQgPT0gbnVsbCA/IHZvaWQgMCA6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZWwpIDogdW5yZWZFbGVtZW50KGVsKTtcbiAgICBpZiAoIXRhcmdldClcbiAgICAgIHJldHVybjtcbiAgICBzb3J0YWJsZSA9IG5ldyBTb3J0YWJsZSh0YXJnZXQsIF9fc3ByZWFkVmFsdWVzKF9fc3ByZWFkVmFsdWVzKHt9LCBkZWZhdWx0T3B0aW9ucyksIHJlc2V0T3B0aW9ucykpO1xuICB9O1xuICBjb25zdCBzdG9wID0gKCkgPT4gc29ydGFibGUgPT0gbnVsbCA/IHZvaWQgMCA6IHNvcnRhYmxlLmRlc3Ryb3koKTtcbiAgdHJ5T25Nb3VudGVkKHN0YXJ0KTtcbiAgdHJ5T25TY29wZURpc3Bvc2Uoc3RvcCk7XG4gIHJldHVybiB7IHN0b3AsIHN0YXJ0IH07XG59XG5mdW5jdGlvbiBtb3ZlQXJyYXlFbGVtZW50KGxpc3QsIGZyb20sIHRvKSB7XG4gIGNvbnN0IGFycmF5ID0gdG9WYWx1ZShsaXN0KTtcbiAgaWYgKHRvID49IDAgJiYgdG8gPCBhcnJheS5sZW5ndGgpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gYXJyYXkuc3BsaWNlKGZyb20sIDEpWzBdO1xuICAgIG5leHRUaWNrKCgpID0+IGFycmF5LnNwbGljZSh0bywgMCwgZWxlbWVudCkpO1xuICB9XG59XG5cbmNvbnN0IFVzZVNvcnRhYmxlID0gLyogQF9fUFVSRV9fICovIC8qICNfX1BVUkVfXyAqLyBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIlVzZVNvcnRhYmxlXCIsXG4gIG1vZGVsOiB7XG4gICAgLy8gQ29tcGF0aWJsZSB3aXRoIHZ1ZTJcbiAgICBwcm9wOiBcIm1vZGVsVmFsdWVcIixcbiAgICBldmVudDogXCJ1cGRhdGU6bW9kZWxWYWx1ZVwiXG4gIH0sXG4gIHByb3BzOiB7XG4gICAgbW9kZWxWYWx1ZToge1xuICAgICAgdHlwZTogQXJyYXksXG4gICAgICByZXF1aXJlZDogdHJ1ZVxuICAgIH0sXG4gICAgdGFnOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiBcImRpdlwiXG4gICAgfSxcbiAgICBvcHRpb25zOiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICByZXF1aXJlZDogdHJ1ZVxuICAgIH1cbiAgfSxcbiAgc2V0dXAocHJvcHMsIHsgc2xvdHMgfSkge1xuICAgIGNvbnN0IGxpc3QgPSB1c2VWTW9kZWwocHJvcHMsIFwibW9kZWxWYWx1ZVwiKTtcbiAgICBjb25zdCB0YXJnZXQgPSByZWYoKTtcbiAgICBjb25zdCBkYXRhID0gcmVhY3RpdmUodXNlU29ydGFibGUodGFyZ2V0LCBsaXN0LCBwcm9wcy5vcHRpb25zKSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGlmIChzbG90cy5kZWZhdWx0KVxuICAgICAgICByZXR1cm4gaChwcm9wcy50YWcsIHsgcmVmOiB0YXJnZXQgfSwgc2xvdHMuZGVmYXVsdChkYXRhKSk7XG4gICAgfTtcbiAgfVxufSk7XG5cbmV4cG9ydCB7IFVzZVNvcnRhYmxlIH07XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuVXNlU29ydGFibGUoXG4gIHYtaWY9XCJkcmFnZ2FibGVcIlxuICA6dGFnPVwidGFnXCJcbiAgOm1vZGVsVmFsdWU9XCJtb2RlbFZhbHVlXCJcbiAgOm9wdGlvbnM9XCJvcHRpb25zXCJcbiAgQHVwZGF0ZTptb2RlbFZhbHVlPVwiJGVtaXQoJ3VwZGF0ZTptb2RlbFZhbHVlJywgJGV2ZW50KVwiXG4pXG4gIHNsb3RcbmNvbXBvbmVudChcbiAgdi1lbHNlXG4gIDppcz1cInRhZ1wiXG4pXG4gIHNsb3RcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50J1xuaW1wb3J0IHsgVXNlU29ydGFibGUgfSBmcm9tICdAdnVldXNlL2ludGVncmF0aW9ucy91c2VTb3J0YWJsZS9jb21wb25lbnQnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b0RyYWdnYWJsZScsIHtcbiAgY29tcG9uZW50czogeyBVc2VTb3J0YWJsZSB9LFxuICBlbWl0czogWyd1cGRhdGU6bW9kZWxWYWx1ZSddLFxuXG4gIHByb3BzOiB7XG4gICAgbW9kZWxWYWx1ZToge1xuICAgICAgdHlwZTogQXJyYXksXG4gICAgICByZXF1aXJlZDogdHJ1ZVxuICAgIH0sXG4gICAgdGFnOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiAnZGl2J1xuICAgIH0sXG4gICAgb3B0aW9uczoge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgcmVxdWlyZWQ6IHRydWVcbiAgICB9LFxuICAgIGRyYWdnYWJsZToge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cbiIsIjxzY3JpcHQ+XG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZnVuY3Rpb24gRGl0b1ZOb2RlKHsgdm5vZGUgfSkge1xuICByZXR1cm4gdm5vZGVcbn1cblxuRGl0b1ZOb2RlLnByb3BzID0ge1xuICB2bm9kZTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9Wbm9kZScsIERpdG9WTm9kZSlcbjwvc2NyaXB0PlxuIiwiLy8gRGl0b1R5cGVDb21wb25lbnQgaXMgdGhlIGFic3RyYWN0IGJhc2UgY29tcG9uZW50IGZvciBhbGwgb3RoZXIgdHlwZVxuLy8gY29tcG9uZW50cyBpbnNpZGUgdGhlIHR5cGVzLyBmb2xkZXIuIFRoZXJlJ3MgYWxzbyBhIHNlcGFyYXRlIGNvbmNyZXRlXG4vLyBgRGl0b1R5cGVDb21wb25lbnQudnVlYCBjb21wb25lbnQsIHVzZSB0byByZW5kZXIgYHsgdHlwZTogJ2NvbXBvbmVudCcgfWBcbmltcG9ydCB7IGFzQXJyYXksIGNhbWVsaXplIH0gZnJvbSAnQGRpdG9qcy91dGlscydcbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCBUeXBlTWl4aW4gZnJvbSAnLi9taXhpbnMvVHlwZU1peGluLmpzJ1xuaW1wb3J0IHsgcmVnaXN0ZXJUeXBlQ29tcG9uZW50LCBnZXRUeXBlQ29tcG9uZW50IH0gZnJvbSAnLi91dGlscy9zY2hlbWEuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCB7XG4gIGV4dGVuZHM6IERpdG9Db21wb25lbnQsXG4gIG1peGluczogW1R5cGVNaXhpbl0sXG5cbiAgbmF0aXZlRmllbGQ6IGZhbHNlLFxuICB0ZXh0RmllbGQ6IGZhbHNlLFxuICAvLyBTZXQgcmVhc29uYWJsZSBkZWZhdWx0cyBmb3IgYWxsIG9mIHRoZXNlIHRoYXQgYXJlIHVzZWQgYnkgbW9zdCB0eXBlXG4gIC8vIGNvbXBvbmVudHMuIFRoZXNlIG9ubHkgbmVlZCBkZWZpbmluZyBpbiBzdWItY2xhc3NlcyB3aGVuIHRoZXkgZGlmZmVyLlxuICBkZWZhdWx0VmFsdWU6IG51bGwsXG4gIGRlZmF1bHROZXN0ZWQ6IHRydWUsXG4gIGRlZmF1bHRWaXNpYmxlOiB0cnVlLFxuICBnZW5lcmF0ZUxhYmVsOiB0cnVlLFxuICBleGNsdWRlVmFsdWU6IGZhbHNlLFxuICBpZ25vcmVNaXNzaW5nVmFsdWU6IG51bGwsXG4gIGFsaWduQm90dG9tOiB0cnVlLFxuICBvbWl0UGFkZGluZzogZmFsc2UsXG5cbiAgY29tcG9uZW50OiBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCxcblxuICBnZXQ6IGdldFR5cGVDb21wb25lbnQsXG5cbiAgcmVnaXN0ZXIodHlwZXMsIGRlZmluaXRpb24gPSB7fSkge1xuICAgIHR5cGVzID0gYXNBcnJheSh0eXBlcylcbiAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudChcbiAgICAgIGBEaXRvVHlwZSR7Y2FtZWxpemUodHlwZXNbMF0sIHRydWUpfWAsXG4gICAgICBkZWZpbml0aW9uXG4gICAgKVxuICAgIGZvciAoY29uc3QgdHlwZSBvZiB0eXBlcykge1xuICAgICAgcmVnaXN0ZXJUeXBlQ29tcG9uZW50KHR5cGUsIGNvbXBvbmVudClcbiAgICB9XG4gICAgcmV0dXJuIGNvbXBvbmVudFxuICB9XG59XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuYnV0dG9uLmRpdG8tYnV0dG9uKFxuICA6aWQ9XCJkYXRhUGF0aFwiXG4gIHJlZj1cImVsZW1lbnRcIlxuICA6dHlwZT1cInR5cGVcIlxuICA6dGl0bGU9XCJ0aXRsZVwiXG4gIDpjbGFzcz1cImJ1dHRvbkNsYXNzXCJcbiAgdi1iaW5kPVwiYXR0cmlidXRlc1wiXG4pIHt7IHRleHQgfX1cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b1R5cGVDb21wb25lbnQgZnJvbSAnLi4vRGl0b1R5cGVDb21wb25lbnQuanMnXG5pbXBvcnQgeyBnZXRTY2hlbWFBY2Nlc3NvciB9IGZyb20gJy4uL3V0aWxzL2FjY2Vzc29yLmpzJ1xuaW1wb3J0IHsgaGFzUmVzb3VyY2UgfSBmcm9tICcuLi91dGlscy9yZXNvdXJjZS5qcydcbmltcG9ydCB7IGxhYmVsaXplIH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoXG4gIFsnYnV0dG9uJywgJ3N1Ym1pdCddLFxuICAvLyBAdnVlL2NvbXBvbmVudFxuICB7XG4gICAgZGVmYXVsdFZhbHVlOiAoKSA9PiB1bmRlZmluZWQsIC8vIENhbGxiYWNrIHRvIG92ZXJyaWRlIGBkZWZhdWx0VmFsdWU6IG51bGxgXG4gICAgZXhjbHVkZVZhbHVlOiB0cnVlLFxuICAgIGdlbmVyYXRlTGFiZWw6IGZhbHNlLFxuICAgIGRlZmF1bHRXaWR0aDogJ2F1dG8nLFxuXG4gICAgY29tcHV0ZWQ6IHtcbiAgICAgIHZlcmIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZlcmJzW3RoaXMubmFtZV1cbiAgICAgIH0sXG5cbiAgICAgIGJ1dHRvbkNsYXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52ZXJiID8gYGRpdG8tYnV0dG9uLSR7dGhpcy52ZXJifWAgOiBudWxsXG4gICAgICB9LFxuXG4gICAgICB0ZXh0OiBnZXRTY2hlbWFBY2Nlc3NvcigndGV4dCcsIHtcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgICB9KSxcblxuICAgICAgdGl0bGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRleHQgfHwgbGFiZWxpemUodGhpcy52ZXJiKVxuICAgICAgfSxcblxuICAgICAgY2xvc2VGb3JtOiBnZXRTY2hlbWFBY2Nlc3NvcignY2xvc2VGb3JtJywge1xuICAgICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZVxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgbWV0aG9kczoge1xuICAgICAgLy8gQG92ZXJyaWRlXG4gICAgICBnZXRFdmVudHMoKSB7XG4gICAgICAgIGNvbnN0IHsgb25Gb2N1cywgb25CbHVyLCBvbkNsaWNrIH0gPSB0aGlzXG4gICAgICAgIHJldHVybiB7IG9uRm9jdXMsIG9uQmx1ciwgb25DbGljayB9XG4gICAgICB9LFxuXG4gICAgICBhc3luYyBzdWJtaXQob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNvdXJjZUNvbXBvbmVudD8uc3VibWl0KHRoaXMsIG9wdGlvbnMpXG4gICAgICB9LFxuXG4gICAgICBhc3luYyBvbkNsaWNrKCkge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmVtaXRFdmVudCgnY2xpY2snLCB7XG4gICAgICAgICAgcGFyZW50OiB0aGlzLnNjaGVtYUNvbXBvbmVudFxuICAgICAgICB9KVxuICAgICAgICAvLyBIYXZlIGJ1dHRvbnMgdGhhdCBkZWZpbmUgcmVzb3VyY2VzIGNhbGwgYHRoaXMuc3VibWl0KClgIGJ5IGRlZmF1bHQ6XG4gICAgICAgIGlmIChcbiAgICAgICAgICByZXMgPT09IHVuZGVmaW5lZCAmJiAvLyBNZWFuaW5nOiBkb24ndCBwcmV2ZW50IGRlZmF1bHQuXG4gICAgICAgICAgaGFzUmVzb3VyY2UodGhpcy5zY2hlbWEpXG4gICAgICAgICkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuc3VibWl0KClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuKVxuPC9zY3JpcHQ+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuaW5wdXQuZGl0by1jaGVja2JveChcbiAgOmlkPVwiZGF0YVBhdGhcIlxuICByZWY9XCJlbGVtZW50XCJcbiAgdi1tb2RlbD1cInZhbHVlXCJcbiAgdHlwZT1cImNoZWNrYm94XCJcbiAgdi1iaW5kPVwiYXR0cmlidXRlc1wiXG4pXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoJ2NoZWNrYm94Jywge1xuICBuYXRpdmVGaWVsZDogdHJ1ZVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLWNoZWNrYm94IHtcbiAgQGV4dGVuZCAlaW5wdXQtYm9yZGVybGVzcztcbn1cbjwvc3R5bGU+XG4iLCJpbXBvcnQge1xuICBpc09iamVjdCxcbiAgaXNGdW5jdGlvbixcbiAgaXNQcm9taXNlLFxuICBub3JtYWxpemVEYXRhUGF0aCxcbiAgZ2V0VmFsdWVBdERhdGFQYXRoXG59IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgeyByZWFjdGl2ZSB9IGZyb20gJ3Z1ZSdcbmltcG9ydCBMb2FkaW5nTWl4aW4gZnJvbSAnLi9Mb2FkaW5nTWl4aW4uanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCB7XG4gIG1peGluczogW0xvYWRpbmdNaXhpbl0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICAgIGFzeW5jRGF0YUVudHJpZXM6IHt9XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBoYW5kbGVEYXRhU2NoZW1hKHNjaGVtYSwgbmFtZSwge1xuICAgICAgcmVzb2x2ZUNvdW50ZXIgPSAxLFxuICAgICAgLi4ubG9hZGluZ09wdGlvbnNcbiAgICB9ID0ge30pIHtcbiAgICAgIGlmICghaXNPYmplY3Qoc2NoZW1hKSkge1xuICAgICAgICBzY2hlbWEgPSB7IGRhdGE6IHNjaGVtYSB9XG4gICAgICB9XG4gICAgICBsZXQgeyBkYXRhID0gdW5kZWZpbmVkLCBkYXRhUGF0aCA9IG51bGwgfSA9IHNjaGVtYVxuICAgICAgLy8gU2VlIGlmIHRoZXJlIGlzIGFzeW5jIGRhdGEgbG9hZGluZyBhbHJlYWR5IGluIHByb2Nlc3MuXG4gICAgICBjb25zdCBhc3luY0VudHJ5ID0gKHRoaXMuYXN5bmNEYXRhRW50cmllc1tuYW1lXSB8fD0gcmVhY3RpdmUoe1xuICAgICAgICBkZXBlbmRlbmN5RnVuY3Rpb246IG51bGwsXG4gICAgICAgIHJlc29sdmVDb3VudGVyOiAwLFxuICAgICAgICByZXNvbHZlZERhdGE6IG51bGwsXG4gICAgICAgIHJlc29sdmluZzogZmFsc2VcbiAgICAgIH0pKVxuICAgICAgLy8gSWYgdGhlIGRhdGEgY2FsbGJhY2sgcHJvdmlkZWQgYSBkZXBlbmRlbmN5IGZ1bmN0aW9uIHdoZW4gaXQgd2FzIGNhbGxlZCxcbiAgICAgIC8vIGNhbCBpdCBpbiBldmVyeSBjYWxsIG9mIGBoYW5kbGVEYXRhU2NoZW1hKClgIHRvIGZvcmNlIFZ1ZSB0byBrZWVwIHRyYWNrXG4gICAgICAvLyBvZiB0aGUgYXN5bmMgZGVwZW5kZW5jaWVzLlxuICAgICAgYXN5bmNFbnRyeS5kZXBlbmRlbmN5RnVuY3Rpb24/Lih0aGlzLmNvbnRleHQpXG5cbiAgICAgIGlmIChhc3luY0VudHJ5LnJlc29sdmVDb3VudGVyID4gMCkge1xuICAgICAgICAvLyBJZiB0aGUgZGF0YSB3YXMgcmVzb2x2ZWQgYWxyZWFkeSwgcmV0dXJuIGl0IGFuZCBjbGVhciB0aGUgdmFsdWUgb25jZVxuICAgICAgICAvLyBgcmVzb2x2ZUNvdW50ZXJgIHJlYWNoZXMgemVyby4gQ291bnRpbmcgaXMgbmVlZGVkIGJlY2F1c2UgZGVwZW5kaW5nXG4gICAgICAgIC8vIG9uIHRoZSB1c2Ugb2YgZGF0YSBhbmQgcmVhY3Rpdml0eSwgbXVsdGlwbGUgY2FsbHMgdG8gdGhlIGNvbXB1dGVkXG4gICAgICAgIC8vIGdldHRlciBhcmUgdHJpZ2dlcmVkIHdoZW4gdGhlIGRhdGEgaXMgY2hhbmdpbmcuIENsZWFyaW5nIHRoZSByZXNvbHZlZFxuICAgICAgICAvLyBkYXRhIHdvcmtzIGJlY2F1c2UgVnVlIGNhY2hlcyB0aGUgcmVzdWx0IG9mIGNvbXB1dGVkIGdldHRlcnMgYW5kIG9ubHlcbiAgICAgICAgLy8gcmVldmFsdWF0ZXMgaWYgb25lIG9mIHRoZSBkZXBlbmRlbmNpZXMgY2hhbmdlZC4gVGhpcyBpcyB0byBlbnN1cmVcbiAgICAgICAgLy8gdGhhdCBhIGNhY2hlZCB2YWx1ZSBoZXJlIGRvZXNuJ3QgYmxvY2sgLyBvdmVycmlkZSByZWV2YWx1YXRpb246XG4gICAgICAgIGNvbnN0IHsgcmVzb2x2ZWREYXRhIH0gPSBhc3luY0VudHJ5XG4gICAgICAgIGlmICgtLWFzeW5jRW50cnkucmVzb2x2ZUNvdW50ZXIgPT09IDApIHtcbiAgICAgICAgICBhc3luY0VudHJ5LnJlc29sdmVkRGF0YSA9IG51bGxcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzb2x2ZWREYXRhXG4gICAgICB9XG4gICAgICAvLyBBdm9pZCBjYWxsaW5nIHRoZSBkYXRhIGZ1bmN0aW9uIHR3aWNlOlxuICAgICAgaWYgKGFzeW5jRW50cnkucmVzb2x2aW5nKSB7XG4gICAgICAgIGRhdGEgPSBudWxsXG4gICAgICB9IGVsc2UgaWYgKGRhdGEpIHtcbiAgICAgICAgaWYgKGlzRnVuY3Rpb24oZGF0YSkpIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBkYXRhKHRoaXMuY29udGV4dClcbiAgICAgICAgICAvLyBJZiB0aGUgcmVzdWx0IG9mIHRoZSBkYXRhIGZ1bmN0aW9uIGlzIGFub3RoZXIgZnVuY3Rpb24sIHRoZW4gdGhlXG4gICAgICAgICAgLy8gZmlyc3QgZGF0YSBmdW5jdGlvbiBpcyB0aGVyZSB0byB0cmFjayBkZXBlbmRlbmNpZXMgYW5kIHRoZSByZWFsXG4gICAgICAgICAgLy8gZGF0YSBsb2FkaW5nIGhhcHBlbnMgaW4gdGhlIGZ1bmN0aW9uIHRoYXQgaXQgcmV0dXJuZWQuIEtlZXAgdHJhY2tcbiAgICAgICAgICAvLyBpdCBpbiBgZGVwZW5kZW5jeUZ1bmN0aW9uYCBzbyBpdCBjYW4gYmUgY2FsbGVkIG9uIGVhY2ggY2FsbCBvZlxuICAgICAgICAgIC8vIGBoYW5kbGVEYXRhU2NoZW1hKClgIHRvIGtlZXAgdGhlIGRlcGVuZGVuY2llcyBpbnRhY3QsIGFuZCBjYWxsXG4gICAgICAgICAgLy8gdGhlIGZ1bmN0aW9uIHRoYXQgaXQgcmV0dXJuZWQgb25jZSB0byBnZXQgdGhlIGFjdHVhbCBkYXRhOlxuICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKHJlc3VsdCkpIHtcbiAgICAgICAgICAgIGFzeW5jRW50cnkuZGVwZW5kZW5jeUZ1bmN0aW9uID0gZGF0YVxuICAgICAgICAgICAgZGF0YSA9IHJlc3VsdCh0aGlzLmNvbnRleHQpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRhdGEgPSByZXN1bHRcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzUHJvbWlzZShkYXRhKSkge1xuICAgICAgICAgIC8vIElmIHRoZSBkYXRhIGlzIGFzeW5jaHJvbm91cywgaXQgY2FuJ3QgYmUgcmV0dXJuZWQgc3RyYWlnaHQgYXdheS5cbiAgICAgICAgICAvLyBCdXQgd2UgY2FuIGNoZWF0IHVzaW5nIGNvbXB1dGVkIHByb3BlcnRpZXMgYW5kIGByZXNvbHZlZERhdGFgLFxuICAgICAgICAgIC8vIHdoaWNoIGlzIGdvaW5nIHRvIHJlY2VpdmUgdGhlIGxvYWRlZCBkYXRhIGFzeW5jaHJvbm91c2x5LFxuICAgICAgICAgIC8vIHRyaWdnZXJpbmcgYSByZWNvbXB1dGUgb2YgdGhlIGNvbXB1dGVkIHByb3BlcnR5IHRoYXQgY2FsbHNcbiAgICAgICAgICAvLyBgaGFuZGxlRGF0YVNjaGVtYSgpYC5cbiAgICAgICAgICBhc3luY0VudHJ5LnJlc29sdmluZyA9IHRydWVcbiAgICAgICAgICB0aGlzLnJlc29sdmVEYXRhKGRhdGEsIGxvYWRpbmdPcHRpb25zKS50aGVuKGRhdGEgPT4ge1xuICAgICAgICAgICAgYXN5bmNFbnRyeS5yZXNvbHZlQ291bnRlciA9IHJlc29sdmVDb3VudGVyXG4gICAgICAgICAgICBhc3luY0VudHJ5LnJlc29sdmVkRGF0YSA9IGRhdGFcbiAgICAgICAgICAgIGFzeW5jRW50cnkucmVzb2x2aW5nID0gZmFsc2VcbiAgICAgICAgICB9KVxuICAgICAgICAgIC8vIENsZWFyIGRhdGEgdW50aWwgcHJvbWlzZSBpcyByZXNvbHZlZCBhbmQgYHJlc29sdmVkRGF0YWAgaXMgc2V0XG4gICAgICAgICAgZGF0YSA9IG51bGxcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChkYXRhUGF0aCkge1xuICAgICAgICBkYXRhID0gZ2V0VmFsdWVBdERhdGFQYXRoKFxuICAgICAgICAgIHRoaXMucm9vdERhdGEsXG4gICAgICAgICAgbm9ybWFsaXplRGF0YVBhdGgoYCR7dGhpcy5kYXRhUGF0aH0vJHtkYXRhUGF0aH1gKVxuICAgICAgICApXG4gICAgICB9XG4gICAgICByZXR1cm4gZGF0YVxuICAgIH0sXG5cbiAgICBhc3luYyByZXNvbHZlRGF0YShsb2FkLCBsb2FkaW5nT3B0aW9ucyA9IHt9KSB7XG4gICAgICAvLyBVc2UgYSB0aW1lb3V0IHRvIGFsbG93IGFscmVhZHkgcmVzb2x2ZWQgcHJvbWlzZXMgdG8gcmV0dXJuIGRhdGEgd2l0aG91dFxuICAgICAgLy8gc2hvd2luZyBhIGxvYWRpbmcgaW5kaWNhdG9yLlxuICAgICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2V0TG9hZGluZyh0cnVlLCBsb2FkaW5nT3B0aW9ucyksIDApXG4gICAgICBsZXQgZGF0YSA9IG51bGxcbiAgICAgIHRyeSB7XG4gICAgICAgIGRhdGEgPSBhd2FpdCAoaXNGdW5jdGlvbihsb2FkKSA/IGxvYWQoKSA6IGxvYWQpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLmFkZEVycm9yKGVycm9yLm1lc3NhZ2UgfHwgZXJyb3IpXG4gICAgICB9XG4gICAgICBjbGVhclRpbWVvdXQodGltZXIpXG4gICAgICB0aGlzLnNldExvYWRpbmcoZmFsc2UsIGxvYWRpbmdPcHRpb25zKVxuICAgICAgcmV0dXJuIGRhdGFcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBEaXRvQ29udGV4dCBmcm9tICcuLi9EaXRvQ29udGV4dC5qcydcbmltcG9ydCBEYXRhTWl4aW4gZnJvbSAnLi9EYXRhTWl4aW4uanMnXG5pbXBvcnQgeyBnZXRTY2hlbWFBY2Nlc3NvciB9IGZyb20gJy4uL3V0aWxzL2FjY2Vzc29yLmpzJ1xuaW1wb3J0IHsgc2V0VGVtcG9yYXJ5SWQsIGlzUmVmZXJlbmNlIH0gZnJvbSAnLi4vdXRpbHMvZGF0YS5qcydcbmltcG9ydCB7XG4gIGlzT2JqZWN0LFxuICBpc0FycmF5LFxuICBpc1N0cmluZyxcbiAgaXNGdW5jdGlvbixcbiAgbm9ybWFsaXplRGF0YVBhdGgsXG4gIGxhYmVsaXplLFxuICBkZWJvdW5jZUFzeW5jXG59IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCB7XG4gIG1peGluczogW0RhdGFNaXhpbl0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaGFzT3B0aW9uczogZmFsc2VcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBzZWxlY3RlZFZhbHVlOiB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIGNvbnN0IGNvbnZlcnRWYWx1ZSA9IHZhbHVlID0+XG4gICAgICAgICAgdGhpcy5yZWxhdGVcbiAgICAgICAgICAgID8gdGhpcy5oYXNPcHRpb24odmFsdWUpXG4gICAgICAgICAgICAgID8gdGhpcy5nZXRWYWx1ZUZvck9wdGlvbih2YWx1ZSlcbiAgICAgICAgICAgICAgOiBudWxsXG4gICAgICAgICAgICA6IHZhbHVlXG4gICAgICAgIGNvbnN0IHZhbHVlID0gaXNBcnJheSh0aGlzLnZhbHVlKVxuICAgICAgICAgID8gdGhpcy52YWx1ZS5tYXAoY29udmVydFZhbHVlKS5maWx0ZXIodmFsdWUgPT4gdmFsdWUgIT09IG51bGwpXG4gICAgICAgICAgOiBjb252ZXJ0VmFsdWUodGhpcy52YWx1ZSlcbiAgICAgICAgaWYgKFxuICAgICAgICAgIC8vIFdoZW4gcmVsYXRpbmcgYW5kIGFzIHNvb24gYXMgdGhlIG9wdGlvbnMgYXJlIGF2YWlsYWJsZS4uLlxuICAgICAgICAgIHRoaXMucmVsYXRlICYmXG4gICAgICAgICAgdGhpcy5oYXNPcHRpb25zICYmIChcbiAgICAgICAgICAgIC8vIC4uLmlmIHRoZSB2YWx1ZSBpcyBmb3JjZWQgdG8gbnVsbCBiZWNhdXNlIGEgZGlzYXBwZWFyZWQgb3B0aW9uLi4uXG4gICAgICAgICAgICB2YWx1ZSA9PT0gbnVsbCAmJiB0aGlzLnZhbHVlICE9PSBudWxsIHx8XG4gICAgICAgICAgICAvLyAuLi5vciBpZiB0aGUgdmFsdWUgaXMgYSByZWZlcmVuY2UsIHJlcGxhY2UgaXQgd2l0aCBpdHMgb3B0aW9uXG4gICAgICAgICAgICAvLyB2YWx1ZSwgc28gdGhhdCBpdCdsbCBob2xkIGFjdHVhbCBkYXRhLCBub3QganVzdCBhIHJlZmVyZW5jZSBpZC5cbiAgICAgICAgICAgIGlzUmVmZXJlbmNlKHRoaXMudmFsdWUpXG4gICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBUT0RPOiBGaXggc2lkZS1lZmZlY3RzXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHZ1ZS9uby1zaWRlLWVmZmVjdHMtaW4tY29tcHV0ZWQtcHJvcGVydGllc1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZSA9IHZhbHVlXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlXG4gICAgICB9LFxuXG4gICAgICBzZXQodmFsdWUpIHtcbiAgICAgICAgY29uc3QgY29udmVydCA9IHZhbHVlID0+XG4gICAgICAgICAgdGhpcy5yZWxhdGVcbiAgICAgICAgICAgID8gdGhpcy5nZXRPcHRpb25Gb3JWYWx1ZSh2YWx1ZSlcbiAgICAgICAgICAgIDogdmFsdWVcbiAgICAgICAgdGhpcy52YWx1ZSA9IGlzQXJyYXkodmFsdWUpXG4gICAgICAgICAgPyB2YWx1ZS5tYXAoY29udmVydClcbiAgICAgICAgICA6IGNvbnZlcnQodmFsdWUpXG4gICAgICB9XG4gICAgfSxcblxuICAgIHNlbGVjdGVkT3B0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0T3B0aW9uRm9yVmFsdWUodGhpcy5zZWxlY3RlZFZhbHVlKVxuICAgIH0sXG5cbiAgICBvcHRpb25zKCkge1xuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuaGFuZGxlRGF0YVNjaGVtYSh0aGlzLnNjaGVtYS5vcHRpb25zLCAnb3B0aW9ucycsIHtcbiAgICAgICAgcmVzb2x2ZUNvdW50ZXI6IDFcbiAgICAgIH0pID8/IFtdXG4gICAgICBpZiAoIWlzQXJyYXkoZGF0YSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG9wdGlvbnMgZGF0YSwgc2hvdWxkIGJlIGFycmF5OiAke2RhdGF9YClcbiAgICAgIH1cbiAgICAgIC8vIFRPRE86IEZpeCBzaWRlLWVmZmVjdHNcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB2dWUvbm8tc2lkZS1lZmZlY3RzLWluLWNvbXB1dGVkLXByb3BlcnRpZXNcbiAgICAgIHRoaXMuaGFzT3B0aW9ucyA9IGRhdGEubGVuZ3RoID4gMFxuICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc09wdGlvbnMoZGF0YSlcbiAgICB9LFxuXG4gICAgYWN0aXZlT3B0aW9ucygpIHtcbiAgICAgIC8vIFRoaXMgaXMgb3ZlcnJpZGRlbiBpbiBgVHlwZU11bHRpc2VsZWN0YCB0byByZXR1cm4gdGhlIGBzZWFyY2hlZE9wdGlvbnNgXG4gICAgICAvLyB3aGVuIGEgc2VhcmNoIGZpbHRlciB3YXMgYXBwbGllZC5cbiAgICAgIHJldHVybiB0aGlzLm9wdGlvbnNcbiAgICB9LFxuXG4gICAgcmVsYXRlOiBnZXRTY2hlbWFBY2Nlc3NvcigncmVsYXRlJywge1xuICAgICAgLy8gVE9ETzogQ29udmVydCB0byBgcmVsYXRlQnk6ICdpZCdgXG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAvLyBXZSBjYW5ub3QgdXNlIHNjaGVtYSBhY2Nlc3NvciBjYWxsYmFjayBtYWdpYyBmb3IgYHJlbGF0ZWAgYXMgd2UgbmVlZFxuICAgICAgLy8gdGhpcyBvdXRzaWRlIG9mIHRoZSBjb21wb25lbnQncyBsaWZlLXNwYW4sIHNlZSBgcHJvY2Vzc0RhdGEoKWAgYmVsb3cuXG4gICAgICBjYWxsYmFjazogZmFsc2VcbiAgICB9KSxcblxuICAgIGdyb3VwQnk6IGdldFNjaGVtYUFjY2Vzc29yKCdncm91cEJ5Jywge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogbnVsbFxuICAgIH0pLFxuXG4gICAgLy8gVE9ETzogUmVuYW1lIHRvIGBvcHRpb25zLmxhYmVsS2V5YCAvIGBvcHRpb25MYWJlbEtleWA/XG4gICAgb3B0aW9uTGFiZWw6IGdldFNjaGVtYUFjY2Vzc29yKCdvcHRpb25zLmxhYmVsJywge1xuICAgICAgdHlwZTogW1N0cmluZywgRnVuY3Rpb25dLFxuICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIGdldChsYWJlbCkge1xuICAgICAgICAvLyBJZiBubyBgbGFiZWxgIHdhcyBwcm92aWRlZCBidXQgdGhlIG9wdGlvbnMgYXJlIG9iamVjdHMsIGFzc3VtZSBhXG4gICAgICAgIC8vIGRlZmF1bHQgdmFsdWUgb2YgJ2xhYmVsJzpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBsYWJlbCB8fFxuICAgICAgICAgIHRoaXMuZ2V0T3B0aW9uS2V5KCdsYWJlbCcpIHx8XG4gICAgICAgICAgbnVsbFxuICAgICAgICApXG4gICAgICB9XG4gICAgfSksXG5cbiAgICAvLyBUT0RPOiBSZW5hbWUgdG8gYG9wdGlvbnMudmFsdWVLZXlgIC8gYG9wdGlvblZhbHVlS2V5YD9cbiAgICBvcHRpb25WYWx1ZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ29wdGlvbnMudmFsdWUnLCB7XG4gICAgICB0eXBlOiBbU3RyaW5nLCBGdW5jdGlvbl0sXG4gICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgZ2V0KHZhbHVlKSB7XG4gICAgICAgIC8vIElmIG5vIGBsYWJlbGAgd2FzIHByb3ZpZGVkIGJ1dCB0aGUgb3B0aW9ucyBhcmUgb2JqZWN0cywgYXNzdW1lIGFcbiAgICAgICAgLy8gZGVmYXVsdCB2YWx1ZSBvZiAndmFsdWUnOlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIHZhbHVlIHx8XG4gICAgICAgICAgdGhpcy5yZWxhdGUgJiYgJ2lkJyB8fFxuICAgICAgICAgIHRoaXMuZ2V0T3B0aW9uS2V5KCd2YWx1ZScpIHx8XG4gICAgICAgICAgbnVsbFxuICAgICAgICApXG4gICAgICB9XG4gICAgfSksXG5cbiAgICAvLyBUT0RPOiBDb25zaWRlciBtb3Zpbmcgc2VhcmNoIHRvIGBvcHRpb25zLnNlYXJjaGA/XG4gICAgc2VhcmNoRmlsdGVyOiBnZXRTY2hlbWFBY2Nlc3Nvcignc2VhcmNoJywge1xuICAgICAgdHlwZTogW09iamVjdCwgRnVuY3Rpb25dLFxuICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIGdldChzZWFyY2gpIHtcbiAgICAgICAgaWYgKHNlYXJjaCkge1xuICAgICAgICAgIGNvbnN0IHsgZmlsdGVyLCBkZWJvdW5jZSB9ID0gaXNGdW5jdGlvbihzZWFyY2gpXG4gICAgICAgICAgICA/IHsgZmlsdGVyOiBzZWFyY2ggfVxuICAgICAgICAgICAgOiBzZWFyY2hcbiAgICAgICAgICByZXR1cm4gZGVib3VuY2UgPyBkZWJvdW5jZUFzeW5jKGZpbHRlciwgZGVib3VuY2UpIDogZmlsdGVyXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSxcblxuICAgIGdyb3VwQnlMYWJlbCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdyb3VwQnkgPyAnbGFiZWwnIDogbnVsbFxuICAgIH0sXG5cbiAgICBncm91cEJ5T3B0aW9ucygpIHtcbiAgICAgIHJldHVybiB0aGlzLmdyb3VwQnkgPyAnb3B0aW9ucycgOiBudWxsXG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBnZXRPcHRpb25LZXkoa2V5KSB7XG4gICAgICBjb25zdCBbb3B0aW9uXSA9IHRoaXMuYWN0aXZlT3B0aW9uc1xuICAgICAgcmV0dXJuIGlzT2JqZWN0KG9wdGlvbikgJiYga2V5IGluIG9wdGlvbiA/IGtleSA6IG51bGxcbiAgICB9LFxuXG4gICAgcHJvY2Vzc09wdGlvbnMob3B0aW9ucykge1xuICAgICAgaWYgKG9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgIGlmICh0aGlzLnJlbGF0ZSkge1xuICAgICAgICAgIC8vIElmIGlkcyBhcmUgbWlzc2luZyBhbmQgd2Ugd2FudCB0byByZWxhdGUsIHNldCB0ZW1wb3JhcnkgaWRzLlxuICAgICAgICAgIC8vIE5PVEU6IFdlIG5lZWQgdG8gbW9kaWZ5IHRoZSBhY3R1YWwgZGF0YSwgbWFraW5nIGEgY29weSB3b24ndCB3b3JrXG4gICAgICAgICAgLy8gYXMgaXQgd29uJ3QgcHJvcGFnYXRlLlxuICAgICAgICAgIC8vIE5PVEU6IFRoaXMgb25seSBtYWtlcyBzZW5zZSBpZiB0aGUgZGF0YSBpcyBmcm9tIHRoZSBncmFwaCB0aGF0XG4gICAgICAgICAgLy8gd2UncmUgY3VycmVudGx5IGVkaXRpbmcuXG4gICAgICAgICAgZm9yIChjb25zdCBvcHRpb24gb2Ygb3B0aW9ucykge1xuICAgICAgICAgICAgaWYgKCEoJ2lkJyBpbiBvcHRpb24pKSB7XG4gICAgICAgICAgICAgIHNldFRlbXBvcmFyeUlkKG9wdGlvbiwgJ2lkJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZ3JvdXBCeSkge1xuICAgICAgICAgIGNvbnN0IGdyb3VwZWQgPSB7fVxuICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zLnJlZHVjZShcbiAgICAgICAgICAgIChyZXN1bHRzLCBvcHRpb24pID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgZ3JvdXAgPSBvcHRpb25bdGhpcy5ncm91cEJ5XVxuICAgICAgICAgICAgICBsZXQgZW50cnkgPSBncm91cGVkW2dyb3VwXVxuICAgICAgICAgICAgICBpZiAoIWVudHJ5KSB7XG4gICAgICAgICAgICAgICAgZW50cnkgPSBncm91cGVkW2dyb3VwXSA9IHtcbiAgICAgICAgICAgICAgICAgIFt0aGlzLmdyb3VwQnlMYWJlbF06IGdyb3VwLFxuICAgICAgICAgICAgICAgICAgW3RoaXMuZ3JvdXBCeU9wdGlvbnNdOiBbXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2goZW50cnkpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZW50cnkub3B0aW9ucy5wdXNoKG9wdGlvbilcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHNcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbXVxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG9wdGlvbnNcbiAgICB9LFxuXG4gICAgaGFzT3B0aW9uKG9wdGlvbikge1xuICAgICAgcmV0dXJuICEhdGhpcy5nZXRPcHRpb25Gb3JWYWx1ZSh0aGlzLmdldFZhbHVlRm9yT3B0aW9uKG9wdGlvbikpXG4gICAgfSxcblxuICAgIGdldE9wdGlvbkZvclZhbHVlKHZhbHVlKSB7XG4gICAgICBjb25zdCBmaW5kT3B0aW9uID0gKG9wdGlvbnMsIHZhbHVlLCBncm91cEJ5KSA9PiB7XG4gICAgICAgIC8vIFNlYXJjaCBmb3IgdGhlIG9wdGlvbiBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gdmFsdWUgYW5kIHJldHVybiB0aGVcbiAgICAgICAgLy8gd2hvbGUgb2JqZWN0LlxuICAgICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBvcHRpb25zKSB7XG4gICAgICAgICAgaWYgKGdyb3VwQnkpIHtcbiAgICAgICAgICAgIGNvbnN0IGZvdW5kID0gZmluZE9wdGlvbihvcHRpb24ub3B0aW9ucywgdmFsdWUsIG51bGwpXG4gICAgICAgICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gdGhpcy5nZXRWYWx1ZUZvck9wdGlvbihvcHRpb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9uXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLm9wdGlvblZhbHVlXG4gICAgICAgID8gZmluZE9wdGlvbih0aGlzLmFjdGl2ZU9wdGlvbnMsIHZhbHVlLCB0aGlzLmdyb3VwQnkpXG4gICAgICAgIDogdmFsdWVcbiAgICB9LFxuXG4gICAgZ2V0VmFsdWVGb3JPcHRpb24ob3B0aW9uKSB7XG4gICAgICBjb25zdCB7IG9wdGlvblZhbHVlIH0gPSB0aGlzXG4gICAgICByZXR1cm4gaXNTdHJpbmcob3B0aW9uVmFsdWUpXG4gICAgICAgID8gb3B0aW9uPy5bb3B0aW9uVmFsdWVdXG4gICAgICAgIDogaXNGdW5jdGlvbihvcHRpb25WYWx1ZSlcbiAgICAgICAgICA/IG9wdGlvblZhbHVlLmNhbGwodGhpcywgbmV3IERpdG9Db250ZXh0KHRoaXMsIHsgb3B0aW9uIH0pKVxuICAgICAgICAgIDogb3B0aW9uXG4gICAgfSxcblxuICAgIGdldExhYmVsRm9yT3B0aW9uKG9wdGlvbikge1xuICAgICAgY29uc3QgeyBvcHRpb25MYWJlbCB9ID0gdGhpc1xuICAgICAgcmV0dXJuIGlzU3RyaW5nKG9wdGlvbkxhYmVsKVxuICAgICAgICA/IG9wdGlvbj8uW29wdGlvbkxhYmVsXVxuICAgICAgICA6IGlzRnVuY3Rpb24ob3B0aW9uTGFiZWwpXG4gICAgICAgICAgPyBvcHRpb25MYWJlbC5jYWxsKHRoaXMsIG5ldyBEaXRvQ29udGV4dCh0aGlzLCB7IG9wdGlvbiB9KSlcbiAgICAgICAgICA6IGxhYmVsaXplKGAke29wdGlvbn1gKVxuICAgIH1cbiAgfSxcblxuICBwcm9jZXNzVmFsdWUoc2NoZW1hLCB2YWx1ZSwgZGF0YVBhdGgsIGdyYXBoKSB7XG4gICAgaWYgKHNjaGVtYS5yZWxhdGUpIHtcbiAgICAgIC8vIEZvciBpbnRlcm5hbGx5IHJlbGF0aW5nIGRhdGEgKGBzY2hlbWEub3B0aW9ucy5kYXRhUGF0aGApLCB3ZSBuZWVkIHRvXG4gICAgICAvLyBwcm9jZXNzIGJvdGggdGhlIG9wdGlvbnMgKGZvciAnI3JlZicpIGFuZCB0aGUgdmFsdWUgKCcjaWQnKS5cbiAgICAgIC8vIFNlZSBgRGF0YU1peGluLmhhbmRsZURhdGFTY2hlbWEoKWA6XG4gICAgICBjb25zdCBwYXRoID0gc2NoZW1hLm9wdGlvbnM/LmRhdGFQYXRoXG4gICAgICBjb25zdCByZWxhdGVkRGF0YVBhdGggPSBwYXRoXG4gICAgICAgID8gbm9ybWFsaXplRGF0YVBhdGgoYCR7ZGF0YVBhdGh9LyR7cGF0aH1gKVxuICAgICAgICA6IG51bGxcbiAgICAgIGdyYXBoLmFkZFJlbGF0aW9uKGRhdGFQYXRoLCByZWxhdGVkRGF0YVBhdGgsIHNjaGVtYSlcbiAgICAgIGlmIChyZWxhdGVkRGF0YVBhdGgpIHtcbiAgICAgICAgZ3JhcGguc2V0U291cmNlUmVsYXRlZChyZWxhdGVkRGF0YVBhdGgpXG4gICAgICB9XG4gICAgICAvLyBDb252ZXJ0IHJlbGF0aW5nIG9iamVjdHMgdG8gYSBzaGFsbG93IGNvcHkgd2l0aCBvbmx5IHRoZSBpZCBsZWZ0LlxuICAgICAgLy8gVE9ETzogQ29udmVydCB0byB1c2luZyBgcmVsYXRlQnlgOlxuICAgICAgY29uc3QgcHJvY2Vzc1JlbGF0ZSA9IHZhbHVlID0+ICh2YWx1ZSA/IHsgaWQ6IHZhbHVlLmlkIH0gOiB2YWx1ZSlcbiAgICAgIC8vIFNlbGVjdGVkIG9wdGlvbnMgY2FuIGJlIGJvdGggb2JqZWN0cyAmIGFycmF5cywgZS5nLiAnY2hlY2tib3hlcyc6XG4gICAgICB2YWx1ZSA9IGlzQXJyYXkodmFsdWUpXG4gICAgICAgID8gdmFsdWUubWFwKHByb2Nlc3NSZWxhdGUpXG4gICAgICAgIDogcHJvY2Vzc1JlbGF0ZSh2YWx1ZSlcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cbn1cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG51bC5kaXRvLWNoZWNrYm94ZXMoXG4gIDppZD1cImRhdGFQYXRoXCJcbiAgOmNsYXNzPVwiYGRpdG8tbGF5b3V0LSR7c2NoZW1hLmxheW91dCB8fCAndmVydGljYWwnfWBcIlxuKVxuICBsaShcbiAgICB2LWZvcj1cIm9wdGlvbiBpbiBvcHRpb25zXCJcbiAgKVxuICAgIGxhYmVsXG4gICAgICBpbnB1dC5kaXRvLWNoZWNrYm94KFxuICAgICAgICByZWY9XCJlbGVtZW50XCJcbiAgICAgICAgdi1tb2RlbD1cInNlbGVjdGVkT3B0aW9uc1wiXG4gICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgIDp2YWx1ZT1cImdldFZhbHVlRm9yT3B0aW9uKG9wdGlvbilcIlxuICAgICAgICB2LWJpbmQ9XCJhdHRyaWJ1dGVzXCJcbiAgICAgIClcbiAgICAgIHwge3sgZ2V0TGFiZWxGb3JPcHRpb24ob3B0aW9uKSB9fVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcbmltcG9ydCBPcHRpb25zTWl4aW4gZnJvbSAnLi4vbWl4aW5zL09wdGlvbnNNaXhpbi5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKCdjaGVja2JveGVzJywge1xuICBtaXhpbnM6IFtPcHRpb25zTWl4aW5dLFxuXG4gIG5hdGl2ZUZpZWxkOiB0cnVlLFxuICBkZWZhdWx0VmFsdWU6IFtdLFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgc2VsZWN0ZWRPcHRpb25zOiB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5zZWxlY3RlZFZhbHVlIHx8IFtdKS5maWx0ZXIodmFsdWUgPT4gdmFsdWUpXG4gICAgICB9LFxuXG4gICAgICBzZXQob3B0aW9uKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZSA9IG9wdGlvbiB8fCBbXVxuICAgICAgfVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLWNoZWNrYm94ZXMge1xuICBsYWJlbCB7XG4gICAgQGV4dGVuZCAlaW5wdXQtYm9yZGVybGVzcztcbiAgfVxuXG4gIC5kaXRvLWNoZWNrYm94IHtcbiAgICBtYXJnaW4tcmlnaHQ6ICRmb3JtLXNwYWNpbmc7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tY29kZShcbiAgOmlkPVwiZGF0YVBhdGhcIlxuICByZWY9XCJjb2RlXCJcbiAgOnN0eWxlPVwic3R5bGVcIlxuKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcbmltcG9ydCBEb21NaXhpbiBmcm9tICcuLi9taXhpbnMvRG9tTWl4aW4uanMnXG5pbXBvcnQgQ29kZUZsYXNrIGZyb20gJ2NvZGVmbGFzaydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKCdjb2RlJywge1xuICBtaXhpbnM6IFtEb21NaXhpbl0sXG4gIGFsaWduQm90dG9tOiBmYWxzZSxcblxuICBjb21wdXRlZDoge1xuICAgIGxpbmVzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hLmxpbmVzIHx8IDNcbiAgICB9LFxuXG4gICAgc3R5bGUoKSB7XG4gICAgICByZXR1cm4gYGhlaWdodDogY2FsYygke3RoaXMubGluZXN9ZW0gKiB2YXIoLS1saW5lLWhlaWdodCkpYFxuICAgIH1cbiAgfSxcblxuICBtb3VudGVkKCkge1xuICAgIGNvbnN0IGZsYXNrID0gbmV3IENvZGVGbGFzayh0aGlzLiRyZWZzLmNvZGUsIHtcbiAgICAgIGxhbmd1YWdlOiB0aGlzLnNjaGVtYS5sYW5ndWFnZSB8fCAnamF2YXNjcmlwdCcsXG4gICAgICB0YWJTaXplOiB0aGlzLnNjaGVtYS5pbmRlbnRTaXplIHx8IDIsXG4gICAgICBsaW5lTnVtYmVyczogZmFsc2VcbiAgICB9KVxuXG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZVxuICAgIGxldCBpZ25vcmVXYXRjaCA9IGZhbHNlXG4gICAgbGV0IGlnbm9yZVVwZGF0ZSA9IGZhbHNlXG5cbiAgICBjb25zdCBvbkNoYW5nZSA9ICgpID0+IHtcbiAgICAgIGlmICghdGhpcy5mb2N1c2VkICYmIGNoYW5nZWQpIHtcbiAgICAgICAgY2hhbmdlZCA9IGZhbHNlXG4gICAgICAgIHRoaXMub25DaGFuZ2UoKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG9uRm9jdXMgPSAoKSA9PiB0aGlzLm9uRm9jdXMoKVxuXG4gICAgY29uc3Qgb25CbHVyID0gKCkgPT4ge1xuICAgICAgdGhpcy5vbkJsdXIoKVxuICAgICAgb25DaGFuZ2UoKVxuICAgIH1cblxuICAgIHRoaXMuZG9tT24odGhpcy4kcmVmcy5jb2RlLnF1ZXJ5U2VsZWN0b3IoJ3RleHRhcmVhJyksIHtcbiAgICAgIGZvY3VzOiBvbkZvY3VzLFxuICAgICAgYmx1cjogb25CbHVyXG4gICAgfSlcblxuICAgIGNvbnN0IHNldENvZGUgPSBjb2RlID0+IHtcbiAgICAgIGlmIChjb2RlICE9PSBmbGFzay5jb2RlKSB7XG4gICAgICAgIGlnbm9yZVVwZGF0ZSA9IHRydWVcbiAgICAgICAgZmxhc2sudXBkYXRlQ29kZShjb2RlKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHNldFZhbHVlID0gdmFsdWUgPT4ge1xuICAgICAgaWYgKHZhbHVlICE9PSB0aGlzLnZhbHVlKSB7XG4gICAgICAgIGlnbm9yZVdhdGNoID0gdHJ1ZVxuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWVcbiAgICAgICAgY2hhbmdlZCA9IHRydWVcbiAgICAgICAgb25DaGFuZ2UoKVxuICAgICAgfVxuICAgIH1cblxuICAgIGZsYXNrLm9uVXBkYXRlKHZhbHVlID0+IHtcbiAgICAgIGlmIChpZ25vcmVVcGRhdGUpIHtcbiAgICAgICAgaWdub3JlVXBkYXRlID0gZmFsc2VcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldFZhbHVlKHZhbHVlKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICB0aGlzLiR3YXRjaCgndmFsdWUnLCB2YWx1ZSA9PiB7XG4gICAgICBpZiAoaWdub3JlV2F0Y2gpIHtcbiAgICAgICAgaWdub3JlV2F0Y2ggPSBmYWxzZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0Q29kZSh2YWx1ZSB8fCAnJylcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgc2V0Q29kZSh0aGlzLnZhbHVlIHx8ICcnKVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBmb2N1c0VsZW1lbnQoKSB7XG4gICAgICB0aGlzLiRlbC5xdWVyeVNlbGVjdG9yKCd0ZXh0YXJlYScpPy5mb2N1cygpXG4gICAgfVxuICB9XG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tY29kZSB7XG4gIEBleHRlbmQgJWlucHV0O1xuXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgLy8gRm9yIHByb3BlciBzaXppbmcgb2YgY29udGVudCBhbG9uZyB3aXRoIDpzdHlsZT1cInN0eWxlXCIgc2V0dGluZyBhYm92ZSxcbiAgLy8gZm9yIHByb3BlciBsaW5lLWhlaWdodCBjYWxjdWxhdGlvbi5cbiAgcGFkZGluZzogJGlucHV0LXBhZGRpbmc7XG5cbiAgLmNvZGVmbGFzayB7XG4gICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAvLyBJZ25vcmUgdGhlIHBhcmVudCBwYWRkaW5nIGRlZmluZWQgYWJvdmUgd2hpY2ggaXMgb25seSBuZWVkZWQgdG8gc2V0XG4gICAgLy8gdGhlIGRlc2lyZWQgaGVpZ2h0IHdpdGggOnN0eWxlPVwic3R5bGVcIi5cbiAgICB0b3A6IDA7XG4gICAgbGVmdDogMDtcbiAgfVxuXG4gIC5jb2RlZmxhc2tfX3RleHRhcmVhLFxuICAuY29kZWZsYXNrX19wcmUge1xuICAgIC8vIFVzZSBzYW1lIHBhZGRpbmcgYXMgLmRpdG8tY29kZVxuICAgIHBhZGRpbmc6ICRpbnB1dC1wYWRkaW5nO1xuICB9XG5cbiAgLmNvZGVmbGFza19fdGV4dGFyZWEsXG4gIC5jb2RlZmxhc2tfX2NvZGUsXG4gIC5jb2RlZmxhc2tfX2xpbmVzIHtcbiAgICBmb250LWZhbWlseTogJGZvbnQtZmFtaWx5LW1vbm87XG4gICAgZm9udC1zaXplOiB2YXIoLS1mb250LXNpemUpO1xuICAgIGxpbmUtaGVpZ2h0OiB2YXIoLS1saW5lLWhlaWdodCk7XG4gIH1cblxuICAuY29kZWZsYXNrX19saW5lcyB7XG4gICAgcGFkZGluZzogJGlucHV0LXBhZGRpbmc7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuVHJpZ2dlci5kaXRvLWNvbG9yKFxuICB2LW1vZGVsOnNob3c9XCJzaG93UG9wdXBcIlxuICB0cmlnZ2VyPVwiY2xpY2tcIlxuKVxuICB0ZW1wbGF0ZSgjdHJpZ2dlcilcbiAgICAuZGl0by1pbnB1dCg6Y2xhc3M9XCJ7ICdkaXRvLWZvY3VzJzogc2hvd1BvcHVwIH1cIilcbiAgICAgIGlucHV0KFxuICAgICAgICA6aWQ9XCJkYXRhUGF0aFwiXG4gICAgICAgIHJlZj1cImVsZW1lbnRcIlxuICAgICAgICB2LW1vZGVsPVwiaGV4VmFsdWVcIlxuICAgICAgICB0eXBlPVwiaW5wdXRcIlxuICAgICAgICBzaXplPVwiOFwiXG4gICAgICAgIHYtYmluZD1cImF0dHJpYnV0ZXNcIlxuICAgICAgKVxuICAgICAgLmRpdG8tY29sb3ItcHJldmlldy5kaXRvLWluaGVyaXQtZm9jdXMoXG4gICAgICAgIHYtaWY9XCJ2YWx1ZVwiXG4gICAgICApXG4gICAgICAgIGRpdig6c3R5bGU9XCJ7IGJhY2tncm91bmQ6IGAjJHtoZXhWYWx1ZSB8fCAnMDAwMDAwMDAnfWAgfVwiKVxuICAgICAgYnV0dG9uLmRpdG8tYnV0dG9uLWNsZWFyLmRpdG8tYnV0dG9uLW92ZXJsYXkoXG4gICAgICAgIHYtaWY9XCJzaG93Q2xlYXJCdXR0b25cIlxuICAgICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gICAgICAgIEBjbGljay5zdG9wPVwiY2xlYXJcIlxuICAgICAgKVxuICB0ZW1wbGF0ZSgjcG9wdXApXG4gICAgU2tldGNoUGlja2VyLmRpdG8tY29sb3ItcGlja2VyKFxuICAgICAgdi1tb2RlbD1cImNvbG9yVmFsdWVcIlxuICAgICAgOmRpc2FibGVBbHBoYT1cIiFhbHBoYVwiXG4gICAgICA6ZGlzYWJsZUZpZWxkcz1cIiFpbnB1dHNcIlxuICAgICAgOnByZXNldENvbG9ycz1cInByZXNldHNcIlxuICAgIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgdGlueWNvbG9yIGZyb20gJ3Rpbnljb2xvcjInXG5pbXBvcnQgeyBTa2V0Y2ggYXMgU2tldGNoUGlja2VyIH0gZnJvbSAnQGxrNzcvdnVlMy1jb2xvcidcbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcbmltcG9ydCB7IFRyaWdnZXIgfSBmcm9tICdAZGl0b2pzL3VpL3NyYydcbmltcG9ydCB7IGdldFNjaGVtYUFjY2Vzc29yIH0gZnJvbSAnLi4vdXRpbHMvYWNjZXNzb3IuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvVHlwZUNvbXBvbmVudC5yZWdpc3RlcignY29sb3InLCB7XG4gIGNvbXBvbmVudHM6IHsgVHJpZ2dlciwgU2tldGNoUGlja2VyIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2hvd1BvcHVwOiBmYWxzZSxcbiAgICAgIGNvbnZlcnRlZEhleFZhbHVlOiBudWxsXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgY29sb3JWYWx1ZToge1xuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZSB8fCB7fVxuICAgICAgfSxcblxuICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGZvcm1hdCA9IHRoaXMuY29sb3JGb3JtYXRcbiAgICAgICAgY29uc3Qga2V5ID0gKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC8vIE5PVEU6IHZ1ZTMtY29sb3IgY2FsbHMgaXQgJ2hleCcsIHdoaWxlIHRpbnljb2xvciBjYWxscyBpdCAnaGV4NidcbiAgICAgICAgICAgIGhleDogdmFsdWU/LmEgPCAxID8gJ2hleDgnIDogJ2hleCcsXG4gICAgICAgICAgICByZ2I6ICdyZ2JhJ1xuICAgICAgICAgIH1bZm9ybWF0XSB8fFxuICAgICAgICAgIGZvcm1hdFxuICAgICAgICApXG4gICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWVba2V5XVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudmFsdWUgPSB0aW55Y29sb3IodmFsdWUpLnRvU3RyaW5nKGZvcm1hdClcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uQ2hhbmdlKClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgaGV4VmFsdWU6IHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgaWYgKHRoaXMudmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgIC8vIFRPRE86IEZpeCBzaWRlLWVmZmVjdHNcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdnVlL25vLXNpZGUtZWZmZWN0cy1pbi1jb21wdXRlZC1wcm9wZXJ0aWVzXG4gICAgICAgICAgdGhpcy5jb252ZXJ0ZWRIZXhWYWx1ZSA9IG51bGxcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5mb2N1c2VkKSB7XG4gICAgICAgICAgY29uc3QgY29sb3IgPSB0aW55Y29sb3IodGhpcy52YWx1ZSlcbiAgICAgICAgICBpZiAoY29sb3IuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICAvLyBUT0RPOiBGaXggc2lkZS1lZmZlY3RzXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgICAgIHRoaXMuY29udmVydGVkSGV4VmFsdWUgPSBjb2xvclxuICAgICAgICAgICAgICAudG9TdHJpbmcoY29sb3IuZ2V0QWxwaGEoKSA8IDEgPyAnaGV4OCcgOiAnaGV4NicpXG4gICAgICAgICAgICAgIC5zbGljZSgxKVxuICAgICAgICAgICAgICAudG9VcHBlckNhc2UoKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jb252ZXJ0ZWRIZXhWYWx1ZVxuICAgICAgfSxcblxuICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgIHRoaXMuY29udmVydGVkSGV4VmFsdWUgPSB2YWx1ZVxuICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBUT0RPOiBgZm9ybWF0YCBjbGFzaGVzIHdpdGggVHlwZU1peGluLmZvcm1hdCgpYCwgd2hpY2ggc2hhbGwgYmUgcmVuYW1lZFxuICAgIC8vIHNvb24gdG8gYGZvcm1hdFZhbHVlKClgLiBSZW5hbWUgYGNvbG9yRm9ybWF0YCBiYWNrIHRvIGBmb3JtYXRgIGFmdGVyLlxuICAgIGNvbG9yRm9ybWF0OiBnZXRTY2hlbWFBY2Nlc3NvcignZm9ybWF0Jywge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJ2hleCdcbiAgICB9KSxcblxuICAgIC8vIFRPRE86IFJlbmFtZSB0byBgc2hvd0FscGhhYD9cbiAgICBhbHBoYTogZ2V0U2NoZW1hQWNjZXNzb3IoJ2FscGhhJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSksXG5cbiAgICAvLyBUT0RPOiBSZW5hbWUgdG8gYHNob3dJbnB1dHNgP1xuICAgIGlucHV0czogZ2V0U2NoZW1hQWNjZXNzb3IoJ2lucHV0cycsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfSksXG5cbiAgICBwcmVzZXRzOiBnZXRTY2hlbWFBY2Nlc3NvcigncHJlc2V0cycsIHtcbiAgICAgIHR5cGU6IEFycmF5LFxuICAgICAgZGVmYXVsdDogW1xuICAgICAgICAnI2ZmZmZmZicsXG4gICAgICAgICcjYzNjM2MzJyxcbiAgICAgICAgJyM3ZjdmN2YnLFxuICAgICAgICAnIzAwMDAwMCcsXG4gICAgICAgICcjODgwMDE1JyxcbiAgICAgICAgJyNlZDFjMjQnLFxuICAgICAgICAnI2ZmN2YyNycsXG4gICAgICAgICcjZmZmMjAwJyxcblxuICAgICAgICAnIzIyYjE0YycsXG4gICAgICAgICcjMDBhMmU4JyxcbiAgICAgICAgJyMzZjQ4Y2MnLFxuICAgICAgICAnI2EzNDlhNCcsXG4gICAgICAgICcjYjk3YTU3JyxcbiAgICAgICAgJyNmZmFlYzknLFxuICAgICAgICAnI2ZmYzkwZScsXG4gICAgICAgICcjMDAwMDAwMDAnXG4gICAgICBdXG4gICAgfSlcbiAgfSxcblxuICB3YXRjaDoge1xuICAgIGZvY3VzZWQoZm9jdXNlZCkge1xuICAgICAgaWYgKCFmb2N1c2VkICYmIHRoaXMuY29udmVydGVkSGV4VmFsdWUpIHtcbiAgICAgICAgY29uc3QgY29sb3IgPSB0aW55Y29sb3IoYCMke3RoaXMuY29udmVydGVkSGV4VmFsdWV9YClcbiAgICAgICAgaWYgKGNvbG9yPy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gY29sb3IudG9TdHJpbmcodGhpcy5jb2xvckZvcm1hdClcbiAgICAgICAgICAvLyBUT0RPOiBFbWl0ICdpbnB1dCcgaGVyZSBpbnN0ZWFkLCBhbmQgJ2NoYW5nZScgaW4gYmx1ciwgbGlrZSBvdGhlcnMuXG4gICAgICAgICAgdGhpcy5vbkNoYW5nZSgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4kY29sb3Itc3dhdGNoLXdpZHRoOiAkcGF0dGVybi10cmFuc3BhcmVuY3ktc2l6ZTtcbiRjb2xvci1zd2F0Y2gtcmFkaXVzOiAkYm9yZGVyLXJhZGl1cyAtICRib3JkZXItd2lkdGg7XG5cbi5kaXRvLWNvbG9yIHtcbiAgLmRpdG8taW5wdXQge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcblxuICAgIGlucHV0IHtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zO1xuICAgICAgcGFkZGluZy1yaWdodDogJGNvbG9yLXN3YXRjaC13aWR0aDtcbiAgICB9XG4gIH1cblxuICAuZGl0by1idXR0b24tY2xlYXIge1xuICAgIG1hcmdpbi1yaWdodDogJGNvbG9yLXN3YXRjaC13aWR0aDtcbiAgfVxuXG4gIC5kaXRvLWNvbG9yLXBpY2tlciB7XG4gICAgbWFyZ2luOiAkcG9wdXAtbWFyZ2luO1xuICAgIGJvcmRlcjogJGJvcmRlci1zdHlsZTtcbiAgICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcbiAgICBiYWNrZ3JvdW5kOiAkY29sb3Itd2hpdGU7XG4gICAgYm94LXNoYWRvdzogJHNoYWRvdy13aW5kb3c7XG4gIH1cblxuICAuZGl0by1jb2xvci1wcmV2aWV3IHtcbiAgICBiYWNrZ3JvdW5kOiAkcGF0dGVybi10cmFuc3BhcmVuY3k7XG4gICAgYm9yZGVyLWxlZnQ6ICRib3JkZXItc3R5bGU7XG5cbiAgICAmLFxuICAgIGRpdiB7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICB3aWR0aDogJGNvbG9yLXN3YXRjaC13aWR0aDtcbiAgICAgIHRvcDogMDtcbiAgICAgIHJpZ2h0OiAwO1xuICAgICAgYm90dG9tOiAwO1xuICAgICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6ICRjb2xvci1zd2F0Y2gtcmFkaXVzO1xuICAgICAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6ICRjb2xvci1zd2F0Y2gtcmFkaXVzO1xuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG5jb21wb25lbnQoXG4gIDppcz1cInNjaGVtYS5jb21wb25lbnRcIlxuICB2LWJpbmQ9XCIkcHJvcHNcIlxuKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbi8vIFRoaXMgaXMgdGhlIGdlbmVyYWwgcHVycG9zZSAnY29tcG9uZW50JyB0eXBlLCB3aGljaCBjYW4gcmVzb2x2ZSB0byBhbnkgY3VzdG9tXG4vLyBjb21wb25lbnQgdGhyb3VnaCBgc2NoZW1hLmNvbXBvbmVudGAsIHNlZSBgcmVzb2x2ZVNjaGVtYUNvbXBvbmVudCgpYC4gVGhpc1xuLy8gY2FuIGJlIHVzZWQgdG8gbmVzdCBhcmJpdHJhcnkgdnVlIGNvbXBvbmVudHMgaW4gc2NoZW1hOlxuLy8ge1xuLy8gICB0eXBlOiAnY29tcG9uZW50Jyxcbi8vICAgY29tcG9uZW50OiBpbXBvcnQoJy4vY29tcG9uZW50Jylcbi8vIH1cblxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IHsgcmVzb2x2ZVNjaGVtYUNvbXBvbmVudCB9IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKCdjb21wb25lbnQnLCB7XG4gIC8vIE92ZXJyaWRlIHRoZSBzdGFuZGFyZCBgZGVmYXVsdFZhbHVlOiBudWxsYCB0byBub3Qgc2V0IGFueSBkYXRhIGZvciBjdXN0b21cbiAgLy8gY29tcG9uZW50cywgdW5sZXNzIHRoZXkgcHJvdmlkZSBhIGRlZmF1bHQgdmFsdWUuXG4gIGRlZmF1bHRWYWx1ZTogKCkgPT4gdW5kZWZpbmVkLCAvLyBDYWxsYmFjayB0byBvdmVycmlkZSBgZGVmYXVsdFZhbHVlOiBudWxsYFxuICBhbGlnbkJvdHRvbTogZmFsc2UsXG4gIGlnbm9yZU1pc3NpbmdWYWx1ZTogc2NoZW1hID0+ICEoJ2RlZmF1bHQnIGluIHNjaGVtYSksXG5cbiAgYXN5bmMgcHJvY2Vzc1NjaGVtYShhcGksIHNjaGVtYSkge1xuICAgIGF3YWl0IHJlc29sdmVTY2hlbWFDb21wb25lbnQoc2NoZW1hKVxuICB9XG59KVxuPC9zY3JpcHQ+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLy8tIFRPRE86IEZpbmQgYSBiZXR0ZXIgd2F5IHRvIHRyaWdnZXIgZXZhbHVhdGlvbiBvZiBgdmFsdWVgIHRoYXQgZG9zZSBub3Rcbi8vLSBpbnZvbHZlIGFjdHVhbGx5IHJlbmRlcmluZyBpdCB3aGVuIHRoZSBjb21wb25lbnQgaXMgbm90IHZpc2libGUuXG5pbnB1dC5kaXRvLXRleHQuZGl0by1pbnB1dChcbiAgOmlkPVwiZGF0YVBhdGhcIlxuICByZWY9XCJlbGVtZW50XCJcbiAgOm5hbWU9XCJuYW1lXCJcbiAgdHlwZT1cInRleHRcIlxuICA6dmFsdWU9XCJ2YWx1ZVwiXG4gIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgOnJlYWRvbmx5PVwidHJ1ZVwiXG4pXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IFR5cGVNaXhpbiBmcm9tICcuLi9taXhpbnMvVHlwZU1peGluLmpzJ1xuaW1wb3J0IERhdGFNaXhpbiBmcm9tICcuLi9taXhpbnMvRGF0YU1peGluLmpzJ1xuXG5leHBvcnQgZGVmYXVsdCBEaXRvVHlwZUNvbXBvbmVudC5yZWdpc3RlcihcbiAgWydjb21wdXRlZCcsICdkYXRhJywgJ2hpZGRlbiddLFxuICAvLyBAdnVlL2NvbXBvbmVudFxuICB7XG4gICAgbWl4aW5zOiBbRGF0YU1peGluXSxcblxuICAgIGRlZmF1bHRWYWx1ZTogKCkgPT4gdW5kZWZpbmVkLCAvLyBDYWxsYmFjayB0byBvdmVycmlkZSBgZGVmYXVsdFZhbHVlOiBudWxsYFxuICAgIGRlZmF1bHRWaXNpYmxlOiBmYWxzZSxcblxuICAgIGNvbXB1dGVkOiB7XG4gICAgICB2YWx1ZToge1xuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgY29uc3QgeyBzY2hlbWEgfSA9IHRoaXNcbiAgICAgICAgICBpZiAoc2NoZW1hLmRhdGEgfHwgc2NoZW1hLmRhdGFQYXRoKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuaGFuZGxlRGF0YVNjaGVtYShzY2hlbWEsICdzY2hlbWEnLCB7XG4gICAgICAgICAgICAgIC8vIE1vZGlmeWluZyBgdGhpcy5kYXRhYCBiZWxvdyB0cmlnZ2VycyBhbm90aGVyIGNhbGwgb2YgdGhlXG4gICAgICAgICAgICAgIC8vIGB2YWx1ZWAgZ2V0dGVyLCBzbyB1c2UgYSB2YWx1ZSBvZiAyIGZvciBgcmVzb2x2ZUNvdW50ZXJgIHRvXG4gICAgICAgICAgICAgIC8vIHJldHVybiB0aGUgcmVzb2x2ZWQgZGF0YSB0d2ljZS5cbiAgICAgICAgICAgICAgcmVzb2x2ZUNvdW50ZXI6IDJcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAvLyBUT0RPOiBGaXggc2lkZS1lZmZlY3RzXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgICAgIHRoaXMuZGF0YVt0aGlzLm5hbWVdID0gdmFsdWVcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFR5cGVNaXhpbi5jb21wdXRlZC52YWx1ZS5nZXQuY2FsbCh0aGlzKVxuICAgICAgICB9LFxuXG4gICAgICAgIHNldCh2YWx1ZSkge1xuICAgICAgICAgIFR5cGVNaXhpbi5jb21wdXRlZC52YWx1ZS5zZXQuY2FsbCh0aGlzLCB2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuKVxuPC9zY3JpcHQ+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tZGF0ZVxuICBjb21wb25lbnQoXG4gICAgOmlzPVwiZ2V0Q29tcG9uZW50KHR5cGUpXCJcbiAgICA6aWQ9XCJkYXRhUGF0aFwiXG4gICAgcmVmPVwiZWxlbWVudFwiXG4gICAgdi1tb2RlbD1cImRhdGVWYWx1ZVwiXG4gICAgOmxvY2FsZT1cImxvY2FsZVwiXG4gICAgOmRhdGVGb3JtYXQ9XCJ7IC4uLmFwaS5mb3JtYXRzLmRhdGUsIC4uLmRhdGVGb3JtYXQgfVwiXG4gICAgdi1iaW5kPVwiYXR0cmlidXRlc1wiXG4gIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b1R5cGVDb21wb25lbnQgZnJvbSAnLi4vRGl0b1R5cGVDb21wb25lbnQuanMnXG5pbXBvcnQgeyBnZXRTY2hlbWFBY2Nlc3NvciB9IGZyb20gJy4uL3V0aWxzL2FjY2Vzc29yLmpzJ1xuaW1wb3J0IHsgRGF0ZVBpY2tlciwgVGltZVBpY2tlciwgRGF0ZVRpbWVQaWNrZXIgfSBmcm9tICdAZGl0b2pzL3VpL3NyYydcbmltcG9ydCB7IGlzRGF0ZSB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKFxuICBbJ2RhdGUnLCAnZGF0ZXRpbWUnLCAndGltZSddLFxuICAvLyBAdnVlL2NvbXBvbmVudFxuICB7XG4gICAgY29tcG9uZW50czogeyBEYXRlUGlja2VyLCBUaW1lUGlja2VyLCBEYXRlVGltZVBpY2tlciB9LFxuICAgIC8vIFRPRE86IFRoaXMgaXMgb25seSBoZXJlIHNvIHdlIGdldCBwbGFjZWhvbGRlciBhZGRlZC4gQ29tZSB1cCB3aXRoIGFcbiAgICAvLyBiZXR0ZXIgd2F5IHRvIHN1cHBvcnQgYXR0cmlidXRlcyBwZXIgY29tcG9uZW50IChhIGxpc3Qgb2YgYWN0dWFsbHlcbiAgICAvLyBzdXBwb3J0ZWQgYXR0cmlidXRlcylcbiAgICBuYXRpdmVGaWVsZDogdHJ1ZSxcbiAgICB0ZXh0RmllbGQ6IHRydWUsXG5cbiAgICBjb21wdXRlZDoge1xuICAgICAgZGF0ZVZhbHVlOiB7XG4gICAgICAgIGdldCgpIHtcbiAgICAgICAgICBjb25zdCB7IHZhbHVlIH0gPSB0aGlzXG4gICAgICAgICAgcmV0dXJuIHZhbHVlID8gbmV3IERhdGUodmFsdWUpIDogdmFsdWVcbiAgICAgICAgfSxcblxuICAgICAgICBzZXQodmFsdWUpIHtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWVcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgZGF0ZUZvcm1hdDogZ2V0U2NoZW1hQWNjZXNzb3IoJ2RhdGVGb3JtYXQnLCB7XG4gICAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgICAgZGVmYXVsdDogbnVsbFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgbWV0aG9kczoge1xuICAgICAgZ2V0Q29tcG9uZW50KHR5cGUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkYXRlOiAnZGF0ZS1waWNrZXInLFxuICAgICAgICAgIHRpbWU6ICd0aW1lLXBpY2tlcicsXG4gICAgICAgICAgZGF0ZXRpbWU6ICdkYXRlLXRpbWUtcGlja2VyJ1xuICAgICAgICB9W3R5cGVdXG4gICAgICB9XG4gICAgfSxcblxuICAgIHByb2Nlc3NWYWx1ZShzY2hlbWEsIHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNEYXRlKHZhbHVlKSA/IHZhbHVlLnRvSVNPU3RyaW5nKCkgOiB2YWx1ZVxuICAgIH1cbiAgfVxuKVxuPC9zY3JpcHQ+XG4iLCJpbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuaW1wb3J0IFJlc291cmNlTWl4aW4gZnJvbSAnLi9SZXNvdXJjZU1peGluLmpzJ1xuaW1wb3J0IFNjaGVtYVBhcmVudE1peGluIGZyb20gJy4uL21peGlucy9TY2hlbWFQYXJlbnRNaXhpbi5qcydcbmltcG9ydCB7IGdldFNjaGVtYUFjY2Vzc29yLCBnZXRTdG9yZUFjY2Vzc29yIH0gZnJvbSAnLi4vdXRpbHMvYWNjZXNzb3IuanMnXG5pbXBvcnQgeyBnZXRNZW1iZXJSZXNvdXJjZSB9IGZyb20gJy4uL3V0aWxzL3Jlc291cmNlLmpzJ1xuaW1wb3J0IHtcbiAgcHJvY2Vzc1JvdXRlU2NoZW1hLFxuICBwcm9jZXNzRm9ybXMsXG4gIGdldE5hbWVkU2NoZW1hcyxcbiAgZ2V0QnV0dG9uU2NoZW1hcyxcbiAgaGFzRm9ybVNjaGVtYSxcbiAgZ2V0Rm9ybVNjaGVtYXMsXG4gIGdldFZpZXdTY2hlbWEsXG4gIGlzQ29tcGFjdCxcbiAgaXNJbmxpbmVkLFxuICBpc09iamVjdFNvdXJjZSxcbiAgaXNMaXN0U291cmNlXG59IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcbmltcG9ydCB7XG4gIGlzT2JqZWN0LFxuICBpc1N0cmluZyxcbiAgaXNBcnJheSxcbiAgaXNOdW1iZXIsXG4gIGVxdWFscyxcbiAgcGFyc2VEYXRhUGF0aCxcbiAgbm9ybWFsaXplRGF0YVBhdGhcbn0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgbWl4aW5zOiBbUmVzb3VyY2VNaXhpbiwgU2NoZW1hUGFyZW50TWl4aW5dLFxuXG4gIGRlZmF1bHRWYWx1ZShzY2hlbWEpIHtcbiAgICByZXR1cm4gaXNMaXN0U291cmNlKHNjaGVtYSkgPyBbXSA6IG51bGxcbiAgfSxcblxuICBwcm92aWRlKCkge1xuICAgIHJldHVybiB7XG4gICAgICAkc291cmNlQ29tcG9uZW50OiAoKSA9PiB0aGlzXG4gICAgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdyYXBwZWRQcmltaXRpdmVzOiBudWxsLFxuICAgICAgaWdub3JlUm91dGVDaGFuZ2U6IGZhbHNlLFxuICAgICAgdW53cmFwcGluZ1ByaW1pdGl2ZXM6IGZhbHNlXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgc291cmNlQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9LFxuXG4gICAgaXNPYmplY3RTb3VyY2UoKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RTb3VyY2UodGhpcy50eXBlKVxuICAgIH0sXG5cbiAgICBpc0xpc3RTb3VyY2UoKSB7XG4gICAgICByZXR1cm4gaXNMaXN0U291cmNlKHRoaXMudHlwZSlcbiAgICB9LFxuXG4gICAgLy8gQG92ZXJyaWRlIFJlc291cmNlTWl4aW4uaGFzRGF0YSgpXG4gICAgaGFzRGF0YSgpIHtcbiAgICAgIHJldHVybiAhIXRoaXMudmFsdWVcbiAgICB9LFxuXG4gICAgaXNSZWFkeSgpIHtcbiAgICAgIC8vIExpc3RzIHRoYXQgaGF2ZSBubyBkYXRhIGFuZCBubyBhc3NvY2lhdGVkIHJlc291cmNlIHNob3VsZCBzdGlsbCByZW5kZXIsXG4gICAgICAvLyBhcyB0aGV5IG1heSBiZSBnZXR0aW5nIHRoZWlyIGRhdGEgZWxzZXdoZXJlLCBlLmcuIGBjb21wdXRlKClgLlxuICAgICAgcmV0dXJuIHRoaXMuaGFzRGF0YSB8fCAhdGhpcy5wcm92aWRlc0RhdGFcbiAgICB9LFxuXG4gICAgaXNJblZpZXcoKSB7XG4gICAgICByZXR1cm4gISF0aGlzLnZpZXdDb21wb25lbnRcbiAgICB9LFxuXG4gICAgd3JhcFByaW1pdGl2ZXMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY2hlbWEud3JhcFByaW1pdGl2ZXNcbiAgICB9LFxuXG4gICAgbGlzdERhdGE6IHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgbGV0IGRhdGEgPSB0aGlzLnZhbHVlXG4gICAgICAgIGlmICh0aGlzLmlzT2JqZWN0U291cmNlKSB7XG4gICAgICAgICAgLy8gQ29udmVydCB0byBsaXN0IGFycmF5LlxuICAgICAgICAgIGRhdGEgPSBkYXRhICE9IG51bGwgPyBbZGF0YV0gOiBbXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIElmIGRhdGEgZ2V0cyBpbmhlcml0ZWQgZnJvbSBwYXJlbnQsIHVud3JhcHBpbmcgaXMgbm90IGhhcHBlbmluZ1xuICAgICAgICAgIC8vIGF0IHRoZSByb290IGluIGBzZXREYXRhKClgLCBidXQgaGVyZSBpbnN0ZWFkLlxuICAgICAgICAgIGRhdGEgPSB0aGlzLnVud3JhcExpc3REYXRhKGRhdGEpIHx8IGRhdGFcbiAgICAgICAgfVxuICAgICAgICBkYXRhIHx8PSBbXVxuICAgICAgICBjb25zdCB7IHdyYXBQcmltaXRpdmVzIH0gPSB0aGlzXG4gICAgICAgIGlmICh3cmFwUHJpbWl0aXZlcykge1xuICAgICAgICAgIGlmICh0aGlzLnVud3JhcHBpbmdQcmltaXRpdmVzKSB7XG4gICAgICAgICAgICAvLyBXZSdyZSBkb25lIHVud3JhcHBpbmcgb25jZSBgbGlzdERhdGFgIGlzIHJlZXZhbHVhdGVkLCBzbyBzZXRcbiAgICAgICAgICAgIC8vIHRoaXMgdG8gYGZhbHNlYCBhZ2Fpbi4gU2VlIGB3cmFwcGVkUHJpbWl0aXZlc2Agd2F0Y2hlciBhYm92ZS5cbiAgICAgICAgICAgIC8vIFRPRE86IEZpeCBzaWRlLWVmZmVjdHNcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICAgICAgdGhpcy51bndyYXBwaW5nUHJpbWl0aXZlcyA9IGZhbHNlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIENvbnZlcnQgZGF0YSB0byBhIGxpc3Qgb2Ygd3JhcHBlZCBwcmltaXRpdmVzLCBhbmQgcmV0dXJuIGl0LlxuICAgICAgICAgICAgLy8gVE9ETzogRml4IHNpZGUtZWZmZWN0c1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgICAgICB0aGlzLndyYXBwZWRQcmltaXRpdmVzID0gZGF0YS5tYXAodmFsdWUgPT4gKHtcbiAgICAgICAgICAgICAgW3dyYXBQcmltaXRpdmVzXTogdmFsdWVcbiAgICAgICAgICAgIH0pKVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhpcy53cmFwcGVkUHJpbWl0aXZlc1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhXG4gICAgICB9LFxuXG4gICAgICBzZXQoZGF0YSkge1xuICAgICAgICBpZiAodGhpcy53cmFwUHJpbWl0aXZlcykge1xuICAgICAgICAgIHRoaXMud3JhcHBlZFByaW1pdGl2ZXMgPSBkYXRhXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuaXNPYmplY3RTb3VyY2VcbiAgICAgICAgICAgID8gZGF0YSAmJiBkYXRhLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgPyBkYXRhWzBdXG4gICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICAgICAgOiBkYXRhXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgb2JqZWN0RGF0YToge1xuICAgICAgZ2V0KCkge1xuICAgICAgICAvLyBBbHdheXMgZ28gdGhyb3VnaCBgbGlzdERhdGFgIGludGVybmFsbHksIHdoaWNoIGRvZXMgYWxsIHRoZVxuICAgICAgICAvLyBwcm9jZXNzaW5nIG9mIGB3cmFwUHJpbWl0aXZlc2AsIGV0Yy5cbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdERhdGFbMF0gfHwgbnVsbFxuICAgICAgfSxcblxuICAgICAgc2V0KGRhdGEpIHtcbiAgICAgICAgdGhpcy5saXN0RGF0YSA9IGRhdGEgPyBbZGF0YV0gOiBbXVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzb3VyY2VTY2hlbWEoKSB7XG4gICAgICAvLyBUaGUgc291cmNlU2NoZW1hIG9mIGEgbGlzdCBpcyB0aGUgbGlzdCdzIHNjaGVtYSBpdHNlbGYuXG4gICAgICByZXR1cm4gdGhpcy5zY2hlbWFcbiAgICB9LFxuXG4gICAgcGF0aCgpIHtcbiAgICAgIC8vIFRoaXMgaXMgdXNlZCBpbiBUeXBlTGlzdCBmb3IgRGl0b0Zvcm1DaG9vc2VyLlxuICAgICAgcmV0dXJuIHRoaXMucm91dGVDb21wb25lbnQuZ2V0Q2hpbGRQYXRoKHRoaXMuc2NoZW1hLnBhdGgpXG4gICAgfSxcblxuICAgIGRlZmF1bHRRdWVyeSgpIHtcbiAgICAgIGNvbnN0IHsgZGVmYXVsdE9yZGVyOiBvcmRlciB9ID0gdGhpc1xuICAgICAgcmV0dXJuIG9yZGVyID8geyBvcmRlciB9IDoge31cbiAgICB9LFxuXG4gICAgcXVlcnk6IGdldFN0b3JlQWNjZXNzb3IoJ3F1ZXJ5Jywge1xuICAgICAgZ2V0KHF1ZXJ5KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4udGhpcy5kZWZhdWx0UXVlcnksXG4gICAgICAgICAgLi4ucXVlcnlcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgc2V0KHF1ZXJ5KSB7XG4gICAgICAgIC8vIEFsd2F5cyBrZWVwIHRoZSBkaXNwbGF5ZWQgcXVlcnkgcGFyYW1ldGVycyBpbiBzeW5jIHdpdGggdGhlIHN0b3JlZFxuICAgICAgICAvLyBvbmVzLiBVc2Ugc2NvcGUgYW5kIHBhZ2UgZnJvbSB0aGUgbGlzdCBzY2hlbWEgYXMgZGVmYXVsdHMsIGJ1dCBhbGxvd1xuICAgICAgICAvLyB0aGUgcm91dGUgcXVlcnkgcGFyYW1ldGVycyB0byBvdmVycmlkZSB0aGVtLlxuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgc2NvcGUgPSB0aGlzLmRlZmF1bHRTY29wZT8ubmFtZSxcbiAgICAgICAgICBwYWdlID0gdGhpcy5zY2hlbWEucGFnZVxuICAgICAgICB9ID0gdGhpcy5xdWVyeVxuICAgICAgICAvLyBQcmVzZXJ2ZSAvIG1lcmdlIGN1cnJlbnRseSBzdG9yZWQgdmFsdWVzLlxuICAgICAgICBxdWVyeSA9IHtcbiAgICAgICAgICAuLi50aGlzLnF1ZXJ5LFxuICAgICAgICAgIC4uLihzY29wZSAhPSBudWxsICYmIHsgc2NvcGUgfSksXG4gICAgICAgICAgLi4uKHBhZ2UgIT0gbnVsbCAmJiB7IHBhZ2UgfSksXG4gICAgICAgICAgLi4ucXVlcnlcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWVxdWFscyhxdWVyeSwgdGhpcy4kcm91dGUucXVlcnkpKSB7XG4gICAgICAgICAgLy8gVGVsbCB0aGUgYCRyb3V0ZWAgd2F0Y2hlciB0byBpZ25vcmUgdGhlIGNoYW5nZWQgdHJpZ2dlcmVkIGhlcmU6XG4gICAgICAgICAgdGhpcy5pZ25vcmVSb3V0ZUNoYW5nZSA9IHRydWVcbiAgICAgICAgICB0aGlzLiRyb3V0ZXIucmVwbGFjZSh7IHF1ZXJ5LCBoYXNoOiB0aGlzLiRyb3V0ZS5oYXNoIH0pXG4gICAgICAgICAgLy8gQ2hhbmdlIHRoZSByb3V0ZSBxdWVyeSBwYXJhbWV0ZXJzLCBidXQgZG9uJ3QgdHJpZ2dlciBhIHJvdXRlXG4gICAgICAgICAgLy8gY2hhbmdlLCBhcyB0aGF0IHdvdWxkIGNhdXNlIHRoZSBsaXN0IHRvIHJlbG9hZC5cbiAgICAgICAgICAvLyByZXBsYWNlUm91dGUoeyBxdWVyeSB9KVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBxdWVyeSAvLyBMZXQgZ2V0U3RvcmVBY2Nlc3NvcigpIGRvIHRoZSBhY3R1YWwgc2V0dGluZ1xuICAgICAgfVxuICAgIH0pLFxuXG4gICAgdG90YWw6IGdldFN0b3JlQWNjZXNzb3IoJ3RvdGFsJyksXG5cbiAgICBjb2x1bW5zKCkge1xuICAgICAgcmV0dXJuIGdldE5hbWVkU2NoZW1hcyh0aGlzLnNjaGVtYS5jb2x1bW5zKVxuICAgIH0sXG5cbiAgICBzY29wZXMoKSB7XG4gICAgICByZXR1cm4gZ2V0TmFtZWRTY2hlbWFzKHRoaXMuc2NoZW1hLnNjb3BlcylcbiAgICB9LFxuXG4gICAgZGVmYXVsdFNjb3BlKCkge1xuICAgICAgbGV0IGZpcnN0ID0gbnVsbFxuICAgICAgaWYgKHRoaXMuc2NvcGVzKSB7XG4gICAgICAgIGZvciAoY29uc3Qgc2NvcGUgb2YgT2JqZWN0LnZhbHVlcyh0aGlzLnNjb3BlcykpIHtcbiAgICAgICAgICBpZiAoc2NvcGUuZGVmYXVsdFNjb3BlKSB7XG4gICAgICAgICAgICByZXR1cm4gc2NvcGVcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFmaXJzdCkge1xuICAgICAgICAgICAgZmlyc3QgPSBzY29wZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZpcnN0XG4gICAgfSxcblxuICAgIGRlZmF1bHRPcmRlcigpIHtcbiAgICAgIGlmICh0aGlzLmNvbHVtbnMpIHtcbiAgICAgICAgZm9yIChjb25zdCBjb2x1bW4gb2YgT2JqZWN0LnZhbHVlcyh0aGlzLmNvbHVtbnMpKSB7XG4gICAgICAgICAgY29uc3QgeyBkZWZhdWx0U29ydCB9ID0gY29sdW1uXG4gICAgICAgICAgaWYgKGRlZmF1bHRTb3J0KSB7XG4gICAgICAgICAgICBjb25zdCBkaXJlY3Rpb24gPSBpc1N0cmluZyhkZWZhdWx0U29ydCkgPyBkZWZhdWx0U29ydCA6ICdhc2MnXG4gICAgICAgICAgICByZXR1cm4gYCR7Y29sdW1uLm5hbWV9ICR7ZGlyZWN0aW9ufWBcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsXG4gICAgfSxcblxuICAgIG5lc3RlZE1ldGEoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi50aGlzLm1ldGEsXG4gICAgICAgIHNjaGVtYTogdGhpcy5zY2hlbWFcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZm9ybXMoKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhnZXRGb3JtU2NoZW1hcyh0aGlzLnNjaGVtYSwgdGhpcy5jb250ZXh0KSlcbiAgICB9LFxuXG4gICAgLy8gUmV0dXJucyB0aGUgbGlua2VkIHZpZXcgc2NoZW1hIGlmIHRoaXMgc291cmNlIGVkaXRzIGl0IGl0cyBpdGVtcyB0aHJvdWdoXG4gICAgLy8gYSBsaW5rZWQgdmlldy5cbiAgICB2aWV3KCkge1xuICAgICAgcmV0dXJuIGdldFZpZXdTY2hlbWEodGhpcy5zY2hlbWEsIHRoaXMuY29udGV4dClcbiAgICB9LFxuXG4gICAgbGlua3NUb1ZpZXcoKSB7XG4gICAgICByZXR1cm4gISF0aGlzLnZpZXdcbiAgICB9LFxuXG4gICAgYnV0dG9uU2NoZW1hcygpIHtcbiAgICAgIHJldHVybiBnZXRCdXR0b25TY2hlbWFzKHRoaXMuc2NoZW1hLmJ1dHRvbnMpXG4gICAgfSxcblxuICAgIGlzQ29tcGFjdCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmZvcm1zLmV2ZXJ5KGlzQ29tcGFjdClcbiAgICB9LFxuXG4gICAgaXNJbmxpbmVkKCkge1xuICAgICAgcmV0dXJuIGlzSW5saW5lZCh0aGlzLnNjaGVtYSlcbiAgICB9LFxuXG4gICAgcGFnaW5hdGU6IGdldFNjaGVtYUFjY2Vzc29yKCdwYWdpbmF0ZScsIHtcbiAgICAgIHR5cGU6IE51bWJlclxuICAgIH0pLFxuXG4gICAgcmVuZGVyOiBnZXRTY2hlbWFBY2Nlc3NvcigncmVuZGVyJywge1xuICAgICAgdHlwZTogRnVuY3Rpb24sXG4gICAgICBkZWZhdWx0OiBudWxsXG4gICAgfSksXG5cbiAgICBjcmVhdGFibGU6IGdldFNjaGVtYUFjY2Vzc29yKCdjcmVhdGFibGUnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICBnZXQoY3JlYXRhYmxlKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGFibGUgJiYgaGFzRm9ybVNjaGVtYSh0aGlzLnNjaGVtYSlcbiAgICAgICAgICA/IHRoaXMuaXNPYmplY3RTb3VyY2VcbiAgICAgICAgICAgID8gIXRoaXMudmFsdWVcbiAgICAgICAgICAgIDogdHJ1ZVxuICAgICAgICAgIDogZmFsc2VcbiAgICAgIH1cbiAgICB9KSxcblxuICAgIGVkaXRhYmxlOiBnZXRTY2hlbWFBY2Nlc3NvcignZWRpdGFibGUnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICBnZXQoZWRpdGFibGUpIHtcbiAgICAgICAgcmV0dXJuIGVkaXRhYmxlICYmICF0aGlzLmlzSW5saW5lZFxuICAgICAgfVxuICAgIH0pLFxuXG4gICAgZGVsZXRhYmxlOiBnZXRTY2hlbWFBY2Nlc3NvcignZGVsZXRhYmxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSksXG5cbiAgICBkcmFnZ2FibGU6IGdldFNjaGVtYUFjY2Vzc29yKCdkcmFnZ2FibGUnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICBnZXQoZHJhZ2dhYmxlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzTGlzdFNvdXJjZSAmJiB0aGlzLmxpc3REYXRhLmxlbmd0aCA+IDEgJiYgZHJhZ2dhYmxlXG4gICAgICB9XG4gICAgfSksXG5cbiAgICBjb2xsYXBzaWJsZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ2NvbGxhcHNpYmxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IG51bGwsIC8vIHNvIHRoYXQgYD8/YCBiZWxvdyBjYW4gZG8gaXRzIHRoaW5nOlxuICAgICAgZ2V0KGNvbGxhcHNpYmxlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzSW5saW5lZCAmJiAhIShjb2xsYXBzaWJsZSA/PyB0aGlzLmNvbGxhcHNlZCAhPT0gbnVsbClcbiAgICAgIH1cbiAgICB9KSxcblxuICAgIGNvbGxhcHNlZDogZ2V0U2NoZW1hQWNjZXNzb3IoJ2NvbGxhcHNlZCcsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBudWxsXG4gICAgfSlcbiAgfSxcblxuICB3YXRjaDoge1xuICAgICRyb3V0ZSh0bywgZnJvbSkge1xuICAgICAgaWYgKHRoaXMuaWdub3JlUm91dGVDaGFuZ2UpIHtcbiAgICAgICAgdGhpcy5pZ25vcmVSb3V0ZUNoYW5nZSA9IGZhbHNlXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaWYgKGZyb20ucGF0aCA9PT0gdG8ucGF0aCAmJiBmcm9tLmhhc2ggPT09IHRvLmhhc2gpIHtcbiAgICAgICAgLy8gUGF0aHMgYW5kIGhhc2hlcyByZW1haW4gdGhlIHNhbWUsIHNvIG9ubHkgcXVlcmllcyBoYXZlIGNoYW5nZWQuXG4gICAgICAgIC8vIFVwZGF0ZSBmaWx0ZXIgYW5kIHJlbG9hZCBkYXRhIHdpdGhvdXQgY2xlYXJpbmcuXG4gICAgICAgIHRoaXMucXVlcnkgPSB0by5xdWVyeVxuICAgICAgICB0aGlzLmxvYWREYXRhKGZhbHNlKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICB3cmFwcGVkUHJpbWl0aXZlczoge1xuICAgICAgZGVlcDogdHJ1ZSxcbiAgICAgIGhhbmRsZXIodG8sIGZyb20pIHtcbiAgICAgICAgY29uc3QgeyB3cmFwUHJpbWl0aXZlcyB9ID0gdGhpc1xuICAgICAgICAvLyBTa2lwIHRoZSBpbml0aWFsIHNldHRpbmcgb2Ygd3JhcHBlZFByaW1pdGl2ZXMgYXJyYXlcbiAgICAgICAgaWYgKHdyYXBQcmltaXRpdmVzICYmIGZyb20gIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBXaGVuZXZlciB0aGUgd3JhcHBlZFByaW1pdGl2ZXMgY2hhbmdlLCBtYXAgdGhlaXIgdmFsdWVzIGJhY2sgdG9cbiAgICAgICAgICAvLyB0aGUgYXJyYXkgb2YgcHJpbWl0aXZlcywgaW4gYSBwcmltaXRpdmUgd2F5IDopXG4gICAgICAgICAgLy8gQnV0IHNldCBgdW53cmFwcGluZ1ByaW1pdGl2ZXMgPSB0cnVlYCwgc28gdGhlIGBsaXN0RGF0YWAgY29tcHV0ZWRcbiAgICAgICAgICAvLyBwcm9wZXJ0eSBrbm93cyBhYm91dCBpdCwgd2hpY2ggc2V0cyBpdCB0byBgZmFsc2VgIGFnYWluLlxuICAgICAgICAgIHRoaXMudW53cmFwcGluZ1ByaW1pdGl2ZXMgPSB0cnVlXG4gICAgICAgICAgdGhpcy52YWx1ZSA9IHRvLm1hcChvYmplY3QgPT4gb2JqZWN0W3dyYXBQcmltaXRpdmVzXSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgc2V0dXBEYXRhKCkge1xuICAgICAgdGhpcy5xdWVyeSA9IHRoaXMuJHJvdXRlLnF1ZXJ5XG4gICAgICB0aGlzLmVuc3VyZURhdGEoKVxuICAgIH0sXG5cbiAgICAvLyBAb3ZlcnJpZGUgUmVzb3VyY2VNaXhpbi5jbGVhckRhdGEoKVxuICAgIGNsZWFyRGF0YSgpIHtcbiAgICAgIHRoaXMudG90YWwgPSAwXG4gICAgICB0aGlzLnZhbHVlID0gbnVsbFxuICAgIH0sXG5cbiAgICAvLyBAb3ZlcnJpZGUgUmVzb3VyY2VNaXhpbi5zZXREYXRhKClcbiAgICBzZXREYXRhKGRhdGEpIHtcbiAgICAgIC8vIFdoZW4gbmV3IGRhdGEgaXMgbG9hZGVkLCB3ZSBjYW4gc3RvcmUgaXQgcmlnaHQgYmFjayBpbiB0aGUgZGF0YSBvZiB0aGVcbiAgICAgIC8vIHZpZXcgb3IgZm9ybSB0aGF0IGNyZWF0ZWQgdGhpcyBsaXN0IGNvbXBvbmVudC5cbiAgICAgIC8vIFN1cHBvcnQgdHdvIGZvcm1hdHMgZm9yIGxpc3QgZGF0YTpcbiAgICAgIC8vIC0gQXJyYXk6IGBbLi4uXWBcbiAgICAgIC8vIC0gT2JqZWN0OiBgeyByZXN1bHRzOiBbLi4uXSwgdG90YWwgfWAsIHNlZSBgdW53cmFwTGlzdERhdGEoKWBcbiAgICAgIGlmIChcbiAgICAgICAgIWRhdGEgfHxcbiAgICAgICAgdGhpcy5pc0xpc3RTb3VyY2UgJiYgaXNBcnJheShkYXRhKSB8fFxuICAgICAgICB0aGlzLmlzT2JqZWN0U291cmNlICYmIGlzT2JqZWN0KGRhdGEpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IGRhdGFcbiAgICAgIH0gZWxzZSBpZiAodGhpcy51bndyYXBMaXN0RGF0YShkYXRhKSkge1xuICAgICAgICAvLyBUaGUgZm9ybWF0IGRpZG4ndCBtYXRjaCwgc2VlIGlmIHdlIHJlY2VpdmVkIGEgYHsgcmVzdWx0cywgdG90YWwgfWBcbiAgICAgICAgLy8gb2JqZWN0LCBpbiB3aGljaCBjYXNlIGB0aGlzLnZhbHVlYCB3YXMgYWxyZWFkeSBzZXQgYnlcbiAgICAgICAgLy8gYHVud3JhcExpc3REYXRhKClgIGFuZCB3ZSdyZSBkb25lIG5vdy5cbiAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3QoZGF0YSkgJiYgdGhpcy5pc0luVmlldykge1xuICAgICAgICAvLyBUaGUgY29udHJvbGxlciBpcyBzZW5kaW5nIGRhdGEgZm9yIGEgZnVsbCBtdWx0aS1jb21wb25lbnQgdmlldyxcbiAgICAgICAgLy8gaW5jbHVkaW5nIHRoZSBuZXN0ZWQgbGlzdCBkYXRhLlxuICAgICAgICB0aGlzLnZpZXdDb21wb25lbnQuc2V0RGF0YShkYXRhKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICB1bndyYXBMaXN0RGF0YShkYXRhKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuaXNMaXN0U291cmNlICYmXG4gICAgICAgIGlzT2JqZWN0KGRhdGEpICYmXG4gICAgICAgIGlzTnVtYmVyKGRhdGEudG90YWwpICYmXG4gICAgICAgIGlzQXJyYXkoZGF0YS5yZXN1bHRzKVxuICAgICAgKSB7XG4gICAgICAgIC8vIElmIEBkaXRvanMvc2VydmVyIHNlbmRzIGRhdGEgaW4gdGhlIGZvcm0gb2YgYHsgcmVzdWx0cywgdG90YWwgfWBcbiAgICAgICAgLy8gcmVwbGFjZSB0aGUgdmFsdWUgd2l0aCByZXN1bHQsIGJ1dCByZW1lbWJlciB0aGUgdG90YWwgaW4gdGhlIHN0b3JlLlxuICAgICAgICB0aGlzLnRvdGFsID0gZGF0YS50b3RhbFxuICAgICAgICB0aGlzLnZhbHVlID0gZGF0YS5yZXN1bHRzXG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlXG4gICAgICB9XG4gICAgfSxcblxuICAgIGNyZWF0ZUl0ZW0oc2NoZW1hLCB0eXBlKSB7XG4gICAgICBjb25zdCBpdGVtID0gdGhpcy5jcmVhdGVEYXRhKHNjaGVtYSwgdHlwZSlcbiAgICAgIGlmICh0aGlzLmlzT2JqZWN0U291cmNlKSB7XG4gICAgICAgIHRoaXMub2JqZWN0RGF0YSA9IGl0ZW1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubGlzdERhdGEucHVzaChpdGVtKVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY29sbGFwc2libGUpIHtcbiAgICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4gdGhpcy5vcGVuU2NoZW1hQ29tcG9uZW50KC0xKSlcbiAgICAgIH1cbiAgICAgIHRoaXMub25DaGFuZ2UoKVxuICAgICAgcmV0dXJuIGl0ZW1cbiAgICB9LFxuXG4gICAgcmVtb3ZlSXRlbShpdGVtKSB7XG4gICAgICBpZiAodGhpcy5pc09iamVjdFNvdXJjZSkge1xuICAgICAgICB0aGlzLm9iamVjdERhdGEgPSBudWxsXG4gICAgICAgIHRoaXMub25DaGFuZ2UoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgeyBsaXN0RGF0YSB9ID0gdGhpc1xuICAgICAgICBjb25zdCBpbmRleCA9IGxpc3REYXRhICYmIGxpc3REYXRhLmluZGV4T2YoaXRlbSlcbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICBsaXN0RGF0YS5zcGxpY2UoaW5kZXgsIDEpXG4gICAgICAgICAgdGhpcy5vbkNoYW5nZSgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZGVsZXRlSXRlbShpdGVtLCBpbmRleCkge1xuICAgICAgY29uc3QgbGFiZWwgPSAoXG4gICAgICAgIGl0ZW0gJiZcbiAgICAgICAgdGhpcy5nZXRJdGVtTGFiZWwodGhpcy5zY2hlbWEsIGl0ZW0sIHtcbiAgICAgICAgICBpbmRleCxcbiAgICAgICAgICBleHRlbmRlZDogdHJ1ZVxuICAgICAgICB9KVxuICAgICAgKVxuXG4gICAgICBjb25zdCBub3RpZnkgPSAoKSA9PlxuICAgICAgICB0aGlzLm5vdGlmeSh7XG4gICAgICAgICAgdHlwZTogdGhpcy5pc1RyYW5zaWVudCA/ICdpbmZvJyA6ICdzdWNjZXNzJyxcbiAgICAgICAgICB0aXRsZTogJ1N1Y2Nlc3NmdWxseSBSZW1vdmVkJyxcbiAgICAgICAgICB0ZXh0OiBbXG4gICAgICAgICAgICBgJHtsYWJlbH0gd2FzICR7dGhpcy52ZXJicy5kZWxldGVkfS5gLFxuICAgICAgICAgICAgdGhpcy50cmFuc2llbnROb3RlXG4gICAgICAgICAgXVxuICAgICAgICB9KVxuXG4gICAgICBpZiAoXG4gICAgICAgIGl0ZW0gJiZcbiAgICAgICAgd2luZG93LmNvbmZpcm0oXG4gICAgICAgICAgYERvIHlvdSByZWFsbHkgd2FudCB0byAke3RoaXMudmVyYnMuZGVsZXRlfSAke2xhYmVsfT9gXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICBpZiAodGhpcy5pc1RyYW5zaWVudCkge1xuICAgICAgICAgIHRoaXMucmVtb3ZlSXRlbShpdGVtKVxuICAgICAgICAgIG5vdGlmeSgpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgaXRlbUlkID0gdGhpcy5nZXRJdGVtSWQodGhpcy5zY2hlbWEsIGl0ZW0pXG4gICAgICAgICAgY29uc3QgcmVzb3VyY2UgPSBnZXRNZW1iZXJSZXNvdXJjZShpdGVtSWQsIHRoaXMucmVzb3VyY2UpXG4gICAgICAgICAgaWYgKHJlc291cmNlKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVJlcXVlc3QoeyBtZXRob2Q6ICdkZWxldGUnLCByZXNvdXJjZSB9LCBlcnIgPT4ge1xuICAgICAgICAgICAgICBpZiAoIWVycikge1xuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlSXRlbShpdGVtKVxuICAgICAgICAgICAgICAgIG5vdGlmeSgpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5yZWxvYWREYXRhKClcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGdldFNjaGVtYUNvbXBvbmVudChpbmRleCkge1xuICAgICAgY29uc3QgeyBzY2hlbWFDb21wb25lbnRzIH0gPSB0aGlzXG4gICAgICBjb25zdCB7IGxlbmd0aCB9ID0gc2NoZW1hQ29tcG9uZW50c1xuICAgICAgcmV0dXJuIHNjaGVtYUNvbXBvbmVudHNbKChpbmRleCAlIGxlbmd0aCkgKyBsZW5ndGgpICUgbGVuZ3RoXVxuICAgIH0sXG5cbiAgICBvcGVuU2NoZW1hQ29tcG9uZW50KGluZGV4KSB7XG4gICAgICBjb25zdCBzY2hlbWFDb21wb25lbnQgPSB0aGlzLmdldFNjaGVtYUNvbXBvbmVudChpbmRleClcbiAgICAgIGlmIChzY2hlbWFDb21wb25lbnQpIHtcbiAgICAgICAgc2NoZW1hQ29tcG9uZW50Lm9wZW5lZCA9IHRydWVcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgbmF2aWdhdGVUb0NvbXBvbmVudChkYXRhUGF0aCwgb25Db21wbGV0ZSkge1xuICAgICAgaWYgKHRoaXMuY29sbGFwc2libGUpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBkYXRhUGF0aC5zdGFydHNXaXRoKHRoaXMuZGF0YVBhdGgpXG4gICAgICAgICAgPyB0aGlzLmlzTGlzdFNvdXJjZVxuICAgICAgICAgICAgPyBwYXJzZURhdGFQYXRoKGRhdGFQYXRoLnNsaWNlKHRoaXMuZGF0YVBhdGgubGVuZ3RoICsgMSkpWzBdID8/IG51bGxcbiAgICAgICAgICAgIDogMFxuICAgICAgICAgIDogbnVsbFxuICAgICAgICBpZiAoaW5kZXggIT09IG51bGwgJiYgaXNOdW1iZXIoK2luZGV4KSkge1xuICAgICAgICAgIGNvbnN0IHNjaGVtYUNvbXBvbmVudCA9IHRoaXMuZ2V0U2NoZW1hQ29tcG9uZW50KCtpbmRleClcbiAgICAgICAgICBpZiAoc2NoZW1hQ29tcG9uZW50KSB7XG4gICAgICAgICAgICBjb25zdCB7IG9wZW5lZCB9ID0gc2NoZW1hQ29tcG9uZW50XG4gICAgICAgICAgICBpZiAoIW9wZW5lZCkge1xuICAgICAgICAgICAgICBzY2hlbWFDb21wb25lbnQub3BlbmVkID0gdHJ1ZVxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLiRuZXh0VGljaygpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnRzID0gc2NoZW1hQ29tcG9uZW50LmdldENvbXBvbmVudHNCeURhdGFQYXRoKGRhdGFQYXRoKVxuICAgICAgICAgICAgaWYgKGNvbXBvbmVudHMubGVuZ3RoID4gMCAmJiAob25Db21wbGV0ZT8uKGNvbXBvbmVudHMpID8/IHRydWUpKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzY2hlbWFDb21wb25lbnQub3BlbmVkID0gb3BlbmVkXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5uYXZpZ2F0ZVRvUm91dGVDb21wb25lbnQoZGF0YVBhdGgsIG9uQ29tcGxldGUpXG4gICAgfSxcblxuICAgIG5hdmlnYXRlVG9Sb3V0ZUNvbXBvbmVudChkYXRhUGF0aCwgb25Db21wbGV0ZSkge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgY2FsbE9uQ29tcGxldGUgPSAoKSA9PiB7XG4gICAgICAgICAgLy8gUmV0cmlldmUgdGhlIGxhc3Qgcm91dGUgY29tcG9uZW50LCB3aGljaCB3aWxsIGJlIHRoZSBjb21wb25lbnQgdGhhdFxuICAgICAgICAgIC8vIHdlIGp1c3QgbmF2aWdhdGVkIHRvLCBhbmQgcGFzcyBpdCBvbiB0byBgb25Db21wbGV0ZSgpYFxuICAgICAgICAgIGNvbnN0IHsgcm91dGVDb21wb25lbnRzIH0gPSB0aGlzLmFwcFN0YXRlXG4gICAgICAgICAgY29uc3Qgcm91dGVDb21wb25lbnQgPSByb3V0ZUNvbXBvbmVudHNbcm91dGVDb21wb25lbnRzLmxlbmd0aCAtIDFdXG4gICAgICAgICAgcmVzb2x2ZShvbkNvbXBsZXRlPy4oW3JvdXRlQ29tcG9uZW50XSkgPz8gdHJ1ZSlcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRhdGFQYXRoUGFydHMgPSBwYXJzZURhdGFQYXRoKGRhdGFQYXRoKVxuICAgICAgICAvLyBTZWUgaWYgd2UgY2FuIGZpbmQgYSByb3V0ZSB0aGF0IGNhbiBzZXJ2ZSBwYXJ0IG9mIHRoZSBnaXZlbiBkYXRhUGF0aCxcbiAgICAgICAgLy8gYW5kIHRha2UgaXQgZnJvbSB0aGVyZTpcbiAgICAgICAgd2hpbGUgKGRhdGFQYXRoUGFydHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IHBhdGggPSB0aGlzLnJvdXRlQ29tcG9uZW50LmdldENoaWxkUGF0aChcbiAgICAgICAgICAgIHRoaXMuYXBpLm5vcm1hbGl6ZVBhdGgobm9ybWFsaXplRGF0YVBhdGgoZGF0YVBhdGhQYXJ0cykpXG4gICAgICAgICAgKVxuICAgICAgICAgIC8vIFNlZSBpZiB0aGVyZSBhY3R1YWxseSBpcyBhIHJvdXRlIGZvciB0aGlzIHN1Yi1jb21wb25lbnQ6XG4gICAgICAgICAgY29uc3QgeyBtYXRjaGVkIH0gPSB0aGlzLiRyb3V0ZXIubWF0Y2gocGF0aClcbiAgICAgICAgICBpZiAobWF0Y2hlZC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLiRyb3V0ZS5wYXRoID09PSBwYXRoKSB7XG4gICAgICAgICAgICAgIC8vIFdlJ3JlIGFscmVhZHkgdGhlcmUsIHNvIGp1c3QgY2FsbCBgb25Db21wbGV0ZSgpYDpcbiAgICAgICAgICAgICAgY2FsbE9uQ29tcGxldGUoKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gTmF2aWdhdGUgdG8gdGhlIGNvbXBvbmVudCdzIHBhdGgsIHRoZW4gY2FsbCBgb25Db21wbGV0ZSgpYF86XG4gICAgICAgICAgICAgIHRoaXMuJHJvdXRlclxuICAgICAgICAgICAgICAgIC5wdXNoKHsgcGF0aCB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChyZWplY3QpXG4gICAgICAgICAgICAgICAgLy8gV2FpdCBmb3IgdGhlIGxhc3Qgcm91dGUgY29tcG9uZW50IHRvIGJlIG1vdW50ZWQgaW4gdGhlIG5leHRcbiAgICAgICAgICAgICAgICAvLyB0aWNrIGJlZm9yZSBjYWxsaW5nIGBvbkNvbXBsZXRlKClgXG4gICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgdGhpcy4kbmV4dFRpY2soY2FsbE9uQ29tcGxldGUpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gS2VlcCByZW1vdmluZyB0aGUgbGFzdCBwYXJ0IHVudGlsIHdlIGZpbmQgYSBtYXRjaC5cbiAgICAgICAgICBkYXRhUGF0aFBhcnRzLnBvcCgpXG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZShmYWxzZSlcbiAgICAgIH0pXG4gICAgfVxuICB9LCAvLyBlbmQgb2YgYG1ldGhvZHNgXG5cbiAgYXN5bmMgcHJvY2Vzc1NjaGVtYShcbiAgICBhcGksXG4gICAgc2NoZW1hLFxuICAgIG5hbWUsXG4gICAgcm91dGVzLFxuICAgIGxldmVsLFxuICAgIG5lc3RlZCA9IGZhbHNlLFxuICAgIGZsYXR0ZW4gPSBmYWxzZSxcbiAgICBwcm9jZXNzID0gbnVsbFxuICApIHtcbiAgICBwcm9jZXNzUm91dGVTY2hlbWEoYXBpLCBzY2hlbWEsIG5hbWUpXG4gICAgY29uc3QgaW5saW5lZCA9IGlzSW5saW5lZChzY2hlbWEpXG4gICAgaWYgKGlubGluZWQgJiYgc2NoZW1hLnJlc291cmNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdMaXN0cyB3aXRoIG5lc3RlZCBmb3JtcyBjYW5ub3QgbG9hZCBkYXRhIGZyb20gdGhlaXIgb3duIHJlc291cmNlcydcbiAgICAgIClcbiAgICB9XG4gICAgLy8gVXNlIGRpZmZlcmVudGx5IG5hbWVkIHVybCBwYXJhbWV0ZXJzIG9uIGVhY2ggbmVzdGVkIGxldmVsIGZvciBpZCBhc1xuICAgIC8vIG90aGVyd2lzZSB0aGV5IHdvdWxkIGNsYXNoIGFuZCBvdmVycmlkZSBlYWNoIG90aGVyIGluc2lkZSAkcm91dGUucGFyYW1zXG4gICAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vdnVlanMvdnVlLXJvdXRlci9pc3N1ZXMvMTM0NVxuICAgIGNvbnN0IHBhcmFtID0gYGlkJHtsZXZlbCArIDF9YFxuICAgIGNvbnN0IG1ldGEgPSB7XG4gICAgICBhcGksXG4gICAgICBzY2hlbWFcbiAgICB9XG4gICAgY29uc3QgZm9ybU1ldGEgPSB7XG4gICAgICAuLi5tZXRhLFxuICAgICAgLy8gV2hlbiBjaGlsZHJlbiBhcmUgZmxhdHRlbmVkIChlLmcuIHRyZWUtbGlzdHMpLCBpbmNsdWRlIHRoZSBgZmxhdHRlbmBcbiAgICAgIC8vIHNldHRpbmcgYWxzbywgZm9yIGZsYXR0ZW5pbmcgYmVsb3cuXG4gICAgICBmbGF0dGVuLFxuICAgICAgbmVzdGVkLFxuICAgICAgcGFyYW1cbiAgICB9XG4gICAgY29uc3QgY2hpbGRSb3V0ZXMgPSBhd2FpdCBwcm9jZXNzRm9ybXMoYXBpLCBzY2hlbWEsIGxldmVsKVxuICAgIGlmIChwcm9jZXNzKSB7XG4gICAgICBhd2FpdCBwcm9jZXNzKGNoaWxkUm91dGVzLCBsZXZlbCArIDEpXG4gICAgfVxuICAgIC8vIElubGluZWQgZm9ybXMgZG9uJ3QgbmVlZCB0byBhY3R1YWxseSBhZGQgcm91dGVzLlxuICAgIGlmIChoYXNGb3JtU2NoZW1hKHNjaGVtYSkgJiYgIWlubGluZWQpIHtcbiAgICAgIGNvbnN0IGdldFBhdGhXaXRoUGFyYW0gPSAocGF0aCwgcGFyYW0pID0+XG4gICAgICAgIHBhcmFtXG4gICAgICAgICAgPyBwYXRoXG4gICAgICAgICAgICA/IGAke3BhdGh9Lzoke3BhcmFtfWBcbiAgICAgICAgICAgIDogYDoke3BhcmFtfWBcbiAgICAgICAgICA6IHBhdGhcblxuICAgICAgLy8gTGlzdHMgaW4gc2luZ2xlLWNvbXBvbmVudC12aWV3cyAobGV2ZWwgPT09IDApIHVzZSB0aGVpciB2aWV3J3MgcGF0aCxcbiAgICAgIC8vIHdoaWxlIGFsbCBvdGhlcnMgbmVlZCB0aGVpciBwYXRoIHByZWZpeGVkIHdpdGggdGhlIHBhcmVudCdzIHBhdGg6XG4gICAgICBjb25zdCBzb3VyY2VQYXRoID0gbGV2ZWwgPT09IDAgPyAnJyA6IHNjaGVtYS5wYXRoXG4gICAgICBjb25zdCBmb3JtUm91dGUgPSB7XG4gICAgICAgIC8vIE9iamVjdCBzb3VyY2VzIGRvbid0IG5lZWQgaWQgcGFyYW1zIGluIHRoZWlyIGZvcm0gcGF0aHMsIGFzIHRoZXlcbiAgICAgICAgLy8gZGlyZWN0bHkgZWRpdCBvbmUgb2JqZWN0LlxuICAgICAgICBwYXRoOiBnZXRQYXRoV2l0aFBhcmFtKHNvdXJjZVBhdGgsIGlzTGlzdFNvdXJjZShzY2hlbWEpICYmIHBhcmFtKSxcbiAgICAgICAgY29tcG9uZW50OiBEaXRvQ29tcG9uZW50LmNvbXBvbmVudChcbiAgICAgICAgICBuZXN0ZWQgPyAnRGl0b0Zvcm1OZXN0ZWQnIDogJ0RpdG9Gb3JtJ1xuICAgICAgICApLFxuICAgICAgICBtZXRhOiBmb3JtTWV0YVxuICAgICAgfVxuICAgICAgaWYgKGlzT2JqZWN0U291cmNlKHNjaGVtYSkpIHtcbiAgICAgICAgLy8gQWxzbyBhZGQgYSBwYXJhbSByb3V0ZSwgc2ltcGx5IHRvIGhhbmRsZSAnL2NyZWF0ZScgbGlua3MgdGhlIHNhbWVcbiAgICAgICAgLy8gd2F5IHRoYXQgbGlzdHMgZG8sIHdoZXJlIGl0IG92ZXJsYXBzIHdpdGggOmlkIGZvciBpdGVtIGlkcy5cbiAgICAgICAgcm91dGVzLnB1c2goe1xuICAgICAgICAgIC4uLmZvcm1Sb3V0ZSxcbiAgICAgICAgICBwYXRoOiBnZXRQYXRoV2l0aFBhcmFtKHNvdXJjZVBhdGgsIHBhcmFtKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgaWYgKHNvdXJjZVBhdGgpIHtcbiAgICAgICAgLy8gSnVzdCByZWRpcmVjdCBiYWNrIHRvIHRoZSBwYXJlbnQgd2hlbiBhIG5lc3RlZCBzb3VyY2Ugcm91dGUgaXMgaGl0LlxuICAgICAgICByb3V0ZXMucHVzaCh7XG4gICAgICAgICAgcGF0aDogc291cmNlUGF0aCxcbiAgICAgICAgICByZWRpcmVjdDogJy4nLFxuICAgICAgICAgIG1ldGFcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIC8vIFBhcnRpdGlvbiBjaGlsZFJvdXRlcyBpbnRvIHRob3NlIHRoYXQgbmVlZCBmbGF0dGVuaW5nIChlLmcuIHRyZWUtbGlzdHMpXG4gICAgICAvLyBhbmQgdGhvc2UgdGhhdCBkb24ndCwgYW5kIHByb2Nlc3MgZWFjaCBncm91cCBzZXBhcmF0ZWx5IGFmdGVyLlxuICAgICAgY29uc3QgW2ZsYXRSb3V0ZXMsIHN1YlJvdXRlc10gPSBjaGlsZFJvdXRlcy5yZWR1Y2UoXG4gICAgICAgIChyZXMsIHJvdXRlKSA9PiB7XG4gICAgICAgICAgcmVzW3JvdXRlLm1ldGEuZmxhdHRlbiA/IDAgOiAxXS5wdXNoKHJvdXRlKVxuICAgICAgICAgIHJldHVybiByZXNcbiAgICAgICAgfSxcbiAgICAgICAgW1tdLCBbXV1cbiAgICAgIClcbiAgICAgIGlmIChzdWJSb3V0ZXMubGVuZ3RoKSB7XG4gICAgICAgIGZvcm1Sb3V0ZS5jaGlsZHJlbiA9IHN1YlJvdXRlc1xuICAgICAgfVxuICAgICAgcm91dGVzLnB1c2goZm9ybVJvdXRlKVxuICAgICAgLy8gQWRkIHRoZSBwcmVmaXhlZCBmb3JtUm91dGVzIHdpdGggdGhlaXIgY2hpbGRyZW4gZm9yIG5lc3RlZCBsaXN0cy5cbiAgICAgIGlmIChmbGF0Um91dGVzLmxlbmd0aCkge1xuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkUm91dGUgb2YgZmxhdFJvdXRlcykge1xuICAgICAgICAgIHJvdXRlcy5wdXNoKHtcbiAgICAgICAgICAgIC4uLihjaGlsZFJvdXRlLnJlZGlyZWN0ID8gY2hpbGRSb3V0ZSA6IGZvcm1Sb3V0ZSksXG4gICAgICAgICAgICBwYXRoOiBgJHtmb3JtUm91dGUucGF0aH0vJHtjaGlsZFJvdXRlLnBhdGh9YCxcbiAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgLi4uY2hpbGRSb3V0ZS5tZXRhLFxuICAgICAgICAgICAgICBmbGF0dGVuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBwcm9jZXNzVmFsdWUoc2NoZW1hLCB2YWx1ZSwgZGF0YVBhdGgsIGdyYXBoKSB7XG4gICAgZ3JhcGguYWRkU291cmNlKGRhdGFQYXRoLCBzY2hlbWEpXG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cbn1cbiIsImltcG9ydCB7IGlzQXJyYXksIGFzQXJyYXksIGxhYmVsaXplIH0gZnJvbSAnQGRpdG9qcy91dGlscydcbmltcG9ydCB7IGdldE5hbWVkU2NoZW1hcywgcHJvY2Vzc05lc3RlZFNjaGVtYURlZmF1bHRzIH0gZnJvbSAnLi9zY2hlbWEnXG5cbmV4cG9ydCBjb25zdCBmaWx0ZXJDb21wb25lbnRzID0ge1xuICAndGV4dCcoZmlsdGVyKSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IFtcbiAgICAgIHtcbiAgICAgICAgbGFiZWw6ICdjb250YWlucycsXG4gICAgICAgIHZhbHVlOiAnY29udGFpbnMnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBsYWJlbDogJ2VxdWFscycsXG4gICAgICAgIHZhbHVlOiAnZXF1YWxzJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbGFiZWw6ICdzdGFydHMgd2l0aCcsXG4gICAgICAgIHZhbHVlOiAnc3RhcnRzLXdpdGgnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBsYWJlbDogJ2VuZHMgd2l0aCcsXG4gICAgICAgIHZhbHVlOiAnZW5kcy13aXRoJ1xuICAgICAgfVxuICAgIF1cbiAgICByZXR1cm4ge1xuICAgICAgb3BlcmF0b3I6IGZpbHRlci5vcGVyYXRvcnNcbiAgICAgICAgPyB7XG4gICAgICAgICAgICB0eXBlOiAnc2VsZWN0JyxcbiAgICAgICAgICAgIHdpZHRoOiAnMi81JyxcbiAgICAgICAgICAgIG9wdGlvbnM6IGlzQXJyYXkoZmlsdGVyLm9wZXJhdG9ycylcbiAgICAgICAgICAgICAgPyBvcHRpb25zLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgIG9wdGlvbiA9PiBmaWx0ZXIub3BlcmF0b3JzLmluY2x1ZGVzKG9wdGlvbi52YWx1ZSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIDogb3B0aW9ucyxcbiAgICAgICAgICAgIGNsZWFyYWJsZTogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgOiBudWxsLFxuICAgICAgdGV4dDoge1xuICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgIHdpZHRoOiBmaWx0ZXIub3BlcmF0b3JzID8gJzMvNScgOiAnZmlsbCcsXG4gICAgICAgIGNsZWFyYWJsZTogdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICAnZGF0ZS1yYW5nZScoKSB7XG4gICAgLy8gVXNlIHNob3J0ZXIgZGF0ZSBmb3JtYXQgaW4gZGF0ZS1yYW5nZSBmaWx0ZXJzOlxuICAgIGNvbnN0IGRhdGVGb3JtYXQgPSB7XG4gICAgICBkYXk6ICcyLWRpZ2l0JyxcbiAgICAgIG1vbnRoOiAnMi1kaWdpdCcsXG4gICAgICB5ZWFyOiAnbnVtZXJpYydcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGZyb206IHtcbiAgICAgICAgdHlwZTogJ2RhdGV0aW1lJyxcbiAgICAgICAgd2lkdGg6ICcxLzInLFxuICAgICAgICBkYXRlRm9ybWF0LFxuICAgICAgICBjbGVhcmFibGU6IHRydWVcbiAgICAgIH0sXG4gICAgICB0bzoge1xuICAgICAgICB0eXBlOiAnZGF0ZXRpbWUnLFxuICAgICAgICB3aWR0aDogJzEvMicsXG4gICAgICAgIGRhdGVGb3JtYXQsXG4gICAgICAgIGNsZWFyYWJsZTogdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRmlsdGVyc1BhbmVsKGFwaSwgZmlsdGVycywgZGF0YVBhdGgsIHByb3h5KSB7XG4gIGNvbnN0IHsgc3RpY2t5LCAuLi5maWx0ZXJTY2hlbWFzIH0gPSBmaWx0ZXJzXG4gIGNvbnN0IHBhbmVsID0ge1xuICAgIHR5cGU6ICdwYW5lbCcsXG4gICAgbGFiZWw6ICdGaWx0ZXJzJyxcbiAgICBuYW1lOiAnJGZpbHRlcnMnLFxuICAgIHRhcmdldDogZGF0YVBhdGgsXG4gICAgLy8gT3ZlcnJpZGUgdGhlIGRlZmF1bHQgdmFsdWVcbiAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgc3RpY2t5LFxuXG4gICAgLy8gTk9URTogT24gcGFuZWxzLCB0aGUgZGF0YSgpIGNhbGxiYWNrIGRvZXMgc29tZXRoaW5nIGVsc2UgdGhhbiBvbiBub3JtYWxcbiAgICAvLyBzY2hlbWE6IEl0IHByb2R1Y2VzIHRoZSBgZGF0YWAgcHJvcGVydHkgdG8gYmUgcGFzc2VkIHRvIHRoZSBwYW5lbCdzXG4gICAgLy8gc2NoZW1hLCBub3QgdGhlIGRhdGEgdG8gYmUgdXNlZCBmb3IgdGhlIHBhbmVsIGNvbXBvbmVudCBkaXJlY3RseS5cbiAgICBkYXRhKCkge1xuICAgICAgcmV0dXJuIHBhcnNlRmlsdGVyc0RhdGEoXG4gICAgICAgIHBhbmVsLFxuICAgICAgICBwcm94eS5xdWVyeVxuICAgICAgKVxuICAgIH0sXG5cbiAgICBjb21wb25lbnRzOiBjcmVhdGVGaWx0ZXJzQ29tcG9uZW50cyhmaWx0ZXJTY2hlbWFzKSxcbiAgICBidXR0b25zOiBjcmVhdGVGaWx0ZXJzQnV0dG9ucyhmYWxzZSksXG4gICAgcGFuZWxCdXR0b25zOiBjcmVhdGVGaWx0ZXJzQnV0dG9ucyh0cnVlKSxcblxuICAgIGV2ZW50czoge1xuICAgICAgY2hhbmdlKCkge1xuICAgICAgICB0aGlzLmFwcGx5RmlsdGVycygpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGNvbXB1dGVkOiB7XG4gICAgICBmaWx0ZXJzKCkge1xuICAgICAgICByZXR1cm4gZm9ybWF0RmlsdGVyc0RhdGEodGhpcy5zY2hlbWEsIHRoaXMuZGF0YSlcbiAgICAgIH0sXG5cbiAgICAgIGhhc0ZpbHRlcnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbHRlcnMubGVuZ3RoID4gMFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBtZXRob2RzOiB7XG4gICAgICBhcHBseUZpbHRlcnMoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICdhcHBseUZpbHRlcnMoKScsXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgZGF0YTogdGhpcy5kYXRhLFxuICAgICAgICAgICAgZmlsdGVyczogdGhpcy5maWx0ZXJzXG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICBwcm94eS5xdWVyeSA9IHtcbiAgICAgICAgICAuLi5wcm94eS5xdWVyeSxcbiAgICAgICAgICBmaWx0ZXI6IHRoaXMuZmlsdGVycyxcbiAgICAgICAgICAvLyBDbGVhciBwYWdpbmF0aW9uIHdoZW4gYXBwbHlpbmcgb3IgY2xlYXJpbmcgZmlsdGVyczpcbiAgICAgICAgICBwYWdlOiB1bmRlZmluZWRcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgY2xlYXJGaWx0ZXJzKCkge1xuICAgICAgICBjb25zb2xlLmxvZygnY2xlYXJGaWx0ZXJzKCknKVxuICAgICAgICB0aGlzLnJlc2V0RGF0YSgpXG4gICAgICAgIHRoaXMuYXBwbHlGaWx0ZXJzKClcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJvY2Vzc05lc3RlZFNjaGVtYURlZmF1bHRzKGFwaSwgcGFuZWwpXG4gIHJldHVybiBwYW5lbFxufVxuXG5mdW5jdGlvbiBjcmVhdGVGaWx0ZXJzQnV0dG9ucyhzbWFsbCkge1xuICByZXR1cm4ge1xuICAgIGNsZWFyOiB7XG4gICAgICB0eXBlOiAnYnV0dG9uJyxcbiAgICAgIHRleHQ6IHNtYWxsID8gbnVsbCA6ICdDbGVhcicsXG4gICAgICBkaXNhYmxlZDogKHsgc2NoZW1hQ29tcG9uZW50IH0pID0+ICFzY2hlbWFDb21wb25lbnQuaGFzRmlsdGVycyxcbiAgICAgIGV2ZW50czoge1xuICAgICAgICBjbGljayh7IHNjaGVtYUNvbXBvbmVudCB9KSB7XG4gICAgICAgICAgLy8gU2luY2UgcGFuZWwgYnV0dG9ucyBhcmUgb3V0c2lkZSBvZiB0aGUgc2NoZW1hLCB3ZSBuZWVkIHRvIHVzZSB0aGVcbiAgICAgICAgICAvLyBzY2hlbWEgY29tcG9uZW50IHJlY2VpdmVkIGZyb20gdGhlIGluaXRpYWxpemUgZXZlbnQgYmVsb3c6XG4gICAgICAgICAgc2NoZW1hQ29tcG9uZW50LmNsZWFyRmlsdGVycygpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc3VibWl0OiB7XG4gICAgICB0eXBlOiAnc3VibWl0JyxcbiAgICAgIHRleHQ6IHNtYWxsID8gbnVsbCA6ICdGaWx0ZXInLFxuICAgICAgdmlzaWJsZTogIXNtYWxsLFxuICAgICAgZXZlbnRzOiB7XG4gICAgICAgIGNsaWNrKHsgc2NoZW1hQ29tcG9uZW50IH0pIHtcbiAgICAgICAgICBzY2hlbWFDb21wb25lbnQuYXBwbHlGaWx0ZXJzKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVGaWx0ZXJzQ29tcG9uZW50cyhmaWx0ZXJzKSB7XG4gIGNvbnN0IGNvbXBzID0ge31cbiAgZm9yIChjb25zdCBmaWx0ZXIgb2YgT2JqZWN0LnZhbHVlcyhnZXROYW1lZFNjaGVtYXMoZmlsdGVycykgfHwge30pKSB7XG4gICAgLy8gU3VwcG9ydCBib3RoIGN1c3RvbSBmb3JtcyBhbmQgZGVmYXVsdCBmaWx0ZXIgY29tcG9uZW50cywgdGhyb3VnaCB0aGVcbiAgICAvLyBgZmlsdGVyQ29tcG9uZW50c2AgcmVnaXN0cnkuIEV2ZW4gZm9yIGRlZmF1bHQgZmlsdGVycywgc3RpbGwgdXNlIHRoZVxuICAgIC8vIHByb3BlcnRpZXMgaW4gYGZpbHRlcmAgYXMgdGhlIGJhc2UgZm9yIGBmb3JtYCwgc28gdGhpbmdzIGxpa2UgYGxhYmVsYFxuICAgIC8vIGNhbiBiZSBjaGFuZ2VkIG9uIHRoZSByZXN1bHRpbmcgZm9ybS5cbiAgICBjb25zdCB7IGZpbHRlcjogdHlwZSwgd2lkdGgsIC4uLmZvcm0gfSA9IGZpbHRlclxuICAgIGNvbnN0IGNvbXBvbmVudHMgPSB0eXBlXG4gICAgICA/IGZpbHRlckNvbXBvbmVudHNbdHlwZV0/LihmaWx0ZXIpXG4gICAgICA6IGZpbHRlci5jb21wb25lbnRzXG4gICAgaWYgKGNvbXBvbmVudHMpIHtcbiAgICAgIGZvcm0udHlwZSA9ICdmb3JtJ1xuICAgICAgZm9ybS5jb21wb25lbnRzID0ge31cbiAgICAgIC8vIENvbnZlcnQgbGFiZWxzIHRvIHBsYWNlaG9sZGVyczpcbiAgICAgIGZvciAoY29uc3QgW2tleSwgY29tcG9uZW50XSBvZiBPYmplY3QuZW50cmllcyhjb21wb25lbnRzKSkge1xuICAgICAgICBpZiAoY29tcG9uZW50KSB7XG4gICAgICAgICAgY29uc3QgbGFiZWwgPSBjb21wb25lbnQubGFiZWwgfHwgbGFiZWxpemUoY29tcG9uZW50Lm5hbWUgfHwga2V5KVxuICAgICAgICAgIGZvcm0uY29tcG9uZW50c1trZXldID0ge1xuICAgICAgICAgICAgLi4uY29tcG9uZW50LFxuICAgICAgICAgICAgbGFiZWw6IGZhbHNlLFxuICAgICAgICAgICAgcGxhY2Vob2xkZXI6IGxhYmVsXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb21wc1tmaWx0ZXIubmFtZV0gPSB7XG4gICAgICAgIGxhYmVsOiBmb3JtLmxhYmVsLFxuICAgICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIGRlZmF1bHQ6ICgpID0+ICh7fSksXG4gICAgICAgIGZvcm0sXG4gICAgICAgIGlubGluZWQ6IHRydWVcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSW52YWxpZCBmaWx0ZXIgJyR7ZmlsdGVyLm5hbWV9JzogVW5rbm93biBmaWx0ZXIgdHlwZSAnJHt0eXBlfScuYFxuICAgICAgKVxuICAgIH1cbiAgfVxuICByZXR1cm4gY29tcHNcbn1cblxuZnVuY3Rpb24gZ2V0Q29tcG9uZW50c0ZvckZpbHRlcihzY2hlbWEsIG5hbWUpIHtcbiAgY29uc3QgY29tcG9uZW50ID0gc2NoZW1hLmNvbXBvbmVudHNbbmFtZV1cbiAgcmV0dXJuIGNvbXBvbmVudD8uZm9ybT8uY29tcG9uZW50c1xufVxuXG5mdW5jdGlvbiBmb3JtYXRGaWx0ZXJzRGF0YShzY2hlbWEsIGRhdGEpIHtcbiAgY29uc3QgZmlsdGVycyA9IFtdXG4gIGZvciAoY29uc3QgbmFtZSBpbiBkYXRhKSB7XG4gICAgY29uc3QgZW50cnkgPSBkYXRhW25hbWVdXG4gICAgaWYgKGVudHJ5KSB7XG4gICAgICAvLyBNYXAgY29tcG9uZW50cyBzZXF1ZW5jZSB0byBhcmd1bWVudHM6XG4gICAgICBjb25zdCBhcmdzID0gT2JqZWN0LmtleXMoZ2V0Q29tcG9uZW50c0ZvckZpbHRlcihzY2hlbWEsIG5hbWUpKS5tYXAoXG4gICAgICAgIGtleSA9PiBlbnRyeVtrZXldID8/IG51bGxcbiAgICAgIClcbiAgICAgIC8vIE9ubHkgYXBwbHkgZmlsdGVyIGlmIHRoZXJlIGFyZSBzb21lIGFyZ3VtZW50cyB0aGF0IGFyZW4ndCBudWxsOlxuICAgICAgaWYgKGFyZ3Muc29tZSh2YWx1ZSA9PiB2YWx1ZSAhPT0gbnVsbCkpIHtcbiAgICAgICAgZmlsdGVycy5wdXNoKGAke25hbWV9OiR7YXJncy5tYXAoSlNPTi5zdHJpbmdpZnkpLmpvaW4oJywnKX1gKVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZmlsdGVyc1xufVxuXG5mdW5jdGlvbiBwYXJzZUZpbHRlcnNEYXRhKHNjaGVtYSwgcXVlcnkpIHtcbiAgY29uc3QgZmlsdGVycyA9IHt9XG4gIC8vIFNhbWUgYXMgQGRpdG9qcy9zZXJ2ZXIncyBRdWVyeVBhcmFtZXRlcnMuZmlsdGVyOiBUcmFuc2xhdGUgdGhlIHN0cmluZyBkYXRhXG4gIC8vIGZyb20gJHJvdXRlLnF1ZXJ5IGJhY2sgdG8gcGFyYW0gbGlzdHMgcGVyIGZpbHRlcjpcbiAgaWYgKHF1ZXJ5KSB7XG4gICAgZm9yIChjb25zdCBmaWx0ZXIgb2YgYXNBcnJheShxdWVyeS5maWx0ZXIpKSB7XG4gICAgICBjb25zdCBbLCBuYW1lLCBqc29uXSA9IGZpbHRlci5tYXRjaCgvXihcXHcrKTooLiopJC8pXG4gICAgICB0cnkge1xuICAgICAgICBmaWx0ZXJzW25hbWVdID0gYXNBcnJheShKU09OLnBhcnNlKGBbJHtqc29ufV1gKSlcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7fVxuICAgIH1cbiAgfVxuICBjb25zdCBmaWx0ZXJzRGF0YSA9IHt9XG4gIGZvciAoY29uc3QgbmFtZSBpbiBzY2hlbWEuY29tcG9uZW50cykge1xuICAgIGNvbnN0IGRhdGEgPSB7fVxuICAgIC8vIElmIHdlIGhhdmUgcmV0cmlldmVkIHBhcmFtcyBmcm9tIHRoZSBxdWVyeSwgZmV0Y2ggdGhlIGFzc29jaWF0ZWRcbiAgICAvLyBmb3JtIGNvbXBvbmVudHMgc28gd2UgY2FuIG1hcCB0aGUgdmFsdWVzIGJhY2sgdG8gb2JqZWN0IGtleXM6XG4gICAgY29uc3QgYXJncyA9IGZpbHRlcnNbbmFtZV1cbiAgICBpZiAoYXJncykge1xuICAgICAgY29uc3QgY29tcG9uZW50cyA9IGdldENvbXBvbmVudHNGb3JGaWx0ZXIoc2NoZW1hLCBuYW1lKVxuICAgICAgaWYgKGNvbXBvbmVudHMpIHtcbiAgICAgICAgbGV0IGluZGV4ID0gMFxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBjb21wb25lbnRzKSB7XG4gICAgICAgICAgZGF0YVtrZXldID0gYXJnc1tpbmRleCsrXVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGZpbHRlcnNEYXRhW25hbWVdID0gZGF0YVxuICB9XG4gIHJldHVybiBmaWx0ZXJzRGF0YVxufVxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLWxpc3QoXG4gIHYtaWY9XCJpc1JlYWR5XCJcbiAgOmlkPVwiZGF0YVBhdGhcIlxuICA6Y2xhc3M9XCJzY2hlbWEuY2xhc3NcIlxuICA6c3R5bGU9XCJzY2hlbWEuc3R5bGVcIlxuKVxuICAuZGl0by1uYXZpZ2F0aW9uKFxuICAgIHYtaWY9XCJzY29wZXMgfHwgaGFzUGFnaW5hdGlvblwiXG4gIClcbiAgICBEaXRvU2NvcGVzKFxuICAgICAgdi1pZj1cInNjb3Blc1wiXG4gICAgICA6cXVlcnk9XCJxdWVyeVwiXG4gICAgICA6c2NvcGVzPVwic2NvcGVzXCJcbiAgICApXG4gICAgLy8tIFdoZW4gdGhlcmUncyBvbmx5IHBhZ2luYXRpb24gd2l0aG91dCBzY29wZXMsIHdlIG5lZWQgYSBnb29kIG9sJyBzcGFjZXJcbiAgICAvLy0gZGl2LCBmb3IgdGhlIGxheW91dCBub3QgdG8gYnJlYWsuLi5cbiAgICAuZGl0by1zcGFjZXIoXG4gICAgICB2LWVsc2UtaWY9XCJoYXNQYWdpbmF0aW9uXCJcbiAgICApXG4gICAgRGl0b1BhZ2luYXRpb24oXG4gICAgICB2LWlmPVwiaGFzUGFnaW5hdGlvblwiXG4gICAgICA6cXVlcnk9XCJxdWVyeVwiXG4gICAgICA6bGltaXQ9XCJwYWdpbmF0ZVwiXG4gICAgICA6dG90YWw9XCJ0b3RhbCB8fCAwXCJcbiAgICApXG4gIHRhYmxlLmRpdG8tdGFibGUoXG4gICAgOmNsYXNzPWB7XG4gICAgICAnZGl0by10YWJsZS1zZXBhcmF0b3JzJzogaXNJbmxpbmVkLFxuICAgICAgJ2RpdG8tdGFibGUtbGFyZ2VyLXBhZGRpbmcnOiBoYXNFZGl0QnV0dG9ucyAmJiAhaXNJbmxpbmVkLFxuICAgICAgJ2RpdG8tdGFibGUtYWx0ZXJuYXRlLWNvbG9ycyc6ICFpc0lubGluZWQsXG4gICAgICAnZGl0by10YWJsZS1ldmVuLWNvdW50JzogaGFzRXZlbkNvdW50XG4gICAgfWBcbiAgKVxuICAgIERpdG9UYWJsZUhlYWQoXG4gICAgICB2LWlmPVwiY29sdW1uc1wiXG4gICAgICA6cXVlcnk9XCJxdWVyeVwiXG4gICAgICA6Y29sdW1ucz1cImNvbHVtbnNcIlxuICAgICAgOmhhc0VkaXRCdXR0b25zPVwiaGFzRWRpdEJ1dHRvbnNcIlxuICAgIClcbiAgICBEaXRvRHJhZ2dhYmxlKFxuICAgICAgdGFnPVwidGJvZHlcIlxuICAgICAgOm1vZGVsVmFsdWU9XCJ1cGRhdGVPcmRlcihzb3VyY2VTY2hlbWEsIGxpc3REYXRhLCBwYWdpbmF0aW9uUmFuZ2UpXCJcbiAgICAgIDpvcHRpb25zPVwiZ2V0U29ydGFibGVPcHRpb25zKGZhbHNlKVwiXG4gICAgICA6ZHJhZ2dhYmxlPVwiZHJhZ2dhYmxlXCJcbiAgICAgIEB1cGRhdGU6bW9kZWxWYWx1ZT1cInZhbHVlID0+IChsaXN0RGF0YSA9IHZhbHVlKVwiXG4gICAgKVxuICAgICAgdHIoXG4gICAgICAgIHYtZm9yPVwiKGl0ZW0sIGluZGV4KSBpbiBsaXN0RGF0YVwiXG4gICAgICAgIDppZD1cImdldERhdGFQYXRoKGluZGV4KVwiXG4gICAgICAgIDprZXk9XCJnZXRJdGVtVWlkKHNjaGVtYSwgaXRlbSlcIlxuICAgICAgKVxuICAgICAgICB0ZW1wbGF0ZShcbiAgICAgICAgICB2LWlmPVwiY29sdW1uc1wiXG4gICAgICAgIClcbiAgICAgICAgICB0ZW1wbGF0ZShcbiAgICAgICAgICAgIHYtZm9yPVwiY29sdW1uIGluIGNvbHVtbnNcIlxuICAgICAgICAgIClcbiAgICAgICAgICAgIERpdG9UYWJsZUNlbGwoXG4gICAgICAgICAgICAgIHYtaWY9XCJzaG91bGRSZW5kZXIoY29sdW1uKVwiXG4gICAgICAgICAgICAgIDprZXk9XCJjb2x1bW4ubmFtZVwiXG4gICAgICAgICAgICAgIDpjbGFzcz1cImdldENlbGxDbGFzcyhjb2x1bW4pXCJcbiAgICAgICAgICAgICAgOmNlbGw9XCJjb2x1bW5cIlxuICAgICAgICAgICAgICA6c2NoZW1hPVwic2NoZW1hXCJcbiAgICAgICAgICAgICAgOmRhdGFQYXRoPVwiZ2V0RGF0YVBhdGgoaW5kZXgpXCJcbiAgICAgICAgICAgICAgOmRhdGE9XCJpdGVtXCJcbiAgICAgICAgICAgICAgOm1ldGE9XCJuZXN0ZWRNZXRhXCJcbiAgICAgICAgICAgICAgOnN0b3JlPVwic3RvcmVcIlxuICAgICAgICAgICAgICA6bmVzdGVkPVwiZmFsc2VcIlxuICAgICAgICAgICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZCB8fCBpc0xvYWRpbmdcIlxuICAgICAgICAgICAgKVxuICAgICAgICB0ZW1wbGF0ZShcbiAgICAgICAgICB2LWVsc2VcbiAgICAgICAgKVxuICAgICAgICAgIHRkXG4gICAgICAgICAgICBEaXRvU2NoZW1hSW5saW5lZChcbiAgICAgICAgICAgICAgdi1pZj1cImlzSW5saW5lZFwiXG4gICAgICAgICAgICAgIDpsYWJlbD1cImdldEl0ZW1MYWJlbChzY2hlbWEsIGl0ZW0sIHsgaW5kZXgsIGFzT2JqZWN0OiB0cnVlIH0pXCJcbiAgICAgICAgICAgICAgOnNjaGVtYT1cImdldEl0ZW1Gb3JtU2NoZW1hKHNjaGVtYSwgaXRlbSwgY29udGV4dClcIlxuICAgICAgICAgICAgICA6ZGF0YVBhdGg9XCJnZXREYXRhUGF0aChpbmRleClcIlxuICAgICAgICAgICAgICA6ZGF0YT1cIml0ZW1cIlxuICAgICAgICAgICAgICA6bWV0YT1cIm5lc3RlZE1ldGFcIlxuICAgICAgICAgICAgICA6c3RvcmU9XCJnZXRDaGlsZFN0b3JlKGluZGV4KVwiXG4gICAgICAgICAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkIHx8IGlzTG9hZGluZ1wiXG4gICAgICAgICAgICAgIDpjb2xsYXBzZWQ9XCJjb2xsYXBzZWRcIlxuICAgICAgICAgICAgICA6Y29sbGFwc2libGU9XCJjb2xsYXBzaWJsZVwiXG4gICAgICAgICAgICAgIDpkZWxldGFibGU9XCJkZWxldGFibGVcIlxuICAgICAgICAgICAgICA6ZHJhZ2dhYmxlPVwiZHJhZ2dhYmxlXCJcbiAgICAgICAgICAgICAgOmVkaXRhYmxlPVwiZWRpdGFibGVcIlxuICAgICAgICAgICAgICA6ZWRpdFBhdGg9XCJnZXRFZGl0UGF0aChpdGVtLCBpbmRleClcIlxuICAgICAgICAgICAgICBAZGVsZXRlPVwiZGVsZXRlSXRlbShpdGVtLCBpbmRleClcIlxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgY29tcG9uZW50KFxuICAgICAgICAgICAgICB2LWVsc2UtaWY9XCJzY2hlbWEuY29tcG9uZW50XCJcbiAgICAgICAgICAgICAgOmlzPVwic2NoZW1hLmNvbXBvbmVudFwiXG4gICAgICAgICAgICAgIDpkYXRhUGF0aD1cImdldERhdGFQYXRoKGluZGV4KVwiXG4gICAgICAgICAgICAgIDpkYXRhPVwiaXRlbVwiXG4gICAgICAgICAgICAgIDpuZXN0ZWQ9XCJmYWxzZVwiXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBzcGFuKFxuICAgICAgICAgICAgICB2LWVsc2UtaWY9XCJyZW5kZXJcIlxuICAgICAgICAgICAgICB2LWh0bWw9XCJyZW5kZXIoZ2V0Q29udGV4dChpdGVtLCBpbmRleCkpXCJcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIHNwYW4oXG4gICAgICAgICAgICAgIHYtZWxzZVxuICAgICAgICAgICAgICB2LWh0bWw9XCJnZXRJdGVtTGFiZWwoc2NoZW1hLCBpdGVtLCB7IGluZGV4IH0pXCJcbiAgICAgICAgICAgIClcbiAgICAgICAgdGQuZGl0by1jZWxsLWVkaXQtYnV0dG9ucyhcbiAgICAgICAgICB2LWlmPVwiaGFzQ2VsbEVkaXRCdXR0b25zXCJcbiAgICAgICAgKVxuICAgICAgICAgIERpdG9FZGl0QnV0dG9ucyhcbiAgICAgICAgICAgIDpkZWxldGFibGU9XCJkZWxldGFibGVcIlxuICAgICAgICAgICAgOmRyYWdnYWJsZT1cImRyYWdnYWJsZVwiXG4gICAgICAgICAgICA6ZWRpdGFibGU9XCJlZGl0YWJsZVwiXG4gICAgICAgICAgICA6ZWRpdFBhdGg9XCJnZXRFZGl0UGF0aChpdGVtLCBpbmRleClcIlxuICAgICAgICAgICAgOnNjaGVtYT1cImdldEl0ZW1Gb3JtU2NoZW1hKHNjaGVtYSwgaXRlbSwgY29udGV4dClcIlxuICAgICAgICAgICAgOmRhdGFQYXRoPVwiZ2V0RGF0YVBhdGgoaW5kZXgpXCJcbiAgICAgICAgICAgIDpkYXRhPVwiaXRlbVwiXG4gICAgICAgICAgICA6bWV0YT1cIm5lc3RlZE1ldGFcIlxuICAgICAgICAgICAgOnN0b3JlPVwiZ2V0Q2hpbGRTdG9yZShpbmRleClcIlxuICAgICAgICAgICAgQGRlbGV0ZT1cImRlbGV0ZUl0ZW0oaXRlbSwgaW5kZXgpXCJcbiAgICAgICAgICApXG4gICAgLy8tIFJlbmRlciBjcmVhdGUgYnV0dG9ucyBpbnNpZGUgdGFibGUgd2hlbiBub3QgaW4gYSBzaW5nbGUgY29tcG9uZW50IHZpZXc6XG4gICAgdGZvb3QoXG4gICAgICB2LWlmPVwiaGFzTGlzdEJ1dHRvbnMgJiYgIXNpbmdsZVwiXG4gICAgKVxuICAgICAgdHJcbiAgICAgICAgdGQuZGl0by1jZWxsLWVkaXQtYnV0dG9ucyg6Y29sc3Bhbj1cIm51bUNvbHVtbnNcIilcbiAgICAgICAgICBEaXRvRWRpdEJ1dHRvbnMoXG4gICAgICAgICAgICA6Y3JlYXRhYmxlPVwiY3JlYXRhYmxlXCJcbiAgICAgICAgICAgIDpjcmVhdGVQYXRoPVwicGF0aFwiXG4gICAgICAgICAgICA6YnV0dG9ucz1cImJ1dHRvblNjaGVtYXNcIlxuICAgICAgICAgICAgOnNjaGVtYT1cInNjaGVtYVwiXG4gICAgICAgICAgICA6ZGF0YVBhdGg9XCJkYXRhUGF0aFwiXG4gICAgICAgICAgICA6ZGF0YT1cImxpc3REYXRhXCJcbiAgICAgICAgICAgIDptZXRhPVwibWV0YVwiXG4gICAgICAgICAgICA6c3RvcmU9XCJzdG9yZVwiXG4gICAgICAgICAgKVxuICAvLy0gUmVuZGVyIGNyZWF0ZSBidXR0b25zIG91dHNpZGUgdGFibGUgd2hlbiBpbiBhIHNpbmdsZSBjb21wb25lbnQgdmlldzpcbiAgRGl0b0VkaXRCdXR0b25zLmRpdG8tYnV0dG9ucy1tYWluLmRpdG8tYnV0dG9ucy1sYXJnZShcbiAgICB2LWlmPVwiaGFzTGlzdEJ1dHRvbnMgJiYgc2luZ2xlXCJcbiAgICA6Y3JlYXRhYmxlPVwiY3JlYXRhYmxlXCJcbiAgICA6Y3JlYXRlUGF0aD1cInBhdGhcIlxuICAgIDpidXR0b25zPVwiYnV0dG9uU2NoZW1hc1wiXG4gICAgOnNjaGVtYT1cInNjaGVtYVwiXG4gICAgOmRhdGFQYXRoPVwiZGF0YVBhdGhcIlxuICAgIDpkYXRhPVwibGlzdERhdGFcIlxuICAgIDptZXRhPVwibWV0YVwiXG4gICAgOnN0b3JlPVwic3RvcmVcIlxuICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IERpdG9Db250ZXh0IGZyb20gJy4uL0RpdG9Db250ZXh0LmpzJ1xuaW1wb3J0IFNvdXJjZU1peGluIGZyb20gJy4uL21peGlucy9Tb3VyY2VNaXhpbi5qcydcbmltcG9ydCBTb3J0YWJsZU1peGluIGZyb20gJy4uL21peGlucy9Tb3J0YWJsZU1peGluLmpzJ1xuaW1wb3J0IHtcbiAgZ2V0Vmlld0VkaXRQYXRoLFxuICByZXNvbHZlU2NoZW1hQ29tcG9uZW50LFxuICByZXNvbHZlU2NoZW1hQ29tcG9uZW50c1xufSBmcm9tICcuLi91dGlscy9zY2hlbWEuanMnXG5pbXBvcnQgeyBjcmVhdGVGaWx0ZXJzUGFuZWwgfSBmcm9tICcuLi91dGlscy9maWx0ZXIuanMnXG5pbXBvcnQgeyBhcHBlbmREYXRhUGF0aCB9IGZyb20gJy4uL3V0aWxzL2RhdGEuanMnXG5pbXBvcnQgeyBwaWNrQnksIGVxdWFscywgaHlwaGVuYXRlIH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKCdsaXN0Jywge1xuICBtaXhpbnM6IFtTb3VyY2VNaXhpbiwgU29ydGFibGVNaXhpbl0sXG4gIGFsaWduQm90dG9tOiBmYWxzZSxcblxuICBnZXRTb3VyY2VUeXBlKHR5cGUpIHtcbiAgICAvLyBObyBuZWVkIGZvciB0cmFuc2Zvcm1hdGlvbiBoZXJlLiBTZWUgVHlwZVRyZWVMaXN0IGZvciBkZXRhaWxzLlxuICAgIHJldHVybiB0eXBlXG4gIH0sXG5cbiAgZ2V0UGFuZWxTY2hlbWEoYXBpLCBzY2hlbWEsIGRhdGFQYXRoLCBzY2hlbWFDb21wb25lbnQpIHtcbiAgICBjb25zdCB7IGZpbHRlcnMgfSA9IHNjaGVtYVxuICAgIC8vIFNlZSBpZiB0aGlzIGxpc3QgY29tcG9uZW50IHdhbnRzIHRvIGRpc3BsYXkgYSBmaWx0ZXIgcGFuZWwsIGFuZCBpZiBzbyxcbiAgICAvLyBjcmVhdGUgdGhlIHBhbmVsIHNjaGVtYSBmb3IgaXQgdGhyb3VnaCBgZ2V0RmlsdGVyc1BhbmVsKClgLlxuICAgIGlmIChmaWx0ZXJzKSB7XG4gICAgICAvLyBBdCB0aGUgdGltZSBvZiB0aGUgY3JlYXRpb24gb2YgdGhlIHBhbmVsIHNjaGVtYSwgdGhlIHNjaGVtYUNvbXBvbmVudCBpc1xuICAgICAgLy8gbm90IGZpbGxlZCB5ZXQsIHNvIHdlIGNhbid0IGdldCB0aGUgdGFyZ2V0IGNvbXBvbmVudCAoZGF0YVBhdGgpIHJpZ2h0XG4gICAgICAvLyBhd2F5LiBVc2UgYSBwcm94eSBhbmQgYSBnZXR0ZXIgaW5zdGVhZCwgdG8gZ2V0IGFyb3VuZCB0aGlzOlxuICAgICAgY29uc3QgZ2V0TGlzdENvbXBvbmVudCA9ICgpID0+XG4gICAgICAgIHNjaGVtYUNvbXBvbmVudC5nZXRDb21wb25lbnRCeURhdGFQYXRoKFxuICAgICAgICAgIGRhdGFQYXRoLFxuICAgICAgICAgIGNvbXBvbmVudCA9PiBjb21wb25lbnQudHlwZSA9PT0gJ2xpc3QnXG4gICAgICAgIClcblxuICAgICAgcmV0dXJuIGNyZWF0ZUZpbHRlcnNQYW5lbChhcGksIGZpbHRlcnMsIGRhdGFQYXRoLCB7XG4gICAgICAgIC8vIENyZWF0ZSBhIHNpbXBsZSBwcm94eSB0byBnZXQgLyBzZXQgdGhlIHF1ZXJ5LCBzZWUgZ2V0RmlsdGVyc1BhbmVsKClcbiAgICAgICAgZ2V0IHF1ZXJ5KCkge1xuICAgICAgICAgIHJldHVybiBnZXRMaXN0Q29tcG9uZW50KCk/LnF1ZXJ5XG4gICAgICAgIH0sXG4gICAgICAgIHNldCBxdWVyeShxdWVyeSkge1xuICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IGdldExpc3RDb21wb25lbnQoKVxuICAgICAgICAgIGNvbnNvbGUubG9nKCdzZXQgcXVlcnknLCAhIWNvbXBvbmVudClcbiAgICAgICAgICBpZiAoY29tcG9uZW50KSB7XG4gICAgICAgICAgICAvLyBGaWx0ZXIgb3V0IHVuZGVmaW5lZCB2YWx1ZXMgZm9yIGNvbXBhcmluZyB3aXRoIGVxdWFscygpXG4gICAgICAgICAgICBjb25zdCBmaWx0ZXIgPSBvYmogPT4gcGlja0J5KG9iaiwgdmFsdWUgPT4gdmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAnc2V0IHF1ZXJ5JyxcbiAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoZmlsdGVyKHF1ZXJ5KSksXG4gICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGZpbHRlcihjb21wb25lbnQucXVlcnkpKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgaWYgKCFlcXVhbHMoZmlsdGVyKHF1ZXJ5KSwgZmlsdGVyKGNvbXBvbmVudC5xdWVyeSkpKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsb2FkIGRhdGEnKVxuICAgICAgICAgICAgICBjb21wb25lbnQucXVlcnkgPSBxdWVyeVxuICAgICAgICAgICAgICBjb21wb25lbnQubG9hZERhdGEoZmFsc2UpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGhhc1BhZ2luYXRpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5wYWdpbmF0ZSAmJiB0aGlzLnRvdGFsID4gdGhpcy5wYWdpbmF0ZVxuICAgIH0sXG5cbiAgICBoYXNMaXN0QnV0dG9ucygpIHtcbiAgICAgIHJldHVybiAhISh0aGlzLmJ1dHRvblNjaGVtYXMgfHwgdGhpcy5jcmVhdGFibGUpXG4gICAgfSxcblxuICAgIGhhc0VkaXRCdXR0b25zKCkge1xuICAgICAgY29uc3QgeyBsaXN0RGF0YSB9ID0gdGhpc1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgbGlzdERhdGEubGVuZ3RoID4gMCAmJiAoXG4gICAgICAgICAgdGhpcy5lZGl0YWJsZSB8fFxuICAgICAgICAgIHRoaXMuZGVsZXRhYmxlIHx8XG4gICAgICAgICAgdGhpcy5kcmFnZ2FibGVcbiAgICAgICAgKVxuICAgICAgKVxuICAgIH0sXG5cbiAgICBoYXNDZWxsRWRpdEJ1dHRvbnMoKSB7XG4gICAgICByZXR1cm4gIXRoaXMuaXNJbmxpbmVkICYmIHRoaXMuaGFzRWRpdEJ1dHRvbnNcbiAgICB9LFxuXG4gICAgaGFzRXZlbkNvdW50KCkge1xuICAgICAgcmV0dXJuICEodGhpcy5saXN0RGF0YS5sZW5ndGggJSAyKVxuICAgIH0sXG5cbiAgICBudW1Db2x1bW5zKCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgKHRoaXMuY29sdW1ucyA/IE9iamVjdC5rZXlzKHRoaXMuY29sdW1ucykubGVuZ3RoIDogMSkgK1xuICAgICAgICAodGhpcy5oYXNDZWxsRWRpdEJ1dHRvbnMgPyAxIDogMClcbiAgICAgIClcbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGdldERhdGFQYXRoKGluZGV4KSB7XG4gICAgICByZXR1cm4gYXBwZW5kRGF0YVBhdGgodGhpcy5kYXRhUGF0aCwgaW5kZXgpXG4gICAgfSxcblxuICAgIGdldEVkaXRQYXRoKGl0ZW0sIGluZGV4KSB7XG4gICAgICBpZiAodGhpcy5lZGl0YWJsZSkge1xuICAgICAgICBjb25zdCBwYXRoID0gZ2V0Vmlld0VkaXRQYXRoKHRoaXMuc2NoZW1hLCB0aGlzLmNvbnRleHQpIHx8IHRoaXMucGF0aFxuICAgICAgICBjb25zdCBpZCA9IHRoaXMuZ2V0SXRlbUlkKHRoaXMuc2NoZW1hLCBpdGVtLCBpbmRleClcbiAgICAgICAgcmV0dXJuIGAke3BhdGh9LyR7aWR9YFxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGxcbiAgICB9LFxuXG4gICAgZ2V0Q2VsbENsYXNzKGNvbHVtbikge1xuICAgICAgcmV0dXJuIGBkaXRvLWNlbGwtJHtoeXBoZW5hdGUoY29sdW1uLm5hbWUpfWBcbiAgICB9LFxuXG4gICAgZ2V0Q29udGV4dChpdGVtLCBpbmRleCkge1xuICAgICAgcmV0dXJuIG5ldyBEaXRvQ29udGV4dCh0aGlzLCB7XG4gICAgICAgIGRhdGE6IGl0ZW0sXG4gICAgICAgIHZhbHVlOiBpdGVtLFxuICAgICAgICBpbmRleCxcbiAgICAgICAgZGF0YVBhdGg6IHRoaXMuZ2V0RGF0YVBhdGgoaW5kZXgpXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBvbkZpbHRlckVycm9ycyhlcnJvcnMpIHtcbiAgICAgIGNvbnN0IGZpbHRlcnNEYXRhUGF0aCA9IGFwcGVuZERhdGFQYXRoKHRoaXMuZGF0YVBhdGgsICckZmlsdGVycycpXG4gICAgICBjb25zdCBwYW5lbCA9IHRoaXMuc2NoZW1hQ29tcG9uZW50LmdldFBhbmVsQnlEYXRhUGF0aChmaWx0ZXJzRGF0YVBhdGgpXG4gICAgICBpZiAocGFuZWwpIHtcbiAgICAgICAgcGFuZWwuc2hvd1ZhbGlkYXRpb25FcnJvcnMoZXJyb3JzLCB0cnVlKVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBhc3luYyBwcm9jZXNzU2NoZW1hKFxuICAgIGFwaSxcbiAgICBzY2hlbWEsXG4gICAgbmFtZSxcbiAgICByb3V0ZXMsXG4gICAgbGV2ZWwsXG4gICAgbmVzdGVkID0gZmFsc2UsXG4gICAgZmxhdHRlbiA9IGZhbHNlLFxuICAgIHByb2Nlc3MgPSBudWxsXG4gICkge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIHJlc29sdmVTY2hlbWFDb21wb25lbnQoc2NoZW1hKSxcbiAgICAgIHJlc29sdmVTY2hlbWFDb21wb25lbnRzKHNjaGVtYS5jb2x1bW5zKSxcbiAgICAgIFNvdXJjZU1peGluLnByb2Nlc3NTY2hlbWEoXG4gICAgICAgIGFwaSxcbiAgICAgICAgc2NoZW1hLFxuICAgICAgICBuYW1lLFxuICAgICAgICByb3V0ZXMsXG4gICAgICAgIGxldmVsLFxuICAgICAgICBuZXN0ZWQsXG4gICAgICAgIGZsYXR0ZW4sXG4gICAgICAgIHByb2Nlc3NcbiAgICAgIClcbiAgICBdKVxuICB9XG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tbGlzdCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcblxuICAuZGl0by1uYXZpZ2F0aW9uIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICBwYWRkaW5nLWJvdHRvbTogJGNvbnRlbnQtcGFkZGluZy1oYWxmO1xuICAgIEBpbmNsdWRlIHVzZXItc2VsZWN0KG5vbmUpO1xuXG4gICAgJjplbXB0eSB7XG4gICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cblxuICAgIC5kaXRvLXNjb3BlcyxcbiAgICAuZGl0by1wYWdpbmF0aW9uIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4OiAwIDEgYXV0bztcbiAgICAgIG1pbi13aWR0aDogMDtcbiAgICB9XG4gIH1cblxuICAmLmRpdG8tc2luZ2xlIHtcbiAgICAvLyBTbyB0aGF0IGxpc3QgYnV0dG9ucyBjYW4gYmUgc3RpY2t5IHRvIHRoZSBib3R0b206XG4gICAgZGlzcGxheTogZ3JpZDtcbiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IG1pbi1jb250ZW50O1xuICAgIGhlaWdodDogMTAwJTtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG5EaXRvTGFiZWwuZGl0by1sYWJlbC1jb21wb25lbnQoXG4gIDpsYWJlbD1cInZhbHVlXCJcbiAgOmRhdGFQYXRoPVwiZGF0YVBhdGhcIlxuKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKCdsYWJlbCcsIHtcbiAgZXhjbHVkZVZhbHVlOiB0cnVlLFxuICBnZW5lcmF0ZUxhYmVsOiBmYWxzZSxcbiAgYWxpZ25Cb3R0b206IGZhbHNlXG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuLmRpdG8tbGFiZWwtY29tcG9uZW50IHtcbiAgZGlzcGxheTogZmxleDtcbiAgaGVpZ2h0OiAyZW07XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLW1hcmt1cCg6aWQ9XCJkYXRhUGF0aFwiKVxuICAuZGl0by1tYXJrdXAtdG9vbGJhcig6ZWRpdG9yPVwiZWRpdG9yXCIpXG4gICAgLmRpdG8tYnV0dG9ucy5kaXRvLWJ1dHRvbnMtdG9vbGJhcihcbiAgICAgIHYtaWY9XCJncm91cGVkQnV0dG9ucy5sZW5ndGggPiAwXCJcbiAgICApXG4gICAgICAuZGl0by1idXR0b24tZ3JvdXAoXG4gICAgICAgIHYtZm9yPVwiYnV0dG9ucyBpbiBncm91cGVkQnV0dG9uc1wiXG4gICAgICApXG4gICAgICAgIGJ1dHRvbi5kaXRvLWJ1dHRvbihcbiAgICAgICAgICB2LWZvcj1cInsgbmFtZSwgaWNvbiwgaXNBY3RpdmUsIG9uQ2xpY2sgfSBpbiBidXR0b25zXCJcbiAgICAgICAgICA6a2V5PVwibmFtZVwiXG4gICAgICAgICAgOmNsYXNzPVwieyAnZGl0by1hY3RpdmUnOiBpc0FjdGl2ZSB9XCJcbiAgICAgICAgICBAY2xpY2s9XCJvbkNsaWNrXCJcbiAgICAgICAgKVxuICAgICAgICAgIEljb24oOm5hbWU9XCJpY29uXCIpXG4gIEVkaXRvckNvbnRlbnQuZGl0by1tYXJrdXAtZWRpdG9yKFxuICAgIHJlZj1cImVkaXRvclwiXG4gICAgOmVkaXRvcj1cImVkaXRvclwiXG4gICAgOnN0eWxlPVwic3R5bGVzXCJcbiAgKVxuICAuZGl0by1yZXNpemUoXG4gICAgdi1pZj1cInJlc2l6YWJsZVwiXG4gICAgQG1vdXNlZG93bi5zdG9wLnByZXZlbnQ9XCJvbkRyYWdSZXNpemVcIlxuICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IERvbU1peGluIGZyb20gJy4uL21peGlucy9Eb21NaXhpbi5qcydcbmltcG9ydCB7IGdldFNjaGVtYUFjY2Vzc29yIH0gZnJvbSAnLi4vdXRpbHMvYWNjZXNzb3IuanMnXG5pbXBvcnQgeyBFZGl0b3IsIEVkaXRvckNvbnRlbnQsIE1hcmssIGdldE1hcmtBdHRyaWJ1dGVzIH0gZnJvbSAnQHRpcHRhcC92dWUtMydcbi8vIGltcG9ydCB7IHRvZ2dsZU1hcmsgfSBmcm9tICd0aXB0YXAtY29tbWFuZHMnXG4vLyBFc3NlbnRpYWxzOlxuaW1wb3J0IHsgRG9jdW1lbnQgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi1kb2N1bWVudCdcbmltcG9ydCB7IFRleHQgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi10ZXh0J1xuLy8gTWFya3M6XG5pbXBvcnQgeyBCb2xkIH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24tYm9sZCdcbmltcG9ydCB7IENvZGUgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi1jb2RlJ1xuaW1wb3J0IHsgSXRhbGljIH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24taXRhbGljJ1xuaW1wb3J0IHsgTGluayB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLWxpbmsnXG5pbXBvcnQgeyBTdHJpa2UgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi1zdHJpa2UnXG5pbXBvcnQgeyBVbmRlcmxpbmUgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi11bmRlcmxpbmUnXG4vLyBOb2RlczpcbmltcG9ydCB7IEJsb2NrcXVvdGUgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi1ibG9ja3F1b3RlJ1xuaW1wb3J0IHsgQ29kZUJsb2NrIH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24tY29kZS1ibG9jaydcbmltcG9ydCB7IEhhcmRCcmVhayB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLWhhcmQtYnJlYWsnXG5pbXBvcnQgeyBIZWFkaW5nIH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24taGVhZGluZydcbmltcG9ydCB7IFBhcmFncmFwaCB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLXBhcmFncmFwaCdcbmltcG9ydCB7IEhvcml6b250YWxSdWxlIH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24taG9yaXpvbnRhbC1ydWxlJ1xuaW1wb3J0IHsgT3JkZXJlZExpc3QgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi1vcmRlcmVkLWxpc3QnXG5pbXBvcnQgeyBCdWxsZXRMaXN0IH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24tYnVsbGV0LWxpc3QnXG5pbXBvcnQgeyBMaXN0SXRlbSB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLWxpc3QtaXRlbSdcbi8vIFRPRE86XG4vLyBpbXBvcnQgeyBJbWFnZSB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLWltYWdlJ1xuLy8gaW1wb3J0IHsgTWVudGlvbiB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLW1lbnRpb24nXG4vLyBpbXBvcnQgeyBDb2RlQmxvY2tIaWdobGlnaHQgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi1jb2RlLWJsb2NrLWhpZ2hsaWdodCdcbi8vIGltcG9ydCB7IFRhYmxlIH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24tdGFibGUnXG4vLyBpbXBvcnQgeyBUYWJsZUNlbGwgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi10YWJsZS1jZWxsJ1xuLy8gaW1wb3J0IHsgVGFibGVIZWFkZXIgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi10YWJsZS1oZWFkZXInXG4vLyBpbXBvcnQgeyBUYWJsZU5vZGVzIH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24tdGFibGUtbm9kZXMnXG4vLyBpbXBvcnQgeyBUYWJsZVJvdyB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLXRhYmxlLXJvdydcbi8vIGltcG9ydCB7IFRhc2tMaXN0IH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24tdGFzay1saXN0J1xuLy8gaW1wb3J0IHsgVGFza0l0ZW0gfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi10YXNrLWl0ZW0nXG4vLyBUb29sczpcbmltcG9ydCB7IEhpc3RvcnkgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi1oaXN0b3J5J1xuXG5pbXBvcnQgeyBJY29uIH0gZnJvbSAnQGRpdG9qcy91aS9zcmMnXG5pbXBvcnQge1xuICBpc0FycmF5LFxuICBpc09iamVjdCxcbiAgdW5kZXJzY29yZSxcbiAgaHlwaGVuYXRlLFxuICBkZWJvdW5jZSxcbiAgY2FtZWxpemVcbn0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKCdtYXJrdXAnLCB7XG4gIG1peGluczogW0RvbU1peGluXSxcbiAgY29tcG9uZW50czoge1xuICAgIEVkaXRvckNvbnRlbnQsXG4gICAgSWNvblxuICB9LFxuXG4gIGFsaWduQm90dG9tOiBmYWxzZSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBlZGl0b3I6IG51bGwsXG4gICAgICBoZWlnaHQ6IG51bGxcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBsaW5lcygpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjaGVtYS5saW5lcyB8fCAxMFxuICAgIH0sXG5cbiAgICBzdHlsZXMoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBoZWlnaHQ6IHRoaXMuaGVpZ2h0IHx8IGBjYWxjKCR7dGhpcy5saW5lc31lbSAqIHZhcigtLWxpbmUtaGVpZ2h0KSlgXG4gICAgICB9XG4gICAgfSxcblxuICAgIG1hcmtCdXR0b25zKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0QnV0dG9ucygnbWFya3MnLCB7XG4gICAgICAgIGJvbGQ6IHRydWUsXG4gICAgICAgIGl0YWxpYzogdHJ1ZSxcbiAgICAgICAgdW5kZXJsaW5lOiB0cnVlLFxuICAgICAgICBzdHJpa2U6IHRydWUsXG4gICAgICAgIHNtYWxsOiB0cnVlLFxuICAgICAgICBjb2RlOiB0cnVlLFxuICAgICAgICBsaW5rOiB7XG4gICAgICAgICAgb25DbGljazogZWRpdG9yID0+IHRoaXMub25DbGlja0xpbmsoZWRpdG9yKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBiYXNpY05vZGVCdXR0b25zKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0QnV0dG9ucygnbm9kZXMnLCB7XG4gICAgICAgIHBhcmFncmFwaDoge1xuICAgICAgICAgIC8vIERvIG5vdCBzaG93IHRoZSBwYXJhZ3JhcGggY29tbWFuZCBhcyBhY3RpdmUgaWYgYW55IG9mIHRoZSBibG9ja1xuICAgICAgICAgIC8vIGNvbW1hbmRzIGFyZSBhbHNvIGFjdGl2ZTpcbiAgICAgICAgICBpZ25vcmVBY3RpdmU6ICgpID0+XG4gICAgICAgICAgICB0aGlzLm90aGVyTm9kZUJ1dHRvbnMuc29tZShidXR0b24gPT4gYnV0dG9uLmlzQWN0aXZlKVxuICAgICAgICB9LFxuICAgICAgICBoZWFkaW5nOiB7XG4gICAgICAgICAgYXR0cmlidXRlOiAnbGV2ZWwnLFxuICAgICAgICAgIHZhbHVlczogWzEsIDIsIDMsIDQsIDUsIDZdXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSxcblxuICAgIG90aGVyTm9kZUJ1dHRvbnMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRCdXR0b25zKCdub2RlcycsIHtcbiAgICAgICAgYnVsbGV0TGlzdDogdHJ1ZSxcbiAgICAgICAgb3JkZXJlZExpc3Q6IHRydWUsXG4gICAgICAgIGJsb2NrcXVvdGU6IHRydWUsXG4gICAgICAgIGNvZGVCbG9jazogdHJ1ZVxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgdG9vbEJ1dHRvbnMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRCdXR0b25zKCd0b29scycsIHtcbiAgICAgICAgdW5kbzogdHJ1ZSxcbiAgICAgICAgcmVkbzogdHJ1ZVxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgZ3JvdXBlZEJ1dHRvbnMoKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIG1hcmtCdXR0b25zLFxuICAgICAgICBiYXNpY05vZGVCdXR0b25zLFxuICAgICAgICBvdGhlck5vZGVCdXR0b25zLFxuICAgICAgICB0b29sQnV0dG9uc1xuICAgICAgfSA9IHRoaXNcbiAgICAgIHJldHVybiBbXG4gICAgICAgIG1hcmtCdXR0b25zLFxuICAgICAgICBiYXNpY05vZGVCdXR0b25zLFxuICAgICAgICBvdGhlck5vZGVCdXR0b25zLFxuICAgICAgICB0b29sQnV0dG9uc1xuICAgICAgXS5maWx0ZXIoYnV0dG9ucyA9PiBidXR0b25zLmxlbmd0aCA+IDApXG4gICAgfSxcblxuICAgIHBhcnNlT3B0aW9ucygpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByZXNlcnZlV2hpdGVzcGFjZToge1xuICAgICAgICAgICdjb2xsYXBzZSc6IGZhbHNlLFxuICAgICAgICAgICdwcmVzZXJ2ZSc6IHRydWUsXG4gICAgICAgICAgJ3ByZXNlcnZlLWFsbCc6ICdmdWxsJ1xuICAgICAgICB9W3RoaXMud2hpdGVzcGFjZV1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZWRpdG9yT3B0aW9ucygpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVkaXRhYmxlOiAhdGhpcy5yZWFkeW9ubHksXG4gICAgICAgIGF1dG9Gb2N1czogdGhpcy5hdXRvZm9jdXMsXG4gICAgICAgIGRpc2FibGVJbnB1dFJ1bGVzOiAhdGhpcy5lbmFibGVSdWxlcy5pbnB1dCxcbiAgICAgICAgZGlzYWJsZVBhc3RlUnVsZXM6ICF0aGlzLmVuYWJsZVJ1bGVzLnBhc3RlLFxuICAgICAgICBwYXJzZU9wdGlvbnM6IHRoaXMucGFyc2VPcHRpb25zXG4gICAgICB9XG4gICAgfSxcblxuICAgIHJlc2l6YWJsZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ3Jlc2l6YWJsZScsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0pLFxuXG4gICAgd2hpdGVzcGFjZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ3doaXRlc3BhY2UnLCB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiAnY29sbGFwc2UnXG4gICAgICAvLyBQb3NzaWJsZSB2YWx1ZXMgYXJlOiAnY29sbGFwc2UnLCAncHJlc2VydmUnLCAncHJlc2VydmUtYWxsJ1xuICAgIH0pLFxuXG4gICAgZW5hYmxlUnVsZXM6IGdldFNjaGVtYUFjY2Vzc29yKCdlbmFibGVSdWxlcycsIHtcbiAgICAgIHR5cGU6IFtPYmplY3QsIEJvb2xlYW5dLFxuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICBnZXQoZW5hYmxlUnVsZXMpIHtcbiAgICAgICAgcmV0dXJuIGlzT2JqZWN0KGVuYWJsZVJ1bGVzKVxuICAgICAgICAgID8gZW5hYmxlUnVsZXNcbiAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgaW5wdXQ6ICEhZW5hYmxlUnVsZXMsXG4gICAgICAgICAgICAgIHBhc3RlOiAhIWVuYWJsZVJ1bGVzXG4gICAgICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfSxcblxuICB3YXRjaDoge1xuICAgIHJlYWR5b25seTogJ3VwZGF0ZUVkaXRvck9wdGlvbnMnLFxuICAgIGF1dG9mb2N1czogJ3VwZGF0ZUVkaXRvck9wdGlvbnMnLFxuICAgIGVuYWJsZVJ1bGVzOiAndXBkYXRlRWRpdG9yT3B0aW9ucydcbiAgfSxcblxuICBjcmVhdGVkKCkge1xuICAgIGxldCBjaGFuZ2VkID0gZmFsc2VcbiAgICBsZXQgaWdub3JlV2F0Y2ggPSBmYWxzZVxuXG4gICAgY29uc3Qgb25DaGFuZ2UgPSAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuZm9jdXNlZCAmJiBjaGFuZ2VkKSB7XG4gICAgICAgIGNoYW5nZWQgPSBmYWxzZVxuICAgICAgICB0aGlzLm9uQ2hhbmdlKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBvbkZvY3VzID0gKCkgPT4gdGhpcy5vbkZvY3VzKClcblxuICAgIGNvbnN0IG9uQmx1ciA9ICgpID0+IHtcbiAgICAgIHRoaXMub25CbHVyKClcbiAgICAgIG9uQ2hhbmdlKClcbiAgICB9XG5cbiAgICBjb25zdCBzZXRWYWx1ZURlYm91bmNlZCA9IGRlYm91bmNlKGVkaXRvciA9PiB7XG4gICAgICBpZ25vcmVXYXRjaCA9IHRydWVcbiAgICAgIHRoaXMudmFsdWUgPSBlZGl0b3IuZ2V0SFRNTCgpXG4gICAgICBjaGFuZ2VkID0gdHJ1ZVxuICAgICAgb25DaGFuZ2UoKVxuICAgIH0sIDEwMClcblxuICAgIGNvbnN0IG9uVXBkYXRlID0gKHsgZWRpdG9yIH0pID0+IHtcbiAgICAgIHNldFZhbHVlRGVib3VuY2VkKGVkaXRvcilcbiAgICAgIHRoaXMub25JbnB1dCgpXG4gICAgfVxuXG4gICAgdGhpcy4kd2F0Y2goJ3ZhbHVlJywgdmFsdWUgPT4ge1xuICAgICAgaWYgKGlnbm9yZVdhdGNoKSB7XG4gICAgICAgIGlnbm9yZVdhdGNoID0gZmFsc2VcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZWRpdG9yLnNldENvbnRlbnQodmFsdWUsIGZhbHNlLCB0aGlzLnBhcnNlT3B0aW9ucylcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgdGhpcy5lZGl0b3IgPSBuZXcgRWRpdG9yKHtcbiAgICAgIC4uLnRoaXMuZWRpdG9yT3B0aW9ucyxcbiAgICAgIG9uRm9jdXMsXG4gICAgICBvbkJsdXIsXG4gICAgICBvblVwZGF0ZSxcbiAgICAgIGV4dGVuc2lvbnM6IHRoaXMuZ2V0RXh0ZW5zaW9ucygpLFxuICAgICAgY29udGVudDogdGhpcy52YWx1ZSB8fCAnJ1xuICAgIH0pXG4gIH0sXG5cbiAgdW5tb3VudGVkKCkge1xuICAgIHRoaXMuZWRpdG9yLmRlc3Ryb3koKVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBvbkRyYWdSZXNpemUoZXZlbnQpIHtcbiAgICAgIGNvbnN0IGdldFBvaW50ID0gKHsgY2xpZW50WDogeCwgY2xpZW50WTogeSB9KSA9PiAoeyB4LCB5IH0pXG5cbiAgICAgIGxldCBwcmV2WSA9IGdldFBvaW50KGV2ZW50KS55XG4gICAgICBsZXQgaGVpZ2h0ID0gcGFyc2VGbG9hdChnZXRDb21wdXRlZFN0eWxlKHRoaXMuJHJlZnMuZWRpdG9yLiRlbCkuaGVpZ2h0KVxuXG4gICAgICBjb25zdCBtb3VzZW1vdmUgPSBldmVudCA9PiB7XG4gICAgICAgIGNvbnN0IHsgeSB9ID0gZ2V0UG9pbnQoZXZlbnQpXG4gICAgICAgIGhlaWdodCArPSB5IC0gcHJldllcbiAgICAgICAgcHJldlkgPSB5XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gYCR7TWF0aC5tYXgoaGVpZ2h0LCAwKX1weGBcbiAgICAgIH1cblxuICAgICAgY29uc3QgaGFuZGxlcnMgPSB0aGlzLmRvbU9uKGRvY3VtZW50LCB7XG4gICAgICAgIG1vdXNlbW92ZSxcblxuICAgICAgICBtb3VzZXVwKGV2ZW50KSB7XG4gICAgICAgICAgbW91c2Vtb3ZlKGV2ZW50KVxuICAgICAgICAgIGhhbmRsZXJzLnJlbW92ZSgpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSxcblxuICAgIHVwZGF0ZUVkaXRvck9wdGlvbnMoKSB7XG4gICAgICB0aGlzLmVkaXRvci5zZXRPcHRpb25zKHRoaXMuZWRpdG9yT3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgb25DbGlja0xpbmsoZWRpdG9yKSB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGVzID0gYXdhaXQgdGhpcy5yb290Q29tcG9uZW50LnNob3dEaWFsb2coe1xuICAgICAgICBjb21wb25lbnRzOiB7XG4gICAgICAgICAgaHJlZjoge1xuICAgICAgICAgICAgdHlwZTogJ3VybCcsXG4gICAgICAgICAgICBsYWJlbDogJ0xpbmsnLFxuICAgICAgICAgICAgYXV0b2ZvY3VzOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0aXRsZToge1xuICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgbGFiZWw6ICdUaXRsZSdcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGJ1dHRvbnM6IHtcbiAgICAgICAgICBjYW5jZWw6IHt9LFxuICAgICAgICAgIGFwcGx5OiB7IHR5cGU6ICdzdWJtaXQnIH0sXG4gICAgICAgICAgcmVtb3ZlOiB7XG4gICAgICAgICAgICBldmVudHM6IHtcbiAgICAgICAgICAgICAgY2xpY2soeyBkaWFsb2dDb21wb25lbnQgfSkge1xuICAgICAgICAgICAgICAgIGRpYWxvZ0NvbXBvbmVudC5yZXNvbHZlKG51bGwpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGRhdGE6IGdldE1hcmtBdHRyaWJ1dGVzKHRoaXMuZWRpdG9yLnN0YXRlLCAnbGluaycpXG4gICAgICB9KVxuICAgICAgaWYgKGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgbGV0IHsgaHJlZiwgdGl0bGUgfSA9IGF0dHJpYnV0ZXNcbiAgICAgICAgaWYgKGhyZWYpIHtcbiAgICAgICAgICAvLyBTZWUgaWYgYGhyZWZgIGNhbiBiZSBwYXJzZWQgYXMgYSBVUkwsIGFuZCBpZiBub3QsXG4gICAgICAgICAgLy8gcHJlZml4IGl0IHdpdGggYSBkZWZhdWx0IHByb3RvY29sLlxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3XG4gICAgICAgICAgICBuZXcgVVJMKGhyZWYpXG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICBocmVmID0gYGh0dHBzOi8vJHtocmVmfWBcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWRpdG9yLmNvbW1hbmRzLnNldExpbmsoeyBocmVmLCB0aXRsZSB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWRpdG9yLmNvbW1hbmRzLnVuc2V0TGluaygpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGdldEV4dGVuc2lvbnMoKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIG1hcmtzID0ge30sXG4gICAgICAgIG5vZGVzID0ge30sXG4gICAgICAgIHRvb2xzID0ge31cbiAgICAgIH0gPSB0aGlzLnNjaGVtYVxuICAgICAgcmV0dXJuIFtcbiAgICAgICAgLy8gRXNzZW50aWFsczpcbiAgICAgICAgRG9jdW1lbnQsXG4gICAgICAgIFRleHQsXG4gICAgICAgIFBhcmFncmFwaCwgLy8gYnV0dG9uIGNhbiBiZSBjb250cm9sbGVkLCBidXQgbm9kZSBuZWVkcyB0byBiZSBvbi5cblxuICAgICAgICAvLyBNYXJrczogYHNjaGVtYS5tYXJrc2BcbiAgICAgICAgbWFya3MuYm9sZCAmJiBCb2xkLFxuICAgICAgICBtYXJrcy5pdGFsaWMgJiYgSXRhbGljLFxuICAgICAgICBtYXJrcy51bmRlcmxpbmUgJiYgVW5kZXJsaW5lLFxuICAgICAgICBtYXJrcy5zdHJpa2UgJiYgU3RyaWtlLFxuICAgICAgICBtYXJrcy5zbWFsbCAmJiBTbWFsbCxcbiAgICAgICAgbWFya3MuY29kZSAmJiBDb2RlLFxuICAgICAgICBtYXJrcy5saW5rICYmIExpbmtXaXRoVGl0bGUsXG5cbiAgICAgICAgLy8gTm9kZXM6IGBzY2hlbWEubm9kZXNgXG4gICAgICAgIG5vZGVzLmJsb2NrcXVvdGUgJiYgQmxvY2txdW90ZSxcbiAgICAgICAgbm9kZXMuY29kZUJsb2NrICYmIENvZGVCbG9jayxcbiAgICAgICAgSGFyZEJyZWFrLCAvLyBUT0RPOiBTaG91bGQgdGhpcyBhbHdheXMgb24/XG4gICAgICAgIG5vZGVzLmhlYWRpbmcgJiYgSGVhZGluZy5jb25maWd1cmUoeyBsZXZlbHM6IG5vZGVzLmhlYWRpbmcgfSksXG4gICAgICAgIG5vZGVzLmhvcml6b250YWxSdWxlICYmIEhvcml6b250YWxSdWxlLFxuICAgICAgICAobm9kZXMub3JkZXJlZExpc3QgfHwgbm9kZXMuYnVsbGV0TGlzdCkgJiYgTGlzdEl0ZW0sXG4gICAgICAgIG5vZGVzLmJ1bGxldExpc3QgJiYgQnVsbGV0TGlzdCxcbiAgICAgICAgbm9kZXMub3JkZXJlZExpc3QgJiYgT3JkZXJlZExpc3QsXG4gICAgICAgIC8vIFRPRE86XG4gICAgICAgIC8vIG5vZGVzLnRvZG9MaXN0ICYmIFRvZG9JdGVtLFxuICAgICAgICAvLyBub2Rlcy50b2RvTGlzdCAmJiBUb2RvTGlzdCxcblxuICAgICAgICAvLyBUb29sczogYHNjaGVtYS50b29sc2BcbiAgICAgICAgdG9vbHMuaGlzdG9yeSAmJiBIaXN0b3J5XG4gICAgICBdLmZpbHRlcihleHRlbnNpb24gPT4gISFleHRlbnNpb24pXG4gICAgfSxcblxuICAgIGdldEJ1dHRvbnMoc2V0dGluZ3NOYW1lLCBkZXNjcmlwdGlvbnMpIHtcbiAgICAgIGNvbnN0IGxpc3QgPSBbXVxuXG4gICAgICBjb25zdCBhZGRCdXR0b24gPSAoeyBuYW1lLCBpY29uLCBhdHRyaWJ1dGVzLCBpZ25vcmVBY3RpdmUsIG9uQ2xpY2sgfSkgPT4ge1xuICAgICAgICBsaXN0LnB1c2goe1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgaWNvbixcbiAgICAgICAgICBpc0FjdGl2ZTogKFxuICAgICAgICAgICAgdGhpcy5lZGl0b3IuaXNBY3RpdmUobmFtZSwgYXR0cmlidXRlcykgJiZcbiAgICAgICAgICAgIChpZ25vcmVBY3RpdmUgPT0gbnVsbCB8fCAhaWdub3JlQWN0aXZlKCkpXG4gICAgICAgICAgKSxcbiAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBgdG9nZ2xlJHtjYW1lbGl6ZShuYW1lLCB0cnVlKX1gXG4gICAgICAgICAgICBpZiAodGhpcy5lZGl0b3IuY29tbWFuZHNba2V5XSkge1xuICAgICAgICAgICAgICBjb25zdCBjb21tYW5kID0gYXR0cmlidXRlcyA9PlxuICAgICAgICAgICAgICAgIHRoaXMuZWRpdG9yLmNoYWluKClba2V5XShhdHRyaWJ1dGVzKS5mb2N1cygpLnJ1bigpXG4gICAgICAgICAgICAgIG9uQ2xpY2tcbiAgICAgICAgICAgICAgICA/IG9uQ2xpY2sodGhpcy5lZGl0b3IsIGF0dHJpYnV0ZXMpXG4gICAgICAgICAgICAgICAgOiBjb21tYW5kKGF0dHJpYnV0ZXMpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2NoZW1hW3NldHRpbmdzTmFtZV1cbiAgICAgIGlmIChzZXR0aW5ncykge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGRlc2NyaXB0aW9uXSBvZiBPYmplY3QuZW50cmllcyhkZXNjcmlwdGlvbnMpKSB7XG4gICAgICAgICAgY29uc3Qgc2V0dGluZ05hbWUgPSBbJ3VuZG8nLCAncmVkbyddLmluY2x1ZGVzKGtleSkgPyAnaGlzdG9yeScgOiBrZXlcbiAgICAgICAgICBjb25zdCBzZXR0aW5nID0gc2V0dGluZ3Nbc2V0dGluZ05hbWVdXG4gICAgICAgICAgY29uc3QgbmFtZSA9IHVuZGVyc2NvcmUoa2V5KVxuICAgICAgICAgIGNvbnN0IGljb24gPSBoeXBoZW5hdGUoa2V5KVxuICAgICAgICAgIGlmIChzZXR0aW5nKSB7XG4gICAgICAgICAgICBpZiAoZGVzY3JpcHRpb24gPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgYWRkQnV0dG9uKHsgbmFtZSwgaWNvbiB9KVxuICAgICAgICAgICAgfSBlbHNlIGlmIChpc09iamVjdChkZXNjcmlwdGlvbikpIHtcbiAgICAgICAgICAgICAgY29uc3QgeyBhdHRyaWJ1dGUsIHZhbHVlcywgaWdub3JlQWN0aXZlLCBvbkNsaWNrIH0gPSBkZXNjcmlwdGlvblxuICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzQXJyYXkodmFsdWVzKSAmJiBpc0FycmF5KHNldHRpbmcpKSB7XG4gICAgICAgICAgICAgICAgICAvLyBTdXBwb3J0IGhlYWRpbmcgbGV2ZWwgYXR0cnM6XG4gICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2V0dGluZy5pbmNsdWRlcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICBhZGRCdXR0b24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb246IGAke2ljb259LSR7dmFsdWV9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHsgW2F0dHJpYnV0ZV06IHZhbHVlIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVBY3RpdmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrXG4gICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhZGRCdXR0b24oeyBuYW1lLCBpY29uLCBpZ25vcmVBY3RpdmUsIG9uQ2xpY2sgfSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGxpc3RcbiAgICB9LFxuXG4gICAgZm9jdXNFbGVtZW50KCkge1xuICAgICAgdGhpcy4kZWwuc2Nyb2xsSW50b1ZpZXc/LigpXG4gICAgICB0aGlzLmVkaXRvci5mb2N1cygpXG4gICAgfVxuICB9XG59KVxuXG5jb25zdCBTbWFsbCA9IE1hcmsuY3JlYXRlKHtcbiAgbmFtZTogJ3NtYWxsJyxcblxuICBwYXJzZUhUTUwoKSB7XG4gICAgcmV0dXJuIFt7IHRhZzogJ3NtYWxsJyB9XVxuICB9LFxuXG4gIHJlbmRlckhUTUwoKSB7XG4gICAgcmV0dXJuIFsnc21hbGwnLCAwXVxuICB9LFxuXG4gIGFkZENvbW1hbmRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzZXRTbWFsbDpcbiAgICAgICAgYXR0cmlidXRlcyA9PlxuICAgICAgICAoeyBjb21tYW5kcyB9KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGNvbW1hbmRzLnNldE1hcmsodGhpcy5uYW1lLCBhdHRyaWJ1dGVzKVxuICAgICAgICB9LFxuICAgICAgdG9nZ2xlU21hbGw6XG4gICAgICAgIGF0dHJpYnV0ZXMgPT5cbiAgICAgICAgKHsgY29tbWFuZHMgfSkgPT4ge1xuICAgICAgICAgIHJldHVybiBjb21tYW5kcy50b2dnbGVNYXJrKHRoaXMubmFtZSwgYXR0cmlidXRlcylcbiAgICAgICAgfSxcbiAgICAgIHVuc2V0U21hbGw6XG4gICAgICAgICgpID0+XG4gICAgICAgICh7IGNvbW1hbmRzIH0pID0+IHtcbiAgICAgICAgICByZXR1cm4gY29tbWFuZHMudW5zZXRNYXJrKHRoaXMubmFtZSlcbiAgICAgICAgfVxuICAgIH1cbiAgfVxufSlcblxuY29uc3QgTGlua1dpdGhUaXRsZSA9IExpbmsuZXh0ZW5kKHtcbiAgaW5jbHVzaXZlOiBmYWxzZSxcbiAgc2NoZW1hOiB7XG4gICAgYXR0cnM6IHtcbiAgICAgIGhyZWY6IHtcbiAgICAgICAgZGVmYXVsdDogbnVsbFxuICAgICAgfSxcbiAgICAgIHRpdGxlOiB7XG4gICAgICAgIGRlZmF1bHQ6IG51bGxcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgcGFyc2VIVE1MKCkge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAge1xuICAgICAgICAgIHRhZzogJ2EnLFxuICAgICAgICAgIGdldEF0dHJzOiBlbGVtZW50ID0+ICh7XG4gICAgICAgICAgICBocmVmOiBlbGVtZW50LmdldEF0dHJpYnV0ZSgnaHJlZicpLFxuICAgICAgICAgICAgdGl0bGU6IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd0aXRsZScpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0sXG5cbiAgICByZW5kZXJIVE1MKG5vZGUpIHtcbiAgICAgIHJldHVybiBbJ2EnLCBub2RlLmF0dHJzLCAwXVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLW1hcmt1cCB7XG4gIEBleHRlbmQgJWlucHV0O1xuXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcblxuICAuZGl0by1yZXNpemUge1xuICAgIEBleHRlbmQgJWljb24tcmVzaXplO1xuXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogdW5zZXQ7XG4gICAgbGVmdDogdW5zZXQ7XG4gICAgcmlnaHQ6IDA7XG4gICAgYm90dG9tOiAwO1xuICAgIHdpZHRoOiAxZW07XG4gICAgaGVpZ2h0OiAxZW07XG4gIH1cblxuICAuUHJvc2VNaXJyb3Ige1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBvdXRsaW5lOiBub25lO1xuICB9XG5cbiAgLmRpdG8tbWFya3VwLWVkaXRvciB7XG4gICAgb3ZlcmZsb3cteTogc2Nyb2xsO1xuICAgIC8vIE1vdmUgcGFkZGluZyBcImluc2lkZVwiIGVkaXRvciB0byBjb3JyZWN0bHkgcG9zaXRpb24gc2Nyb2xsYmFyXG4gICAgbWFyZ2luLXJpZ2h0OiAtJGlucHV0LXBhZGRpbmctaG9yO1xuICAgIHBhZGRpbmctcmlnaHQ6ICRpbnB1dC1wYWRkaW5nLWhvcjtcbiAgfVxuXG4gIC5kaXRvLWJ1dHRvbnMtdG9vbGJhciB7XG4gICAgbWFyZ2luOiAkaW5wdXQtcGFkZGluZy12ZXIgMDtcbiAgfVxuXG4gIGgxLFxuICBoMixcbiAgaDMsXG4gIHAsXG4gIHVsLFxuICBvbCxcbiAgcHJlLFxuICBibG9ja3F1b3RlIHtcbiAgICBtYXJnaW46IDFyZW0gMDtcblxuICAgICY6Zmlyc3QtY2hpbGQge1xuICAgICAgbWFyZ2luLXRvcDogMDtcbiAgICB9XG5cbiAgICAmOmxhc3QtY2hpbGQge1xuICAgICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgICB9XG4gIH1cblxuICBoMSxcbiAgaDIsXG4gIGgzIHtcbiAgICBmb250LXdlaWdodDogYm9sZDtcbiAgfVxuXG4gIGgxIHtcbiAgICBmb250LXNpemU6IDEuNHJlbTtcbiAgfVxuXG4gIGgyIHtcbiAgICBmb250LXNpemU6IDEuMnJlbTtcbiAgfVxuXG4gIHVsIHtcbiAgICBsaXN0LXN0eWxlOiBkaXNjO1xuICB9XG5cbiAgY29kZSB7XG4gICAgZm9udC1mYW1pbHk6ICRmb250LWZhbWlseS1tb25vO1xuICB9XG5cbiAgcHJlIHtcbiAgICBwYWRkaW5nOiAwLjdyZW0gMXJlbTtcbiAgICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcbiAgICBiYWNrZ3JvdW5kOiAkY29sb3ItZGFya2VyO1xuICAgIGNvbG9yOiAkY29sb3Itd2hpdGU7XG4gICAgb3ZlcmZsb3cteDogYXV0bztcblxuICAgIGNvZGUge1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgfVxuICB9XG5cbiAgcCBjb2RlIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgcGFkZGluZzogMCAwLjNyZW07XG4gICAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG4gICAgYmFja2dyb3VuZDogJGNvbG9yLWxpZ2h0ZXI7XG4gIH1cblxuICBhIHtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICBjdXJzb3I6IGRlZmF1bHQ7XG4gICAgY29sb3I6IGJsdWU7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XG4gIH1cblxuICB1bCxcbiAgb2wge1xuICAgIHBhZGRpbmctbGVmdDogMnJlbTtcbiAgfVxuXG4gIGxpIHtcbiAgICAmID4gcCxcbiAgICAmID4gb2wsXG4gICAgJiA+IHVsIHtcbiAgICAgIG1hcmdpbjogMDtcbiAgICB9XG4gIH1cblxuICBibG9ja3F1b3RlIHtcbiAgICBib3JkZXItbGVmdDogM3B4IHNvbGlkICRjb2xvci1saWdodGVyO1xuICAgIHBhZGRpbmctbGVmdDogMXJlbTtcbiAgICBmb250LXN0eWxlOiBpdGFsaWM7XG5cbiAgICBwIHtcbiAgICAgIG1hcmdpbjogMDtcbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tbXVsdGlzZWxlY3QoXG4gIDpjbGFzcz1ge1xuICAgICdkaXRvLW11bHRpc2VsZWN0LXNpbmdsZSc6ICFtdWx0aXBsZSxcbiAgICAnZGl0by1tdWx0aXNlbGVjdC1tdWx0aXBsZSc6IG11bHRpcGxlXG4gIH1gXG4pXG4gIFZ1ZU11bHRpc2VsZWN0KFxuICAgIHJlZj1cImVsZW1lbnRcIlxuICAgIHYtbW9kZWw9XCJzZWxlY3RlZE9wdGlvbnNcIlxuICAgIDpjbGFzcz1cInsgJ211bHRpc2VsZWN0LS1zaG93LWhpZ2hsaWdodCc6IHNob3dIaWdobGlnaHQgfVwiXG4gICAgOnNob3dMYWJlbHM9XCJmYWxzZVwiXG4gICAgOnBsYWNlaG9sZGVyPVwicGxhY2Vob2xkZXJcIlxuICAgIHRhZ1BsYWNlaG9sZGVyPVwiUHJlc3MgZW50ZXIgdG8gYWRkIG5ldyB0YWdcIlxuICAgIDpvcHRpb25zPVwicG9wdWxhdGUgJiYgYWN0aXZlT3B0aW9ucyB8fCBbXVwiXG4gICAgOmN1c3RvbUxhYmVsPVwiZ2V0TGFiZWxGb3JPcHRpb25cIlxuICAgIDp0cmFja0J5PVwib3B0aW9uVmFsdWVcIlxuICAgIDpncm91cExhYmVsPVwiZ3JvdXBCeUxhYmVsXCJcbiAgICA6Z3JvdXBWYWx1ZXM9XCJncm91cEJ5T3B0aW9uc1wiXG4gICAgOm11bHRpcGxlPVwibXVsdGlwbGVcIlxuICAgIDp0YWdnYWJsZT1cInRhZ2dhYmxlXCJcbiAgICA6c2VhcmNoYWJsZT1cInNlYXJjaGFibGVcIlxuICAgIDppbnRlcm5hbFNlYXJjaD1cIiFzZWFyY2hGaWx0ZXJcIlxuICAgIDpwcmVzZXJ2ZVNlYXJjaD1cIiEhc2VhcmNoRmlsdGVyXCJcbiAgICA6Y2xlYXJPblNlbGVjdD1cIiFzZWFyY2hGaWx0ZXJcIlxuICAgIDpjbG9zZU9uU2VsZWN0PVwiIXN0YXlPcGVuXCJcbiAgICA6bG9hZGluZz1cImlzTG9hZGluZ1wiXG4gICAgdi1iaW5kPVwiYXR0cmlidXRlc1wiXG4gICAgQG9wZW49XCJvbk9wZW5cIlxuICAgIEBjbG9zZT1cIm9uQ2xvc2VcIlxuICAgIEB0YWc9XCJvbkFkZFRhZ1wiXG4gICAgQHNlYXJjaC1jaGFuZ2U9XCJvblNlYXJjaENoYW5nZVwiXG4gIClcbiAgYnV0dG9uLmRpdG8tYnV0dG9uLWNsZWFyLmRpdG8tYnV0dG9uLW92ZXJsYXkoXG4gICAgdi1pZj1cInNob3dDbGVhckJ1dHRvblwiXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgIEBjbGljaz1cImNsZWFyXCJcbiAgKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcbmltcG9ydCBEaXRvQ29udGV4dCBmcm9tICcuLi9EaXRvQ29udGV4dC5qcydcbmltcG9ydCBUeXBlTWl4aW4gZnJvbSAnLi4vbWl4aW5zL1R5cGVNaXhpbi5qcydcbmltcG9ydCBPcHRpb25zTWl4aW4gZnJvbSAnLi4vbWl4aW5zL09wdGlvbnNNaXhpbi5qcydcbmltcG9ydCBWdWVNdWx0aXNlbGVjdCBmcm9tICd2dWUtbXVsdGlzZWxlY3QnXG5pbXBvcnQgeyBnZXRTY2hlbWFBY2Nlc3NvciB9IGZyb20gJy4uL3V0aWxzL2FjY2Vzc29yLmpzJ1xuaW1wb3J0IHsgaXNCb29sZWFuIH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKCdtdWx0aXNlbGVjdCcsIHtcbiAgbWl4aW5zOiBbT3B0aW9uc01peGluXSxcbiAgY29tcG9uZW50czogeyBWdWVNdWx0aXNlbGVjdCB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlzTW91bnRlZDogZmFsc2UsXG4gICAgICBzZWFyY2hlZE9wdGlvbnM6IG51bGwsXG4gICAgICBwb3B1bGF0ZTogZmFsc2VcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBzZWxlY3RlZE9wdGlvbnM6IHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubXVsdGlwbGVcbiAgICAgICAgICA/ICh0aGlzLnNlbGVjdGVkVmFsdWUgfHwgW10pXG4gICAgICAgICAgICAgIC5tYXAoXG4gICAgICAgICAgICAgICAgLy8gSWYgYW4gb3B0aW9uIGNhbm5vdCBiZSBmb3VuZCwgd2UgbWF5IGJlIGluIHRhZ2dhYmxlIG1vZGUgYW5kXG4gICAgICAgICAgICAgICAgLy8gY2FuIGFkZCBpdC5cbiAgICAgICAgICAgICAgICB2YWx1ZSA9PiAoXG4gICAgICAgICAgICAgICAgICB0aGlzLmdldE9wdGlvbkZvclZhbHVlKHZhbHVlKSB8fCB0aGlzLmFkZFRhZ09wdGlvbih2YWx1ZSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgLy8gRmlsdGVyIG91dCBvcHRpb25zIHRoYXQgd2UgY291bGRuJ3QgbWF0Y2guXG4gICAgICAgICAgICAgIC8vIFRPRE86IFNob3VsZCB3ZSBkaXNwbGF5IGFuIGVycm9yIGluc3RlYWQ/XG4gICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICA6IHRoaXMuc2VsZWN0ZWRPcHRpb25cbiAgICAgIH0sXG5cbiAgICAgIHNldChvcHRpb24pIHtcbiAgICAgICAgLy8gQ29udmVydCB2YWx1ZSB0byBvcHRpb25zIG9iamVjdCwgc2luY2UgdnVlLW11bHRpc2VsZWN0IGNhbid0IG1hcCB0aGF0XG4gICAgICAgIC8vIGl0c2VsZiB1bmZvcnR1bmF0ZWx5LiBgdHJhY2stYnlgIGlzIHVzZWQgZm9yIDprZXkgbWFwcGluZyBpdCBzZWVtcy5cbiAgICAgICAgdGhpcy5zZWxlY3RlZFZhbHVlID0gdGhpcy5tdWx0aXBsZVxuICAgICAgICAgID8gKG9wdGlvbiB8fCBbXSkubWFwKHZhbHVlID0+IHRoaXMuZ2V0VmFsdWVGb3JPcHRpb24odmFsdWUpKVxuICAgICAgICAgIDogdGhpcy5nZXRWYWx1ZUZvck9wdGlvbihvcHRpb24pXG4gICAgICAgIHRoaXMub25DaGFuZ2UoKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhY3RpdmVPcHRpb25zKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2VhcmNoZWRPcHRpb25zIHx8IHRoaXMub3B0aW9uc1xuICAgIH0sXG5cbiAgICBtdWx0aXBsZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ211bHRpcGxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSksXG5cbiAgICBzZWFyY2hhYmxlOiBnZXRTY2hlbWFBY2Nlc3Nvcignc2VhcmNoYWJsZScsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0pLFxuXG4gICAgdGFnZ2FibGU6IGdldFNjaGVtYUFjY2Vzc29yKCd0YWdnYWJsZScsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0pLFxuXG4gICAgc3RheU9wZW46IGdldFNjaGVtYUFjY2Vzc29yKCdzdGF5T3BlbicsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0pLFxuXG4gICAgcGxhY2Vob2xkZXIoKSB7XG4gICAgICBsZXQgeyBwbGFjZWhvbGRlciwgc2VhcmNoYWJsZSwgdGFnZ2FibGUgfSA9IHRoaXMuc2NoZW1hXG4gICAgICBpZiAoaXNCb29sZWFuKHBsYWNlaG9sZGVyKSkge1xuICAgICAgICBwbGFjZWhvbGRlciA9IHBsYWNlaG9sZGVyID8gdW5kZWZpbmVkIDogbnVsbFxuICAgICAgfVxuICAgICAgcmV0dXJuIHBsYWNlaG9sZGVyID09PSB1bmRlZmluZWRcbiAgICAgICAgPyBzZWFyY2hhYmxlICYmIHRhZ2dhYmxlXG4gICAgICAgICAgPyBgU2VhcmNoIG9yIGFkZCBhICR7dGhpcy5sYWJlbH1gXG4gICAgICAgICAgOiBzZWFyY2hhYmxlXG4gICAgICAgICAgICA/IGBTZWxlY3Qgb3Igc2VhcmNoICR7dGhpcy5sYWJlbH1gXG4gICAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICA6IHBsYWNlaG9sZGVyXG4gICAgfSxcblxuICAgIHNob3dIaWdobGlnaHQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc01vdW50ZWQgJiYgdGhpcy4kcmVmcy5lbGVtZW50LnBvaW50ZXJEaXJ0eVxuICAgIH1cbiAgfSxcblxuICBtb3VudGVkKCkge1xuICAgIHRoaXMuaXNNb3VudGVkID0gdHJ1ZVxuICAgIGlmICh0aGlzLmF1dG9mb2N1cykge1xuICAgICAgLy8gdnVlLW11bHRpc2VsZWN0IGRvZXNuJ3Qgc3VwcG9ydCB0aGUgYXV0b2ZvY3VzIGF0dHJpYnV0ZS4gV2UgbmVlZCB0b1xuICAgICAgLy8gaGFuZGxlIGl0IGhlcmUuXG4gICAgICB0aGlzLmZvY3VzKClcbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGFkZFRhZ09wdGlvbih0YWcpIHtcbiAgICAgIGlmICh0aGlzLnRhZ2dhYmxlKSB7XG4gICAgICAgIGNvbnN0IHsgb3B0aW9uTGFiZWwsIG9wdGlvblZhbHVlIH0gPSB0aGlzXG4gICAgICAgIGNvbnN0IG9wdGlvbiA9XG4gICAgICAgICAgb3B0aW9uTGFiZWwgJiYgb3B0aW9uVmFsdWVcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIFtvcHRpb25MYWJlbF06IHRhZyxcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBEZWZpbmUgYSBzaW1wbGUgc2NoZW1hIG9wdGlvbiB0byBjb252ZXJ0IHRoZSB0YWcgdmFsdWVcbiAgICAgICAgICAgICAgICAvLyB0byBzb21ldGhpbmcgZWxzZSwgZS5nLiBgdG9UYWc6IHRhZyA9PiB1bmRlcnNjb3JlKHRhZylgXG4gICAgICAgICAgICAgICAgW29wdGlvblZhbHVlXTogdGFnXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDogdGFnXG4gICAgICAgIHRoaXMub3B0aW9ucy5wdXNoKG9wdGlvbilcbiAgICAgICAgcmV0dXJuIG9wdGlvblxuICAgICAgfVxuICAgIH0sXG5cbiAgICBmb2N1c0VsZW1lbnQoKSB7XG4gICAgICB0aGlzLiRyZWZzLmVsZW1lbnQuYWN0aXZhdGUoKVxuICAgIH0sXG5cbiAgICBvbk9wZW4oKSB7XG4gICAgICB0aGlzLnBvcHVsYXRlID0gdHJ1ZVxuICAgIH0sXG5cbiAgICBvbkNsb3NlKCkge1xuICAgICAgLy8gU2luY2Ugd2UgZG9uJ3QgZmlyZSBibHVyIGV2ZW50cyB3aGlsZSB0aGUgbXVsdGlzZWxlY3QgaXMgb3BlbiAoc2VlXG4gICAgICAvLyBiZWxvdyksIHdlIG5lZWQgdG8gZG8gaXQgaGVyZSwgd2hlbiBpdCdzIGFjdHVhbGx5IGNsb3NlZC5cbiAgICAgIGlmICh0aGlzLmZvY3VzZWQpIHtcbiAgICAgICAgdGhpcy5vbkJsdXIoKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBvbkJsdXIoKSB7XG4gICAgICBpZiAoIXRoaXMuJHJlZnMuZWxlbWVudC5pc09wZW4pIHtcbiAgICAgICAgVHlwZU1peGluLm1ldGhvZHMub25CbHVyLmNhbGwodGhpcylcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgb25BZGRUYWcodGFnKSB7XG4gICAgICBjb25zdCBvcHRpb24gPSB0aGlzLmFkZFRhZ09wdGlvbih0YWcpXG4gICAgICBpZiAob3B0aW9uKSB7XG4gICAgICAgIHRoaXMudmFsdWUucHVzaCh0aGlzLmdldFZhbHVlRm9yT3B0aW9uKG9wdGlvbikpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIG9uU2VhcmNoQ2hhbmdlKHF1ZXJ5KSB7XG4gICAgICBpZiAodGhpcy5zZWFyY2hGaWx0ZXIpIHtcbiAgICAgICAgaWYgKHF1ZXJ5KSB7XG4gICAgICAgICAgLy8gU2V0IGBzZWFyY2hlZE9wdGlvbnNgIHRvIGFuIGVtcHR5IGFycmF5LCBiZWZvcmUgaXQgd2lsbCBiZVxuICAgICAgICAgIC8vIHBvcHVsYXRlZCBhc3luY2hyb25vdXNseSB3aXRoIHRoZSBhY3R1YWwgcmVzdWx0cy5cbiAgICAgICAgICB0aGlzLnNlYXJjaGVkT3B0aW9ucyA9IFtdXG4gICAgICAgICAgdGhpcy5zZWFyY2hlZE9wdGlvbnMgPSBhd2FpdCB0aGlzLnJlc29sdmVEYXRhKFxuICAgICAgICAgICAgKCkgPT4gdGhpcy5zZWFyY2hGaWx0ZXIobmV3IERpdG9Db250ZXh0KHRoaXMsIHsgcXVlcnkgfSkpXG4gICAgICAgICAgKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIENsZWFyIGBzZWFyY2hlZE9wdGlvbnNgIHdoZW4gdGhlIHF1ZXJ5IGlzIGNsZWFyZWQuXG4gICAgICAgICAgdGhpcy5zZWFyY2hlZE9wdGlvbnMgPSBudWxsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuQGltcG9ydCAndnVlLW11bHRpc2VsZWN0L2Rpc3QvdnVlLW11bHRpc2VsZWN0LmNzcyc7XG5cbiRzcGlubmVyLXdpZHRoOiAkc2VsZWN0LWFycm93LXdpZHRoO1xuJHRhZy1pY29uLXdpZHRoOiAxLjhlbTtcbiR0YWctbWFyZ2luOiAycHg7XG4kdGFnLXBhZGRpbmc6IDNweDtcbiR0YWctbGluZS1oZWlnaHQ6IDFlbTtcblxuLmRpdG8tbXVsdGlzZWxlY3Qge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG5cbiAgJi5kaXRvLW11bHRpc2VsZWN0LXNpbmdsZSB7XG4gICAgLS1pbnB1dC13aWR0aDogMTAwJTtcbiAgfVxuXG4gICYuZGl0by1tdWx0aXNlbGVjdC1tdWx0aXBsZSB7XG4gICAgLS1pbnB1dC13aWR0aDogYXV0bztcbiAgfVxuXG4gICYuZGl0by1oYXMtZXJyb3JzIHtcbiAgICAmX190YWdzIHtcbiAgICAgIGJvcmRlci1jb2xvcjogJGNvbG9yLWVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC5kaXRvLWJ1dHRvbi1jbGVhciB7XG4gICAgd2lkdGg6ICRzcGlubmVyLXdpZHRoO1xuICB9XG5cbiAgLm11bHRpc2VsZWN0IHtcbiAgICAkc2VsZjogbGFzdC1zZWxlY3RvcigmKTtcblxuICAgIGZvbnQtc2l6ZTogaW5oZXJpdDtcbiAgICBtaW4taGVpZ2h0OiBpbmhlcml0O1xuICAgIGNvbG9yOiAkY29sb3ItYmxhY2s7XG5cbiAgICAmLS1hY3RpdmUge1xuICAgICAgI3skc2VsZn1fX3BsYWNlaG9sZGVyIHtcbiAgICAgICAgLy8gRG9uJ3QgdXNlIGBkaXNwbGF5OiBub25lYCB0byBoaWRlIHBsYWNlLWhvbGRlciwgYXMgdGhlIGxheW91dCB3b3VsZFxuICAgICAgICAvLyBjb2xsYXBzZS5cbiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgICB9XG5cbiAgICAgICN7JHNlbGZ9X19zaW5nbGUsXG4gICAgICAjeyRzZWxmfV9faW5wdXQge1xuICAgICAgICAvLyBTYWRseSwgdnVlLXNlbGVjdCBzZXRzIGBzdHlsZT1cIndpZHRoXCJgIGluIGFkZGl0aW9uIHRvIHVzaW5nIGNsYXNzZXNcbiAgICAgICAgLy8gc28gYCFpbXBvcnRhbnRgIGlzIG5lY2Vzc2FyeTpcbiAgICAgICAgd2lkdGg6IHZhcigtLWlucHV0LXdpZHRoKSAhaW1wb3J0YW50O1xuICAgICAgfVxuXG4gICAgICAjeyRzZWxmfV9fdGFncyB7XG4gICAgICAgIGJvcmRlci1jb2xvcjogJGNvbG9yLWFjdGl2ZTtcbiAgICAgICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMDtcbiAgICAgICAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDA7XG4gICAgICB9XG5cbiAgICAgICN7JHNlbGZ9X19jb250ZW50LXdyYXBwZXIge1xuICAgICAgICBib3JkZXI6ICRib3JkZXItd2lkdGggc29saWQgJGNvbG9yLWFjdGl2ZTtcbiAgICAgICAgYm9yZGVyLXRvcC1jb2xvcjogJGJvcmRlci1jb2xvcjtcbiAgICAgICAgbWFyZ2luOiAtMXB4IDAgMDtcbiAgICAgICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMDtcbiAgICAgICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDA7XG4gICAgICB9XG5cbiAgICAgICYjeyRzZWxmfS0tYWJvdmUge1xuICAgICAgICAjeyRzZWxmfV9fdGFncyB7XG4gICAgICAgICAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG4gICAgICAgICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMDtcbiAgICAgICAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMDtcbiAgICAgICAgfVxuXG4gICAgICAgICN7JHNlbGZ9X19jb250ZW50LXdyYXBwZXIge1xuICAgICAgICAgIGJvcmRlcjogJGJvcmRlci13aWR0aCBzb2xpZCAkY29sb3ItYWN0aXZlO1xuICAgICAgICAgIGJvcmRlci1ib3R0b20tY29sb3I6ICRib3JkZXItY29sb3I7XG4gICAgICAgICAgbWFyZ2luOiAwIDAgLTFweDtcbiAgICAgICAgICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcbiAgICAgICAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAwO1xuICAgICAgICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgJl9fdGFncyB7XG4gICAgICBmb250LXNpemU6IGluaGVyaXQ7XG4gICAgICBvdmVyZmxvdzogYXV0bztcbiAgICAgIG1pbi1oZWlnaHQ6IGluaGVyaXQ7XG4gICAgICBwYWRkaW5nOiAwICRzcGlubmVyLXdpZHRoIDAgMDtcbiAgICAgIC8vIFNvIHRhZ3MgY2FuIGZsb2F0IG9uIG11bHRpcGxlIGxpbmVzIGFuZCBoYXZlIHByb3BlciBtYXJnaW5zOlxuICAgICAgcGFkZGluZy1ib3R0b206ICR0YWctbWFyZ2luO1xuICAgIH1cblxuICAgICZfX3RhZyB7XG4gICAgICBmbG9hdDogbGVmdDtcbiAgICAgIG1hcmdpbjogJHRhZy1tYXJnaW4gMCAwICR0YWctbWFyZ2luO1xuICAgICAgYm9yZGVyLXJhZGl1czogMWVtO1xuICAgICAgcGFkZGluZzogJHRhZy1wYWRkaW5nICR0YWctaWNvbi13aWR0aCAkdGFnLXBhZGRpbmcgMC44ZW07XG4gICAgICBsaW5lLWhlaWdodDogJHRhZy1saW5lLWhlaWdodDtcbiAgICAgIGhlaWdodDogY2FsYygkaW5wdXQtaGVpZ2h0IC0gMiAqICR0YWctcGFkZGluZyk7XG4gICAgfVxuXG4gICAgJl9fdGFncy13cmFwIHtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgICAgbGluZS1oZWlnaHQ6IDA7XG4gICAgfVxuXG4gICAgJl9fc2luZ2xlLFxuICAgICZfX3BsYWNlaG9sZGVyLFxuICAgICZfX2lucHV0IHtcbiAgICAgIGZvbnQtc2l6ZTogaW5oZXJpdDtcbiAgICAgIGxpbmUtaGVpZ2h0OiBpbmhlcml0O1xuICAgICAgbWluLWhlaWdodDogMDtcbiAgICAgIG1hcmdpbjogMCAwIDFweCAwO1xuICAgICAgLy8gU2FkbHksIHZ1ZS1zZWxlY3Qgc2V0cyBzdHlsZT1cInBhZGRpbmc6IC4uLjtcIiBpbiBhZGRpdGlvbiB0byB1c2luZ1xuICAgICAgLy8gY2xhc3Nlcywgc28gYCFpbXBvcnRhbnRgIGlzIG5lY2Vzc2FyeTpcbiAgICAgIHBhZGRpbmc6ICRpbnB1dC1wYWRkaW5nICFpbXBvcnRhbnQ7XG4gICAgICAvLyBTbyBpbnB1dCBjYW4gZmxvYXQgbmV4dCB0byB0YWdzIGFuZCBoYXZlIHByb3BlciBtYXJnaW5zIHdpdGhcbiAgICAgIC8vICZfX3RhZ3M6XG4gICAgICBwYWRkaW5nLWJvdHRvbTogMCAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICB9XG5cbiAgICAmX19wbGFjZWhvbGRlcixcbiAgICAmX19pbnB1dDo6cGxhY2Vob2xkZXIge1xuICAgICAgY29sb3I6ICRjb2xvci1wbGFjZWhvbGRlcjtcbiAgICB9XG5cbiAgICAmX19wbGFjZWhvbGRlciB7XG4gICAgICAmOjphZnRlciB7XG4gICAgICAgIC8vIEVuZm9yY2UgYWN0dWFsIGxpbmUtaGVpZ2h0IGZvciBwb3NpdGlvbmluZy5cbiAgICAgICAgY29udGVudDogJ1xcMjAwYic7XG4gICAgICB9XG4gICAgfVxuXG4gICAgJl9fc2VsZWN0LFxuICAgICZfX3NwaW5uZXIge1xuICAgICAgcGFkZGluZzogMDtcbiAgICAgIC8vICRib3JkZXItd2lkdGggdG8gcHJldmVudCBtYXNraW5nIGJvcmRlciB3aXRoICZfX3NwaW5uZXJcbiAgICAgIHRvcDogJGJvcmRlci13aWR0aDtcbiAgICAgIHJpZ2h0OiAkYm9yZGVyLXdpZHRoO1xuICAgICAgYm90dG9tOiAkYm9yZGVyLXdpZHRoO1xuICAgICAgaGVpZ2h0OiBpbmhlcml0O1xuICAgICAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG4gICAgfVxuXG4gICAgJl9fc2VsZWN0IHtcbiAgICAgIHdpZHRoOiAwO1xuICAgICAgbWFyZ2luLXJpZ2h0OiBjYWxjKCRzZWxlY3QtYXJyb3ctd2lkdGggLyAyKTtcblxuICAgICAgJjo6YmVmb3JlIHtcbiAgICAgICAgQGluY2x1ZGUgYXJyb3coJHNlbGVjdC1hcnJvdy1zaXplKTtcblxuICAgICAgICBib3R0b206ICRzZWxlY3QtYXJyb3ctYm90dG9tO1xuICAgICAgICByaWdodDogY2FsYygtMSAqICRzZWxlY3QtYXJyb3ctc2l6ZSAvIDIpO1xuICAgICAgfVxuICAgIH1cblxuICAgICZfX3NwaW5uZXIge1xuICAgICAgd2lkdGg6ICRzcGlubmVyLXdpZHRoO1xuXG4gICAgICAmOjpiZWZvcmUsXG4gICAgICAmOjphZnRlciB7XG4gICAgICAgIC8vIENoYW5nZSB0aGUgd2lkdGggb2YgdGhlIGxvYWRpbmcgc3Bpbm5lclxuICAgICAgICBib3JkZXItd2lkdGg6IDNweDtcbiAgICAgICAgYm9yZGVyLXRvcC1jb2xvcjogJGNvbG9yLWFjdGl2ZTtcbiAgICAgICAgaW5zZXQ6IDA7XG4gICAgICAgIG1hcmdpbjogYXV0bztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAmX19vcHRpb24ge1xuICAgICAgJG9wdGlvbjogbGFzdC1zZWxlY3RvcigmKTtcblxuICAgICAgbWluLWhlaWdodDogdW5zZXQ7XG4gICAgICBoZWlnaHQ6IHVuc2V0O1xuICAgICAgbGluZS1oZWlnaHQ6ICR0YWctbGluZS1oZWlnaHQ7XG4gICAgICBwYWRkaW5nOiAkaW5wdXQtcGFkZGluZztcblxuICAgICAgJjo6YWZ0ZXIge1xuICAgICAgICAvLyBJbnN0cnVjdGlvbiB0ZXh0IGZvciBvcHRpb25zXG4gICAgICAgIHBhZGRpbmc6ICRpbnB1dC1wYWRkaW5nO1xuICAgICAgICBsaW5lLWhlaWdodDogJHRhZy1saW5lLWhlaWdodDtcbiAgICAgIH1cblxuICAgICAgLy8gT25seSBzaG93IHRoZSBoaWdobGlnaHQgb25jZSB0aGUgcHVsbGRvd24gaGFzIHJlY2VpdmVkIG1vdXNlIG9yXG4gICAgICAvLyBrZXlib2FyZCBpbnRlcmFjdGlvbiwgaW4gd2hpY2ggY2FzZSBgJi0tc2hvdy1oaWdobGlnaHRgIHdpbGwgYmUgc2V0LFxuICAgICAgLy8gd2hpY2ggaXMgY29udHJvbGxlZCBieSBgcG9pbnRlckRpcnR5YCBpbiB2dWUtbXVsdGlzZWxlY3QuXG4gICAgICAvLyBVbnRpbCB0aGVuLCBjbGVhciB0aGUgaGlnaGxpZ2h0IHN0eWxlLCBidXQgb25seSBpZiBpdCBpc24ndCBhbHNvXG4gICAgICAvLyBkaXNhYmxlZCBvciBzZWxlY3RlZCwgaW4gd2hpY2ggY2FzZSB3ZSB3YW50IHRvIGtlZXAgdGhlIHN0eWxlLlxuICAgICAgQGF0LXJvb3QgI3skc2VsZn06bm90KCN7JHNlbGZ9LS1zaG93LWhpZ2hsaWdodClcbiAgICAgICAgICAjeyRvcHRpb259Om5vdCgjeyRvcHRpb259LS1kaXNhYmxlZCk6bm90KCN7JG9wdGlvbn0tLXNlbGVjdGVkKSB7XG4gICAgICAgIGNvbG9yOiAkY29sb3ItdGV4dDtcbiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgICB9XG5cbiAgICAgICYtLWhpZ2hsaWdodCB7XG4gICAgICAgICY6OmFmdGVyIHtcbiAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgICAgICAgY29sb3I6ICRjb2xvci13aGl0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIEBhdC1yb290ICN7JHNlbGZ9I3skc2VsZn0tLXNob3ctaGlnaGxpZ2h0ICN7bGFzdC1zZWxlY3RvcigmKX0ge1xuICAgICAgICAgIGNvbG9yOiAkY29sb3ItdGV4dC1pbnZlcnRlZDtcbiAgICAgICAgICBiYWNrZ3JvdW5kOiAkY29sb3ItYWN0aXZlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgICYtLXNlbGVjdGVkIHtcbiAgICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgICAgICAgY29sb3I6ICRjb2xvci10ZXh0O1xuICAgICAgICBiYWNrZ3JvdW5kOiAkY29sb3ItaGlnaGxpZ2h0O1xuXG4gICAgICAgICYjeyRvcHRpb259LS1oaWdobGlnaHQge1xuICAgICAgICAgIGNvbG9yOiAkY29sb3ItdGV4dC1pbnZlcnRlZDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAmLS1kaXNhYmxlZCB7XG4gICAgICAgIGJhY2tncm91bmQ6IG5vbmU7XG4gICAgICAgIGNvbG9yOiAkY29sb3ItZGlzYWJsZWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgJl9fdGFnIHtcbiAgICAgIGNvbG9yOiAkY29sb3ItdGV4dC1pbnZlcnRlZDtcbiAgICAgIGJhY2tncm91bmQ6ICRjb2xvci1hY3RpdmU7XG4gICAgfVxuXG4gICAgJl9fdGFnLWljb24ge1xuICAgICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDFlbTtcbiAgICAgIHdpZHRoOiAkdGFnLWljb24td2lkdGg7XG4gICAgICBtYXJnaW46IDA7XG5cbiAgICAgICY6OmFmdGVyIHtcbiAgICAgICAgQGV4dGVuZCAlaWNvbi1jbGVhcjtcblxuICAgICAgICBmb250LXNpemU6IDAuOWVtO1xuICAgICAgICBjb2xvcjogJGNvbG9yLXRleHQtaW52ZXJ0ZWQ7XG4gICAgICB9XG5cbiAgICAgICY6aG92ZXI6OmFmdGVyIHtcbiAgICAgICAgY29sb3I6ICRjb2xvci10ZXh0O1xuICAgICAgfVxuICAgIH1cblxuICAgICZfX3RhZ3MsXG4gICAgJl9fY29udGVudC13cmFwcGVyIHtcbiAgICAgIGJvcmRlcjogJGJvcmRlci1zdHlsZTtcbiAgICAgIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzO1xuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsImltcG9ydCB7IGdldFNjaGVtYUFjY2Vzc29yIH0gZnJvbSAnLi4vdXRpbHMvYWNjZXNzb3IuanMnXG5pbXBvcnQgeyBpc0FycmF5IH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgY29tcHV0ZWQ6IHtcbiAgICBpbnB1dFZhbHVlOiB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlICE9PSBudWxsID8gdGhpcy52YWx1ZSA6ICcnXG4gICAgICB9LFxuXG4gICAgICBzZXQodmFsdWUpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9XG4gICAgICAgICAgdmFsdWUgIT09ICcnXG4gICAgICAgICAgICA/IHRoaXMuaXNJbnRlZ2VyXG4gICAgICAgICAgICAgID8gcGFyc2VJbnQodmFsdWUsIDEwKVxuICAgICAgICAgICAgICA6IHBhcnNlRmxvYXQodmFsdWUpXG4gICAgICAgICAgICA6IG51bGxcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gQG92ZXJyaWRhYmxlXG4gICAgaXNJbnRlZ2VyKCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSxcblxuICAgIHN0ZXBWYWx1ZSgpIHtcbiAgICAgIC8vIERvbid0IHNob3cgc3RlcHMgaWYgdGhlIGlucHV0IGlzIGFsc28gY2xlYXJhYmxlLCBzaW5jZSB0aGUgc3RlcCBidXR0b25zXG4gICAgICAvLyB3b3VsZCBjb2xsaWRlIHdpdGggdGhlIGNsZWFyIGJ1dHRvbi5cbiAgICAgIHJldHVybiB0aGlzLmNsZWFyYWJsZVxuICAgICAgICA/IG51bGxcbiAgICAgICAgOiB0aGlzLnN0ZXAgPT0gbnVsbCAmJiAhdGhpcy5pc0ludGVnZXJcbiAgICAgICAgICA/ICdhbnknXG4gICAgICAgICAgOiB0aGlzLnN0ZXBcbiAgICB9LFxuXG4gICAgZGVjaW1hbHM6IGdldFNjaGVtYUFjY2Vzc29yKCdkZWNpbWFscycsIHtcbiAgICAgIHR5cGU6IE51bWJlclxuICAgIH0pLFxuXG4gICAgc3RlcDogZ2V0U2NoZW1hQWNjZXNzb3IoJ3N0ZXAnLCB7XG4gICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICBnZXQoc3RlcCkge1xuICAgICAgICAvLyBGb3IgaW50ZWdlcnMsIHJvdW5kIHRoZSBzdGVwcyB0byB0aGUgbmV4dCBiaWdnZXIgaW50ZWdlciB2YWx1ZTpcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNJbnRlZ2VyICYmIHN0ZXAgIT0gbnVsbCA/IE1hdGguY2VpbChzdGVwKSA6IHN0ZXBcbiAgICAgIH1cbiAgICB9KSxcblxuICAgIG1pbjogZ2V0U2NoZW1hQWNjZXNzb3IoJ21pbicsIHtcbiAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgIGdldChtaW4pIHtcbiAgICAgICAgbWluID1cbiAgICAgICAgICBtaW4gPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyB0aGlzLmdldFNjaGVtYVZhbHVlKCdyYW5nZScsIHsgdHlwZTogQXJyYXkgfSk/LlswXVxuICAgICAgICAgICAgOiBtaW5cbiAgICAgICAgcmV0dXJuIHRoaXMuaXNJbnRlZ2VyICYmIG1pbiAhPSBudWxsID8gTWF0aC5mbG9vcihtaW4pIDogbWluXG4gICAgICB9XG4gICAgfSksXG5cbiAgICBtYXg6IGdldFNjaGVtYUFjY2Vzc29yKCdtYXgnLCB7XG4gICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICBnZXQobWF4KSB7XG4gICAgICAgIG1heCA9XG4gICAgICAgICAgbWF4ID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gdGhpcy5nZXRTY2hlbWFWYWx1ZSgncmFuZ2UnLCB7IHR5cGU6IEFycmF5IH0pPy5bMV1cbiAgICAgICAgICAgIDogbWF4XG4gICAgICAgIHJldHVybiB0aGlzLmlzSW50ZWdlciAmJiBtYXggIT0gbnVsbCA/IE1hdGguY2VpbChtYXgpIDogbWF4XG4gICAgICB9XG4gICAgfSksXG5cbiAgICByYW5nZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ3JhbmdlJywge1xuICAgICAgdHlwZTogQXJyYXksXG4gICAgICBnZXQoKSB7XG4gICAgICAgIC8vIGB0aGlzLm1pbmAsIGB0aGlzLm1heGAgYWxyZWFkeSBzdXBwb3J0IGBzY2hlbWEucmFuZ2VgLFxuICAgICAgICAvLyBzbyByZWRpcmVjdCB0aGVyZS5cbiAgICAgICAgY29uc3QgeyBtaW4sIG1heCB9ID0gdGhpc1xuICAgICAgICByZXR1cm4gbWluICE9IG51bGwgJiYgbWF4ICE9IG51bGwgPyBbbWluLCBtYXhdIDogdW5kZWZpbmVkXG4gICAgICB9LFxuXG4gICAgICBzZXQocmFuZ2UpIHtcbiAgICAgICAgLy8gUHJvdmlkZSBhIHNldHRlciB0aGF0IGRlbGVnYXRlcyB0byBgW3RoaXMubWluLCB0aGlzLm1heF1gLFxuICAgICAgICAvLyBzaW5jZSB0aG9zZSBhbHJlYWR5IGhhbmRsZSBgc2NoZW1hLnJhbmdlYC5cbiAgICAgICAgaWYgKGlzQXJyYXkocmFuZ2UpKSB7XG4gICAgICAgICAgO1t0aGlzLm1pbiwgdGhpcy5tYXhdID0gcmFuZ2VcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGdldFZhbGlkYXRpb25zKCkge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbnMgPSB7fVxuICAgICAgY29uc3QgeyByYW5nZSwgbWluLCBtYXgsIGRlY2ltYWxzLCBzdGVwIH0gPSB0aGlzXG4gICAgICBpZiAocmFuZ2UpIHtcbiAgICAgICAgdmFsaWRhdGlvbnMucmFuZ2UgPSByYW5nZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKG1pbiAhPSBudWxsKSB7XG4gICAgICAgICAgdmFsaWRhdGlvbnMubWluID0gbWluXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1heCAhPSBudWxsKSB7XG4gICAgICAgICAgdmFsaWRhdGlvbnMubWF4ID0gbWF4XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChkZWNpbWFscyAhPSBudWxsKSB7XG4gICAgICAgIHZhbGlkYXRpb25zLmRlY2ltYWxzID0gZGVjaW1hbHNcbiAgICAgIH0gZWxzZSBpZiAoc3RlcCkge1xuICAgICAgICBjb25zdCBkZWNpbWFscyA9IChgJHtzdGVwfWAuc3BsaXQoJy4nKVsxXSB8fCAnJykubGVuZ3RoXG4gICAgICAgIGlmIChkZWNpbWFscyA+IDApIHtcbiAgICAgICAgICB2YWxpZGF0aW9ucy5kZWNpbWFscyA9IGRlY2ltYWxzXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsaWRhdGlvbnMuaW50ZWdlciA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuaXNJbnRlZ2VyKSB7XG4gICAgICAgIHZhbGlkYXRpb25zLmludGVnZXIgPSB0cnVlXG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsaWRhdGlvbnNcbiAgICB9XG4gIH1cbn1cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG5JbnB1dEZpZWxkLmRpdG8tbnVtYmVyKFxuICA6aWQ9XCJkYXRhUGF0aFwiXG4gIHJlZj1cImVsZW1lbnRcIlxuICB2LW1vZGVsPVwiaW5wdXRWYWx1ZVwiXG4gIHR5cGU9XCJudW1iZXJcIlxuICB2LWJpbmQ9XCJhdHRyaWJ1dGVzXCJcbiAgOm1pbj1cIm1pblwiXG4gIDptYXg9XCJtYXhcIlxuICA6c3RlcD1cInN0ZXBWYWx1ZVwiXG4pXG4gIHRlbXBsYXRlKCNhZnRlcilcbiAgICBidXR0b24uZGl0by1idXR0b24tY2xlYXIuZGl0by1idXR0b24tb3ZlcmxheShcbiAgICAgIHYtaWY9XCJzaG93Q2xlYXJCdXR0b25cIlxuICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgICAgQGNsaWNrLnN0b3A9XCJjbGVhclwiXG4gICAgKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcbmltcG9ydCBOdW1iZXJNaXhpbiBmcm9tICcuLi9taXhpbnMvTnVtYmVyTWl4aW4uanMnXG5pbXBvcnQgeyBJbnB1dEZpZWxkIH0gZnJvbSAnQGRpdG9qcy91aS9zcmMnXG5cbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKFxuICBbJ251bWJlcicsICdpbnRlZ2VyJ10sXG4gIC8vIEB2dWUvY29tcG9uZW50XG4gIHtcbiAgICBtaXhpbnM6IFtOdW1iZXJNaXhpbl0sXG4gICAgY29tcG9uZW50czogeyBJbnB1dEZpZWxkIH0sXG4gICAgbmF0aXZlRmllbGQ6IHRydWUsXG4gICAgdGV4dEZpZWxkOiB0cnVlLFxuXG4gICAgY29tcHV0ZWQ6IHtcbiAgICAgIGlzSW50ZWdlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gJ2ludGVnZXInXG4gICAgICB9XG4gICAgfVxuICB9XG4pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG4vLyBPbmx5IHNob3cgc3BpbiBidXR0b25zIGlmIHRoZSBudW1iZXIgY29tcG9uZW50IGRlZmluZXMgYSBzdGVwIHNpemUuXG5pbnB1dFt0eXBlPSdudW1iZXInXTpub3QoW3N0ZXBdKSB7XG4gICY6Oi13ZWJraXQtaW5uZXItc3Bpbi1idXR0b24sXG4gICY6Oi13ZWJraXQtb3V0ZXItc3Bpbi1idXR0b24ge1xuICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbiAgICBtYXJnaW46IDA7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tb2JqZWN0KFxuICB2LWlmPVwiaXNSZWFkeVwiXG4gIDppZD1cImRhdGFQYXRoXCJcbiAgOmNsYXNzPVwic2NoZW1hLmNsYXNzXCJcbiAgOnN0eWxlPVwic2NoZW1hLnN0eWxlXCJcbilcbiAgLmRpdG8tb2JqZWN0LWNvbnRlbnQoXG4gICAgdi1pZj1cIm9iamVjdERhdGFcIlxuICApXG4gICAgLy8tIFN1cHBvcnQgdGhlIHNhbWUgcmVuZGVyaW5nIG9wdGlvbnMgYXMgVHlwZUxpc3Q6XG4gICAgRGl0b1NjaGVtYUlubGluZWQoXG4gICAgICB2LWlmPVwiaXNJbmxpbmVkXCJcbiAgICAgIDpsYWJlbD1cIm9iamVjdExhYmVsXCJcbiAgICAgIDpzY2hlbWE9XCJnZXRJdGVtRm9ybVNjaGVtYShzY2hlbWEsIG9iamVjdERhdGEsIGNvbnRleHQpXCJcbiAgICAgIDpkYXRhUGF0aD1cImRhdGFQYXRoXCJcbiAgICAgIDpkYXRhPVwib2JqZWN0RGF0YVwiXG4gICAgICA6bWV0YT1cIm5lc3RlZE1ldGFcIlxuICAgICAgOnN0b3JlPVwic3RvcmVcIlxuICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWQgfHwgaXNMb2FkaW5nXCJcbiAgICAgIDpjb2xsYXBzZWQ9XCJjb2xsYXBzZWRcIlxuICAgICAgOmNvbGxhcHNpYmxlPVwiY29sbGFwc2libGVcIlxuICAgIClcbiAgICBjb21wb25lbnQoXG4gICAgICB2LWVsc2UtaWY9XCJzY2hlbWEuY29tcG9uZW50XCJcbiAgICAgIDppcz1cInNjaGVtYS5jb21wb25lbnRcIlxuICAgICAgOmRhdGFQYXRoPVwiZGF0YVBhdGhcIlxuICAgICAgOmRhdGE9XCJvYmplY3REYXRhXCJcbiAgICAgIDpuZXN0ZWQ9XCJmYWxzZVwiXG4gICAgKVxuICAgIHNwYW4oXG4gICAgICB2LWVsc2UtaWY9XCJyZW5kZXJcIlxuICAgICAgdi1odG1sPVwicmVuZGVyKGdldENvbnRleHQoKSlcIlxuICAgIClcbiAgICBzcGFuKFxuICAgICAgdi1lbHNlXG4gICAgICB2LWh0bWw9XCJnZXRJdGVtTGFiZWwoc2NoZW1hLCBvYmplY3REYXRhKVwiXG4gICAgKVxuICBEaXRvRWRpdEJ1dHRvbnMoXG4gICAgOmNyZWF0YWJsZT1cImNyZWF0YWJsZVwiXG4gICAgOmRlbGV0YWJsZT1cIm9iamVjdERhdGEgJiYgZGVsZXRhYmxlXCJcbiAgICA6ZWRpdGFibGU9XCJvYmplY3REYXRhICYmIGVkaXRhYmxlXCJcbiAgICA6Y3JlYXRlUGF0aD1cInBhdGhcIlxuICAgIDplZGl0UGF0aD1cInBhdGhcIlxuICAgIDpidXR0b25zPVwiYnV0dG9uU2NoZW1hc1wiXG4gICAgOnNjaGVtYT1cInNjaGVtYVwiXG4gICAgOmRhdGFQYXRoPVwiZGF0YVBhdGhcIlxuICAgIDpkYXRhPVwib2JqZWN0RGF0YVwiXG4gICAgOnBhdGg9XCJwYXRoXCJcbiAgICA6bWV0YT1cIm1ldGFcIlxuICAgIDpzdG9yZT1cInN0b3JlXCJcbiAgICBAZGVsZXRlPVwiZGVsZXRlSXRlbShvYmplY3REYXRhKVwiXG4gIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b1R5cGVDb21wb25lbnQgZnJvbSAnLi4vRGl0b1R5cGVDb21wb25lbnQuanMnXG5pbXBvcnQgRGl0b0NvbnRleHQgZnJvbSAnLi4vRGl0b0NvbnRleHQuanMnXG5pbXBvcnQgU291cmNlTWl4aW4gZnJvbSAnLi4vbWl4aW5zL1NvdXJjZU1peGluLmpzJ1xuaW1wb3J0IHsgcmVzb2x2ZVNjaGVtYUNvbXBvbmVudCB9IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKCdvYmplY3QnLCB7XG4gIG1peGluczogW1NvdXJjZU1peGluXSxcblxuICBhbGlnbkJvdHRvbTogZmFsc2UsXG5cbiAgZ2V0U291cmNlVHlwZSh0eXBlKSB7XG4gICAgLy8gTm8gbmVlZCBmb3IgdHJhbnNmb3JtYXRpb24gaGVyZS4gU2VlIFR5cGVUcmVlTGlzdCBmb3IgZGV0YWlscy5cbiAgICByZXR1cm4gdHlwZVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgb2JqZWN0TGFiZWwoKSB7XG4gICAgICAvLyBPbmx5IHNob3cgYSBsYWJlbCBpZiB0aGUgb2JqZWN0IGlzIGNvbGxhcHNpYmxlLlxuICAgICAgcmV0dXJuIHRoaXMuY29sbGFwc2libGVcbiAgICAgICAgPyB0aGlzLmdldEl0ZW1MYWJlbCh0aGlzLnNjaGVtYSwgdGhpcy5vYmplY3REYXRhLCB7IGFzT2JqZWN0OiB0cnVlIH0pXG4gICAgICAgIDogbnVsbFxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0Q29udGV4dCgpIHtcbiAgICAgIHJldHVybiBuZXcgRGl0b0NvbnRleHQodGhpcywgeyBkYXRhOiB0aGlzLm9iamVjdERhdGEgfSlcbiAgICB9XG4gIH0sXG5cbiAgYXN5bmMgcHJvY2Vzc1NjaGVtYShcbiAgICBhcGksXG4gICAgc2NoZW1hLFxuICAgIG5hbWUsXG4gICAgcm91dGVzLFxuICAgIGxldmVsLFxuICAgIG5lc3RlZCA9IGZhbHNlLFxuICAgIGZsYXR0ZW4gPSBmYWxzZSxcbiAgICBwcm9jZXNzID0gbnVsbFxuICApIHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICByZXNvbHZlU2NoZW1hQ29tcG9uZW50KHNjaGVtYSksXG4gICAgICBTb3VyY2VNaXhpbi5wcm9jZXNzU2NoZW1hKFxuICAgICAgICBhcGksXG4gICAgICAgIHNjaGVtYSxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgcm91dGVzLFxuICAgICAgICBsZXZlbCxcbiAgICAgICAgbmVzdGVkLFxuICAgICAgICBmbGF0dGVuLFxuICAgICAgICBwcm9jZXNzXG4gICAgICApXG4gICAgXSlcbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLW9iamVjdCB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGJvcmRlcjogJGJvcmRlci1zdHlsZTtcbiAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogJGZvcm0tc3BhY2luZztcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcblxuICAuZGl0by1vYmplY3QtY29udGVudCB7XG4gICAgZmxleDogMCAxIDEwMCU7XG4gIH1cblxuICA+IC5kaXRvLWJ1dHRvbnMge1xuICAgIGZsZXg6IDEgMCAwJTtcbiAgICBtYXJnaW4tbGVmdDogJGZvcm0tc3BhY2luZztcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjxzY3JpcHQ+XG5pbXBvcnQgRGl0b1R5cGVDb21wb25lbnQgZnJvbSAnLi4vRGl0b1R5cGVDb21wb25lbnQuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvVHlwZUNvbXBvbmVudC5yZWdpc3RlcigncGFuZWwnLCB7XG4gIGRlZmF1bHRWYWx1ZTogKCkgPT4gdW5kZWZpbmVkLCAvLyBDYWxsYmFjayB0byBvdmVycmlkZSBgZGVmYXVsdFZhbHVlOiBudWxsYFxuICBleGNsdWRlVmFsdWU6IHRydWUsXG4gIGdlbmVyYXRlTGFiZWw6IGZhbHNlLFxuICBhbGlnbkJvdHRvbTogZmFsc2UsXG4gIG9taXRQYWRkaW5nOiB0cnVlLFxuXG4gIGdldFBhbmVsU2NoZW1hKGFwaSwgc2NoZW1hKSB7XG4gICAgLy8gRm9yIGEgVHlwZVBhbmVsLCB0aGUgY29tcG9uZW50IHNjaGVtYSBpcyBhbHNvIHRoZSBwYW5lbCBzY2hlbWEsIGJ1dFxuICAgIC8vIHJlbW92ZSB0aGUgYWRkZWQgbmFtZSwgc28gaXQgZG9lc24ndCBnZXQgYXBwZW5kZWQgdHdpY2UgdG8gZGF0YS1wYXRoLlxuICAgIGNvbnN0IHsgbmFtZSwgLi4ucGFuZWwgfSA9IHNjaGVtYVxuICAgIHJldHVybiBwYW5lbFxuICB9XG59KVxuPC9zY3JpcHQ+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxucHJvZ3Jlc3MuZGl0by1wcm9ncmVzcyhcbiAgOmlkPVwiZGF0YVBhdGhcIlxuICByZWY9XCJlbGVtZW50XCJcbiAgOnZhbHVlPVwicHJvZ3Jlc3NWYWx1ZVwiXG4gIDptYXg9XCJwcm9ncmVzc01heFwiXG4gIHYtYmluZD1cImF0dHJpYnV0ZXNcIlxuKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcbmltcG9ydCBOdW1iZXJNaXhpbiBmcm9tICcuLi9taXhpbnMvTnVtYmVyTWl4aW4uanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvVHlwZUNvbXBvbmVudC5yZWdpc3RlcigncHJvZ3Jlc3MnLCB7XG4gIG1peGluczogW051bWJlck1peGluXSxcbiAgY29tcHV0ZWQ6IHtcbiAgICBwcm9ncmVzc1ZhbHVlKCkge1xuICAgICAgbGV0IHsgdmFsdWUsIHJhbmdlLCBzdGVwIH0gPSB0aGlzXG4gICAgICBpZiAodmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKHJhbmdlKSB7XG4gICAgICAgICAgdmFsdWUgLT0gcmFuZ2VbMF1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RlcCkge1xuICAgICAgICAgIHZhbHVlID0gTWF0aC5yb3VuZCh2YWx1ZSAvIHN0ZXApICogc3RlcFxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSA9ICcnXG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWVcbiAgICB9LFxuXG4gICAgcHJvZ3Jlc3NNYXgoKSB7XG4gICAgICBjb25zdCB7IHJhbmdlIH0gPSB0aGlzXG4gICAgICByZXR1cm4gcmFuZ2UgPyByYW5nZVsxXSAtIHJhbmdlWzBdIDogbnVsbFxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbnVsLmRpdG8tcmFkaW8tYnV0dG9ucyhcbiAgOmlkPVwiZGF0YVBhdGhcIlxuICA6Y2xhc3M9XCJgZGl0by1sYXlvdXQtJHtzY2hlbWEubGF5b3V0IHx8ICd2ZXJ0aWNhbCd9YFwiXG4pXG4gIGxpKFxuICAgIHYtZm9yPVwib3B0aW9uIGluIG9wdGlvbnNcIlxuICApXG4gICAgbGFiZWxcbiAgICAgIGlucHV0LmRpdG8tcmFkaW8tYnV0dG9uKFxuICAgICAgICByZWY9XCJlbGVtZW50XCJcbiAgICAgICAgdi1tb2RlbD1cInNlbGVjdGVkVmFsdWVcIlxuICAgICAgICB0eXBlPVwicmFkaW9cIlxuICAgICAgICA6dmFsdWU9XCJnZXRWYWx1ZUZvck9wdGlvbihvcHRpb24pXCJcbiAgICAgICAgdi1iaW5kPVwiYXR0cmlidXRlc1wiXG4gICAgICApXG4gICAgICB8IHt7IGdldExhYmVsRm9yT3B0aW9uKG9wdGlvbikgfX1cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b1R5cGVDb21wb25lbnQgZnJvbSAnLi4vRGl0b1R5cGVDb21wb25lbnQuanMnXG5pbXBvcnQgT3B0aW9uc01peGluIGZyb20gJy4uL21peGlucy9PcHRpb25zTWl4aW4uanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvVHlwZUNvbXBvbmVudC5yZWdpc3RlcigncmFkaW8nLCB7XG4gIG1peGluczogW09wdGlvbnNNaXhpbl0sXG5cbiAgbmF0aXZlRmllbGQ6IHRydWVcbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1yYWRpby1idXR0b25zIHtcbiAgbGFiZWwge1xuICAgIEBleHRlbmQgJWlucHV0LWJvcmRlcmxlc3M7XG4gIH1cblxuICAuZGl0by1yYWRpby1idXR0b24ge1xuICAgIG1hcmdpbi1yaWdodDogJGZvcm0tc3BhY2luZztcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1zZWN0aW9uKDpjbGFzcz1cInsgJ2RpdG8tc2VjdGlvbi1sYWJlbGxlZCc6ICEhc2NoZW1hLmxhYmVsIH1cIilcbiAgRGl0b1BhbmUuZGl0by1zZWN0aW9uLXBhbmUoXG4gICAgOnNjaGVtYT1cImdldEl0ZW1Gb3JtU2NoZW1hKHNjaGVtYSwgaXRlbSwgY29udGV4dClcIlxuICAgIDpkYXRhUGF0aD1cImRhdGFQYXRoXCJcbiAgICA6ZGF0YT1cIml0ZW1cIlxuICAgIDptZXRhPVwibWV0YVwiXG4gICAgOnN0b3JlPVwic3RvcmVcIlxuICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcbmltcG9ydCB7IGdldEl0ZW1Gb3JtU2NoZW1hLCBwcm9jZXNzU2NoZW1hQ29tcG9uZW50cyB9IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKCdzZWN0aW9uJywge1xuICBkZWZhdWx0VmFsdWU6ICgpID0+IHVuZGVmaW5lZCwgLy8gQ2FsbGJhY2sgdG8gb3ZlcnJpZGUgYGRlZmF1bHRWYWx1ZTogbnVsbGBcbiAgaWdub3JlTWlzc2luZ1ZhbHVlOiBzY2hlbWEgPT4gIXNjaGVtYS5uZXN0ZWQgJiYgISgnZGVmYXVsdCcgaW4gc2NoZW1hKSxcbiAgZGVmYXVsdE5lc3RlZDogZmFsc2UsXG4gIGdlbmVyYXRlTGFiZWw6IGZhbHNlLFxuICBhbGlnbkJvdHRvbTogZmFsc2UsXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBpdGVtKCkge1xuICAgICAgcmV0dXJuIHRoaXMubmVzdGVkID8gdGhpcy52YWx1ZSA6IHRoaXMuZGF0YVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0SXRlbUZvcm1TY2hlbWFcbiAgfSxcblxuICBhc3luYyBwcm9jZXNzU2NoZW1hKGFwaSwgc2NoZW1hLCBuYW1lLCByb3V0ZXMsIGxldmVsKSB7XG4gICAgLy8gUHJvY2VzcyBzZWN0aW9uIGNvbXBvbmVudHMgc28gdGhlaXIgZm9ybXMgZ2V0IHJlc29sdmVkIHRvby5cbiAgICBhd2FpdCBwcm9jZXNzU2NoZW1hQ29tcG9uZW50cyhhcGksIHNjaGVtYSwgcm91dGVzLCBsZXZlbClcbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXNlY3Rpb24ge1xuICAmLmRpdG8tc2VjdGlvbi1sYWJlbGxlZCB7XG4gICAgYm9yZGVyOiAkYm9yZGVyLXN0eWxlO1xuICAgIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzO1xuICAgIHBhZGRpbmc6ICRmb3JtLXNwYWNpbmc7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4vLy0gTmVzdGluZyBpcyBuZWVkZWQgdG8gbWFrZSBhbiBhcnJvdyBhcHBlYXIgb3ZlciB0aGUgc2VsZWN0IGl0ZW06XG4uZGl0by1zZWxlY3RcbiAgc2VsZWN0KFxuICAgIDppZD1cImRhdGFQYXRoXCJcbiAgICByZWY9XCJlbGVtZW50XCJcbiAgICB2LW1vZGVsPVwic2VsZWN0ZWRWYWx1ZVwiXG4gICAgdi1iaW5kPVwiYXR0cmlidXRlc1wiXG4gICAgQG1vdXNlZG93bj1cInBvcHVsYXRlID0gdHJ1ZVwiXG4gICAgQGZvY3VzPVwicG9wdWxhdGUgPSB0cnVlXCJcbiAgKVxuICAgIHRlbXBsYXRlKFxuICAgICAgdi1pZj1cInBvcHVsYXRlXCJcbiAgICApXG4gICAgICB0ZW1wbGF0ZShcbiAgICAgICAgdi1mb3I9XCJvcHRpb24gaW4gb3B0aW9uc1wiXG4gICAgICApXG4gICAgICAgIG9wdGdyb3VwKFxuICAgICAgICAgIHYtaWY9XCJncm91cEJ5XCJcbiAgICAgICAgICA6bGFiZWw9XCJvcHRpb25bZ3JvdXBCeUxhYmVsXVwiXG4gICAgICAgIClcbiAgICAgICAgICBvcHRpb24oXG4gICAgICAgICAgICB2LWZvcj1cIm9wdCBpbiBvcHRpb25bZ3JvdXBCeU9wdGlvbnNdXCJcbiAgICAgICAgICAgIDp2YWx1ZT1cImdldFZhbHVlRm9yT3B0aW9uKG9wdClcIlxuICAgICAgICAgICkge3sgZ2V0TGFiZWxGb3JPcHRpb24ob3B0KSB9fVxuICAgICAgICBvcHRpb24oXG4gICAgICAgICAgdi1lbHNlXG4gICAgICAgICAgOnZhbHVlPVwiZ2V0VmFsdWVGb3JPcHRpb24ob3B0aW9uKVwiXG4gICAgICAgICkge3sgZ2V0TGFiZWxGb3JPcHRpb24ob3B0aW9uKSB9fVxuICAgIHRlbXBsYXRlKFxuICAgICAgdi1lbHNlLWlmPVwic2VsZWN0ZWRPcHRpb25cIlxuICAgIClcbiAgICAgIG9wdGlvbig6dmFsdWU9XCJzZWxlY3RlZFZhbHVlXCIpIHt7IGdldExhYmVsRm9yT3B0aW9uKHNlbGVjdGVkT3B0aW9uKSB9fVxuICBidXR0b24uZGl0by1idXR0b24tY2xlYXIuZGl0by1idXR0b24tb3ZlcmxheShcbiAgICB2LWlmPVwic2hvd0NsZWFyQnV0dG9uXCJcbiAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gICAgQGNsaWNrPVwiY2xlYXJcIlxuICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IE9wdGlvbnNNaXhpbiBmcm9tICcuLi9taXhpbnMvT3B0aW9uc01peGluLmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoJ3NlbGVjdCcsIHtcbiAgbWl4aW5zOiBbT3B0aW9uc01peGluXSxcblxuICBuYXRpdmVGaWVsZDogdHJ1ZSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICAvLyBEaXNhYmxlIGxhenktcG9wdWxhdGlvbiBmb3Igbm93LlxuICAgICAgLy8gVE9ETzogU2V0IHRvIGBmYWxzZWAgT25jZSBsaW5ldG8gZTJlIHRlc3RzIGFkZHJlc3MgdGhlaXIgaXNzdWVzLlxuICAgICAgcG9wdWxhdGU6IHRydWVcbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4vLyBUT0RPOiBNb3ZlIHRvIGRpdG8tdWlcbiRzZWxlY3QtYXJyb3ctcmlnaHQ6IGNhbGMoKCRzZWxlY3QtYXJyb3ctd2lkdGggLSAkc2VsZWN0LWFycm93LXNpemUpIC8gMik7XG5cbi5kaXRvLXNlbGVjdCB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuXG4gIHNlbGVjdCB7XG4gICAgcGFkZGluZy1yaWdodDogJHNlbGVjdC1hcnJvdy13aWR0aDtcbiAgfVxuICAvLyBIYW5kbGUgLmRpdG8td2lkdGgtZmlsbCBzZXBhcmF0ZWx5IGR1ZSB0byByZXF1aXJlZCBuZXN0aW5nIG9mIHNlbGVjdDpcbiAgJi5kaXRvLXdpZHRoLWZpbGwge1xuICAgIHNlbGVjdCB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICB9XG4gIH1cblxuICAmOjphZnRlciB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIEBpbmNsdWRlIGFycm93KCRzZWxlY3QtYXJyb3ctc2l6ZSk7XG5cbiAgICBib3R0b206ICRzZWxlY3QtYXJyb3ctYm90dG9tO1xuICAgIHJpZ2h0OiBjYWxjKCN7JHNlbGVjdC1hcnJvdy1yaWdodH0gKyAjeyRib3JkZXItd2lkdGh9KTtcbiAgfVxuXG4gICYuZGl0by1kaXNhYmxlZDo6YWZ0ZXIge1xuICAgIGJvcmRlci1jb2xvcjogJGJvcmRlci1jb2xvcjtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1zbGlkZXJcbiAgaW5wdXQuZGl0by1yYW5nZShcbiAgICA6aWQ9XCJkYXRhUGF0aFwiXG4gICAgcmVmPVwiZWxlbWVudFwiXG4gICAgdi1tb2RlbD1cImlucHV0VmFsdWVcIlxuICAgIHR5cGU9XCJyYW5nZVwiXG4gICAgdi1iaW5kPVwiYXR0cmlidXRlc1wiXG4gICAgOm1pbj1cIm1pblwiXG4gICAgOm1heD1cIm1heFwiXG4gICAgOnN0ZXA9XCJzdGVwVmFsdWVcIlxuICApXG4gIElucHV0RmllbGQuZGl0by1udW1iZXIoXG4gICAgdi1pZj1cImlucHV0XCJcbiAgICB2LW1vZGVsPVwiaW5wdXRWYWx1ZVwiXG4gICAgdHlwZT1cIm51bWJlclwiXG4gICAgdi1iaW5kPVwiYXR0cmlidXRlc1wiXG4gICAgOm1pbj1cIm1pblwiXG4gICAgOm1heD1cIm1heFwiXG4gICAgOnN0ZXA9XCJzdGVwVmFsdWVcIlxuICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IE51bWJlck1peGluIGZyb20gJy4uL21peGlucy9OdW1iZXJNaXhpbi5qcydcbmltcG9ydCB7IGdldFNjaGVtYUFjY2Vzc29yIH0gZnJvbSAnLi4vdXRpbHMvYWNjZXNzb3IuanMnXG5pbXBvcnQgeyBJbnB1dEZpZWxkIH0gZnJvbSAnQGRpdG9qcy91aS9zcmMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvVHlwZUNvbXBvbmVudC5yZWdpc3Rlcignc2xpZGVyJywge1xuICBtaXhpbnM6IFtOdW1iZXJNaXhpbl0sXG4gIGNvbXBvbmVudHM6IHsgSW5wdXRGaWVsZCB9LFxuICBuYXRpdmVGaWVsZDogdHJ1ZSxcblxuICBjb21wdXRlZDoge1xuICAgIC8vIFRPRE86IFJlbmFtZSB0byBgc2hvd0lucHV0YD9cbiAgICBpbnB1dDogZ2V0U2NoZW1hQWNjZXNzb3IoJ2lucHV0Jywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9KVxuICB9XG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tc2xpZGVyIHtcbiAgQGV4dGVuZCAlaW5wdXQ7XG5cbiAgZGlzcGxheTogZmxleDtcblxuICAuZGl0by1yYW5nZSB7XG4gICAgZmxleDogYXV0bztcbiAgICBoZWlnaHQ6IGNhbGMoMWVtICogdmFyKC0tbGluZS1oZWlnaHQpKTtcbiAgfVxuXG4gIC5kaXRvLW51bWJlciB7XG4gICAgYm9yZGVyOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtcztcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG5Td2l0Y2hCdXR0b24uZGl0by1zd2l0Y2goXG4gIDppZD1cImRhdGFQYXRoXCJcbiAgcmVmPVwiZWxlbWVudFwiXG4gIHYtbW9kZWw9XCJ2YWx1ZVwiXG4gIDpsYWJlbHM9XCJsYWJlbHNcIlxuICB2LWJpbmQ9XCJhdHRyaWJ1dGVzXCJcbilcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b1R5cGVDb21wb25lbnQgZnJvbSAnLi4vRGl0b1R5cGVDb21wb25lbnQuanMnXG5pbXBvcnQgeyBTd2l0Y2hCdXR0b24gfSBmcm9tICdAZGl0b2pzL3VpL3NyYydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKCdzd2l0Y2gnLCB7XG4gIGRlZmF1bHRWYWx1ZTogZmFsc2UsXG4gIGRlZmF1bHRXaWR0aDogJ2F1dG8nLFxuXG4gIGNvbXBvbmVudHM6IHtcbiAgICBTd2l0Y2hCdXR0b25cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGxhYmVscygpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjaGVtYS5sYWJlbHNcbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1zd2l0Y2gge1xuICAuZGl0by1zd2l0Y2gtbGFiZWwge1xuICAgIGZvbnQtc2l6ZTogJGZvbnQtc2l6ZS1zbWFsbDtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG5JbnB1dEZpZWxkLmRpdG8tdGV4dChcbiAgOmlkPVwiZGF0YVBhdGhcIlxuICByZWY9XCJlbGVtZW50XCJcbiAgdi1tb2RlbD1cImlucHV0VmFsdWVcIlxuICA6dHlwZT1cImlucHV0VHlwZVwiXG4gIHYtYmluZD1cImF0dHJpYnV0ZXNcIlxuKVxuICB0ZW1wbGF0ZSgjYWZ0ZXIpXG4gICAgYnV0dG9uLmRpdG8tYnV0dG9uLWNsZWFyLmRpdG8tYnV0dG9uLW92ZXJsYXkoXG4gICAgICB2LWlmPVwic2hvd0NsZWFyQnV0dG9uXCJcbiAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICAgIEBjbGljay5zdG9wPVwiY2xlYXJcIlxuICAgIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b1R5cGVDb21wb25lbnQgZnJvbSAnLi4vRGl0b1R5cGVDb21wb25lbnQuanMnXG5pbXBvcnQgeyBJbnB1dEZpZWxkIH0gZnJvbSAnQGRpdG9qcy91aS9zcmMnXG5cbmNvbnN0IG1hc2tlZFBhc3N3b3JkID0gJyoqKioqKioqKioqKioqKionXG5cbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKFxuICBbXG4gICAgJ3RleHQnLFxuICAgICdlbWFpbCcsXG4gICAgJ3VybCcsXG4gICAgJ2hvc3RuYW1lJyxcbiAgICAnZG9tYWluJyxcbiAgICAndGVsJyxcbiAgICAncGFzc3dvcmQnLFxuICAgICdjcmVkaXRjYXJkJ1xuICBdLFxuICAvLyBAdnVlL2NvbXBvbmVudFxuICB7XG4gICAgY29tcG9uZW50czogeyBJbnB1dEZpZWxkIH0sXG4gICAgbmF0aXZlRmllbGQ6IHRydWUsXG4gICAgdGV4dEZpZWxkOiB0cnVlLFxuICAgIGlnbm9yZU1pc3NpbmdWYWx1ZTogc2NoZW1hID0+IHNjaGVtYS50eXBlID09PSAncGFzc3dvcmQnLFxuXG4gICAgY29tcHV0ZWQ6IHtcbiAgICAgIGlucHV0VHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjcmVkaXRjYXJkOiAndGV4dCcsXG4gICAgICAgICAgICBob3N0bmFtZTogJ3RleHQnLFxuICAgICAgICAgICAgZG9tYWluOiAndGV4dCdcbiAgICAgICAgICB9W3RoaXMudHlwZV0gfHxcbiAgICAgICAgICB0aGlzLnR5cGVcbiAgICAgICAgKVxuICAgICAgfSxcblxuICAgICAgaW5wdXRWYWx1ZToge1xuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMudHlwZSA9PT0gJ3Bhc3N3b3JkJyAmJlxuICAgICAgICAgICAgdGhpcy52YWx1ZSA9PT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAhdGhpcy5mb2N1c2VkXG4gICAgICAgICAgKVxuICAgICAgICAgICAgPyBtYXNrZWRQYXNzd29yZFxuICAgICAgICAgICAgOiB0aGlzLnZhbHVlXG4gICAgICAgIH0sXG5cbiAgICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgbWV0aG9kczoge1xuICAgICAgZ2V0VmFsaWRhdGlvbnMoKSB7XG4gICAgICAgIGNvbnN0IHJ1bGUgPSB7XG4gICAgICAgICAgZW1haWw6ICdlbWFpbCcsXG4gICAgICAgICAgdXJsOiAndXJsJyxcbiAgICAgICAgICBob3N0bmFtZTogJ2hvc3RuYW1lJyxcbiAgICAgICAgICBkb21haW46ICdkb21haW4nLFxuICAgICAgICAgIHBhc3N3b3JkOiAncGFzc3dvcmQnLFxuICAgICAgICAgIGNyZWRpdGNhcmQ6ICdjcmVkaXRjYXJkJ1xuICAgICAgICB9W3RoaXMudHlwZV1cbiAgICAgICAgcmV0dXJuIHJ1bGUgPyB7IFtydWxlXTogdHJ1ZSB9IDoge31cbiAgICAgIH1cbiAgICB9XG4gIH1cbilcbjwvc2NyaXB0PlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbnRleHRhcmVhLmRpdG8tdGV4dGFyZWEuZGl0by1pbnB1dChcbiAgOmlkPVwiZGF0YVBhdGhcIlxuICByZWY9XCJlbGVtZW50XCJcbiAgdi1tb2RlbD1cInZhbHVlXCJcbiAgdi1iaW5kPVwiYXR0cmlidXRlc1wiXG4gIDpyb3dzPVwibGluZXNcIlxuICA6Y2xhc3M9XCJ7ICdkaXRvLXJlc2l6YWJsZSc6IHJlc2l6YWJsZSB9XCJcbilcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b1R5cGVDb21wb25lbnQgZnJvbSAnLi4vRGl0b1R5cGVDb21wb25lbnQuanMnXG5pbXBvcnQgeyBnZXRTY2hlbWFBY2Nlc3NvciB9IGZyb20gJy4uL3V0aWxzL2FjY2Vzc29yLmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoJ3RleHRhcmVhJywge1xuICBuYXRpdmVGaWVsZDogdHJ1ZSxcbiAgdGV4dEZpZWxkOiB0cnVlLFxuICBhbGlnbkJvdHRvbTogZmFsc2UsXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBsaW5lcygpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjaGVtYS5saW5lcyB8fCA0XG4gICAgfSxcblxuICAgIHJlc2l6YWJsZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ3Jlc2l6YWJsZScsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0pXG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by10ZXh0YXJlYSB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICByZXNpemU6IG5vbmU7XG4gIG1pbi1oZWlnaHQ6IGNhbGMoMWVtICogdmFyKC0tbGluZS1oZWlnaHQpICsgI3syICogJGlucHV0LXBhZGRpbmctdmVyfSk7XG5cbiAgJi5kaXRvLXJlc2l6YWJsZSB7XG4gICAgcmVzaXplOiB2ZXJ0aWNhbDtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by10cmVlLWxpc3RcbiAgRGl0b1Njb3BlcyhcbiAgICB2LWlmPVwic2NvcGVzXCJcbiAgICA6cXVlcnk9XCJxdWVyeVwiXG4gICAgOnNjb3Blcz1cInNjb3Blc1wiXG4gIClcbiAgLmRpdG8tdHJlZS1wYW5lbFxuICAgIERpdG9UcmVlSXRlbShcbiAgICAgIDpzY2hlbWE9XCJ0cmVlU2NoZW1hXCJcbiAgICAgIDpkYXRhUGF0aD1cInRyZWVEYXRhUGF0aFwiXG4gICAgICA6ZGF0YT1cInRyZWVEYXRhXCJcbiAgICAgIDpkcmFnZ2FibGU9XCJkcmFnZ2FibGVcIlxuICAgICAgOm9wZW49XCJ0cnVlXCJcbiAgICApXG4gICAgLmRpdG8tdHJlZS1mb3JtLWNvbnRhaW5lcihcbiAgICAgIHYtaWY9XCJoYXNFZGl0YWJsZUZvcm1zXCJcbiAgICApXG4gICAgICAvLy0gSW5jbHVkZSBhIHJvdXRlci12aWV3IGZvciB0aGUgb3B0aW9uYWwgRGl0b0Zvcm1JbmxpbmVkXG4gICAgICBSb3V0ZXJWaWV3XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IFNvdXJjZU1peGluIGZyb20gJy4uL21peGlucy9Tb3VyY2VNaXhpbi5qcydcbmltcG9ydCB7XG4gIGhhc0Zvcm1TY2hlbWEsXG4gIGdldEZvcm1TY2hlbWFzLFxuICByZXNvbHZlU2NoZW1hQ29tcG9uZW50c1xufSBmcm9tICcuLi91dGlscy9zY2hlbWEuanMnXG5cbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKFxuICBbJ3RyZWUtbGlzdCcsICd0cmVlLW9iamVjdCddLFxuICAvLyBAdnVlL2NvbXBvbmVudFxuICB7XG4gICAgbWl4aW5zOiBbU291cmNlTWl4aW5dLFxuXG4gICAgYWxpZ25Cb3R0b206IGZhbHNlLFxuXG4gICAgcHJvdmlkZSgpIHtcbiAgICAgIHJldHVybiB7IGNvbnRhaW5lcjogdGhpcyB9XG4gICAgfSxcblxuICAgIGdldFNvdXJjZVR5cGUodHlwZSkge1xuICAgICAgcmV0dXJuIHR5cGUgPT09ICd0cmVlLW9iamVjdCcgPyAnb2JqZWN0JyA6ICdsaXN0J1xuICAgIH0sXG5cbiAgICBjb21wdXRlZDoge1xuICAgICAgcGF0aCgpIHtcbiAgICAgICAgLy8gQWNjZXNzZWQgZnJvbSBEaXRvVHJlZUl0ZW0gdGhyb3VnaCBgY29udGFpbmVyLnBhdGhgOlxuICAgICAgICByZXR1cm4gdGhpcy5mb3JtQ29tcG9uZW50Py5wYXRoXG4gICAgICB9LFxuXG4gICAgICBlZGl0UGF0aCgpIHtcbiAgICAgICAgLy8gQWNjZXNzZWQgZnJvbSBEaXRvVHJlZUl0ZW0gdGhyb3VnaCBgY29udGFpbmVyLmVkaXRQYXRoYDpcbiAgICAgICAgcmV0dXJuIHRoaXMuJHJvdXRlLnBhdGguc2xpY2UodGhpcy5wYXRoPy5sZW5ndGgpXG4gICAgICB9LFxuXG4gICAgICB0cmVlRGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNMaXN0U291cmNlXG4gICAgICAgICAgPyB7IFt0aGlzLm5hbWVdOiB0aGlzLnZhbHVlIH1cbiAgICAgICAgICA6IHRoaXMudmFsdWVcbiAgICAgIH0sXG5cbiAgICAgIHRyZWVEYXRhUGF0aCgpIHtcbiAgICAgICAgLy8gUmVtb3ZlIGBuYW1lYCBmcm9tIGBkYXRhUGF0aGAsIGFzIGl0IGlzIGFkZGVkXG4gICAgICAgIC8vIHRvIGB0cmVlRGF0YWAgYW5kIGB0cmVlU2NoZW1hYFxuICAgICAgICByZXR1cm4gdGhpcy5pc0xpc3RTb3VyY2VcbiAgICAgICAgICA/IHRoaXMuZGF0YVBhdGguc2xpY2UoMCwgdGhpcy5kYXRhUGF0aC5sZW5ndGggLSB0aGlzLm5hbWUubGVuZ3RoKVxuICAgICAgICAgIDogdGhpcy5kYXRhUGF0aFxuICAgICAgfSxcblxuICAgICAgdHJlZVNjaGVtYSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNMaXN0U291cmNlXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIGNoaWxkcmVuOiB7XG4gICAgICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgICAgIC4uLnRoaXMuc2NoZW1hXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHRoaXMuc2NoZW1hXG4gICAgICB9LFxuXG4gICAgICBoYXNFZGl0YWJsZUZvcm1zKCkge1xuICAgICAgICBjb25zdCBoYXNFZGl0YWJsZUZvcm1zID0gc2NoZW1hID0+IHtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgaGFzRm9ybVNjaGVtYShzY2hlbWEpICYmIChcbiAgICAgICAgICAgICAgdGhpcy5nZXRTY2hlbWFWYWx1ZSgnZWRpdGFibGUnLCB7XG4gICAgICAgICAgICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICBzY2hlbWFcbiAgICAgICAgICAgICAgfSkgfHxcbiAgICAgICAgICAgICAgc2NoZW1hLmNoaWxkcmVuICYmXG4gICAgICAgICAgICAgIGhhc0VkaXRhYmxlRm9ybXMoc2NoZW1hLmNoaWxkcmVuKVxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGFzRWRpdGFibGVGb3Jtcyh0aGlzLnNjaGVtYSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgcHJvY2Vzc1NjaGVtYShcbiAgICAgIGFwaSxcbiAgICAgIHNjaGVtYSxcbiAgICAgIG5hbWUsXG4gICAgICByb3V0ZXMsXG4gICAgICBsZXZlbCxcbiAgICAgIG5lc3RlZCA9IHRydWUsXG4gICAgICBmbGF0dGVuID0gZmFsc2UsXG4gICAgICBwcm9jZXNzID0gbnVsbFxuICAgICkge1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICByZXNvbHZlU2NoZW1hQ29tcG9uZW50cyhzY2hlbWEucHJvcGVydGllcyksXG4gICAgICAgIFNvdXJjZU1peGluLnByb2Nlc3NTY2hlbWEoXG4gICAgICAgICAgYXBpLFxuICAgICAgICAgIHNjaGVtYSxcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIHJvdXRlcyxcbiAgICAgICAgICBsZXZlbCxcbiAgICAgICAgICBuZXN0ZWQsXG4gICAgICAgICAgZmxhdHRlbixcbiAgICAgICAgICAvLyBQYXNzIHByb2Nlc3MoKSB0byBhZGQgbW9yZSByb3V0ZXMgdG8gY2hpbGRSb3V0ZXM6XG4gICAgICAgICAgKGNoaWxkUm91dGVzLCBsZXZlbCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBjaGlsZHJlbiB9ID0gc2NoZW1hXG4gICAgICAgICAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgLy8gQWRkIGB0eXBlYCB0byB0aGUgbmVzdGVkIHRyZWUgbGlzdC5cbiAgICAgICAgICAgICAgY2hpbGRyZW4udHlwZSA9ICd0cmVlLWxpc3QnXG4gICAgICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNhbGwgYHByb2Nlc3NTY2hlbWEoKWAgZm9yIHRoZSBuZXN0ZWQgdHJlZSBsaXN0OlxuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzU2NoZW1hKFxuICAgICAgICAgICAgICAgIGFwaSxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbixcbiAgICAgICAgICAgICAgICBjaGlsZHJlbi5uYW1lLFxuICAgICAgICAgICAgICAgIGNoaWxkUm91dGVzLFxuICAgICAgICAgICAgICAgIGxldmVsLFxuICAgICAgICAgICAgICAgIG5lc3RlZCxcbiAgICAgICAgICAgICAgICB0cnVlLCAvLyBQYXNzIGB0cnVlYCBmb3IgYGZsYXR0ZW5gIGluIHRyZWUgbGlzdHMuXG4gICAgICAgICAgICAgICAgcHJvY2Vzc1xuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICApXG4gICAgICBdKVxuICAgIH0sXG5cbiAgICBnZXRGb3JtU2NoZW1hc0ZvclByb2Nlc3Npbmcoc2NoZW1hLCBjb250ZXh0KSB7XG4gICAgICAvLyBDb252ZXJ0IG5lc3RlZCBjaGlsZHJlbiBzY2hlbWEgdG8gc3RhbmQtYWxvbmUgc2NoZW1hIGNvbXBvbmVudCxcbiAgICAgIC8vIHByZXNlbnQgaW4gZWFjaCBvZiB0aGUgZm9ybXMsIGFzIHJlcXVpcmVkIGJ5IGBwcm9jZXNzU2NoZW1hRGF0YSgpYFxuICAgICAgY29uc3QgeyBjaGlsZHJlbiB9ID0gc2NoZW1hXG4gICAgICByZXR1cm4gZ2V0Rm9ybVNjaGVtYXMoXG4gICAgICAgIHNjaGVtYSxcbiAgICAgICAgY29udGV4dCxcbiAgICAgICAgY2hpbGRyZW5cbiAgICAgICAgICA/IGZvcm0gPT4gKHtcbiAgICAgICAgICAgICAgLi4uZm9ybSxcbiAgICAgICAgICAgICAgY29tcG9uZW50czoge1xuICAgICAgICAgICAgICAgIC4uLmZvcm0uY29tcG9uZW50cyxcbiAgICAgICAgICAgICAgICBbY2hpbGRyZW4ubmFtZV06IGNoaWxkcmVuXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgOiBudWxsXG4gICAgICApXG4gICAgfVxuICB9XG4pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by10cmVlLWxpc3Qge1xuICBAZXh0ZW5kICVmaWVsZDtcblxuICAuZGl0by10cmVlLXBhbmVsIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcblxuICAgID4gLmRpdG8tdHJlZS1pdGVtIHtcbiAgICAgIGZsZXg6IDEgMSAyNSU7XG4gICAgfVxuXG4gICAgPiAuZGl0by10cmVlLWZvcm0tY29udGFpbmVyIHtcbiAgICAgIGZsZXg6IDAgMSA3NSU7XG4gICAgICBhbGlnbi1zZWxmOiBzdHJldGNoO1xuICAgICAgYmFja2dyb3VuZDogJGNvbnRlbnQtY29sb3ItYmFja2dyb3VuZDtcbiAgICAgIGJvcmRlci1sZWZ0OiAkYm9yZGVyLXN0eWxlO1xuICAgICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6ICRib3JkZXItcmFkaXVzIC0gMTtcbiAgICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAkYm9yZGVyLXJhZGl1cyAtIDE7XG4gICAgICBtYXJnaW46ICgtJGlucHV0LXBhZGRpbmctdmVyKSAoLSRpbnB1dC1wYWRkaW5nLWhvcik7XG4gICAgICBtYXJnaW4tbGVmdDogJGlucHV0LXBhZGRpbmctaG9yO1xuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsImltcG9ydCB7IGZpbGVzaXplIH0gZnJvbSAnZmlsZXNpemUnXG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRGaWxlU2l6ZShzaXplKSB7XG4gIHJldHVybiBmaWxlc2l6ZShzaXplLCB7IGJhc2U6IDEwIH0pXG59XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tdXBsb2FkXG4gIHRhYmxlLmRpdG8tdGFibGUuZGl0by10YWJsZS1zZXBhcmF0b3JzLmRpdG8tdGFibGUtYmFja2dyb3VuZFxuICAgIC8vLSBTdHlsaW5nIGNvbWVzIGZyb20gRGl0b1RhYmxlSGVhZFxuICAgIHRoZWFkLmRpdG8tdGFibGUtaGVhZFxuICAgICAgdHJcbiAgICAgICAgdGhcbiAgICAgICAgICBzcGFuIE5hbWVcbiAgICAgICAgdGhcbiAgICAgICAgICBzcGFuIFNpemVcbiAgICAgICAgdGhcbiAgICAgICAgICBzcGFuIFN0YXR1c1xuICAgICAgICB0aFxuICAgICAgICAgIHNwYW5cbiAgICBEaXRvRHJhZ2dhYmxlKFxuICAgICAgdi1tb2RlbD1cImZpbGVzXCJcbiAgICAgIHRhZz1cInRib2R5XCJcbiAgICAgIDpvcHRpb25zPVwiZ2V0U29ydGFibGVPcHRpb25zKGZhbHNlKVwiXG4gICAgICA6ZHJhZ2dhYmxlPVwiZHJhZ2dhYmxlXCJcbiAgICApXG4gICAgICB0cihcbiAgICAgICAgdi1mb3I9XCIoZmlsZSwgaW5kZXgpIGluIGZpbGVzXCJcbiAgICAgICAgOmtleT1cImZpbGUua2V5XCJcbiAgICAgIClcbiAgICAgICAgdGQoXG4gICAgICAgICAgdi1odG1sPVwicmVuZGVyRmlsZShmaWxlLCBpbmRleClcIlxuICAgICAgICApXG4gICAgICAgIHRkIHt7IGZvcm1hdEZpbGVTaXplKGZpbGUuc2l6ZSkgfX1cbiAgICAgICAgdGRcbiAgICAgICAgICB0ZW1wbGF0ZShcbiAgICAgICAgICAgIHYtaWY9XCJmaWxlLnVwbG9hZFwiXG4gICAgICAgICAgKVxuICAgICAgICAgICAgdGVtcGxhdGUoXG4gICAgICAgICAgICAgIHYtaWY9XCJmaWxlLnVwbG9hZC5lcnJvclwiXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgIHwgRXJyb3I6IHt7IGZpbGUudXBsb2FkLmVycm9yIH19XG4gICAgICAgICAgICB0ZW1wbGF0ZShcbiAgICAgICAgICAgICAgdi1lbHNlLWlmPVwiZmlsZS51cGxvYWQuYWN0aXZlXCJcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfCBVcGxvYWRpbmcuLi5cbiAgICAgICAgICAgIHRlbXBsYXRlKFxuICAgICAgICAgICAgICB2LWVsc2UtaWY9XCJmaWxlLnVwbG9hZC5zdWNjZXNzXCJcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfCBVcGxvYWRlZFxuICAgICAgICAgIHRlbXBsYXRlKFxuICAgICAgICAgICAgdi1lbHNlXG4gICAgICAgICAgKVxuICAgICAgICAgICAgfCBTdG9yZWRcbiAgICAgICAgdGQuZGl0by1jZWxsLWVkaXQtYnV0dG9uc1xuICAgICAgICAgIC5kaXRvLWJ1dHRvbnMuZGl0by1idXR0b25zLXJvdW5kXG4gICAgICAgICAgICAvLy0gRmlyZWZveCBkb2Vzbid0IGxpa2UgPGJ1dHRvbj4gaGVyZSwgc28gdXNlIDxhPiBpbnN0ZWFkOlxuICAgICAgICAgICAgYS5kaXRvLWJ1dHRvbihcbiAgICAgICAgICAgICAgdi1pZj1cImRyYWdnYWJsZVwiXG4gICAgICAgICAgICAgIHYtYmluZD1cImdldEJ1dHRvbkF0dHJpYnV0ZXModmVyYnMuZHJhZylcIlxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgYnV0dG9uLmRpdG8tYnV0dG9uKFxuICAgICAgICAgICAgICB2LWlmPVwiZGVsZXRhYmxlXCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIHYtYmluZD1cImdldEJ1dHRvbkF0dHJpYnV0ZXModmVyYnMuZGVsZXRlKVwiXG4gICAgICAgICAgICAgIEBjbGljaz1cImRlbGV0ZUZpbGUoZmlsZSwgaW5kZXgpXCJcbiAgICAgICAgICAgIClcbiAgICB0Zm9vdFxuICAgICAgdHJcbiAgICAgICAgdGQoOmNvbHNwYW49XCI0XCIpXG4gICAgICAgICAgLmRpdG8tdXBsb2FkLWZvb3RlclxuICAgICAgICAgICAgcHJvZ3Jlc3MuZGl0by1wcm9ncmVzcyhcbiAgICAgICAgICAgICAgdi1pZj1cImlzVXBsb2FkQWN0aXZlXCJcbiAgICAgICAgICAgICAgOnZhbHVlPVwidXBsb2FkUHJvZ3Jlc3NcIlxuICAgICAgICAgICAgICBtYXg9XCIxMDBcIlxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmRpdG8tYnV0dG9ucy5kaXRvLWJ1dHRvbnMtcm91bmRcbiAgICAgICAgICAgICAgYnV0dG9uLmRpdG8tYnV0dG9uKFxuICAgICAgICAgICAgICAgIHYtaWY9XCJpc1VwbG9hZEFjdGl2ZVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgQGNsaWNrLnByZXZlbnQ9XCJ1cGxvYWQuYWN0aXZlID0gZmFsc2VcIlxuICAgICAgICAgICAgICApIENhbmNlbCBBbGxcbiAgICAgICAgICAgICAgYnV0dG9uLmRpdG8tYnV0dG9uKFxuICAgICAgICAgICAgICAgIHYtZWxzZS1pZj1cImlzVXBsb2FkUmVhZHlcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIEBjbGljay5wcmV2ZW50PVwidXBsb2FkLmFjdGl2ZSA9IHRydWVcIlxuICAgICAgICAgICAgICApIFVwbG9hZCBBbGxcbiAgICAgICAgICAgICAgVnVlVXBsb2FkLmRpdG8tYnV0dG9uLmRpdG8tYnV0dG9uLWFkZC11cGxvYWQoXG4gICAgICAgICAgICAgICAgcmVmPVwidXBsb2FkXCJcbiAgICAgICAgICAgICAgICB2LW1vZGVsPVwidXBsb2Fkc1wiXG4gICAgICAgICAgICAgICAgOmlucHV0SWQ9XCJkYXRhUGF0aFwiXG4gICAgICAgICAgICAgICAgOm5hbWU9XCJkYXRhUGF0aFwiXG4gICAgICAgICAgICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgIDpwb3N0QWN0aW9uPVwidXBsb2FkUGF0aFwiXG4gICAgICAgICAgICAgICAgOmV4dGVuc2lvbnM9XCJleHRlbnNpb25zXCJcbiAgICAgICAgICAgICAgICA6YWNjZXB0PVwiYWNjZXB0XCJcbiAgICAgICAgICAgICAgICA6bXVsdGlwbGU9XCJtdWx0aXBsZVwiXG4gICAgICAgICAgICAgICAgOnNpemU9XCJtYXhTaXplXCJcbiAgICAgICAgICAgICAgICB0aXRsZT1cIlVwbG9hZCBGaWxlc1wiXG4gICAgICAgICAgICAgICAgQGlucHV0LWZpbHRlcj1cImlucHV0RmlsdGVyXCJcbiAgICAgICAgICAgICAgICBAaW5wdXQtZmlsZT1cImlucHV0RmlsZVwiXG4gICAgICAgICAgICAgIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b1R5cGVDb21wb25lbnQgZnJvbSAnLi4vRGl0b1R5cGVDb21wb25lbnQuanMnXG5pbXBvcnQgRGl0b0NvbnRleHQgZnJvbSAnLi4vRGl0b0NvbnRleHQuanMnXG5pbXBvcnQgU29ydGFibGVNaXhpbiBmcm9tICcuLi9taXhpbnMvU29ydGFibGVNaXhpbi5qcydcbmltcG9ydCBwYXJzZUZpbGVTaXplIGZyb20gJ2ZpbGVzaXplLXBhcnNlcidcbmltcG9ydCB7IGdldFNjaGVtYUFjY2Vzc29yIH0gZnJvbSAnLi4vdXRpbHMvYWNjZXNzb3IuanMnXG5pbXBvcnQgeyBmb3JtYXRGaWxlU2l6ZSB9IGZyb20gJy4uL3V0aWxzL3VuaXRzLmpzJ1xuaW1wb3J0IHsgYXBwZW5kRGF0YVBhdGggfSBmcm9tICcuLi91dGlscy9kYXRhLmpzJ1xuaW1wb3J0IHsgaXNBcnJheSwgYXNBcnJheSwgZXNjYXBlSHRtbCB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgVnVlVXBsb2FkIGZyb20gJ3Z1ZS11cGxvYWQtY29tcG9uZW50J1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoJ3VwbG9hZCcsIHtcbiAgbWl4aW5zOiBbU29ydGFibGVNaXhpbl0sXG4gIGNvbXBvbmVudHM6IHsgVnVlVXBsb2FkIH0sXG5cbiAgYWxpZ25Cb3R0b206IGZhbHNlLFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHVwbG9hZHM6IFtdXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgdXBsb2FkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuJHJlZnMudXBsb2FkXG4gICAgfSxcblxuICAgIGZpbGVzKCkge1xuICAgICAgcmV0dXJuIGFzRmlsZXModGhpcy52YWx1ZSlcbiAgICB9LFxuXG4gICAgbXVsdGlwbGU6IGdldFNjaGVtYUFjY2Vzc29yKCdtdWx0aXBsZScsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgIC8vIE5vIGNhbGxiYWNrIGFzIGl0J3MgdXNlZCBpbiBgcHJvY2Vzc1ZhbHVlKClgXG4gICAgICBjYWxsYmFjazogZmFsc2VcbiAgICB9KSxcblxuICAgIGV4dGVuc2lvbnM6IGdldFNjaGVtYUFjY2Vzc29yKCdleHRlbnNpb25zJywge1xuICAgICAgdHlwZTogW0FycmF5LCBTdHJpbmcsIFJlZ0V4cF1cbiAgICB9KSxcblxuICAgIGFjY2VwdDogZ2V0U2NoZW1hQWNjZXNzb3IoJ2FjY2VwdCcsIHtcbiAgICAgIHR5cGU6IEFycmF5LFxuICAgICAgZ2V0KGFjY2VwdCkge1xuICAgICAgICByZXR1cm4gaXNBcnJheShhY2NlcHQpID8gYWNjZXB0LmpvaW4oJywnKSA6IGFjY2VwdFxuICAgICAgfVxuICAgIH0pLFxuXG4gICAgbWF4U2l6ZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ21heFNpemUnLCB7XG4gICAgICB0eXBlOiBbU3RyaW5nLCBOdW1iZXJdLFxuICAgICAgZ2V0KG1heFNpemUpIHtcbiAgICAgICAgcmV0dXJuIG1heFNpemUgPyBwYXJzZUZpbGVTaXplKG1heFNpemUpIDogdW5kZWZpbmVkXG4gICAgICB9XG4gICAgfSksXG5cbiAgICBkcmFnZ2FibGU6IGdldFNjaGVtYUFjY2Vzc29yKCdkcmFnZ2FibGUnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICBnZXQoZHJhZ2dhYmxlKSB7XG4gICAgICAgIHJldHVybiBkcmFnZ2FibGUgJiYgdGhpcy5maWxlcy5sZW5ndGggPiAxXG4gICAgICB9XG4gICAgfSksXG5cbiAgICBkZWxldGFibGU6IGdldFNjaGVtYUFjY2Vzc29yKCdkZWxldGFibGUnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9KSxcblxuICAgIGlzVXBsb2FkUmVhZHkoKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLnVwbG9hZHMubGVuZ3RoICYmXG4gICAgICAgICEodGhpcy51cGxvYWQuYWN0aXZlIHx8IHRoaXMudXBsb2FkLnVwbG9hZGVkKVxuICAgICAgKVxuICAgIH0sXG5cbiAgICBpc1VwbG9hZEFjdGl2ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnVwbG9hZHMubGVuZ3RoICYmIHRoaXMudXBsb2FkLmFjdGl2ZVxuICAgIH0sXG5cbiAgICB1cGxvYWRQcm9ncmVzcygpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRoaXMudXBsb2Fkcy5yZWR1Y2UoKHRvdGFsLCBmaWxlKSA9PiB0b3RhbCArIGZpbGUucHJvZ3Jlc3MsIDApIC9cbiAgICAgICAgdGhpcy51cGxvYWRzLmxlbmd0aFxuICAgICAgKVxuICAgIH0sXG5cbiAgICB1cGxvYWRQYXRoKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0UmVzb3VyY2VVcmwoe1xuICAgICAgICB0eXBlOiAndXBsb2FkJyxcbiAgICAgICAgcGF0aDogdGhpcy5hcGkubm9ybWFsaXplUGF0aCh0aGlzLmRhdGFQYXRoKVxuICAgICAgfSlcbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGZvcm1hdEZpbGVTaXplLFxuXG4gICAgcmVuZGVyRmlsZShmaWxlLCBpbmRleCkge1xuICAgICAgY29uc3QgeyByZW5kZXIgfSA9IHRoaXMuc2NoZW1hXG4gICAgICByZXR1cm4gcmVuZGVyXG4gICAgICAgID8gcmVuZGVyLmNhbGwoXG4gICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgbmV3IERpdG9Db250ZXh0KHRoaXMsIHtcbiAgICAgICAgICAgICAgdmFsdWU6IGZpbGUsXG4gICAgICAgICAgICAgIGRhdGE6IHRoaXMuZmlsZXMsXG4gICAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgICBkYXRhUGF0aDogYXBwZW5kRGF0YVBhdGgodGhpcy5kYXRhUGF0aCwgaW5kZXgpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICAgOiBlc2NhcGVIdG1sKGZpbGUubmFtZSlcbiAgICB9LFxuXG4gICAgZGVsZXRlRmlsZShmaWxlLCBpbmRleCkge1xuICAgICAgY29uc3QgeyBuYW1lIH0gPSBmaWxlXG5cbiAgICAgIGlmIChcbiAgICAgICAgZmlsZSAmJlxuICAgICAgICB3aW5kb3cuY29uZmlybShcbiAgICAgICAgICBgRG8geW91IHJlYWxseSB3YW50IHRvICR7dGhpcy52ZXJicy5yZW1vdmV9ICR7bmFtZX0/YFxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgICB0aGlzLnZhbHVlLnNwbGljZShpbmRleCwgMSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gbnVsbFxuICAgICAgICB9XG4gICAgICAgIGlmIChmaWxlLnVwbG9hZCkge1xuICAgICAgICAgIHRoaXMudXBsb2FkLnJlbW92ZShmaWxlLnVwbG9hZClcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uQ2hhbmdlKClcbiAgICAgICAgdGhpcy5ub3RpZnkoe1xuICAgICAgICAgIHR5cGU6ICdpbmZvJyxcbiAgICAgICAgICB0aXRsZTogJ1N1Y2Nlc3NmdWxseSBSZW1vdmVkJyxcbiAgICAgICAgICB0ZXh0OiBgJHtuYW1lfSB3YXMgJHt0aGlzLnZlcmJzLmRlbGV0ZWR9LmBcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZ2V0RmlsZUluZGV4KGZpbGUpIHtcbiAgICAgIHJldHVybiB0aGlzLm11bHRpcGxlICYmIHRoaXMudmFsdWVcbiAgICAgICAgPyB0aGlzLnZhbHVlLmZpbmRJbmRleChpdCA9PiBpdC5pZCA9PT0gZmlsZS5pZClcbiAgICAgICAgOiAtMVxuICAgIH0sXG5cbiAgICBhZGRGaWxlKGZpbGUpIHtcbiAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgIGlmICh0aGlzLnZhbHVlKSB7XG4gICAgICAgICAgdGhpcy52YWx1ZS5wdXNoKGZpbGUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy52YWx1ZSA9IFtmaWxlXVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnZhbHVlID0gZmlsZVxuICAgICAgfVxuICAgIH0sXG5cbiAgICByZXBsYWNlRmlsZShmaWxlLCBuZXdGaWxlKSB7XG4gICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuZ2V0RmlsZUluZGV4KGZpbGUpXG4gICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgaWYgKG5ld0ZpbGUpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWVbaW5kZXhdID0gbmV3RmlsZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlLnNwbGljZShpbmRleCwgMSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBuZXdGaWxlXG4gICAgICB9XG4gICAgfSxcblxuICAgIHJlbW92ZUZpbGUoZmlsZSkge1xuICAgICAgdGhpcy5yZXBsYWNlRmlsZShmaWxlLCBudWxsKVxuICAgIH0sXG5cbiAgICBpbnB1dEZpbGUobmV3RmlsZSwgb2xkRmlsZSkge1xuICAgICAgaWYgKG5ld0ZpbGUgJiYgIW9sZEZpbGUpIHtcbiAgICAgICAgY29uc3QgeyBpZCwgbmFtZSwgc2l6ZSB9ID0gbmV3RmlsZVxuICAgICAgICB0aGlzLmFkZEZpbGUoeyBpZCwgbmFtZSwgc2l6ZSwgdXBsb2FkOiBuZXdGaWxlIH0pXG4gICAgICB9XG4gICAgICBpZiAobmV3RmlsZSAmJiBvbGRGaWxlKSB7XG4gICAgICAgIGNvbnN0IHsgc3VjY2VzcywgZXJyb3IgfSA9IG5ld0ZpbGVcbiAgICAgICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgICAgICB0aGlzLm9uQ2hhbmdlKClcbiAgICAgICAgICBjb25zdCBmaWxlID0gbmV3RmlsZS5yZXNwb25zZVswXVxuICAgICAgICAgIGlmIChmaWxlKSB7XG4gICAgICAgICAgICBmaWxlLnVwbG9hZCA9IG5ld0ZpbGVcbiAgICAgICAgICAgIC8vIFJlcGxhY2UgdGhlIHVwbG9hZCBmaWxlIG9iamVjdCB3aXRoIHRoZSBmaWxlIG9iamVjdCByZWNlaXZlZFxuICAgICAgICAgICAgLy8gZnJvbSB0aGUgdXBsb2FkIHJlc3BvbnNlLlxuICAgICAgICAgICAgdGhpcy5yZXBsYWNlRmlsZShuZXdGaWxlLCBmaWxlKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZUZpbGUobmV3RmlsZSlcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zdCB0ZXh0ID0gKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhYm9ydDogJ1VwbG9hZCBhYm9ydGVkJyxcbiAgICAgICAgICAgICAgZGVuaWVkOiAnVXBsb2FkIGRlbmllZCcsXG4gICAgICAgICAgICAgIGV4dGVuc2lvbjogYFVuc3VwcG9ydGVkIGZpbGUtdHlwZTogJHtuZXdGaWxlLm5hbWV9YCxcbiAgICAgICAgICAgICAgbmV0d29yazogJ05ldHdvcmsgZXJyb3IgZW5jb3VudGVyZWQgZHVyaW5nIHVwbG9hZCcsXG4gICAgICAgICAgICAgIHNlcnZlcjogJ1NlcnZlciBlcnJvciBvY2N1cnJlZCBkdXJpbmcgdXBsb2FkJyxcbiAgICAgICAgICAgICAgc2l6ZTogYEZpbGUgaXMgdG9vIGxhcmdlOiAke2Zvcm1hdEZpbGVTaXplKG5ld0ZpbGUuc2l6ZSl9YCxcbiAgICAgICAgICAgICAgdGltZW91dDogJ1RpbWVvdXQgb2NjdXJyZWQgZHVyaW5nIHVwbG9hZCdcbiAgICAgICAgICAgIH1bZXJyb3JdIHx8XG4gICAgICAgICAgICBgVW5rbm93biBGaWxlIFVwbG9hZCBFcnJvcjogJyR7ZXJyb3J9J2BcbiAgICAgICAgICApXG4gICAgICAgICAgdGhpcy5ub3RpZnkoe1xuICAgICAgICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgICAgICAgIHRpdGxlOiAnRmlsZSBVcGxvYWQgRXJyb3InLFxuICAgICAgICAgICAgdGV4dFxuICAgICAgICAgIH0pXG4gICAgICAgICAgdGhpcy5yZW1vdmVGaWxlKG5ld0ZpbGUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgaW5wdXRGaWx0ZXIobmV3RmlsZSAvKiwgb2xkRmlsZSwgcHJldmVudCAqLykge1xuICAgICAgY29uc3QgeGhyID0gbmV3RmlsZT8ueGhyXG4gICAgICBpZiAodGhpcy5hcGkuY29ycz8uY3JlZGVudGlhbHMgJiYgeGhyICYmICF4aHIud2l0aENyZWRlbnRpYWxzKSB7XG4gICAgICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSB0cnVlXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHByb2Nlc3NWYWx1ZShzY2hlbWEsIHZhbHVlKSB7XG4gICAgLy8gRmlsdGVyIG91dCBhbGwgbmV3bHkgYWRkZWQgZmlsZXMgdGhhdCB3ZXJlbid0IGFjdHVhbGx5IHVwbG9hZGVkLlxuICAgIGNvbnN0IGZpbGVzID0gYXNGaWxlcyh2YWx1ZSlcbiAgICAgIC5tYXAoKHsgdXBsb2FkLCAuLi5maWxlIH0pID0+ICghdXBsb2FkIHx8IHVwbG9hZC5zdWNjZXNzID8gZmlsZSA6IG51bGwpKVxuICAgICAgLmZpbHRlcihmaWxlID0+IGZpbGUpXG4gICAgcmV0dXJuIHNjaGVtYS5tdWx0aXBsZSA/IGZpbGVzIDogZmlsZXNbMF0gfHwgbnVsbFxuICB9XG59KVxuXG5mdW5jdGlvbiBhc0ZpbGVzKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA/IGFzQXJyYXkodmFsdWUpIDogW11cbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXVwbG9hZCB7XG4gIC5kaXRvLXRhYmxlIHtcbiAgICB0ciB7XG4gICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICAgIH1cbiAgfVxuXG4gIC5kaXRvLWJ1dHRvbi1hZGQtdXBsb2FkIHtcbiAgICBwYWRkaW5nOiAwO1xuXG4gICAgPiAqIHtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICB9XG4gIH1cblxuICAuZGl0by11cGxvYWQtZm9vdGVyIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcblxuICAgIC5kaXRvLXByb2dyZXNzIHtcbiAgICAgIGZsZXg6IGF1dG87XG4gICAgICBtYXJnaW4tcmlnaHQ6ICRmb3JtLXNwYWNpbmc7XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiY29uc3QgbG9nZ2VkRGVwcmVjYXRpb25zID0gbmV3IFNldCgpXG5cbmV4cG9ydCBmdW5jdGlvbiBkZXByZWNhdGUobWVzc2FnZSkge1xuICAvLyBPbmx5IGxvZyBkZXByZWNhdGlvbiBtZXNzYWdlcyBvbmNlLlxuICBpZiAoIWxvZ2dlZERlcHJlY2F0aW9ucy5oYXMobWVzc2FnZSkpIHtcbiAgICBsb2dnZWREZXByZWNhdGlvbnMuYWRkKG1lc3NhZ2UpXG4gICAgY29uc29sZS53YXJuKG1lc3NhZ2UpXG4gIH1cbn1cbiIsImltcG9ydCB7IGlzQXJyYXksIGFzQXJyYXkgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0UXVlcnkocXVlcnkpIHtcbiAgY29uc3QgZW50cmllcyA9IHF1ZXJ5XG4gICAgPyBpc0FycmF5KHF1ZXJ5KVxuICAgICAgPyBxdWVyeVxuICAgICAgOiBPYmplY3QuZW50cmllcyhxdWVyeSlcbiAgICA6IFtdXG4gIHJldHVybiAoXG4gICAgbmV3IFVSTFNlYXJjaFBhcmFtcyhcbiAgICAgIC8vIEV4cGFuZCBhcnJheSB2YWx1ZXMgaW50byBtdWx0aXBsZSBlbnRyaWVzIHVuZGVyIHRoZSBzYW1lIGtleSwgc29cbiAgICAgIC8vIGBmb3JtYXRRdWVyeSh7IGZvbzogWzEsIDJdLCBiYXI6IDMgfSlgID0+ICdmb289MSZmb289MiZiYXI9MycuXG4gICAgICBlbnRyaWVzLnJlZHVjZShcbiAgICAgICAgKGVudHJpZXMsIFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgIGZvciAoY29uc3QgdmFsIG9mIGFzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICBlbnRyaWVzLnB1c2goW2tleSwgdmFsXSlcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGVudHJpZXNcbiAgICAgICAgfSxcbiAgICAgICAgW11cbiAgICAgIClcbiAgICApXG4gICAgICAudG9TdHJpbmcoKVxuICAgICAgLy8gZGVjb2RlIGFsbCB0aGVzZSBlbmNvZGVkIGNoYXJhY3RlcnMgdG8gaGF2ZSB0aGUgc2FtZSBiZWhhdmlvciBhc1xuICAgICAgLy8gdnVlLXJvdXRlcidzIG93biBxdWVyeSBlbmNvZGluZy5cbiAgICAgIC5yZXBsYWNlQWxsKC8lKD86MjF8MjR8Mjh8Mjl8MkN8MkZ8M0F8M0J8M0R8M0Z8NDApL2csIGRlY29kZVVSSUNvbXBvbmVudClcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVwbGFjZVJvdXRlKHsgcGF0aCwgcXVlcnksIGhhc2ggfSkge1xuICAvLyBQcmVzZXJ2ZSBgaGlzdG9yeS5zdGF0ZWAsIHNlZTpcbiAgLy8gaHR0cHM6Ly9yb3V0ZXIudnVlanMub3JnL2d1aWRlL21pZ3JhdGlvbi8jdXNhZ2Utb2YtaGlzdG9yeS1zdGF0ZVxuICBoaXN0b3J5LnJlcGxhY2VTdGF0ZShcbiAgICBoaXN0b3J5LnN0YXRlLFxuICAgIG51bGwsXG4gICAgYCR7XG4gICAgICBsb2NhdGlvbi5vcmlnaW5cbiAgICB9JHtcbiAgICAgIHBhdGggPz8gbG9jYXRpb24ucGF0aG5hbWVcbiAgICB9PyR7XG4gICAgICBxdWVyeSA/IGZvcm1hdFF1ZXJ5KHF1ZXJ5KSA6IGxvY2F0aW9uLnNlYXJjaC5zbGljZSgxKVxuICAgIH0ke1xuICAgICAgaGFzaCA/PyBsb2NhdGlvbi5oYXNoXG4gICAgfWBcbiAgKVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgW1xuICAnY3JlYXRlJywgJ2NyZWF0ZWQnLFxuICAnc2F2ZScsICdzYXZlZCcsXG4gICdzdWJtaXQnLCAnc3VibWl0dGVkJyxcbiAgJ2RlbGV0ZScsICdkZWxldGVkJyxcbiAgJ2VkaXQnLCAnZWRpdGVkJyxcbiAgJ2NsZWFyJywgJ2NsZWFyZWQnLFxuICAnY2xvc2UnLCAnY2xvc2VkJyxcbiAgJ2NhbmNlbCcsICdjYW5jZWxsZWQnLFxuICAnZHJhZycsICdkcmFnZ2VkJyxcbiAgJ2xvZ2luJywgJ2xvZ2dlZCBpbidcbl0ucmVkdWNlKCh2ZXJicywgdmVyYikgPT4ge1xuICB2ZXJic1t2ZXJiXSA9IHZlcmJcbiAgcmV0dXJuIHZlcmJzXG59LCB7fSlcbiIsImltcG9ydCB7IGNyZWF0ZUFwcCwgaCBhcyBjcmVhdGVFbGVtZW50IH0gZnJvbSAndnVlJ1xuaW1wb3J0IHsgY3JlYXRlUm91dGVyLCBjcmVhdGVXZWJIaXN0b3J5IH0gZnJvbSAndnVlLXJvdXRlcidcbmltcG9ydCBWdWVOb3RpZmljYXRpb25zIGZyb20gJ0BreXZnL3Z1ZTMtbm90aWZpY2F0aW9uJ1xuaW1wb3J0IHtcbiAgaXNTdHJpbmcsXG4gIGlzQWJzb2x1dGVVcmwsXG4gIG1lcmdlLFxuICBoeXBoZW5hdGUsXG4gIGNhbWVsaXplLFxuICBkZWZhdWx0Rm9ybWF0c1xufSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0ICogYXMgY29tcG9uZW50cyBmcm9tICcuL2NvbXBvbmVudHMvaW5kZXguanMnXG5pbXBvcnQgKiBhcyB0eXBlcyBmcm9tICcuL3R5cGVzL2luZGV4LmpzJ1xuaW1wb3J0IERpdG9Sb290IGZyb20gJy4vY29tcG9uZW50cy9EaXRvUm9vdC52dWUnXG5pbXBvcnQgRGl0b1R5cGVDb21wb25lbnQgZnJvbSAnLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcbmltcG9ydCB7IGdldFJlc291cmNlIH0gZnJvbSAnLi91dGlscy9yZXNvdXJjZS5qcydcbmltcG9ydCB7IGRlcHJlY2F0ZSB9IGZyb20gJy4vdXRpbHMvZGVwcmVjYXRlLmpzJ1xuaW1wb3J0IHsgZm9ybWF0UXVlcnkgfSBmcm9tICcuL3V0aWxzL3JvdXRlLmpzJ1xuaW1wb3J0IHZlcmJzIGZyb20gJy4vdmVyYnMuanMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERpdG9BZG1pbiB7XG4gIGNvbnN0cnVjdG9yKGVsLCB7XG4gICAgLy8gYGRpdG9gIGNvbnRhaW5zIHRoZSBiYXNlIGFuZCBhcGkgc2V0dGluZ3MgcGFzc2VkIGZyb20gYEFkbWluQ29udHJvbGxlcmBcbiAgICBkaXRvID0ge30sXG4gICAgYXBpLFxuICAgIHZpZXdzID0ge30sXG4gICAgLi4ub3B0aW9uc1xuICB9ID0ge30pIHtcbiAgICB0aGlzLmVsID0gZWxcbiAgICAvLyBNZXJnZSBpbiBgYXBpYCBzZXR0aW5ncyBhcyBwYXNzZWQgZnJvbSBgY29uZmlnLmFkbWluYCBhbmQgdGhyb3VnaCB0aGVcbiAgICAvLyBgQWRtaW5Db250cm9sbGVyYCB3aXRoIGBhcGlgIHZhbHVlcyBmcm9tIGZyb20gJ2FkbWluL2luZGV4LmpzJ1xuICAgIC8vIE5PVEU6IGBBZG1pbkNvbnRyb2xsZXJgIHByb3ZpZGVzIGBkaXRvLmFwaS5iYXNlYFxuICAgIHRoaXMuYXBpID0gYXBpID0gbWVyZ2UoeyBiYXNlOiAnLycgfSwgZGl0by5hcGksIGFwaSlcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zXG5cbiAgICAvLyBTZXR1cCBkZWZhdWx0IGFwaSBzZXR0aW5nczpcbiAgICBhcGkubG9jYWxlIHx8PSAnZW4tVVMnXG4gICAgYXBpLmZvcm1hdHMgPSBtZXJnZSh7fSwgZGVmYXVsdEZvcm1hdHMsIGFwaS5mb3JtYXRzKVxuICAgIGFwaS5yZXF1ZXN0IHx8PSBvcHRpb25zID0+IHJlcXVlc3QoYXBpLCBvcHRpb25zKVxuICAgIGFwaS5nZXRBcGlVcmwgfHw9IG9wdGlvbnMgPT4gZ2V0QXBpVXJsKGFwaSwgb3B0aW9ucylcbiAgICBhcGkuaXNBcGlVcmwgfHw9IHVybCA9PiBpc0FwaVVybChhcGksIHVybClcbiAgICAvLyBTZXR0aW5nIGBhcGkubm9ybWFsaXplUGF0aHMgPSB0cnVlIChwbHVyYWwpIHNldHMgYm90aDpcbiAgICAvLyBgYXBpLm5vcm1hbGl6ZVBhdGggPSBoeXBoZW5hdGVgIGFuZCBgYXBpLmRlbm9ybWFsaXplUGF0aCA9IGNhbWVsaXplYFxuICAgIGFwaS5ub3JtYWxpemVQYXRoIHx8PSBhcGkubm9ybWFsaXplUGF0aHMgPyBoeXBoZW5hdGUgOiB2YWwgPT4gdmFsXG4gICAgYXBpLmRlbm9ybWFsaXplUGF0aCB8fD0gYXBpLm5vcm1hbGl6ZVBhdGhzID8gY2FtZWxpemUgOiB2YWwgPT4gdmFsXG5cbiAgICAvLyBBbGxvdyBkZWZpbml0aW9uIG9mIGRlZmF1bHRzIGZvciBhZG1pbiBjb21wb25lbnQgdHlwZXMsIG5lc3RlZCBwZXIgdHlwZTpcbiAgICAvLyBhcGkuZGVmYXVsdHMgPSB7XG4gICAgLy8gICAnbXVsdGlzZWxlY3QnOiB7XG4gICAgLy8gICAgIHNlbGVjdGFibGU6IHRydWVcbiAgICAvLyAgIH0sXG4gICAgLy8gICAnZmFrZS10eXBlJzogc2NoZW1hID0+IHtcbiAgICAvLyAgICAgLy8gUmV0dXJuIGRlZmF1bHRzLCBvciBkaXJlY3RseSBtb2RpZnkgdGhlIHNjaGVtYTpcbiAgICAvLyAgICAgT2JqZWN0LmFzc2lnbihzY2hlbWEsIHtcbiAgICAvLyAgICAgICB0eXBlOiAncmVhbC10eXBlJyxcbiAgICAvLyAgICAgICBmb3JtYXQ6ICh7IHZhbHVlIH0pID0+IGBGb3JtYXR0ZWQgJHt2YWx1ZX1gLFxuICAgIC8vICAgICAgIHByb2Nlc3M6ICh7IHZhbHVlIH0pID0+IGBQcm9jZXNzZWQgJHt2YWx1ZX1gXG4gICAgLy8gICAgIH0pXG4gICAgLy8gICB9XG4gICAgLy8gfVxuXG4gICAgYXBpLmRlZmF1bHRzIHx8PSB7fVxuXG4gICAgLy8gQWxsb3cgdGhlIGNvbmZpZ3VyYXRpb24gb2YgYWxsIGF1dGggcmVzb3VyY2VzLCBsaWtlIHNvOlxuICAgIC8vIGFwaS51c2VycyA9IHtcbiAgICAvLyAgIHBhdGg6ICcvYWRtaW5zJyxcbiAgICAvLyAgIC8vIFRoZXNlIGFyZSB0aGUgZGVmYXVsdHM6XG4gICAgLy8gICBsb2dpbjoge1xuICAgIC8vICAgICBwYXRoOiAnbG9naW4nLFxuICAgIC8vICAgICBtZXRob2Q6ICdwb3N0J1xuICAgIC8vICAgfSxcbiAgICAvLyAgIGxvZ291dDoge1xuICAgIC8vICAgICBwYXRoOiAnbG9nb3V0JyxcbiAgICAvLyAgICAgbWV0aG9kOiAncG9zdCdcbiAgICAvLyAgIH0sXG4gICAgLy8gICBzZXNzaW9uOiB7XG4gICAgLy8gICAgIHBhdGg6ICdzZXNzaW9uJyxcbiAgICAvLyAgICAgbWV0aG9kOiAnZ2V0J1xuICAgIC8vICAgfVxuICAgIC8vIH1cbiAgICBjb25zdCB1c2VycyA9IGdldFJlc291cmNlKGFwaS51c2Vycywge1xuICAgICAgdHlwZTogJ2NvbGxlY3Rpb24nXG4gICAgfSkgfHwge31cbiAgICB1c2Vycy5sb2dpbiA9IGdldFJlc291cmNlKHVzZXJzLmxvZ2luIHx8ICdsb2dpbicsIHtcbiAgICAgIG1ldGhvZDogJ3Bvc3QnLFxuICAgICAgcGFyZW50OiB1c2Vyc1xuICAgIH0pXG4gICAgdXNlcnMubG9nb3V0ID0gZ2V0UmVzb3VyY2UodXNlcnMubG9nb3V0IHx8ICdsb2dvdXQnLCB7XG4gICAgICBtZXRob2Q6ICdwb3N0JyxcbiAgICAgIHBhcmVudDogdXNlcnNcbiAgICB9KVxuICAgIHVzZXJzLnNlc3Npb24gPSBnZXRSZXNvdXJjZSh1c2Vycy5zZXNzaW9uIHx8ICdzZXNzaW9uJywge1xuICAgICAgbWV0aG9kOiAnZ2V0JyxcbiAgICAgIHBhcmVudDogdXNlcnNcbiAgICB9KVxuICAgIGFwaS51c2VycyA9IHVzZXJzXG5cbiAgICAvLyBBbGxvdyBvdmVycmlkaW5nIG9mIHJlc291cmNlIHBhdGggaGFuZGxlcnM6XG4gICAgLy8gYXBpLnJlc291cmNlcyA9IHtcbiAgICAvLyAgIGNvbGxlY3Rpb24ocmVzb3VyY2UpIHtcbiAgICAvLyAgICAgcmV0dXJuIHJlc291cmNlLnBhcmVudFxuICAgIC8vICAgICAgID8gYCR7cmVzb3VyY2UucGF0aH0/JHtyZXNvdXJjZS5wYXJlbnQucGF0aH1faWQ9JHtcbiAgICAvLyAgICAgICAgICByZXNvdXJjZS5wYXJlbnQuaWR9YFxuICAgIC8vICAgICAgIDogcmVzb3VyY2UucGF0aFxuICAgIC8vICAgfVxuICAgIC8vIH1cblxuICAgIGFwaS5yZXNvdXJjZXMgPSB7XG4gICAgICBhbnkocmVzb3VyY2UpIHtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IHRoaXNbcmVzb3VyY2U/LnR5cGVdIHx8IHRoaXMuZGVmYXVsdFxuICAgICAgICByZXR1cm4gcmVzb3VyY2UgJiYgaGFuZGxlci5jYWxsKHRoaXMsIHJlc291cmNlKVxuICAgICAgfSxcblxuICAgICAgZGVmYXVsdChyZXNvdXJjZSkge1xuICAgICAgICBjb25zdCBwYXJlbnRQYXRoID0gdGhpcy5hbnkocmVzb3VyY2UucGFyZW50KVxuICAgICAgICByZXR1cm4gcGFyZW50UGF0aFxuICAgICAgICAgID8gYCR7cGFyZW50UGF0aH0vJHtyZXNvdXJjZS5wYXRofWBcbiAgICAgICAgICA6IHJlc291cmNlLnBhdGhcbiAgICAgIH0sXG5cbiAgICAgIGNvbGxlY3Rpb24ocmVzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdChyZXNvdXJjZSlcbiAgICAgIH0sXG5cbiAgICAgIG1lbWJlcihyZXNvdXJjZSkge1xuICAgICAgICAvLyBOT1RFOiBXZSBhc3N1bWUgdGhhdCBhbGwgbWVtYmVycyBoYXZlIHJvb3QtbGV2ZWwgY29sbGVjdGlvbiByb3V0ZXMsXG4gICAgICAgIC8vIHRvIGF2b2lkIGV4Y2Vzc2l2ZSBuZXN0aW5nIG9mIChzdWItKWNvbGxlY3Rpb24gcm91dGVzLlxuICAgICAgICByZXR1cm4gYCR7cmVzb3VyY2UucGF0aH0vJHtyZXNvdXJjZS5pZH1gXG4gICAgICB9LFxuXG4gICAgICB1cGxvYWQocmVzb3VyY2UpIHtcbiAgICAgICAgLy8gRGl0byBTZXJ2ZXIgaGFuZGxlcyB1cGxvYWQgcm91dGVzIG9uIHRoZSBjb2xsZWN0aW9uIHJlc291cmNlOlxuICAgICAgICByZXR1cm4gYCR7dGhpcy5jb2xsZWN0aW9uKHJlc291cmNlLnBhcmVudCl9L3VwbG9hZC8ke3Jlc291cmNlLnBhdGh9YFxuICAgICAgfSxcblxuICAgICAgLi4uYXBpLnJlc291cmNlc1xuICAgIH1cblxuICAgIC8vIEFsbG93IG92ZXJyaWRpbmcgLyBleHRlbmRpbmcgb2YgaGVhZGVyczpcbiAgICAvLyBhcGkuaGVhZGVycyA9IHtcbiAgICAvLyAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICAvLyB9XG4gICAgYXBpLmhlYWRlcnMgPSB7XG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgLi4uYXBpLmhlYWRlcnNcbiAgICB9XG5cbiAgICBpZiAoaXNTdHJpbmcoZWwpKSB7XG4gICAgICBlbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZWwpXG4gICAgfVxuXG4gICAgY29uc3QgYXBwID0gKHRoaXMuYXBwID0gY3JlYXRlQXBwKHtcbiAgICAgIGNvbXBvbmVudHM6IHtcbiAgICAgICAgRGl0b1Jvb3QsXG4gICAgICAgIFZ1ZU5vdGlmaWNhdGlvbnMsXG4gICAgICAgIC8vIFRoaXMgbWF5IG9ubHkgYmUgbmVlZGVkIHRvIGF2b2lkIHRyZWUtc2hhY2tpbmcgb2YgdGhlc2UgY29tcG9uZW50cyxcbiAgICAgICAgLy8gc2luY2UgdGhleSBhY3R1YWxseSBoYW5kbGUgcmVnaXN0cnkgaW50ZXJuYWxseSBhbHJlYWR5LlxuICAgICAgICAvLyBUT0RPOiBSZW1vdmUgdGhpcyBvbmNlIHdlIGhhdmUgYSBiZXR0ZXIgc29sdXRpb24uXG4gICAgICAgIC4uLmNvbXBvbmVudHMsXG4gICAgICAgIC4uLnR5cGVzXG4gICAgICB9LFxuXG4gICAgICAvLyBNb3N0IGluamVjdHMgYXJlIGRlZmluZWQgYXMgZnVuY3Rpb25zLCB0byBwcmVzZXJ2ZSByZWFjdGl2ZW5lc3MgYWNyb3NzXG4gICAgICAvLyBwcm92aWRlL2luamVjdCwgc2VlOlxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3Z1ZWpzL3Z1ZS9pc3N1ZXMvNzAxNyNpc3N1ZWNvbW1lbnQtNDgwOTA2NjkxXG4gICAgICBwcm92aWRlOiB7XG4gICAgICAgIGFwaSxcbiAgICAgICAgLy8gQSBkZWZhdWx0IGxpc3Qgb2YgdmVyYnMgYXJlIHByb3ZpZGVkIGJ5ICR2ZXJicygpIGFuZCBjYW4gYmVcbiAgICAgICAgLy8gb3ZlcnJpZGRlbiBhdCBhbnkgcG9pbnQgaW4gdGhlIGNvbXBvbmVudCBoaWVyYXJjaHkuXG4gICAgICAgICR2ZXJiczogKCkgPT4gdmVyYnMsXG4gICAgICAgIC8vIFByb3ZpZGUgZGVmYXVsdHMgc28gRGl0b01peGluIGNhbiBpbmplY3QgdGhlbSBmb3IgYWxsIGNvbXBvbmVudHM6XG4gICAgICAgIC8vICAgaW5qZWN0OiBbICAnJGlzUG9wdWxhdGVkJywgJyRzY2hlbWFDb21wb25lbnQnLCAnJHJvdXRlQ29tcG9uZW50JyBdXG4gICAgICAgICR2aWV3czogKCkgPT4ge30sXG4gICAgICAgICRpc1BvcHVsYXRlZDogKCkgPT4gdHJ1ZSxcbiAgICAgICAgJHBhcmVudENvbXBvbmVudDogKCkgPT4gbnVsbCxcbiAgICAgICAgJHNjaGVtYUNvbXBvbmVudDogKCkgPT4gbnVsbCxcbiAgICAgICAgJHNjaGVtYVBhcmVudENvbXBvbmVudDogKCkgPT4gbnVsbCxcbiAgICAgICAgJHJvdXRlQ29tcG9uZW50OiAoKSA9PiBudWxsLFxuICAgICAgICAkZGF0YUNvbXBvbmVudDogKCkgPT4gbnVsbCxcbiAgICAgICAgJHNvdXJjZUNvbXBvbmVudDogKCkgPT4gbnVsbCxcbiAgICAgICAgJHJlc291cmNlQ29tcG9uZW50OiAoKSA9PiBudWxsLFxuICAgICAgICAkZGlhbG9nQ29tcG9uZW50OiAoKSA9PiBudWxsLFxuICAgICAgICAkcGFuZWxDb21wb25lbnQ6ICgpID0+IG51bGwsXG4gICAgICAgICR0YWJDb21wb25lbnQ6ICgpID0+IG51bGxcbiAgICAgIH0sXG5cbiAgICAgIHJlbmRlcjogKCkgPT5cbiAgICAgICAgY3JlYXRlRWxlbWVudChEaXRvUm9vdCwge1xuICAgICAgICAgIHJlZjogJ3Jvb3QnLFxuICAgICAgICAgIGNsYXNzOiBkaXRvLnNldHRpbmdzLnJvb3RDbGFzcyxcbiAgICAgICAgICB1bnJlc29sdmVkVmlld3M6IHZpZXdzLFxuICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgfSlcbiAgICB9KSlcblxuICAgIGFwcC51c2UoVnVlTm90aWZpY2F0aW9ucywge1xuICAgICAgbmFtZTogJ25vdGlmeScsXG4gICAgICBjb21wb25lbnROYW1lOiAnVnVlTm90aWZpY2F0aW9ucydcbiAgICB9KVxuXG4gICAgLy8gcm9vdC5jb21wb25lbnQoJ3Z1ZS1tb2RhbCcsIFZ1ZU1vZGFsKVxuXG4gICAgYXBwLnVzZShcbiAgICAgIGNyZWF0ZVJvdXRlcih7XG4gICAgICAgIC8vIFN0YXJ0IHdpdGggYSBjYXRjaC1hbGwgcm91dGUsIHRvIGJlIHJlcGxhY2VkIGJ5IHRoZSBhY3R1YWwgcm91dGVzXG4gICAgICAgIC8vIG9uY2UgdGhlIHNjaGVtYXMgYXJlIGxvYWRlZCwgdG8gcHJldmVudCB2dWUtcm91dGVyIGZyb20gY29tcGxhaW5pbmcsXG4gICAgICAgIC8vIHNlZTogYHJlc29sdmVWaWV3cygpYCBpbiBgRGl0b1Jvb3RgIGZvciB0aGUgYWN0dWFsIHJvdXRlIHNldHVwLlxuICAgICAgICByb3V0ZXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnY2F0Y2gtYWxsJyxcbiAgICAgICAgICAgIHBhdGg6ICcvOl8oLiopJyxcbiAgICAgICAgICAgIGNvbXBvbmVudHM6IHt9XG4gICAgICAgICAgfVxuICAgICAgICBdLFxuICAgICAgICBoaXN0b3J5OiBjcmVhdGVXZWJIaXN0b3J5KGRpdG8uYmFzZSksXG4gICAgICAgIGxpbmtBY3RpdmVDbGFzczogJycsXG4gICAgICAgIGxpbmtFeGFjdEFjdGl2ZUNsYXNzOiAnJ1xuICAgICAgfSlcbiAgICApXG5cbiAgICBlbC5jbGFzc0xpc3QuYWRkKCdkaXRvLWFwcCcpXG4gICAgYXBwLm1vdW50KGVsKVxuICB9XG5cbiAgcmVnaXN0ZXIodHlwZSwgb3B0aW9ucykge1xuICAgIHJldHVybiBEaXRvVHlwZUNvbXBvbmVudC5yZWdpc3Rlcih0eXBlLCBvcHRpb25zKVxuICB9XG59XG5cbmNsYXNzIFJlcXVlc3RFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IocmVzcG9uc2UpIHtcbiAgICBzdXBlcihcbiAgICAgIGBSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyBjb2RlOiAke3Jlc3BvbnNlLnN0YXR1c30gKCR7XG4gICAgICAgIHJlc3BvbnNlLnN0YXR1c1RleHRcbiAgICAgIH0pYFxuICAgIClcbiAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2VcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0KGFwaSwge1xuICB1cmwsXG4gIG1ldGhvZCA9ICdnZXQnLFxuICAvLyBUT0RPOiBgcmVxdWVzdC5wYXJhbXNgIHdhcyBkZXByZWNhdGVkIGluIGZhdm91ciBvZiBgcXVlcnlgIG9uIDIwMjItMTEtMDEsXG4gIC8vIHJlbW92ZSBvbmNlIG5vdCBpbiB1c2UgYW55d2hlcmUgYW55IG1vcmUuXG4gIHBhcmFtcyA9IG51bGwsXG4gIHF1ZXJ5ID0gcGFyYW1zIHx8IG51bGwsXG4gIGhlYWRlcnMgPSBudWxsLFxuICBkYXRhID0gbnVsbFxufSkge1xuICBpZiAocGFyYW1zKSB7XG4gICAgZGVwcmVjYXRlKFxuICAgICAgYHJlcXVlc3QucGFyYW1zIGlzIGRlcHJlY2F0ZWQuIFVzZSBhY3Rpb24ubWV0aG9kIGFuZCBhY3Rpb24ucGF0aCBpbnN0ZWFkLmBcbiAgICApXG4gIH1cblxuICBjb25zdCBpc0FwaVVybCA9IGFwaS5pc0FwaVVybCh1cmwpXG5cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChhcGkuZ2V0QXBpVXJsKHsgdXJsLCBxdWVyeSB9KSwge1xuICAgIG1ldGhvZDogbWV0aG9kLnRvVXBwZXJDYXNlKCksXG4gICAgLi4uKGRhdGEgJiYgeyBib2R5OiBKU09OLnN0cmluZ2lmeShkYXRhKSB9KSxcbiAgICBoZWFkZXJzOiB7XG4gICAgICAuLi4oaXNBcGlVcmwgJiYgYXBpLmhlYWRlcnMpLFxuICAgICAgLi4uaGVhZGVyc1xuICAgIH0sXG4gICAgY3JlZGVudGlhbHM6XG4gICAgICBpc0FwaVVybCAmJiBhcGkuY29ycz8uY3JlZGVudGlhbHNcbiAgICAgICAgPyAnaW5jbHVkZSdcbiAgICAgICAgOiAnc2FtZS1vcmlnaW4nXG4gIH0pXG5cbiAgaWYgKHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdDb250ZW50LVR5cGUnKT8uaW5jbHVkZXMoJ2FwcGxpY2F0aW9uL2pzb24nKSkge1xuICAgIHJlc3BvbnNlLmRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKClcbiAgfVxuXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICB0aHJvdyBuZXcgUmVxdWVzdEVycm9yKHJlc3BvbnNlKVxuICB9XG4gIHJldHVybiByZXNwb25zZVxufVxuXG5mdW5jdGlvbiBpc0FwaVVybChhcGksIHVybCkge1xuICByZXR1cm4gIWlzQWJzb2x1dGVVcmwodXJsKSB8fCB1cmwuc3RhcnRzV2l0aChhcGkudXJsKVxufVxuXG5mdW5jdGlvbiBnZXRBcGlVcmwoYXBpLCB7IHVybCwgcXVlcnkgfSkge1xuICBpZiAoIWlzQWJzb2x1dGVVcmwodXJsKSkge1xuICAgIHVybCA9IGNvbWJpbmVVcmxzKGFwaS51cmwsIHVybClcbiAgfVxuICAvLyBTdXBwb3J0IG9wdGlvbmFsIHF1ZXJ5IHBhcmFtZXRlcnMsIHRvIGJlIGFyZSBhZGRlZCB0byB0aGUgVVJMLlxuICBjb25zdCBzZWFyY2ggPSBmb3JtYXRRdWVyeShxdWVyeSlcbiAgcmV0dXJuIHNlYXJjaCA/IGAke3VybH0/JHtzZWFyY2h9YCA6IHVybFxufVxuXG5mdW5jdGlvbiBjb21iaW5lVXJscyhiYXNlVXJsLCByZWxhdGl2ZVVybCkge1xuICAvLyBVc2Ugc2FtZSBhcHByb2FjaCBhcyBheGlvcyBgY29tYmluZVVSTHMoKWAgdG8gam9pbiBiYXNlVXJsICYgcmVsYXRpdmVVcmw6XG4gIHJldHVybiBgJHtiYXNlVXJsLnJlcGxhY2UoL1xcLyskLywgJycpfS8ke3JlbGF0aXZlVXJsLnJlcGxhY2UoL15cXC8rLywgJycpfWBcbn1cbiJdLCJuYW1lcyI6WyJhcHBTdGF0ZSIsInJlYWN0aXZlIiwiYXBwZW5kRGF0YVBhdGgiLCJkYXRhUGF0aCIsInRva2VuIiwicGFyc2VQYXJlbnREYXRhUGF0aCIsInBhdGgiLCJwYXJzZURhdGFQYXRoIiwicGFyc2VJdGVtRGF0YVBhdGgiLCJuZXN0ZWQiLCJnZXRJdGVtRGF0YVBhdGgiLCJub3JtYWxpemVEYXRhUGF0aCIsInBhcnNlUGFyZW50SXRlbURhdGFQYXRoIiwiaXNJbnRlZ2VyIiwiZ2V0UGFyZW50SXRlbURhdGFQYXRoIiwiZ2V0SXRlbSIsInJvb3RJdGVtIiwiZ2V0VmFsdWVBdERhdGFQYXRoIiwiZ2V0UGFyZW50SXRlbSIsImdldExhc3REYXRhUGF0aFRva2VuIiwiZ2V0TGFzdERhdGFQYXRoTmFtZSIsImdldExhc3REYXRhUGF0aEluZGV4IiwiaW5kZXgiLCJ0ZW1wb3JhcnlJZCIsInNldFRlbXBvcmFyeUlkIiwiZGF0YSIsImlkS2V5IiwiaXNUZW1wb3JhcnlJZCIsImlkIiwiaXNSZWZlcmVuY2UiLCJoYXNPd25Qcm9wZXJ0eSIsImNvbnRleHRzIiwiZ2V0IiwiY29udGV4dCIsImtleSIsImRlZmF1bHRWYWx1ZSIsIm9iamVjdCIsInRvUmF3IiwidmFsdWUiLCJpc0Z1bmN0aW9uIiwic2V0IiwiRGl0b0NvbnRleHQiLCJjb21wb25lbnQiLCJpdGVtIiwib3B0aW9ucyIsImxvY2F0aW9uIiwicmVzb3VyY2UiLCJFbWl0dGVyTWl4aW4iLCJldmVudCIsImNhbGxiYWNrIiwiaXNBcnJheSIsImV2IiwiaXNQbGFpbk9iamVjdCIsImxpc3RlbmVycyIsImNhbGxiYWNrcyIsIm9uIiwiYXJncyIsImVudHJ5IiwiX2EiLCJjYiIsInF1ZXVlIiwicmVzb2x2ZSIsIm5leHQiLCJyZXN1bHQiLCJyZXMiLCJlcnJvciIsInRhcmdldCIsInR5cGVDaGVja2VycyIsImlzQm9vbGVhbiIsImlzTnVtYmVyIiwiaXNTdHJpbmciLCJpc0RhdGUiLCJpc09iamVjdCIsImlzUmVnRXhwIiwidHlwZUNvbnZlcnRlcnMiLCJhc0FycmF5IiwiaXNNYXRjaGluZ1R5cGUiLCJ0eXBlcyIsInR5cGUiLCJjb252ZXJ0VHlwZSIsImNvbnZlcnRlciIsImhhc1Jlc291cmNlIiwic2NoZW1hIiwiZ2V0UmVzb3VyY2UiLCJkZWZhdWx0cyIsInBhcmVudCIsImRlZnMiLCJnZXRNZW1iZXJSZXNvdXJjZSIsInBpY2tCeSIsIkRpdG9NaXhpbiIsInVpZCIsIm5leHRVaWQiLCJsYWJlbGl6ZSIsImtleU9yRGF0YVBhdGgiLCJkZWYiLCJjb252ZXJ0ZWQiLCJuYW1lIiwidmVyYiIsInF1ZXJ5IiwidXJsIiwibWV0aG9kIiwiaW50ZXJuYWwiLCJjaGVja1VzZXIiLCJyZXNwb25zZSIsImVxdWFscyIsImNvbXBvbmVudHMiLCJidXR0b25zIiwic2V0dGluZ3MiLCJjYWNoZSIsImNhY2hlUGFyZW50IiwibG9hZENhY2hlIiwiY2FjaGVLZXkiLCJsb2NhbGUiLCJmb3JtYXQiLCJhIiwiYm9keSIsImFjY2Vzc29yIiwid2F0Y2giLCJldmVudHMiLCJoYW5kbGVycyIsImV4cHIiLCJhZGRFdmVudCIsImh5cGhlbmF0ZSIsImhhc0xpc3RlbmVycyIsInBhcmVudEhhc0xpc3RlbmVycyIsImdldENvbnRleHQiLCJwYXJhbXMiLCJpc0NyZWRpdENhcmQiLCJkZWNpbWFscyIsIm1hdGNoIiwiaXNEb21haW4iLCJpc0VtYWlsIiwiaXNIb3N0bmFtZSIsIm1heCIsIm1pbiIsInBhc3N3b3JkIiwiaXNVcmwiLCJWYWxpZGF0aW9uTWl4aW4iLCJub3RpZnkiLCJpc1ZhbGlkIiwicnVsZSIsInNldHRpbmciLCJ2YWxpZGF0b3IiLCJ2YWxpZGF0aW9ucyIsInZhbGlkYXRlIiwibWVzc2FnZSIsImFkZExhYmVsIiwiZXJyb3JzIiwiZm9jdXMiLCJnZXRTY2hlbWFBY2Nlc3NvciIsImdldFN0b3JlQWNjZXNzb3IiLCJUeXBlTWl4aW4iLCJjb21wdXRlVmFsdWUiLCJwYXJzZSIsInNjaGVtYUNvbXBvbmVudCIsImxhYmVsIiwiY2FtZWxpemUiLCJuYXRpdmVGaWVsZCIsInRleHRGaWVsZCIsImF0dHJpYnV0ZXMiLCJhZGQiLCJvbkZvY3VzIiwib25CbHVyIiwib25JbnB1dCIsIm9uQ2hhbmdlIiwiZWxlbWVudCIsIl9iIiwidWlkTWFwIiwiZ2V0VWlkIiwiaXRlbUlkIiwiU2NoZW1hR3JhcGgiLCJfX3B1YmxpY0ZpZWxkIiwic3ViR3JhcGgiLCJwYXJ0IiwicmVsYXRlZERhdGFQYXRoIiwibmFub2lkIiwiZmxhdHRlbiIsImdyYXBoIiwiZW50cmllcyIsIiRzZXR0aW5ncyIsInN1YktleSIsInNvdXJjZVNjaGVtYSIsImNsaXBib2FyZCIsInJlbGF0ZWQiLCJyZWZlcmVuY2UiLCJzb3VyY2UiLCJyZWxhdGlvbiIsInZhbHVlcyIsInJlbW92ZUlkIiwicmVmZXJlbmNlSWQiLCJyZWZLZXkiLCJyZXZWYWx1ZSIsInR5cGVDb21wb25lbnRzIiwidW5rbm93blR5cGVSZXBvcnRlZCIsInJlZ2lzdGVyVHlwZUNvbXBvbmVudCIsImdldFR5cGVDb21wb25lbnQiLCJhbGxvd051bGwiLCJpdGVyYXRlU2NoZW1hQ29tcG9uZW50cyIsInNjaGVtYXMiLCJpc1NpbmdsZUNvbXBvbmVudFZpZXciLCJpdGVyYXRlTmVzdGVkU2NoZW1hQ29tcG9uZW50cyIsImdldFRhYlNjaGVtYXMiLCJmaW5kU2NoZW1hQ29tcG9uZW50Iiwic29tZVNjaGVtYUNvbXBvbmVudCIsImlzU2NoZW1hIiwiaXNGb3JtIiwiaXNWaWV3IiwiaXNUYWIiLCJpc1BhbmVsIiwiZ2V0U2NoZW1hSWRlbnRpZmllciIsInJlc29sdmVTY2hlbWEiLCJ1bndyYXBNb2R1bGUiLCJpc1Byb21pc2UiLCJpc01vZHVsZSIsImtleXMiLCJyZXNvbHZlU2NoZW1hcyIsInVucmVzb2x2ZWRTY2hlbWFzIiwicmVzb2x2ZUl0ZW0iLCJtYXBDb25jdXJyZW50bHkiLCJyZXNvbHZlU2NoZW1hQ29tcG9uZW50IiwibWFya1JhdyIsInJlc29sdmVTY2hlbWFDb21wb25lbnRzIiwicHJvY2Vzc1NjaGVtYUNvbXBvbmVudHMiLCJhcGkiLCJyb3V0ZXMiLCJsZXZlbCIsInByb21pc2VzIiwicHJvY2VzcyIsInJlbGF0aXZlTGV2ZWwiLCJwcm9jZXNzU2NoZW1hQ29tcG9uZW50IiwiZ2V0UGFuZWxTY2hlbWFzIiwicHJvY2Vzc1NjaGVtYURlZmF1bHRzIiwicGFuZWwiLCJnZXRUeXBlT3B0aW9ucyIsInByb2Nlc3NWaWV3IiwicHJvY2Vzc1JvdXRlU2NoZW1hIiwicHJvY2Vzc05lc3RlZFNjaGVtYXMiLCJjaGlsZHJlbiIsIm1lcmdlIiwicHJvY2Vzc05lc3RlZFNjaGVtYURlZmF1bHRzIiwiZm9ybXMiLCJnZXRGb3JtU2NoZW1hcyIsImZvcm0iLCJwcm9jZXNzRm9ybXMiLCJwcm9jZXNzRm9ybSIsInByb2Nlc3NUYWIiLCJwcm9jZXNzUGFuZWwiLCJ0YWJzIiwicGFuZWxzIiwidGFiIiwiaGFzRm9ybVNjaGVtYSIsImhhc011bHRpcGxlRm9ybVNjaGVtYXMiLCJnZXRWaWV3Rm9ybVNjaGVtYSIsInZpZXciLCJ2aWV3U2NoZW1hIiwiZ2V0Vmlld1NjaGVtYSIsImdldFZpZXdFZGl0UGF0aCIsIm1vZGlmeUZvcm0iLCJjb21wYWN0IiwiZ2V0SXRlbUZvcm1TY2hlbWFGcm9tRm9ybXMiLCJnZXRJdGVtRm9ybVNjaGVtYSIsImlzQ29tcGFjdCIsImlzSW5saW5lZCIsImlzTmVzdGVkIiwib21pdFBhZGRpbmciLCJhbGlnbkJvdHRvbSIsImdldERlZmF1bHRWYWx1ZSIsImNsb25lIiwiaWdub3JlTWlzc2luZ1ZhbHVlIiwidHlwZU9wdGlvbnMiLCJzZXREZWZhdWx0VmFsdWVzIiwicHJvY2Vzc1NjaGVtYURhdGEiLCJyb290RGF0YSIsImNvbXB1dGUiLCJjbG9uZUl0ZW0iLCJjb3B5Iiwib3JkZXJLZXkiLCJwcm9jZXNzRGF0YSIsInNjaGVtYU9ubHkiLCJwcm9jZXNzZWREYXRhIiwid3JhcFByaW1pdGl2ZXMiLCJiIiwiaWQxIiwiaWQyIiwiZXhjbHVkZSIsInByb2Nlc3NWYWx1ZSIsInByb2Nlc3NCZWZvcmUiLCJwcm9jZXNzQWZ0ZXIiLCJwcm9jZXNzQ29tcG9uZW50cyIsImdldERhdGFQYXRoIiwiY29tcG9uZW50U2NoZW1hIiwiY29tcG9uZW50RGF0YVBhdGgiLCJwcm9jZXNzSXRlbSIsInByb2Nlc3NlZEl0ZW0iLCJnZXROYW1lZFNjaGVtYXMiLCJ0b09iamVjdCIsImFycmF5IiwidG9TY2hlbWEiLCJnZXRCdXR0b25TY2hlbWFzIiwiZ2V0VHlwZSIsInNjaGVtYU9yVHlwZSIsImdldFNvdXJjZVR5cGUiLCJnZXRQYW5lbEVudHJ5IiwidGFiQ29tcG9uZW50IiwiZ2V0UGFuZWxFbnRyaWVzIiwicGFuZWxTY2hlbWFzIiwicGFuZWxFbnRyaWVzIiwiZ2V0QWxsUGFuZWxFbnRyaWVzIiwicGFuZWxTY2hlbWEiLCJpc09iamVjdFNvdXJjZSIsImlzTGlzdFNvdXJjZSIsImdldEl0ZW1JZCIsImdldEl0ZW1VaWQiLCJyZXNvbHZlTWVyZ2VkT3B0aW9ucyIsIm1peGlucyIsIm1lcmdlT3B0aW9ucyIsInRvIiwiZnJvbSIsIm1peGluIiwiZGl0b09wdGlvbktleXMiLCJEaXRvQ29tcG9uZW50IiwiZGVmaW5pdGlvbiIsIkRpdG9Vc2VyIiwicm9sZXMiLCJyb2xlIiwiU2NoZW1hUGFyZW50TWl4aW4iLCJzY2hlbWFDb21wb25lbnRzIiwiVmFsaWRhdG9yTWl4aW4iLCJpdCIsIlJvdXRlTWl4aW4iLCJyb3V0ZUNvbXBvbmVudCIsIm1hdGNoZWQiLCJpIiwicmVjb3JkIiwiYnJlYWRjcnVtYiIsInJvdXRlQ29tcG9uZW50cyIsIm9rIiwidGVtcGxhdGVQYXRoIiwicm9vdFBhdGgiLCJnZXRDb21tb25QcmVmaXgiLCJpc0xvYWRpbmciLCJjb3B5RGF0ZSIsImRhdGUiLCJ5ZWFyIiwibW9udGgiLCJkYXkiLCJob3VyIiwibWludXRlIiwic2Vjb25kIiwibWlsbGlzZWNvbmQiLCJfc2ZjX21haW4iLCJ3ZWVrZGF5TmFtZXMiLCJtb250aE5hbWVzIiwiZ2V0TG9jYWxlTmFtZXMiLCJtb2RlIiwib3ZlcnJpZGVzIiwic3RlcCIsImN1cnJlbnRWYWx1ZSIsInN0YXRlIiwiaG9yIiwidmVyIiwiZW50ZXIiLCJjdXJyZW50TW9kZSIsInN0YXJ0WWVhciIsImZpcnN0RGF5V2VlayIsIm51bURheXMiLCJwcmV2TW9udGgiLCJwcmV2TW9udGhOdW1EYXlzIiwidG9kYXkiLCJpc0RheSIsIm5leHRNb250aE5lZWQiLCJuZXh0TW9udGgiLCJsb2NhbGVOYW1lcyIsIm5hbWVzIiwiYWRkRXZlbnRzIiwiZ2V0S2V5IiwiZ2V0S2V5TmF2aWdhdGlvbiIsImNsYXNzZXMiLCJzaG93IiwidHJpZ2dlciIsInBvcHVwIiwiZWwiLCJib3VuZHMiLCJ0cmlnZ2VyTGVmdCIsInRyaWdnZXJUb3AiLCJ0cmlnZ2VyV2lkdGgiLCJ0cmlnZ2VySGVpZ2h0IiwicG9wdXBXaWR0aCIsInBvcHVwSGVpZ2h0IiwicGFydDEiLCJwYXJ0MiIsIndpbldpZHRoIiwid2luSGVpZ2h0IiwibGVmdCIsInRvcCIsInRyaWdnZXJCb3VuZHMiLCJzaXplIiwiZ2V0TGVuZ3RoIiwiVHJpZ2dlciIsIkNhbGVuZGFyIiwiSW5wdXRGaWVsZCIsImRlZmF1bHRGb3JtYXRzIiwic2Nyb2xsVG8iLCJkdXJhdGlvbiIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsInBlclRpY2siLCJzZXRTZWxlY3Rpb24iLCJmaWVsZCIsInN0YXJ0IiwiZW5kIiwicmFuZ2UiLCJmb3JjZSIsInNjcm9sbCIsInJlZiIsImxpbmVIZWlnaHQiLCJzZWxlY3RlZCIsImxlbmd0aCIsIkRhdGVQaWNrZXIiLCJUaW1lUGlja2VyIiwicGFnZSIsInBhZ2VTaXplIiwiY3VycmVudFBhZ2VTaXplIiwic2hvd1ByZXYiLCJzaG93TmV4dCIsInRvdGFsIiwiY3VycmVudFBhZ2UiLCJzaG93TGVuZ3RoIiwibnVtUGFnZXMiLCJwYWdlUmFuZ2UiLCJjaGVja2VkIiwiZGlzYWJsZWQiLCJ1bmNoZWNrZWQiLCJtb2RlbFZhbHVlIiwiVHJhbnNpdGlvbkhlaWdodCIsImVuYWJsZWQiLCJzbG90cyIsImNyZWF0ZUVsZW1lbnQiLCJUcmFuc2l0aW9uIiwicHJvcHMiLCJzZXRTdHlsZSIsInN0eWxlIiwiZm9yY2VSZXBhaW50Iiwid2lkdGgiLCJoZWlnaHQiLCJVc2VGb2N1c1RyYXAiLCJkZWZpbmVDb21wb25lbnQiLCJ0cmFwIiwiYWN0aXZhdGUiLCJkZWFjdGl2YXRlIiwidW5yZWZFbGVtZW50IiwiY3JlYXRlRm9jdXNUcmFwIiwib25TY29wZURpc3Bvc2UiLCJoIiwiZGlhbG9nRGF0YSIsIkRvbU1peGluIiwicmVtb3ZlIiwiaGFuZGxlciIsIkRpdG9EaWFsb2ciLCJlcnIiLCJ0aXRsZSIsInRleHQiLCJsb2ciLCJzdHJpcFRhZ3MiLCJub3RpZmljYXRpb25zIiwiZHVyYXRpb25GYWN0b3IiLCJyZWplY3QiLCJkaWFsb2dJZCIsImFkZGl0aW9uYWxDb21wb25lbnRzIiwicmVkaXJlY3RBZnRlckxvZ2luIiwibG9naW5EYXRhIiwidXNlciIsIkRpdG9WaWV3IiwiZnVsbFBhdGgiLCJhZGRSb3V0ZXMiLCJyb3V0ZXIiLCJyZW1vdmVycyIsInJvdXRlIiwicmVtb3ZlUm91dGUiLCJEaXRvU3Bpbm5lciIsImNvbG9yIiwiUHVsbGRvd25NaXhpbiIsInN0YXJ0VGltZSIsIm9wZW4iLCJjb250ZW50IiwiYXNPYmplY3QiLCJJdGVtTWl4aW4iLCJleHRlbmRlZCIsIml0ZW1MYWJlbCIsImZvcm1MYWJlbCIsImdldEZvcm1MYWJlbCIsInByZWZpeCIsInN1ZmZpeCIsImNvbHVtbnMiLCJoYWRMYWJlbCIsInBhbmUiLCJjdXJyZW50VGFiIiwiZmlyc3QiLCJkZWZhdWx0VGFiIiwiZGF0YVBhdGhPck5hbWUiLCJleHBhbmQiLCJjb21wb25lbnRzQnlEYXRhUGF0aCIsImRhdGFQYXRocyIsImNoZWNrIiwidW5tYXRjaGVkIiwiZXJycyIsImZ1bGxEYXRhUGF0aCIsImRhdGFQYXRoUGFydHMiLCJmb3VuZCIsInByb3BlcnR5Iiwic3ViQ29tcG9uZW50cyIsInJlZ2lzdHJ5IiwiZW50cmllc0J5RGF0YVBhdGgiLCJfaG9pc3RlZF8xIiwiX29wZW5CbG9jayIsIl9jcmVhdGVFbGVtZW50QmxvY2siLCJfRnJhZ21lbnQiLCJfcmVuZGVyTGlzdCIsIl9jdHgiLCJfaG9pc3RlZF8yIiwiX2NyZWF0ZUJsb2NrIiwiX2NvbXBvbmVudF9EaXRvQ29udGFpbmVyIiwibmVzdGVkRGF0YVBhdGgiLCJzdG9yZSIsIl9ob2lzdGVkXzMiLCJwYXJzZUZyYWN0aW9uIiwiZGl2aWRlbmQiLCJkaXZpc29yIiwiY29udGFpbmVyQ2xhc3MiLCJiYXNpcyIsImdyb3ciLCJzaHJpbmsiLCJiYXNpc0lzQXV0byIsImhhc1ZOb2RlQ29udGVudCIsInZub2RlIiwiQ29tbWVudCIsImhhc1Nsb3RDb250ZW50Iiwic2xvdCIsInVzZVNsb3RzIiwiYnV0dG9uIiwiY2FwaXRhbGl6ZSIsImNsaXBib2FyZERhdGEiLCJwYXN0ZSIsInJlcG9ydCIsImpzb24iLCJfZCIsIl9jIiwiZGVpbmRlbnQiLCIkc2NoZW1hIiwiX2UiLCJMb2FkaW5nTWl4aW4iLCJ1cGRhdGVSb290IiwidXBkYXRlVmlldyIsIlJlc291cmNlTWl4aW4iLCJhbW91bnQiLCJ2ZXJicyIsImNsZWFyIiwibG9hZGluZ09wdGlvbnMiLCJyZXF1ZXN0Iiwic2V0RGF0YSIsIm9uU3VjY2VzcyIsIm9uRXJyb3IiLCJub3RpZnlTdWNjZXNzIiwibm90aWZ5RXJyb3IiLCJyZXNvbHZlUGF0aCIsImlzQ3JlYXRpbmciLCJwcm92aWRlc0RhdGEiLCJkYXRhUGFydHMiLCJwYXRoUGFydHMiLCJyb3V0ZVBhcnRzIiwibGFzdERhdGFQYXJ0IiwibCIsImRhdGFQYXJ0IiwibWFpblNjaGVtYUNvbXBvbmVudCIsInByZXNlbnQiLCJjbG9zZUZvcm0iLCJnZXRWZXJiIiwiYnV0dG9uUmVzb3VyY2UiLCJzdWNjZXNzIiwiX3Jlc291cmNlIiwiX21ldGhvZCIsIkRpdG9Gb3JtIiwic2NvcGUiLCJQYWdpbmF0aW9uIiwiU29ydGFibGVNaXhpbiIsImZvcmNlRmFsbGJhY2siLCJvbGRJbmRleCIsIm5ld0luZGV4IiwibGlzdCIsInBhZ2luYXRpb25SYW5nZSIsIm9mZnNldCIsIl9ub3JtYWxpemVTdHlsZSIsIl9jYWNoZSIsIl93aXRoTW9kaWZpZXJzIiwiJGV2ZW50IiwiX25vcm1hbGl6ZUNsYXNzIiwiX2NyZWF0ZUVsZW1lbnRWTm9kZSIsIl9ob2lzdGVkXzQiLCJfdG9EaXNwbGF5U3RyaW5nIiwiX2hvaXN0ZWRfNSIsIl9ob2lzdGVkXzciLCJfbWVyZ2VQcm9wcyIsIl93aXRoRGlyZWN0aXZlcyIsIl9ob2lzdGVkXzgiLCJfY29tcG9uZW50X0RpdG9MYWJlbCIsIl9jcmVhdGVWTm9kZSIsIl9jb21wb25lbnRfRGl0b1RhYmxlQ2VsbCIsIl9jb21wb25lbnRfRGl0b0RyYWdnYWJsZSIsIl9jb21wb25lbnRfRGl0b1RyZWVJdGVtIiwiY2hpbGRyZW5TY2hlbWEiLCJjaGlsZHJlbkxpc3QiLCJlZGl0UGF0aCIsImNoaWxkcmVuT3BlbiIsIm51bUNoaWxkcmVuIiwiY3JlYXRhYmxlIiwiZWRpdGFibGUiLCJvcmRlciIsImNvbHVtbiIsInJlbmRlciIsImVzY2FwZUh0bWwiLCJfX2RlZlByb3AiLCJfX2dldE93blByb3BTeW1ib2xzIiwiX19oYXNPd25Qcm9wIiwiX19wcm9wSXNFbnVtIiwiX19kZWZOb3JtYWxQcm9wIiwib2JqIiwiX19zcHJlYWRWYWx1ZXMiLCJwcm9wIiwiX19vYmpSZXN0IiwidXNlU29ydGFibGUiLCJzb3J0YWJsZSIsImRvY3VtZW50IiwiZGVmYXVsdERvY3VtZW50IiwicmVzZXRPcHRpb25zIiwiZGVmYXVsdE9wdGlvbnMiLCJlIiwibW92ZUFycmF5RWxlbWVudCIsIlNvcnRhYmxlIiwic3RvcCIsInRyeU9uTW91bnRlZCIsInRyeU9uU2NvcGVEaXNwb3NlIiwidG9WYWx1ZSIsIm5leHRUaWNrIiwiVXNlU29ydGFibGUiLCJ1c2VWTW9kZWwiLCJEaXRvVk5vZGUiLCJEaXRvVHlwZUNvbXBvbmVudCQxIiwiRGl0b1R5cGVDb21wb25lbnQiLCJvbkNsaWNrIiwiRGF0YU1peGluIiwicmVzb2x2ZUNvdW50ZXIiLCJhc3luY0VudHJ5IiwicmVzb2x2ZWREYXRhIiwibG9hZCIsInRpbWVyIiwiT3B0aW9uc01peGluIiwiY29udmVydFZhbHVlIiwiY29udmVydCIsInNlYXJjaCIsImZpbHRlciIsImRlYm91bmNlIiwiZGVib3VuY2VBc3luYyIsIm9wdGlvbiIsImdyb3VwZWQiLCJyZXN1bHRzIiwiZ3JvdXAiLCJmaW5kT3B0aW9uIiwiZ3JvdXBCeSIsIm9wdGlvblZhbHVlIiwib3B0aW9uTGFiZWwiLCJwcm9jZXNzUmVsYXRlIiwiZmxhc2siLCJDb2RlRmxhc2siLCJjaGFuZ2VkIiwiaWdub3JlV2F0Y2giLCJpZ25vcmVVcGRhdGUiLCJzZXRDb2RlIiwiY29kZSIsInNldFZhbHVlIiwiU2tldGNoUGlja2VyIiwidGlueWNvbG9yIiwiZm9jdXNlZCIsIkRhdGVUaW1lUGlja2VyIiwiU291cmNlTWl4aW4iLCJkZWZhdWx0U29ydCIsImRpcmVjdGlvbiIsImRyYWdnYWJsZSIsImNvbGxhcHNpYmxlIiwibGlzdERhdGEiLCJvbkNvbXBsZXRlIiwib3BlbmVkIiwiY2FsbE9uQ29tcGxldGUiLCJpbmxpbmVkIiwicGFyYW0iLCJtZXRhIiwiZm9ybU1ldGEiLCJjaGlsZFJvdXRlcyIsImdldFBhdGhXaXRoUGFyYW0iLCJzb3VyY2VQYXRoIiwiZm9ybVJvdXRlIiwiZmxhdFJvdXRlcyIsInN1YlJvdXRlcyIsImNoaWxkUm91dGUiLCJmaWx0ZXJDb21wb25lbnRzIiwiZGF0ZUZvcm1hdCIsImNyZWF0ZUZpbHRlcnNQYW5lbCIsImZpbHRlcnMiLCJwcm94eSIsInN0aWNreSIsImZpbHRlclNjaGVtYXMiLCJwYXJzZUZpbHRlcnNEYXRhIiwiY3JlYXRlRmlsdGVyc0NvbXBvbmVudHMiLCJjcmVhdGVGaWx0ZXJzQnV0dG9ucyIsImZvcm1hdEZpbHRlcnNEYXRhIiwic21hbGwiLCJjb21wcyIsImdldENvbXBvbmVudHNGb3JGaWx0ZXIiLCJmaWx0ZXJzRGF0YSIsIl9jb21wb25lbnRfRGl0b1RhYmxlSGVhZCIsIl9jb21wb25lbnRfRGl0b1NjaGVtYUlubGluZWQiLCJfcmVzb2x2ZUR5bmFtaWNDb21wb25lbnQiLCJfY29tcG9uZW50X0RpdG9FZGl0QnV0dG9ucyIsIl9ob2lzdGVkXzkiLCJnZXRMaXN0Q29tcG9uZW50IiwiZmlsdGVyc0RhdGFQYXRoIiwiRWRpdG9yQ29udGVudCIsIkljb24iLCJlZGl0b3IiLCJtYXJrQnV0dG9ucyIsImJhc2ljTm9kZUJ1dHRvbnMiLCJvdGhlck5vZGVCdXR0b25zIiwidG9vbEJ1dHRvbnMiLCJlbmFibGVSdWxlcyIsInNldFZhbHVlRGVib3VuY2VkIiwib25VcGRhdGUiLCJFZGl0b3IiLCJnZXRQb2ludCIsIngiLCJ5IiwicHJldlkiLCJtb3VzZW1vdmUiLCJkaWFsb2dDb21wb25lbnQiLCJnZXRNYXJrQXR0cmlidXRlcyIsImhyZWYiLCJtYXJrcyIsIm5vZGVzIiwidG9vbHMiLCJEb2N1bWVudCIsIlRleHQiLCJQYXJhZ3JhcGgiLCJCb2xkIiwiSXRhbGljIiwiVW5kZXJsaW5lIiwiU3RyaWtlIiwiU21hbGwiLCJDb2RlIiwiTGlua1dpdGhUaXRsZSIsIkJsb2NrcXVvdGUiLCJDb2RlQmxvY2siLCJIYXJkQnJlYWsiLCJIZWFkaW5nIiwiSG9yaXpvbnRhbFJ1bGUiLCJMaXN0SXRlbSIsIkJ1bGxldExpc3QiLCJPcmRlcmVkTGlzdCIsIkhpc3RvcnkiLCJleHRlbnNpb24iLCJzZXR0aW5nc05hbWUiLCJkZXNjcmlwdGlvbnMiLCJhZGRCdXR0b24iLCJpY29uIiwiaWdub3JlQWN0aXZlIiwiZGVzY3JpcHRpb24iLCJzZXR0aW5nTmFtZSIsInVuZGVyc2NvcmUiLCJhdHRyaWJ1dGUiLCJNYXJrIiwiY29tbWFuZHMiLCJMaW5rIiwibm9kZSIsIl9jb21wb25lbnRfVnVlTXVsdGlzZWxlY3QiLCJWdWVNdWx0aXNlbGVjdCIsInBsYWNlaG9sZGVyIiwic2VhcmNoYWJsZSIsInRhZ2dhYmxlIiwidGFnIiwiTnVtYmVyTWl4aW4iLCJTd2l0Y2hCdXR0b24iLCJtYXNrZWRQYXNzd29yZCIsImhhc0VkaXRhYmxlRm9ybXMiLCJmb3JtYXRGaWxlU2l6ZSIsImZpbGVzaXplIiwiVnVlVXBsb2FkIiwiYXNGaWxlcyIsImFjY2VwdCIsIm1heFNpemUiLCJwYXJzZUZpbGVTaXplIiwiZmlsZSIsIm5ld0ZpbGUiLCJvbGRGaWxlIiwieGhyIiwiZmlsZXMiLCJ1cGxvYWQiLCJsb2dnZWREZXByZWNhdGlvbnMiLCJkZXByZWNhdGUiLCJmb3JtYXRRdWVyeSIsInZhbCIsIkRpdG9BZG1pbiIsImRpdG8iLCJ2aWV3cyIsImdldEFwaVVybCIsImlzQXBpVXJsIiwidXNlcnMiLCJwYXJlbnRQYXRoIiwiYXBwIiwiY3JlYXRlQXBwIiwiRGl0b1Jvb3QiLCJWdWVOb3RpZmljYXRpb25zIiwiY3JlYXRlUm91dGVyIiwiY3JlYXRlV2ViSGlzdG9yeSIsIlJlcXVlc3RFcnJvciIsImhlYWRlcnMiLCJpc0Fic29sdXRlVXJsIiwiY29tYmluZVVybHMiLCJiYXNlVXJsIiwicmVsYXRpdmVVcmwiXSwibWFwcGluZ3MiOiJvcEdBRUEsTUFBQUEsR0FBZUMsV0FBUyxDQUN0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
5
+ `))}const{$schema:o,...s}=t||{};return o===((d=this.schemaComponent)==null?void 0:d.schema.name)?s:null},async checkClipboard(){this.copyEnabled=!!this.data,this.pasteEnabled=!!await this.getClipboardData(!1)},async onCopy(){var t,o,s;let e=(t=this.schemaComponent)==null?void 0:t.clipboardData;try{e=e&&this.copyData(e),this.appState.clipboardData=e;try{const a=JSON.stringify(e,null,2);await((s=(o=navigator.clipboard)==null?void 0:o.writeText)==null?void 0:s.call(o,a)),await this.checkClipboard()}catch(a){console.error(a,a.name,a.message)}}catch(a){console.error(a),alert(a.message)}},async onPaste(){let e=await this.getClipboardData(!0);try{e=e&&this.pasteData(e),e&&this.schemaComponent.setData(e)}catch(t){console.error(t),alert(t.message)}}}}),za=b(Ia,[["render",qa]]),Nt={data(){return{isLoading:!1}},methods:{setLoading(e,{updateRoot:t=!1,updateView:o=!1}={}){!this.isLoading^!e&&(this.isLoading=!!e,t&&this.rootComponent.registerLoading(e),o&&this.viewComponent.setLoading(this.isLoading))}}},Ot={mixins:[Ne,Nt],provide(){return{$resourceComponent:()=>this,$verbs:()=>this.verbs,$isPopulated:()=>this.hasData}},data(){return{loadedData:null}},computed:{resourceComponent(){return this},resource(){return this.getResource()},providesData(){return!!this.resource},linksToView(){return!1},isTransient(){const e=this.formComponent;return!this.providesData&&!this.linksToView||e&&(e.isTransient||e.isCreating)},transientNote(){return this.isTransient&&"<b>Note</b>: the parent still needs to be saved in order to persist this change."},shouldLoad(){return!this.isTransient&&!this.isLoading},hasData(){return!!this.loadedData},verbs(){return this.getVerbs()},paginationRange(){const{paginate:e}=this.sourceSchema;if(this.isListSource&&e){const{page:t=0}=this.query||{},o=t*e;return[o,o+e-1]}return null},queryParams(){const e=this.paginationRange,{page:t,...o}=this.query||{};return{...o,...e&&{range:e.join(",")}}}},created(){(this.providesData||this.isCreating)&&this.setupData()},methods:{getResource(){var e,t;return T((e=this.sourceSchema)==null?void 0:e.resource,{type:"collection",parent:((t=this.parentFormComponent)==null?void 0:t.resource)??null})},getVerbs(){const e=this.$verbs();return this.isTransient?{...e,create:"add",created:"added",save:"apply",saved:"applied",delete:"remove",deleted:"removed"}:e},clearData(){this.loadedData=null},setData(e){this.loadedData=e},setupData(){this.ensureData()},ensureData(){this.shouldLoad&&(this.hasData?this.reloadData():this.loadData(!0))},reloadData(){this.loadData(!1)},loadData(e){this.isTransient||(e&&this.clearData(),this.requestData())},createData(e,t){return st(e,t?{type:t}:{},this)},requestData(){const e=this.queryParams;this.handleRequest({method:"get",query:e},(t,o)=>{var s;if(t){if(o){const{data:a}=o;if((a==null?void 0:a.type)==="FilterValidation"&&((s=this.onFilterErrors)!=null&&s.call(this,a.errors)))return!0;if(this.isUnauthorizedError(o))return!0}}else this.setData(o.data),this.emitSchemaEvent("load")})},isValidationError(e){return(e==null?void 0:e.status)===400},isUnauthorizedError(e){return(e==null?void 0:e.status)===401},async handleRequest({method:e,resource:t=this.resource,query:o,data:s},a){const i={updateRoot:!0,updateView:this.isInView};this.setLoading(!0,i);const r={method:e,resource:t,data:s,query:o};try{const l=await this.sendRequest(r);a(null,l)}catch(l){const{response:d}=l;if(!a(l,d)){const h=d==null?void 0:d.data,u=c.isString(h==null?void 0:h.type)?c.labelize(h.type):"Error",p=(h==null?void 0:h.message)??l;this.notify({type:"error",title:u,text:p})}}this.setLoading(!1,i)},getPayloadData(e,t){return["post","put","patch"].includes(t)&&(e.getSchemaValue(["resource","data"])||e.processedItem)},async submit(e){const t=T(e.schema.resource,{parent:this.resource});if(t){const{method:o}=t,s=this.getPayloadData(e,o);return this.submitResource(e,t,o,s)}return!1},async submitResource(e,t,o,s,{setData:a=!1,onSuccess:i,onError:r,notifySuccess:l=()=>this.notify({type:"success",title:"Request Successful",text:"Request was successfully sent."}),notifyError:d=h=>this.notify({type:"error",title:"Request Error",text:[`Unable to send request${h?":":""}`,(h==null?void 0:h.message)||h]})}={}){return new Promise(h=>{this.handleRequest({method:o,resource:t,data:s},async(u,p)=>{const g=p==null?void 0:p.data;if(u){const f=this.isValidationError(p)&&g.errors;if(f)await this.showValidationErrors(f,!0);else{const m=c.isObject(g)?g:u;r==null||r(m),await this.emitButtonEvent(e,"error",{notify:d,error:m})}h(!1)}else a&&g&&this.setData(g),i==null||i(),await this.emitButtonEvent(e,"success",{notify:l}),h(!0)})})},async emitButtonEvent(e,t,{notify:o,error:s}){const a=new V(e,{nested:!1,data:this.data,itemLabel:this.itemLabel,error:s}),i=await e.emitEvent(t,{context:a});return o&&i===void 0&&!a.wasNotified&&o(s),i}}};function Aa(e){return new URL(`file:${e}`).pathname}const Ua=["data-resource"],Ha={type:"submit",disabled:""};function Wa(e,t,o,s,a,i){const r=n.resolveComponent("RouterView"),l=n.resolveComponent("DitoButtons"),d=n.resolveComponent("DitoSchema");return n.openBlock(),n.createElementBlock("div",{class:n.normalizeClass(["dito-form dito-scroll-parent",{"dito-form-nested":e.isNestedRoute}]),"data-resource":e.sourceSchema.path},[e.isLastUnnestedRoute||e.isNestedRoute?n.createCommentVNode("",!0):n.withDirectives((n.openBlock(),n.createBlock(r,{key:0},null,512)),[[n.vShow,!e.isActive]]),n.withDirectives((n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.isNestedRoute?"div":"form"),{class:"dito-scroll",onSubmit:t[0]||(t[0]=n.withModifiers(()=>{},["prevent"]))},{default:n.withCtx(()=>[n.createVNode(d,{schema:e.schema,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,disabled:e.isLoading,menuHeader:!0},{buttons:n.withCtx(()=>[n.createVNode(l,{class:"dito-buttons-round dito-buttons-main dito-buttons-large",buttons:e.buttonSchemas,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,disabled:e.isLoading},null,8,["buttons","dataPath","data","meta","store","disabled"])]),_:1},8,["schema","dataPath","data","meta","store","disabled"]),n.withDirectives(n.createElementVNode("button",Ha,null,512),[[n.vShow,!1]])]),_:1},544)),[[n.vShow,e.isActive]])],10,Ua)}const Ka=C.component("DitoForm",{mixins:[ft,Ot],data(){return{createdData:null,clonedData:void 0,sourceKey:null,isForm:!0}},computed:{verbs(){const e=this.getVerbs(),{isCreating:t,providesData:o}=this;return{...e,submit:t?e.create:e.save,submitted:t?e.created:e.saved,cancel:o?e.cancel:e.close,cancelled:o?e.cancelled:e.closed}},schema(){return this.getItemFormSchema(this.sourceSchema,this.data||{type:this.type},this.context)||{}},buttonSchemas(){return G(c.merge({cancel:{type:"button",events:{click:()=>this.cancel()}},submit:!this.isMutating&&{type:"submit",closeForm:!0,events:{click:({component:e})=>e.submit()}}},this.schema.buttons))},isActive(){return this.isLastRoute||this.isLastUnnestedRoute},isTransient(){return!this.providesData},isCreating(){return this.param==="create"},isDirty(){var e;return!this.isMutating&&!!((e=this.mainSchemaComponent)!=null&&e.isDirty)},isMutating(){return!!this.sourceSchema.mutate},selectedTab(){var e;return((e=this.mainSchemaComponent)==null?void 0:e.selectedTab)||null},type(){return this.$route.query.type},itemId(){return this.isCreating?null:this.param??null},method(){return this.isCreating?"post":"patch"},resource(){const e=this.getResource();return Ce(this.itemId,e)||e},breadcrumbPrefix(){return c.capitalize(this.isCreating?this.verbs.create:this.verbs.edit)},data(){return this.createdData||this.loadedData||this.inheritedData||null},dataPath(){return this.getDataPathFrom(this.dataComponent)},sourceData(){let e=this.routeRecord?this.parentRouteComponent.data:null;if(e){const t=c.parseDataPath(this.getDataPathFrom(this.parentRouteComponent)),o=this.routeRecord.path.split("/"),s=o.slice(o.length-t.length);this.sourceKey=null;const a=t[t.length-1];X(this.sourceSchema)&&a==="create"&&t.length--;for(let i=0,r=t.length;i<r&&e;i++){const l=t[i],d=/^:id/.test(s[i])?l==="create"?null:this.findItemIdIndex(this.sourceSchema,e,l):l;i===r-1?this.sourceKey=d:e=e[d]}}return e},inheritedData(){if(this.isTransient&&this.clonedData===void 0&&this.sourceData&&this.sourceKey!==null){let e=this.sourceData[this.sourceKey];return this.isMutating||(this.clonedData=e=c.clone(e)),e===null&&!this.isCreating&&X(this.sourceSchema)&&this.$router.push({path:`${this.path}/create`}),e}return this.clonedData},hasData(){return!!this.data},itemLabel(){return this.getItemLabel(this.sourceSchema,this.data,{extended:!0})}},watch:{sourceData:"clearClonedData",create:"setupData"},methods:{emitSchemaEvent(e,t){return this.mainSchemaComponent.emitEvent(e,t)},getDataPathFrom(e){return this.api.denormalizePath(this.path.slice((e.isView?0:e.path.length)+1))},setupData(){this.isCreating?this.createdData||(this.createdData=this.createData(this.schema,this.type)):this.ensureData()},setSourceData(e){if(this.sourceData&&this.sourceKey!==null){const{mainSchemaComponent:t}=this;return this.sourceData[this.sourceKey]=t.filterData(e),t.onChange(),!0}return!1},addSourceData(e){var t;return X(this.sourceSchema)?this.setSourceData(e):!!((t=this.sourceData)!=null&&t.push(e))},clearData(){this.setData(null)},setData(e){this.isTransient?this.setSourceData(e):(this.createdData=null,this.loadedData=e)},clearClonedData(e,t){e!==t&&(this.clonedData=void 0)},async cancel(){return this.close()},async close(){return this.navigate(this.parentRouteComponent.path)},getSubmitVerb(e=!0){return this.isCreating?e?"create":"created":e?"submit":"submitted"},async submit(e,{validate:t=!0,closeForm:o=!1}={}){if(t&&!this.validateAll())return!1;const s=h=>this.verbs[this.getSubmitVerb(h)],a=T(e.schema.resource,{parent:this.resource}),i=a||this.resource,r=(i==null?void 0:i.method)||this.method,l=this.getPayloadData(e,r);let d;if(!a&&this.isTransient?d=await this.submitTransient(e,i,r,l,{onSuccess:()=>this.emitSchemaEvent(this.getSubmitVerb()),onError:h=>this.emitSchemaEvent("error",{context:{error:h}}),notifySuccess:()=>{const h=s(!1);this.notify({type:"info",title:this.isCreating?`Item ${c.capitalize(h)}`:`Change ${c.capitalize(h)}`,text:[this.isCreating?`${this.itemLabel} was ${h}.`:`Changes to ${this.itemLabel} were ${h}.`,this.transientNote]})},notifyError:()=>{const h=s(!0);this.notify({type:"error",title:"Request Error",text:`Unable to ${h} ${this.itemLabel}.`})}}):d=await this.submitResource(e,i,r,l,{setData:!0,onSuccess:()=>this.emitSchemaEvent(this.getSubmitVerb()),onError:h=>this.emitSchemaEvent("error",{context:{error:h}}),notifySuccess:()=>{const h=s(!1);this.notify({type:"success",title:`Successfully ${c.capitalize(h)}`,text:`${this.itemLabel} was ${h}.`})},notifyError:h=>{const u=s(!0);this.notify({type:"error",title:"Request Error",text:[`Unable to ${u} ${this.itemLabel}${h?":":""}`,(h==null?void 0:h.message)||h]})}}),d){if(this.resetValidation(),o||e.closeForm)this.close();else if(this.isCreating){const h=this.getItemId(this.schema,this.data);this.$router.replace({path:Aa(`${this.path}/../${h}`)})}}return d},async submitTransient(e,t,o,s,{onSuccess:a,onError:i,notifySuccess:r,notifyError:l}){const d=this.isCreating?this.addSourceData(s):this.setSourceData(s);if(d)a==null||a(),await this.emitButtonEvent(e,"success",{notify:r});else{const h="Could not submit transient item";i==null||i(h),await this.emitButtonEvent(e,"error",{notify:l,error:h})}return d}}}),Ft=b(Ka,[["render",Wa]]),Oc="",Ya=C.component("DitoFormNested",{extends:Ft}),Ja={key:0,class:"dito-errors"};function Qa(e,t,o,s,a,i){return e.errors?(n.openBlock(),n.createElementBlock("div",Ja,[n.createElementVNode("ul",null,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.errors,r=>(n.openBlock(),n.createElementBlock("li",null,n.toDisplayString(r),1))),256))])])):n.createCommentVNode("",!0)}const Fc="",Ga=C.component("DitoErrors",{props:{errors:{type:Array,default:null}}}),Xa=b(Ga,[["render",Qa]]),Za={class:"dito-scopes"},va=["title","onClick"];function xa(e,t,o,s,a,i){const r=n.resolveComponent("RouterLink");return n.openBlock(),n.createElementBlock("div",Za,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.scopes,(l,d)=>(n.openBlock(),n.createBlock(r,{key:d,to:e.getScopeLink(l),custom:""},{default:n.withCtx(({navigate:h})=>[n.createElementVNode("button",{class:n.normalizeClass(["dito-button",{"dito-selected":l.name===e.query.scope}]),type:"button",title:l.hint||e.getLabel(l),onClick:h},n.toDisplayString(e.getLabel(l)),11,va)]),_:2},1032,["to"]))),128))])}const Lc="",er=C.component("DitoScopes",{props:{query:{type:Object,required:!0},scopes:{type:Object,required:!0}},methods:{getScopeLink(e){const t={...this.query,scope:e.name};return t.page&&(t.page=0),this.getQueryLink(t)}}}),tr=b(er,[["render",xa]]);function nr(e,t,o,s,a,i){const r=n.resolveComponent("Pagination");return n.openBlock(),n.createBlock(r,{page:e.page,"onUpdate:page":t[0]||(t[0]=l=>e.page=l),pageSize:e.limit,total:e.total},null,8,["page","pageSize","total"])}const or=C.component("DitoPagination",{components:{Pagination:ts},props:{query:{type:Object,required:!0},limit:{type:Number,required:!0},total:{type:Number,required:!0}},computed:{page:{get(){return(+this.query.page||0)+1},set(e){this.page!==e&&this.$router.push(this.getQueryLink({...this.query,page:e-1}))}}}}),sr=b(or,[["render",nr]]),Oe={mixins:[Ne],data(){return{dragging:!1}},methods:{getSortableOptions(e=!1){return{animation:150,handle:".dito-button-drag",dragClass:"dito-sortable-active",chosenClass:"dito-sortable-chosen",ghostClass:"dito-sortable-ghost",fallbackClass:"dito-sortable-fallback",forceFallback:e,onStart:this.onStartDrag,onEnd:this.onEndDrag}},onStartDrag(){this.dragging=!0},onEndDrag({oldIndex:e,newIndex:t}){this.dragging=!1,e!==t&&this.onChange()},updateOrder(e,t,o){const{orderKey:s}=e;if(s){const a=(o==null?void 0:o[0])||0;for(let i=0;i<t.length;i++)t[i][s]=i+a}return t}}},ar=["id"],rr={key:0,class:"dito-tree-header"},ir=["innerHTML"],lr={key:1,class:"dito-tree-info"},dr={key:1,class:"dito-tree-leaf"},cr=["innerHTML"],hr={key:2,class:"dito-buttons dito-buttons-small"},ur={key:1,class:"dito-properties"};function pr(e,t,o,s,a,i){const r=n.resolveComponent("DitoLabel"),l=n.resolveComponent("DitoTableCell"),d=n.resolveComponent("DitoTreeItem",!0),h=n.resolveComponent("DitoDraggable");return n.openBlock(),n.createElementBlock("div",{class:n.normalizeClass(["dito-tree-item",{"dito-dragging":e.dragging,"dito-active":e.active}]),id:e.dataPath,style:n.normalizeStyle(e.level>0&&{"--level":e.level})},[e.label?(n.openBlock(),n.createElementBlock("div",rr,[e.numEntries?(n.openBlock(),n.createElementBlock("div",{key:0,class:"dito-tree-branch",onClick:t[0]||(t[0]=n.withModifiers(u=>e.opened=!e.opened,["stop"]))},[e.numEntries?(n.openBlock(),n.createElementBlock("div",{key:0,class:n.normalizeClass(["dito-chevron",{"dito-opened":e.opened}])},null,2)):n.createCommentVNode("",!0),n.createElementVNode("div",{class:"dito-tree-label",innerHTML:e.label},null,8,ir),e.details?(n.openBlock(),n.createElementBlock("div",lr,n.toDisplayString(e.details),1)):n.createCommentVNode("",!0)])):(n.openBlock(),n.createElementBlock("div",dr,[n.createElementVNode("div",{class:"dito-tree-label",innerHTML:e.label},null,8,cr)])),e.hasEditButtons?(n.openBlock(),n.createElementBlock("div",hr,[e.draggable?(n.openBlock(),n.createElementBlock("a",n.mergeProps({key:0,class:"dito-button"},e.getButtonAttributes(e.verbs.drag)),null,16)):n.createCommentVNode("",!0),e.editable?(n.openBlock(),n.createElementBlock("button",n.mergeProps({key:1,class:"dito-button",type:"button"},e.getButtonAttributes(e.verbs.edit),{onClick:t[1]||(t[1]=(...u)=>e.onEdit&&e.onEdit(...u))}),null,16)):n.createCommentVNode("",!0),e.deletable?(n.openBlock(),n.createElementBlock("button",n.mergeProps({key:2,class:"dito-button",type:"button"},e.getButtonAttributes(e.verbs.delete),{onClick:t[2]||(t[2]=(...u)=>e.onDelete&&e.onDelete(...u))}),null,16)):n.createCommentVNode("",!0)])):n.createCommentVNode("",!0)])):n.createCommentVNode("",!0),e.properties?n.withDirectives((n.openBlock(),n.createElementBlock("table",ur,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.properties,u=>(n.openBlock(),n.createElementBlock("tr",null,[n.createElementVNode("td",null,[u.label!==!1?(n.openBlock(),n.createBlock(r,{key:0,dataPath:e.getPropertyDataPath(u),label:e.getLabel(u)},null,8,["dataPath","label"])):n.createCommentVNode("",!0)]),n.createVNode(l,{cell:u,schema:u,dataPath:e.getPropertyDataPath(u),data:e.data,meta:e.nestedMeta,store:e.store,disabled:e.disabled},null,8,["cell","schema","dataPath","data","meta","store","disabled"])]))),256))],512)),[[n.vShow,e.opened]]):n.createCommentVNode("",!0),e.childrenSchema?n.withDirectives((n.openBlock(),n.createBlock(h,{key:2,modelValue:e.updateOrder(e.childrenSchema,e.childrenList),options:e.getSortableOptions(!0),draggable:e.childrenDraggable,"onUpdate:modelValue":t[3]||(t[3]=u=>e.childrenList=u)},{default:n.withCtx(()=>[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.childrenItems,(u,p)=>(n.openBlock(),n.createBlock(d,{key:e.getItemUid(e.childrenSchema,u.data),schema:e.childrenSchema,dataPath:e.getItemDataPath(e.childrenSchema,p),data:u.data,path:u.path,open:u.open,active:u.active,draggable:e.childrenDraggable,label:e.getItemLabel(e.childrenSchema,u.data,{index:p}),level:e.level+1},null,8,["schema","dataPath","data","path","open","active","draggable","label","level"]))),128))]),_:1},8,["modelValue","options","draggable"])),[[n.vShow,e.opened]]):n.createCommentVNode("",!0)],14,ar)}const Tc="",mr=C.component("DitoTreeItem",{mixins:[Oe],inject:["container"],props:{schema:{type:Object,required:!0},dataPath:{type:String,required:!0},data:{type:[Array,Object],default:null},path:{type:String,default:""},open:{type:Boolean,default:!1},active:{type:Boolean,default:!1},draggable:{type:Boolean,default:!1},label:{type:String,default:null},level:{type:Number,default:0}},data(){return{opened:this.open||this.schema.open}},computed:{meta(){return this.container.meta},store(){return this.container.store},disabled(){return this.container.disabled},nestedMeta(){return{...this.meta,schema:this.schema}},properties(){return W(this.schema.properties)},childrenSchema(){return this.schema.children},childrenList(){var t;const e=(t=this.childrenSchema)==null?void 0:t.name;return e&&this.data[e]},childrenDraggable(){var e;return((e=this.childrenList)==null?void 0:e.length)>1&&this.getSchemaValue("draggable",{type:Boolean,default:!1,schema:this.childrenSchema})},numChildren(){var e;return((e=this.childrenList)==null?void 0:e.length)||0},numProperties(){var e;return((e=this.properties)==null?void 0:e.length)||0},numEntries(){return this.numProperties+this.numChildren},childrenItems(){const{childrenSchema:e,childrenList:t}=this;if(e&&t){const{editPath:o}=this.container,s=!this.path&&e.open;return this.updateOrder(e,t.map((a,i)=>{const r=e.path&&`${this.path}/${e.path}/${i}`,l=s||o.startsWith(r)&&r.length<o.length;return{data:a,path:r,open:l,active:o===r}}))}return[]},details(){const{numChildren:e}=this;return e&&`${e} ${e===1?"item":"items"}`},hasEditButtons(){return this.draggable||this.editable||this.deletable},creatable:y("creatable",{type:Boolean,default:!1,get(e){return e&&I(this.schema)}}),editable:y("editable",{type:Boolean,default:!1,get(e){return e&&I(this.schema)}}),deletable:y("deletable",{type:Boolean,default:!1})},methods:{getPropertyDataPath(e){return F(this.dataPath,e.name)},onEdit(){this.$router.push({path:`${this.container.path}${this.path}`,query:this.$route.query})},onDelete(){},onChange(){this.container.onChange()}}}),fr=b(mr,[["render",pr]]),gr={class:"dito-table-head"},br=["onClick"],yr=n.createElementVNode("div",{class:"dito-order-arrows"},null,-1),kr={key:1},Cr={key:0},$r=[n.createElementVNode("span",null,null,-1)];function Br(e,t,o,s,a,i){const r=n.resolveComponent("RouterLink");return n.openBlock(),n.createElementBlock("thead",gr,[n.createElementVNode("tr",null,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.columns,l=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[e.shouldRender(l)?(n.openBlock(),n.createElementBlock("th",{key:0,class:n.normalizeClass(e.getColumnClass(l))},[l.sortable?(n.openBlock(),n.createBlock(r,{key:0,to:e.getSortLink(l),custom:""},{default:n.withCtx(({navigate:d})=>[n.createElementVNode("button",{class:n.normalizeClass(["dito-button",e.getSortClass(l)]),type:"button",onClick:d},[yr,n.createElementVNode("span",null,n.toDisplayString(e.getLabel(l)),1)],10,br)]),_:2},1032,["to"])):(n.openBlock(),n.createElementBlock("span",kr,n.toDisplayString(e.getLabel(l)),1))],2)):n.createCommentVNode("",!0)],64))),256)),e.hasEditButtons?(n.openBlock(),n.createElementBlock("th",Cr,$r)):n.createCommentVNode("",!0)])])}const _c="",Dr=C.component("DitoTableHead",{props:{query:{type:Object,required:!0},columns:{type:Object,required:!0},hasEditButtons:{type:Boolean,required:!0}},computed:{sort(){const e=(this.query.order||"").split(/\s+/);return{name:e[0],order:e[1]}}},methods:{getColumnClass(e){return`dito-column-${c.hyphenate(e.name)}`},getSortClass(e){return this.sort.name===e.name?`dito-selected dito-order-${this.sort.order}`:null},getSortLink(e){const t=this.sort.name===e.name&&this.sort.order==="asc"?"desc":"asc";return this.getQueryLink({...this.query,order:`${e.name} ${t}`})}}}),wr=b(Dr,[["render",Br]]),Vr=["innerHTML"];function Sr(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("td",{class:n.normalizeClass(e.cell.class),style:n.normalizeStyle(e.cell.style)},[e.cell.component?(n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.cell.component),{key:0,schema:e.schema,dataPath:e.dataPath,data:e.data,meta:e.meta,store:e.store,nested:e.nested,disabled:e.disabled},null,8,["schema","dataPath","data","meta","store","nested","disabled"])):(n.openBlock(),n.createElementBlock("span",{key:1,innerHTML:e.renderCell(e.data)},null,8,Vr))],6)}const Pr=C.component("DitoTableCell",{props:{cell:{type:Object,required:!0},schema:{type:Object,required:!0},dataPath:{type:String,required:!0},data:{type:Object,required:!0},meta:{type:Object,required:!0},store:{type:Object,required:!0},nested:{type:Boolean,default:!0},disabled:{type:Boolean,default:!1}},methods:{renderCell(e){const{name:t,render:o}=this.cell,s=e[t];return o?o.call(this,new V(this,{name:t,value:s,data:e,dataPath:F(this.dataPath,t)})):c.escapeHtml(s)}}}),Er=b(Pr,[["render",Sr]]);var Nr=Object.defineProperty,he=Object.getOwnPropertySymbols,Lt=Object.prototype.hasOwnProperty,Tt=Object.prototype.propertyIsEnumerable,jt=(e,t,o)=>t in e?Nr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:o}):e[t]=o,_t=(e,t)=>{for(var o in t||(t={}))Lt.call(t,o)&&jt(e,o,t[o]);if(he)for(var o of he(t))Tt.call(t,o)&&jt(e,o,t[o]);return e},Or=(e,t)=>{var o={};for(var s in e)Lt.call(e,s)&&t.indexOf(s)<0&&(o[s]=e[s]);if(e!=null&&he)for(var s of he(e))t.indexOf(s)<0&&Tt.call(e,s)&&(o[s]=e[s]);return o};function Fr(e,t,o={}){let s;const a=o,{document:i=q.defaultDocument}=a,r=Or(a,["document"]),l={onUpdate:u=>{Lr(t,u.oldIndex,u.newIndex)}},d=()=>{const u=typeof e=="string"?i==null?void 0:i.querySelector(e):q.unrefElement(e);u&&(s=new Kt(u,_t(_t({},l),r)))},h=()=>s==null?void 0:s.destroy();return q.tryOnMounted(d),q.tryOnScopeDispose(h),{stop:h,start:d}}function Lr(e,t,o){const s=q.toValue(e);if(o>=0&&o<s.length){const a=s.splice(t,1)[0];L.nextTick(()=>s.splice(o,0,a))}}const Tr=L.defineComponent({name:"UseSortable",model:{prop:"modelValue",event:"update:modelValue"},props:{modelValue:{type:Array,required:!0},tag:{type:String,default:"div"},options:{type:Object,required:!0}},setup(e,{slots:t}){const o=q.useVModel(e,"modelValue"),s=L.ref(),a=L.reactive(Fr(s,o,e.options));return()=>{if(t.default)return L.h(e.tag,{ref:s},t.default(a))}}});function jr(e,t,o,s,a,i){const r=n.resolveComponent("UseSortable");return e.draggable?(n.openBlock(),n.createBlock(r,{key:0,tag:e.tag,modelValue:e.modelValue,options:e.options,"onUpdate:modelValue":t[0]||(t[0]=l=>e.$emit("update:modelValue",l))},{default:n.withCtx(()=>[n.renderSlot(e.$slots,"default")]),_:3},8,["tag","modelValue","options"])):(n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.tag),{key:1},{default:n.withCtx(()=>[n.renderSlot(e.$slots,"default")]),_:3}))}const _r=C.component("DitoDraggable",{components:{UseSortable:Tr},emits:["update:modelValue"],props:{modelValue:{type:Array,required:!0},tag:{type:String,default:"div"},options:{type:Object,required:!0},draggable:{type:Boolean,default:!0}}}),Mr=b(_r,[["render",jr]]);function Mt({vnode:e}){return e}Mt.props={vnode:{type:Object,required:!0}};const Rr=C.component("DitoVnode",Mt),qr=Object.freeze(Object.defineProperty({__proto__:null,DitoAccount:Rs,DitoButtons:wa,DitoClipboard:za,DitoContainer:ia,DitoCreateButton:ja,DitoDialog:wt,DitoDraggable:Mr,DitoEditButtons:Pa,DitoElement:zs,DitoErrors:Xa,DitoForm:Ft,DitoFormNested:Ya,DitoHeader:Ls,DitoLabel:Ws,DitoMenu:Vs,DitoPagination:sr,DitoPane:oa,DitoPanel:ma,DitoPanels:ya,DitoRoot:Ee,DitoSchema:Qs,DitoSchemaInlined:Zs,DitoScopes:tr,DitoTableCell:Er,DitoTableHead:wr,DitoTabs:ha,DitoTreeItem:fr,DitoVNode:Rr,DitoView:gt},Symbol.toStringTag,{value:"Module"})),D={extends:C,mixins:[J],nativeField:!1,textField:!1,defaultValue:null,defaultNested:!0,defaultVisible:!0,generateLabel:!0,excludeValue:!1,ignoreMissingValue:null,alignBottom:!0,omitPadding:!1,component:C.component,get:ne,register(e,t={}){e=c.asArray(e);const o=this.component(`DitoType${c.camelize(e[0],!0)}`,t);for(const s of e)_n(s,o);return o}},Ir=["id","type","title"];function zr(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("button",n.mergeProps({class:["dito-button",e.buttonClass],id:e.dataPath,ref:"element",type:e.type,title:e.title},e.attributes),n.toDisplayString(e.text),17,Ir)}const Ar=D.register(["button","submit"],{defaultValue:()=>{},excludeValue:!0,generateLabel:!1,defaultWidth:"auto",computed:{verb(){return this.verbs[this.name]},buttonClass(){return this.verb?`dito-button-${this.verb}`:null},text:y("text",{type:String}),title(){return this.text||c.labelize(this.verb)},closeForm:y("closeForm",{type:Boolean,default:!1})},methods:{getEvents(){const{onFocus:e,onBlur:t,onClick:o}=this;return{onFocus:e,onBlur:t,onClick:o}},async submit(e){var t;return(t=this.resourceComponent)==null?void 0:t.submit(this,e)},async onClick(){await this.emitEvent("click",{parent:this.schemaComponent})===void 0&&Ie(this.schema)&&await this.submit()}}}),Ur=b(Ar,[["render",zr]]),Hr=["id"];function Wr(e,t,o,s,a,i){return n.withDirectives((n.openBlock(),n.createElementBlock("input",n.mergeProps({class:"dito-checkbox",id:e.dataPath,ref:"element","onUpdate:modelValue":t[0]||(t[0]=r=>e.value=r),type:"checkbox"},e.attributes),null,16,Hr)),[[n.vModelCheckbox,e.value]])}const Mc="",Kr=D.register("checkbox",{nativeField:!0}),Yr=b(Kr,[["render",Wr]]),Rt={mixins:[Nt],data(){return{isLoading:!1,asyncDataEntries:{}}},methods:{handleDataSchema(e,t,{resolveCounter:o=1,...s}={}){var l,d;c.isObject(e)||(e={data:e});let{data:a=void 0,dataPath:i=null}=e;const r=(l=this.asyncDataEntries)[t]||(l[t]=n.reactive({dependencyFunction:null,resolveCounter:0,resolvedData:null,resolving:!1}));if((d=r.dependencyFunction)==null||d.call(r,this.context),r.resolveCounter>0){const{resolvedData:h}=r;return--r.resolveCounter===0&&(r.resolvedData=null),h}if(r.resolving)a=null;else if(a){if(c.isFunction(a)){const h=a(this.context);c.isFunction(h)?(r.dependencyFunction=a,a=h(this.context)):a=h}c.isPromise(a)&&(r.resolving=!0,this.resolveData(a,s).then(h=>{r.resolveCounter=o,r.resolvedData=h,r.resolving=!1}),a=null)}else i&&(a=c.getValueAtDataPath(this.rootData,c.normalizeDataPath(`${this.dataPath}/${i}`)));return a},async resolveData(e,t={}){const o=setTimeout(()=>this.setLoading(!0,t),0);let s=null;try{s=await(c.isFunction(e)?e():e)}catch(a){this.addError(a.message||a)}return clearTimeout(o),this.setLoading(!1,t),s}}},ue={mixins:[Rt],data(){return{hasOptions:!1}},computed:{selectedValue:{get(){const e=o=>this.relate?this.hasOption(o)?this.getValueForOption(o):null:o,t=c.isArray(this.value)?this.value.map(e).filter(o=>o!==null):e(this.value);return this.relate&&this.hasOptions&&(t===null&&this.value!==null||Dn(this.value))&&(this.selectedValue=t),t},set(e){const t=o=>this.relate?this.getOptionForValue(o):o;this.value=c.isArray(e)?e.map(t):t(e)}},selectedOption(){return this.getOptionForValue(this.selectedValue)},options(){const e=this.handleDataSchema(this.schema.options,"options",{resolveCounter:1})??[];if(!c.isArray(e))throw new Error(`Invalid options data, should be array: ${e}`);return this.hasOptions=e.length>0,this.processOptions(e)},activeOptions(){return this.options},relate:y("relate",{type:Boolean,default:!1,callback:!1}),groupBy:y("groupBy",{type:String,default:null}),optionLabel:y("options.label",{type:[String,Function],default:null,get(e){return e||this.getOptionKey("label")||null}}),optionValue:y("options.value",{type:[String,Function],default:null,get(e){return e||this.relate&&"id"||this.getOptionKey("value")||null}}),searchFilter:y("search",{type:[Object,Function],default:null,get(e){if(e){const{filter:t,debounce:o}=c.isFunction(e)?{filter:e}:e;return o?c.debounceAsync(t,o):t}}}),groupByLabel(){return this.groupBy?"label":null},groupByOptions(){return this.groupBy?"options":null}},methods:{getOptionKey(e){const[t]=this.activeOptions;return c.isObject(t)&&e in t?e:null},processOptions(e){if(e.length){if(this.relate)for(const t of e)"id"in t||Bn(t,"id");if(this.groupBy){const t={};e=e.reduce((o,s)=>{const a=s[this.groupBy];let i=t[a];return i||(i=t[a]={[this.groupByLabel]:a,[this.groupByOptions]:[]},o.push(i)),i.options.push(s),o},[])}}return e},hasOption(e){return!!this.getOptionForValue(this.getValueForOption(e))},getOptionForValue(e){const t=(o,s,a)=>{for(const i of o)if(a){const r=t(i.options,s,null);if(r)return r}else if(s===this.getValueForOption(i))return i};return this.optionValue?t(this.activeOptions,e,this.groupBy):e},getValueForOption(e){const{optionValue:t}=this;return c.isString(t)?e==null?void 0:e[t]:c.isFunction(t)?t.call(this,new V(this,{option:e})):e},getLabelForOption(e){const{optionLabel:t}=this;return c.isString(t)?e==null?void 0:e[t]:c.isFunction(t)?t.call(this,new V(this,{option:e})):c.labelize(`${e}`)}},processValue(e,t,o,s){var a;if(e.relate){const i=(a=e.options)==null?void 0:a.dataPath,r=i?c.normalizeDataPath(`${o}/${i}`):null;s.addRelation(o,r,e),r&&s.setSourceRelated(r);const l=d=>d&&{id:d.id};t=c.isArray(t)?t.map(l):l(t)}return t}},Jr=["id"],Qr=["value"];function Gr(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("ul",{class:n.normalizeClass(["dito-checkboxes",`dito-layout-${e.schema.layout||"vertical"}`]),id:e.dataPath},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.options,r=>(n.openBlock(),n.createElementBlock("li",null,[n.createElementVNode("label",null,[n.withDirectives(n.createElementVNode("input",n.mergeProps({class:"dito-checkbox",ref_for:!0,ref:"element","onUpdate:modelValue":t[0]||(t[0]=l=>e.selectedOptions=l),type:"checkbox",value:e.getValueForOption(r)},e.attributes),null,16,Qr),[[n.vModelCheckbox,e.selectedOptions]]),n.createTextVNode(n.toDisplayString(e.getLabelForOption(r)),1)])]))),256))],10,Jr)}const Rc="",Xr=D.register("checkboxes",{mixins:[ue],nativeField:!0,defaultValue:[],computed:{selectedOptions:{get(){return(this.selectedValue||[]).filter(e=>e)},set(e){this.selectedValue=e||[]}}}}),Zr=b(Xr,[["render",Gr]]),vr=["id"];function xr(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("div",{class:"dito-code",id:e.dataPath,ref:"code",style:n.normalizeStyle(e.style)},null,12,vr)}const qc="",ei=D.register("code",{mixins:[x],alignBottom:!1,computed:{lines(){return this.schema.lines||3},style(){return`height: calc(${this.lines}em * var(--line-height))`}},mounted(){const e=new Yt(this.$refs.code,{language:this.schema.language||"javascript",tabSize:this.schema.indentSize||2,lineNumbers:!1});let t=!1,o=!1,s=!1;const a=()=>{!this.focused&&t&&(t=!1,this.onChange())},i=()=>this.onFocus(),r=()=>{this.onBlur(),a()};this.domOn(this.$refs.code.querySelector("textarea"),{focus:i,blur:r});const l=h=>{h!==e.code&&(s=!0,e.updateCode(h))},d=h=>{h!==this.value&&(o=!0,this.value=h,t=!0,a())};e.onUpdate(h=>{s?s=!1:d(h)}),this.$watch("value",h=>{o?o=!1:l(h||"")}),l(this.value||"")},methods:{focusElement(){var e;(e=this.$el.querySelector("textarea"))==null||e.focus()}}}),ti=b(ei,[["render",xr]]),ni=["id"],oi={key:0,class:"dito-color-preview dito-inherit-focus"},si=["disabled"];function ai(e,t,o,s,a,i){const r=n.resolveComponent("SketchPicker"),l=n.resolveComponent("Trigger");return n.openBlock(),n.createBlock(l,{class:"dito-color",show:e.showPopup,"onUpdate:show":t[3]||(t[3]=d=>e.showPopup=d),trigger:"click"},{trigger:n.withCtx(()=>[n.createElementVNode("div",{class:n.normalizeClass(["dito-input",{"dito-focus":e.showPopup}])},[n.withDirectives(n.createElementVNode("input",n.mergeProps({id:e.dataPath,ref:"element","onUpdate:modelValue":t[0]||(t[0]=d=>e.hexValue=d),type:"input",size:"8"},e.attributes),null,16,ni),[[n.vModelText,e.hexValue]]),e.value?(n.openBlock(),n.createElementBlock("div",oi,[n.createElementVNode("div",{style:n.normalizeStyle({background:`#${e.hexValue||"00000000"}`})},null,4)])):n.createCommentVNode("",!0),e.showClearButton?(n.openBlock(),n.createElementBlock("button",{key:1,class:"dito-button-clear dito-button-overlay",disabled:e.disabled,onClick:t[1]||(t[1]=n.withModifiers((...d)=>e.clear&&e.clear(...d),["stop"]))},null,8,si)):n.createCommentVNode("",!0)],2)]),popup:n.withCtx(()=>[n.createVNode(r,{class:"dito-color-picker",modelValue:e.colorValue,"onUpdate:modelValue":t[2]||(t[2]=d=>e.colorValue=d),disableAlpha:!e.alpha,disableFields:!e.inputs,presetColors:e.presets},null,8,["modelValue","disableAlpha","disableFields","presetColors"])]),_:1},8,["show"])}const Ic="",ri=D.register("color",{components:{Trigger:Pe,SketchPicker:Jt.Sketch},data(){return{showPopup:!1,convertedHexValue:null}},computed:{colorValue:{get(){return this.value||{}},set(e){const t=this.colorFormat,o={hex:(e==null?void 0:e.a)<1?"hex8":"hex",rgb:"rgba"}[t]||t;o?this.value=e[o]:this.value=pe(e).toString(t),this.onChange()}},hexValue:{get(){if(this.value==null)this.convertedHexValue=null;else if(!this.focused){const e=pe(this.value);e.isValid()&&(this.convertedHexValue=e.toString(e.getAlpha()<1?"hex8":"hex6").slice(1).toUpperCase())}return this.convertedHexValue},set(e){this.convertedHexValue=e}},colorFormat:y("format",{type:String,default:"hex"}),alpha:y("alpha",{type:Boolean,default:!1}),inputs:y("inputs",{type:Boolean,default:!0}),presets:y("presets",{type:Array,default:["#ffffff","#c3c3c3","#7f7f7f","#000000","#880015","#ed1c24","#ff7f27","#fff200","#22b14c","#00a2e8","#3f48cc","#a349a4","#b97a57","#ffaec9","#ffc90e","#00000000"]})},watch:{focused(e){if(!e&&this.convertedHexValue){const t=pe(`#${this.convertedHexValue}`);t!=null&&t.isValid()&&(this.value=t.toString(this.colorFormat),this.onChange())}}}}),ii=b(ri,[["render",ai]]);function li(e,t,o,s,a,i){return n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.schema.component),n.normalizeProps(n.guardReactiveProps(e.$props)),null,16)}const di=D.register("component",{defaultValue:()=>{},alignBottom:!1,ignoreMissingValue:e=>!("default"in e),async processSchema(e,t){await re(t)}}),ci=b(di,[["render",li]]),hi=["id","name","value","disabled"];function ui(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("input",{class:"dito-text dito-input",id:e.dataPath,ref:"element",name:e.name,type:"text",value:e.value,disabled:e.disabled,readonly:!0},null,8,hi)}const pi=D.register(["computed","data","hidden"],{mixins:[Rt],defaultValue:()=>{},defaultVisible:!1,computed:{value:{get(){const{schema:e}=this;if(e.data||e.dataPath){const t=this.handleDataSchema(e,"schema",{resolveCounter:2});this.data[this.name]=t}return J.computed.value.get.call(this)},set(e){J.computed.value.set.call(this,e)}}}}),mi=b(pi,[["render",ui]]),fi={class:"dito-date"};function gi(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("div",fi,[(n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.getComponent(e.type)),n.mergeProps({id:e.dataPath,ref:"element",modelValue:e.dateValue,"onUpdate:modelValue":t[0]||(t[0]=r=>e.dateValue=r),locale:e.locale,dateFormat:{...e.api.formats.date,...e.dateFormat}},e.attributes),null,16,["id","modelValue","locale","dateFormat"]))])}const bi=D.register(["date","datetime","time"],{components:{DatePicker:kt,TimePicker:$t,DateTimePicker:Yo},nativeField:!0,textField:!0,computed:{dateValue:{get(){const{value:e}=this;return e&&new Date(e)},set(e){this.value=e}},dateFormat:y("dateFormat",{type:Object,default:null})},methods:{getComponent(e){return{date:"date-picker",time:"time-picker",datetime:"date-time-picker"}[e]}},processValue(e,t){return c.isDate(t)?t.toISOString():t}}),yi=b(bi,[["render",gi]]),Y={mixins:[Ot,pt],defaultValue(e){return Z(e)?[]:null},provide(){return{$sourceComponent:()=>this}},data(){return{wrappedPrimitives:null,ignoreRouteChange:!1,unwrappingPrimitives:!1}},computed:{sourceComponent(){return this},isObjectSource(){return X(this.type)},isListSource(){return Z(this.type)},hasData(){return!!this.value},isReady(){return this.hasData||!this.providesData},isInView(){return!!this.viewComponent},wrapPrimitives(){return this.schema.wrapPrimitives},listData:{get(){let e=this.value;this.isObjectSource?e=e!=null?[e]:[]:e=this.unwrapListData(e)||e,e||(e=[]);const{wrapPrimitives:t}=this;return t?(this.unwrappingPrimitives?this.unwrappingPrimitives=!1:this.wrappedPrimitives=e.map(o=>({[t]:o})),this.wrappedPrimitives):e},set(e){this.wrapPrimitives?this.wrappedPrimitives=e:this.value=this.isObjectSource?e&&e.length>0?e[0]:null:e}},objectData:{get(){return this.listData[0]||null},set(e){this.listData=e?[e]:[]}},sourceSchema(){return this.schema},path(){return this.routeComponent.getChildPath(this.schema.path)},defaultQuery(){const{defaultOrder:e}=this;return e?{order:e}:{}},query:$e("query",{get(e){return{...this.defaultQuery,...e}},set(e){var s;const{scope:t=(s=this.defaultScope)==null?void 0:s.name,page:o=this.schema.page}=this.query;return e={...this.query,...t!=null&&{scope:t},...o!=null&&{page:o},...e},c.equals(e,this.$route.query)||(this.ignoreRouteChange=!0,this.$router.replace({query:e,hash:this.$route.hash})),e}}),total:$e("total"),columns(){return W(this.schema.columns)},scopes(){return W(this.schema.scopes)},defaultScope(){let e=null;if(this.scopes)for(const t of Object.values(this.scopes)){if(t.defaultScope)return t;e||(e=t)}return e},defaultOrder(){if(this.columns)for(const e of Object.values(this.columns)){const{defaultSort:t}=e;if(t){const o=c.isString(t)?t:"asc";return`${e.name} ${o}`}}return null},nestedMeta(){return{...this.meta,schema:this.schema}},forms(){return Object.values(H(this.schema,this.context))},view(){return ve(this.schema,this.context)},linksToView(){return!!this.view},buttonSchemas(){return G(this.schema.buttons)},isCompact(){return this.forms.every(et)},isInlined(){return we(this.schema)},paginate:y("paginate",{type:Number}),render:y("render",{type:Function,default:null}),creatable:y("creatable",{type:Boolean,default:!1,get(e){return e&&I(this.schema)?this.isObjectSource?!this.value:!0:!1}}),editable:y("editable",{type:Boolean,default:!1,get(e){return e&&!this.isInlined}}),deletable:y("deletable",{type:Boolean,default:!1}),draggable:y("draggable",{type:Boolean,default:!1,get(e){return this.isListSource&&this.listData.length>1&&e}}),collapsible:y("collapsible",{type:Boolean,default:null,get(e){return this.isInlined&&!!(e??this.collapsed!==null)}}),collapsed:y("collapsed",{type:Boolean,default:null})},watch:{$route(e,t){if(this.ignoreRouteChange){this.ignoreRouteChange=!1;return}t.path===e.path&&t.hash===e.hash&&(this.query=e.query,this.loadData(!1))},wrappedPrimitives:{deep:!0,handler(e,t){const{wrapPrimitives:o}=this;o&&t!==null&&(this.unwrappingPrimitives=!0,this.value=e.map(s=>s[o]))}}},methods:{setupData(){this.query=this.$route.query,this.ensureData()},clearData(){this.total=0,this.value=null},setData(e){!e||this.isListSource&&c.isArray(e)||this.isObjectSource&&c.isObject(e)?this.value=e:this.unwrapListData(e)||c.isObject(e)&&this.isInView&&this.viewComponent.setData(e)},unwrapListData(e){if(this.isListSource&&c.isObject(e)&&c.isNumber(e.total)&&c.isArray(e.results))return this.total=e.total,this.value=e.results,this.value},createItem(e,t){const o=this.createData(e,t);return this.isObjectSource?this.objectData=o:this.listData.push(o),this.collapsible&&this.$nextTick(()=>this.openSchemaComponent(-1)),this.onChange(),o},removeItem(e){if(this.isObjectSource)this.objectData=null,this.onChange();else{const{listData:t}=this,o=t&&t.indexOf(e);o>=0&&(t.splice(o,1),this.onChange())}},deleteItem(e,t){const o=e&&this.getItemLabel(this.schema,e,{index:t,extended:!0}),s=()=>this.notify({type:this.isTransient?"info":"success",title:"Successfully Removed",text:[`${o} was ${this.verbs.deleted}.`,this.transientNote]});if(e&&window.confirm(`Do you really want to ${this.verbs.delete} ${o}?`))if(this.isTransient)this.removeItem(e),s();else{const a=this.getItemId(this.schema,e),i=Ce(a,this.resource);i&&this.handleRequest({method:"delete",resource:i},r=>{r||(this.removeItem(e),s()),this.reloadData()})}},getSchemaComponent(e){const{schemaComponents:t}=this,{length:o}=t;return t[(e%o+o)%o]},openSchemaComponent(e){const t=this.getSchemaComponent(e);t&&(t.opened=!0)},async navigateToComponent(e,t){if(this.collapsible){const o=e.startsWith(this.dataPath)?this.isListSource?c.parseDataPath(e.slice(this.dataPath.length+1))[0]??null:0:null;if(o!==null&&c.isNumber(+o)){const s=this.getSchemaComponent(+o);if(s){const{opened:a}=s;a||(s.opened=!0,await this.$nextTick());const i=s.getComponentsByDataPath(e);if(i.length>0&&((t==null?void 0:t(i))??!0))return!0;s.opened=a}}}return this.navigateToRouteComponent(e,t)},navigateToRouteComponent(e,t){return new Promise((o,s)=>{const a=()=>{const{routeComponents:r}=this.appState,l=r[r.length-1];o((t==null?void 0:t([l]))??!0)},i=c.parseDataPath(e);for(;i.length>0;){const r=this.routeComponent.getChildPath(this.api.normalizePath(c.normalizeDataPath(i))),{matched:l}=this.$router.match(r);l.length&&(this.$route.path===r?a():this.$router.push({path:r}).catch(s).then(()=>{this.$nextTick(a)})),i.pop()}o(!1)})}},async processSchema(e,t,o,s,a,i=!1,r=!1,l=null){Qe(e,t,o);const d=we(t);if(d&&t.resource)throw new Error("Lists with nested forms cannot load data from their own resources");const h=`id${a+1}`,u={api:e,schema:t},p={...u,flatten:r,nested:i,param:h},g=await Hn(e,t,a);if(l&&await l(g,a+1),I(t)&&!d){const f=($,S)=>S?$?`${$}/:${S}`:`:${S}`:$,m=a===0?"":t.path,k={path:f(m,Z(t)&&h),component:C.component(i?"DitoFormNested":"DitoForm"),meta:p};X(t)&&s.push({...k,path:f(m,h)}),m&&s.push({path:m,redirect:".",meta:u});const[P,w]=g.reduce(($,S)=>($[S.meta.flatten?0:1].push(S),$),[[],[]]);if(w.length&&(k.children=w),s.push(k),P.length)for(const $ of P)s.push({...$.redirect?$:k,path:`${k.path}/${$.path}`,meta:{...$.meta,flatten:r}})}},processValue(e,t,o,s){return s.addSource(o,e),t}},Fe={text(e){const t=[{label:"contains",value:"contains"},{label:"equals",value:"equals"},{label:"starts with",value:"starts-with"},{label:"ends with",value:"ends-with"}];return{operator:e.operators?{type:"select",width:"2/5",options:c.isArray(e.operators)?t.filter(o=>e.operators.includes(o.value)):t,clearable:!0}:null,text:{type:"text",width:e.operators?"3/5":"fill",clearable:!0}}},"date-range"(){const e={day:"2-digit",month:"2-digit",year:"numeric"};return{from:{type:"datetime",width:"1/2",dateFormat:e,clearable:!0},to:{type:"datetime",width:"1/2",dateFormat:e,clearable:!0}}}};function ki(e,t,o,s){const{sticky:a,...i}=t,r={type:"panel",label:"Filters",name:"$filters",target:o,disabled:!1,sticky:a,data(){return Bi(r,s.query)},components:Ci(i),buttons:qt(!1),panelButtons:qt(!0),events:{change(){this.applyFilters()}},computed:{filters(){return $i(this.schema,this.data)},hasFilters(){return this.filters.length>0}},methods:{applyFilters(){console.log("applyFilters()",JSON.stringify({data:this.data,filters:this.filters})),s.query={...s.query,filter:this.filters,page:void 0}},clearFilters(){console.log("clearFilters()"),this.resetData(),this.applyFilters()}}};return Je(e,r),r}function qt(e){return{clear:{type:"button",text:e?null:"Clear",disabled:({schemaComponent:t})=>!t.hasFilters,events:{click({schemaComponent:t}){t.clearFilters()}}},submit:{type:"submit",text:e?null:"Filter",visible:!e,events:{click({schemaComponent:t}){t.applyFilters()}}}}}function Ci(e){var o;const t={};for(const s of Object.values(W(e)||{})){const{filter:a,width:i,...r}=s,l=a?(o=Fe[a])==null?void 0:o.call(Fe,s):s.components;if(l){r.type="form",r.components={};for(const[d,h]of Object.entries(l))if(h){const u=h.label||c.labelize(h.name||d);r.components[d]={...h,label:!1,placeholder:u}}t[s.name]={label:r.label,type:"object",width:i,default:()=>({}),form:r,inlined:!0}}else throw new Error(`Invalid filter '${s.name}': Unknown filter type '${a}'.`)}return t}function It(e,t){var s;const o=e.components[t];return(s=o==null?void 0:o.form)==null?void 0:s.components}function $i(e,t){console.log("formatFiltersData()",{data:JSON.stringify(t),schema:JSON.stringify(Object.keys((e==null?void 0:e.components)||{}))});const o=[];for(const s in t){const a=t[s];if(a){const i=Object.keys(It(e,s)).map(r=>a[r]??null);i.some(r=>r!==null)&&o.push(`${s}:${i.map(JSON.stringify).join(",")}`)}}return o}function Bi(e,t){const o={};if(t)for(const a of c.asArray(t.filter)){const[,i,r]=a.match(/^(\w+):(.*)$/);try{o[i]=c.asArray(JSON.parse(`[${r}]`))}catch{}}const s={};for(const a in e.components){const i={},r=o[a];if(r){const l=It(e,a);if(l){let d=0;for(const h in l)i[h]=r[d++]}}s[a]=i}return s}const Di=["id"],wi={key:0,class:"dito-navigation"},Vi={key:1,class:"dito-spacer"},Si=["id"],Pi={key:1},Ei=["innerHTML"],Ni=["innerHTML"],Oi={key:2,class:"dito-cell-edit-buttons"},Fi={key:1},Li=["colspan"];function Ti(e,t,o,s,a,i){const r=n.resolveComponent("DitoScopes"),l=n.resolveComponent("DitoPagination"),d=n.resolveComponent("DitoTableHead"),h=n.resolveComponent("DitoTableCell"),u=n.resolveComponent("DitoSchemaInlined"),p=n.resolveComponent("DitoEditButtons"),g=n.resolveComponent("DitoDraggable");return e.isReady?(n.openBlock(),n.createElementBlock("div",{key:0,class:n.normalizeClass(["dito-list",e.schema.class]),id:e.dataPath,style:n.normalizeStyle(e.schema.style)},[e.scopes||e.hasPagination?(n.openBlock(),n.createElementBlock("div",wi,[e.scopes?(n.openBlock(),n.createBlock(r,{key:0,query:e.query,scopes:e.scopes},null,8,["query","scopes"])):e.hasPagination?(n.openBlock(),n.createElementBlock("div",Vi)):n.createCommentVNode("",!0),e.hasPagination?(n.openBlock(),n.createBlock(l,{key:2,query:e.query,limit:e.paginate,total:e.total||0},null,8,["query","limit","total"])):n.createCommentVNode("",!0)])):n.createCommentVNode("",!0),n.createElementVNode("table",{class:n.normalizeClass(["dito-table",{"dito-table-separators":e.isInlined,"dito-table-larger-padding":e.hasEditButtons&&!e.isInlined,"dito-table-alternate-colors":!e.isInlined,"dito-table-even-count":e.hasEvenCount}])},[e.columns?(n.openBlock(),n.createBlock(d,{key:0,query:e.query,columns:e.columns,hasEditButtons:e.hasEditButtons},null,8,["query","columns","hasEditButtons"])):n.createCommentVNode("",!0),n.createVNode(g,{tag:"tbody",modelValue:e.updateOrder(e.sourceSchema,e.listData,e.paginationRange),options:e.getSortableOptions(!1),draggable:e.draggable,"onUpdate:modelValue":t[0]||(t[0]=f=>e.listData=f)},{default:n.withCtx(()=>[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.listData,(f,m)=>(n.openBlock(),n.createElementBlock("tr",{id:e.getDataPath(m),key:e.getItemUid(e.schema,f)},[e.columns?(n.openBlock(!0),n.createElementBlock(n.Fragment,{key:0},n.renderList(e.columns,k=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[e.shouldRender(k)?(n.openBlock(),n.createBlock(h,{key:k.name,class:n.normalizeClass(e.getCellClass(k)),cell:k,schema:e.schema,dataPath:e.getDataPath(m),data:f,meta:e.nestedMeta,store:e.store,nested:!1,disabled:e.disabled||e.isLoading},null,8,["class","cell","schema","dataPath","data","meta","store","disabled"])):n.createCommentVNode("",!0)],64))),256)):(n.openBlock(),n.createElementBlock("td",Pi,[e.isInlined?(n.openBlock(),n.createBlock(u,{key:0,label:e.getItemLabel(e.schema,f,{index:m,asObject:!0}),schema:e.getItemFormSchema(e.schema,f,e.context),dataPath:e.getDataPath(m),data:f,meta:e.nestedMeta,store:e.getChildStore(m),disabled:e.disabled||e.isLoading,collapsed:e.collapsed,collapsible:e.collapsible,deletable:e.deletable,draggable:e.draggable,editable:e.editable,editPath:e.getEditPath(f,m),onDelete:k=>e.deleteItem(f,m)},null,8,["label","schema","dataPath","data","meta","store","disabled","collapsed","collapsible","deletable","draggable","editable","editPath","onDelete"])):e.schema.component?(n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.schema.component),{key:1,dataPath:e.getDataPath(m),data:f,nested:!1},null,8,["dataPath","data"])):e.render?(n.openBlock(),n.createElementBlock("span",{key:2,innerHTML:e.render(e.getContext(f,m))},null,8,Ei)):(n.openBlock(),n.createElementBlock("span",{key:3,innerHTML:e.getItemLabel(e.schema,f,{index:m})},null,8,Ni))])),e.hasCellEditButtons?(n.openBlock(),n.createElementBlock("td",Oi,[n.createVNode(p,{deletable:e.deletable,draggable:e.draggable,editable:e.editable,editPath:e.getEditPath(f,m),schema:e.getItemFormSchema(e.schema,f,e.context),dataPath:e.getDataPath(m),data:f,meta:e.nestedMeta,store:e.getChildStore(m),onDelete:k=>e.deleteItem(f,m)},null,8,["deletable","draggable","editable","editPath","schema","dataPath","data","meta","store","onDelete"])])):n.createCommentVNode("",!0)],8,Si))),128))]),_:1},8,["modelValue","options","draggable"]),e.hasListButtons&&!e.single?(n.openBlock(),n.createElementBlock("tfoot",Fi,[n.createElementVNode("tr",null,[n.createElementVNode("td",{class:"dito-cell-edit-buttons",colspan:e.numColumns},[n.createVNode(p,{creatable:e.creatable,createPath:e.path,buttons:e.buttonSchemas,schema:e.schema,dataPath:e.dataPath,data:e.listData,meta:e.meta,store:e.store},null,8,["creatable","createPath","buttons","schema","dataPath","data","meta","store"])],8,Li)])])):n.createCommentVNode("",!0)],2),e.hasListButtons&&e.single?(n.openBlock(),n.createBlock(p,{key:1,class:"dito-buttons-main dito-buttons-large",creatable:e.creatable,createPath:e.path,buttons:e.buttonSchemas,schema:e.schema,dataPath:e.dataPath,data:e.listData,meta:e.meta,store:e.store},null,8,["creatable","createPath","buttons","schema","dataPath","data","meta","store"])):n.createCommentVNode("",!0)],14,Di)):n.createCommentVNode("",!0)}const zc="",ji=D.register("list",{mixins:[Y,Oe],alignBottom:!1,getSourceType(e){return e},getPanelSchema(e,t,o,s){const{filters:a}=t;if(a){const i=()=>s.getComponentByDataPath(o,r=>r.type==="list");return ki(e,a,o,{get query(){var r;return(r=i())==null?void 0:r.query},set query(r){const l=i();if(console.log("set query",!!l),l){const d=h=>c.pickBy(h,u=>u!==void 0);console.log("set query",JSON.stringify(d(r)),JSON.stringify(d(l.query))),c.equals(d(r),d(l.query))||(console.log("load data"),l.query=r,l.loadData(!1))}}})}},computed:{hasPagination(){return this.paginate&&this.total>this.paginate},hasListButtons(){return!!(this.buttonSchemas||this.creatable)},hasEditButtons(){const{listData:e}=this;return e.length>0&&(this.editable||this.deletable||this.draggable)},hasCellEditButtons(){return!this.isInlined&&this.hasEditButtons},hasEvenCount(){return!(this.listData.length%2)},numColumns(){return(this.columns?Object.keys(this.columns).length:1)+(this.hasCellEditButtons?1:0)}},methods:{getDataPath(e){return F(this.dataPath,e)},getEditPath(e,t){if(this.editable){const o=Jn(this.schema,this.context)||this.path,s=this.getItemId(this.schema,e,t);return`${o}/${s}`}return null},getCellClass(e){return`dito-cell-${c.hyphenate(e.name)}`},getContext(e,t){return new V(this,{data:e,value:e,index:t,dataPath:this.getDataPath(t)})},onFilterErrors(e){const t=F(this.dataPath,"$filters"),o=this.schemaComponent.getPanelByDataPath(t);if(o)return o.showValidationErrors(e,!0),!0}},async processSchema(e,t,o,s,a,i=!1,r=!1,l=null){await Promise.all([re(t),Ye(t.columns),Y.processSchema(e,t,o,s,a,i,r,l)])}}),_i=b(ji,[["render",Ti]]);function Mi(e,t,o,s,a,i){const r=n.resolveComponent("DitoLabel");return n.openBlock(),n.createBlock(r,{class:"dito-label-component",label:e.value,dataPath:e.dataPath},null,8,["label","dataPath"])}const Ac="",Ri=D.register("label",{excludeValue:!0,generateLabel:!1,alignBottom:!1}),qi=b(Ri,[["render",Mi]]),Ii=["id"],zi=["editor"],Ai={key:0,class:"dito-buttons dito-buttons-toolbar"},Ui={class:"dito-button-group"},Hi=["onClick"];function Wi(e,t,o,s,a,i){const r=n.resolveComponent("Icon"),l=n.resolveComponent("EditorContent");return n.openBlock(),n.createElementBlock("div",{class:"dito-markup",id:e.dataPath},[n.createElementVNode("div",{class:"dito-markup-toolbar",editor:e.editor},[e.groupedButtons.length>0?(n.openBlock(),n.createElementBlock("div",Ai,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.groupedButtons,d=>(n.openBlock(),n.createElementBlock("div",Ui,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(d,({name:h,icon:u,isActive:p,onClick:g})=>(n.openBlock(),n.createElementBlock("button",{class:n.normalizeClass(["dito-button",{"dito-active":p}]),key:h,onClick:g},[n.createVNode(r,{name:u},null,8,["name"])],10,Hi))),128))]))),256))])):n.createCommentVNode("",!0)],8,zi),n.createVNode(l,{class:"dito-markup-editor",ref:"editor",editor:e.editor,style:n.normalizeStyle(e.styles)},null,8,["editor","style"]),e.resizable?(n.openBlock(),n.createElementBlock("div",{key:0,class:"dito-resize",onMousedown:t[0]||(t[0]=n.withModifiers((...d)=>e.onDragResize&&e.onDragResize(...d),["stop","prevent"]))},null,32)):n.createCommentVNode("",!0)],8,Ii)}const Uc="",Ki=D.register("markup",{mixins:[x],components:{EditorContent:ee.EditorContent,Icon:Qo},alignBottom:!1,data(){return{editor:null,height:null}},computed:{lines(){return this.schema.lines||10},styles(){return{height:this.height||`calc(${this.lines}em * var(--line-height))`}},markButtons(){return this.getButtons("marks",{bold:!0,italic:!0,underline:!0,strike:!0,small:!0,code:!0,link:{onClick:e=>this.onClickLink(e)}})},basicNodeButtons(){return this.getButtons("nodes",{paragraph:{ignoreActive:()=>this.otherNodeButtons.some(e=>e.isActive)},heading:{attribute:"level",values:[1,2,3,4,5,6]}})},otherNodeButtons(){return this.getButtons("nodes",{bulletList:!0,orderedList:!0,blockquote:!0,codeBlock:!0})},toolButtons(){return this.getButtons("tools",{undo:!0,redo:!0})},groupedButtons(){const{markButtons:e,basicNodeButtons:t,otherNodeButtons:o,toolButtons:s}=this;return[e,t,o,s].filter(a=>a.length>0)},parseOptions(){return{preserveWhitespace:{collapse:!1,preserve:!0,"preserve-all":"full"}[this.whitespace]}},editorOptions(){return{editable:!this.readyonly,autoFocus:this.autofocus,disableInputRules:!this.enableRules.input,disablePasteRules:!this.enableRules.paste,parseOptions:this.parseOptions}},resizable:y("resizable",{type:Boolean,default:!1}),whitespace:y("whitespace",{type:String,default:"collapse"}),enableRules:y("enableRules",{type:[Object,Boolean],default:!1,get(e){return c.isObject(e)?e:{input:!!e,paste:!!e}}})},watch:{readyonly:"updateEditorOptions",autofocus:"updateEditorOptions",enableRules:"updateEditorOptions"},created(){let e=!1,t=!1;const o=()=>{!this.focused&&e&&(e=!1,this.onChange())},s=()=>this.onFocus(),a=()=>{this.onBlur(),o()},i=c.debounce(l=>{t=!0,this.value=l.getHTML(),e=!0,o()},100),r=({editor:l})=>{i(l),this.onInput()};this.$watch("value",l=>{t?t=!1:this.editor.setContent(l,!1,this.parseOptions)}),this.editor=new ee.Editor({...this.editorOptions,onFocus:s,onBlur:a,onUpdate:r,extensions:this.getExtensions(),content:this.value||""})},unmounted(){this.editor.destroy()},methods:{onDragResize(e){const t=({clientX:r,clientY:l})=>({x:r,y:l});let o=t(e).y,s=parseFloat(getComputedStyle(this.$refs.editor.$el).height);const a=r=>{const{y:l}=t(r);s+=l-o,o=l,this.height=`${Math.max(s,0)}px`},i=this.domOn(document,{mousemove:a,mouseup(r){a(r),i.remove()}})},updateEditorOptions(){this.editor.setOptions(this.editorOptions)},async onClickLink(e){const t=await this.rootComponent.showDialog({components:{href:{type:"url",label:"Link",autofocus:!0},title:{type:"text",label:"Title"}},buttons:{cancel:{},apply:{type:"submit"},remove:{events:{click({dialogComponent:o}){o.resolve(null)}}}},data:ee.getMarkAttributes(this.editor.state,"link")});if(t){let{href:o,title:s}=t;if(o)try{new URL(o)}catch{o=`https://${o}`}e.commands.setLink({href:o,title:s})}else e.commands.unsetLink()},getExtensions(){const{marks:e={},nodes:t={},tools:o={}}=this.schema;return[Qt.Document,Gt.Text,rn.Paragraph,e.bold&&Xt.Bold,e.italic&&vt.Italic,e.underline&&tn.Underline,e.strike&&en.Strike,e.small&&Yi,e.code&&Zt.Code,e.link&&Ji,t.blockquote&&nn.Blockquote,t.codeBlock&&on.CodeBlock,sn.HardBreak,t.heading&&an.Heading.configure({levels:t.heading}),t.horizontalRule&&ln.HorizontalRule,(t.orderedList||t.bulletList)&&hn.ListItem,t.bulletList&&cn.BulletList,t.orderedList&&dn.OrderedList,o.history&&un.History].filter(s=>!!s)},getButtons(e,t){const o=[],s=({name:i,icon:r,attributes:l,ignoreActive:d,onClick:h})=>{o.push({name:i,icon:r,isActive:this.editor.isActive(i,l)&&(d==null||!d()),onClick:()=>{const u=`toggle${c.camelize(i,!0)}`;this.editor.commands[u]&&(h?h(this.editor,l):(g=>this.editor.chain()[u](g).focus().run())(l))}})},a=this.schema[e];if(a)for(const[i,r]of Object.entries(t)){const l=["undo","redo"].includes(i)?"history":i,d=a[l],h=c.underscore(i),u=c.hyphenate(i);if(d){if(r===!0)s({name:h,icon:u});else if(c.isObject(r)){const{attribute:p,values:g,ignoreActive:f,onClick:m}=r;if(p){if(c.isArray(g)&&c.isArray(d))for(const k of g)d.includes(k)&&s({name:h,icon:`${u}-${k}`,attributes:{[p]:k},ignoreActive:f,onClick:m})}else s({name:h,icon:u,ignoreActive:f,onClick:m})}}}return o},focusElement(){var e,t;(t=(e=this.$el).scrollIntoView)==null||t.call(e),this.editor.focus()}}}),Yi=ee.Mark.create({name:"small",parseHTML(){return[{tag:"small"}]},renderHTML(){return["small",0]},addCommands(){return{setSmall:e=>({commands:t})=>t.setMark(this.name,e),toggleSmall:e=>({commands:t})=>t.toggleMark(this.name,e),unsetSmall:()=>({commands:e})=>e.unsetMark(this.name)}}}),Ji=xt.Link.extend({inclusive:!1,schema:{attrs:{href:{default:null},title:{default:null}},parseHTML(){return[{tag:"a",getAttrs:e=>({href:e.getAttribute("href"),title:e.getAttribute("title")})}]},renderHTML(e){return["a",e.attrs,0]}}}),Qi=b(Ki,[["render",Wi]]),Gi=["disabled"];function Xi(e,t,o,s,a,i){const r=n.resolveComponent("VueMultiselect");return n.openBlock(),n.createElementBlock("div",{class:n.normalizeClass(["dito-multiselect",{"dito-multiselect-single":!e.multiple,"dito-multiselect-multiple":e.multiple}])},[n.createVNode(r,n.mergeProps({ref:"element",modelValue:e.selectedOptions,"onUpdate:modelValue":t[0]||(t[0]=l=>e.selectedOptions=l),class:{"multiselect--show-highlight":e.showHighlight},showLabels:!1,placeholder:e.placeholder,tagPlaceholder:"Press enter to add new tag",options:e.populate&&e.activeOptions||[],customLabel:e.getLabelForOption,trackBy:e.optionValue,groupLabel:e.groupByLabel,groupValues:e.groupByOptions,multiple:e.multiple,taggable:e.taggable,searchable:e.searchable,internalSearch:!e.searchFilter,preserveSearch:!!e.searchFilter,clearOnSelect:!e.searchFilter,closeOnSelect:!e.stayOpen,loading:e.isLoading},e.attributes,{onOpen:e.onOpen,onClose:e.onClose,onTag:e.onAddTag,onSearchChange:e.onSearchChange}),null,16,["modelValue","class","placeholder","options","customLabel","trackBy","groupLabel","groupValues","multiple","taggable","searchable","internalSearch","preserveSearch","clearOnSelect","closeOnSelect","loading","onOpen","onClose","onTag","onSearchChange"]),e.showClearButton?(n.openBlock(),n.createElementBlock("button",{key:0,class:"dito-button-clear dito-button-overlay",type:"button",disabled:e.disabled,onClick:t[1]||(t[1]=(...l)=>e.clear&&e.clear(...l))},null,8,Gi)):n.createCommentVNode("",!0)],2)}const Hc="",Zi=D.register("multiselect",{mixins:[ue],components:{VueMultiselect:pn},data(){return{isMounted:!1,searchedOptions:null,populate:!1}},computed:{selectedOptions:{get(){return this.multiple?(this.selectedValue||[]).map(e=>this.getOptionForValue(e)||this.addTagOption(e)).filter(Boolean):this.selectedOption},set(e){this.selectedValue=this.multiple?(e||[]).map(t=>this.getValueForOption(t)):this.getValueForOption(e),this.onChange()}},activeOptions(){return this.searchedOptions||this.options},multiple:y("multiple",{type:Boolean,default:!1}),searchable:y("searchable",{type:Boolean,default:!1}),taggable:y("taggable",{type:Boolean,default:!1}),stayOpen:y("stayOpen",{type:Boolean,default:!1}),placeholder(){let{placeholder:e,searchable:t,taggable:o}=this.schema;return c.isBoolean(e)&&(e=e?void 0:null),e===void 0?t&&o?`Search or add a ${this.label}`:t?`Select or search ${this.label}`:void 0:e},showHighlight(){return this.isMounted&&this.$refs.element.pointerDirty}},mounted(){this.isMounted=!0,this.autofocus&&this.focus()},methods:{addTagOption(e){if(this.taggable){const{optionLabel:t,optionValue:o}=this,s=t&&o?{[t]:e,[o]:e}:e;return this.options.push(s),s}},focusElement(){this.$refs.element.activate()},onOpen(){this.populate=!0},onClose(){this.focused&&this.onBlur()},onBlur(){this.$refs.element.isOpen||J.methods.onBlur.call(this)},onAddTag(e){const t=this.addTagOption(e);t&&this.value.push(this.getValueForOption(t))},async onSearchChange(e){this.searchFilter&&(e?(this.searchedOptions=[],this.searchedOptions=await this.resolveData(()=>this.searchFilter(new V(this,{query:e})))):this.searchedOptions=null)}}}),vi=b(Zi,[["render",Xi]]),Le={computed:{inputValue:{get(){return this.value!==null?this.value:""},set(e){this.value=e!==""?this.isInteger?parseInt(e,10):parseFloat(e):null}},isInteger(){return!1},stepValue(){return this.clearable?null:this.step==null&&!this.isInteger?"any":this.step},decimals:y("decimals",{type:Number}),step:y("step",{type:Number,get(e){return this.isInteger&&e!=null?Math.ceil(e):e}}),min:y("min",{type:Number,get(e){var t;return e=e===void 0?(t=this.getSchemaValue("range",{type:Array}))==null?void 0:t[0]:e,this.isInteger&&e!=null?Math.floor(e):e}}),max:y("max",{type:Number,get(e){var t;return e=e===void 0?(t=this.getSchemaValue("range",{type:Array}))==null?void 0:t[1]:e,this.isInteger&&e!=null?Math.ceil(e):e}}),range:y("range",{type:Array,get(){const{min:e,max:t}=this;return e!=null&&t!=null?[e,t]:void 0},set(e){c.isArray(e)&&([this.min,this.max]=e)}})},methods:{getValidations(){const e={},{range:t,min:o,max:s,decimals:a,step:i}=this;if(t?e.range=t:(o!=null&&(e.min=o),s!=null&&(e.max=s)),a!=null)e.decimals=a;else if(i){const r=(`${i}`.split(".")[1]||"").length;r>0?e.decimals=r:e.integer=!0}return this.isInteger&&(e.integer=!0),e}}},xi=["disabled"];function el(e,t,o,s,a,i){const r=n.resolveComponent("InputField");return n.openBlock(),n.createBlock(r,n.mergeProps({class:"dito-number",id:e.dataPath,ref:"element",modelValue:e.inputValue,"onUpdate:modelValue":t[1]||(t[1]=l=>e.inputValue=l),type:"number"},e.attributes,{min:e.min,max:e.max,step:e.stepValue}),{after:n.withCtx(()=>[e.showClearButton?(n.openBlock(),n.createElementBlock("button",{key:0,class:"dito-button-clear dito-button-overlay",disabled:e.disabled,onClick:t[0]||(t[0]=n.withModifiers((...l)=>e.clear&&e.clear(...l),["stop"]))},null,8,xi)):n.createCommentVNode("",!0)]),_:1},16,["id","modelValue","min","max","step"])}const Wc="",tl=D.register(["number","integer"],{mixins:[Le],components:{InputField:v},nativeField:!0,textField:!0,computed:{isInteger(){return this.type==="integer"}}}),nl=b(tl,[["render",el]]),ol=["id"],sl={key:0,class:"dito-object-content"},al=["innerHTML"],rl=["innerHTML"];function il(e,t,o,s,a,i){const r=n.resolveComponent("DitoSchemaInlined"),l=n.resolveComponent("DitoEditButtons");return e.isReady?(n.openBlock(),n.createElementBlock("div",{key:0,class:n.normalizeClass(["dito-object",e.schema.class]),id:e.dataPath,style:n.normalizeStyle(e.schema.style)},[e.objectData?(n.openBlock(),n.createElementBlock("div",sl,[e.isInlined?(n.openBlock(),n.createBlock(r,{key:0,label:e.objectLabel,schema:e.getItemFormSchema(e.schema,e.objectData,e.context),dataPath:e.dataPath,data:e.objectData,meta:e.nestedMeta,store:e.store,disabled:e.disabled||e.isLoading,collapsed:e.collapsed,collapsible:e.collapsible},null,8,["label","schema","dataPath","data","meta","store","disabled","collapsed","collapsible"])):e.schema.component?(n.openBlock(),n.createBlock(n.resolveDynamicComponent(e.schema.component),{key:1,dataPath:e.dataPath,data:e.objectData,nested:!1},null,8,["dataPath","data"])):e.render?(n.openBlock(),n.createElementBlock("span",{key:2,innerHTML:e.render(e.getContext())},null,8,al)):(n.openBlock(),n.createElementBlock("span",{key:3,innerHTML:e.getItemLabel(e.schema,e.objectData)},null,8,rl))])):n.createCommentVNode("",!0),n.createVNode(l,{creatable:e.creatable,deletable:e.objectData&&e.deletable,editable:e.objectData&&e.editable,createPath:e.path,editPath:e.path,buttons:e.buttonSchemas,schema:e.schema,dataPath:e.dataPath,data:e.objectData,path:e.path,meta:e.meta,store:e.store,onDelete:t[0]||(t[0]=d=>e.deleteItem(e.objectData))},null,8,["creatable","deletable","editable","createPath","editPath","buttons","schema","dataPath","data","path","meta","store"])],14,ol)):n.createCommentVNode("",!0)}const Kc="",ll=D.register("object",{mixins:[Y],alignBottom:!1,getSourceType(e){return e},computed:{objectLabel(){return this.collapsible?this.getItemLabel(this.schema,this.objectData,{asObject:!0}):null}},methods:{getContext(){return new V(this,{data:this.objectData})}},async processSchema(e,t,o,s,a,i=!1,r=!1,l=null){await Promise.all([re(t),Y.processSchema(e,t,o,s,a,i,r,l)])}}),dl=b(ll,[["render",il]]),cl=D.register("panel",{defaultValue:()=>{},excludeValue:!0,generateLabel:!1,alignBottom:!1,omitPadding:!0,getPanelSchema(e,t){const{name:o,...s}=t;return s}}),hl=["id","value","max"];function ul(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("progress",n.mergeProps({class:"dito-progress",id:e.dataPath,ref:"element",value:e.progressValue,max:e.progressMax},e.attributes),null,16,hl)}const pl=D.register("progress",{mixins:[Le],computed:{progressValue(){let{value:e,range:t,step:o}=this;return e!==null?(t&&(e-=t[0]),o&&(e=Math.round(e/o)*o)):e="",e},progressMax(){const{range:e}=this;return e?e[1]-e[0]:null}}}),ml=b(pl,[["render",ul]]),fl=["id"],gl=["value"];function bl(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("ul",{class:n.normalizeClass(["dito-radio-buttons",`dito-layout-${e.schema.layout||"vertical"}`]),id:e.dataPath},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.options,r=>(n.openBlock(),n.createElementBlock("li",null,[n.createElementVNode("label",null,[n.withDirectives(n.createElementVNode("input",n.mergeProps({class:"dito-radio-button",ref_for:!0,ref:"element","onUpdate:modelValue":t[0]||(t[0]=l=>e.selectedValue=l),type:"radio",value:e.getValueForOption(r)},e.attributes),null,16,gl),[[n.vModelRadio,e.selectedValue]]),n.createTextVNode(n.toDisplayString(e.getLabelForOption(r)),1)])]))),256))],10,fl)}const Yc="",yl=D.register("radio",{mixins:[ue],nativeField:!0}),kl=b(yl,[["render",bl]]);function Cl(e,t,o,s,a,i){const r=n.resolveComponent("DitoPane");return n.openBlock(),n.createElementBlock("div",{class:n.normalizeClass(["dito-section",{"dito-section-labelled":!!e.schema.label}])},[n.createVNode(r,{class:"dito-section-pane",schema:e.getItemFormSchema(e.schema,e.item,e.context),dataPath:e.dataPath,data:e.item,meta:e.meta,store:e.store,disabled:e.disabled},null,8,["schema","dataPath","data","meta","store","disabled"])],2)}const Jc="",$l=D.register("section",{defaultValue:()=>{},ignoreMissingValue:e=>!e.nested&&!("default"in e),defaultNested:!1,generateLabel:!1,alignBottom:!1,computed:{item(){return this.nested?this.value:this.data}},methods:{getItemFormSchema:De},async processSchema(e,t,o,s,a){await Q(e,t,s,a)}}),Bl=b($l,[["render",Cl]]),Dl={class:"dito-select"},wl=["id"],Vl=["label"],Sl=["value"],Pl=["value"],El=["value"],Nl=["disabled"];function Ol(e,t,o,s,a,i){return n.openBlock(),n.createElementBlock("div",Dl,[n.withDirectives(n.createElementVNode("select",n.mergeProps({id:e.dataPath,ref:"element","onUpdate:modelValue":t[0]||(t[0]=r=>e.selectedValue=r)},e.attributes,{onMousedown:t[1]||(t[1]=r=>e.populate=!0),onFocus:t[2]||(t[2]=r=>e.populate=!0)}),[e.populate?(n.openBlock(!0),n.createElementBlock(n.Fragment,{key:0},n.renderList(e.options,r=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[e.groupBy?(n.openBlock(),n.createElementBlock("optgroup",{key:0,label:r[e.groupByLabel]},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(r[e.groupByOptions],l=>(n.openBlock(),n.createElementBlock("option",{value:e.getValueForOption(l)},n.toDisplayString(e.getLabelForOption(l)),9,Sl))),256))],8,Vl)):(n.openBlock(),n.createElementBlock("option",{key:1,value:e.getValueForOption(r)},n.toDisplayString(e.getLabelForOption(r)),9,Pl))],64))),256)):e.selectedOption?(n.openBlock(),n.createElementBlock("option",{key:1,value:e.selectedValue},n.toDisplayString(e.getLabelForOption(e.selectedOption)),9,El)):n.createCommentVNode("",!0)],16,wl),[[n.vModelSelect,e.selectedValue]]),e.showClearButton?(n.openBlock(),n.createElementBlock("button",{key:0,class:"dito-button-clear dito-button-overlay",disabled:e.disabled,onClick:t[3]||(t[3]=(...r)=>e.clear&&e.clear(...r))},null,8,Nl)):n.createCommentVNode("",!0)])}const Qc="",Fl=D.register("select",{mixins:[ue],nativeField:!0,data(){return{populate:!0}}}),Ll=b(Fl,[["render",Ol]]),Tl={class:"dito-slider"},jl=["id","min","max","step"];function _l(e,t,o,s,a,i){const r=n.resolveComponent("InputField");return n.openBlock(),n.createElementBlock("div",Tl,[n.withDirectives(n.createElementVNode("input",n.mergeProps({class:"dito-range",id:e.dataPath,ref:"element","onUpdate:modelValue":t[0]||(t[0]=l=>e.inputValue=l),type:"range"},e.attributes,{min:e.min,max:e.max,step:e.stepValue}),null,16,jl),[[n.vModelText,e.inputValue]]),e.input?(n.openBlock(),n.createBlock(r,n.mergeProps({key:0,class:"dito-number",modelValue:e.inputValue,"onUpdate:modelValue":t[1]||(t[1]=l=>e.inputValue=l),type:"number"},e.attributes,{min:e.min,max:e.max,step:e.stepValue}),null,16,["modelValue","min","max","step"])):n.createCommentVNode("",!0)])}const Gc="",Ml=D.register("slider",{mixins:[Le],components:{InputField:v},nativeField:!0,computed:{input:y("input",{type:Boolean,default:!0})}}),Rl=b(Ml,[["render",_l]]);function ql(e,t,o,s,a,i){const r=n.resolveComponent("SwitchButton");return n.openBlock(),n.createBlock(r,n.mergeProps({class:"dito-switch",id:e.dataPath,ref:"element",modelValue:e.value,"onUpdate:modelValue":t[0]||(t[0]=l=>e.value=l),labels:e.labels},e.attributes),null,16,["id","modelValue","labels"])}const Xc="",Il=D.register("switch",{defaultValue:!1,defaultWidth:"auto",components:{SwitchButton:is},computed:{labels(){return this.schema.labels}}}),zl=b(Il,[["render",ql]]),Al=["disabled"];function Ul(e,t,o,s,a,i){const r=n.resolveComponent("InputField");return n.openBlock(),n.createBlock(r,n.mergeProps({class:"dito-text",id:e.dataPath,ref:"element",modelValue:e.inputValue,"onUpdate:modelValue":t[1]||(t[1]=l=>e.inputValue=l),type:e.inputType},e.attributes),{after:n.withCtx(()=>[e.showClearButton?(n.openBlock(),n.createElementBlock("button",{key:0,class:"dito-button-clear dito-button-overlay",disabled:e.disabled,onClick:t[0]||(t[0]=n.withModifiers((...l)=>e.clear&&e.clear(...l),["stop"]))},null,8,Al)):n.createCommentVNode("",!0)]),_:1},16,["id","modelValue","type"])}const Hl="****************",Wl=D.register(["text","email","url","hostname","domain","tel","password","creditcard"],{components:{InputField:v},nativeField:!0,textField:!0,ignoreMissingValue:e=>e.type==="password",computed:{inputType(){return{creditcard:"text",hostname:"text",domain:"text"}[this.type]||this.type},inputValue:{get(){return this.type==="password"&&this.value===void 0&&!this.focused?Hl:this.value},set(e){this.value=e}}},methods:{getValidations(){const e={email:"email",url:"url",hostname:"hostname",domain:"domain",password:"password",creditcard:"creditcard"}[this.type];return e?{[e]:!0}:{}}}}),Kl=b(Wl,[["render",Ul]]),Yl=["id","rows"];function Jl(e,t,o,s,a,i){return n.withDirectives((n.openBlock(),n.createElementBlock("textarea",n.mergeProps({class:"dito-textarea dito-input",id:e.dataPath,ref:"element","onUpdate:modelValue":t[0]||(t[0]=r=>e.value=r)},e.attributes,{rows:e.lines,class:{"dito-resizable":e.resizable}}),null,16,Yl)),[[n.vModelText,e.value]])}const Zc="",Ql=D.register("textarea",{nativeField:!0,textField:!0,alignBottom:!1,computed:{lines(){return this.schema.lines||4},resizable:y("resizable",{type:Boolean,default:!1})}}),Gl=b(Ql,[["render",Jl]]),Xl={class:"dito-tree-list"},Zl={class:"dito-tree-panel"},vl={key:0,class:"dito-tree-form-container"};function xl(e,t,o,s,a,i){const r=n.resolveComponent("DitoScopes"),l=n.resolveComponent("DitoTreeItem"),d=n.resolveComponent("RouterView");return n.openBlock(),n.createElementBlock("div",Xl,[e.scopes?(n.openBlock(),n.createBlock(r,{key:0,query:e.query,scopes:e.scopes},null,8,["query","scopes"])):n.createCommentVNode("",!0),n.createElementVNode("div",Zl,[n.createVNode(l,{schema:e.treeSchema,dataPath:e.treeDataPath,data:e.treeData,draggable:e.draggable,open:!0},null,8,["schema","dataPath","data","draggable"]),e.hasEditableForms?(n.openBlock(),n.createElementBlock("div",vl,[n.createVNode(d)])):n.createCommentVNode("",!0)])])}const vc="",ed=D.register(["tree-list","tree-object"],{mixins:[Y],alignBottom:!1,provide(){return{container:this}},getSourceType(e){return e==="tree-object"?"object":"list"},computed:{path(){var e;return(e=this.formComponent)==null?void 0:e.path},editPath(){var e;return this.$route.path.slice((e=this.path)==null?void 0:e.length)},treeData(){return this.isListSource?{[this.name]:this.value}:this.value},treeDataPath(){return this.isListSource?this.dataPath.slice(0,this.dataPath.length-this.name.length):this.dataPath},treeSchema(){return this.isListSource?{children:{name:this.name,...this.schema}}:this.schema},hasEditableForms(){const e=t=>I(t)&&(this.getSchemaValue("editable",{type:Boolean,default:!1,schema:t})||t.children&&e(t.children));return e(this.schema)}},async processSchema(e,t,o,s,a,i=!0,r=!1,l=null){await Promise.all([Ye(t.properties),Y.processSchema(e,t,o,s,a,i,r,(d,h)=>{const{children:u}=t;if(u)return u.type="tree-list",this.processSchema(e,u,u.name,d,h,i,!0,l)})])},getFormSchemasForProcessing(e,t){const{children:o}=e;return H(e,t,o?s=>({...s,components:{...s.components,[o.name]:o}}):null)}}),td=b(ed,[["render",xl]]);function zt(e){return fn.filesize(e,{base:10})}const nd={class:"dito-upload"},od={class:"dito-table dito-table-separators dito-table-background"},sd=n.createElementVNode("thead",{class:"dito-table-head"},[n.createElementVNode("tr",null,[n.createElementVNode("th",null,[n.createElementVNode("span",null,"Name")]),n.createElementVNode("th",null,[n.createElementVNode("span",null,"Size")]),n.createElementVNode("th",null,[n.createElementVNode("span",null,"Status")]),n.createElementVNode("th",null,[n.createElementVNode("span")])])],-1),ad=["innerHTML"],rd={class:"dito-cell-edit-buttons"},id={class:"dito-buttons dito-buttons-round"},ld=["onClick"],dd={colspan:4},cd={class:"dito-upload-footer"},hd=["value"],ud={class:"dito-buttons dito-buttons-round"};function pd(e,t,o,s,a,i){const r=n.resolveComponent("DitoDraggable"),l=n.resolveComponent("VueUpload");return n.openBlock(),n.createElementBlock("div",nd,[n.createElementVNode("table",od,[sd,n.createVNode(r,{modelValue:e.files,"onUpdate:modelValue":t[0]||(t[0]=d=>e.files=d),tag:"tbody",options:e.getSortableOptions(!1),draggable:e.draggable},{default:n.withCtx(()=>[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.files,(d,h)=>(n.openBlock(),n.createElementBlock("tr",{key:d.key},[n.createElementVNode("td",{innerHTML:e.renderFile(d,h)},null,8,ad),n.createElementVNode("td",null,n.toDisplayString(e.formatFileSize(d.size)),1),n.createElementVNode("td",null,[d.upload?(n.openBlock(),n.createElementBlock(n.Fragment,{key:0},[d.upload.error?(n.openBlock(),n.createElementBlock(n.Fragment,{key:0},[n.createTextVNode("Error: "+n.toDisplayString(d.upload.error),1)],64)):d.upload.active?(n.openBlock(),n.createElementBlock(n.Fragment,{key:1},[n.createTextVNode("Uploading...")],64)):d.upload.success?(n.openBlock(),n.createElementBlock(n.Fragment,{key:2},[n.createTextVNode("Uploaded")],64)):n.createCommentVNode("",!0)],64)):(n.openBlock(),n.createElementBlock(n.Fragment,{key:1},[n.createTextVNode("Stored")],64))]),n.createElementVNode("td",rd,[n.createElementVNode("div",id,[e.draggable?(n.openBlock(),n.createElementBlock("a",n.mergeProps({key:0,class:"dito-button"},e.getButtonAttributes(e.verbs.drag)),null,16)):n.createCommentVNode("",!0),e.deletable?(n.openBlock(),n.createElementBlock("button",n.mergeProps({key:1,class:"dito-button",type:"button"},e.getButtonAttributes(e.verbs.delete),{onClick:u=>e.deleteFile(d,h)}),null,16,ld)):n.createCommentVNode("",!0)])])]))),128))]),_:1},8,["modelValue","options","draggable"]),n.createElementVNode("tfoot",null,[n.createElementVNode("tr",null,[n.createElementVNode("td",dd,[n.createElementVNode("div",cd,[e.isUploadActive?(n.openBlock(),n.createElementBlock("progress",{key:0,class:"dito-progress",value:e.uploadProgress,max:"100"},null,8,hd)):n.createCommentVNode("",!0),n.createElementVNode("div",ud,[e.isUploadActive?(n.openBlock(),n.createElementBlock("button",{key:0,class:"dito-button",type:"button",onClick:t[1]||(t[1]=n.withModifiers(d=>e.upload.active=!1,["prevent"]))},"Cancel All")):e.isUploadReady?(n.openBlock(),n.createElementBlock("button",{key:1,class:"dito-button",type:"button",onClick:t[2]||(t[2]=n.withModifiers(d=>e.upload.active=!0,["prevent"]))},"Upload All")):n.createCommentVNode("",!0),n.createVNode(l,{class:"dito-button dito-button-add-upload",ref:"upload",modelValue:e.uploads,"onUpdate:modelValue":t[3]||(t[3]=d=>e.uploads=d),inputId:e.dataPath,name:e.dataPath,disabled:e.disabled,postAction:e.uploadPath,extensions:e.extensions,accept:e.accept,multiple:e.multiple,size:e.maxSize,title:"Upload Files",onInputFilter:e.inputFilter,onInputFile:e.inputFile},null,8,["modelValue","inputId","name","disabled","postAction","extensions","accept","multiple","size","onInputFilter","onInputFile"])])])])])])])])}const xc="",md=D.register("upload",{mixins:[Oe],components:{VueUpload:gn},alignBottom:!1,data(){return{uploads:[]}},computed:{upload(){return this.$refs.upload},files(){return At(this.value)},multiple:y("multiple",{type:Boolean,default:!1,callback:!1}),extensions:y("extensions",{type:[Array,String,RegExp]}),accept:y("accept",{type:Array,get(e){return c.isArray(e)?e.join(","):e}}),maxSize:y("maxSize",{type:[String,Number],get(e){return e?mn(e):void 0}}),draggable:y("draggable",{type:Boolean,default:!1,get(e){return e&&this.files.length>1}}),deletable:y("deletable",{type:Boolean,default:!1}),isUploadReady(){return this.uploads.length&&!(this.upload.active||this.upload.uploaded)},isUploadActive(){return this.uploads.length&&this.upload.active},uploadProgress(){return this.uploads.reduce((e,t)=>e+t.progress,0)/this.uploads.length},uploadPath(){return this.getResourceUrl({type:"upload",path:this.api.normalizePath(this.dataPath)})}},methods:{formatFileSize:zt,renderFile(e,t){const{render:o}=this.schema;return o?o.call(this,new V(this,{value:e,data:this.files,index:t,dataPath:F(this.dataPath,t)})):c.escapeHtml(e.name)},deleteFile(e,t){const{name:o}=e;e&&window.confirm(`Do you really want to ${this.verbs.remove} ${o}?`)&&(this.multiple?this.value.splice(t,1):this.value=null,e.upload&&this.upload.remove(e.upload),this.onChange(),this.notify({type:"info",title:"Successfully Removed",text:`${o} was ${this.verbs.deleted}.`}))},getFileIndex(e){return this.multiple&&this.value?this.value.findIndex(t=>t.id===e.id):-1},addFile(e){this.multiple?this.value?this.value.push(e):this.value=[e]:this.value=e},replaceFile(e,t){if(this.multiple){const o=this.getFileIndex(e);o>=0&&(t?this.value[o]=t:this.value.splice(o,1))}else this.value=t},removeFile(e){this.replaceFile(e,null)},inputFile(e,t){if(e&&!t){const{id:o,name:s,size:a}=e;this.addFile({id:o,name:s,size:a,upload:e})}if(e&&t){const{success:o,error:s}=e;if(o){this.onChange();const a=e.response[0];a?(a.upload=e,this.replaceFile(e,a)):this.removeFile(e)}else if(s){const a={abort:"Upload aborted",denied:"Upload denied",extension:`Unsupported file-type: ${e.name}`,network:"Network error encountered during upload",server:"Server error occurred during upload",size:`File is too large: ${zt(e.size)}`,timeout:"Timeout occurred during upload"}[s]||`Unknown File Upload Error: '${s}'`;this.notify({type:"error",title:"File Upload Error",text:a}),this.removeFile(e)}}},inputFilter(e){var o;const t=e==null?void 0:e.xhr;(o=this.api.cors)!=null&&o.credentials&&t&&!t.withCredentials&&(t.withCredentials=!0)}},processValue(e,t){const o=At(t).map(({upload:s,...a})=>!s||s.success?a:null).filter(s=>s);return e.multiple?o:o[0]||null}});function At(e){return e?c.asArray(e):[]}const fd=Object.freeze(Object.defineProperty({__proto__:null,DitoDitoTypeComponent:ci,DitoTypeButton:Ur,DitoTypeCheckbox:Yr,DitoTypeCheckboxes:Zr,DitoTypeCode:ti,DitoTypeColor:ii,DitoTypeComputed:mi,DitoTypeDate:yi,DitoTypeLabel:qi,DitoTypeList:_i,DitoTypeMarkup:Qi,DitoTypeMultiselect:vi,DitoTypeNumber:nl,DitoTypeObject:dl,DitoTypePanel:cl,DitoTypeProgress:ml,DitoTypeRadio:kl,DitoTypeSection:Bl,DitoTypeSelect:Ll,DitoTypeSlider:Rl,DitoTypeSwitch:zl,DitoTypeText:Kl,DitoTypeTextarea:Gl,DitoTypeTreeList:td,DitoTypeUpload:b(md,[["render",pd]])},Symbol.toStringTag,{value:"Module"})),Ut=new Set;function gd(e){Ut.has(e)||(Ut.add(e),console.warn(e))}function bd(e){const t=e?c.isArray(e)?e:Object.entries(e):[];return new URLSearchParams(t.reduce((o,[s,a])=>{for(const i of c.asArray(a))o.push([s,i]);return o},[])).toString().replaceAll(/%(?:21|24|28|29|2C|2F|3A|3B|3D|3F|40)/g,decodeURIComponent)}const yd=["create","created","save","saved","submit","submitted","delete","deleted","edit","edited","clear","cleared","close","closed","cancel","cancelled","drag","dragged","login","logged in"].reduce((e,t)=>(e[t]=t,e),{});class kd{constructor(t,{dito:o={},api:s,views:a={},...i}={}){this.el=t,this.api=s=c.merge({base:"/"},o.api,s),this.options=i,s.locale||(s.locale="en-US"),s.formats=c.merge({},c.defaultFormats,s.formats),s.request||(s.request=d=>$d(s,d)),s.getApiUrl||(s.getApiUrl=d=>Dd(s,d)),s.isApiUrl||(s.isApiUrl=d=>Bd(s,d)),s.normalizePath||(s.normalizePath=s.normalizePaths?c.hyphenate:d=>d),s.denormalizePath||(s.denormalizePath=s.normalizePaths?c.camelize:d=>d),s.defaults||(s.defaults={});const r=T(s.users,{type:"collection"})||{};r.login=T(r.login||"login",{method:"post",parent:r}),r.logout=T(r.logout||"logout",{method:"post",parent:r}),r.session=T(r.session||"session",{method:"get",parent:r}),s.users=r,s.resources={any(d){const h=this[d==null?void 0:d.type]||this.default;return d&&h.call(this,d)},default(d){const h=this.any(d.parent);return h?`${h}/${d.path}`:d.path},collection(d){return this.default(d)},member(d){return`${d.path}/${d.id}`},upload(d){return`${this.collection(d.parent)}/upload/${d.path}`},...s.resources},s.headers={"Content-Type":"application/json",...s.headers},c.isString(t)&&(t=document.querySelector(t));const l=this.app=n.createApp({components:{DitoRoot:Ee,VueNotifications:R,...qr,...fd},provide:{api:s,$verbs:()=>yd,$views:()=>{},$isPopulated:()=>!0,$parentComponent:()=>null,$schemaComponent:()=>null,$schemaParentComponent:()=>null,$routeComponent:()=>null,$dataComponent:()=>null,$sourceComponent:()=>null,$resourceComponent:()=>null,$dialogComponent:()=>null,$panelComponent:()=>null,$tabComponent:()=>null},render:()=>n.h(Ee,{ref:"root",class:o.settings.rootClass,unresolvedViews:a,options:i})});l.use(R,{name:"notify",componentName:"VueNotifications"}),l.use(O.createRouter({routes:[{name:"catch-all",path:"/:_(.*)",components:{}}],history:O.createWebHistory(o.base),linkActiveClass:"",linkExactActiveClass:""})),t.classList.add("dito-app"),l.mount(t)}register(t,o){return D.register(t,o)}}class Cd extends Error{constructor(t){super(`Request failed with status code: ${t.status} (${t.statusText})`),this.response=t}}async function $d(e,{url:t,method:o="get",params:s=null,query:a=s||null,headers:i=null,data:r=null}){var h,u;s&&gd("request.params is deprecated. Use action.method and action.path instead.");const l=e.isApiUrl(t),d=await fetch(e.getApiUrl({url:t,query:a}),{method:o.toUpperCase(),...r&&{body:JSON.stringify(r)},headers:{...l&&e.headers,...i},credentials:l&&((h=e.cors)!=null&&h.credentials)?"include":"same-origin"});if((u=d.headers.get("Content-Type"))!=null&&u.includes("application/json")&&(d.data=await d.json()),!d.ok)throw new Cd(d);return d}function Bd(e,t){return!c.isAbsoluteUrl(t)||t.startsWith(e.url)}function Dd(e,{url:t,query:o}){c.isAbsoluteUrl(t)||(t=wd(e.url,t));const s=bd(o);return s?`${t}?${s}`:t}function wd(e,t){return`${e.replace(/\/+$/,"")}/${t.replace(/^\/+/,"")}`}return kd});
6
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGl0by1hZG1pbi51bWQuanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9hcHBTdGF0ZS5qcyIsIi4uL3NyYy91dGlscy9kYXRhLmpzIiwiLi4vc3JjL0RpdG9Db250ZXh0LmpzIiwiLi4vc3JjL21peGlucy9FbWl0dGVyTWl4aW4uanMiLCIuLi9zcmMvdXRpbHMvdHlwZS5qcyIsIi4uL3NyYy91dGlscy9yZXNvdXJjZS5qcyIsIi4uL3NyYy9taXhpbnMvRGl0b01peGluLmpzIiwiLi4vc3JjL3ZhbGlkYXRpb25zL19jcmVkaXRjYXJkLmpzIiwiLi4vc3JjL3ZhbGlkYXRpb25zL19kZWNpbWFscy5qcyIsIi4uL3NyYy92YWxpZGF0aW9ucy9fZG9tYWluLmpzIiwiLi4vc3JjL3ZhbGlkYXRpb25zL19lbWFpbC5qcyIsIi4uL3NyYy92YWxpZGF0aW9ucy9faG9zdG5hbWUuanMiLCIuLi9zcmMvdmFsaWRhdGlvbnMvX2ludGVnZXIuanMiLCIuLi9zcmMvdmFsaWRhdGlvbnMvX21heC5qcyIsIi4uL3NyYy92YWxpZGF0aW9ucy9fbWluLmpzIiwiLi4vc3JjL3ZhbGlkYXRpb25zL19wYXNzd29yZC5qcyIsIi4uL3NyYy92YWxpZGF0aW9ucy9fcmFuZ2UuanMiLCIuLi9zcmMvdmFsaWRhdGlvbnMvX3JlcXVpcmVkLmpzIiwiLi4vc3JjL3ZhbGlkYXRpb25zL191cmwuanMiLCIuLi9zcmMvbWl4aW5zL1ZhbGlkYXRpb25NaXhpbi5qcyIsIi4uL3NyYy91dGlscy9hY2Nlc3Nvci5qcyIsIi4uL3NyYy9taXhpbnMvVHlwZU1peGluLmpzIiwiLi4vc3JjL3V0aWxzL3VpZC5qcyIsIi4uL3NyYy91dGlscy9TY2hlbWFHcmFwaC5qcyIsIi4uL3NyYy91dGlscy9zY2hlbWEuanMiLCIuLi9zcmMvdXRpbHMvb3B0aW9ucy5qcyIsIi4uL3NyYy9EaXRvQ29tcG9uZW50LmpzIiwiLi4vc3JjL0RpdG9Vc2VyLmpzIiwiLi4vc3JjL21peGlucy9TY2hlbWFQYXJlbnRNaXhpbi5qcyIsIi4uL3NyYy9taXhpbnMvVmFsaWRhdG9yTWl4aW4uanMiLCIuLi9zcmMvbWl4aW5zL1JvdXRlTWl4aW4uanMiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvVmlldy52dWUiLCIuLi8uLi91aS9zcmMvdXRpbHMvZGF0ZS5qcyIsIi4uLy4uL3VpL3NyYy9jb21wb25lbnRzL0NhbGVuZGFyLnZ1ZSIsIi4uLy4uL3VpL3NyYy91dGlscy9ldmVudC5qcyIsIi4uLy4uL3VpL3NyYy9jb21wb25lbnRzL1RyaWdnZXIudnVlIiwiLi4vLi4vdWkvc3JjL2NvbXBvbmVudHMvSW5wdXRGaWVsZC52dWUiLCIuLi8uLi91aS9zcmMvY29tcG9uZW50cy9EYXRlUGlja2VyLnZ1ZSIsIi4uLy4uL3VpL3NyYy91dGlscy9zY3JvbGwuanMiLCIuLi8uLi91aS9zcmMvdXRpbHMvc2VsZWN0aW9uLmpzIiwiLi4vLi4vdWkvc3JjL2NvbXBvbmVudHMvVGltZVBpY2tlci52dWUiLCIuLi8uLi91aS9zcmMvY29tcG9uZW50cy9EYXRlVGltZVBpY2tlci52dWUiLCIuLi8uLi91aS9zcmMvY29tcG9uZW50cy9JY29uLnZ1ZSIsIi4uLy4uL3VpL3NyYy9jb21wb25lbnRzL1BhZ2luYXRpb24udnVlIiwiLi4vLi4vdWkvc3JjL2NvbXBvbmVudHMvU3dpdGNoQnV0dG9uLnZ1ZSIsIi4uLy4uL3VpL3NyYy90cmFuc2l0aW9ucy9UcmFuc2l0aW9uSGVpZ2h0LnZ1ZSIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9AdnVldXNlL2ludGVncmF0aW9ucy91c2VGb2N1c1RyYXAvY29tcG9uZW50Lm1qcyIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9EaWFsb2cudnVlIiwiLi4vc3JjL21peGlucy9Eb21NaXhpbi5qcyIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9Sb290LnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9NZW51LnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9TcGlubmVyLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9IZWFkZXIudnVlIiwiLi4vc3JjL21peGlucy9QdWxsZG93bk1peGluLmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b0FjY291bnQudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b0VsZW1lbnQudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b0xhYmVsLnZ1ZSIsIi4uL3NyYy9taXhpbnMvSXRlbU1peGluLmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b1NjaGVtYS52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvU2NoZW1hSW5saW5lZC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvUGFuZS52dWUiLCIuLi9zcmMvdXRpbHMvbWF0aC5qcyIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9Db250YWluZXIudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b1RhYnMudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b1BhbmVsLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9QYW5lbHMudnVlIiwiLi4vc3JjL3V0aWxzL3Z1ZS5qcyIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9CdXR0b25zLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9FZGl0QnV0dG9ucy52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvQ3JlYXRlQnV0dG9uLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9DbGlwYm9hcmQudnVlIiwiLi4vc3JjL21peGlucy9Mb2FkaW5nTWl4aW4uanMiLCIuLi9zcmMvbWl4aW5zL1Jlc291cmNlTWl4aW4uanMiLCIuLi9zcmMvdXRpbHMvcGF0aC5qcyIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9Gb3JtLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9Gb3JtTmVzdGVkLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RpdG9FcnJvcnMudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b1Njb3Blcy52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvUGFnaW5hdGlvbi52dWUiLCIuLi9zcmMvbWl4aW5zL1NvcnRhYmxlTWl4aW4uanMiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvVHJlZUl0ZW0udnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b1RhYmxlSGVhZC52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvVGFibGVDZWxsLnZ1ZSIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9AdnVldXNlL2ludGVncmF0aW9ucy91c2VTb3J0YWJsZS9jb21wb25lbnQubWpzIiwiLi4vc3JjL2NvbXBvbmVudHMvRGl0b0RyYWdnYWJsZS52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9EaXRvVk5vZGUudnVlIiwiLi4vc3JjL0RpdG9UeXBlQ29tcG9uZW50LmpzIiwiLi4vc3JjL3R5cGVzL0RpdG9UeXBlQnV0dG9uLnZ1ZSIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZUNoZWNrYm94LnZ1ZSIsIi4uL3NyYy9taXhpbnMvRGF0YU1peGluLmpzIiwiLi4vc3JjL21peGlucy9PcHRpb25zTWl4aW4uanMiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVDaGVja2JveGVzLnZ1ZSIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZUNvZGUudnVlIiwiLi4vc3JjL3R5cGVzL0RpdG9UeXBlQ29sb3IudnVlIiwiLi4vc3JjL3R5cGVzL0RpdG9UeXBlQ29tcG9uZW50LnZ1ZSIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZUNvbXB1dGVkLnZ1ZSIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZURhdGUudnVlIiwiLi4vc3JjL21peGlucy9Tb3VyY2VNaXhpbi5qcyIsIi4uL3NyYy91dGlscy9maWx0ZXIuanMiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVMaXN0LnZ1ZSIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZUxhYmVsLnZ1ZSIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZU1hcmt1cC52dWUiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVNdWx0aXNlbGVjdC52dWUiLCIuLi9zcmMvbWl4aW5zL051bWJlck1peGluLmpzIiwiLi4vc3JjL3R5cGVzL0RpdG9UeXBlTnVtYmVyLnZ1ZSIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZU9iamVjdC52dWUiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVQYW5lbC52dWUiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVQcm9ncmVzcy52dWUiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVSYWRpby52dWUiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVTZWN0aW9uLnZ1ZSIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZVNlbGVjdC52dWUiLCIuLi9zcmMvdHlwZXMvRGl0b1R5cGVTbGlkZXIudnVlIiwiLi4vc3JjL3R5cGVzL0RpdG9UeXBlU3dpdGNoLnZ1ZSIsIi4uL3NyYy90eXBlcy9EaXRvVHlwZVRleHQudnVlIiwiLi4vc3JjL3R5cGVzL0RpdG9UeXBlVGV4dGFyZWEudnVlIiwiLi4vc3JjL3R5cGVzL0RpdG9UeXBlVHJlZUxpc3QudnVlIiwiLi4vc3JjL3V0aWxzL3VuaXRzLmpzIiwiLi4vc3JjL3R5cGVzL0RpdG9UeXBlVXBsb2FkLnZ1ZSIsIi4uL3NyYy91dGlscy9kZXByZWNhdGUuanMiLCIuLi9zcmMvdXRpbHMvcm91dGUuanMiLCIuLi9zcmMvdmVyYnMuanMiLCIuLi9zcmMvRGl0b0FkbWluLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlYWN0aXZlIH0gZnJvbSAndnVlJ1xuXG5leHBvcnQgZGVmYXVsdCByZWFjdGl2ZSh7XG4gIHRpdGxlOiAnJyxcbiAgcm91dGVDb21wb25lbnRzOiBbXSxcbiAgdXNlcjogbnVsbCxcbiAgbG9hZENhY2hlOiB7fSwgLy8gU2VlIFR5cGVNaXhpbi5sb2FkKClcbiAgYWN0aXZlTGFiZWw6IG51bGwsXG4gIGNsaXBib2FyZERhdGE6IG51bGxcbn0pXG4iLCJpbXBvcnQge1xuICBpc0ludGVnZXIsXG4gIHBhcnNlRGF0YVBhdGgsXG4gIGdldFZhbHVlQXREYXRhUGF0aCxcbiAgbm9ybWFsaXplRGF0YVBhdGhcbn0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGVuZERhdGFQYXRoKGRhdGFQYXRoLCB0b2tlbikge1xuICByZXR1cm4gZGF0YVBhdGhcbiAgICA/IGAke2RhdGFQYXRofS8ke3Rva2VufWBcbiAgICA6IHRva2VuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVBhcmVudERhdGFQYXRoKGRhdGFQYXRoKSB7XG4gIGNvbnN0IHBhdGggPSBwYXJzZURhdGFQYXRoKGRhdGFQYXRoKVxuICBwYXRoPy5wb3AoKVxuICByZXR1cm4gcGF0aFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFyZW50RGF0YVBhdGgoZGF0YVBhdGgpIHtcbiAgcmV0dXJuIG5vcm1hbGl6ZURhdGFQYXRoKHBhcnNlUGFyZW50RGF0YVBhdGgoZGF0YVBhdGgpKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VJdGVtRGF0YVBhdGgoZGF0YVBhdGgsIG5lc3RlZCA9IGZhbHNlKSB7XG4gIHJldHVybiBuZXN0ZWQgPyBwYXJzZVBhcmVudERhdGFQYXRoKGRhdGFQYXRoKSA6IHBhcnNlRGF0YVBhdGgoZGF0YVBhdGgpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJdGVtRGF0YVBhdGgoZGF0YVBhdGgsIG5lc3RlZCA9IGZhbHNlKSB7XG4gIHJldHVybiBub3JtYWxpemVEYXRhUGF0aChwYXJzZUl0ZW1EYXRhUGF0aChkYXRhUGF0aCwgbmVzdGVkKSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUGFyZW50SXRlbURhdGFQYXRoKGRhdGFQYXRoLCBuZXN0ZWQgPSBmYWxzZSkge1xuICBjb25zdCBwYXRoID0gcGFyc2VJdGVtRGF0YVBhdGgoZGF0YVBhdGgsIG5lc3RlZClcbiAgaWYgKHBhdGgpIHtcbiAgICAvLyBSZW1vdmUgdGhlIHBhcmVudCB0b2tlbi4gSWYgaXQncyBhIG51bWJlciwgdGhlbiB3ZSdyZSBkZWFsaW5nIHdpdGggYW5cbiAgICAvLyBhcnJheSBhbmQgbmVlZCB0byByZW1vdmUgbW9yZSB0b2tlbnMgdW50aWwgd2UgbWVldCB0aGUgYWN0dWFsIHBhcmVudDpcbiAgICBsZXQgdG9rZW5cbiAgICBkbyB7XG4gICAgICB0b2tlbiA9IHBhdGgucG9wKClcbiAgICB9IHdoaWxlICh0b2tlbiAhPSBudWxsICYmIGlzSW50ZWdlcigrdG9rZW4pKVxuICAgIC8vIElmIHRoZSByZW1vdmVkIHRva2VuIGlzIHZhbGlkLCB3ZSBjYW4gZ2V0IHRoZSBwYXJlbnQgZGF0YTpcbiAgICBpZiAodG9rZW4gIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHBhdGhcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhcmVudEl0ZW1EYXRhUGF0aChkYXRhUGF0aCwgbmVzdGVkID0gZmFsc2UpIHtcbiAgcmV0dXJuIG5vcm1hbGl6ZURhdGFQYXRoKHBhcnNlUGFyZW50SXRlbURhdGFQYXRoKGRhdGFQYXRoLCBuZXN0ZWQpKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SXRlbShyb290SXRlbSwgZGF0YVBhdGgsIG5lc3RlZCA9IGZhbHNlKSB7XG4gIGNvbnN0IHBhdGggPSBwYXJzZUl0ZW1EYXRhUGF0aChkYXRhUGF0aCwgbmVzdGVkKVxuICByZXR1cm4gcGF0aCA/IGdldFZhbHVlQXREYXRhUGF0aChyb290SXRlbSwgcGF0aCkgOiBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYXJlbnRJdGVtKHJvb3RJdGVtLCBkYXRhUGF0aCwgbmVzdGVkID0gZmFsc2UpIHtcbiAgY29uc3QgcGF0aCA9IHBhcnNlUGFyZW50SXRlbURhdGFQYXRoKGRhdGFQYXRoLCBuZXN0ZWQpXG4gIHJldHVybiBwYXRoID8gZ2V0VmFsdWVBdERhdGFQYXRoKHJvb3RJdGVtLCBwYXRoKSA6IG51bGxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExhc3REYXRhUGF0aFRva2VuKGRhdGFQYXRoKSB7XG4gIGNvbnN0IHBhdGggPSBwYXJzZURhdGFQYXRoKGRhdGFQYXRoKVxuICByZXR1cm4gcGF0aFtwYXRoLmxlbmd0aCAtIDFdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXN0RGF0YVBhdGhOYW1lKGRhdGFQYXRoKSB7XG4gIGNvbnN0IHRva2VuID0gZ2V0TGFzdERhdGFQYXRoVG9rZW4oZGF0YVBhdGgpXG4gIHJldHVybiB0b2tlbiA9PSBudWxsIHx8IGlzSW50ZWdlcigrdG9rZW4pID8gbnVsbCA6IHRva2VuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXN0RGF0YVBhdGhJbmRleChkYXRhUGF0aCkge1xuICBjb25zdCB0b2tlbiA9IGdldExhc3REYXRhUGF0aFRva2VuKGRhdGFQYXRoKVxuICBjb25zdCBpbmRleCA9IHRva2VuID09IG51bGwgPyBudWxsIDogK3Rva2VuXG4gIHJldHVybiBpc0ludGVnZXIoaW5kZXgpID8gaW5kZXggOiBudWxsXG59XG5cbmxldCB0ZW1wb3JhcnlJZCA9IDBcbmV4cG9ydCBmdW5jdGlvbiBzZXRUZW1wb3JhcnlJZChkYXRhLCBpZEtleSA9ICdpZCcpIHtcbiAgLy8gVGVtcG9yYXJ5IGlkcyBhcmUgbWFya2VkIHdpdGggYSAnQCcgYXQgdGhlIGJlZ2lubmluZy5cbiAgZGF0YVtpZEtleV0gPSBgQCR7Kyt0ZW1wb3JhcnlJZH1gXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1RlbXBvcmFyeUlkKGlkKSB7XG4gIHJldHVybiAvXkAvLnRlc3QoaWQpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1JlZmVyZW5jZShkYXRhLCBpZEtleSA9ICdpZCcpIHtcbiAgLy8gUmV0dXJucyB0cnVlIGlmIHZhbHVlIGlzIGFuIG9iamVjdCB0aGF0IGhvbGRzIG5vdGhpbmcgbW9yZSB0aGFuIGFuIGlkLlxuICByZXR1cm4gZGF0YT8uW2lkS2V5XSAhPSBudWxsICYmIE9iamVjdC5rZXlzKGRhdGEpLmxlbmd0aCA9PT0gMVxufVxuIiwiaW1wb3J0IHsgdG9SYXcgfSBmcm9tICd2dWUnXG5pbXBvcnQgeyBpc0Z1bmN0aW9uIH0gZnJvbSAnQGRpdG9qcy91dGlscydcbmltcG9ydCB7XG4gIGdldEl0ZW1EYXRhUGF0aCxcbiAgZ2V0UGFyZW50SXRlbURhdGFQYXRoLFxuICBnZXRQYXJlbnRJdGVtLFxuICBnZXRJdGVtLFxuICBnZXRMYXN0RGF0YVBhdGhOYW1lLFxuICBnZXRMYXN0RGF0YVBhdGhJbmRleFxufSBmcm9tICcuL3V0aWxzL2RhdGEuanMnXG5cbmNvbnN0IHsgaGFzT3duUHJvcGVydHkgfSA9IE9iamVjdC5wcm90b3R5cGVcblxuLy8gYERpdG9Db250ZXh0YCBpbnN0YW5jZXMgYXJlIGEgdGhpbiB3cmFwcGVyIGFyb3VuZCByYXcgYGNvbnRleHRgIG9iamVjdHMsXG4vLyB3aGljaCB0aGVtc2VsdmVzIGFjdHVhbGx5IGluaGVyaXQgZnJvbSB0aGUgbGlua2VkIGBjb21wb25lbnRgIGluc3RhbmNlLCBzb1xuLy8gdGhhdCB0aGV5IG9ubHkgbmVlZCB0byBwcm92aWRlIHRoZSB2YWx1ZXMgdGhhdCBzaG91bGQgYmUgZGlmZmVyZW50IHRoYW5cbi8vIGluIHRoZSB1bmRlcmx5aW5nIGNvbXBvbmVudC4gSW4gb3JkZXIgdG8gbm90IGV4cG9zZSBhbGwgZmllbGRzIGZyb20gdGhlXG4vLyBjb21wb25lbnQsIHRoZSB3cmFwcGVyIGlzIGludHJvZHVjZWQ6XG4vLyBVc2UgV2Vha01hcCBmb3IgdGhlIHJhdyBgY29udGV4dGAgb2JqZWN0cywgc28gd2UgZG9uJ3QgaGF2ZSB0byBwb2xsdXRlIHRoZVxuLy8gYWN0dWFsIGBEaXRvQ29udGV4dGAgaW5zdGFuY2Ugd2l0aCBpdC5cbmNvbnN0IGNvbnRleHRzID0gbmV3IFdlYWtNYXAoKVxuXG5mdW5jdGlvbiBnZXQoY29udGV4dCwga2V5LCBkZWZhdWx0VmFsdWUpIHtcbiAgY29uc3Qgb2JqZWN0ID0gY29udGV4dHMuZ2V0KHRvUmF3KGNvbnRleHQpKVxuICBjb25zdCB2YWx1ZSA9IG9iamVjdFtrZXldXG4gIC8vIElmIGBvYmplY3RgIGV4cGxpY2l0bHkgc2V0cyB0aGUga2V5IHRvIGB1bmRlZmluZWRgLCByZXR1cm4gaXQuXG4gIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkIHx8IGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpXG4gICAgPyB2YWx1ZVxuICAgIDogaXNGdW5jdGlvbihkZWZhdWx0VmFsdWUpXG4gICAgICA/IGRlZmF1bHRWYWx1ZSgpXG4gICAgICA6IGRlZmF1bHRWYWx1ZVxufVxuXG5mdW5jdGlvbiBzZXQoY29udGV4dCwga2V5LCB2YWx1ZSkge1xuICBjb250ZXh0cy5nZXQodG9SYXcoY29udGV4dCkpW2tleV0gPSB2YWx1ZVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEaXRvQ29udGV4dCB7XG4gIGNvbnN0cnVjdG9yKGNvbXBvbmVudCwgY29udGV4dCkge1xuICAgIC8vIFVzZSB0aGUgcHJvdmlkZWQgcGFyYW1zIG9iamVjdCAvIGZ1bmN0aW9uLCBvciBjcmVhdGUgYSBuZXcgb25lOlxuICAgIGNvbnRleHQgPSBjb250ZXh0XG4gICAgICA/IGlzRnVuY3Rpb24oY29udGV4dClcbiAgICAgICAgPyBjb250ZXh0KClcbiAgICAgICAgOiB7IC4uLmNvbnRleHQgfVxuICAgICAgOiB7fVxuICAgIC8vIElmIG5vdCBleHBsaWNpdGx5IHNldCAodG8gZmFsc2UpLCBkZWZhdWx0IHRvIHRydWUgc28gd2UgZG9uJ3QgZmFsbCBiYWNrXG4gICAgLy8gdG8gYGNvbXBvbmVudGAgZm9yIGl0cyB2YWx1ZS5cbiAgICBjb250ZXh0Lm5lc3RlZCA/Pz0gdHJ1ZVxuICAgIGNvbnRleHQuY29tcG9uZW50ID0gY29tcG9uZW50XG4gICAgLy8gSGF2ZSBgb2JqZWN0YCBpbmhlcml0IGZyb20gdGhlIGBjb21wb25lbnRgIGluc3RhbmNlLCBzbyBpdCBjYW4gb3ZlcnJpZGVcbiAgICAvLyBpdHMgdmFsdWVzIGFuZCBzdGlsbCByZXRyaWV2ZSBmcm9tIGl0LCBhbmQgYXNzb2NpYXRlIGl0IHdpdGggYHRoaXNgXG4gICAgLy8gdGhyb3VnaCBgY29udGV4dHNgIG1hcDpcbiAgICBjb25zdCBvYmplY3QgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YoY29udGV4dCwgY29tcG9uZW50KVxuICAgIC8vIE5vIG5lZWQgZm9yIGB0b1Jhdyh0aGlzKWAgaGVyZSBhcyBpdCdzIGFsd2F5cyByYXcgaW5zaWRlIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICBjb250ZXh0cy5zZXQodGhpcywgb2JqZWN0KVxuICB9XG5cbiAgc3RhdGljIGdldChjb21wb25lbnQsIGNvbnRleHQpIHtcbiAgICByZXR1cm4gY29udGV4dCBpbnN0YW5jZW9mIERpdG9Db250ZXh0XG4gICAgICA/IGNvbnRleHRcbiAgICAgIDogbmV3IERpdG9Db250ZXh0KGNvbXBvbmVudCwgY29udGV4dClcbiAgfVxuXG4gIC8vIGBuZXN0ZWRgIGlzIGB0cnVlYCB3aGVuIHRoZSBkYXRhLXBhdGggcG9pbnRzIGEgdmFsdWUgaW5zaWRlIGFuIGl0ZW0sIGFuZFxuICAvLyBgZmFsc2VgIHdoZW4gaXQgcG9pbnRzIHRvIHRoZSBpdGVtIGl0c2VsZi5cbiAgZ2V0IG5lc3RlZCgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICduZXN0ZWQnLCB0cnVlKVxuICB9XG5cbiAgZ2V0IHNjaGVtYSgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdzY2hlbWEnLCBudWxsKVxuICB9XG5cbiAgZ2V0IHZhbHVlKCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ3ZhbHVlJywgdW5kZWZpbmVkKVxuICB9XG5cbiAgZ2V0IGRhdGFQYXRoKCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ2RhdGFQYXRoJywgJycpXG4gIH1cblxuICBnZXQgbmFtZSgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICduYW1lJywgKCkgPT4gZ2V0TGFzdERhdGFQYXRoTmFtZSh0aGlzLmRhdGFQYXRoKSlcbiAgfVxuXG4gIGdldCBpbmRleCgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdpbmRleCcsICgpID0+IGdldExhc3REYXRhUGF0aEluZGV4KHRoaXMuZGF0YVBhdGgpKVxuICB9XG5cbiAgZ2V0IGl0ZW1EYXRhUGF0aCgpIHtcbiAgICByZXR1cm4gZ2V0SXRlbURhdGFQYXRoKHRoaXMuZGF0YVBhdGgsIHRoaXMubmVzdGVkKVxuICB9XG5cbiAgZ2V0IHBhcmVudEl0ZW1EYXRhUGF0aCgpIHtcbiAgICByZXR1cm4gZ2V0UGFyZW50SXRlbURhdGFQYXRoKHRoaXMuZGF0YVBhdGgsIHRoaXMubmVzdGVkKVxuICB9XG5cbiAgZ2V0IGl0ZW1JbmRleCgpIHtcbiAgICByZXR1cm4gZ2V0TGFzdERhdGFQYXRoSW5kZXgodGhpcy5pdGVtRGF0YVBhdGgpXG4gIH1cblxuICBnZXQgcGFyZW50SXRlbUluZGV4KCkge1xuICAgIHJldHVybiBnZXRMYXN0RGF0YVBhdGhJbmRleCh0aGlzLnBhcmVudEl0ZW1EYXRhUGF0aClcbiAgfVxuXG4gIC8vIE5PVEU6IFdoaWxlIGludGVybmFsbHksIHdlIHNwZWFrIG9mIGBkYXRhYCwgaW4gdGhlIEFQSSBzdXJmYWNlIHRoZVxuICAvLyB0ZXJtIGBpdGVtYCBpcyB1c2VkIGZvciB0aGUgZGF0YSB0aGF0IHJlbGF0ZXMgdG8gZWRpdGluZyBvYmplY3RzOlxuICAvLyBJZiBgZGF0YWAgaXNuJ3QgcHJvdmlkZWQsIHdlIGNhbiBkZXRlcm1pbmUgaXQgZnJvbSByb290RGF0YSAmIGRhdGFQYXRoOlxuICBnZXQgaXRlbSgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdkYXRhJywgKCkgPT5cbiAgICAgIGdldEl0ZW0odGhpcy5yb290SXRlbSwgdGhpcy5kYXRhUGF0aCwgdGhpcy5uZXN0ZWQpXG4gICAgKVxuICB9XG5cbiAgLy8gTk9URTogYHBhcmVudEl0ZW1gIGlzbid0IHRoZSBjbG9zZXN0IGRhdGEgcGFyZW50IHRvIGBpdGVtYCwgaXQncyB0aGVcbiAgLy8gY2xvc2VzdCBwYXJlbnQgdGhhdCBpc24ndCBhbiBhcnJheSwgZS5nLiBmb3IgcmVsYXRpb25zIG9yIG5lc3RlZCBKU09OIGRhdGEuXG4gIC8vIFRoaXMgaXMgd2h5IHRoZSB0ZXJtIGBpdGVtYCB3YXMgY2hvc2VuIG92ZXIgYGRhdGFgLCBlLmcuIFZTIHRoZSB1c2Ugb2ZcbiAgLy8gYHBhcmVudERhdGFgIGluIHNlcnZlci1zaWRlZCB2YWxpZGF0aW9uLCB3aGljaCBpcyB0aGUgY2xvc2VzdCBwYXJlbnQuIElmXG4gIC8vIG5lZWRlZCwgd2UgY291bGQgZXhwb3NlIHRoaXMgZGF0YSBoZXJlIHRvbywgYXMgd2UgY2FuIGRvIGFsbCBzb3J0cyBvZiBkYXRhXG4gIC8vIHByb2Nlc3Npbmcgd2l0aCBgcm9vdERhdGFgIGFuZCBgZGF0YVBhdGhgLlxuICBnZXQgcGFyZW50SXRlbSgpIHtcbiAgICBjb25zdCBpdGVtID0gKFxuICAgICAgZ2V0UGFyZW50SXRlbSh0aGlzLnJvb3RJdGVtLCB0aGlzLmRhdGFQYXRoLCB0aGlzLm5lc3RlZCkgfHxcbiAgICAgIG51bGxcbiAgICApXG4gICAgcmV0dXJuIGl0ZW0gIT09IHRoaXMuaXRlbSA/IGl0ZW0gOiBudWxsXG4gIH1cblxuICBnZXQgcm9vdEl0ZW0oKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAncm9vdERhdGEnLCBudWxsKVxuICB9XG5cbiAgZ2V0IHByb2Nlc3NlZEl0ZW0oKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAncHJvY2Vzc2VkRGF0YScsIG51bGwpXG4gIH1cblxuICBnZXQgY2xpcGJvYXJkSXRlbSgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdjbGlwYm9hcmREYXRhJywgbnVsbClcbiAgfVxuXG4gIGdldCB1c2VyKCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ3VzZXInLCBudWxsKVxuICB9XG5cbiAgZ2V0IGFwaSgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdhcGknLCBudWxsKVxuICB9XG5cbiAgZ2V0IHZpZXdzKCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ3ZpZXdzJywgbnVsbClcbiAgfVxuXG4gIGdldCBpdGVtTGFiZWwoKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAnaXRlbUxhYmVsJywgbnVsbClcbiAgfVxuXG4gIGdldCBmb3JtTGFiZWwoKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAnZm9ybUxhYmVsJywgbnVsbClcbiAgfVxuXG4gIC8vIE5PVEU6IExpa2UgJ29wdGlvbnMnLCB0aGUgYXNzb2NpYXRlZCBjb21wb25lbnQgZG9lc24ndCBhbHdheXMgZXhpc3QsIGUuZy5cbiAgLy8gaW4gbmVzdGVkIGZvcm1zIGR1cmluZyBgcHJvY2Vzc0RhdGEoKWAuIEJ1dCBgc2NoZW1hYCBpcyBndWFyYW50ZWVkIHRvXG4gIC8vIGFsd2F5cyBiZSBhdmFpbGFibGUuXG4gIGdldCBjb21wb25lbnQoKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAnY29tcG9uZW50JywgbnVsbClcbiAgfVxuXG4gIC8vIFRPRE86IEFkZCBgY29tcG9uZW50U2NoZW1hYCBnZXR0ZXIgZm9yIHRoZSBzY2hlbWEgb2YgdGhlIGN1cnJlbnQgY29tcG9uZW50LFxuICAvLyBldmVuIHdoZW4gdGhlIGNvbXBvbmVudCBpc24ndCBhY3R1YWxseSBpbnN0YW50aWF0ZWQuIENvbnNpZGVyIGFkZGluZ1xuICAvLyBgc291cmNlU2NoZW1hYCBhcyB3ZWxsP1xuXG4gIC8vIFRPRE86IEZpeCB1bmNsZWFyIG5hbWluZzogV2hpY2ggc2NoZW1hIGlzIHRoaXMsIHRoYXQgb2YgdGhlIGNvbXBvbmVudCBvciBvZlxuICAvLyBpdHMgcGFyZW50PyBJc24ndCBleHBvc2luZyBgZm9ybUNvbXBvbmVudGAgYW5kIGB2aWV3Q29tcG9uZW50YCBlbm91Z2gsIG9uY2VcbiAgLy8gd2Ugb2ZmZXIgYWNjZXNzIHRvIHRoZWlyIGNvbXBvbmVudHMgdGhlcmUgdGhyb3VnaCBgZ2V0Q29tcG9uZW50KClgICYgY28uIG9uXG4gIC8vIGBEaXRvTWl4aW5gIHBlcmhhcHM/ICBBbHNvLCB0aGVyZSBjb3VsZCBiZSBhIGB0YWJDb21wb25lbnRgIGdldHRlciBmb3JcbiAgLy8gc2NoZW1hcyBpbiB0YWJzP1xuICBnZXQgc2NoZW1hQ29tcG9uZW50KCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ3NjaGVtYUNvbXBvbmVudCcsIG51bGwpXG4gIH1cblxuICBnZXQgZm9ybUNvbXBvbmVudCgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdmb3JtQ29tcG9uZW50JywgbnVsbClcbiAgfVxuXG4gIGdldCB2aWV3Q29tcG9uZW50KCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ3ZpZXdDb21wb25lbnQnLCBudWxsKVxuICB9XG5cbiAgZ2V0IGRpYWxvZ0NvbXBvbmVudCgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdkaWFsb2dDb21wb25lbnQnLCBudWxsKVxuICB9XG5cbiAgZ2V0IHBhbmVsQ29tcG9uZW50KCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ3BhbmVsQ29tcG9uZW50JywgbnVsbClcbiAgfVxuXG4gIGdldCByZXNvdXJjZUNvbXBvbmVudCgpIHtcbiAgICByZXR1cm4gZ2V0KHRoaXMsICdyZXNvdXJjZUNvbXBvbmVudCcsIG51bGwpXG4gIH1cblxuICBnZXQgc291cmNlQ29tcG9uZW50KCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ3NvdXJjZUNvbXBvbmVudCcsIG51bGwpXG4gIH1cblxuICAvLyBXaGVuIHVzZWQgaW4gT3B0aW9uc01peGluIGZvciBgc2NoZW1hLm9wdGlvbnMudmFsdWUoKWAsXG4gIC8vIGBzY2hlbWEub3B0aW9ucy5sYWJlbCgpYCBhbmQgIGBzY2hlbWEuc2VhcmNoLmZpbHRlcigpYCBjYWxsYmFja3M6XG4gIGdldCBvcHRpb24oKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAnb3B0aW9uJywgdW5kZWZpbmVkKVxuICB9XG5cbiAgZ2V0IG9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAnb3B0aW9ucycsIHVuZGVmaW5lZClcbiAgfVxuXG4gIC8vIFRPRE86IFJlbmFtZSB0aGlzIHRvIGBzZWFyY2hUZXJtYCBvciBgc2VhcmNoUXVlcnlgLCB0byBwZXJoYXBzIGZyZWUgYHF1ZXJ5YFxuICAvLyBmb3IgdGhlIGFjdHVhbCBgcmVzb3VyY2VDb21wb25lbnQucXVlcnlgIG9iamVjdD9cbiAgZ2V0IHF1ZXJ5KCkge1xuICAgIHJldHVybiBnZXQodGhpcywgJ3F1ZXJ5JywgdW5kZWZpbmVkKVxuICB9XG5cbiAgLy8gVGhlIGVycm9yIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIGluIHRoZSBjb250ZXh0IG9mIGJ1dHRvbnMgdGhhdCBzZW5kXG4gIC8vIHJlcXVlc3RzLCBzZWUgYFJlc291cmNlTWl4aW4uZW1pdEJ1dHRvbkV2ZW50KClgOlxuICBnZXQgZXJyb3IoKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAnZXJyb3InLCB1bmRlZmluZWQpXG4gIH1cblxuICBnZXQgd2FzTm90aWZpZWQoKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCAnd2FzTm90aWZpZWQnLCBmYWxzZSlcbiAgfVxuXG4gIC8vIEhlbHBlciBNZXRob2RzXG5cbiAgZ2V0IHJlcXVlc3QoKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMgPT4gdGhpcy5jb21wb25lbnQucmVxdWVzdChvcHRpb25zKVxuICB9XG5cbiAgZ2V0IGZvcm1hdCgpIHtcbiAgICByZXR1cm4gKHZhbHVlLCBvcHRpb25zKSA9PiB0aGlzLmNvbXBvbmVudC5mb3JtYXQodmFsdWUsIG9wdGlvbnMpXG4gIH1cblxuICBnZXQgbmF2aWdhdGUoKSB7XG4gICAgcmV0dXJuIGxvY2F0aW9uID0+IHRoaXMuY29tcG9uZW50Lm5hdmlnYXRlKGxvY2F0aW9uKVxuICB9XG5cbiAgZ2V0IGRvd25sb2FkKCkge1xuICAgIHJldHVybiBvcHRpb25zID0+IHRoaXMuY29tcG9uZW50LmRvd25sb2FkKG9wdGlvbnMpXG4gIH1cblxuICBnZXQgZ2V0UmVzb3VyY2VVcmwoKSB7XG4gICAgcmV0dXJuIHJlc291cmNlID0+IHRoaXMuY29tcG9uZW50LmdldFJlc291cmNlVXJsKHJlc291cmNlKVxuICB9XG5cbiAgZ2V0IG5vdGlmeSgpIHtcbiAgICByZXR1cm4gb3B0aW9ucyA9PiB7XG4gICAgICB0aGlzLmNvbXBvbmVudC5ub3RpZnkob3B0aW9ucylcbiAgICAgIHNldCh0aGlzLCAnd2FzTm90aWZpZWQnLCB0cnVlKVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNBcnJheSwgaXNQbGFpbk9iamVjdCB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCB7XG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxpc3RlbmVyczogbnVsbFxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgLy8gQXN5bmMgb24oKSBhbmQgJG9mZigpIG1ldGhvZHMgdGhhdCBrZWVwIHRyYWNrIG9mIHRoZSBldmVudHMgYWRkZWQgL1xuICAgIC8vIHJlbW92ZWQsIGFuZCBwcm92aWRlIGEgaGFzTGlzdGVuZXJzKCkgbWV0aG9kIHRoYXQgY2hlY2tzIGlmIHRoZSBjb21wb25lbnRcbiAgICAvLyBoYXMgbGlzdGVuZXJzIGZvciBhIGdpdmVuIGV2ZW50LlxuXG4gICAgLy8gQWxzbyBhZGRzIHByb3BlciBoYW5kbGluZyBvZiBhc3luYyBldmVudHMsIGluY2x1ZGluZyBhIGFzeW5jIGVtaXQoKSB0aGF0XG4gICAgLy8gZGVhbHMgd2l0aCBwcm9wZXIgZXZlbnQgcXVldWVpbmcuXG4gICAgb24oZXZlbnQsIGNhbGxiYWNrKSB7XG4gICAgICBpZiAoaXNBcnJheShldmVudCkpIHtcbiAgICAgICAgZm9yIChjb25zdCBldiBvZiBldmVudCkge1xuICAgICAgICAgIHRoaXMub24oZXYsIGNhbGxiYWNrKVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QoZXZlbnQpKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGV2ZW50KSB7XG4gICAgICAgICAgdGhpcy5vbihrZXksIGV2ZW50W2tleV0pXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGxpc3RlbmVycyA9ICh0aGlzLmxpc3RlbmVycyB8fD0gT2JqZWN0LmNyZWF0ZShudWxsKSlcbiAgICAgICAgY29uc3QgeyBjYWxsYmFja3MgfSA9IChsaXN0ZW5lcnNbZXZlbnRdIHx8PSB7XG4gICAgICAgICAgY2FsbGJhY2tzOiBbXSxcbiAgICAgICAgICBxdWV1ZTogW11cbiAgICAgICAgfSlcbiAgICAgICAgY2FsbGJhY2tzLnB1c2goY2FsbGJhY2spXG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH0sXG5cbiAgICBvbmNlKGV2ZW50LCBjYWxsYmFjaykge1xuICAgICAgY29uc3Qgb24gPSAoLi4uYXJncykgPT4ge1xuICAgICAgICB0aGlzLm9mZihldmVudCwgb24pXG4gICAgICAgIHJldHVybiBjYWxsYmFjay5hcHBseSh0aGlzLCBhcmdzKVxuICAgICAgfVxuICAgICAgb24uY2FsbGJhY2sgPSBjYWxsYmFjayAvLyBOZWVkZWQgZm9yIGBvZmYoKWAsIHNlZSBiZWxvdy5cbiAgICAgIHJldHVybiB0aGlzLm9uKGV2ZW50LCBvbilcbiAgICB9LFxuXG4gICAgb2ZmKGV2ZW50LCBjYWxsYmFjaykge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAgIC8vIFJlbW92ZSBhbGwgZXZlbnRzXG4gICAgICAgIGRlbGV0ZSB0aGlzLmxpc3RlbmVyc1xuICAgICAgfSBlbHNlIGlmIChpc0FycmF5KGV2ZW50KSkge1xuICAgICAgICBmb3IgKGNvbnN0IGV2IG9mIGV2ZW50KSB7XG4gICAgICAgICAgdGhpcy5vZmYoZXYsIGNhbGxiYWNrKVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QoZXZlbnQpKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGV2ZW50KSB7XG4gICAgICAgICAgdGhpcy5vZmYoa2V5LCBldmVudFtrZXldKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBSZW1vdmUgc3BlY2lmaWMgZXZlbnRcbiAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmxpc3RlbmVycz8uW2V2ZW50XVxuICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICBpZiAoIWNhbGxiYWNrKSB7XG4gICAgICAgICAgICAvLyBSZW1vdmUgYWxsIGhhbmRsZXJzIGZvciB0aGlzIGV2ZW50XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5saXN0ZW5lcnNbZXZlbnRdXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFJlbW92ZSBhIHNwZWNpZmljIGhhbmRsZXI6IGZpbmQgdGhlIGluZGV4IGluIGNhbGxiYWNrc1xuICAgICAgICAgICAgY29uc3QgeyBjYWxsYmFja3MgfSA9IGVudHJ5XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IGNhbGxiYWNrcy5maW5kSW5kZXgoXG4gICAgICAgICAgICAgIC8vIE1hdGNoIGBjYi5jYWxsYmFja2AgYWxzbywgYXMgdXNlZCBieSBgb25jZSgpYCwgc2VlICBhYm92ZTpcbiAgICAgICAgICAgICAgY2IgPT4gY2IgPT09IGNhbGxiYWNrIHx8IGNiLmNhbGxiYWNrID09PSBjYWxsYmFja1xuICAgICAgICAgICAgKVxuICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICBjYWxsYmFja3Muc3BsaWNlKGluZGV4LCAxKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9LFxuXG4gICAgZW1pdChldmVudCwgLi4uYXJncykge1xuICAgICAgLy8gT25seSBxdWV1ZSBldmVudCBpZiB0aGVyZSBhY3R1YWxseSBhcmUgbGlzdGVuZXJzIGZvciBpdC5cbiAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5saXN0ZW5lcnM/LltldmVudF1cbiAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICBjb25zdCB7IHF1ZXVlLCBjYWxsYmFja3MgfSA9IGVudHJ5XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICBjb25zdCBuZXh0ID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgLy8gRW1pdCB0aGUgbmV4dCBldmVudCBpbiB0aGUgcXVldWUgd2l0aCBpdHMgcGFyYW1zLlxuICAgICAgICAgICAgLy8gTm90ZSB0aGF0IGl0IG9ubHkgZ2V0cyByZW1vdmVkIG9uY2UgYG5leHQoKWAgaXMgY2FsbGVkLlxuICAgICAgICAgICAgY29uc3QgZW50cnkgPSBxdWV1ZS5zaGlmdCgpXG4gICAgICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICAgICAgbGV0IHJlc3VsdFxuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNhbGxiYWNrIG9mIGNhbGxiYWNrcykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBjYWxsYmFjay5hcHBseSh0aGlzLCBlbnRyeS5hcmdzKVxuICAgICAgICAgICAgICAgICAgaWYgKHJlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgRXJyb3IgZHVyaW5nIGV2ZW50IGhhbmRsZXIgZm9yICcke2V2ZW50fSc6YCxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gUmVzb2x2ZSB0aGUgcHJvbWlzZSB0aGF0IHdhcyBhZGRlZCB0byB0aGUgcXVldWUgZm9yIHRoZSBldmVudFxuICAgICAgICAgICAgICAvLyB0aGF0IHdhcyBqdXN0IGNvbXBsZXRlZCBieSB0aGUgd3JhcHBlciB0aGF0IGNhbGxlZCBgbmV4dCgpYFxuICAgICAgICAgICAgICBlbnRyeS5yZXNvbHZlKHJlc3VsdClcbiAgICAgICAgICAgICAgbmV4dCgpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHF1ZXVlLnB1c2goeyBhcmdzLCByZXNvbHZlIH0pXG4gICAgICAgICAgLy8gRm9yIG5ldyBxdWV1ZXMgKD0gb25seSBvbmUgZW50cnkpIGVtaXQgdGhlIGZpcnN0IGV2ZW50IGltbWVkaWF0ZWx5LFxuICAgICAgICAgIC8vIHRvIGdldCB0aGUgcXVldWUgcnVubmluZy5cbiAgICAgICAgICBpZiAocXVldWUubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBuZXh0KClcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSxcblxuICAgIC8vIENoZWNrcyBpZiB0aGUgY29tcG9uZW50IGhhcyBsaXN0ZW5lcnMgZm9yIGEgZ2l2ZW4gZXZlbnQgdHlwZTpcbiAgICBoYXNMaXN0ZW5lcnMoZXZlbnQpIHtcbiAgICAgIGlmIChpc0FycmF5KGV2ZW50KSkge1xuICAgICAgICBmb3IgKGNvbnN0IGV2IG9mIGV2ZW50KSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmhhc0xpc3RlbmVycyhldikpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXZlbnQubGVuZ3RoID4gMFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5saXN0ZW5lcnM/LltldmVudF1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZGVsZWdhdGUoZXZlbnQsIHRhcmdldCkge1xuICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICBpZiAoaXNBcnJheShldmVudCkpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGV2IG9mIGV2ZW50KSB7XG4gICAgICAgICAgICB0aGlzLmRlbGVnYXRlKGV2LCB0YXJnZXQpXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMub24oZXZlbnQsICguLi5hcmdzKSA9PiB0YXJnZXQuZW1pdChldmVudCwgLi4uYXJncykpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQge1xuICBpc0FycmF5LFxuICBpc09iamVjdCxcbiAgaXNTdHJpbmcsXG4gIGlzQm9vbGVhbixcbiAgaXNOdW1iZXIsXG4gIGlzRnVuY3Rpb24sXG4gIGlzRGF0ZSxcbiAgaXNSZWdFeHAsXG4gIGFzQXJyYXlcbn0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuY29uc3QgdHlwZUNoZWNrZXJzID0ge1xuICBCb29sZWFuOiBpc0Jvb2xlYW4sXG4gIE51bWJlcjogaXNOdW1iZXIsXG4gIFN0cmluZzogaXNTdHJpbmcsXG4gIERhdGU6IGlzRGF0ZSxcbiAgQXJyYXk6IGlzQXJyYXksXG4gIE9iamVjdDogaXNPYmplY3QsXG4gIFJlZ0V4cDogaXNSZWdFeHAsXG4gIEZ1bmN0aW9uOiBpc0Z1bmN0aW9uXG59XG5cbi8vIERlY2xhcmUgdGhlc2Ugc2VwYXJhdGVseSBmcm9tIHRoZSBgdHlwZUNvbnZlcnRlcnNgIG9iamVjdCwgdG8gcHJldmVudFxuLy8gQmFiZWwgaXNzdWVzIHdpdGggYE9iamVjdGAgb3ZlcnJpZGluZyB0aGUgZ2xvYmFsIGBPYmplY3RgOlxuY29uc3QgdG9Cb29sZWFuID0gdmFsdWUgPT4gISF2YWx1ZVxuY29uc3QgdG9OdW1iZXIgPSB2YWx1ZSA9PiArdmFsdWVcbmNvbnN0IHRvU3RyaW5nID0gdmFsdWUgPT4gU3RyaW5nKHZhbHVlKVxuXG5jb25zdCB0b0RhdGUgPSB2YWx1ZSA9PlxuICBpc0RhdGUodmFsdWUpXG4gICAgPyB2YWx1ZVxuICAgIDogbmV3IERhdGUodmFsdWUpXG5cbmNvbnN0IHRvQXJyYXkgPSB2YWx1ZSA9PlxuICBpc0FycmF5KHZhbHVlKVxuICAgID8gdmFsdWVcbiAgICA6IGlzU3RyaW5nKHZhbHVlKVxuICAgICAgPyB2YWx1ZS5zcGxpdCgnLCcpXG4gICAgICA6IGFzQXJyYXkodmFsdWUpXG5cbmNvbnN0IHRvT2JqZWN0ID0gdmFsdWUgPT5cbiAgaXNPYmplY3QodmFsdWUpXG4gICAgPyB2YWx1ZVxuICAgIDogLy8gSWYgYSBPYmplY3QgaXMgZXhwZWN0ZWQgYnV0IGEgQm9vbGVhbiBwcm92aWRlLCBjb252ZXJ0IHRvIGFuIGVtcHR5XG4gICAgICAvLyBvYmplY3QuIFVzZWQgYnkgYGNyZWF0YWJsZWAgJiBjbywgdGhhdCBjYW4gYmUgYm90aC5cbiAgICAgIHZhbHVlID09PSB0cnVlXG4gICAgICA/IHt9XG4gICAgICA6IG51bGxcblxuY29uc3QgdG9SZWdFeHAgPSB2YWx1ZSA9PlxuICBpc1JlZ0V4cCh2YWx1ZSlcbiAgICA/IHZhbHVlXG4gICAgOiBuZXcgUmVnRXhwKHZhbHVlKVxuXG5jb25zdCB0eXBlQ29udmVydGVycyA9IHtcbiAgQm9vbGVhbjogdG9Cb29sZWFuLFxuICBOdW1iZXI6IHRvTnVtYmVyLFxuICBTdHJpbmc6IHRvU3RyaW5nLFxuICBEYXRlOiB0b0RhdGUsXG4gIEFycmF5OiB0b0FycmF5LFxuICBPYmplY3Q6IHRvT2JqZWN0LFxuICBSZWdFeHA6IHRvUmVnRXhwXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc01hdGNoaW5nVHlwZSh0eXBlcywgdmFsdWUpIHtcbiAgLy8gU2VlIGlmIGFueSBvZiB0aGUgZXhwZWN0IHR5cGVzIG1hdGNoLCByZXR1cm4gaW1tZWRpYXRlbHkgaWYgdGhleSBkbzpcbiAgaWYgKHR5cGVzICYmIHZhbHVlICE9IG51bGwpIHtcbiAgICBmb3IgKGNvbnN0IHR5cGUgb2YgdHlwZXMpIHtcbiAgICAgIGlmICh0eXBlQ2hlY2tlcnNbdHlwZS5uYW1lXT8uKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRUeXBlKHR5cGUsIHZhbHVlKSB7XG4gIGNvbnN0IGNvbnZlcnRlciA9IHR5cGUgJiYgdHlwZUNvbnZlcnRlcnNbdHlwZS5uYW1lIHx8IHR5cGVdXG4gIHJldHVybiBjb252ZXJ0ZXIgPyBjb252ZXJ0ZXIodmFsdWUpIDogdmFsdWVcbn1cbiIsImltcG9ydCB7IGlzT2JqZWN0LCBpc1N0cmluZywgcGlja0J5IH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuZXhwb3J0IGZ1bmN0aW9uIGhhc1Jlc291cmNlKHNjaGVtYSkge1xuICByZXR1cm4gISFnZXRSZXNvdXJjZShzY2hlbWEucmVzb3VyY2UpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZXNvdXJjZShyZXNvdXJjZSwgZGVmYXVsdHMgPSB7fSkge1xuICBjb25zdCB7IHBhcmVudCwgLi4uZGVmcyB9ID0gZGVmYXVsdHNcbiAgcmVzb3VyY2UgPSBpc09iamVjdChyZXNvdXJjZSlcbiAgICA/IHsgLi4uZGVmcywgLi4ucmVzb3VyY2UgfVxuICAgIDogaXNTdHJpbmcocmVzb3VyY2UpXG4gICAgICA/IHsgLi4uZGVmcywgcGF0aDogcmVzb3VyY2UgfVxuICAgICAgOiBudWxsXG4gIC8vIE9ubHkgc2V0IHBhcmVudCBpZiBwYXRoIGRvZXNuJ3Qgc3RhcnQgd2l0aCAnLycsIHNvIHJlbGF0aXZlIFVSTHMgYXJlXG4gIC8vIGRlYWx0IHdpdGggY29ycmVjdGx5LlxuICBpZiAoXG4gICAgcmVzb3VyY2UgJiZcbiAgICBwYXJlbnQgIT09IHVuZGVmaW5lZCAmJlxuICAgIHJlc291cmNlLnBhcmVudCA9PT0gdW5kZWZpbmVkICYmXG4gICAgIXJlc291cmNlLnBhdGg/LnN0YXJ0c1dpdGgoJy8nKVxuICApIHtcbiAgICByZXNvdXJjZS5wYXJlbnQgPSBwYXJlbnRcbiAgICBpZiAoIXJlc291cmNlLnBhdGgpIHtcbiAgICAgIHJlc291cmNlLnBhdGggPSAnLidcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc291cmNlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNZW1iZXJSZXNvdXJjZShpZCwgcmVzb3VyY2UpIHtcbiAgcmV0dXJuIGlkICE9IG51bGwgJiYgcmVzb3VyY2U/LnR5cGUgPT09ICdjb2xsZWN0aW9uJ1xuICAgID8ge1xuICAgICAgICB0eXBlOiAnbWVtYmVyJyxcbiAgICAgICAgLi4ucGlja0J5KFxuICAgICAgICAgIHJlc291cmNlLFxuICAgICAgICAgICh2YWx1ZSwga2V5KSA9PiBbJ21ldGhvZCcsICdwYXRoJywgJ3BhcmVudCddLmluY2x1ZGVzKGtleSlcbiAgICAgICAgKSxcbiAgICAgICAgaWQ6IGAke2lkfWBcbiAgICAgIH1cbiAgICA6IG51bGxcbn1cbiIsImltcG9ydCB7XG4gIGlzT2JqZWN0LFxuICBpc0FycmF5LFxuICBpc1N0cmluZyxcbiAgaXNGdW5jdGlvbixcbiAgYXNBcnJheSxcbiAgZXF1YWxzLFxuICBnZXRWYWx1ZUF0RGF0YVBhdGgsXG4gIGxhYmVsaXplLFxuICBoeXBoZW5hdGUsXG4gIGZvcm1hdFxufSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IGFwcFN0YXRlIGZyb20gJy4uL2FwcFN0YXRlLmpzJ1xuaW1wb3J0IERpdG9Db250ZXh0IGZyb20gJy4uL0RpdG9Db250ZXh0LmpzJ1xuaW1wb3J0IEVtaXR0ZXJNaXhpbiBmcm9tICcuL0VtaXR0ZXJNaXhpbi5qcydcbmltcG9ydCB7IGlzTWF0Y2hpbmdUeXBlLCBjb252ZXJ0VHlwZSB9IGZyb20gJy4uL3V0aWxzL3R5cGUuanMnXG5pbXBvcnQgeyBnZXRSZXNvdXJjZSwgZ2V0TWVtYmVyUmVzb3VyY2UgfSBmcm9tICcuLi91dGlscy9yZXNvdXJjZS5qcydcbmltcG9ydCB7IHJlYWN0aXZlIH0gZnJvbSAndnVlJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQge1xuICBtaXhpbnM6IFtFbWl0dGVyTWl4aW5dLFxuXG4gIGluamVjdDogW1xuICAgICdhcGknLFxuICAgICckdmVyYnMnLFxuICAgICckdmlld3MnLFxuICAgICckaXNQb3B1bGF0ZWQnLFxuICAgICckcGFyZW50Q29tcG9uZW50JyxcbiAgICAnJHNjaGVtYUNvbXBvbmVudCcsXG4gICAgJyRyb3V0ZUNvbXBvbmVudCcsXG4gICAgJyRkYXRhQ29tcG9uZW50JyxcbiAgICAnJHNvdXJjZUNvbXBvbmVudCcsXG4gICAgJyRyZXNvdXJjZUNvbXBvbmVudCcsXG4gICAgJyRkaWFsb2dDb21wb25lbnQnLFxuICAgICckcGFuZWxDb21wb25lbnQnLFxuICAgICckdGFiQ29tcG9uZW50J1xuICBdLFxuXG4gIHByb3ZpZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvdmlkZXNEYXRhXG4gICAgICA/IHtcbiAgICAgICAgICAkcGFyZW50Q29tcG9uZW50OiAoKSA9PiB0aGlzLFxuICAgICAgICAgICRkYXRhQ29tcG9uZW50OiAoKSA9PiB0aGlzXG4gICAgICAgIH1cbiAgICAgIDoge1xuICAgICAgICAgICRwYXJlbnRDb21wb25lbnQ6ICgpID0+IHRoaXNcbiAgICAgICAgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFwcFN0YXRlLFxuICAgICAgb3ZlcnJpZGVzOiBudWxsIC8vIFNlZSBhY2Nlc3Nvci5qc1xuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIHByb3ZpZGVzRGF0YSgpIHtcbiAgICAgIC8vIE5PVEU6IFRoaXMgaXMgb3ZlcnJpZGRlbiBpbiBSZXNvdXJjZU1peGluLCB1c2VkIGJ5IGxpc3RzLlxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSxcblxuICAgIHNvdXJjZVNjaGVtYSgpIHtcbiAgICAgIHJldHVybiB0aGlzLm1ldGE/LnNjaGVtYVxuICAgIH0sXG5cbiAgICB1c2VyKCkge1xuICAgICAgcmV0dXJuIGFwcFN0YXRlLnVzZXJcbiAgICB9LFxuXG4gICAgLy8gJHZlcmJzLCAkdmVyYnMgYW5kICRpc1BvcHVsYXRlZCBhcmUgZGVmaW5lZCBhcyBmdW5jdGlvbnMsIHRvIHByZXNlcnZlXG4gICAgLy8gcmVhY3RpdmVuZXNzIGFjcm9zcyBwcm92aWRlL2luamVjdC5cbiAgICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS92dWVqcy92dWUvaXNzdWVzLzcwMTcjaXNzdWVjb21tZW50LTQ4MDkwNjY5MVxuICAgIHZlcmJzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuJHZlcmJzKClcbiAgICB9LFxuXG4gICAgdmlld3MoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kdmlld3MoKVxuICAgIH0sXG5cbiAgICBpc1BvcHVsYXRlZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLiRpc1BvcHVsYXRlZCgpXG4gICAgfSxcblxuICAgIGxvY2FsZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmFwaS5sb2NhbGVcbiAgICB9LFxuXG4gICAgY29udGV4dCgpIHtcbiAgICAgIHJldHVybiBuZXcgRGl0b0NvbnRleHQodGhpcywgeyBuZXN0ZWQ6IGZhbHNlIH0pXG4gICAgfSxcblxuICAgIHJvb3RDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kcm9vdC4kcmVmcy5yb290XG4gICAgfSxcblxuICAgIC8vIFVzZSBjb21wdXRlZCBwcm9wZXJ0aWVzIGFzIGxpbmtzIHRvIGluamVjdHMsIHNvIERpdG9TY2hlbWEgY2FuXG4gICAgLy8gb3ZlcnJpZGUgdGhlIHByb3BlcnR5IGFuZCByZXR1cm4gYHRoaXNgIGluc3RlYWQgb2YgdGhlIHBhcmVudC5cbiAgICBwYXJlbnRDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kcGFyZW50Q29tcG9uZW50KClcbiAgICB9LFxuXG4gICAgc2NoZW1hQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMuJHNjaGVtYUNvbXBvbmVudCgpXG4gICAgfSxcblxuICAgIHJvdXRlQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMuJHJvdXRlQ29tcG9uZW50KClcbiAgICB9LFxuXG4gICAgZm9ybUNvbXBvbmVudCgpIHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMucm91dGVDb21wb25lbnRcbiAgICAgIHJldHVybiBjb21wb25lbnQ/LmlzRm9ybSA/IGNvbXBvbmVudCA6IG51bGxcbiAgICB9LFxuXG4gICAgdmlld0NvbXBvbmVudCgpIHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMucm91dGVDb21wb25lbnRcbiAgICAgIHJldHVybiBjb21wb25lbnQ/LmlzVmlldyA/IGNvbXBvbmVudCA6IG51bGxcbiAgICB9LFxuXG4gICAgLy8gUmV0dXJucyB0aGUgZmlyc3Qgcm91dGUgY29tcG9uZW50IGluIHRoZSBjaGFpbiBvZiBwYXJlbnRzLCBpbmNsdWRpbmdcbiAgICAvLyB0aGlzIGN1cnJlbnQgY29tcG9uZW50LCB0aGF0IGlzIGxpbmtlZCB0byBhIHJlc291cmNlIChhbmQgdGh1cyBsb2FkcyBpdHNcbiAgICAvLyBvd24gZGF0YSBhbmQgZG9lc24ndCBob2xkIG5lc3RlZCBkYXRhKS5cbiAgICBkYXRhQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMucHJvdmlkZXNEYXRhID8gdGhpcyA6IHRoaXMuJGRhdGFDb21wb25lbnQoKVxuICAgIH0sXG5cbiAgICBzb3VyY2VDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kc291cmNlQ29tcG9uZW50KClcbiAgICB9LFxuXG4gICAgcmVzb3VyY2VDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kcmVzb3VyY2VDb21wb25lbnQoKVxuICAgIH0sXG5cbiAgICBkaWFsb2dDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kZGlhbG9nQ29tcG9uZW50KClcbiAgICB9LFxuXG4gICAgcGFuZWxDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kcGFuZWxDb21wb25lbnQoKVxuICAgIH0sXG5cbiAgICB0YWJDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kdGFiQ29tcG9uZW50KClcbiAgICB9LFxuXG4gICAgcGFyZW50U2NoZW1hQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hQ29tcG9uZW50Py5wYXJlbnRDb21wb25lbnQuc2NoZW1hQ29tcG9uZW50XG4gICAgfSxcblxuICAgIHBhcmVudFJvdXRlQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMucm91dGVDb21wb25lbnQ/LnBhcmVudENvbXBvbmVudC5yb3V0ZUNvbXBvbmVudFxuICAgIH0sXG5cbiAgICBwYXJlbnRGb3JtQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMuZm9ybUNvbXBvbmVudD8ucGFyZW50Q29tcG9uZW50LmZvcm1Db21wb25lbnRcbiAgICB9LFxuXG4gICAgLy8gUmV0dXJucyB0aGUgZGF0YSBvZiB0aGUgZmlyc3Qgcm91dGUgY29tcG9uZW50IGluIHRoZSBjaGFpbiBvZiBwYXJlbnRzXG4gICAgLy8gdGhhdCBsb2FkcyBpdHMgb3duIGRhdGEgZnJvbSBhbiBhc3NvY2lhdGVkIEFQSSByZXNvdXJjZS5cbiAgICByb290RGF0YSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFDb21wb25lbnQ/LmRhdGFcbiAgICB9XG4gIH0sXG5cbiAgYmVmb3JlQ3JlYXRlKCkge1xuICAgIGNvbnN0IHVpZCA9IG5leHRVaWQrK1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnJHVpZCcsIHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHVpZFxuICAgICAgfVxuICAgIH0pXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGxhYmVsaXplLFxuXG4gICAgLy8gVGhlIHN0YXRlIG9mIGNvbXBvbmVudHMgaXMgb25seSBhdmFpbGFibGUgZHVyaW5nIHRoZSBsaWZlLWN5Y2xlIG9mIGFcbiAgICAvLyBjb21wb25lbnQuIFNvbWUgaW5mb3JtYXRpb24gd2UgbmVlZCBhdmFpbGFibGUgbG9uZ2VyIHRoYW4gdGhhdCwgZS5nLlxuICAgIC8vIGBxdWVyeWAgJiBgdG90YWxgIG9uIFR5cGVMaXN0LCBzbyB0aGF0IHdoZW4gdGhlIHVzZXIgbmF2aWdhdGVzIGJhY2sgZnJvbVxuICAgIC8vIGVkaXRpbmcgYW4gaXRlbSBpbiB0aGUgbGlzdCwgdGhlIHN0YXRlIG9mIHRoZSBsaXN0IGlzIHN0aWxsIHRoZSBzYW1lLlxuICAgIC8vIFdlIGNhbid0IHN0b3JlIHRoaXMgaW4gYGRhdGFgLCBhcyB0aGlzIGlzIGFscmVhZHkgdGhlIHB1cmUgZGF0YSBmcm9tIHRoZVxuICAgIC8vIEFQSSBzZXJ2ZXIuIFRoYXQncyB3aGF0IHRoZSBgc3RvcmVgIGlzIGZvcjogTWVtb3J5IHRoYXQncyBhdmFpbGFibGUgYXNcbiAgICAvLyBsb25nIGFzIHRoZSBjdXJyZW50IGVkaXRpbmcgcGF0aCBpcyBzdGlsbCB2YWxpZC4gRm9yIHR5cGUgY29tcG9uZW50cyxcbiAgICAvLyB0aGlzIG1lbW9yeSBpcyBwcm92aWRlZCBieSB0aGUgcGFyZW50LCBzZWUgUm91dGVNaXhpbiBhbmQgRGl0b1BhbmUuXG4gICAgZ2V0U3RvcmUoa2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5zdG9yZVtrZXldXG4gICAgfSxcblxuICAgIHNldFN0b3JlKGtleSwgdmFsdWUpIHtcbiAgICAgIHRoaXMuc3RvcmVba2V5XSA9IHZhbHVlXG4gICAgICByZXR1cm4gdmFsdWVcbiAgICB9LFxuXG4gICAgZ2V0Q2hpbGRTdG9yZShrZXkpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFN0b3JlKGtleSkgfHwgdGhpcy5zZXRTdG9yZShrZXksIHJlYWN0aXZlKHt9KSlcbiAgICB9LFxuXG4gICAgZ2V0U2NoZW1hVmFsdWUoXG4gICAgICBrZXlPckRhdGFQYXRoLFxuICAgICAgeyB0eXBlLCBkZWZhdWx0OiBkZWYsIHNjaGVtYSA9IHRoaXMuc2NoZW1hLCBjYWxsYmFjayA9IHRydWUgfSA9IHt9XG4gICAgKSB7XG4gICAgICBjb25zdCB0eXBlcyA9IHR5cGUgJiYgYXNBcnJheSh0eXBlKVxuICAgICAgLy8gRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIGRhdGEtcGF0aHMgaW4gYGtleU9yRGF0YVBhdGhgIGNhbiBvbmx5IGJlXG4gICAgICAvLyBwcm92aWRlZCBpbiBpbiBhcnJheSBmb3JtYXQgaGVyZTpcbiAgICAgIGxldCB2YWx1ZSA9IHNjaGVtYVxuICAgICAgICA/IGlzQXJyYXkoa2V5T3JEYXRhUGF0aClcbiAgICAgICAgICA/IGdldFZhbHVlQXREYXRhUGF0aChzY2hlbWEsIGtleU9yRGF0YVBhdGgsICgpID0+IHVuZGVmaW5lZClcbiAgICAgICAgICA6IHNjaGVtYVtrZXlPckRhdGFQYXRoXVxuICAgICAgICA6IHVuZGVmaW5lZFxuXG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiBkZWYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoY2FsbGJhY2sgJiYgaXNGdW5jdGlvbihkZWYpICYmICFpc01hdGNoaW5nVHlwZSh0eXBlcywgZGVmKSkge1xuICAgICAgICAgIC8vIFN1cHBvcnQgYGRlZmF1bHQoKWAgZnVuY3Rpb25zIGZvciBhbnkgdHlwZSBleGNlcHQgYEZ1bmN0aW9uYDpcbiAgICAgICAgICBkZWYgPSBkZWYuY2FsbCh0aGlzKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWZcbiAgICAgIH1cblxuICAgICAgaWYgKGlzTWF0Y2hpbmdUeXBlKHR5cGVzLCB2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlXG4gICAgICB9XG4gICAgICAvLyBBbnkgc2NoZW1hIHZhbHVlIGhhbmRsZWQgdGhyb3VnaCBgZ2V0U2NoZW1hVmFsdWUoKWAgY2FuIHByb3ZpZGVcbiAgICAgIC8vIGEgZnVuY3Rpb24gdGhhdCdzIHJlc29sdmVkIHdoZW4gdGhlIHZhbHVlIGlzIGV2YWx1YXRlZDpcbiAgICAgIGlmIChjYWxsYmFjayAmJiBpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlKHRoaXMuY29udGV4dClcbiAgICAgIH1cbiAgICAgIC8vIE5vdyBmaW5hbGx5IHNlZSBpZiB3ZSBjYW4gY29udmVydCB0byB0aGUgZXhwZWN0IHR5cGVzLlxuICAgICAgaWYgKHR5cGVzICYmIHZhbHVlICE9IG51bGwgJiYgIWlzTWF0Y2hpbmdUeXBlKHR5cGVzLCB2YWx1ZSkpIHtcbiAgICAgICAgZm9yIChjb25zdCB0eXBlIG9mIHR5cGVzKSB7XG4gICAgICAgICAgY29uc3QgY29udmVydGVkID0gY29udmVydFR5cGUodHlwZSwgdmFsdWUpXG4gICAgICAgICAgaWYgKGNvbnZlcnRlZCAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZWRcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZVxuICAgIH0sXG5cbiAgICBnZXRMYWJlbChzY2hlbWEsIG5hbWUpIHtcbiAgICAgIHJldHVybiBzY2hlbWFcbiAgICAgICAgPyB0aGlzLmdldFNjaGVtYVZhbHVlKCdsYWJlbCcsIHsgdHlwZTogU3RyaW5nLCBzY2hlbWEgfSkgfHxcbiAgICAgICAgICBsYWJlbGl6ZShuYW1lIHx8IHNjaGVtYS5uYW1lKVxuICAgICAgICA6IGxhYmVsaXplKG5hbWUpIHx8ICcnXG4gICAgfSxcblxuICAgIGdldEJ1dHRvbkF0dHJpYnV0ZXModmVyYikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY2xhc3M6IGBkaXRvLWJ1dHRvbi0ke3ZlcmJ9YCxcbiAgICAgICAgdGl0bGU6IGxhYmVsaXplKHZlcmIpXG4gICAgICB9XG4gICAgfSxcblxuICAgIC8vIFRPRE86IFJlbmFtZSAqTGluaygpIHRvICpSb3V0ZSgpLlxuICAgIGdldFF1ZXJ5TGluayhxdWVyeSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcXVlcnksXG4gICAgICAgIC8vIFByZXNlcnZlIGhhc2ggZm9yIHRhYnM6XG4gICAgICAgIGhhc2g6IHRoaXMuJHJvdXRlLmhhc2hcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc2hvdWxkUmVuZGVyKHNjaGVtYSA9IG51bGwpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFNjaGVtYVZhbHVlKCdpZicsIHtcbiAgICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgICAgZGVmYXVsdDogdHJ1ZSxcbiAgICAgICAgc2NoZW1hXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBzaG91bGRTaG93KHNjaGVtYSA9IG51bGwpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFNjaGVtYVZhbHVlKCd2aXNpYmxlJywge1xuICAgICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgICBkZWZhdWx0OiB0cnVlLFxuICAgICAgICBzY2hlbWFcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIHNob3VsZERpc2FibGUoc2NoZW1hID0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0U2NoZW1hVmFsdWUoJ2Rpc2FibGVkJywge1xuICAgICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgc2NoZW1hXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBnZXRSZXNvdXJjZVBhdGgocmVzb3VyY2UpIHtcbiAgICAgIHJlc291cmNlID0gZ2V0UmVzb3VyY2UocmVzb3VyY2UpXG4gICAgICAvLyBSZXNvdXJjZXMgd2l0aG91dCBhIHBhcmVudCBpbmhlcml0IHRoZSBvbmUgZnJvbSBgZGF0YUNvbXBvbmVudGBcbiAgICAgIC8vIGF1dG9tYXRpY2FsbHkuXG4gICAgICBpZiAocmVzb3VyY2UucGFyZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmVzb3VyY2UucGFyZW50ID0gdGhpcy5kYXRhQ29tcG9uZW50Py5yZXNvdXJjZVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuYXBpLnJlc291cmNlcy5hbnkoZ2V0UmVzb3VyY2UocmVzb3VyY2UpKVxuICAgIH0sXG5cbiAgICBnZXRSZXNvdXJjZVVybChyZXNvdXJjZSkge1xuICAgICAgY29uc3QgdXJsID0gdGhpcy5nZXRSZXNvdXJjZVBhdGgocmVzb3VyY2UpXG4gICAgICByZXR1cm4gdXJsID8gdGhpcy5hcGkuZ2V0QXBpVXJsKHsgdXJsLCBxdWVyeTogcmVzb3VyY2UucXVlcnkgfSkgOiBudWxsXG4gICAgfSxcblxuICAgIGFzeW5jIHNlbmRSZXF1ZXN0KHsgbWV0aG9kLCB1cmwsIHJlc291cmNlLCBxdWVyeSwgZGF0YSwgaW50ZXJuYWwgfSkge1xuICAgICAgdXJsIHx8PSB0aGlzLmdldFJlc291cmNlUGF0aChyZXNvdXJjZSlcbiAgICAgIG1ldGhvZCB8fD0gcmVzb3VyY2U/Lm1ldGhvZFxuICAgICAgY29uc3QgY2hlY2tVc2VyID0gIWludGVybmFsICYmIHRoaXMuYXBpLmlzQXBpVXJsKHVybClcbiAgICAgIGlmIChjaGVja1VzZXIpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5yb290Q29tcG9uZW50LmVuc3VyZVVzZXIoKVxuICAgICAgfVxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmFwaS5yZXF1ZXN0KHsgbWV0aG9kLCB1cmwsIGRhdGEsIHF1ZXJ5IH0pXG4gICAgICAvLyBEZXRlY3QgY2hhbmdlIG9mIHRoZSBvd24gdXNlciwgYW5kIGZldGNoIGl0IGFnYWluIGlmIGl0IHdhcyBjaGFuZ2VkLlxuICAgICAgaWYgKFxuICAgICAgICBjaGVja1VzZXIgJiZcbiAgICAgICAgbWV0aG9kID09PSAncGF0Y2gnICYmXG4gICAgICAgIGVxdWFscyhyZXNvdXJjZSwgZ2V0TWVtYmVyUmVzb3VyY2UodGhpcy51c2VyLmlkLCB0aGlzLmFwaS51c2VycykpXG4gICAgICApIHtcbiAgICAgICAgYXdhaXQgdGhpcy5yb290Q29tcG9uZW50LmZldGNoVXNlcigpXG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzcG9uc2VcbiAgICB9LFxuXG4gICAgc2hvd0RpYWxvZyh7IGNvbXBvbmVudHMsIGJ1dHRvbnMsIGRhdGEsIHNldHRpbmdzIH0pIHtcbiAgICAgIHJldHVybiB0aGlzLnJvb3RDb21wb25lbnQuc2hvd0RpYWxvZyh7XG4gICAgICAgIGNvbXBvbmVudHMsXG4gICAgICAgIGJ1dHRvbnMsXG4gICAgICAgIGRhdGEsXG4gICAgICAgIHNldHRpbmdzXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICByZXF1ZXN0KHsgY2FjaGUsIC4uLm9wdGlvbnMgfSkge1xuICAgICAgLy8gQWxsb3cgY2FjaGluZyBvZiBsb2FkZWQgZGF0YSBvbiB0d28gbGV2ZWxzOlxuICAgICAgLy8gLSAnZ2xvYmFsJzogY2FjaGUgZ2xvYmFsbHksIGZvciB0aGUgZW50aXJlIGFkbWluIHNlc3Npb25cbiAgICAgIC8vIC0gJ2xvY2FsJzogY2FjaGUgbG9jYWxseSB3aXRoaW4gdGhlIGNsb3Nlc3Qgcm91dGUgY29tcG9uZW50IHRoYXQgaXNcbiAgICAgIC8vICAgIGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlIGFuZCBsb2FkcyBpdHMgb3duIGRhdGEuXG4gICAgICBjb25zdCBjYWNoZVBhcmVudCA9IChcbiAgICAgICAgY2FjaGUgJiZcbiAgICAgICAge1xuICAgICAgICAgIGdsb2JhbDogdGhpcy5hcHBTdGF0ZSxcbiAgICAgICAgICBsb2NhbDogdGhpcy5kYXRhQ29tcG9uZW50XG4gICAgICAgIH1bY2FjaGVdXG4gICAgICApXG4gICAgICBjb25zdCBsb2FkQ2FjaGUgPSBjYWNoZVBhcmVudD8ubG9hZENhY2hlXG4gICAgICAvLyBCdWlsZCBhIGNhY2hlIGtleSBmcm9tIHRoZSBjb25maWc6XG4gICAgICBjb25zdCBjYWNoZUtleSA9IChcbiAgICAgICAgbG9hZENhY2hlICYmXG4gICAgICAgIGAke1xuICAgICAgICAgIG9wdGlvbnMubWV0aG9kIHx8ICdnZXQnXG4gICAgICAgIH0gJHtcbiAgICAgICAgICBvcHRpb25zLnVybFxuICAgICAgICB9ICR7XG4gICAgICAgICAgLy8gVE9ETzogYHJlcXVlc3QucGFyYW1zYCB3YXMgZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgYHF1ZXJ5YCBvblxuICAgICAgICAgIC8vIDIwMjItMTEtMDEsIHJlbW92ZSBvbmNlIG5vdCBpbiB1c2UgYW55d2hlcmUgYW55IG1vcmUuXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkob3B0aW9ucy5xdWVyeSB8fCBvcHRpb25zLnBhcmFtcyB8fCAnJylcbiAgICAgICAgfSAke1xuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KG9wdGlvbnMuZGF0YSB8fCAnJylcbiAgICAgICAgfWBcbiAgICAgIClcbiAgICAgIGlmIChsb2FkQ2FjaGUgJiYgKGNhY2hlS2V5IGluIGxvYWRDYWNoZSkpIHtcbiAgICAgICAgcmV0dXJuIGxvYWRDYWNoZVtjYWNoZUtleV1cbiAgICAgIH1cbiAgICAgIC8vIE5PVEU6IE5vIGF3YWl0IGhlcmUsIHJlcyBpcyBhIHByb21pc2UgdGhhdCB3ZSBjYW4gZWFzaWx5IGNhY2hlLlxuICAgICAgLy8gVGhhdCdzIGZpbmUgYmVjYXVzZSBwcm9taXNlcyBjYW4gYmUgcmVzb2x2ZWQgb3ZlciBhbmQgb3ZlciBhZ2Fpbi5cbiAgICAgIGNvbnN0IHJlcyA9IHRoaXMuc2VuZFJlcXVlc3Qob3B0aW9ucylcbiAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4gcmVzcG9uc2UuZGF0YSlcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICAvLyBDb252ZXJ0IGF4aW9zIGVycm9ycyB0byBub3JtYWwgZXJyb3JzXG4gICAgICAgICAgY29uc3QgZGF0YSA9IGVycm9yLnJlc3BvbnNlPy5kYXRhXG4gICAgICAgICAgdGhyb3cgZGF0YVxuICAgICAgICAgICAgPyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihkYXRhLm1lc3NhZ2UpLCBkYXRhKVxuICAgICAgICAgICAgOiBlcnJvclxuICAgICAgICB9KVxuICAgICAgaWYgKGxvYWRDYWNoZSkge1xuICAgICAgICBsb2FkQ2FjaGVbY2FjaGVLZXldID0gcmVzXG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzXG4gICAgfSxcblxuICAgIGZvcm1hdCh2YWx1ZSwge1xuICAgICAgbG9jYWxlID0gdGhpcy5hcGkubG9jYWxlLFxuICAgICAgZGVmYXVsdHMgPSB0aGlzLmFwaS5mb3JtYXRzLFxuICAgICAgLi4ub3B0aW9uc1xuICAgIH0gPSB7fSkge1xuICAgICAgcmV0dXJuIGZvcm1hdCh2YWx1ZSwge1xuICAgICAgICBsb2NhbGUsXG4gICAgICAgIGRlZmF1bHRzLFxuICAgICAgICAuLi5vcHRpb25zXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBuYXZpZ2F0ZShsb2NhdGlvbikge1xuICAgICAgcmV0dXJuIHRoaXMuJHJvdXRlci5wdXNoKGxvY2F0aW9uKVxuICAgIH0sXG5cbiAgICBkb3dubG9hZChvcHRpb25zID0ge30pIHtcbiAgICAgIGlmIChpc1N0cmluZyhvcHRpb25zKSkge1xuICAgICAgICBvcHRpb25zID0geyB1cmw6IG9wdGlvbnMgfVxuICAgICAgfVxuICAgICAgLy8gU2VlOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNDk5MTcwNjYvMTE2MzcwOFxuICAgICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKVxuICAgICAgYS5ocmVmID0gdGhpcy5hcGkuZ2V0QXBpVXJsKG9wdGlvbnMpXG4gICAgICBhLmRvd25sb2FkID0gb3B0aW9ucy5maWxlbmFtZSA/PyBudWxsXG4gICAgICBjb25zdCB7IGJvZHkgfSA9IGRvY3VtZW50XG4gICAgICBib2R5LmFwcGVuZENoaWxkKGEpXG4gICAgICBhLmNsaWNrKClcbiAgICAgIGJvZHkucmVtb3ZlQ2hpbGQoYSlcbiAgICB9LFxuXG4gICAgbm90aWZ5KG9wdGlvbnMpIHtcbiAgICAgIHRoaXMucm9vdENvbXBvbmVudC5ub3RpZnkob3B0aW9ucylcbiAgICB9LFxuXG4gICAgY2xvc2VOb3RpZmljYXRpb25zKCkge1xuICAgICAgdGhpcy5yb290Q29tcG9uZW50LmNsb3NlTm90aWZpY2F0aW9ucygpXG4gICAgfSxcblxuICAgIHNldHVwU2NoZW1hRmllbGRzKCkge1xuICAgICAgdGhpcy5zZXR1cE1ldGhvZHMoKVxuICAgICAgdGhpcy5zZXR1cENvbXB1dGVkKClcbiAgICAgIHRoaXMuc2V0dXBFdmVudHMoKVxuICAgIH0sXG5cbiAgICBzZXR1cE1ldGhvZHMoKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnNjaGVtYS5tZXRob2RzIHx8IHt9KSkge1xuICAgICAgICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICAgICAgICB0aGlzW2tleV0gPSB2YWx1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEludmFsaWQgbWV0aG9kIGRlZmluaXRpb246ICR7a2V5fTogJHt2YWx1ZX1gKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIHNldHVwQ29tcHV0ZWQoKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnNjaGVtYS5jb21wdXRlZCB8fCB7fSkpIHtcbiAgICAgICAgY29uc3QgYWNjZXNzb3IgPSBpc0Z1bmN0aW9uKHZhbHVlKVxuICAgICAgICAgID8geyBnZXQ6IHZhbHVlIH1cbiAgICAgICAgICA6IGlzT2JqZWN0KHZhbHVlKSAmJiBpc0Z1bmN0aW9uKHZhbHVlLmdldClcbiAgICAgICAgICAgID8gdmFsdWVcbiAgICAgICAgICAgIDogbnVsbFxuICAgICAgICBpZiAoYWNjZXNzb3IpIHtcbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywga2V5LCBhY2Nlc3NvcilcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgYEludmFsaWQgY29tcHV0ZWQgcHJvcGVydHkgZGVmaW5pdGlvbjogJHtrZXl9OiAke3ZhbHVlfWBcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc2V0dXBFdmVudHMoKSB7XG4gICAgICBjb25zdCB7IHdhdGNoLCBldmVudHMgfSA9IHRoaXMuc2NoZW1hXG4gICAgICBpZiAod2F0Y2gpIHtcbiAgICAgICAgY29uc3QgaGFuZGxlcnMgPSBpc0Z1bmN0aW9uKHdhdGNoKSA/IHdhdGNoLmNhbGwodGhpcykgOiB3YXRjaFxuICAgICAgICBpZiAoaXNPYmplY3QoaGFuZGxlcnMpKSB7XG4gICAgICAgICAgLy8gSW5zdGFsbCB0aGUgd2F0Y2ggaGFuZGxlcnMgaW4gdGhlIG5leHQgdGljaywgc28gYWxsIGNvbXBvbmVudHMgYXJlXG4gICAgICAgICAgLy8gaW5pdGlhbGl6ZWQgYW5kIHdlIGNhbiBjaGVjayBhZ2FpbnN0IHRoZWlyIG5hbWVzLlxuICAgICAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgY2FsbGJhY2tdIG9mIE9iamVjdC5lbnRyaWVzKGhhbmRsZXJzKSkge1xuICAgICAgICAgICAgICAvLyBFeHBhbmQgcHJvcGVydHkgbmFtZXMgdG8gJ2RhdGEucHJvcGVydHknOlxuICAgICAgICAgICAgICBjb25zdCBleHByID0gdGhpcy5zY2hlbWFDb21wb25lbnQuZ2V0Q29tcG9uZW50QnlOYW1lKGtleSlcbiAgICAgICAgICAgICAgICA/IGBkYXRhLiR7a2V5fWBcbiAgICAgICAgICAgICAgICA6IGtleVxuICAgICAgICAgICAgICB0aGlzLiR3YXRjaChleHByLCBjYWxsYmFjaylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFkZEV2ZW50ID0gKGtleSwgZXZlbnQsIGNhbGxiYWNrKSA9PiB7XG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKGNhbGxiYWNrKSkge1xuICAgICAgICAgIHRoaXMub24oaHlwaGVuYXRlKGV2ZW50KSwgY2FsbGJhY2spXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgSW52YWxpZCBldmVudCBkZWZpbml0aW9uOiAke2tleX06ICR7Y2FsbGJhY2t9YClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnRzKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGV2ZW50cykpIHtcbiAgICAgICAgICBhZGRFdmVudChrZXksIGtleSwgdmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIEFsc28gc2NhbiBzY2hlbWEgZm9yIGBvbltBLVpdYC1zdHlsZSBjYWxsYmFja3MgYW5kIGFkZCB0aGVtXG4gICAgICAvLyBUT0RPOiBEZXByZWNhdGUgb25lIGZvcm1hdCBvciB0aGUgb3RoZXIsIGluIGZhdm91ciBvZiBvbmx5IG9uZSB3YXkgb2ZcbiAgICAgIC8vIGRvaW5nIHRoaW5ncy4gRGVjaWRlIHdoaWNoIG9uZSB0byByZW1vdmUuXG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnNjaGVtYSkpIHtcbiAgICAgICAgaWYgKC9eb25bQS1aXS8udGVzdChrZXkpKSB7XG4gICAgICAgICAgYWRkRXZlbnQoa2V5LCBrZXkuc2xpY2UoMiksIHZhbHVlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIGVtaXRFdmVudChldmVudCwge1xuICAgICAgY29udGV4dCA9IG51bGwsXG4gICAgICBwYXJlbnQgPSBudWxsXG4gICAgfSA9IHt9KSB7XG4gICAgICBjb25zdCBoYXNMaXN0ZW5lcnMgPSB0aGlzLmhhc0xpc3RlbmVycyhldmVudClcbiAgICAgIGNvbnN0IHBhcmVudEhhc0xpc3RlbmVycyA9IHBhcmVudD8uaGFzTGlzdGVuZXJzKGV2ZW50KVxuICAgICAgaWYgKGhhc0xpc3RlbmVycyB8fCBwYXJlbnRIYXNMaXN0ZW5lcnMpIHtcbiAgICAgICAgLy8gVGhlIGVmZmVjdHMgb2Ygc29tZSBldmVudHMgbmVlZCBzb21lIHRpbWUgdG8gcHJvcGFnYXRlIHRocm91Z2ggVnVlLlxuICAgICAgICAvLyBVc2UgJG5leHRUaWNrKCkgdG8gbWFrZSBzdXJlIG91ciBoYW5kbGVycyBzZWUgdGhlc2UgY2hhbmdlcy5cbiAgICAgICAgLy8gRm9yIGV4YW1wbGUsIGBwcm9jZXNzZWRJdGVtYCBpcyBvbmx5IGNvcnJlY3QgYWZ0ZXIgY29tcG9uZW50cyB0aGF0XG4gICAgICAgIC8vIGFyZSBuZXdseSByZW5kZXJlZCBkdWUgdG8gZGF0YSBjaGFuZ2VzIGhhdmUgcmVnaXN0ZXJlZCB0aGVtc2VsdmVzLlxuICAgICAgICBpZiAoWydsb2FkJywgJ2NoYW5nZSddLmluY2x1ZGVzKGV2ZW50KSkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuJG5leHRUaWNrKClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGdldENvbnRleHQgPSAoKSA9PiAoY29udGV4dCA9IERpdG9Db250ZXh0LmdldCh0aGlzLCBjb250ZXh0KSlcbiAgICAgICAgY29uc3QgcmVzID0gaGFzTGlzdGVuZXJzXG4gICAgICAgICAgPyBhd2FpdCB0aGlzLmVtaXQoZXZlbnQsIGdldENvbnRleHQoKSlcbiAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICAvLyBEb24ndCBidWJibGUgdG8gcGFyZW50IGlmIGhhbmRsZWQgZXZlbnQgcmV0dXJuZWQgYGZhbHNlYFxuICAgICAgICBpZiAocGFyZW50SGFzTGlzdGVuZXJzICYmIHJlcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICBwYXJlbnQuZW1pdChldmVudCwgZ2V0Q29udGV4dCgpKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXNcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZW1pdFNjaGVtYUV2ZW50KGV2ZW50LCBwYXJhbXMpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjaGVtYUNvbXBvbmVudC5lbWl0RXZlbnQoZXZlbnQsIHBhcmFtcylcbiAgICB9XG4gIH1cbn1cblxubGV0IG5leHRVaWQgPSAwXG4iLCJpbXBvcnQgeyBpc0NyZWRpdENhcmQgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG5leHBvcnQgY29uc3QgY3JlZGl0Y2FyZCA9IHtcbiAgdmFsaWRhdGU6IHZhbHVlID0+IGlzQ3JlZGl0Q2FyZCh2YWx1ZSksXG4gIG1lc3NhZ2U6ICdpcyBpbnZhbGlkJ1xufVxuIiwiZXhwb3J0IGNvbnN0IGRlY2ltYWxzID0ge1xuICB2YWxpZGF0ZTogKHZhbHVlLCBkZWNpbWFscykgPT4ge1xuICAgIGNvbnN0IG1hdGNoID0gZGVjaW1hbHMgPT09ICcqJyA/ICcrJyA6IGB7MSwke2RlY2ltYWxzfX1gXG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoYF5bLStdP1xcXFxkKihcXFxcLlxcXFxkJHttYXRjaH0pPyRgKS50ZXN0KHZhbHVlKVxuICB9LFxuXG4gIG1lc3NhZ2U6ICh2YWx1ZSwgZGVjaW1hbHMpID0+XG4gICAgYG11c3QgYmUgbnVtZXJpYyBhbmQgbWF5IGNvbnRhaW4gJHtcbiAgICAgICFkZWNpbWFscyB8fCBkZWNpbWFscyA9PT0gJyonID8gJycgOiBkZWNpbWFsc1xuICAgIH0gZGVjaW1hbCBwb2ludHNgXG59XG4iLCJpbXBvcnQgeyBpc0RvbWFpbiB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbmV4cG9ydCBjb25zdCBkb21haW4gPSB7XG4gIHZhbGlkYXRlOiB2YWx1ZSA9PiBpc0RvbWFpbih2YWx1ZSksXG4gIG1lc3NhZ2U6ICdpcyBub3QgYSBkb21haW4nXG59XG4iLCJpbXBvcnQgeyBpc0VtYWlsIH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuZXhwb3J0IGNvbnN0IGVtYWlsID0ge1xuICB2YWxpZGF0ZTogdmFsdWUgPT4gaXNFbWFpbCh2YWx1ZSksXG4gIG1lc3NhZ2U6ICdtdXN0IGJlIGEgdmFsaWQgZW1haWwnXG59XG4iLCJpbXBvcnQgeyBpc0hvc3RuYW1lIH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuZXhwb3J0IGNvbnN0IGhvc3RuYW1lID0ge1xuICB2YWxpZGF0ZTogdmFsdWUgPT4gaXNIb3N0bmFtZSh2YWx1ZSksXG4gIG1lc3NhZ2U6ICdpcyBub3QgYSBob3N0IG5hbWUnXG59XG4iLCJpbXBvcnQgeyBpc0ludGVnZXIgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG5leHBvcnQgY29uc3QgaW50ZWdlciA9IHtcbiAgdmFsaWRhdGU6IHZhbHVlID0+IGlzSW50ZWdlcih2YWx1ZSksXG4gIG1lc3NhZ2U6ICdtdXN0IGJlIHdob2xlIG51bWJlcidcbn1cbiIsImV4cG9ydCBjb25zdCBtYXggPSB7XG4gIHZhbGlkYXRlOiAodmFsdWUsIG1heCkgPT4gdmFsdWUgPD0gbWF4LFxuICBtZXNzYWdlKHZhbHVlLCBtYXgpIHtcbiAgICByZXR1cm4gYG11c3QgYmUgJHttYXh9IG9yIGxlc3NgXG4gIH1cbn1cbiIsImV4cG9ydCBjb25zdCBtaW4gPSB7XG4gIHZhbGlkYXRlOiAodmFsdWUsIG1pbikgPT4gdmFsdWUgPj0gbWluLFxuICBtZXNzYWdlKHZhbHVlLCBtaW4pIHtcbiAgICByZXR1cm4gYG11c3QgYmUgJHttaW59IG9yIG1vcmVgXG4gIH1cbn1cbiIsImV4cG9ydCBjb25zdCBwYXNzd29yZCA9IHtcbiAgLy8gQWxsb3cgYW55IHZhbHVlLiBGb3Igbm93IHRoaXMgaXMgb25seSB1c2VkIGFzIGEgbWFya2VyLCB0byBhbGxvdyB0aGVcbiAgLy8gcmVxdWlyZWQgdmFsaWRhdGlvbiB0byBoYW5kbGUgdW5jaGFuZ2VkIHBhc3N3b3JkcyBzZXBhcmF0ZWx5LlxuICB2YWxpZGF0ZTogKCkgPT4gdHJ1ZVxufVxuIiwiZXhwb3J0IGNvbnN0IHJhbmdlID0ge1xuICB2YWxpZGF0ZTogKHZhbHVlLCBbbWluLCBtYXhdKSA9PiB2YWx1ZSA+PSBtaW4gJiYgdmFsdWUgPD0gbWF4LFxuICBtZXNzYWdlKHZhbHVlLCBbbWluLCBtYXhdKSB7XG4gICAgcmV0dXJuIGBtdXN0IGJlIGJldHdlZW4gJHttaW59IGFuZCAke21heH1gXG4gIH1cbn1cbiIsImV4cG9ydCBjb25zdCByZXF1aXJlZCA9IHtcbiAgdmFsaWRhdGU6ICh2YWx1ZSwgc2V0dGluZ3MsIHsgcGFzc3dvcmQgfSkgPT4gKFxuICAgICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlICE9PSAnJykgfHxcbiAgICAvLyBQYXNzd29yZCBmaWVsZHMgdXNlIGB1bmRlZmluZWRgIGFzIG9wcG9zZWQgdG8gYG51bGxgIHdoZW4gdGhleSdyZSBzZXRcbiAgICAvLyBidXQgdW5jaGFuZ2VkLCBhbGxvdyB0aGlzIHRvIHBhc3MgdGhyb3VnaDpcbiAgICAocGFzc3dvcmQgJiYgdmFsdWUgPT09IHVuZGVmaW5lZClcbiAgKSxcbiAgbWVzc2FnZTogJ2lzIHJlcXVpcmVkJyxcbiAgbnVsbGlzaDogdHJ1ZVxufVxuIiwiaW1wb3J0IHsgaXNVcmwgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG5leHBvcnQgY29uc3QgdXJsID0ge1xuICB2YWxpZGF0ZTogdmFsdWUgPT4gaXNVcmwodmFsdWUpLFxuICBtZXNzYWdlOiAnaXMgbm90IGEgdmFsaWQgVVJMJ1xufVxuIiwiaW1wb3J0IHsgaXNGdW5jdGlvbiB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgKiBhcyB2YWxpZGF0aW9ucyBmcm9tICcuLi92YWxpZGF0aW9ucy9pbmRleC5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgZW1pdHM6IFsnZXJyb3JzJ10sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaXNUb3VjaGVkOiBmYWxzZSxcbiAgICAgIGlzRGlydHk6IGZhbHNlLFxuICAgICAgaXNWYWxpZGF0ZWQ6IGZhbHNlLFxuICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICBlcnJvcnM6IG51bGxcbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIHJlc2V0VmFsaWRhdGlvbigpIHtcbiAgICAgIHRoaXMuaXNUb3VjaGVkID0gZmFsc2VcbiAgICAgIHRoaXMuaXNEaXJ0eSA9IGZhbHNlXG4gICAgICB0aGlzLmlzVmFsaWRhdGVkID0gZmFsc2VcbiAgICAgIHRoaXMuaXNWYWxpZCA9IGZhbHNlXG4gICAgICB0aGlzLmNsZWFyRXJyb3JzKClcbiAgICB9LFxuXG4gICAgdmFsaWRhdGUobm90aWZ5ID0gdHJ1ZSkge1xuICAgICAgbGV0IGlzVmFsaWQgPSB0cnVlXG4gICAgICBpZiAobm90aWZ5KSB7XG4gICAgICAgIHRoaXMuY2xlYXJFcnJvcnMoKVxuICAgICAgfVxuICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gdGhpc1xuICAgICAgLy8gY29uc29sZS5sb2coJ3ZhbGlkYXRlJywgdGhpcy5kYXRhUGF0aCwgdmFsdWUsIHRoaXMudmFsaWRhdGlvbnMpXG4gICAgICBmb3IgKGNvbnN0IFtydWxlLCBzZXR0aW5nXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnZhbGlkYXRpb25zKSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25hbWVzcGFjZVxuICAgICAgICBjb25zdCB2YWxpZGF0b3IgPSB2YWxpZGF0aW9uc1tydWxlXVxuICAgICAgICBpZiAodmFsaWRhdG9yICYmICh2YWxpZGF0b3IubnVsbGlzaCB8fCB2YWx1ZSAhPSBudWxsKSkge1xuICAgICAgICAgIGNvbnN0IHsgdmFsaWRhdGUsIG1lc3NhZ2UgfSA9IHZhbGlkYXRvclxuICAgICAgICAgIGlmICghdmFsaWRhdGUodmFsdWUsIHNldHRpbmcsIHRoaXMudmFsaWRhdGlvbnMpKSB7XG4gICAgICAgICAgICBpc1ZhbGlkID0gZmFsc2VcbiAgICAgICAgICAgIGlmIChub3RpZnkpIHtcbiAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBpc0Z1bmN0aW9uKG1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgPyBtZXNzYWdlKHZhbHVlLCBzZXR0aW5nLCB0aGlzKVxuICAgICAgICAgICAgICAgIDogbWVzc2FnZVxuICAgICAgICAgICAgICB0aGlzLmFkZEVycm9yKGVycm9yLCB0cnVlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG5vdGlmeSkge1xuICAgICAgICB0aGlzLmlzVmFsaWRhdGVkID0gdHJ1ZVxuICAgICAgICB0aGlzLmlzVmFsaWQgPSBpc1ZhbGlkXG4gICAgICB9XG4gICAgICByZXR1cm4gaXNWYWxpZFxuICAgIH0sXG5cbiAgICB2ZXJpZnkoKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZShmYWxzZSlcbiAgICB9LFxuXG4gICAgbWFya1RvdWNoZWQoKSB7XG4gICAgICB0aGlzLmlzVG91Y2hlZCA9IHRydWVcbiAgICB9LFxuXG4gICAgbWFya0RpcnR5KCkge1xuICAgICAgdGhpcy5pc0RpcnR5ID0gdHJ1ZVxuICAgICAgdGhpcy5pc1ZhbGlkYXRlZCA9IGZhbHNlXG4gICAgICB0aGlzLmlzVmFsaWQgPSBmYWxzZVxuICAgICAgLy8gQ2xlYXIgY3VycmVudGx5IGRpc3BsYXllZCBlcnJvcnMgb24gbmV3IGlucHV0LlxuICAgICAgdGhpcy5jbGVhckVycm9ycygpXG4gICAgfSxcblxuICAgIGFkZEVycm9yKGVycm9yLCBhZGRMYWJlbCA9IGZhbHNlKSB7XG4gICAgICB0aGlzLmVycm9ycyB8fD0gW11cbiAgICAgIGlmIChhZGRMYWJlbCkge1xuICAgICAgICBjb25zdCBsYWJlbCA9IHRoaXMubGFiZWwgfHwgdGhpcy5wbGFjZWhvbGRlciB8fCB0aGlzLm5hbWVcbiAgICAgICAgZXJyb3IgPSBgVGhlICR7bGFiZWx9IGZpZWxkICR7ZXJyb3J9LmBcbiAgICAgIH1cbiAgICAgIHRoaXMuZXJyb3JzLnB1c2goZXJyb3IpXG4gICAgICB0aGlzLiRlbWl0KCdlcnJvcnMnLCB0aGlzLmVycm9ycylcbiAgICB9LFxuXG4gICAgc2hvd1ZhbGlkYXRpb25FcnJvcnMoZXJyb3JzLCBmb2N1cykge1xuICAgICAgLy8gQ29udmVydCBmcm9tIEFKViBlcnJvcnMgb2JqZWN0cyB0byBhbiBhcnJheSBvZiBlcnJvciBtZXNzYWdlc1xuICAgICAgdGhpcy5lcnJvcnMgPSBbXVxuICAgICAgZm9yIChjb25zdCB7IG1lc3NhZ2UgfSBvZiBlcnJvcnMpIHtcbiAgICAgICAgdGhpcy5hZGRFcnJvcihtZXNzYWdlLCB0cnVlKVxuICAgICAgfVxuICAgICAgaWYgKGZvY3VzKSB7XG4gICAgICAgIHRoaXMuZm9jdXMoKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9LFxuXG4gICAgZ2V0RXJyb3JzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZXJyb3JzID8gWy4uLnRoaXMuZXJyb3JzXSA6IG51bGxcbiAgICB9LFxuXG4gICAgY2xlYXJFcnJvcnMoKSB7XG4gICAgICB0aGlzLmVycm9ycyA9IG51bGxcbiAgICAgIHRoaXMuJGVtaXQoJ2Vycm9ycycsIHRoaXMuZXJyb3JzKVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgaXNGdW5jdGlvbixcbiAgaXNTdHJpbmcsXG4gIHBhcnNlRGF0YVBhdGgsXG4gIG5vcm1hbGl6ZURhdGFQYXRoXG59IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTY2hlbWFBY2Nlc3NvcihcbiAga2V5T3JEYXRhUGF0aCxcbiAgeyB0eXBlLCBkZWZhdWx0OiBkZWYsIGdldCwgc2V0LCBjYWxsYmFjayA9IHRydWUgfSA9IHt9XG4pIHtcbiAgLy8gYGtleU9yRGF0YVBhdGhgIGNhbiBiZSBhIHNpbXBsZSBwcm9wZXJ0eSBrZXksXG4gIC8vIG9yIGEgZGF0YS1wYXRoIGludG8gc3ViLXByb3BlcnRpZXMsIGJvdGggaW4gYXJyYXkgb3Igc3RyaW5nIGZvcm1hdC5cbiAgaWYgKGlzU3RyaW5nKGtleU9yRGF0YVBhdGgpICYmIGtleU9yRGF0YVBhdGguaW5jbHVkZXMoJy4nKSkge1xuICAgIGtleU9yRGF0YVBhdGggPSBwYXJzZURhdGFQYXRoKGtleU9yRGF0YVBhdGgpXG4gIH1cbiAgLy8gVXNlIHRoZSBub3JtYWxpemVkIGRhdGEgcGF0aCBmb3IgdGhlIGhhbmRsaW5nIG92ZXJyaWRlc1xuICBjb25zdCBuYW1lID0gbm9ybWFsaXplRGF0YVBhdGgoa2V5T3JEYXRhUGF0aClcbiAgcmV0dXJuIHtcbiAgICBnZXQoKSB7XG4gICAgICAvLyBPbmx5IGRldGVybWluZSBzY2hlbWEgdmFsdWUgaWYgd2UgaGF2ZSBubyBnZXR0ZXIsIG9yIHRoZSBnZXR0ZXJcbiAgICAgIC8vIHdhbnRzIHRvIHJlY2VpdmUgdGhlIHZhbHVlIGFuZCBwcm9jZXNzIGl0IGZ1cnRoZXI6XG4gICAgICBjb25zdCB2YWx1ZSA9XG4gICAgICAgICFnZXQgfHwgZ2V0Lmxlbmd0aCA+IDBcbiAgICAgICAgICA/IC8vIE5PVEU6IEJlY2F1c2UgYHNjaGVtYWAgb2JqZWN0cyBhcmUgcmV0cmlldmVkIGZyb20gYG1ldGFgLCB0aGV5XG4gICAgICAgICAgICAvLyBkb24ndCBzZWVtIHRvIGJlIHJlYWN0aXZlLiBUbyBhbGxvdyBjaGFuZ2VkIGluIGBzY2hlbWFgIHZhbHVlcyxcbiAgICAgICAgICAgIC8vIGBzZXQoKWAgc3RvcmVzIGNoYW5nZWQgdmFsdWVzIGluIHRoZSBzZXBhcmF0ZSBgb3ZlcnJpZGVzYCBvYmplY3QuXG4gICAgICAgICAgICB0aGlzLm92ZXJyaWRlcyAmJiBuYW1lIGluIHRoaXMub3ZlcnJpZGVzXG4gICAgICAgICAgICA/IHRoaXMub3ZlcnJpZGVzW25hbWVdXG4gICAgICAgICAgICA6IHRoaXMuZ2V0U2NoZW1hVmFsdWUoa2V5T3JEYXRhUGF0aCwge1xuICAgICAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogZGVmLFxuICAgICAgICAgICAgICAgIGNhbGxiYWNrXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgIHJldHVybiBnZXQgPyBnZXQuY2FsbCh0aGlzLCB2YWx1ZSkgOiB2YWx1ZVxuICAgIH0sXG5cbiAgICBzZXQodmFsdWUpIHtcbiAgICAgIGlmIChzZXQpIHtcbiAgICAgICAgc2V0LmNhbGwodGhpcywgdmFsdWUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm92ZXJyaWRlcyB8fD0ge31cbiAgICAgICAgdGhpcy5vdmVycmlkZXNbbmFtZV0gPSB2YWx1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RvcmVBY2Nlc3NvcihuYW1lLCB7IGRlZmF1bHQ6IGRlZiwgZ2V0LCBzZXQgfSA9IHt9KSB7XG4gIHJldHVybiB7XG4gICAgZ2V0KCkge1xuICAgICAgbGV0IHZhbHVlID0gdGhpcy5nZXRTdG9yZShuYW1lKVxuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgZGVmICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gU3VwcG9ydCBgZGVmYXVsdCgpYCBmdW5jdGlvbnM6XG4gICAgICAgIHZhbHVlID0gaXNGdW5jdGlvbihkZWYpID8gZGVmLmNhbGwodGhpcykgOiBkZWZcbiAgICAgICAgLy8gVHJpZ2dlciBzZXR0ZXIgYnkgc2V0dGluZyB2YWx1ZSBhbmQgYWNjZXNzb3IgdG8gZGVmYXVsdDpcbiAgICAgICAgdGhpc1tuYW1lXSA9IHZhbHVlXG4gICAgICAgIC8vIE5vdyBhY2Nlc3Mgc3RvcmUgYWdhaW4sIGZvciByZWFjdGl2aXR5IHRyYWNraW5nXG4gICAgICAgIHRoaXMuZ2V0U3RvcmUobmFtZSlcbiAgICAgIH1cbiAgICAgIC8vIEFsbG93IHRoZSBwcm92aWRlZCBnZXR0ZXIgdG8gZnVydGhlciBjaGFuZ2Ugb3IgcHJvY2VzcyB0aGUgdmFsdWVcbiAgICAgIC8vIHJldHJpZXZlZCBmcm9tIHRoZSBzdG9yZTpcbiAgICAgIHJldHVybiBnZXQgPyBnZXQuY2FsbCh0aGlzLCB2YWx1ZSkgOiB2YWx1ZVxuICAgIH0sXG5cbiAgICBzZXQodmFsdWUpIHtcbiAgICAgIC8vIEFsbG93IHRoZSBwcm92aWRlZCBzZXR0ZXIgdG8gcmV0dXJuIGEgbmV3IHZhbHVlIHRvIHNldCwgb3IgZG8gdGhlXG4gICAgICAvLyBzZXR0aW5nIGl0c2VsZiwgYW5kIHRoZW4gcmV0dXJuIGB1bmRlZmluZWRgOlxuICAgICAgaWYgKCFzZXQgfHwgKHZhbHVlID0gc2V0LmNhbGwodGhpcywgdmFsdWUpKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuc2V0U3RvcmUobmFtZSwgdmFsdWUpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgRGl0b0NvbnRleHQgZnJvbSAnLi4vRGl0b0NvbnRleHQuanMnXG5pbXBvcnQgVmFsaWRhdGlvbk1peGluIGZyb20gJy4vVmFsaWRhdGlvbk1peGluLmpzJ1xuaW1wb3J0IHsgZ2V0U2NoZW1hQWNjZXNzb3IgfSBmcm9tICcuLi91dGlscy9hY2Nlc3Nvci5qcydcbmltcG9ydCB7IGNvbXB1dGVWYWx1ZSB9IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcbmltcG9ydCB7IGdldEl0ZW0sIGdldFBhcmVudEl0ZW0gfSBmcm9tICcuLi91dGlscy9kYXRhLmpzJ1xuaW1wb3J0IHsgaXNTdHJpbmcsIGFzQXJyYXksIGNhbWVsaXplIH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgbWl4aW5zOiBbVmFsaWRhdGlvbk1peGluXSxcblxuICBwcm9wczoge1xuICAgIHNjaGVtYTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgLy8gTk9URTogV2hpbGUgYGRhdGFQYXRoYCBwb2ludHMgdG8gdGhlIGFjdHVhbCBgdmFsdWVgLCBgZGF0YWAgcmVwcmVzZW50c1xuICAgIC8vIHRoZSBgaXRlbWAgaW4gd2hpY2ggdGhlIGB2YWx1ZWAgaXMgY29udGFpbmVkLCB1bmRlciB0aGUga2V5IGBuYW1lYC5cbiAgICBkYXRhUGF0aDogeyB0eXBlOiBTdHJpbmcsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZGF0YTogeyB0eXBlOiBbT2JqZWN0LCBBcnJheV0sIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgbWV0YTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgc3RvcmU6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHNpbmdsZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIG5lc3RlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhcnNlZFZhbHVlOiB1bmRlZmluZWQsXG4gICAgICBjaGFuZ2VkVmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgIGZvY3VzZWQ6IGZhbHNlXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgbmFtZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjaGVtYS5uYW1lXG4gICAgfSxcblxuICAgIHR5cGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY2hlbWEudHlwZVxuICAgIH0sXG5cbiAgICBjb250ZXh0KCkge1xuICAgICAgcmV0dXJuIG5ldyBEaXRvQ29udGV4dCh0aGlzLCB7IG5lc3RlZDogdGhpcy5uZXN0ZWQgfSlcbiAgICB9LFxuXG4gICAgdmFsdWU6IHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBjb21wdXRlVmFsdWUoXG4gICAgICAgICAgdGhpcy5zY2hlbWEsXG4gICAgICAgICAgdGhpcy5kYXRhLFxuICAgICAgICAgIHRoaXMubmFtZSxcbiAgICAgICAgICB0aGlzLmRhdGFQYXRoLFxuICAgICAgICAgIHsgY29tcG9uZW50OiB0aGlzIH1cbiAgICAgICAgKVxuICAgICAgICBjb25zdCB7IGZvcm1hdCB9ID0gdGhpcy5zY2hlbWFcbiAgICAgICAgLy8gYHNjaGVtYS5mb3JtYXRgIGlzIG9ubHkgZXZlciBjYWxsZWQgaW4gdGhlIGxpZmUtY3ljbGVcbiAgICAgICAgLy8gb2YgdGhlIGNvbXBvbmVudCBhbmQgdGh1cyBpdCdzIG9rIHRvIGJpbmQgaXQgdG8gYHRoaXNgXG4gICAgICAgIHJldHVybiBmb3JtYXRcbiAgICAgICAgICA/IGZvcm1hdC5jYWxsKHRoaXMsIG5ldyBEaXRvQ29udGV4dCh0aGlzLCB7IHZhbHVlIH0pKVxuICAgICAgICAgIDogdmFsdWVcbiAgICAgIH0sXG5cbiAgICAgIHNldCh2YWx1ZSkge1xuICAgICAgICBjb25zdCB7IHBhcnNlIH0gPSB0aGlzLnNjaGVtYVxuICAgICAgICAvLyBgc2NoZW1hLnBhcnNlYCBpcyBvbmx5IGV2ZXIgY2FsbGVkIGluIHRoZSBsaWZlLWN5Y2xlXG4gICAgICAgIC8vIG9mIHRoZSBjb21wb25lbnQgYW5kIHRodXMgaXQncyBvayB0byBiaW5kIGl0IHRvIGB0aGlzYFxuICAgICAgICB0aGlzLnBhcnNlZFZhbHVlID0gcGFyc2VcbiAgICAgICAgICA/IHBhcnNlLmNhbGwodGhpcywgbmV3IERpdG9Db250ZXh0KHRoaXMsIHsgdmFsdWUgfSkpXG4gICAgICAgICAgOiB2YWx1ZVxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdnVlL25vLW11dGF0aW5nLXByb3BzXG4gICAgICAgIHRoaXMuZGF0YVt0aGlzLm5hbWVdID0gdGhpcy5wYXJzZWRWYWx1ZVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBwYXJlbnREYXRhKCkge1xuICAgICAgY29uc3QgZGF0YSA9IGdldFBhcmVudEl0ZW0odGhpcy5yb290RGF0YSwgdGhpcy5kYXRhUGF0aCwgdGhpcy5uZXN0ZWQpXG4gICAgICByZXR1cm4gZGF0YSAhPT0gdGhpcy5kYXRhID8gZGF0YSA6IG51bGxcbiAgICB9LFxuXG4gICAgcHJvY2Vzc2VkRGF0YSgpIHtcbiAgICAgIC8vIFdlIGNhbiBvbmx5IGdldCB0aGUgcHJvY2Vzc2VkIGRhdGEgdGhyb3VnaCB0aGUgc2NoZW1hQ29tcG9uZW50LCBidXRcbiAgICAgIC8vIHRoYXQncyBub3QgbmVjZXNzYXJpbHkgdGhlIGl0ZW0gcmVwcmVzZW50ZWQgYnkgdGhpcyBjb21wb25lbnQuXG4gICAgICAvLyBTb2x1dGlvbjogRmluZCB0aGUgcmVsYXRpdmUgcGF0aCBhbmQgdGhlIHByb2Nlc3NlZCBzdWItaXRlbSBmcm9tIHRoZXJlOlxuICAgICAgY29uc3QgeyBzY2hlbWFDb21wb25lbnQgfSA9IHRoaXNcbiAgICAgIHJldHVybiBnZXRJdGVtKFxuICAgICAgICBzY2hlbWFDb21wb25lbnQucHJvY2Vzc2VkRGF0YSxcbiAgICAgICAgLy8gR2V0IHRoZSBkYXRhUGF0aCByZWxhdGl2ZSB0byB0aGUgc2NoZW1hQ29tcG9uZW50J3MgZGF0YTpcbiAgICAgICAgdGhpcy5kYXRhUGF0aC5zbGljZShzY2hlbWFDb21wb25lbnQuZGF0YVBhdGgubGVuZ3RoKSxcbiAgICAgICAgdGhpcy5uZXN0ZWRcbiAgICAgIClcbiAgICB9LFxuXG4gICAgLy8gVGhlIGZvbGxvd2luZyBjb21wdXRlZCBwcm9wZXJ0aWVzIGFyZSBzaW1pbGFyIHRvIGBEaXRvQ29udGV4dGBcbiAgICAvLyBwcm9wZXJ0aWVzLCBzbyB0aGF0IHdlIGNhbiBhY2Nlc3MgdGhlc2Ugb24gYHRoaXNgIGFzIHdlbGw6XG4gICAgaXRlbSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFcbiAgICB9LFxuXG4gICAgcGFyZW50SXRlbSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnBhcmVudERhdGFcbiAgICB9LFxuXG4gICAgcm9vdEl0ZW0oKSB7XG4gICAgICByZXR1cm4gdGhpcy5yb290RGF0YVxuICAgIH0sXG5cbiAgICBwcm9jZXNzZWRJdGVtKCkge1xuICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc2VkRGF0YVxuICAgIH0sXG5cbiAgICBsYWJlbDogZ2V0U2NoZW1hQWNjZXNzb3IoJ2xhYmVsJywge1xuICAgICAgdHlwZTogW1N0cmluZywgQm9vbGVhbl0sXG4gICAgICBnZXQobGFiZWwpIHtcbiAgICAgICAgcmV0dXJuIGlzU3RyaW5nKGxhYmVsKVxuICAgICAgICAgID8gbGFiZWxcbiAgICAgICAgICA6IGxhYmVsICE9PSBmYWxzZSAmJiB0aGlzLiRvcHRpb25zLmdlbmVyYXRlTGFiZWxcbiAgICAgICAgICAgID8gdGhpcy5nZXRMYWJlbCh0aGlzLnNjaGVtYSlcbiAgICAgICAgICAgIDogbnVsbFxuICAgICAgfVxuICAgIH0pLFxuXG4gICAgd2lkdGg6IGdldFNjaGVtYUFjY2Vzc29yKCd3aWR0aCcsIHtcbiAgICAgIHR5cGU6IFtTdHJpbmcsIE51bWJlcl1cbiAgICB9KSxcblxuICAgIHZpc2libGU6IGdldFNjaGVtYUFjY2Vzc29yKCd2aXNpYmxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiRvcHRpb25zLmRlZmF1bHRWaXNpYmxlXG4gICAgICB9XG4gICAgfSksXG5cbiAgICAvLyBUT0RPOiBSZW5hbWUgdG8gYGV4Y2x1ZGVkYCBmb3IgY29uc2lzdGVudCBuYW1pbmc/XG4gICAgZXhjbHVkZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ2V4Y2x1ZGUnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9KSxcblxuICAgIHJlcXVpcmVkOiBnZXRTY2hlbWFBY2Nlc3NvcigncmVxdWlyZWQnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9KSxcblxuICAgIC8vIFRPRE86IE1vdmUgdGhlc2UgdG8gYSBzdWItY2xhc3MgY29tcG9uZW50IHVzZWQgZm9yIGFsbCBpbnB1dCBjb21wb25lbnRzP1xuICAgIHJlYWRvbmx5OiBnZXRTY2hlbWFBY2Nlc3NvcigncmVhZG9ubHknLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9KSxcblxuICAgIGF1dG9mb2N1czogZ2V0U2NoZW1hQWNjZXNzb3IoJ2F1dG9mb2N1cycsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0pLFxuXG4gICAgLy8gVG8gYmUgdXNlZCBmb3Igc2VsZWN0cyBhbmQgaW5wdXRzIG9ubHk/XG4gICAgY2xlYXJhYmxlOiBnZXRTY2hlbWFBY2Nlc3NvcignY2xlYXJhYmxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSksXG5cbiAgICBwbGFjZWhvbGRlcjogZ2V0U2NoZW1hQWNjZXNzb3IoJ3BsYWNlaG9sZGVyJywge1xuICAgICAgdHlwZTogU3RyaW5nXG4gICAgfSksXG5cbiAgICBhdXRvY29tcGxldGU6IGdldFNjaGVtYUFjY2Vzc29yKCdhdXRvY29tcGxldGUnLCB7XG4gICAgICB0eXBlOiBTdHJpbmdcbiAgICB9KSxcblxuICAgIGV2ZW50cygpIHtcbiAgICAgIGNvbnN0IGV2ZW50cyA9IHRoaXMuZ2V0RXZlbnRzKClcbiAgICAgIC8vIFJlZ2lzdGVyIGNhbGxiYWNrcyBmb3IgYWxsIHByb3ZpZGVzIG5vbi1yZWNvZ25pemVkIGV2ZW50cyxcbiAgICAgIC8vIGFzc3VtaW5nIHRoZXkgYXJlIG5hdGl2ZSBldmVudHMuXG4gICAgICAvLyBUT0RPOiBNb3ZlIHRvIHZ1ZTMtc3R5bGUgYG9uW0EtWl1gIGV2ZW50IGhhbmRsZXJzIG5hbWluZyB0aGF0IGFyZW4ndFxuICAgICAgLy8gbmFtZXNwYWNlZCBpbiBgc2NoZW1hLmV2ZW50c2Agb25jZSB0aGUgdHJhbnNpdGlvbiBpcyBjb21wbGV0ZS5cbiAgICAgIGZvciAoY29uc3QgZXZlbnQgb2YgT2JqZWN0LmtleXModGhpcy5zY2hlbWEuZXZlbnRzIHx8IHt9KSkge1xuICAgICAgICBldmVudHNbYG9uJHtjYW1lbGl6ZShldmVudCwgdHJ1ZSl9YF0gPz89ICgpID0+IHtcbiAgICAgICAgICB0aGlzLmVtaXRFdmVudChldmVudClcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGV2ZW50c1xuICAgIH0sXG5cbiAgICBhdHRyaWJ1dGVzKCkge1xuICAgICAgY29uc3QgeyBuYXRpdmVGaWVsZCwgdGV4dEZpZWxkIH0gPSB0aGlzLiRvcHRpb25zXG5cbiAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSB7XG4gICAgICAgIC4uLnRoaXMuZXZlbnRzLFxuICAgICAgICBkaXNhYmxlZDogdGhpcy5kaXNhYmxlZFxuICAgICAgfVxuXG4gICAgICBpZiAobmF0aXZlRmllbGQpIHtcbiAgICAgICAgYXR0cmlidXRlcy5uYW1lID0gdGhpcy5uYW1lXG4gICAgICAgIGlmICh0aGlzLmxhYmVsKSB7XG4gICAgICAgICAgYXR0cmlidXRlcy50aXRsZSA9IHRoaXMubGFiZWxcbiAgICAgICAgfVxuICAgICAgICBhdHRyaWJ1dGVzLnJlYWRvbmx5ID0gdGhpcy5yZWFkb25seVxuICAgICAgICBhdHRyaWJ1dGVzLmF1dG9mb2N1cyA9IHRoaXMuYXV0b2ZvY3VzXG4gICAgICAgIGlmICh0ZXh0RmllbGQpIHtcbiAgICAgICAgICBhdHRyaWJ1dGVzLnBsYWNlaG9sZGVyID0gdGhpcy5wbGFjZWhvbGRlclxuICAgICAgICAgIGF0dHJpYnV0ZXMuYXV0b2NvbXBsZXRlID0gdGhpcy5hdXRvY29tcGxldGVcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXR0cmlidXRlc1xuICAgIH0sXG5cbiAgICB2YWxpZGF0aW9ucygpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25zID0geyAuLi50aGlzLmdldFZhbGlkYXRpb25zKCkgfVxuICAgICAgaWYgKHRoaXMucmVxdWlyZWQpIHtcbiAgICAgICAgdmFsaWRhdGlvbnMucmVxdWlyZWQgPSB0cnVlXG4gICAgICB9XG4gICAgICAvLyBBbGxvdyBzY2hlbWEgdG8gb3ZlcnJpZGUgZGVmYXVsdCBydWxlcyBhbmQgYWRkIGFueSBuZXcgb25lczpcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuc2NoZW1hLnJ1bGVzIHx8IHt9KSkge1xuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGRlbGV0ZSB2YWxpZGF0aW9uc1trZXldXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsaWRhdGlvbnNba2V5XSA9IHZhbHVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWxpZGF0aW9uc1xuICAgIH0sXG5cbiAgICBzaG93Q2xlYXJCdXR0b24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5jbGVhcmFibGUgJiYgdGhpcy52YWx1ZSAhPSBudWxsXG4gICAgfVxuICB9LFxuXG4gIGNyZWF0ZWQoKSB7XG4gICAgdGhpcy5fcmVnaXN0ZXIodHJ1ZSlcbiAgICB0aGlzLnNldHVwU2NoZW1hRmllbGRzKClcbiAgfSxcblxuICB1bm1vdW50ZWQoKSB7XG4gICAgdGhpcy5fcmVnaXN0ZXIoZmFsc2UpXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIF9yZWdpc3RlcihhZGQpIHtcbiAgICAgIC8vIFByZXZlbnQgdW5uZXN0ZWQgdHlwZSBjb21wb25lbnRzIGZyb20gb3ZlcnJpZGluZyBwYXJlbnQgZGF0YSBwYXRoc1xuICAgICAgaWYgKHRoaXMubmVzdGVkKSB7XG4gICAgICAgIHRoaXMuc2NoZW1hQ29tcG9uZW50Ll9yZWdpc3RlckNvbXBvbmVudCh0aGlzLCBhZGQpXG4gICAgICB9XG4gICAgfSxcblxuICAgIC8vIEBvdmVycmlkYWJsZVxuICAgIGdldEV2ZW50cygpIHtcbiAgICAgIGNvbnN0IHsgb25Gb2N1cywgb25CbHVyLCBvbklucHV0LCBvbkNoYW5nZSB9ID0gdGhpc1xuICAgICAgcmV0dXJuIHsgb25Gb2N1cywgb25CbHVyLCBvbklucHV0LCBvbkNoYW5nZSB9XG4gICAgfSxcblxuICAgIC8vIEBvdmVycmlkYWJsZVxuICAgIGdldFZhbGlkYXRpb25zKCkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9LFxuXG4gICAgLy8gQG92ZXJyaWRhYmxlXG4gICAgZm9jdXNFbGVtZW50KCkge1xuICAgICAgY29uc3QgW2VsZW1lbnRdID0gYXNBcnJheSh0aGlzLiRyZWZzLmVsZW1lbnQpXG4gICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgZWxlbWVudC5mb2N1cygpXG4gICAgICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgaXMgZGlzYWJsZWQsIGBmb2N1cygpYCB3aWxsIGxpa2VseSBub3QgaGF2ZSB0aGVcbiAgICAgICAgICAvLyBkZXNpcmVkIGVmZmVjdC4gVXNlIGBzY3JvbGxJbnRvVmlldygpYCBpZiBhdmFpbGFibGU6XG4gICAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIDsoZWxlbWVudC4kZWwgfHwgZWxlbWVudCkuc2Nyb2xsSW50b1ZpZXc/LigpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBmb2N1cygpIHtcbiAgICAgIC8vIEFsc28gZm9jdXMgdGhpcyBjb21wb25lbnQncyBzY2hlbWEgYW5kIHBhbmVsIGluIGNhc2UgaXQncyBhIHRhYi5cbiAgICAgIHRoaXMuc2NoZW1hQ29tcG9uZW50LmZvY3VzKClcbiAgICAgIHRoaXMudGFiQ29tcG9uZW50Py5mb2N1cygpXG4gICAgICB0aGlzLmZvY3VzRWxlbWVudCgpXG4gICAgfSxcblxuICAgIGNsZWFyKCkge1xuICAgICAgdGhpcy52YWx1ZSA9IG51bGxcbiAgICAgIHRoaXMub25DaGFuZ2UoKVxuICAgIH0sXG5cbiAgICBvbkZvY3VzKCkge1xuICAgICAgdGhpcy5mb2N1c2VkID0gdHJ1ZVxuICAgICAgdGhpcy5tYXJrVG91Y2hlZCgpXG4gICAgICB0aGlzLmVtaXRFdmVudCgnZm9jdXMnKVxuICAgIH0sXG5cbiAgICBvbkJsdXIoKSB7XG4gICAgICB0aGlzLmZvY3VzZWQgPSBmYWxzZVxuICAgICAgdGhpcy52YWxpZGF0ZSgpXG4gICAgICB0aGlzLmVtaXRFdmVudCgnYmx1cicpXG4gICAgfSxcblxuICAgIG9uSW5wdXQoKSB7XG4gICAgICBjb25zb2xlLmxvZygnb25JbnB1dCgpJywgdGhpcy5uYW1lKVxuICAgICAgdGhpcy5tYXJrRGlydHkoKVxuICAgICAgdGhpcy5lbWl0RXZlbnQoJ2lucHV0JylcbiAgICB9LFxuXG4gICAgb25DaGFuZ2UoKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9XG4gICAgICAgIHRoaXMucGFyc2VkVmFsdWUgIT09IHVuZGVmaW5lZCA/IHRoaXMucGFyc2VkVmFsdWUgOiB0aGlzLnZhbHVlXG5cbiAgICAgIGlmICh0aGlzLiRvcHRpb25zLm5hdGl2ZUZpZWxkKSB7XG4gICAgICAgIC8vIEZvciBzb21lIG9kZCByZWFzb24sIHRoZSBuYXRpdmUgY2hhbmdlIGV2ZW50IG5vdyBzb21ldGltZXMgZmlyZXNcbiAgICAgICAgLy8gdHdpY2Ugb24gVnVlMy4gRmlsdGVyIG91dCBzZWNvbmQgY2FsbC5cbiAgICAgICAgLy8gVE9ETzogSW52ZXN0aWdhdGUgd2h5IHRoaXMgaGFwcGVucywgYW5kIGlmIGl0J3MgYSBidWcgaW4gVnVlMy5cbiAgICAgICAgaWYgKHZhbHVlID09PSB0aGlzLmNoYW5nZWRWYWx1ZSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdvbkNoYW5nZSgpIGRvdWJsZScsIHRoaXMubmFtZSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNoYW5nZWRWYWx1ZSA9IHZhbHVlXG4gICAgICB9XG5cbiAgICAgIGNvbnNvbGUubG9nKCdvbkNoYW5nZSgpJywgdGhpcy5uYW1lLCB2YWx1ZSlcbiAgICAgIHRoaXMubWFya0RpcnR5KClcbiAgICAgIHRoaXMuZW1pdEV2ZW50KCdjaGFuZ2UnLCB7XG4gICAgICAgIC8vIFByZXZlbnQgZW5kbGVzcyBwYXJzZSByZWN1cnNpb246XG4gICAgICAgIGNvbnRleHQ6IHsgdmFsdWUgfSxcbiAgICAgICAgLy8gUGFzcyBgc2NoZW1hQ29tcG9uZW50YCBhcyBwYXJlbnQsIHNvIGNoYW5nZSBldmVudHMgY2FuIHByb3BhZ2F0ZSB1cC5cbiAgICAgICAgcGFyZW50OiB0aGlzLnNjaGVtYUNvbXBvbmVudFxuICAgICAgfSlcbiAgICB9XG4gIH1cbn1cbiIsImNvbnN0IHVpZE1hcCA9IG5ldyBXZWFrTWFwKClcblxuLy8gR2VuZXJhdGVkIGFuZCByZW1lbWJlcnMgdW5pcXVlIGlkcyBwZXIgcGFzc2VkIG9iamVjdCB1c2luZyBhIHdlYWsgbWFwLlxubGV0IHVpZCA9IDBcbmV4cG9ydCBmdW5jdGlvbiBnZXRVaWQob2JqZWN0LCBpdGVtSWQpIHtcbiAgbGV0IGlkID0gdWlkTWFwLmdldChvYmplY3QpXG4gIGlmICghaWQpIHtcbiAgICBpZCA9IGl0ZW1JZCB8fCBgQCR7Kyt1aWR9YFxuICAgIHVpZE1hcC5zZXQob2JqZWN0LCBpZClcbiAgfVxuICByZXR1cm4gaWRcbn1cbiIsImltcG9ydCB7IGlzVGVtcG9yYXJ5SWQgfSBmcm9tICcuL2RhdGEuanMnXG5pbXBvcnQge1xuICBpc0ludGVnZXIsXG4gIGFzQXJyYXksXG4gIHBhcnNlRGF0YVBhdGgsXG4gIGdldFZhbHVlQXREYXRhUGF0aFxufSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IHsgbmFub2lkIH0gZnJvbSAnbmFub2lkJ1xuXG4vLyBTY2hlbWFHcmFwaCBpcyBhIGNsYXNzIHRvIGNvbGxlY3Qgc2NoZW1hIGdyYXBoIG1ldGEgaW5mb3JtYXRpb24gaW4gb3JkZXIgdG9cbi8vIHByb2Nlc3Mgc291cmNlcyBhbmQgcmVsYXRpb25zIGZvciB0aGUgZ2l2ZW4gdGFyZ2V0cyAnc2VydmVyJyBhbmQgJ2NsaXBib2FyZCcsXG4vLyBhY2NvcmRpbmcgdG8gdGhlIGZvbGxvd2luZyB0YWJsZTpcbi8vXG4vLyB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCAtLS0tLS0tLS0gfCAtLS0tLS0tLS0gfFxuLy8gfCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc2VydmVyICAgIHwgY2xpcGJvYXJkIHxcbi8vIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IC0tLS0tLS0tLSB8IC0tLS0tLS0tLSB8XG4vLyB8IHR5cGU6ICdyZWxhdGlvbicsIGludGVybmFsOiBmYWxzZSAgICAgICAgICAgfCBrZWVwIGlkICAgfCBrZWVwIGlkICAgfFxuLy8gfCB0eXBlOiAncmVsYXRpb24nLCBpbnRlcm5hbDogdHJ1ZSAgICAgICAgICAgIHwga2VlcCBpZCAgIHwgcmVmLCAjcmVmIHxcbi8vIHwgdHlwZTogJ3JlbGF0aW9uJywgaW50ZXJuYWw6IHRydWUsIHRlbXBvcmFyeSB8IHJlZiwgI3JlZiB8IHJlZiwgI3JlZiB8XG4vLyB8IHR5cGU6ICdzb3VyY2UnLCByZWxhdGVkOiBmYWxzZSAgICAgICAgICAgICAgfCBrZWVwIGlkICAgfCByZW1vdmUgaWQgfFxuLy8gfCB0eXBlOiAnc291cmNlJywgcmVsYXRlZDogZmFsc2UsIHRlbXBvcmFyeSAgIHwgcmVmLCAjaWQgIHwgcmVtb3ZlIGlkIHxcbi8vIHwgdHlwZTogJ3NvdXJjZScsIHJlbGF0ZWQ6IHRydWUgICAgICAgICAgICAgICB8IGtlZXAgaWQgICB8IHJlZiwgI2lkICB8XG4vLyB8IHR5cGU6ICdzb3VyY2UnLCByZWxhdGVkOiB0cnVlLCB0ZW1wb3JhcnkgICAgfCByZWYsICNpZCAgfCByZWYsICNpZCAgfFxuLy8gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgLS0tLS0tLS0tIHwgLS0tLS0tLS0tIHxcblxuZXhwb3J0IGNsYXNzIFNjaGVtYUdyYXBoIHtcbiAgZ3JhcGggPSB7fVxuICByZWZlcmVuY2VzID0ge31cblxuICBzZXQoZGF0YVBhdGgsIHNldHRpbmdzLCBkZWZhdWx0cykge1xuICAgIGRhdGFQYXRoID0gcGFyc2VEYXRhUGF0aChkYXRhUGF0aClcbiAgICBsZXQgc3ViR3JhcGggPSB0aGlzLmdyYXBoXG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIGRhdGFQYXRoKSB7XG4gICAgICBjb25zdCBrZXkgPSBpc0ludGVnZXIoK3BhcnQpID8gJyonIDogcGFydFxuICAgICAgc3ViR3JhcGggPSBzdWJHcmFwaFtrZXldID8/PSB7fVxuICAgIH1cbiAgICBzdWJHcmFwaC4kc2V0dGluZ3MgPSB7XG4gICAgICAuLi5kZWZhdWx0cywgLy8gU2VlIGBhZGRTb3VyY2UoZGF0YVBhdGgpYFxuICAgICAgLi4uc3ViR3JhcGguJHNldHRpbmdzLFxuICAgICAgLi4uc2V0dGluZ3NcbiAgICB9XG4gIH1cblxuICBhZGRTb3VyY2UoZGF0YVBhdGgsIHNjaGVtYSkge1xuICAgIC8vIE9ubHkgc2V0IGByZWxhdGVkOiBmYWxzZWAgdGhyb3VnaCB0aGUgZGVmYXVsdHMsIGFzIGBzZXRTb3VyY2VSZWxhdGVkKClgXG4gICAgLy8gbWF5IGJlIGNhbGxlZCBiZWZvcmUgYGFkZFNvdXJjZSgpYCwgZGVwZW5kaW5nIG9uIHRoZSBncmFwaCBzdHJ1Y3R1cmUuXG4gICAgdGhpcy5zZXQoZGF0YVBhdGgsIHsgdHlwZTogJ3NvdXJjZScsIHNjaGVtYSB9LCB7IHJlbGF0ZWQ6IGZhbHNlIH0pXG4gIH1cblxuICBzZXRTb3VyY2VSZWxhdGVkKGRhdGFQYXRoKSB7XG4gICAgdGhpcy5zZXQoZGF0YVBhdGgsIHtcbiAgICAgIHJlbGF0ZWQ6IHRydWUsXG4gICAgICByZWZlcmVuY2U6IHRoaXMuZ2V0UmVmZXJlbmNlUHJlZml4KGRhdGFQYXRoKVxuICAgIH0pXG4gIH1cblxuICBhZGRSZWxhdGlvbihkYXRhUGF0aCwgcmVsYXRlZERhdGFQYXRoLCBzY2hlbWEpIHtcbiAgICB0aGlzLnNldChkYXRhUGF0aCwge1xuICAgICAgdHlwZTogJ3JlbGF0aW9uJyxcbiAgICAgIHNjaGVtYSxcbiAgICAgIGludGVybmFsOiAhIXJlbGF0ZWREYXRhUGF0aCxcbiAgICAgIHJlZmVyZW5jZTogdGhpcy5nZXRSZWZlcmVuY2VQcmVmaXgocmVsYXRlZERhdGFQYXRoKVxuICAgIH0pXG4gIH1cblxuICBnZXRSZWZlcmVuY2VQcmVmaXgoZGF0YVBhdGgpIHtcbiAgICByZXR1cm4gZGF0YVBhdGhcbiAgICAgID8gKHRoaXMucmVmZXJlbmNlc1tkYXRhUGF0aF0gPz89IG5hbm9pZCg2KSlcbiAgICAgIDogbnVsbFxuICB9XG5cbiAgZmxhdHRlbigpIHtcbiAgICBjb25zdCBmbGF0dGVuID0gZ3JhcGggPT4ge1xuICAgICAgY29uc3QgZW50cmllcyA9IFtdXG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHsgJHNldHRpbmdzLCAuLi5zdWJHcmFwaCB9XSBvZiBPYmplY3QuZW50cmllcyhncmFwaCkpIHtcbiAgICAgICAgaWYgKCRzZXR0aW5ncykge1xuICAgICAgICAgIGVudHJpZXMucHVzaChba2V5LCAkc2V0dGluZ3NdKVxuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgW3N1YktleSwgc2V0dGluZ3NdIG9mIGZsYXR0ZW4oc3ViR3JhcGgpKSB7XG4gICAgICAgICAgZW50cmllcy5wdXNoKFtgJHtrZXl9LyR7c3ViS2V5fWAsIHNldHRpbmdzXSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGVudHJpZXNcbiAgICB9XG5cbiAgICByZXR1cm4gZmxhdHRlbih0aGlzLmdyYXBoKVxuICB9XG5cbiAgcHJvY2Vzcyhzb3VyY2VTY2hlbWEsIGRhdGEsIHsgdGFyZ2V0IH0pIHtcbiAgICBjb25zdCBjbGlwYm9hcmQgPSB0YXJnZXQgPT09ICdjbGlwYm9hcmQnXG4gICAgaWYgKGNsaXBib2FyZCkge1xuICAgICAgZGVsZXRlIGRhdGFbc291cmNlU2NoZW1hLmlkS2V5IHx8ICdpZCddXG4gICAgfVxuICAgIGZvciAoY29uc3QgW2RhdGFQYXRoLCBzZXR0aW5nc10gb2YgdGhpcy5mbGF0dGVuKCkpIHtcbiAgICAgIGNvbnN0IHsgdHlwZSwgc2NoZW1hLCBpbnRlcm5hbCwgcmVsYXRlZCwgcmVmZXJlbmNlIH0gPSBzZXR0aW5nc1xuICAgICAgY29uc3Qgc291cmNlID0gdHlwZSA9PT0gJ3NvdXJjZSdcbiAgICAgIGNvbnN0IHJlbGF0aW9uID0gdHlwZSA9PT0gJ3JlbGF0aW9uJ1xuICAgICAgaWYgKHNvdXJjZSB8fCByZWxhdGlvbiAmJiBpbnRlcm5hbCkge1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSBnZXRWYWx1ZUF0RGF0YVBhdGgoZGF0YSwgZGF0YVBhdGgsICgpID0+IG51bGwpXG4gICAgICAgIGNvbnN0IHJlbW92ZUlkID0gY2xpcGJvYXJkICYmIHNvdXJjZSAmJiAhcmVsYXRlZFxuICAgICAgICBjb25zdCByZWZlcmVuY2VJZCA9IChcbiAgICAgICAgICBjbGlwYm9hcmQgJiYgKFxuICAgICAgICAgICAgcmVsYXRpb24gJiYgaW50ZXJuYWwgfHxcbiAgICAgICAgICAgIHNvdXJjZSAmJiByZWxhdGVkXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgYXNBcnJheSh2YWx1ZXMpLmZsYXQoKSkge1xuICAgICAgICAgIGNvbnN0IGlkS2V5ID0gKFxuICAgICAgICAgICAgc291cmNlICYmIHNjaGVtYS5pZEtleSB8fFxuICAgICAgICAgICAgcmVsYXRpb24gJiYgc2NoZW1hLnJlbGF0ZUJ5IHx8XG4gICAgICAgICAgICAnaWQnXG4gICAgICAgICAgKVxuICAgICAgICAgIGxldCBpZCA9IHZhbHVlPy5baWRLZXldXG4gICAgICAgICAgaWYgKGlkICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChyZW1vdmVJZCkge1xuICAgICAgICAgICAgICBkZWxldGUgdmFsdWVbaWRLZXldXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVmZXJlbmNlSWQgfHwgaXNUZW1wb3JhcnlJZChpZCkpIHtcbiAgICAgICAgICAgICAgaWYgKGlzVGVtcG9yYXJ5SWQoaWQpKSB7XG4gICAgICAgICAgICAgICAgaWQgPSBpZC5zbGljZSgxKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IHJlZktleSA9IGNsaXBib2FyZFxuICAgICAgICAgICAgICAgID8gLy8gQ2xpcGJvYXJkIGp1c3QgbmVlZHMgdGVtcG9yYXJ5IGlkcyB1bmRlciB0aGUgYWN0dWFsIGBpZEtleWBcbiAgICAgICAgICAgICAgICAgIGlkS2V5XG4gICAgICAgICAgICAgICAgOiAvLyBTZXJ2ZXIgd2FudHMgT2JqZWN0aW9uLXN0eWxlICcjaWQnIC8gJyNyZWYnIHBhaXJzLlxuICAgICAgICAgICAgICAgICAgc291cmNlXG4gICAgICAgICAgICAgICAgICA/ICcjaWQnXG4gICAgICAgICAgICAgICAgICA6ICcjcmVmJ1xuICAgICAgICAgICAgICBjb25zdCByZXZWYWx1ZSA9IGNsaXBib2FyZFxuICAgICAgICAgICAgICAgID8gYEAke2lkfWBcbiAgICAgICAgICAgICAgICA6IC8vIEtlZXAgdGhlIGlkcyB1bmlxdWUgaW4gcmVmZXJlbmNlIGdyb3Vwcywgc2luY2UgdGhleVxuICAgICAgICAgICAgICAgICAgLy8gcmVmZXJlbmNlIGFjcm9zcyB0aGUgZnVsbCBncmFwaC5cbiAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZVxuICAgICAgICAgICAgICAgICAgPyBgJHtyZWZlcmVuY2V9LSR7aWR9YFxuICAgICAgICAgICAgICAgICAgOiBpZCAvLyBBIHRlbXBvcmFyeSBpZCB3aXRob3V0IGEgcmVsYXRlZCwganVzdCBwcmVzZXJ2ZSBpdC5cbiAgICAgICAgICAgICAgdmFsdWVbcmVmS2V5XSA9IHJldlZhbHVlXG4gICAgICAgICAgICAgIGlmIChyZWZLZXkgIT09IGlkS2V5KSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHZhbHVlW2lkS2V5XVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhXG4gIH1cbn1cbiIsImltcG9ydCBEaXRvQ29udGV4dCBmcm9tICcuLi9EaXRvQ29udGV4dC5qcydcbmltcG9ydCBEaXRvTWl4aW4gZnJvbSAnLi4vbWl4aW5zL0RpdG9NaXhpbi5qcydcbmltcG9ydCBUeXBlTWl4aW4gZnJvbSAnLi4vbWl4aW5zL1R5cGVNaXhpbi5qcydcbmltcG9ydCB7IGdldFVpZCB9IGZyb20gJy4vdWlkLmpzJ1xuaW1wb3J0IHsgU2NoZW1hR3JhcGggfSBmcm9tICcuL1NjaGVtYUdyYXBoLmpzJ1xuaW1wb3J0IHsgYXBwZW5kRGF0YVBhdGgsIGlzVGVtcG9yYXJ5SWQgfSBmcm9tICcuL2RhdGEuanMnXG5pbXBvcnQge1xuICBpc09iamVjdCxcbiAgaXNTdHJpbmcsXG4gIGlzQXJyYXksXG4gIGlzRnVuY3Rpb24sXG4gIGlzUHJvbWlzZSxcbiAgaXNNb2R1bGUsXG4gIGNsb25lLFxuICBtZXJnZSxcbiAgY2FtZWxpemUsXG4gIG1hcENvbmN1cnJlbnRseVxufSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IHsgbWFya1JhdyB9IGZyb20gJ3Z1ZSdcblxuY29uc3QgdHlwZUNvbXBvbmVudHMgPSB7fVxuY29uc3QgdW5rbm93blR5cGVSZXBvcnRlZCA9IHt9XG5cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlclR5cGVDb21wb25lbnQodHlwZSwgY29tcG9uZW50KSB7XG4gIHR5cGVDb21wb25lbnRzW3R5cGVdID0gY29tcG9uZW50XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUeXBlQ29tcG9uZW50KHR5cGUsIGFsbG93TnVsbCA9IGZhbHNlKSB7XG4gIGNvbnN0IGNvbXBvbmVudCA9IHR5cGVDb21wb25lbnRzW3R5cGVdIHx8IG51bGxcbiAgaWYgKCFjb21wb25lbnQgJiYgIWFsbG93TnVsbCAmJiAhdW5rbm93blR5cGVSZXBvcnRlZFt0eXBlXSkge1xuICAgIC8vIFJlcG9ydCBlYWNoIG1pc3NpbmcgdHlwZSBvbmx5IG9uY2UsIHRvIGF2b2lkIGZsb29kaW5nIHRoZSBjb25zb2xlOlxuICAgIHVua25vd25UeXBlUmVwb3J0ZWRbdHlwZV0gPSB0cnVlXG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIERpdG8gY29tcG9uZW50IHR5cGU6ICcke3R5cGV9J2ApXG4gIH1cbiAgcmV0dXJuIGNvbXBvbmVudFxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXRlcmF0ZVNjaGVtYUNvbXBvbmVudHMoc2NoZW1hcywgY2FsbGJhY2spIHtcbiAgZm9yIChjb25zdCBzY2hlbWEgb2Ygc2NoZW1hcykge1xuICAgIGlmIChpc1NpbmdsZUNvbXBvbmVudFZpZXcoc2NoZW1hKSkge1xuICAgICAgY29uc3QgcmVzID0gY2FsbGJhY2soc2NoZW1hLmNvbXBvbmVudCwgc2NoZW1hLm5hbWUsIDApXG4gICAgICBpZiAocmVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHJlc1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IFtuYW1lLCBjb21wb25lbnRdIG9mIE9iamVjdC5lbnRyaWVzKHNjaGVtYS5jb21wb25lbnRzIHx8IHt9KSkge1xuICAgICAgICBjb25zdCByZXMgPSBjYWxsYmFjayhjb21wb25lbnQsIG5hbWUsIDEpXG4gICAgICAgIGlmIChyZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiByZXNcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXRlcmF0ZU5lc3RlZFNjaGVtYUNvbXBvbmVudHMoc2NoZW1hLCBjYWxsYmFjaykge1xuICByZXR1cm4gc2NoZW1hXG4gICAgPyBpdGVyYXRlU2NoZW1hQ29tcG9uZW50cyhbc2NoZW1hLCAuLi5nZXRUYWJTY2hlbWFzKHNjaGVtYSldLCBjYWxsYmFjaylcbiAgICA6IHVuZGVmaW5lZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFNjaGVtYUNvbXBvbmVudChzY2hlbWEsIGNhbGxiYWNrKSB7XG4gIHJldHVybiAoXG4gICAgaXRlcmF0ZU5lc3RlZFNjaGVtYUNvbXBvbmVudHMoXG4gICAgICBzY2hlbWEsXG4gICAgICBjb21wb25lbnQgPT4gKGNhbGxiYWNrKGNvbXBvbmVudCkgPyBjb21wb25lbnQgOiB1bmRlZmluZWQpXG4gICAgKSB8fCBudWxsXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNvbWVTY2hlbWFDb21wb25lbnQoc2NoZW1hLCBjYWxsYmFjaykge1xuICByZXR1cm4gKFxuICAgIGl0ZXJhdGVOZXN0ZWRTY2hlbWFDb21wb25lbnRzKFxuICAgICAgc2NoZW1hLFxuICAgICAgY29tcG9uZW50ID0+IChjYWxsYmFjayhjb21wb25lbnQpID8gdHJ1ZSA6IHVuZGVmaW5lZClcbiAgICApID09PSB0cnVlXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV2ZXJ5U2NoZW1hQ29tcG9uZW50KHNjaGVtYSwgY2FsbGJhY2spIHtcbiAgcmV0dXJuIChcbiAgICBpdGVyYXRlTmVzdGVkU2NoZW1hQ29tcG9uZW50cyhcbiAgICAgIHNjaGVtYSxcbiAgICAgIGNvbXBvbmVudCA9PiAoY2FsbGJhY2soY29tcG9uZW50KSA/IHVuZGVmaW5lZCA6IGZhbHNlKVxuICAgICkgIT09IGZhbHNlXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU2NoZW1hKHNjaGVtYSkge1xuICByZXR1cm4gaXNPYmplY3Qoc2NoZW1hKSAmJiBpc1N0cmluZyhzY2hlbWEudHlwZSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRm9ybShzY2hlbWEpIHtcbiAgcmV0dXJuIGlzU2NoZW1hKHNjaGVtYSkgJiYgc2NoZW1hLnR5cGUgPT09ICdmb3JtJ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNWaWV3KHNjaGVtYSkge1xuICByZXR1cm4gaXNTY2hlbWEoc2NoZW1hKSAmJiBzY2hlbWEudHlwZSA9PT0gJ3ZpZXcnXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1RhYihzY2hlbWEpIHtcbiAgcmV0dXJuIGlzU2NoZW1hKHNjaGVtYSkgJiYgc2NoZW1hLnR5cGUgPT09ICd0YWInXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1BhbmVsKHNjaGVtYSkge1xuICByZXR1cm4gaXNTY2hlbWEoc2NoZW1hKSAmJiBzY2hlbWEudHlwZSA9PT0gJ3BhbmVsJ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2NoZW1hSWRlbnRpZmllcihzY2hlbWEpIHtcbiAgcmV0dXJuIHNjaGVtYS5uYW1lIHx8IHNjaGVtYS5sYWJlbCB8fCBzY2hlbWEudHlwZVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVNjaGVtYShzY2hlbWEsIHVud3JhcE1vZHVsZSA9IGZhbHNlKSB7XG4gIGlmIChpc0Z1bmN0aW9uKHNjaGVtYSkpIHtcbiAgICBzY2hlbWEgPSBzY2hlbWEoKVxuICB9XG4gIGlmIChpc1Byb21pc2Uoc2NoZW1hKSkge1xuICAgIHNjaGVtYSA9IGF3YWl0IHNjaGVtYVxuICB9XG4gIGlmIChpc01vZHVsZShzY2hlbWEpKSB7XG4gICAgLy8gQ29weSB0byBjb252ZXJ0IGZyb20gbW9kdWxlIHRvIG9iamVjdDpcbiAgICBzY2hlbWEgPSB7IC4uLnNjaGVtYSB9XG4gICAgLy8gVW53cmFwIGRlZmF1bHQgb3IgbmFtZWQgc2NoZW1hXG4gICAgaWYgKCFzY2hlbWEubmFtZSAmJiAodW53cmFwTW9kdWxlIHx8IHNjaGVtYS5kZWZhdWx0KSkge1xuICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHNjaGVtYSlcbiAgICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb25zdCBuYW1lID0ga2V5c1swXVxuICAgICAgICBzY2hlbWEgPSBzY2hlbWFbbmFtZV1cbiAgICAgICAgaWYgKG5hbWUgIT09ICdkZWZhdWx0Jykge1xuICAgICAgICAgIHNjaGVtYS5uYW1lID0gbmFtZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBzY2hlbWFcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVTY2hlbWFzKFxuICB1bnJlc29sdmVkU2NoZW1hcyxcbiAgcmVzb2x2ZUl0ZW0gPSByZXNvbHZlU2NoZW1hXG4pIHtcbiAgbGV0IHNjaGVtYXMgPSBpc0Z1bmN0aW9uKHVucmVzb2x2ZWRTY2hlbWFzKVxuICAgID8gdW5yZXNvbHZlZFNjaGVtYXMoKVxuICAgIDogdW5yZXNvbHZlZFNjaGVtYXNcbiAgc2NoZW1hcyA9IGF3YWl0IHJlc29sdmVTY2hlbWEoc2NoZW1hcywgZmFsc2UpXG4gIGlmIChpc0FycmF5KHNjaGVtYXMpKSB7XG4gICAgLy8gVHJhbnNsYXRlIGFuIGFycmF5IG9mIGR5bmFtaWMgaW1wb3J0LCBlYWNoIGltcG9ydGluZyBvbmUgbmFtZWQgc2NoZW1hXG4gICAgLy8gbW9kdWxlIHRvIGFuIG9iamVjdCB3aXRoIG5hbWVkIGVudHJpZXMuXG4gICAgc2NoZW1hcyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIGF3YWl0IG1hcENvbmN1cnJlbnRseShcbiAgICAgICAgc2NoZW1hcyxcbiAgICAgICAgYXN5bmMgaXRlbSA9PiB7XG4gICAgICAgICAgY29uc3Qgc2NoZW1hID0gYXdhaXQgcmVzb2x2ZUl0ZW0oaXRlbSwgdHJ1ZSlcbiAgICAgICAgICByZXR1cm4gW3NjaGVtYS5uYW1lLCBzY2hlbWFdXG4gICAgICAgIH1cbiAgICAgIClcbiAgICApXG4gIH0gZWxzZSBpZiAoaXNPYmplY3Qoc2NoZW1hcykpIHtcbiAgICBzY2hlbWFzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgYXdhaXQgbWFwQ29uY3VycmVudGx5KFxuICAgICAgICBPYmplY3QuZW50cmllcyhzY2hlbWFzKSxcbiAgICAgICAgYXN5bmMgKFtrZXksIGl0ZW1dKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc2NoZW1hID0gYXdhaXQgcmVzb2x2ZUl0ZW0oaXRlbSwgdHJ1ZSlcbiAgICAgICAgICByZXR1cm4gW2tleSwgc2NoZW1hXVxuICAgICAgICB9XG4gICAgICApXG4gICAgKVxuICB9XG4gIHJldHVybiBzY2hlbWFzXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlU2NoZW1hQ29tcG9uZW50KHNjaGVtYSkge1xuICAvLyBSZXNvbHZlcyBhc3luYyBzY2hlbWEgY29tcG9uZW50cyBhbmQgYWRkcyBEaXRvTWl4aW4gYW5kIFR5cGVNaXhpbiB0byB0aGVtLlxuICBsZXQgeyBjb21wb25lbnQgfSA9IHNjaGVtYVxuICBpZiAoY29tcG9uZW50KSB7XG4gICAgY29tcG9uZW50ID0gYXdhaXQgcmVzb2x2ZVNjaGVtYShjb21wb25lbnQsIHRydWUpXG4gICAgaWYgKGNvbXBvbmVudCkge1xuICAgICAgLy8gUHJldmVudCB3YXJuaW5nOiBcIlZ1ZSByZWNlaXZlZCBhIENvbXBvbmVudCB3aGljaCB3YXMgbWFkZSBhIHJlYWN0aXZlXG4gICAgICAvLyBvYmplY3QuIFRoaXMgY2FuIGxlYWQgdG8gdW5uZWNlc3NhcnkgcGVyZm9ybWFuY2Ugb3ZlcmhlYWQsIGFuZCBzaG91bGRcbiAgICAgIC8vIGJlIGF2b2lkZWQgYnkgbWFya2luZyB0aGUgY29tcG9uZW50IHdpdGggYG1hcmtSYXdgXCI6XG4gICAgICBzY2hlbWEuY29tcG9uZW50ID0gbWFya1Jhdyh7XG4gICAgICAgIC4uLmNvbXBvbmVudCxcbiAgICAgICAgbWl4aW5zOiBbRGl0b01peGluLCBUeXBlTWl4aW4sIC4uLihjb21wb25lbnQubWl4aW5zIHx8IFtdKV1cbiAgICAgIH0pXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlU2NoZW1hQ29tcG9uZW50cyhzY2hlbWFzKSB7XG4gIC8vIGBzY2hlbWFzYCBhcmUgb2YgdGhlIHNhbWUgcG9zc2libGUgZm9ybXMgYXMgcGFzc2VkIHRvIGBnZXROYW1lZFNjaGVtYXMoKWBcbiAgYXdhaXQgbWFwQ29uY3VycmVudGx5KE9iamVjdC52YWx1ZXMoc2NoZW1hcyB8fCB7fSksIHJlc29sdmVTY2hlbWFDb21wb25lbnQpXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9jZXNzU2NoZW1hQ29tcG9uZW50cyhcbiAgYXBpLFxuICBzY2hlbWEsXG4gIHJvdXRlcyA9IG51bGwsXG4gIGxldmVsID0gMFxuKSB7XG4gIGNvbnN0IHByb21pc2VzID0gW11cbiAgY29uc3QgcHJvY2VzcyA9IChjb21wb25lbnQsIG5hbWUsIHJlbGF0aXZlTGV2ZWwpID0+IHtcbiAgICBwcm9taXNlcy5wdXNoKFxuICAgICAgcHJvY2Vzc1NjaGVtYUNvbXBvbmVudChcbiAgICAgICAgYXBpLFxuICAgICAgICBjb21wb25lbnQsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHJvdXRlcyxcbiAgICAgICAgbGV2ZWwgKyByZWxhdGl2ZUxldmVsXG4gICAgICApXG4gICAgKVxuICB9XG5cbiAgaXRlcmF0ZU5lc3RlZFNjaGVtYUNvbXBvbmVudHMoc2NoZW1hLCBwcm9jZXNzKVxuICBpdGVyYXRlU2NoZW1hQ29tcG9uZW50cyhnZXRQYW5lbFNjaGVtYXMoc2NoZW1hKSwgcHJvY2VzcylcblxuICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcylcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NTY2hlbWFDb21wb25lbnQoXG4gIGFwaSxcbiAgc2NoZW1hLFxuICBuYW1lLFxuICByb3V0ZXMgPSBudWxsLFxuICBsZXZlbCA9IDBcbikge1xuICBwcm9jZXNzU2NoZW1hRGVmYXVsdHMoYXBpLCBzY2hlbWEpXG5cbiAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIC8vIEFsc28gcHJvY2VzcyBuZXN0ZWQgcGFuZWwgc2NoZW1hcy5cbiAgICBtYXBDb25jdXJyZW50bHkoXG4gICAgICBnZXRQYW5lbFNjaGVtYXMoc2NoZW1hKSxcbiAgICAgIHBhbmVsID0+IHByb2Nlc3NTY2hlbWFDb21wb25lbnRzKGFwaSwgcGFuZWwsIHJvdXRlcywgbGV2ZWwpXG4gICAgKSxcbiAgICAvLyBEZWxlZ2F0ZSBzY2hlbWEgcHJvY2Vzc2luZyB0byB0aGUgYWN0dWFsIHR5cGUgY29tcG9uZW50cy5cbiAgICBnZXRUeXBlT3B0aW9ucyhzY2hlbWEpPy5wcm9jZXNzU2NoZW1hPy4oXG4gICAgICBhcGksXG4gICAgICBzY2hlbWEsXG4gICAgICBuYW1lLFxuICAgICAgcm91dGVzLFxuICAgICAgbGV2ZWxcbiAgICApXG4gIF0pXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9jZXNzVmlldyhjb21wb25lbnQsIGFwaSwgc2NoZW1hLCBuYW1lKSB7XG4gIGlmICghaXNWaWV3KHNjaGVtYSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdmlldyBzY2hlbWE6ICcke2dldFNjaGVtYUlkZW50aWZpZXIoc2NoZW1hKX0nYClcbiAgfVxuICBwcm9jZXNzUm91dGVTY2hlbWEoYXBpLCBzY2hlbWEsIG5hbWUpXG4gIHByb2Nlc3NTY2hlbWFEZWZhdWx0cyhhcGksIHNjaGVtYSlcbiAgYXdhaXQgcHJvY2Vzc05lc3RlZFNjaGVtYXMoYXBpLCBzY2hlbWEpXG4gIGNvbnN0IGNoaWxkcmVuID0gW11cbiAgYXdhaXQgcHJvY2Vzc1NjaGVtYUNvbXBvbmVudHMoYXBpLCBzY2hlbWEsIGNoaWxkcmVuLCAwKVxuICByZXR1cm4ge1xuICAgIHBhdGg6IGAvJHtzY2hlbWEucGF0aH1gLFxuICAgIGNoaWxkcmVuLFxuICAgIGNvbXBvbmVudCxcbiAgICBtZXRhOiB7XG4gICAgICBhcGksXG4gICAgICBzY2hlbWFcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NTY2hlbWFEZWZhdWx0cyhhcGksIHNjaGVtYSkge1xuICBsZXQgZGVmYXVsdHMgPSBhcGkuZGVmYXVsdHNbc2NoZW1hLnR5cGVdXG4gIGlmIChkZWZhdWx0cykge1xuICAgIGlmIChpc0Z1bmN0aW9uKGRlZmF1bHRzKSkge1xuICAgICAgZGVmYXVsdHMgPSBkZWZhdWx0cyhzY2hlbWEpXG4gICAgfVxuICAgIGlmIChpc09iamVjdChkZWZhdWx0cykpIHtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRlZmF1bHRzKSkge1xuICAgICAgICBpZiAoc2NoZW1hW2tleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHNjaGVtYVtrZXldID0gdmFsdWVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzY2hlbWFba2V5XSA9IG1lcmdlKHZhbHVlLCBzY2hlbWFba2V5XSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc05lc3RlZFNjaGVtYURlZmF1bHRzKGFwaSwgc2NoZW1hKSB7XG4gIC8vIFByb2Nlc3MgZGVmYXVsdHMgZm9yIG5lc3RlZCBzY2hlbWFzLiBOb3RlIHRoYXQgdGhpcyBpcyBhbHNvIGRvbmUgd2hlblxuICAvLyBjYWxsaW5nIGBwcm9jZXNzU2NoZW1hQ29tcG9uZW50cygpYCwgYnV0IHRoYXQgZnVuY3Rpb24gaXMgYXN5bmMsIGFuZCB3ZVxuICAvLyBuZWVkIGEgc3luYyB2ZXJzaW9uIHRoYXQgb25seSBoYW5kbGVzIHRoZSBkZWZhdWx0cyBmb3IgZmlsdGVycywgc2VlXG4gIC8vIGBnZXRGaWx0ZXJzUGFuZWwoKWAuXG4gIGl0ZXJhdGVOZXN0ZWRTY2hlbWFDb21wb25lbnRzKHNjaGVtYSwgY29tcG9uZW50ID0+IHtcbiAgICBwcm9jZXNzU2NoZW1hRGVmYXVsdHMoYXBpLCBjb21wb25lbnQpXG4gICAgY29uc3QgZm9ybXMgPSBnZXRGb3JtU2NoZW1hcyhjb21wb25lbnQpXG4gICAgZm9yIChjb25zdCBmb3JtIG9mIE9iamVjdC52YWx1ZXMoZm9ybXMpKSB7XG4gICAgICBwcm9jZXNzTmVzdGVkU2NoZW1hRGVmYXVsdHMoYXBpLCBmb3JtKVxuICAgIH1cbiAgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NSb3V0ZVNjaGVtYShhcGksIHNjaGVtYSwgbmFtZSkge1xuICAvLyBVc2VkIGZvciB2aWV3IGFuZCBzb3VyY2Ugc2NoZW1hcywgc2VlIFNvdXJjZU1peGluLlxuICBzY2hlbWEubmFtZSA9IG5hbWVcbiAgc2NoZW1hLnBhdGggfHw9IGFwaS5ub3JtYWxpemVQYXRoKG5hbWUpXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9jZXNzRm9ybXMoYXBpLCBzY2hlbWEsIGxldmVsKSB7XG4gIC8vIEZpcnN0IHJlc29sdmUgdGhlIGZvcm1zIGFuZCBzdG9yZSB0aGUgcmVzdWx0cyBiYWNrIG9uIHRoZSBzY2hlbWEuXG4gIGxldCB7IGZvcm0sIGZvcm1zLCBjb21wb25lbnRzIH0gPSBzY2hlbWFcbiAgaWYgKGZvcm1zKSB7XG4gICAgZm9ybXMgPSBzY2hlbWEuZm9ybXMgPSBhd2FpdCByZXNvbHZlU2NoZW1hcyhmb3JtcywgZm9ybSA9PlxuICAgICAgcHJvY2Vzc0Zvcm0oYXBpLCBmb3JtKVxuICAgIClcbiAgfSBlbHNlIGlmIChmb3JtKSB7XG4gICAgZm9ybSA9IHNjaGVtYS5mb3JtID0gYXdhaXQgcHJvY2Vzc0Zvcm0oYXBpLCBmb3JtKVxuICB9IGVsc2UgaWYgKGNvbXBvbmVudHMpIHtcbiAgICAvLyBOT1RFOiBQcm9jZXNzaW5nIGZvcm1zIGluIGNvbXB1dGVkIGNvbXBvbmVudHMgaXMgbm90IHN1cHBvcnRlZCwgc2luY2UgaXRcbiAgICAvLyBvbmx5IGNhbiBiZSBjb21wdXRlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGFjdHVhbCBkYXRhLlxuICAgIGlmIChpc09iamVjdChjb21wb25lbnRzKSkge1xuICAgICAgZm9ybSA9IHsgY29tcG9uZW50cyB9XG4gICAgfVxuICB9XG5cbiAgZm9ybXMgfHw9IHsgZGVmYXVsdDogZm9ybSB9IC8vIE9ubHkgdXNlZCBmb3IgcHJvY2VzcyBsb29wIGJlbG93LlxuICBjb25zdCBjaGlsZHJlbiA9IFtdXG4gIGZvciAoY29uc3QgZm9ybSBvZiBPYmplY3QudmFsdWVzKGZvcm1zKSkge1xuICAgIGF3YWl0IHByb2Nlc3NTY2hlbWFDb21wb25lbnRzKGFwaSwgZm9ybSwgY2hpbGRyZW4sIGxldmVsKVxuICB9XG4gIHJldHVybiBjaGlsZHJlblxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0Zvcm0oYXBpLCBzY2hlbWEpIHtcbiAgc2NoZW1hID0gYXdhaXQgcmVzb2x2ZVNjaGVtYShzY2hlbWEsIHRydWUpXG4gIGlmICghaXNGb3JtKHNjaGVtYSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZm9ybSBzY2hlbWE6ICcke2dldFNjaGVtYUlkZW50aWZpZXIoc2NoZW1hKX0nYClcbiAgfVxuICBwcm9jZXNzU2NoZW1hRGVmYXVsdHMoYXBpLCBzY2hlbWEpXG4gIGF3YWl0IHByb2Nlc3NOZXN0ZWRTY2hlbWFzKGFwaSwgc2NoZW1hKVxuICByZXR1cm4gc2NoZW1hXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9jZXNzVGFiKGFwaSwgc2NoZW1hKSB7XG4gIHNjaGVtYSA9IGF3YWl0IHJlc29sdmVTY2hlbWEoc2NoZW1hLCB0cnVlKVxuICBpZiAoIWlzVGFiKHNjaGVtYSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdGFiIHNjaGVtYTogJyR7Z2V0U2NoZW1hSWRlbnRpZmllcihzY2hlbWEpfSdgKVxuICB9XG4gIHByb2Nlc3NTY2hlbWFEZWZhdWx0cyhhcGksIHNjaGVtYSlcbiAgcmV0dXJuIHNjaGVtYVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc1BhbmVsKGFwaSwgc2NoZW1hKSB7XG4gIHNjaGVtYSA9IGF3YWl0IHJlc29sdmVTY2hlbWEoc2NoZW1hLCB0cnVlKVxuICBpZiAoIWlzUGFuZWwoc2NoZW1hKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYW5lbCBzY2hlbWE6ICcke2dldFNjaGVtYUlkZW50aWZpZXIoc2NoZW1hKX0nYClcbiAgfVxuICBwcm9jZXNzU2NoZW1hRGVmYXVsdHMoYXBpLCBzY2hlbWEpXG4gIHJldHVybiBzY2hlbWFcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NOZXN0ZWRTY2hlbWFzKGFwaSwgc2NoZW1hKSB7XG4gIGNvbnN0IHsgdGFicywgcGFuZWxzIH0gPSBzY2hlbWFcbiAgaWYgKHRhYnMpIHtcbiAgICBzY2hlbWEudGFicyA9IGF3YWl0IHJlc29sdmVTY2hlbWFzKFxuICAgICAgdGFicyxcbiAgICAgIHRhYiA9PiBwcm9jZXNzVGFiKGFwaSwgdGFiKVxuICAgIClcbiAgfVxuICBpZiAocGFuZWxzKSB7XG4gICAgc2NoZW1hLnBhbmVscyA9IGF3YWl0IHJlc29sdmVTY2hlbWFzKFxuICAgICAgcGFuZWxzLFxuICAgICAgcGFuZWwgPT4gcHJvY2Vzc1BhbmVsKGFwaSwgcGFuZWwpXG4gICAgKVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNGb3JtU2NoZW1hKHNjaGVtYSkge1xuICAvLyBTdXBwb3J0IGJvdGggc2luZ2xlIGZvcm0gYW5kIG11bHRpcGxlIGZvcm1zIG5vdGF0aW9uLCBhcyB3ZWxsIGFzIGlubGluZWRcbiAgLy8gY29tcG9uZW50cy5cbiAgcmV0dXJuIChcbiAgICBpc1NjaGVtYShzY2hlbWEpICYmXG4gICAgaXNPYmplY3Qoc2NoZW1hLmZvcm0gfHwgc2NoZW1hLmZvcm1zIHx8IHNjaGVtYS5jb21wb25lbnRzKVxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNNdWx0aXBsZUZvcm1TY2hlbWFzKHNjaGVtYSkge1xuICByZXR1cm4gKFxuICAgIGlzU2NoZW1hKHNjaGVtYSkgJiZcbiAgICBPYmplY3Qua2V5cyhzY2hlbWE/LmZvcm1zIHx8IHt9KS5sZW5ndGggPiAxXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU2luZ2xlQ29tcG9uZW50VmlldyhzY2hlbWEpIHtcbiAgcmV0dXJuIChcbiAgICBpc1ZpZXcoc2NoZW1hKSAmJlxuICAgIGlzT2JqZWN0KHNjaGVtYS5jb21wb25lbnQpXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFZpZXdGb3JtU2NoZW1hKHNjaGVtYSwgY29udGV4dCkge1xuICBjb25zdCB7IHZpZXcgfSA9IHNjaGVtYVxuICBjb25zdCB2aWV3U2NoZW1hID0gdmlldyAmJiBjb250ZXh0LnZpZXdzW3ZpZXddXG4gIHJldHVybiB2aWV3U2NoZW1hXG4gICAgPyAvLyBOT1RFOiBWaWV3cyBjYW4gaGF2ZSB0YWJzLCBpbiB3aGljaCBjYXNlIHRoZSB2aWV3IGNvbXBvbmVudCBpcyBuZXN0ZWRcbiAgICAgIC8vIGluIG9uZSBvZiB0aGUgdGFicywgZ28gZmluZCBpdC5cbiAgICAgIGZpbmRTY2hlbWFDb21wb25lbnQodmlld1NjaGVtYSwgaGFzRm9ybVNjaGVtYSkgfHwgbnVsbFxuICAgIDogbnVsbFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Vmlld1NjaGVtYShzY2hlbWEsIGNvbnRleHQpIHtcbiAgcmV0dXJuIGdldFZpZXdGb3JtU2NoZW1hKHNjaGVtYSwgY29udGV4dClcbiAgICA/IGNvbnRleHQudmlld3Nbc2NoZW1hLnZpZXddXG4gICAgOiBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRWaWV3RWRpdFBhdGgoc2NoZW1hLCBjb250ZXh0KSB7XG4gIGNvbnN0IHZpZXcgPSBnZXRWaWV3U2NoZW1hKHNjaGVtYSwgY29udGV4dClcbiAgcmV0dXJuIHZpZXdcbiAgICA/IGlzU2luZ2xlQ29tcG9uZW50Vmlldyh2aWV3KVxuICAgICAgPyBgLyR7dmlldy5wYXRofWBcbiAgICAgIDogYC8ke3ZpZXcucGF0aH0vJHt2aWV3LnBhdGh9YFxuICAgIDogbnVsbFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybVNjaGVtYXMoc2NoZW1hLCBjb250ZXh0LCBtb2RpZnlGb3JtKSB7XG4gIGNvbnN0IHZpZXdTY2hlbWEgPSBjb250ZXh0ICYmIGdldFZpZXdGb3JtU2NoZW1hKHNjaGVtYSwgY29udGV4dClcbiAgaWYgKHZpZXdTY2hlbWEpIHtcbiAgICBzY2hlbWEgPSB2aWV3U2NoZW1hXG4gIH0gZWxzZSBpZiAoc2NoZW1hLnZpZXcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gdmlldzogJyR7c2NoZW1hLnZpZXd9J2ApXG4gIH1cblxuICBsZXQgeyBmb3JtLCBmb3JtcywgY29tcG9uZW50cywgY29tcGFjdCB9ID0gc2NoZW1hXG4gIGlmICghZm9ybSAmJiAhZm9ybXMpIHtcbiAgICBpZiAoY29tcG9uZW50cykge1xuICAgICAgLy8gQ29udmVydCBpbmxpbmVkIGNvbXBvbmVudHMgdG8gZm9ybXMsIHN1cHBvcnRpbmcgYGNvbXBhY3RgIHNldHRpbmcuXG4gICAgICBmb3JtID0geyBjb21wb25lbnRzLCBjb21wYWN0IH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTm8gYGZvcm1zYCwgYGZvcm1gIG9yIGBjb21wb25lbnRzYCwgcmV0dXJuIGFuZCBlbXB0eSBgZm9ybXNgIG9iamVjdC5cbiAgICAgIHJldHVybiB7fVxuICAgIH1cbiAgfVxuICBmb3JtcyB8fD0geyBkZWZhdWx0OiBmb3JtIH1cbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhmb3JtcykubWFwKChbdHlwZSwgZm9ybV0pID0+IHtcbiAgICAgIC8vIFN1cHBvcnQgYHNjaGVtYS5jb21wb25lbnRzYCBjYWxsYmFja3MgdG8gY3JlYXRlIGNvbXBvbmVudHMgb24gdGhlIGZseS5cbiAgICAgIGlmIChjb250ZXh0ICYmIGlzRnVuY3Rpb24oZm9ybS5jb21wb25lbnRzKSkge1xuICAgICAgICBmb3JtID0ge1xuICAgICAgICAgIC4uLmZvcm0sXG4gICAgICAgICAgY29tcG9uZW50czogZm9ybS5jb21wb25lbnRzKGNvbnRleHQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBbdHlwZSwgbW9kaWZ5Rm9ybT8uKGZvcm0pID8/IGZvcm1dXG4gICAgfSlcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SXRlbUZvcm1TY2hlbWFGcm9tRm9ybXMoZm9ybXMsIGl0ZW0pIHtcbiAgcmV0dXJuIGZvcm1zW2l0ZW0/LnR5cGVdIHx8IGZvcm1zLmRlZmF1bHQgfHwgbnVsbFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SXRlbUZvcm1TY2hlbWEoc2NoZW1hLCBpdGVtLCBjb250ZXh0KSB7XG4gIHJldHVybiBnZXRJdGVtRm9ybVNjaGVtYUZyb21Gb3JtcyhnZXRGb3JtU2NoZW1hcyhzY2hlbWEsIGNvbnRleHQpLCBpdGVtKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDb21wYWN0KHNjaGVtYSkge1xuICByZXR1cm4gISFzY2hlbWEuY29tcGFjdFxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNJbmxpbmVkKHNjaGVtYSkge1xuICByZXR1cm4gISEoc2NoZW1hLmlubGluZWQgfHwgc2NoZW1hLmNvbXBvbmVudHMpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc05lc3RlZChzY2hlbWEpIHtcbiAgcmV0dXJuICEhKHNjaGVtYS5uZXN0ZWQgfHwgZ2V0VHlwZU9wdGlvbnMoc2NoZW1hKT8uZGVmYXVsdE5lc3RlZCA9PT0gdHJ1ZSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9taXRQYWRkaW5nKHNjaGVtYSkge1xuICByZXR1cm4gISFnZXRUeXBlT3B0aW9ucyhzY2hlbWEpPy5vbWl0UGFkZGluZ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWxpZ25Cb3R0b20oc2NoZW1hKSB7XG4gIHJldHVybiAhIWdldFR5cGVPcHRpb25zKHNjaGVtYSk/LmFsaWduQm90dG9tXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWZhdWx0VmFsdWUoc2NoZW1hKSB7XG4gIC8vIFN1cHBvcnQgZGVmYXVsdCB2YWx1ZXMgYm90aCBvbiBzY2hlbWEgYW5kIG9uIGNvbXBvbmVudCBsZXZlbC5cbiAgLy8gTk9URTogQXQgdGhlIHRpbWUgb2YgY3JlYXRpb24sIGNvbXBvbmVudHMgbWF5IG5vdCBiZSBpbnN0YW50aWF0ZWQsIChlLmcuIGlmXG4gIC8vIGVudHJpZXMgYXJlIGNyZWF0ZWQgdGhyb3VnaCBuZXN0ZWQgZm9ybXMsIHRoZSBwYXJlbnQgZm9ybSBpc24ndCBtb3VudGVkKSBzb1xuICAvLyB3ZSBjYW4ndCB1c2UgYGRhdGFQYXRoYCB0byBnZXQgdG8gY29tcG9uZW50cywgYW5kIHRoZSBgZGVmYXVsdFZhbHVlYCBmcm9tXG4gIC8vIHRoZXJlLiBUaGF0J3Mgd2h5IGBkZWZhdWx0VmFsdWVgIGlzIGRlZmluZWQgc3RhdGljYWxseSBpbiB0aGUgY29tcG9uZW50czpcbiAgY29uc3QgZGVmYXVsdFZhbHVlID0gc2NoZW1hLmRlZmF1bHRcbiAgY29uc3QgdmFsdWUgPVxuICAgIGRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkXG4gICAgICA/IGRlZmF1bHRWYWx1ZVxuICAgICAgOiBnZXRUeXBlT3B0aW9ucyhzY2hlbWEpPy5kZWZhdWx0VmFsdWVcbiAgcmV0dXJuIGlzRnVuY3Rpb24odmFsdWUpXG4gICAgPyB2YWx1ZShzY2hlbWEpXG4gICAgOiBjbG9uZSh2YWx1ZSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZU1pc3NpbmdWYWx1ZShzY2hlbWEpIHtcbiAgY29uc3QgdHlwZU9wdGlvbnMgPSBnZXRUeXBlT3B0aW9ucyhzY2hlbWEpXG4gIHJldHVybiAhIShcbiAgICB0eXBlT3B0aW9ucz8uZXhjbHVkZVZhbHVlIHx8IHR5cGVPcHRpb25zPy5pZ25vcmVNaXNzaW5nVmFsdWU/LihzY2hlbWEpXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldERlZmF1bHRWYWx1ZXMoc2NoZW1hLCBkYXRhID0ge30sIGNvbXBvbmVudCkge1xuICBjb25zdCBvcHRpb25zID0geyBjb21wb25lbnQsIHJvb3REYXRhOiBkYXRhIH1cblxuICBjb25zdCBwcm9jZXNzQmVmb3JlID0gKHNjaGVtYSwgZGF0YSwgbmFtZSkgPT4ge1xuICAgIGlmICghKG5hbWUgaW4gZGF0YSkgJiYgIWlnbm9yZU1pc3NpbmdWYWx1ZShzY2hlbWEpKSB7XG4gICAgICBkYXRhW25hbWVdID0gZ2V0RGVmYXVsdFZhbHVlKHNjaGVtYSlcbiAgICB9XG4gIH1cblxuICAvLyBTZXRzIHVwIGEgZGF0YSBvYmplY3QgdGhhdCBoYXMga2V5cyB3aXRoIGRlZmF1bHQgdmFsdWVzIGZvciBhbGxcbiAgLy8gZm9ybSBmaWVsZHMsIHNvIHRoZXkgY2FuIGJlIGNvcnJlY3RseSB3YXRjaGVkIGZvciBjaGFuZ2VzLlxuICByZXR1cm4gcHJvY2Vzc1NjaGVtYURhdGEoXG4gICAgc2NoZW1hLFxuICAgIGRhdGEsXG4gICAgbnVsbCxcbiAgICBudWxsLFxuICAgIHByb2Nlc3NCZWZvcmUsXG4gICAgbnVsbCxcbiAgICBvcHRpb25zXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVWYWx1ZShzY2hlbWEsIGRhdGEsIG5hbWUsIGRhdGFQYXRoLCB7XG4gIGNvbXBvbmVudCA9IG51bGwsXG4gIHJvb3REYXRhID0gY29tcG9uZW50Py5yb290RGF0YVxufSA9IHt9KSB7XG4gIGNvbnN0IHsgY29tcHV0ZSB9ID0gc2NoZW1hXG4gIGlmIChjb21wdXRlKSB7XG4gICAgY29uc3QgdmFsdWUgPSBjb21wdXRlKFxuICAgICAgRGl0b0NvbnRleHQuZ2V0KGNvbXBvbmVudCwge1xuICAgICAgICBzY2hlbWEsXG4gICAgICAgIC8vIE92ZXJyaWRlIHZhbHVlIHRvIHByZXZlbnQgZW5kbGVzcyByZWN1cnNpb24gdGhyb3VnaCBjYWxsaW5nIHRoZVxuICAgICAgICAvLyBnZXR0ZXIgZm9yIGB0aGlzLnZhbHVlYCBpbiBgRGl0b0NvbnRleHRgOlxuICAgICAgICB2YWx1ZTogZGF0YVtuYW1lXSxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgZGF0YSxcbiAgICAgICAgZGF0YVBhdGgsXG4gICAgICAgIHJvb3REYXRhXG4gICAgICB9KVxuICAgIClcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gQWNjZXNzIGBkYXRhW25hbWVdYCBkaXJlY3RseSBpbnN0ZWFkIG9mIGB0aGlzLnZhbHVlID0g4oCmYCB0byB1cGRhdGUgdGhlXG4gICAgICAvLyB2YWx1ZSB3aXRob3V0IGNhbGxpbmcgcGFyc2UoKTpcbiAgICAgIGRhdGFbbmFtZV0gPSB2YWx1ZVxuICAgIH1cbiAgfVxuICAvLyBJZiB0aGUgdmFsdWUgaXMgc3RpbGwgbWlzc2luZyBhZnRlciBjb21wdXRlLCBzZXQgdGhlIGRlZmF1bHQgZm9yIGl0OlxuICBpZiAoIShuYW1lIGluIGRhdGEpICYmICFpZ25vcmVNaXNzaW5nVmFsdWUoc2NoZW1hKSkge1xuICAgIGRhdGFbbmFtZV0gPSBnZXREZWZhdWx0VmFsdWUoc2NoZW1hKVxuICB9XG4gIC8vIE5vdyBhY2Nlc3MgdGhlIHZhbHVlLiBUaGlzIGlzIGltcG9ydGFudCBmb3IgcmVhY3Rpdml0eSBhbmQgbmVlZHMgdG9cbiAgLy8gaGFwcGVuIGFmdGVyIGFsbCBwcmlvciBtYW5pcHVsYXRpb24gb2YgYGRhdGFbbmFtZV1gLCBzZWUgYWJvdmU6XG4gIHJldHVybiBkYXRhW25hbWVdXG59XG5cbmZ1bmN0aW9uIGNsb25lSXRlbShzb3VyY2VTY2hlbWEsIGl0ZW0sIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMuc2NoZW1hT25seSkge1xuICAgIGNvbnN0IGNvcHkgPSB7fVxuICAgIGNvbnN0IHsgaWRLZXkgPSAnaWQnLCBvcmRlcktleSB9ID0gc291cmNlU2NoZW1hXG4gICAgY29uc3QgaWQgPSBpdGVtW2lkS2V5XVxuICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb3B5W2lkS2V5XSA9IGlkXG4gICAgfVxuICAgIC8vIENvcHkgb3ZlciB0eXBlIGluIGNhc2UgdGhlcmUgYXJlIG11bHRpcGxlIGZvcm1zIHRvIGNob29zZSBmcm9tLlxuICAgIGlmIChoYXNNdWx0aXBsZUZvcm1TY2hlbWFzKHNvdXJjZVNjaGVtYSkpIHtcbiAgICAgIGNvcHkudHlwZSA9IGl0ZW0udHlwZVxuICAgIH1cbiAgICBpZiAob3JkZXJLZXkpIHtcbiAgICAgIGNvcHlbb3JkZXJLZXldID0gaXRlbVtvcmRlcktleV1cbiAgICB9XG4gICAgcmV0dXJuIGNvcHlcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4geyAuLi5pdGVtIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc0RhdGEoc2NoZW1hLCBzb3VyY2VTY2hlbWEsIGRhdGEsIGRhdGFQYXRoLCB7XG4gIGNvbXBvbmVudCxcbiAgc2NoZW1hT25seSwgLy8gd2hldGhlciB0byBvbmx5IGluY2x1ZGUgZGF0YSBjb3ZlcmVkIGJ5IHRoZSBzY2hlbWEsIG9yIGFsbCBkYXRhXG4gIHRhcmdldFxufSA9IHt9KSB7XG4gIGNvbnN0IG9wdGlvbnMgPSB7IGNvbXBvbmVudCwgc2NoZW1hT25seSwgdGFyZ2V0LCByb290RGF0YTogZGF0YSB9XG4gIGNvbnN0IHByb2Nlc3NlZERhdGEgPSBjbG9uZUl0ZW0oc291cmNlU2NoZW1hLCBkYXRhLCBvcHRpb25zKVxuICBjb25zdCBncmFwaCA9IG5ldyBTY2hlbWFHcmFwaCgpXG5cbiAgY29uc3QgcHJvY2Vzc0JlZm9yZSA9IChzY2hlbWEsIGRhdGEsIG5hbWUsIGRhdGFQYXRoLCBwcm9jZXNzZWREYXRhKSA9PiB7XG4gICAgbGV0IHZhbHVlID0gY29tcHV0ZVZhbHVlKHNjaGVtYSwgZGF0YSwgbmFtZSwgZGF0YVBhdGgsIG9wdGlvbnMpXG4gICAgLy8gVGhlIHNjaGVtYSBleHBlY3RzIHRoZSBgd3JhcFByaW1pdGl2ZXNgIHRyYW5zZm9ybWF0aW9ucyB0byBiZSBwcmVzZW50IG9uXG4gICAgLy8gdGhlIGRhdGEgdGhhdCBpdCBpcyBhcHBsaWVkIG9uLCBzbyB3YXJwIGJlZm9yZSBhbmQgdW53cmFwIGFmdGVyLlxuICAgIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgICAgY29uc3QgeyB3cmFwUHJpbWl0aXZlcywgb3JkZXJLZXksIGlkS2V5ID0gJ2lkJyB9ID0gc2NoZW1hXG4gICAgICBpZiAod3JhcFByaW1pdGl2ZXMpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5tYXAoZW50cnkgPT4gKHtcbiAgICAgICAgICBbd3JhcFByaW1pdGl2ZXNdOiBlbnRyeVxuICAgICAgICB9KSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEFsd2F5cyBzaGFsbG93LWNsb25lIGFycmF5IHZhbHVlczpcbiAgICAgICAgdmFsdWUgPSBbLi4udmFsdWVdXG4gICAgICB9XG4gICAgICBpZiAob3JkZXJLZXkgJiYgdGFyZ2V0ID09PSAnY2xpcGJvYXJkJykge1xuICAgICAgICAvLyBTb3J0IHRoZSBkYXRhIGJhY2sgaW50byB0aGUgbmF0dXJhbCBzZXF1ZW5jZSBhcyBkZWZpbmVkIGJ5IHRoZWlyIGlkcyxcbiAgICAgICAgLy8gc28gY29weS1wYXN0aW5nIGJldHdlZW4gc2VydmVycyAoZS5nLiBuZXN0ZWQgZm9udC1jdXRzIG9uIExpbmV0bylcbiAgICAgICAgLy8gbmF0dXJhbGx5IGdldHMgbWFwcGVkIHRvIHRoZSBzYW1lIGVudHJpZXMgaW4gdGhlIGdyYXBoLlxuICAgICAgICB2YWx1ZS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgY29uc3QgaWQxID0gYT8uW2lkS2V5XVxuICAgICAgICAgIGNvbnN0IGlkMiA9IGI/LltpZEtleV1cbiAgICAgICAgICByZXR1cm4gaWQxID09IG51bGwgfHwgaXNUZW1wb3JhcnlJZChpZDEpXG4gICAgICAgICAgICA/IDFcbiAgICAgICAgICAgIDogaWQyID09IG51bGwgfHwgaXNUZW1wb3JhcnlJZChpZDIpXG4gICAgICAgICAgICAgID8gLTFcbiAgICAgICAgICAgICAgOiBpZDEgLSBpZDJcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gICAgcHJvY2Vzc2VkRGF0YVtuYW1lXSA9IHZhbHVlXG4gIH1cblxuICBjb25zdCBwcm9jZXNzQWZ0ZXIgPSAoc2NoZW1hLCBkYXRhLCBuYW1lLCBkYXRhUGF0aCwgcHJvY2Vzc2VkRGF0YSkgPT4ge1xuICAgIGNvbnN0IHsgd3JhcFByaW1pdGl2ZXMsIGV4Y2x1ZGUsIHByb2Nlc3MgfSA9IHNjaGVtYVxuICAgIGxldCB2YWx1ZSA9IHByb2Nlc3NlZERhdGFbbmFtZV1cblxuICAgIGNvbnN0IHR5cGVPcHRpb25zID0gZ2V0VHlwZU9wdGlvbnMoc2NoZW1hKVxuXG4gICAgLy8gTk9URTogV2UgZG9uJ3QgY2FjaGUgdGhpcyBjb250ZXh0LCBzaW5jZSBgdmFsdWVgIGlzIGNoYW5naW5nLlxuICAgIGNvbnN0IGdldENvbnRleHQgPSAoKSA9PlxuICAgICAgRGl0b0NvbnRleHQuZ2V0KGNvbXBvbmVudCwge1xuICAgICAgICBzY2hlbWEsXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBuYW1lLFxuICAgICAgICBkYXRhLFxuICAgICAgICBkYXRhUGF0aCxcbiAgICAgICAgcm9vdERhdGE6IG9wdGlvbnMucm9vdERhdGEsXG4gICAgICAgIC8vIFBhc3MgdGhlIGFscmVhZHkgcHJvY2Vzc2VkIGRhdGEgdG8gYHByb2Nlc3MoKWAsIHNvIGl0IGNhbiBiZSBtb2RpZmllZFxuICAgICAgICAvLyB0aHJvdWdoIGBwcm9jZXNzZWRJdGVtYCBmcm9tIHRoZXJlLlxuICAgICAgICBwcm9jZXNzZWREYXRhXG4gICAgICB9KVxuXG4gICAgLy8gRmlyc3QgdW53cmFwIHRoZSB3cmFwcGVkIHByaW1pdGl2ZXMgYWdhaW4sIHRvIGJyaW5nIHRoZSBkYXRhIGJhY2sgaW50b1xuICAgIC8vIGl0cyBuYXRpdmUgZm9ybS4gU2UgYHByb2Nlc3NCZWZvcmUoKWAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICBpZiAod3JhcFByaW1pdGl2ZXMgJiYgaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHZhbHVlID0gdmFsdWUubWFwKG9iamVjdCA9PiBvYmplY3Rbd3JhcFByaW1pdGl2ZXNdKVxuICAgIH1cblxuICAgIC8vIEhhbmRsZSB0aGUgdXNlcidzIGBwcm9jZXNzKClgIGNhbGxiYWNrIGZpcnN0LCBpZiBvbmUgaXMgcHJvdmlkZWQsIHNvIHRoYXRcbiAgICAvLyBpdCBjYW4gbW9kaWZ5IGRhdGEgaW4gYHByb2Nlc3NlZERhdGFgIGV2ZW4gaWYgaXQgcHJvdmlkZXMgYGV4Y2x1ZGU6IHRydWVgXG4gICAgaWYgKHByb2Nlc3MpIHtcbiAgICAgIHZhbHVlID0gcHJvY2VzcyhnZXRDb250ZXh0KCkpXG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdHlwZU9wdGlvbnM/LmV4Y2x1ZGVWYWx1ZSB8fFxuICAgICAgLy8gU3VwcG9ydCBmdW5jdGlvbnMgbmV4dCB0byBib29sZWFucyBmb3IgYHNjaGVtYS5leGNsdWRlYDpcbiAgICAgIGV4Y2x1ZGUgPT09IHRydWUgfHxcbiAgICAgIGlzRnVuY3Rpb24oZXhjbHVkZSkgJiYgZXhjbHVkZShnZXRDb250ZXh0KCkpXG4gICAgKSB7XG4gICAgICBkZWxldGUgcHJvY2Vzc2VkRGF0YVtuYW1lXVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBFYWNoIGNvbXBvbmVudCB0eXBlIGNhbiBwcm92aWRlIGl0cyBvd24gc3RhdGljIGBwcm9jZXNzVmFsdWUoKWAgbWV0aG9kXG4gICAgICAvLyB0byBjb252ZXJ0IHRoZSBkYXRhIGZvciBzdG9yYWdlLlxuICAgICAgY29uc3QgcHJvY2Vzc1ZhbHVlID0gdHlwZU9wdGlvbnM/LnByb2Nlc3NWYWx1ZVxuICAgICAgaWYgKHByb2Nlc3NWYWx1ZSkge1xuICAgICAgICB2YWx1ZSA9IHByb2Nlc3NWYWx1ZShzY2hlbWEsIHZhbHVlLCBkYXRhUGF0aCwgZ3JhcGgpXG4gICAgICB9XG4gICAgICBwcm9jZXNzZWREYXRhW25hbWVdID0gdmFsdWVcbiAgICB9XG4gIH1cblxuICBwcm9jZXNzU2NoZW1hRGF0YShcbiAgICBzY2hlbWEsXG4gICAgZGF0YSxcbiAgICBkYXRhUGF0aCxcbiAgICBwcm9jZXNzZWREYXRhLFxuICAgIHByb2Nlc3NCZWZvcmUsXG4gICAgcHJvY2Vzc0FmdGVyLFxuICAgIG9wdGlvbnNcbiAgKVxuXG4gIHJldHVybiBncmFwaC5wcm9jZXNzKHNvdXJjZVNjaGVtYSwgcHJvY2Vzc2VkRGF0YSwgb3B0aW9ucylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NTY2hlbWFEYXRhKFxuICBzY2hlbWEsXG4gIGRhdGEsXG4gIGRhdGFQYXRoLFxuICBwcm9jZXNzZWREYXRhLFxuICBwcm9jZXNzQmVmb3JlLFxuICBwcm9jZXNzQWZ0ZXIsXG4gIG9wdGlvbnNcbikge1xuICBjb25zdCBwcm9jZXNzQ29tcG9uZW50cyA9IGNvbXBvbmVudHMgPT4ge1xuICAgIGNvbnN0IGdldERhdGFQYXRoID0gKGRhdGFQYXRoLCB0b2tlbikgPT5cbiAgICAgIGRhdGFQYXRoICE9IG51bGxcbiAgICAgICAgPyBhcHBlbmREYXRhUGF0aChkYXRhUGF0aCwgdG9rZW4pXG4gICAgICAgIDogbnVsbFxuXG4gICAgaWYgKGNvbXBvbmVudHMpIHtcbiAgICAgIGZvciAoY29uc3QgW25hbWUsIGNvbXBvbmVudFNjaGVtYV0gb2YgT2JqZWN0LmVudHJpZXMoY29tcG9uZW50cykpIHtcbiAgICAgICAgaWYgKCFpc05lc3RlZChjb21wb25lbnRTY2hlbWEpKSB7XG4gICAgICAgICAgLy8gUmVjdXJzaXZlbHkgcHJvY2VzcyBkYXRhIG9uIHVubmVzdGVkIGNvbXBvbmVudHMuXG4gICAgICAgICAgcHJvY2Vzc1NjaGVtYURhdGEoXG4gICAgICAgICAgICBjb21wb25lbnRTY2hlbWEsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgZGF0YVBhdGgsXG4gICAgICAgICAgICBwcm9jZXNzZWREYXRhLFxuICAgICAgICAgICAgcHJvY2Vzc0JlZm9yZSxcbiAgICAgICAgICAgIHByb2Nlc3NBZnRlcixcbiAgICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgY29tcG9uZW50RGF0YVBhdGggPSBnZXREYXRhUGF0aChkYXRhUGF0aCwgbmFtZSlcblxuICAgICAgICAgIGNvbnN0IHByb2Nlc3NJdGVtID0gKGl0ZW0sIGluZGV4ID0gbnVsbCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGF0YVBhdGggPVxuICAgICAgICAgICAgICBpbmRleCAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gZ2V0RGF0YVBhdGgoY29tcG9uZW50RGF0YVBhdGgsIGluZGV4KVxuICAgICAgICAgICAgICAgIDogY29tcG9uZW50RGF0YVBhdGhcbiAgICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSBEaXRvQ29udGV4dC5nZXQob3B0aW9ucy5jb21wb25lbnQsIHtcbiAgICAgICAgICAgICAgc2NoZW1hOiBjb21wb25lbnRTY2hlbWEsXG4gICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgIHZhbHVlOiBpdGVtLFxuICAgICAgICAgICAgICBkYXRhUGF0aCxcbiAgICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICAgIHJvb3REYXRhOiBvcHRpb25zLnJvb3REYXRhXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgY29uc3QgZ2V0Rm9ybXMgPSAoXG4gICAgICAgICAgICAgIGdldFR5cGVPcHRpb25zKGNvbXBvbmVudFNjaGVtYSk/LmdldEZvcm1TY2hlbWFzRm9yUHJvY2Vzc2luZyB8fFxuICAgICAgICAgICAgICBnZXRGb3JtU2NoZW1hc1xuICAgICAgICAgICAgKVxuICAgICAgICAgICAgY29uc3QgZm9ybXMgPSBnZXRGb3Jtcyhjb21wb25lbnRTY2hlbWEsIGNvbnRleHQpXG4gICAgICAgICAgICBjb25zdCBmb3JtID0gZ2V0SXRlbUZvcm1TY2hlbWFGcm9tRm9ybXMoZm9ybXMsIGl0ZW0pXG4gICAgICAgICAgICBpZiAoZm9ybSkge1xuICAgICAgICAgICAgICBjb25zdCBwcm9jZXNzZWRJdGVtID0gcHJvY2Vzc2VkRGF0YVxuICAgICAgICAgICAgICAgID8gY2xvbmVJdGVtKGNvbXBvbmVudFNjaGVtYSwgaXRlbSwgb3B0aW9ucylcbiAgICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NTY2hlbWFEYXRhKFxuICAgICAgICAgICAgICAgIGZvcm0sXG4gICAgICAgICAgICAgICAgaXRlbSxcbiAgICAgICAgICAgICAgICBkYXRhUGF0aCxcbiAgICAgICAgICAgICAgICBwcm9jZXNzZWRJdGVtLFxuICAgICAgICAgICAgICAgIHByb2Nlc3NCZWZvcmUsXG4gICAgICAgICAgICAgICAgcHJvY2Vzc0FmdGVyLFxuICAgICAgICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gSXRlbXMgd2l0aG91dCBmb3JtcyBzdGlsbCBnZXQgZnVsbHkgKGJ1dCBzaGFsbG93bHkpIGNsb25lZC5cbiAgICAgICAgICAgICAgLy8gVE9ETzogRmluZCBvdXQgb2YgdGhpcyBpcyBhY3R1YWxseSBuZWVkZWQgLyB1c2VkIGF0IGFsbD9cbiAgICAgICAgICAgICAgcmV0dXJuIHsgLi4uaXRlbSB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcHJvY2Vzc0JlZm9yZT8uKFxuICAgICAgICAgICAgY29tcG9uZW50U2NoZW1hLFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBjb21wb25lbnREYXRhUGF0aCxcbiAgICAgICAgICAgIHByb2Nlc3NlZERhdGFcbiAgICAgICAgICApXG4gICAgICAgICAgbGV0IHZhbHVlID0gcHJvY2Vzc2VkRGF0YSA/IHByb2Nlc3NlZERhdGFbbmFtZV0gOiBkYXRhW25hbWVdXG4gICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgaGFzRm9ybVNjaGVtYShjb21wb25lbnRTY2hlbWEpKSB7XG4gICAgICAgICAgICAvLyBSZWN1cnNpdmVseSBwcm9jZXNzIGRhdGEgb24gbmVzdGVkIGZvcm0gaXRlbXMuXG4gICAgICAgICAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgLy8gT3B0aW1pemF0aW9uOiBObyBuZWVkIHRvIGNvbGxlY3QgdmFsdWVzIGlmIHdlJ3JlIG5vdCBjbG9uaW5nIVxuICAgICAgICAgICAgICB2YWx1ZSA9IHByb2Nlc3NlZERhdGFcbiAgICAgICAgICAgICAgICA/IHZhbHVlLm1hcChwcm9jZXNzSXRlbSlcbiAgICAgICAgICAgICAgICA6IHZhbHVlLmZvckVhY2gocHJvY2Vzc0l0ZW0pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB2YWx1ZSA9IHByb2Nlc3NJdGVtKHZhbHVlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByb2Nlc3NlZERhdGEpIHtcbiAgICAgICAgICAgICAgcHJvY2Vzc2VkRGF0YVtuYW1lXSA9IHZhbHVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHByb2Nlc3NBZnRlcj8uKFxuICAgICAgICAgICAgY29tcG9uZW50U2NoZW1hLFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBjb21wb25lbnREYXRhUGF0aCxcbiAgICAgICAgICAgIHByb2Nlc3NlZERhdGFcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm9jZXNzQ29tcG9uZW50cyhzY2hlbWEuY29tcG9uZW50cylcbiAgZm9yIChjb25zdCB0YWIgb2YgZ2V0VGFiU2NoZW1hcyhzY2hlbWEpKSB7XG4gICAgcHJvY2Vzc0NvbXBvbmVudHModGFiLmNvbXBvbmVudHMpXG4gIH1cbiAgZm9yIChjb25zdCBwYW5lbCBvZiBnZXRQYW5lbFNjaGVtYXMoc2NoZW1hKSkge1xuICAgIHByb2Nlc3NDb21wb25lbnRzKHBhbmVsLmNvbXBvbmVudHMpXG4gIH1cblxuICByZXR1cm4gcHJvY2Vzc2VkRGF0YSB8fCBkYXRhXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXROYW1lZFNjaGVtYXMoc2NoZW1hcywgZGVmYXVsdHMpIHtcbiAgY29uc3QgdG9PYmplY3QgPSAoYXJyYXksIHRvU2NoZW1hKSA9PiB7XG4gICAgcmV0dXJuIGFycmF5Lmxlbmd0aCA+IDBcbiAgICAgID8gYXJyYXkucmVkdWNlKChvYmplY3QsIHZhbHVlKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc2NoZW1hID0gdG9TY2hlbWEodmFsdWUpXG4gICAgICAgICAgaWYgKHNjaGVtYSkge1xuICAgICAgICAgICAgb2JqZWN0W3NjaGVtYS5uYW1lXSA9XG4gICAgICAgICAgICAgIHNjaGVtYSAmJiBkZWZhdWx0c1xuICAgICAgICAgICAgICAgID8geyAuLi5kZWZhdWx0cywgLi4uc2NoZW1hIH1cbiAgICAgICAgICAgICAgICA6IHNjaGVtYVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gb2JqZWN0XG4gICAgICAgIH0sIHt9KVxuICAgICAgOiBudWxsXG4gIH1cblxuICByZXR1cm4gaXNBcnJheShzY2hlbWFzKVxuICAgID8gdG9PYmplY3Qoc2NoZW1hcywgdmFsdWUgPT5cbiAgICAgICAgaXNPYmplY3QodmFsdWUpXG4gICAgICAgICAgPyB2YWx1ZVxuICAgICAgICAgIDoge1xuICAgICAgICAgICAgICBuYW1lOiBjYW1lbGl6ZSh2YWx1ZSwgZmFsc2UpXG4gICAgICAgICAgICB9XG4gICAgICApXG4gICAgOiBpc09iamVjdChzY2hlbWFzKVxuICAgICAgPyB0b09iamVjdChcbiAgICAgICAgICBPYmplY3QuZW50cmllcyhzY2hlbWFzKSxcbiAgICAgICAgICAoW25hbWUsIHZhbHVlXSkgPT5cbiAgICAgICAgICAgIGlzT2JqZWN0KHZhbHVlKVxuICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAuLi52YWx1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgOiBpc1N0cmluZyh2YWx1ZSlcbiAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHZhbHVlXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiBudWxsXG4gICAgICAgIClcbiAgICAgIDogbnVsbFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QnV0dG9uU2NoZW1hcyhidXR0b25zKSB7XG4gIHJldHVybiBnZXROYW1lZFNjaGVtYXMoXG4gICAgYnV0dG9ucyxcbiAgICB7IHR5cGU6ICdidXR0b24nIH0gLy8gRGVmYXVsdHNcbiAgKVxufVxuXG5mdW5jdGlvbiBnZXRUeXBlKHNjaGVtYU9yVHlwZSkge1xuICByZXR1cm4gaXNPYmplY3Qoc2NoZW1hT3JUeXBlKSA/IHNjaGVtYU9yVHlwZS50eXBlIDogc2NoZW1hT3JUeXBlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUeXBlT3B0aW9ucyhzY2hlbWFPclR5cGUpIHtcbiAgcmV0dXJuIGdldFR5cGVDb21wb25lbnQoZ2V0VHlwZShzY2hlbWFPclR5cGUpLCB0cnVlKSA/PyBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTb3VyY2VUeXBlKHNjaGVtYU9yVHlwZSkge1xuICByZXR1cm4gKFxuICAgIGdldFR5cGVPcHRpb25zKHNjaGVtYU9yVHlwZSk/LmdldFNvdXJjZVR5cGU/LihnZXRUeXBlKHNjaGVtYU9yVHlwZSkpID8/XG4gICAgbnVsbFxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYW5lbEVudHJ5KHNjaGVtYSwgZGF0YVBhdGggPSBudWxsLCB0YWJDb21wb25lbnQgPSBudWxsKSB7XG4gIHJldHVybiBzY2hlbWFcbiAgICA/IHtcbiAgICAgICAgc2NoZW1hLFxuICAgICAgICAvLyBJZiB0aGUgcGFuZWwgcHJvdmlkZXMgaXRzIG93biBuYW1lLCBhcHBlbmQgaXQgdG8gdGhlIGRhdGFQYXRoLlxuICAgICAgICAvLyBUaGlzIGlzIHVzZWQgZS5nLiBmb3IgJGZpbHRlcnMgcGFuZWxzLlxuICAgICAgICBkYXRhUGF0aDpcbiAgICAgICAgICBkYXRhUGF0aCAhPSBudWxsICYmIHNjaGVtYS5uYW1lXG4gICAgICAgICAgICA/IGFwcGVuZERhdGFQYXRoKGRhdGFQYXRoLCBzY2hlbWEubmFtZSlcbiAgICAgICAgICAgIDogZGF0YVBhdGgsXG4gICAgICAgIHRhYkNvbXBvbmVudFxuICAgICAgfVxuICAgIDogbnVsbFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFuZWxFbnRyaWVzKFxuICBwYW5lbFNjaGVtYXMsXG4gIGRhdGFQYXRoID0gbnVsbCxcbiAgdGFiQ29tcG9uZW50ID0gbnVsbCxcbiAgcGFuZWxFbnRyaWVzID0gW11cbikge1xuICBpZiAocGFuZWxTY2hlbWFzKSB7XG4gICAgZm9yIChjb25zdCBba2V5LCBzY2hlbWFdIG9mIE9iamVjdC5lbnRyaWVzKHBhbmVsU2NoZW1hcykpIHtcbiAgICAgIGNvbnN0IGVudHJ5ID0gZ2V0UGFuZWxFbnRyeShcbiAgICAgICAgc2NoZW1hLFxuICAgICAgICBkYXRhUGF0aCAhPSBudWxsID8gYXBwZW5kRGF0YVBhdGgoZGF0YVBhdGgsIGtleSkgOiBudWxsLFxuICAgICAgICB0YWJDb21wb25lbnRcbiAgICAgIClcbiAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICBwYW5lbEVudHJpZXMucHVzaChlbnRyeSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHBhbmVsRW50cmllc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGFiU2NoZW1hcyhzY2hlbWEpIHtcbiAgcmV0dXJuIHNjaGVtYT8udGFicyA/IE9iamVjdC52YWx1ZXMoc2NoZW1hLnRhYnMpIDogW11cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhbmVsU2NoZW1hcyhzY2hlbWEpIHtcbiAgcmV0dXJuIHNjaGVtYT8ucGFuZWxzID8gT2JqZWN0LnZhbHVlcyhzY2hlbWEucGFuZWxzKSA6IFtdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbGxQYW5lbEVudHJpZXMoXG4gIGFwaSxcbiAgc2NoZW1hLFxuICBkYXRhUGF0aCA9IG51bGwsXG4gIHNjaGVtYUNvbXBvbmVudCA9IG51bGwsXG4gIHRhYkNvbXBvbmVudCA9IG51bGxcbikge1xuICBjb25zdCBwYW5lbFNjaGVtYSA9IGdldFR5cGVPcHRpb25zKHNjaGVtYSk/LmdldFBhbmVsU2NoZW1hPy4oXG4gICAgYXBpLFxuICAgIHNjaGVtYSxcbiAgICBkYXRhUGF0aCxcbiAgICBzY2hlbWFDb21wb25lbnRcbiAgKVxuICBjb25zdCBwYW5lbEVudHJpZXMgPSBwYW5lbFNjaGVtYVxuICAgID8gW2dldFBhbmVsRW50cnkocGFuZWxTY2hlbWEsIGRhdGFQYXRoLCB0YWJDb21wb25lbnQpXVxuICAgIDogW11cbiAgLy8gQWxsb3cgZWFjaCBjb21wb25lbnQgdG8gcHJvdmlkZSBpdHMgb3duIHNldCBvZiBwYW5lbHMsIGluXG4gIC8vIGFkZGl0aW9uIHRvIHRoZSBkZWZhdWx0IG9uZSAoZS5nLiBnZXRGaWx0ZXJzUGFuZWwoKSwgJGZpbHRlcnMpOlxuICBnZXRQYW5lbEVudHJpZXMoc2NoZW1hPy5wYW5lbHMsIGRhdGFQYXRoLCB0YWJDb21wb25lbnQsIHBhbmVsRW50cmllcylcbiAgcmV0dXJuIHBhbmVsRW50cmllc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3RTb3VyY2Uoc2NoZW1hT3JUeXBlKSB7XG4gIHJldHVybiBnZXRTb3VyY2VUeXBlKHNjaGVtYU9yVHlwZSkgPT09ICdvYmplY3QnXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0xpc3RTb3VyY2Uoc2NoZW1hT3JUeXBlKSB7XG4gIHJldHVybiBnZXRTb3VyY2VUeXBlKHNjaGVtYU9yVHlwZSkgPT09ICdsaXN0J1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SXRlbUlkKHNvdXJjZVNjaGVtYSwgaXRlbSkge1xuICBjb25zdCBpZCA9IGl0ZW1bc291cmNlU2NoZW1hLmlkS2V5IHx8ICdpZCddXG4gIHJldHVybiBpZCAhPSBudWxsID8gU3RyaW5nKGlkKSA6IHVuZGVmaW5lZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SXRlbVVpZChzb3VyY2VTY2hlbWEsIGl0ZW0pIHtcbiAgLy8gVHJ5IHRvIHVzZSB0aGUgaXRlbSBpZCBhcyB0aGUgdWlkLCBmYWxsaW5nIGJhY2sgb24gYXV0by1nZW5lcmF0ZWQgaWRzLCBidXRcbiAgLy8gZWl0aGVyIHdheSwgcGFzcyB0aHJvdWdoIGBnZXRVaWQoKWAgc28gdGhhdCB0aGUgaWRzIGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlXG4gIC8vIGl0ZW0gdGhyb3VnaCBhIHdlYWsgbWFwLCBhcyB0aGUgaWRzIGNhbiBiZSBmaWx0ZXJlZCBvdXQgaW4gYHByb2Nlc3NEYXRhKClgXG4gIC8vIHdoaWxlIHRoZSBjb21wb25lbnRzIHRoYXQgdXNlIHRoZSB1aWRzIGFzIGtleSBhcmUgc3RpbGwgdmlzaWJsZS5cbiAgcmV0dXJuIGdldFVpZChpdGVtLCBnZXRJdGVtSWQoc291cmNlU2NoZW1hLCBpdGVtKSlcbn1cbiIsIi8vIEEgbWluaS1yZXBsaWNhdGlvbiBvZiB2dWUncyBpbnRlcm5hbCBgcmVzb2x2ZU1lcmdlZE9wdGlvbnMoKWAgYnV0IG9ubHlcbi8vIGhhbmRsaW5nIG91ciBvd24gYWRkZWQgb3B0aW9ucyBwcm9wZXJ0aWVzIGFuZCBtZXJnaW5nIHRoZW0gZWFybHkgaW5zdGVhZFxuLy8gb2YgbGF6aWx5LlxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZU1lcmdlZE9wdGlvbnMob3B0aW9ucykge1xuICBjb25zdCB7IG1peGlucyB9ID0gb3B0aW9uc1xuICByZXR1cm4gbWl4aW5zIHx8IG9wdGlvbnMuZXh0ZW5kc1xuICAgID8gbWVyZ2VPcHRpb25zKFxuICAgICAgICB7IC4uLm9wdGlvbnMgfSxcbiAgICAgICAgb3B0aW9uc1xuICAgICAgKVxuICAgIDogb3B0aW9uc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VPcHRpb25zKHRvLCBmcm9tKSB7XG4gIGlmIChmcm9tLmV4dGVuZHMpIHtcbiAgICBtZXJnZU9wdGlvbnModG8sIGZyb20uZXh0ZW5kcylcbiAgfVxuICBpZiAoZnJvbS5taXhpbnMpIHtcbiAgICBmb3IgKGNvbnN0IG1peGluIG9mIGZyb20ubWl4aW5zKSB7XG4gICAgICBtZXJnZU9wdGlvbnModG8sIG1peGluKVxuICAgIH1cbiAgfVxuICBmb3IgKGNvbnN0IGtleSBvZiBkaXRvT3B0aW9uS2V5cykge1xuICAgIGlmIChrZXkgaW4gZnJvbSkge1xuICAgICAgdG9ba2V5XSA9IGZyb21ba2V5XVxuICAgIH1cbiAgfVxuICByZXR1cm4gdG9cbn1cblxuY29uc3QgZGl0b09wdGlvbktleXMgPSBbXG4gICdkZWZhdWx0VmFsdWUnLFxuICAnZGVmYXVsdE5lc3RlZCcsXG4gICdkZWZhdWx0VmlzaWJsZScsXG4gICdnZW5lcmF0ZUxhYmVsJyxcbiAgJ2V4Y2x1ZGVWYWx1ZScsXG4gICdpZ25vcmVNaXNzaW5nVmFsdWUnLFxuICAnYWxpZ25Cb3R0b20nLFxuICAnb21pdFBhZGRpbmcnLFxuICAncHJvY2Vzc1ZhbHVlJyxcbiAgJ3Byb2Nlc3NTY2hlbWEnLFxuICAnZ2V0UGFuZWxTY2hlbWEnLFxuICAnZ2V0Rm9ybVNjaGVtYXNGb3JQcm9jZXNzaW5nJyxcbiAgLy8gVnVlIDMgLyBWdWUtcm91dGVyIDQgZm9yZ2V0cyB0aGVzZS5cbiAgLy8gVE9ETzogQ3JlYXRlIGJ1Zy1yZXBvcnQ/XG4gICdiZWZvcmVSb3V0ZVVwZGF0ZScsXG4gICdiZWZvcmVSb3V0ZUxlYXZlJ1xuXVxuIiwiaW1wb3J0IERpdG9NaXhpbiBmcm9tICcuL21peGlucy9EaXRvTWl4aW4uanMnXG5pbXBvcnQgeyBnZXRUeXBlQ29tcG9uZW50IH0gZnJvbSAnLi91dGlscy9zY2hlbWEuanMnXG5pbXBvcnQgeyByZXNvbHZlTWVyZ2VkT3B0aW9ucyB9IGZyb20gJy4vdXRpbHMvb3B0aW9ucy5qcydcbmltcG9ydCB7IGlzUGxhaW5PYmplY3QgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG5jb25zdCBjb21wb25lbnRzID0ge31cblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgbWl4aW5zOiBbRGl0b01peGluXSxcbiAgLy8gTWFrZSBzdXJlIHRoYXQgcmVnaXN0ZXJlZCBjb21wb25lbnRzIGFyZSBwcmVzZW50IGluIGFsbCBEaXRvQ29tcG9uZW50LlxuICBjb21wb25lbnRzLFxuXG4gIGNvbXBvbmVudChuYW1lLCBkZWZpbml0aW9uKSB7XG4gICAgaWYgKGRlZmluaXRpb24pIHtcbiAgICAgIGlmIChpc1BsYWluT2JqZWN0KGRlZmluaXRpb24pKSB7XG4gICAgICAgIGRlZmluaXRpb24gPSByZXNvbHZlTWVyZ2VkT3B0aW9ucyh7XG4gICAgICAgICAgZXh0ZW5kczogdGhpcyxcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIC4uLmRlZmluaXRpb25cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGNvbXBvbmVudHNbbmFtZV0gPSBkZWZpbml0aW9uXG4gICAgfVxuICAgIGlmICghKG5hbWUgaW4gY29tcG9uZW50cykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ29tcG9uZW50IFwiJHtuYW1lfVwiIG5vdCByZWdpc3RlcmVkYClcbiAgICB9XG4gICAgcmV0dXJuIGNvbXBvbmVudHNbbmFtZV1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0VHlwZUNvbXBvbmVudFxuICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBEaXRvVXNlciB7XG4gIGhhc1JvbGUoLi4ucm9sZXMpIHtcbiAgICBpZiAodGhpcy5yb2xlcykge1xuICAgICAgZm9yIChjb25zdCByb2xlIG9mIHJvbGVzKSB7XG4gICAgICAgIGlmICh0aGlzLnJvbGVzLmluY2x1ZGVzKHJvbGUpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuIiwiLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgcHJvdmlkZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJHNjaGVtYVBhcmVudENvbXBvbmVudDogKCkgPT4gdGhpc1xuICAgIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzY2hlbWFDb21wb25lbnRzOiBbXVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIG1haW5TY2hlbWFDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY2hlbWFDb21wb25lbnRzWzBdXG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICAvLyBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgYERpdG9TY2hlbWEuY3JlYXRlZCgpL3VubW91bnRlZCgpYCBvbiBpdHNcbiAgICAvLyBgJHNjaGVtYVBhcmVudENvbXBvbmVudGAsIGlmIHRoZSBwYXJlbnQgdXNlcyB0aGUgYFNjaGVtYVBhcmVudE1peGluYDpcbiAgICBfcmVnaXN0ZXJTY2hlbWFDb21wb25lbnQoc2NoZW1hQ29tcG9uZW50LCBhZGQpIHtcbiAgICAgIGNvbnN0IHsgc2NoZW1hQ29tcG9uZW50cyB9ID0gdGhpc1xuICAgICAgaWYgKGFkZCkge1xuICAgICAgICBzY2hlbWFDb21wb25lbnRzLnB1c2goc2NoZW1hQ29tcG9uZW50KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2NoZW1hQ29tcG9uZW50cy5zcGxpY2Uoc2NoZW1hQ29tcG9uZW50cy5pbmRleE9mKHNjaGVtYUNvbXBvbmVudCksIDEpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgU2NoZW1hUGFyZW50TWl4aW4gZnJvbSAnLi9TY2hlbWFQYXJlbnRNaXhpbi5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgbWl4aW5zOiBbU2NoZW1hUGFyZW50TWl4aW5dLFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgZXJyb3JzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hQ29tcG9uZW50cy5yZWR1Y2UoXG4gICAgICAgIChyZXN1bHQsIHsgZXJyb3JzIH0pID0+XG4gICAgICAgICAgZXJyb3JzICYmIHJlc3VsdCA/IHJlc3VsdC5jb25jYXQoZXJyb3JzKSA6IGVycm9ycyxcbiAgICAgICAgbnVsbFxuICAgICAgKVxuICAgIH0sXG5cbiAgICBpc1RvdWNoZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY2hlbWFDb21wb25lbnRzLnNvbWUoaXQgPT4gaXQuaXNUb3VjaGVkKVxuICAgIH0sXG5cbiAgICBpc0RpcnR5KCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hQ29tcG9uZW50cy5zb21lKGl0ID0+IGl0LmlzRGlydHkpXG4gICAgfSxcblxuICAgIGlzVmFsaWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY2hlbWFDb21wb25lbnRzLmV2ZXJ5KGl0ID0+IGl0LmlzVmFsaWQpXG4gICAgfSxcblxuICAgIGlzVmFsaWRhdGVkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hQ29tcG9uZW50cy5ldmVyeShpdCA9PiBpdC5pc1ZhbGlkKVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgdmFsaWRhdGVBbGwobWF0Y2gsIG5vdGlmeSA9IHRydWUpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjaGVtYUNvbXBvbmVudHMuZXZlcnkoaXQgPT4gaXQudmFsaWRhdGVBbGwobWF0Y2gsIG5vdGlmeSkpXG4gICAgfSxcblxuICAgIHZlcmlmeUFsbChtYXRjaCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hQ29tcG9uZW50cy5ldmVyeShpdCA9PiBpdC52ZXJpZnlBbGwobWF0Y2gpKVxuICAgIH0sXG5cbiAgICByZXNldFZhbGlkYXRpb24oKSB7XG4gICAgICB0aGlzLnNjaGVtYUNvbXBvbmVudHMuZm9yRWFjaChpdCA9PiBpdC5yZXNldFZhbGlkYXRpb24oKSlcbiAgICB9LFxuXG4gICAgY2xlYXJFcnJvcnMoKSB7XG4gICAgICB0aGlzLnNjaGVtYUNvbXBvbmVudHMuZm9yRWFjaChpdCA9PiBpdC5jbGVhckVycm9ycygpKVxuICAgIH0sXG5cbiAgICBzaG93VmFsaWRhdGlvbkVycm9ycyhlcnJvcnMsIGZvY3VzKSB7XG4gICAgICB0aGlzLnNjaGVtYUNvbXBvbmVudHMuZm9yRWFjaChcbiAgICAgICAgaXQgPT4gaXQuc2hvd1ZhbGlkYXRpb25FcnJvcnMoZXJyb3JzLCBmb2N1cylcbiAgICAgIClcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBWYWxpZGF0b3JNaXhpbiBmcm9tICcuLi9taXhpbnMvVmFsaWRhdG9yTWl4aW4uanMnXG5pbXBvcnQgeyBnZXRDb21tb25QcmVmaXggfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQge1xuICBtaXhpbnM6IFtWYWxpZGF0b3JNaXhpbl0sXG5cbiAgcHJvdmlkZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJHJvdXRlQ29tcG9uZW50OiAoKSA9PiB0aGlzXG4gICAgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlbG9hZDogZmFsc2UsXG4gICAgICAvLyBFYWNoIHJvdXRlLWNvbXBvbmVudCBkZWZpbmVzIGEgc3RvcmUgdGhhdCBnZXRzIHBhc3NlZCBvbiB0byBpdHNcbiAgICAgIC8vIGNoaWxkIGNvbXBvbmVudHMsIHNvIHRoZXkgY2FuIHN0b3JlIHZhbHVlcyBpbiB0aGVtIHRoYXQgbGl2ZSBiZXlvbmRcbiAgICAgIC8vIHRoZWlyIGxpZmUtY3ljbGUuIFNlZTogRGl0b1BhbmUsIFNvdXJjZU1peGluXG4gICAgICBzdG9yZToge30sXG4gICAgICBsb2FkQ2FjaGU6IHt9IC8vIFNlZSBUeXBlTWl4aW4ubG9hZCgpXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgcm91dGVDb21wb25lbnQoKSB7XG4gICAgICAvLyBPdmVycmlkZSBEaXRvTWl4aW4ncyByb3V0ZUNvbXBvbmVudCgpIHdoaWNoIHVzZXMgdGhlIGluamVjdGVkIHZhbHVlLlxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9LFxuXG4gICAgcm91dGVMZXZlbCgpIHtcbiAgICAgIGxldCBsZXZlbCA9IDBcbiAgICAgIGxldCByb3V0ZUNvbXBvbmVudCA9IHRoaXNcbiAgICAgIHdoaWxlICgocm91dGVDb21wb25lbnQgPSByb3V0ZUNvbXBvbmVudC5wYXJlbnRDb21wb25lbnQucm91dGVDb21wb25lbnQpKSB7XG4gICAgICAgIGxldmVsKytcbiAgICAgIH1cbiAgICAgIHJldHVybiBsZXZlbFxuICAgIH0sXG5cbiAgICByb3V0ZVJlY29yZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLiRyb3V0ZS5tYXRjaGVkW3RoaXMucm91dGVMZXZlbF1cbiAgICB9LFxuXG4gICAgaXNMYXN0Um91dGUoKSB7XG4gICAgICAvLyBSZXR1cm5zIHRydWUgd2hlbiB0aGlzIHJvdXRlciBjb21wb25lbnQgaXMgdGhlIGxhc3Qgb25lIGluIHRoZSByb3V0ZS5cbiAgICAgIGNvbnN0IHsgbWF0Y2hlZCB9ID0gdGhpcy4kcm91dGVcbiAgICAgIHJldHVybiB0aGlzLnJvdXRlUmVjb3JkID09PSBtYXRjaGVkW21hdGNoZWQubGVuZ3RoIC0gMV1cbiAgICB9LFxuXG4gICAgaXNMYXN0VW5uZXN0ZWRSb3V0ZSgpIHtcbiAgICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHJvdXRlIGNvbXBvbmVudCBpcyB0aGUgbGFzdCBvbmUgaW4gdGhlIHJvdXRlIHRoYXRcbiAgICAgIC8vIG5lZWRzIGl0cyBvd24gcm91dGVyLXZpZXcgKD0gaXMgbm90IG5lc3RlZCkuXG4gICAgICBjb25zdCB7IG1hdGNoZWQgfSA9IHRoaXMuJHJvdXRlXG4gICAgICBmb3IgKGxldCBpID0gbWF0Y2hlZC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBjb25zdCByZWNvcmQgPSBtYXRjaGVkW2ldXG4gICAgICAgIGlmICghcmVjb3JkLm1ldGEubmVzdGVkKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucm91dGVSZWNvcmQgPT09IHJlY29yZFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9LFxuXG4gICAgaXNOZXN0ZWRSb3V0ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLm1ldGEubmVzdGVkXG4gICAgfSxcblxuICAgIGlzVmlldygpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0sXG5cbiAgICBtZXRhKCkge1xuICAgICAgcmV0dXJuIHRoaXMucm91dGVSZWNvcmQ/Lm1ldGFcbiAgICB9LFxuXG4gICAgcGF0aCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFJvdXRlUGF0aCh0aGlzLnJvdXRlUmVjb3JkLnBhdGgpXG4gICAgfSxcblxuICAgIGxhYmVsKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0TGFiZWwodGhpcy5zY2hlbWEpXG4gICAgfSxcblxuICAgIGJyZWFkY3J1bWIoKSB7XG4gICAgICBjb25zdCB7IGJyZWFkY3J1bWIgfSA9IHRoaXMuc2NoZW1hIHx8IHt9XG4gICAgICByZXR1cm4gYnJlYWRjcnVtYiB8fCBgJHt0aGlzLmJyZWFkY3J1bWJQcmVmaXh9ICR7dGhpcy5sYWJlbH1gXG4gICAgfSxcblxuICAgIGJyZWFkY3J1bWJQcmVmaXgoKSB7XG4gICAgICByZXR1cm4gJydcbiAgICB9LFxuXG4gICAgcGFyYW0oKSB7XG4gICAgICAvLyBXb3JrYXJvdW5kIGZvciB2dWUtcm91dGVyIG5vdCBiZWluZyBhYmxlIHRvIG1hcCBtdWx0aXBsZSB1cmwgcGFyYW1ldGVyc1xuICAgICAgLy8gd2l0aCB0aGUgc2FtZSBuYW1lIHRvIG11bHRpcGxlIGNvbXBvbmVudHMsIHNlZTpcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS92dWVqcy92dWUtcm91dGVyL2lzc3Vlcy8xMzQ1XG4gICAgICByZXR1cm4gdGhpcy4kcm91dGUucGFyYW1zW3RoaXMubWV0YT8ucGFyYW1dIHx8IG51bGxcbiAgICB9LFxuXG4gICAgLy8gQG92ZXJyaWRhYmxlLCBzZWUgRGl0b0Zvcm1cbiAgICBpc011dGF0aW5nKCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9LFxuXG4gIGJlZm9yZVJvdXRlVXBkYXRlKHRvLCBmcm9tLCBuZXh0KSB7XG4gICAgdGhpcz8uYmVmb3JlUm91dGVDaGFuZ2UodG8sIGZyb20sIG5leHQpXG4gIH0sXG5cbiAgYmVmb3JlUm91dGVMZWF2ZSh0bywgZnJvbSwgbmV4dCkge1xuICAgIHRoaXM/LmJlZm9yZVJvdXRlQ2hhbmdlKHRvLCBmcm9tLCBuZXh0KVxuICB9LFxuXG4gIGNyZWF0ZWQoKSB7XG4gICAgLy8gS2VlcCBhIHNoYXJlZCBzdGFjayBvZiByb290IGNvbXBvbmVudHMgZm9yIERpdG9UcmFpbCB0byB1c2UgdG8gcmVuZGVyXG4gICAgLy8gbGFiZWxzLiBDYW4ndCByZWx5IG9uICRyb3V0ZS5tYXRjaGVkW2ldLmluc3RhbmNlcy5kZWZhdWx0IHVuZm9ydHVuYXRlbHksXG4gICAgLy8gYXMgaW5zdGFuY2VzIGFyZW4ndCBpbW1lZGlhdGVseSByZWFkeSwgYW5kIGluc3RhbmNlcyBpcyBub3QgcmVhY3RpdmUuXG4gICAgdGhpcy5hcHBTdGF0ZS5yb3V0ZUNvbXBvbmVudHMucHVzaCh0aGlzKVxuICB9LFxuXG4gIHVubW91bnRlZCgpIHtcbiAgICBjb25zdCB7IHJvdXRlQ29tcG9uZW50cyB9ID0gdGhpcy5hcHBTdGF0ZVxuICAgIHJvdXRlQ29tcG9uZW50cy5zcGxpY2Uocm91dGVDb21wb25lbnRzLmluZGV4T2YodGhpcyksIDEpXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGJlZm9yZVJvdXRlQ2hhbmdlKHRvLCBmcm9tLCBuZXh0KSB7XG4gICAgICBsZXQgb2sgPSB0cnVlXG4gICAgICBjb25zdCBpc0Nsb3NpbmcgPSAoXG4gICAgICAgIC8vIE9ubHkgaGFuZGxlIHRoaXMgcm91dGUgY2hhbmdlIGlmIHRoZSBmb3JtIGlzIGFjdHVhbGx5IG1hcHBlZCB0byB0aGVcbiAgICAgICAgLy8gYGZyb21gIHJvdXRlLCBidXQgaW5jbHVkZSBwYXJlbnQgZm9ybXMgb2YgY2xvc2luZyBuZXN0ZWQgZm9ybXMgYXMgYXNcbiAgICAgICAgLy8gd2VsbCwgYnkgbWF0Y2hpbmcgdGhlIHRoZSBzdGFydCBvZiBmcm9tL3RvIHBhdGggYWdhaW5zdCBgdGhpcy5wYXRoYDpcbiAgICAgICAgZnJvbS5wYXRoLnN0YXJ0c1dpdGgodGhpcy5wYXRoKSAmJlxuICAgICAgICAhdG8ucGF0aC5zdGFydHNXaXRoKHRoaXMucGF0aCkgJiZcbiAgICAgICAgLy8gRXhjbHVkZSBoYXNoIGNoYW5nZXMgb25seSAoPSB0YWIgY2hhbmdlcyk6XG4gICAgICAgIGZyb20ucGF0aCAhPT0gdG8ucGF0aCAmJiAoXG4gICAgICAgICAgdGhpcy5pc0Z1bGxSb3V0ZUNoYW5nZSh0bywgZnJvbSkgfHxcbiAgICAgICAgICAvLyBEZWNpZGUgaWYgd2UncmUgbW92aW5nIHRvd2FyZHMgYSBuZXcgbmVzdGVkIGZvcm0sIG9yIGNsb3NpbmcgL1xuICAgICAgICAgIC8vIHJlcGxhY2luZyBhbiBhbHJlYWR5IG9wZW4gb25lIGJ5IGNvbXBhcmluZyBwYXRoIGxlbmd0aHMuXG4gICAgICAgICAgLy8gVGhlIGNhc2Ugb2YgYD1gIG1hdGNoZXMgdGhlIHJlcGxhY2luZyBvZiBhbiBhbHJlYWR5IG9wZW4gb25lLlxuICAgICAgICAgIHRvLnBhdGgubGVuZ3RoIDw9IGZyb20ucGF0aC5sZW5ndGhcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgaWYgKGlzQ2xvc2luZykge1xuICAgICAgICBpZiAodGhpcy5pc011dGF0aW5nKSB7XG4gICAgICAgICAgLy8gRm9yIGFjdGl2ZSBkaXJlY3RseSBtdXRhdGluZyAobmVzdGVkKSBmb3JtcyB0aGF0IHdlcmUgbm90IHZhbGlkYXRlZFxuICAgICAgICAgIC8vIHlldCwgdmFsaWRhdGUgdGhlbSBvbmNlLiBJZiB0aGUgdXNlciB0aGVuIHN0aWxsIHdhbnRzIHRvIGxlYXZlXG4gICAgICAgICAgLy8gdGhlbSwgdGhleSBjYW4gY2xpY2sgY2xvc2UgLyBuYXZpZ2F0ZSBhd2F5IGFnYWluLlxuICAgICAgICAgIG9rID0gKFxuICAgICAgICAgICAgdGhpcy5pc1ZhbGlkYXRlZCB8fFxuICAgICAgICAgICAgdGhpcy52YWxpZGF0ZUFsbCgpXG4gICAgICAgICAgKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFRoZSBmb3JtIGRvZXNuJ3QgZGlyZWN0bHkgbXV0YXRlIGRhdGEuIElmIGl0IGlzIGRpcnR5LCBhc2sgaWYgdXNlclxuICAgICAgICAgIC8vIHdhbnRzIHRvIHBlcnNpc3QgZGF0YSBmaXJzdC5cbiAgICAgICAgICBpZiAodGhpcy5pc0RpcnR5KSB7XG4gICAgICAgICAgICBvayA9IHdpbmRvdy5jb25maXJtKFxuICAgICAgICAgICAgICBgWW91IGhhdmUgdW5zYXZlZCBjaGFuZ2VzLiBEbyB5b3UgcmVhbGx5IHdhbnQgdG8gJHtcbiAgICAgICAgICAgICAgICB0aGlzLnZlcmJzLmNhbmNlbFxuICAgICAgICAgICAgICB9P2BcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG5leHQob2spXG4gICAgfSxcblxuICAgIGdldFJvdXRlUGF0aCh0ZW1wbGF0ZVBhdGgpIHtcbiAgICAgIC8vIE1hcHMgdGhlIHJvdXRlJ3MgYWN0dWFsIHBhdGggdG8gdGhlIG1hdGNoZWQgcm91dGVzIGJ5IGNvdW50aW5nIGl0c1xuICAgICAgLy8gcGFydHMgc2VwYXJhdGVkIGJ5ICcvJywgc3BsaXR0aW5nIHRoZSBwYXRoIGludG8gdGhlIG1hcHBlZCBwYXJ0c1xuICAgICAgLy8gY29udGFpbmluZyBhY3R1YWwgcGFyYW1ldGVycy5cbiAgICAgIHJldHVybiB0aGlzLiRyb3V0ZS5wYXRoXG4gICAgICAgIC5zcGxpdCgnLycpXG4gICAgICAgIC5zbGljZSgwLCB0ZW1wbGF0ZVBhdGguc3BsaXQoJy8nKS5sZW5ndGgpXG4gICAgICAgIC5qb2luKCcvJylcbiAgICB9LFxuXG4gICAgZ2V0Q2hpbGRQYXRoKHBhdGgpIHtcbiAgICAgIHJldHVybiBgJHt0aGlzLnBhdGh9LyR7cGF0aH1gXG4gICAgfSxcblxuICAgIGlzRnVsbFJvdXRlQ2hhbmdlKHRvLCBmcm9tKSB7XG4gICAgICAvLyBUaGUgcm91dGUgcGF0aCBpcyB0aGUgcGF0aCB1cCB0byB0aGUgZmlyc3QgLyAoZXhjbHVkaW5nIHRoZSBpbml0aWFsIC8pOlxuICAgICAgY29uc3Qgcm9vdFBhdGggPSB0aGlzLnBhdGgubWF0Y2goL14oXFwvW14vXSopLylbMV1cbiAgICAgIHJldHVybiAhZ2V0Q29tbW9uUHJlZml4KHRvLnBhdGgsIGZyb20ucGF0aCkuc3RhcnRzV2l0aChyb290UGF0aClcbiAgICB9XG4gIH1cbn1cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG50ZW1wbGF0ZShcbiAgdi1pZj1cInVzZXJcIlxuKVxuICAvLy0gT25seSByZW5kZXIgRGl0b1ZpZXcgd2hlbiBpdCBpcyBhY3RpdmUsIG90aGVyd2lzZSBhIG5vcm1hbCByb3V0ZXItdmlld1xuICAvLy0gaW5zdGVhZCwgdG8gbmVzdCBmdXJ0aGVyIHJvdXRlIGNvbXBvbmVudHMuXG4gIC8vLSBOT1RFOiBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBoYW5kbGluZyBpbiBEaXRvRm9ybSwgd2hlcmUgYHYtc2hvd2AgaXNcbiAgLy8tIHVzZWQgdG8gYWx3YXlzIHJlbmRlciBmb3JtcyBldmVuIHdoZW4gb3RoZXIgbmVzdGVkIGZvcm1zIGFyZSBwcmVzZW50LlxuICBSb3V0ZXJWaWV3KFxuICAgIHYtaWY9XCIhaXNMYXN0Um91dGVcIlxuICAgIDprZXk9XCJuYW1lXCJcbiAgKVxuICAuZGl0by12aWV3LmRpdG8tc2Nyb2xsLXBhcmVudChcbiAgICB2LWVsc2UtaWY9XCJzaG91bGRSZW5kZXIodmlld1NjaGVtYSlcIlxuICAgIDpkYXRhLXJlc291cmNlPVwic291cmNlU2NoZW1hLnBhdGhcIlxuICApXG4gICAgRGl0b1NjaGVtYS5kaXRvLXNjcm9sbChcbiAgICAgIDpzY2hlbWE9XCJ2aWV3U2NoZW1hXCJcbiAgICAgIDpkYXRhPVwiZGF0YVwiXG4gICAgICA6bWV0YT1cIm1ldGFcIlxuICAgICAgOnN0b3JlPVwiZ2V0Q2hpbGRTdG9yZShuYW1lKVwiXG4gICAgICA6ZGlzYWJsZWQ9XCJpc0xvYWRpbmdcIlxuICAgICAgOmdlbmVyYXRlTGFiZWxzPVwiZmFsc2VcIlxuICAgICAgOm1lbnVIZWFkZXI9XCJ0cnVlXCJcbiAgICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCBSb3V0ZU1peGluIGZyb20gJy4uL21peGlucy9Sb3V0ZU1peGluLmpzJ1xuaW1wb3J0IHsgc29tZVNjaGVtYUNvbXBvbmVudCwgaXNTaW5nbGVDb21wb25lbnRWaWV3IH0gZnJvbSAnLi4vdXRpbHMvc2NoZW1hLmpzJ1xuaW1wb3J0IHsgaGFzUmVzb3VyY2UgfSBmcm9tICcuLi91dGlscy9yZXNvdXJjZS5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvVmlldycsIHtcbiAgbWl4aW5zOiBbUm91dGVNaXhpbl0sXG5cbiAgcHJvdmlkZSgpIHtcbiAgICAvLyBSZWRpcmVjdCAkc291cmNlQ29tcG9uZW50IGFuZCAkcmVzb3VyY2VDb21wb25lbnQgdG8gdGhlIG1haW4gY29tcG9uZW50OlxuICAgIHJldHVybiB7XG4gICAgICAkc291cmNlQ29tcG9uZW50OiAoKSA9PiB0aGlzLm1haW5Db21wb25lbnQ/LnNvdXJjZUNvbXBvbmVudCB8fCBudWxsLFxuICAgICAgJHJlc291cmNlQ29tcG9uZW50OiAoKSA9PiB0aGlzLm1haW5Db21wb25lbnQ/LnJlc291cmNlQ29tcG9uZW50IHx8IG51bGxcbiAgICB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLy8gVXBkYXRlZCBmcm9tIExvYWRpbmdNaXhpbiB0aHJvdWdoIGBzZXRMb2FkaW5nKGlzTG9hZGluZylgOlxuICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICAgIC8vIE5PVEU6IERhdGEgaXMgc2hhcmVkIGFjcm9zcyBhbGwgdmlld3MgYmVjYXVzZSB0aGUgcm91dGVyIHJlY3ljbGVzIHRoZVxuICAgICAgLy8gRGl0b1ZpZXcgY29tcG9uZW50LlxuICAgICAgZGF0YToge31cbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBzY2hlbWEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5tZXRhLnNjaGVtYVxuICAgIH0sXG5cbiAgICBuYW1lKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hLm5hbWVcbiAgICB9LFxuXG4gICAgaXNWaWV3KCkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9LFxuXG4gICAgaXNTaW5nbGVDb21wb25lbnRWaWV3KCkge1xuICAgICAgcmV0dXJuIGlzU2luZ2xlQ29tcG9uZW50Vmlldyh0aGlzLnNjaGVtYSlcbiAgICB9LFxuXG4gICAgbWFpbkNvbXBvbmVudCgpIHtcbiAgICAgIHJldHVybiB0aGlzLm1haW5TY2hlbWFDb21wb25lbnQuZ2V0Q29tcG9uZW50QnlEYXRhUGF0aCh0aGlzLm5hbWUpXG4gICAgfSxcblxuICAgIHZpZXdTY2hlbWEoKSB7XG4gICAgICBjb25zdCB7IGNvbXBvbmVudCwgLi4uc2NoZW1hIH0gPSB0aGlzLnNjaGVtYVxuICAgICAgLy8gVHJhbnNsYXRlIHNpbmdsZS1jb21wb25lbnQgc2NoZW1hcyBpbnRvIG11bHRpLWNvbXBvbmVudCBzY2hlbWFzLFxuICAgICAgLy8gc28gdGhleSBjYW4gYmUgcmVuZGVyZWQgZGlyZWN0bHkgdGhyb3VnaCBEaXRvU2NoZW1hIGFsc286XG4gICAgICByZXR1cm4gdGhpcy5pc1NpbmdsZUNvbXBvbmVudFZpZXdcbiAgICAgICAgPyB7XG4gICAgICAgICAgICAuLi5zY2hlbWEsXG4gICAgICAgICAgICBjb21wb25lbnRzOiB7XG4gICAgICAgICAgICAgIFtzY2hlbWEubmFtZV06IHtcbiAgICAgICAgICAgICAgICBuYW1lOiBzY2hlbWEubmFtZSxcbiAgICAgICAgICAgICAgICBsYWJlbDogZmFsc2UsXG4gICAgICAgICAgICAgICAgLi4uY29tcG9uZW50XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIDogc2NoZW1hXG4gICAgfSxcblxuICAgIHByb3ZpZGVzRGF0YSgpIHtcbiAgICAgIHJldHVybiBzb21lU2NoZW1hQ29tcG9uZW50KHRoaXMudmlld1NjaGVtYSwgaGFzUmVzb3VyY2UpXG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgJHJvdXRlKHRvLCBmcm9tKSB7XG4gICAgICAvLyBTZWUgaWYgdGhlIHJvdXRlIGNoYW5nZXMgY29tcGxldGVseSwgYW5kIGNsZWFyIHRoZSBkYXRhIGlmIGl0IGRvZXMuXG4gICAgICBpZiAodGhpcy5pc0Z1bGxSb3V0ZUNoYW5nZSh0bywgZnJvbSkpIHtcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZVxuICAgICAgICB0aGlzLmRhdGEgPSB7fVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgc2V0RGF0YShkYXRhKSB7XG4gICAgICB0aGlzLmRhdGEgPSBkYXRhXG4gICAgfSxcblxuICAgIGdldENoaWxkUGF0aChwYXRoKSB7XG4gICAgICAvLyBMaXN0cyBpbnNpZGUgc2luZ2xlLWNvbXBvbmVudCB2aWV3cyB1c2UgdGhlIHZpZXcncyBwYXRoIGZvciBzdWItcGF0aHM6XG4gICAgICByZXR1cm4gdGhpcy5pc1NpbmdsZUNvbXBvbmVudFZpZXdcbiAgICAgICAgPyB0aGlzLnBhdGhcbiAgICAgICAgOiBgJHt0aGlzLnBhdGh9LyR7cGF0aH1gXG4gICAgfSxcblxuICAgIHNldExvYWRpbmcoaXNMb2FkaW5nKSB7XG4gICAgICB0aGlzLmlzTG9hZGluZyA9ICEhaXNMb2FkaW5nXG4gICAgfVxuICB9XG59KVxuPC9zY3JpcHQ+XG4iLCJpbXBvcnQgeyBpc0RhdGUgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG5leHBvcnQgZnVuY3Rpb24gY29weURhdGUoZGF0ZSwge1xuICB5ZWFyID0gZGF0ZT8uZ2V0RnVsbFllYXIoKSA/PyAwLFxuICBtb250aCA9IGRhdGU/LmdldE1vbnRoKCkgPz8gMCxcbiAgZGF5ID0gZGF0ZT8uZ2V0RGF0ZSgpID8/IDAsXG4gIGhvdXIgPSBkYXRlPy5nZXRIb3VycygpID8/IDAsXG4gIG1pbnV0ZSA9IGRhdGU/LmdldE1pbnV0ZXMoKSA/PyAwLFxuICBzZWNvbmQgPSBkYXRlPy5nZXRTZWNvbmRzKCkgPz8gMCxcbiAgbWlsbGlzZWNvbmQgPSBkYXRlPy5nZXRNaWxsaXNlY29uZHMoKSA/PyAwXG59ID0ge30pIHtcbiAgcmV0dXJuIG5ldyBEYXRlKHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29uZClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnREYXRlKGRhdGUpIHtcbiAgcmV0dXJuIGlzRGF0ZShkYXRlKSA/IGRhdGUgOiBkYXRlID8gbmV3IERhdGUoZGF0ZSkgOiBudWxsXG59XG4iLCI8IS0tIERlcml2ZWQgZnJvbSBBVFVJLCBhbmQgZnVydGhlciBleHRlbmRlZDogaHR0cHM6Ly9hbGlxaW4uZ2l0aHViLmlvL2F0dWkvIC0tPlxuPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLWNhbGVuZGFyXG4gIC5kaXRvLWNhbGVuZGFyLXBvcHVwXG4gICAgLmRpdG8tY2FsZW5kYXItaW5uZXJcbiAgICAgIHRlbXBsYXRlKFxuICAgICAgICB2LWlmPVwiY3VycmVudE1vZGUgPT09ICdkYXknXCJcbiAgICAgIClcbiAgICAgICAgLmRpdG8tY2FsZW5kYXItaGVhZGVyXG4gICAgICAgICAgYS5kaXRvLWNhbGVuZGFyLXN0ZXAtcHJldi5kaXRvLWNhbGVuZGFyLXN0ZXAteWVhcihcbiAgICAgICAgICAgIEBjbGljaz1cInN0ZXBZZWFyKC0xKVwiXG4gICAgICAgICAgKVxuICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zdGVwLXByZXYuZGl0by1jYWxlbmRhci1zdGVwLW1vbnRoKFxuICAgICAgICAgICAgQGNsaWNrPVwic3RlcE1vbnRoKC0xKVwiXG4gICAgICAgICAgKVxuICAgICAgICAgIHNwYW5cbiAgICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zZWxlY3QteWVhcihcbiAgICAgICAgICAgICAgQGNsaWNrPVwic2V0TW9kZSgneWVhcicpXCJcbiAgICAgICAgICAgICkge3sgZGF0ZVRvU3RyaW5nKGN1cnJlbnRWYWx1ZSwgeyB5ZWFyOiAxIH0pIH19XG4gICAgICAgICAgICBhLmRpdG8tY2FsZW5kYXItc2VsZWN0LW1vbnRoKFxuICAgICAgICAgICAgICBAY2xpY2s9XCJzZXRNb2RlKCdtb250aCcpXCJcbiAgICAgICAgICAgICkge3sgZGF0ZVRvU3RyaW5nKGN1cnJlbnRWYWx1ZSwgeyBtb250aDogMSB9KSB9fVxuICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zdGVwLW5leHQuZGl0by1jYWxlbmRhci1zdGVwLW1vbnRoKFxuICAgICAgICAgICAgQGNsaWNrPVwic3RlcE1vbnRoKDEpXCJcbiAgICAgICAgICApXG4gICAgICAgICAgYS5kaXRvLWNhbGVuZGFyLXN0ZXAtbmV4dC5kaXRvLWNhbGVuZGFyLXN0ZXAteWVhcihcbiAgICAgICAgICAgIEBjbGljaz1cInN0ZXBZZWFyKDEpXCJcbiAgICAgICAgICApXG4gICAgICAgIC5kaXRvLWNhbGVuZGFyLWJvZHlcbiAgICAgICAgICAuZGl0by1jYWxlbmRhci13ZWVrZGF5c1xuICAgICAgICAgICAgc3BhbihcbiAgICAgICAgICAgICAgdi1mb3I9XCJ3ZWVrZGF5IGluIHdlZWtkYXlOYW1lc1wiXG4gICAgICAgICAgICApIHt7IHdlZWtkYXkuc2hvcnQgfX1cbiAgICAgICAgICAuZGl0by1jYWxlbmRhci1kYXRlc1xuICAgICAgICAgICAgc3BhbihcbiAgICAgICAgICAgICAgdi1mb3I9XCJkYXRlIGluIGRhdGVSYW5nZVwiXG4gICAgICAgICAgICAgIDpjbGFzcz1cImRhdGUuc3RhdGUgJiYgYGRpdG8tY2FsZW5kYXItaXRlbS0ke2RhdGUuc3RhdGV9YFwiXG4gICAgICAgICAgICAgIEBjbGljaz1cInNlbGVjdERhdGUoZGF0ZS5kYXRlLCBkYXRlLnN0YXRlLCB0cnVlKVwiXG4gICAgICAgICAgICApIHt7IGRhdGUudGV4dCB9fVxuICAgICAgICAuZGl0by1jYWxlbmRhci1mb290ZXJcbiAgICAgICAgICBhLmRpdG8tY2FsZW5kYXItc2VsZWN0LXRvZGF5KFxuICAgICAgICAgICAgcm9sZT1cImJ1dHRvblwiXG4gICAgICAgICAgICA6dGl0bGU9XCJkYXRlVG9TdHJpbmcobmV3IERhdGUoKSwgeyB5ZWFyOiAxLCBtb250aDogMSwgZGF5OiAxIH0pXCJcbiAgICAgICAgICAgIEBjbGljaz1cInNlbGVjdERhdGUobmV3IERhdGUoKSlcIlxuICAgICAgICAgIClcbiAgICAgIHRlbXBsYXRlKFxuICAgICAgICB2LWVsc2UtaWY9XCJjdXJyZW50TW9kZSA9PT0gJ21vbnRoJ1wiXG4gICAgICApXG4gICAgICAgIC5kaXRvLWNhbGVuZGFyLWhlYWRlclxuICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zdGVwLXByZXYoXG4gICAgICAgICAgICBAY2xpY2s9XCJzdGVwWWVhcigtMSlcIlxuICAgICAgICAgIClcbiAgICAgICAgICBzcGFuXG4gICAgICAgICAgICBhLmRpdG8tY2FsZW5kYXItc2VsZWN0LXllYXIoXG4gICAgICAgICAgICAgIEBjbGljaz1cInNldE1vZGUoJ3llYXInKVwiXG4gICAgICAgICAgICApIHt7IGRhdGVUb1N0cmluZyhjdXJyZW50VmFsdWUsIHsgeWVhcjogMSB9KSB9fVxuICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zdGVwLW5leHQoXG4gICAgICAgICAgICBAY2xpY2s9XCJzdGVwWWVhcigxKVwiXG4gICAgICAgICAgKVxuICAgICAgICAuZGl0by1jYWxlbmRhci1ib2R5XG4gICAgICAgICAgLmRpdG8tY2FsZW5kYXItbW9udGhzXG4gICAgICAgICAgICBzcGFuKFxuICAgICAgICAgICAgICB2LWZvcj1cIihtb250aCwgaW5kZXgpIGluIG1vbnRoTmFtZXNcIlxuICAgICAgICAgICAgICA6Y2xhc3M9XCJnZXRNb250aENsYXNzKGluZGV4KVwiXG4gICAgICAgICAgICAgIEBjbGljaz1cInNlbGVjdE1vbnRoKGluZGV4KVwiXG4gICAgICAgICAgICApIHt7IG1vbnRoLnNob3J0IH19XG4gICAgICB0ZW1wbGF0ZShcbiAgICAgICAgdi1lbHNlLWlmPVwiY3VycmVudE1vZGUgPT09ICd5ZWFyJ1wiXG4gICAgICApXG4gICAgICAgIC5kaXRvLWNhbGVuZGFyLWhlYWRlclxuICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zdGVwLXByZXYoXG4gICAgICAgICAgICBAY2xpY2s9XCJzdGVwRGVjYWRlKC0xKVwiXG4gICAgICAgICAgKVxuICAgICAgICAgIHNwYW4ge3sgZGVjYWRlVG9TdHJpbmcoY3VycmVudFZhbHVlKSB9fVxuICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zdGVwLW5leHQoXG4gICAgICAgICAgICBAY2xpY2s9XCJzdGVwRGVjYWRlKDEpXCJcbiAgICAgICAgICApXG4gICAgICAgIC5kaXRvLWNhbGVuZGFyLWJvZHlcbiAgICAgICAgICAuZGl0by1jYWxlbmRhci15ZWFyc1xuICAgICAgICAgICAgc3BhbihcbiAgICAgICAgICAgICAgdi1mb3I9XCJ5ZWFyIGluIHllYXJSYW5nZVwiXG4gICAgICAgICAgICAgIDpjbGFzcz1cImdldFllYXJDbGFzcyh5ZWFyKVwiXG4gICAgICAgICAgICAgIEBjbGljaz1cInNlbGVjdFllYXIoeWVhcilcIlxuICAgICAgICAgICAgKSB7eyB5ZWFyIH19XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IHsgY29weURhdGUgfSBmcm9tICcuLi91dGlscy9kYXRlLmpzJ1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGVtaXRzOiBbJ3VwZGF0ZTptb2RlbFZhbHVlJ10sXG5cbiAgcHJvcHM6IHtcbiAgICBtb2RlbFZhbHVlOiB7IHR5cGU6IERhdGUsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBsb2NhbGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnZW4tVVMnIH0sXG4gICAgZGlzYWJsZWREYXRlOiB7IHR5cGU6IEZ1bmN0aW9uLCBkZWZhdWx0OiAoKSA9PiBmYWxzZSB9LFxuICAgIG1vZGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnZGF5JyB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICBjb25zdCB7IHdlZWtkYXlOYW1lcywgbW9udGhOYW1lcyB9ID0gZ2V0TG9jYWxlTmFtZXModGhpcy5sb2NhbGUpXG4gICAgcmV0dXJuIHtcbiAgICAgIHdlZWtkYXlOYW1lcyxcbiAgICAgIG1vbnRoTmFtZXMsXG4gICAgICBkYXRlUmFuZ2U6IFtdLFxuICAgICAgeWVhclJhbmdlOiBbXSxcbiAgICAgIGN1cnJlbnRWYWx1ZTogKFxuICAgICAgICB0aGlzLm1vZGVsVmFsdWUgfHxcbiAgICAgICAgLy8gSWYgbm8gdmFsdWUgaXMgcHJvdmlkZWQsIHVzZSBjdXJyZW50IGRhdGUgYnV0IGNsZWFyIHRpbWUgZmllbGRzOlxuICAgICAgICBjb3B5RGF0ZShuZXcgRGF0ZSgpLCB7IGhvdXI6IDAsIG1pbnV0ZTogMCwgc2Vjb25kOiAwLCBtaWxsaXNlY29uZDogMCB9KVxuICAgICAgKSxcbiAgICAgIGN1cnJlbnRNb2RlOiB0aGlzLm1vZGVcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBtb2RlbFZhbHVlKHRvLCBmcm9tKSB7XG4gICAgICBpZiAoK3RvICE9PSArZnJvbSkge1xuICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IHRvIHx8IG5ldyBEYXRlKClcbiAgICAgICAgdGhpcy51cGRhdGVEYXRlUmFuZ2UoKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBjdXJyZW50VmFsdWUodG8sIGZyb20pIHtcbiAgICAgIGlmICgrdG8gIT09ICtmcm9tKSB7XG4gICAgICAgIHRoaXMudXBkYXRlRGF0ZVJhbmdlKClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZGlzYWJsZWREYXRlOiAndXBkYXRlRGF0ZVJhbmdlJyxcblxuICAgIG1vZGUobW9kZSkge1xuICAgICAgdGhpcy5jdXJyZW50TW9kZSA9IG1vZGVcbiAgICB9XG4gIH0sXG5cbiAgbW91bnRlZCgpIHtcbiAgICB0aGlzLnVwZGF0ZURhdGVSYW5nZSgpXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGdldE1vbnRoQ2xhc3MobW9udGgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgICdkaXRvLWNhbGVuZGFyLWl0ZW0tYWN0aXZlJzogKFxuICAgICAgICAgIHRoaXMubW9kZWxWYWx1ZSAmJlxuICAgICAgICAgIG1vbnRoID09PSB0aGlzLm1vZGVsVmFsdWUuZ2V0TW9udGgoKSAmJlxuICAgICAgICAgIHRoaXMuY3VycmVudFZhbHVlLmdldEZ1bGxZZWFyKCkgPT09IHRoaXMubW9kZWxWYWx1ZS5nZXRGdWxsWWVhcigpXG4gICAgICAgICksXG4gICAgICAgICdkaXRvLWNhbGVuZGFyLWl0ZW0tY3VycmVudCc6IG1vbnRoID09PSB0aGlzLmN1cnJlbnRWYWx1ZS5nZXRNb250aCgpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGdldFllYXJDbGFzcyh5ZWFyKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAnZGl0by1jYWxlbmRhci1pdGVtLWFjdGl2ZSc6IChcbiAgICAgICAgICB0aGlzLm1vZGVsVmFsdWUgJiYgeWVhciA9PT0gdGhpcy5tb2RlbFZhbHVlLmdldEZ1bGxZZWFyKClcbiAgICAgICAgKSxcbiAgICAgICAgJ2RpdG8tY2FsZW5kYXItaXRlbS1jdXJyZW50JzogeWVhciA9PT0gdGhpcy5jdXJyZW50VmFsdWUuZ2V0RnVsbFllYXIoKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzZXREYXRlKG92ZXJyaWRlcykge1xuICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSBjb3B5RGF0ZSh0aGlzLmN1cnJlbnRWYWx1ZSwgb3ZlcnJpZGVzKVxuICAgIH0sXG5cbiAgICBzdGVwRGVjYWRlKHN0ZXApIHtcbiAgICAgIHRoaXMuc2V0RGF0ZSh7XG4gICAgICAgIHllYXI6IHRoaXMuY3VycmVudFZhbHVlLmdldEZ1bGxZZWFyKCkgKyBzdGVwICogMTBcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIHNldE1vZGUobW9kZSkge1xuICAgICAgdGhpcy5jdXJyZW50TW9kZSA9IG1vZGVcbiAgICB9LFxuXG4gICAgc3RlcE1vbnRoKHN0ZXApIHtcbiAgICAgIGNvbnN0IHsgY3VycmVudFZhbHVlIH0gPSB0aGlzXG4gICAgICBjb25zdCB7IHllYXIsIG1vbnRoIH0gPSB0aGlzLmdldFllYXJNb250aChcbiAgICAgICAgY3VycmVudFZhbHVlLmdldEZ1bGxZZWFyKCksXG4gICAgICAgIGN1cnJlbnRWYWx1ZS5nZXRNb250aCgpICsgc3RlcFxuICAgICAgKVxuICAgICAgdGhpcy5zZXREYXRlKHtcbiAgICAgICAgbW9udGgsXG4gICAgICAgIGRheTogTWF0aC5taW4oXG4gICAgICAgICAgdGhpcy5nZXREYXlzSW5Nb250aCh5ZWFyLCBtb250aCksXG4gICAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUuZ2V0RGF0ZSgpXG4gICAgICAgIClcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIHN0ZXBZZWFyKHN0ZXApIHtcbiAgICAgIHRoaXMuc2V0RGF0ZSh7XG4gICAgICAgIHllYXI6IHRoaXMuY3VycmVudFZhbHVlLmdldEZ1bGxZZWFyKCkgKyBzdGVwXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBzZWxlY3REYXRlKGRhdGUsIHN0YXRlLCBjb3B5ID0gZmFsc2UpIHtcbiAgICAgIGlmIChzdGF0ZSAhPT0gJ2Rpc2FibGVkJykge1xuICAgICAgICBpZiAoY29weSkge1xuICAgICAgICAgIHRoaXMuc2V0RGF0ZSh7XG4gICAgICAgICAgICB5ZWFyOiBkYXRlLmdldEZ1bGxZZWFyKCksXG4gICAgICAgICAgICBtb250aDogZGF0ZS5nZXRNb250aCgpLFxuICAgICAgICAgICAgZGF5OiBkYXRlLmdldERhdGUoKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSBkYXRlXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnLCB0aGlzLmN1cnJlbnRWYWx1ZSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc2VsZWN0TW9udGgobW9udGgpIHtcbiAgICAgIHRoaXMuc2V0TW9kZSgnZGF5JylcbiAgICAgIC8vIFNldCBkYXkgdG8gMSB0byBhdm9pZCBzZWxlY3RpbmcgYSBkYXRlIHRoYXQgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGVcbiAgICAgIC8vIG5ldyBtb250aCwgZS5nLiBGZWIgMzEgLT4gTWFyIDMuXG4gICAgICB0aGlzLnNldERhdGUoeyBtb250aCwgZGF5OiAxIH0pXG4gICAgfSxcblxuICAgIHNlbGVjdFllYXIoeWVhcikge1xuICAgICAgdGhpcy5zZXRNb2RlKCdtb250aCcpXG4gICAgICB0aGlzLnNldERhdGUoeyB5ZWFyIH0pXG4gICAgfSxcblxuICAgIGdldFllYXJNb250aCh5ZWFyLCBtb250aCkge1xuICAgICAgaWYgKG1vbnRoID4gMTEpIHtcbiAgICAgICAgeWVhcisrXG4gICAgICAgIG1vbnRoID0gMFxuICAgICAgfSBlbHNlIGlmIChtb250aCA8IDApIHtcbiAgICAgICAgeWVhci0tXG4gICAgICAgIG1vbnRoID0gMTFcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IHllYXIsIG1vbnRoIH1cbiAgICB9LFxuXG4gICAgZGF0ZVRvU3RyaW5nKGRhdGUsIHsgeWVhciwgbW9udGgsIGRheSB9KSB7XG4gICAgICByZXR1cm4gZGF0ZS50b0xvY2FsZVN0cmluZyh0aGlzLmxvY2FsZSwge1xuICAgICAgICB5ZWFyOiB5ZWFyICYmICdudW1lcmljJyxcbiAgICAgICAgbW9udGg6IG1vbnRoICYmICdsb25nJyxcbiAgICAgICAgZGF5OiBkYXkgJiYgJ251bWVyaWMnXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBkZWNhZGVUb1N0cmluZyhkYXRlKSB7XG4gICAgICBjb25zdCB5ZWFyID0gdGhpcy5nZXRGaXJzdFllYXJPZkRlY2FkZShkYXRlLmdldEZ1bGxZZWFyKCkpXG4gICAgICByZXR1cm4gYCR7eWVhcn0g4oCTICR7eWVhciArIDl9YFxuICAgIH0sXG5cbiAgICBnZXREYXlzSW5Nb250aCh5ZWFyLCBtb250aCkge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlKHllYXIsIG1vbnRoICsgMSwgMCkuZ2V0RGF0ZSgpXG4gICAgfSxcblxuICAgIGdldEZpcnN0WWVhck9mRGVjYWRlKHllYXIpIHtcbiAgICAgIGNvbnN0IHllYXJTdHIgPSB5ZWFyLnRvU3RyaW5nKClcbiAgICAgIHJldHVybiArYCR7eWVhclN0ci5zbGljZSgwLCAtMSl9MGBcbiAgICB9LFxuXG4gICAgbmF2aWdhdGUoeyBob3IsIHZlciwgZW50ZXIgfSkge1xuICAgICAgY29uc3QgeyBjdXJyZW50TW9kZSwgY3VycmVudFZhbHVlIH0gPSB0aGlzXG4gICAgICBpZiAoaG9yIHx8IHZlcikge1xuICAgICAgICBzd2l0Y2ggKGN1cnJlbnRNb2RlKSB7XG4gICAgICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgICAgIHRoaXMuc2V0RGF0ZSh7XG4gICAgICAgICAgICAgIGRheTogY3VycmVudFZhbHVlLmdldERhdGUoKSArIGhvciArIHZlciAqIDdcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgJ21vbnRoJzpcbiAgICAgICAgICAgIHRoaXMuc2V0RGF0ZSh7XG4gICAgICAgICAgICAgIG1vbnRoOiBjdXJyZW50VmFsdWUuZ2V0TW9udGgoKSArIGhvciArIHZlciAqIDZcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICAgICAgdGhpcy5zZXREYXRlKHtcbiAgICAgICAgICAgICAgeWVhcjogY3VycmVudFZhbHVlLmdldEZ1bGxZZWFyKCkgKyBob3IgKyB2ZXIgKiA1XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfSBlbHNlIGlmIChlbnRlcikge1xuICAgICAgICBzd2l0Y2ggKGN1cnJlbnRNb2RlKSB7XG4gICAgICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0RGF0ZShjdXJyZW50VmFsdWUpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgJ21vbnRoJzpcbiAgICAgICAgICAgIHRoaXMuc2V0TW9kZSgnZGF5JylcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSAneWVhcic6XG4gICAgICAgICAgICB0aGlzLnNldE1vZGUoJ21vbnRoJylcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgdXBkYXRlRGF0ZVJhbmdlKCkge1xuICAgICAgdGhpcy5kYXRlUmFuZ2UgPSBbXVxuICAgICAgdGhpcy55ZWFyUmFuZ2UgPSBbXVxuXG4gICAgICBjb25zdCB7IGN1cnJlbnRWYWx1ZSB9ID0gdGhpc1xuICAgICAgY29uc3QgeWVhciA9IGN1cnJlbnRWYWx1ZS5nZXRGdWxsWWVhcigpXG4gICAgICBjb25zdCBtb250aCA9IGN1cnJlbnRWYWx1ZS5nZXRNb250aCgpXG4gICAgICBjb25zdCBzdGFydFllYXIgPSB0aGlzLmdldEZpcnN0WWVhck9mRGVjYWRlKHllYXIpXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEwOyBpKyspIHtcbiAgICAgICAgdGhpcy55ZWFyUmFuZ2UucHVzaChzdGFydFllYXIgKyBpKVxuICAgICAgfVxuICAgICAgY29uc3QgY3Vyck1vbnRoRmlyc3REYXkgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgMSlcbiAgICAgIGxldCBmaXJzdERheVdlZWsgPSBjdXJyTW9udGhGaXJzdERheS5nZXREYXkoKSArIDFcbiAgICAgIGlmIChmaXJzdERheVdlZWsgPT09IDApIHtcbiAgICAgICAgZmlyc3REYXlXZWVrID0gN1xuICAgICAgfVxuICAgICAgY29uc3QgbnVtRGF5cyA9IHRoaXMuZ2V0RGF5c0luTW9udGgoeWVhciwgbW9udGgpXG4gICAgICBpZiAoZmlyc3REYXlXZWVrID4gMSkge1xuICAgICAgICBjb25zdCBwcmV2TW9udGggPSB0aGlzLmdldFllYXJNb250aCh5ZWFyLCBtb250aCAtIDEpXG4gICAgICAgIGNvbnN0IHByZXZNb250aE51bURheXMgPSB0aGlzLmdldERheXNJbk1vbnRoKFxuICAgICAgICAgIHByZXZNb250aC55ZWFyLFxuICAgICAgICAgIHByZXZNb250aC5tb250aFxuICAgICAgICApXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgZmlyc3REYXlXZWVrOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBkYXkgPSBwcmV2TW9udGhOdW1EYXlzIC0gZmlyc3REYXlXZWVrICsgaSArIDFcbiAgICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUocHJldk1vbnRoLnllYXIsIHByZXZNb250aC5tb250aCwgZGF5KVxuICAgICAgICAgIHRoaXMuZGF0ZVJhbmdlLnB1c2goe1xuICAgICAgICAgICAgdGV4dDogZGF5LFxuICAgICAgICAgICAgZGF0ZSxcbiAgICAgICAgICAgIHN0YXRlOiB0aGlzLmRpc2FibGVkRGF0ZShkYXRlKSA/ICdkaXNhYmxlZCcgOiAnZ3JheSdcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKVxuICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gbnVtRGF5czsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgaSlcbiAgICAgICAgY29uc3QgaXNEYXkgPSBkYXRlID0+IChcbiAgICAgICAgICBkYXRlICYmXG4gICAgICAgICAgZGF0ZS5nZXREYXRlKCkgPT09IGkgJiZcbiAgICAgICAgICBkYXRlLmdldEZ1bGxZZWFyKCkgPT09IHllYXIgJiZcbiAgICAgICAgICBkYXRlLmdldE1vbnRoKCkgPT09IG1vbnRoXG4gICAgICAgIClcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBpc0RheSh0aGlzLm1vZGVsVmFsdWUpXG4gICAgICAgICAgPyAnYWN0aXZlJ1xuICAgICAgICAgIDogaXNEYXkodG9kYXkpXG4gICAgICAgICAgICA/ICd0b2RheSdcbiAgICAgICAgICAgIDogdGhpcy5kaXNhYmxlZERhdGUoZGF0ZSlcbiAgICAgICAgICAgICAgPyAnZGlzYWJsZWQnXG4gICAgICAgICAgICAgIDogaXNEYXkoY3VycmVudFZhbHVlKVxuICAgICAgICAgICAgICAgID8gJ2N1cnJlbnQnXG4gICAgICAgICAgICAgICAgOiBudWxsXG4gICAgICAgIHRoaXMuZGF0ZVJhbmdlLnB1c2goe1xuICAgICAgICAgIHRleHQ6IGksXG4gICAgICAgICAgZGF0ZSxcbiAgICAgICAgICBzdGF0ZVxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBjb25zdCBuZXh0TW9udGhOZWVkID0gNDIgLSB0aGlzLmRhdGVSYW5nZS5sZW5ndGhcbiAgICAgIGlmIChuZXh0TW9udGhOZWVkID4gMCkge1xuICAgICAgICBjb25zdCBuZXh0TW9udGggPSB0aGlzLmdldFllYXJNb250aCh5ZWFyLCBtb250aCArIDEpXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IG5leHRNb250aE5lZWQ7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShuZXh0TW9udGgueWVhciwgbmV4dE1vbnRoLm1vbnRoLCBpKVxuICAgICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5kaXNhYmxlZERhdGUoZGF0ZSkgPyAnZGlzYWJsZWQnIDogJ2dyYXknXG4gICAgICAgICAgdGhpcy5kYXRlUmFuZ2UucHVzaCh7XG4gICAgICAgICAgICB0ZXh0OiBpLFxuICAgICAgICAgICAgZGF0ZSxcbiAgICAgICAgICAgIHN0YXRlXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5jb25zdCBsb2NhbGVOYW1lcyA9IHt9XG5cbi8vIENhbGxpbmcgYHRvTG9jYWxlU3RyaW5nKClgIHRoaXMgbXVjaCBhcHBlYXJzIHRvIGJlIGV4cGVuc2l2ZSwgc28gY2FjaGUgaXQ6XG5mdW5jdGlvbiBnZXRMb2NhbGVOYW1lcyhsb2NhbGUpIHtcbiAgbGV0IG5hbWVzID0gbG9jYWxlTmFtZXNbbG9jYWxlXVxuICBpZiAoIW5hbWVzKSB7XG4gICAgY29uc3Qgd2Vla2RheU5hbWVzID0gW11cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDc7IGkrKykge1xuICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKDAsIDAsIGkpXG4gICAgICB3ZWVrZGF5TmFtZXMucHVzaCh7XG4gICAgICAgIGxvbmc6IGRhdGUudG9Mb2NhbGVTdHJpbmcobG9jYWxlLCB7IHdlZWtkYXk6ICdsb25nJyB9KSxcbiAgICAgICAgc2hvcnQ6IGRhdGUudG9Mb2NhbGVTdHJpbmcobG9jYWxlLCB7IHdlZWtkYXk6ICdzaG9ydCcgfSlcbiAgICAgIH0pXG4gICAgfVxuICAgIGNvbnN0IG1vbnRoTmFtZXMgPSBbXVxuICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IDEyOyBpKyspIHtcbiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgwLCBpLCAwKVxuICAgICAgbW9udGhOYW1lcy5wdXNoKHtcbiAgICAgICAgbG9uZzogZGF0ZS50b0xvY2FsZVN0cmluZyhsb2NhbGUsIHsgbW9udGg6ICdsb25nJyB9KSxcbiAgICAgICAgc2hvcnQ6IGRhdGUudG9Mb2NhbGVTdHJpbmcobG9jYWxlLCB7IG1vbnRoOiAnc2hvcnQnIH0pXG4gICAgICB9KVxuICAgIH1cbiAgICBuYW1lcyA9IGxvY2FsZU5hbWVzW2xvY2FsZV0gPSB7XG4gICAgICB3ZWVrZGF5TmFtZXMsXG4gICAgICBtb250aE5hbWVzXG4gICAgfVxuICB9XG4gIHJldHVybiBuYW1lc1xufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tY2FsZW5kYXIge1xuICBtaW4td2lkdGg6IDI0MHB4O1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xufVxuXG4uZGl0by1jYWxlbmRhci1wb3B1cCB7XG4gIGJvcmRlcjogJGJvcmRlci1zdHlsZTtcbiAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG4gIGJhY2tncm91bmQ6ICRjb2xvci13aGl0ZTtcbiAgYm94LXNoYWRvdzogJHNoYWRvdy13aW5kb3c7XG4gIHotaW5kZXg6IDEwMDA7XG59XG5cbi5kaXRvLWNhbGVuZGFyLWJvZHkge1xuICBwYWRkaW5nOiAwIDAuNWVtO1xuXG4gIHNwYW4ge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICB3aWR0aDogY2FsYygxMDAlIC8gNyk7XG4gICAgaGVpZ2h0OiAkaW5wdXQtaGVpZ2h0O1xuICAgIGxpbmUtaGVpZ2h0OiBjYWxjKCN7JGlucHV0LWhlaWdodH0gLSAycHgpO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG4gICAgYm9yZGVyOiAkYm9yZGVyLXdpZHRoIHNvbGlkIHRyYW5zcGFyZW50O1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgfVxuXG4gIC5kaXRvLWNhbGVuZGFyLWl0ZW0tdG9kYXkge1xuICAgIGJvcmRlcjogJGJvcmRlci13aWR0aCBzb2xpZCAkY29sb3ItYWN0aXZlO1xuICAgIGNvbG9yOiAkY29sb3ItYWN0aXZlO1xuICB9XG5cbiAgLmRpdG8tY2FsZW5kYXItaXRlbS1hY3RpdmUge1xuICAgICYsXG4gICAgJjpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kOiAkY29sb3ItYWN0aXZlO1xuICAgICAgY29sb3I6IHdoaXRlO1xuICAgIH1cbiAgfVxuXG4gIC5kaXRvLWNhbGVuZGFyLWl0ZW0tZGlzYWJsZWQge1xuICAgIGJhY2tncm91bmQ6IHdoaXRlO1xuICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgfVxuXG4gIC5kaXRvLWNhbGVuZGFyLWl0ZW0tZGlzYWJsZWQsXG4gIC5kaXRvLWNhbGVuZGFyLWl0ZW0tZ3JheSB7XG4gICAgY29sb3I6ICM5OTk5OTk7XG4gIH1cbn1cblxuLmRpdG8tY2FsZW5kYXItbW9udGhzLFxuLmRpdG8tY2FsZW5kYXIteWVhcnMge1xuICBzcGFuIHtcbiAgICB3aWR0aDogY2FsYygxMDAlIC8gNCk7XG4gICAgbWFyZ2luOiAwLjVlbSAwO1xuICB9XG59XG5cbi5kaXRvLWNhbGVuZGFyLXllYXJzIHNwYW4ge1xuICB3aWR0aDogY2FsYygxMDAlIC8gNSk7XG59XG5cbi5kaXRvLWNhbGVuZGFyIGEsXG4uZGl0by1jYWxlbmRhci1kYXRlcyBzcGFuLFxuLmRpdG8tY2FsZW5kYXItbW9udGhzIHNwYW4sXG4uZGl0by1jYWxlbmRhci15ZWFycyBzcGFuIHtcbiAgQGluY2x1ZGUgdXNlci1zZWxlY3Qobm9uZSk7XG5cbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG4uZGl0by1jYWxlbmRhci1oZWFkZXIgc3BhbiB7XG4gIGN1cnNvcjogZGVmYXVsdDtcblxuICBhIHtcbiAgICBwYWRkaW5nOiAwIDAuMmVtO1xuICB9XG59XG5cbi5kaXRvLWNhbGVuZGFyLWRhdGVzIHNwYW46aG92ZXIsXG4uZGl0by1jYWxlbmRhci1tb250aHMgc3Bhbjpob3Zlcixcbi5kaXRvLWNhbGVuZGFyLXllYXJzIHNwYW46aG92ZXIsXG4uZGl0by1jYWxlbmRhcjpub3QoOmhvdmVyKSAuZGl0by1jYWxlbmRhci1pdGVtLWN1cnJlbnQge1xuICBiYWNrZ3JvdW5kOiAkY29sb3ItaGlnaGxpZ2h0O1xufVxuXG4uZGl0by1jYWxlbmRhci13ZWVrZGF5cyBzcGFuIHtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIEBpbmNsdWRlIHVzZXItc2VsZWN0KG5vbmUpO1xufVxuXG4uZGl0by1jYWxlbmRhci1oZWFkZXIsXG4uZGl0by1jYWxlbmRhci1mb290ZXIge1xuICBAZXh0ZW5kICVpbnB1dC1oZWlnaHQ7XG5cbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG59XG5cbi5kaXRvLWNhbGVuZGFyLWZvb3RlciB7XG4gIGJvcmRlci10b3A6ICRib3JkZXItc3R5bGU7XG59XG5cbi5kaXRvLWNhbGVuZGFyLWhlYWRlciB7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICBib3JkZXItYm90dG9tOiAkYm9yZGVyLXN0eWxlO1xuICBkaXNwbGF5OiBmbGV4O1xuXG4gID4gc3BhbiB7XG4gICAgbWFyZ2luOiBhdXRvO1xuICAgIHBhZGRpbmc6IDAgMC41ZW07XG4gIH1cblxuICBhIHtcbiAgICBmb250LXdlaWdodDogYm9sZDtcblxuICAgICY6aG92ZXIge1xuICAgICAgY29sb3I6ICRjb2xvci1hY3RpdmU7XG4gICAgfVxuICB9XG59XG5cbi5kaXRvLWNhbGVuZGFyLXN0ZXAtcHJldixcbi5kaXRvLWNhbGVuZGFyLXN0ZXAtbmV4dCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgd2lkdGg6IDUlO1xuICBtaW4td2lkdGg6IDJlbTtcbiAgbWF4LXdpZHRoOiAzZW07XG5cbiAgJjo6YWZ0ZXIge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBsZWZ0OiAwO1xuICAgIHJpZ2h0OiAwO1xuICAgIGZvbnQtc2l6ZTogMS4yNWVtO1xuICB9XG59XG5cbi5kaXRvLWNhbGVuZGFyLXN0ZXAtcHJldiB7XG4gICY6OmFmdGVyIHtcbiAgICBjb250ZW50OiAn4oC5JztcbiAgfVxuXG4gICYuZGl0by1jYWxlbmRhci1zdGVwLXllYXI6OmFmdGVyIHtcbiAgICBjb250ZW50OiAnwqsnO1xuICB9XG59XG5cbi5kaXRvLWNhbGVuZGFyLXN0ZXAtbmV4dCB7XG4gICY6OmFmdGVyIHtcbiAgICBjb250ZW50OiAn4oC6JztcbiAgfVxuXG4gICYuZGl0by1jYWxlbmRhci1zdGVwLXllYXI6OmFmdGVyIHtcbiAgICBjb250ZW50OiAnwrsnO1xuICB9XG59XG5cbi5kaXRvLWNhbGVuZGFyLXNlbGVjdC10b2RheSB7XG4gICY6OmFmdGVyIHtcbiAgICBjb250ZW50OiAnTm93JztcbiAgfVxufVxuPC9zdHlsZT5cbiIsImV4cG9ydCBmdW5jdGlvbiBhZGRFdmVudHModGFyZ2V0LCBldmVudHMpIHtcbiAgZm9yIChjb25zdCB0eXBlIGluIGV2ZW50cykge1xuICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGV2ZW50c1t0eXBlXSwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIHtcbiAgICByZW1vdmUoKSB7XG4gICAgICBmb3IgKGNvbnN0IHR5cGUgaW4gZXZlbnRzKSB7XG4gICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGV2ZW50c1t0eXBlXSwgZmFsc2UpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRLZXkoZXZlbnQpIHtcbiAgcmV0dXJuIHtcbiAgICAzNzogJ2xlZnQnLFxuICAgIDM4OiAndXAnLFxuICAgIDM5OiAncmlnaHQnLFxuICAgIDQwOiAnZG93bicsXG4gICAgMTM6ICdlbnRlcidcbiAgfVtldmVudC5rZXlDb2RlXVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0S2V5TmF2aWdhdGlvbihldmVudCkge1xuICBjb25zdCBrZXkgPSBnZXRLZXkoZXZlbnQpXG4gIHJldHVybiB7XG4gICAgaG9yOiB7IGxlZnQ6IC0xLCByaWdodDogMSB9W2tleV0gfHwgMCxcbiAgICB2ZXI6IHsgdXA6IC0xLCBkb3duOiAxIH1ba2V5XSB8fCAwLFxuICAgIGVudGVyOiBrZXkgPT09ICdlbnRlcidcbiAgfVxufVxuIiwiPCEtLSBEZXJpdmVkIGZyb20gQVRVSSwgYW5kIGZ1cnRoZXIgZXh0ZW5kZWQ6IGh0dHBzOi8vYWxpcWluLmdpdGh1Yi5pby9hdHVpLyAtLT5cbjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by10cmlnZ2VyLWNvbnRhaW5lclxuICAuZGl0by10cmlnZ2VyKFxuICAgIHYtaWY9XCJhbHdheXNTaG93XCJcbiAgICByZWY9XCJ0cmlnZ2VyXCJcbiAgICA6Y2xhc3M9XCJ0cmlnZ2VyQ2xhc3NcIlxuICApXG4gICAgc2xvdChuYW1lPVwidHJpZ2dlclwiKVxuICAuZGl0by10cmlnZ2VyKFxuICAgIHYtZWxzZS1pZj1cInRyaWdnZXIgPT09ICdjbGljaydcIlxuICAgIHJlZj1cInRyaWdnZXJcIlxuICAgIDpjbGFzcz1cInRyaWdnZXJDbGFzc1wiXG4gICAgQGNsaWNrPVwib25DbGlja1wiXG4gIClcbiAgICBzbG90KG5hbWU9XCJ0cmlnZ2VyXCIpXG4gIC5kaXRvLXRyaWdnZXIoXG4gICAgdi1lbHNlLWlmPVwidHJpZ2dlciA9PT0gJ2hvdmVyJ1wiXG4gICAgcmVmPVwidHJpZ2dlclwiXG4gICAgOmNsYXNzPVwidHJpZ2dlckNsYXNzXCJcbiAgICBAbW91c2VlbnRlcj1cIm9uSG92ZXIodHJ1ZSlcIlxuICAgIEBtb3VzZWxlYXZlPVwib25Ib3ZlcihmYWxzZSlcIlxuICApXG4gICAgc2xvdChuYW1lPVwidHJpZ2dlclwiKVxuICAuZGl0by10cmlnZ2VyKFxuICAgIHYtZWxzZS1pZj1cInRyaWdnZXIgPT09ICdmb2N1cycgfHwgdHJpZ2dlciA9PT0gJ2Fsd2F5cydcIlxuICAgIHJlZj1cInRyaWdnZXJcIlxuICAgIDpjbGFzcz1cInRyaWdnZXJDbGFzc1wiXG4gIClcbiAgICBzbG90KG5hbWU9XCJ0cmlnZ2VyXCIpXG4gIFRyYW5zaXRpb24oOm5hbWU9XCJ0cmFuc2l0aW9uXCIpXG4gICAgLmRpdG8tcG9wdXAoXG4gICAgICB2LWlmPVwidHJpZ2dlciA9PT0gJ2hvdmVyJ1wiXG4gICAgICB2LXNob3c9XCJzaG93UG9wdXBcIlxuICAgICAgcmVmPVwicG9wdXBcIlxuICAgICAgOmNsYXNzPVwicG9wdXBDbGFzc1wiXG4gICAgICA6c3R5bGU9XCJwb3B1cFN0eWxlXCJcbiAgICAgIEBtb3VzZWVudGVyPVwib25Ib3Zlcih0cnVlKVwiXG4gICAgICBAbW91c2VsZWF2ZT1cIm9uSG92ZXIoZmFsc2UpXCJcbiAgICApXG4gICAgICBzbG90KFxuICAgICAgICB2LWlmPVwic2hvd1BvcHVwXCJcbiAgICAgICAgbmFtZT1cInBvcHVwXCJcbiAgICAgIClcbiAgICAuZGl0by1wb3B1cChcbiAgICAgIHYtZWxzZVxuICAgICAgdi1zaG93PVwic2hvd1BvcHVwXCJcbiAgICAgIHJlZj1cInBvcHVwXCJcbiAgICAgIDpjbGFzcz1cInBvcHVwQ2xhc3NcIlxuICAgICAgOnN0eWxlPVwicG9wdXBTdHlsZVwiXG4gICAgKVxuICAgICAgc2xvdChcbiAgICAgICAgdi1pZj1cInNob3dQb3B1cFwiXG4gICAgICAgIG5hbWU9XCJwb3B1cFwiXG4gICAgICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IHsgaXNTdHJpbmcsIGh5cGhlbmF0ZSB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgeyBhZGRFdmVudHMgfSBmcm9tICcuLi91dGlscy9ldmVudC5qcydcblxuZXhwb3J0IGRlZmF1bHQge1xuICBlbWl0czogWyd1cGRhdGU6c2hvdyddLFxuXG4gIHByb3BzOiB7XG4gICAgdHJpZ2dlcjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdjbGljaycgfSxcbiAgICB0cmFuc2l0aW9uOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ3NsaWRlJyB9LFxuICAgIHBsYWNlbWVudDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdib3R0b20nIH0sXG4gICAgc2hvdzogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgdGFyZ2V0OiB7IHR5cGU6IFtTdHJpbmcsIEhUTUxFbGVtZW50XSwgZGVmYXVsdDogbnVsbCB9LFxuICAgIGN1c3RvbUNsYXNzOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIHpJbmRleDogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IDAgfSxcbiAgICBrZWVwSW5WaWV3OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWUgfSxcbiAgICBoaWRlV2hlbkNsaWNrT3V0c2lkZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgYWx3YXlzU2hvdzogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGNvdmVyOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgaGlkZURlbGF5OiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMCB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2hvd1BvcHVwOiB0aGlzLnNob3csXG4gICAgICBwb3B1cFBsYWNlbWVudDogdGhpcy5wbGFjZW1lbnRcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICB0cmlnZ2VyQ2xhc3MoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAnZGl0by10cmlnZ2VyLWRpc2FibGVkJzogdGhpcy5kaXNhYmxlZFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBwb3B1cENsYXNzKCkge1xuICAgICAgY29uc3QgY2xhc3NlcyA9IHtcbiAgICAgICAgW2BkaXRvLXBvcHVwLSR7aHlwaGVuYXRlKHRoaXMucGxhY2VtZW50KX1gXTogdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY3VzdG9tQ2xhc3MpIHtcbiAgICAgICAgY2xhc3Nlc1t0aGlzLmN1c3RvbUNsYXNzXSA9IHRydWVcbiAgICAgIH1cbiAgICAgIHJldHVybiBjbGFzc2VzXG4gICAgfSxcblxuICAgIHBvcHVwU3R5bGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy56SW5kZXggPyBgei1pbmRleDogJHt0aGlzLnpJbmRleH1gIDogJydcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBzaG93KHNob3cpIHtcbiAgICAgIHRoaXMuc2hvd1BvcHVwID0gc2hvdyB8fCB0aGlzLmFsd2F5c1Nob3dcbiAgICB9LFxuXG4gICAgc2hvd1BvcHVwKHRvLCBmcm9tKSB7XG4gICAgICBpZiAodG8gXiBmcm9tKSB7XG4gICAgICAgIHRoaXMuJGVtaXQoJ3VwZGF0ZTpzaG93JywgdG8pXG4gICAgICAgIGlmICh0bykge1xuICAgICAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHRoaXMudXBkYXRlUG9zaXRpb24oKSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtb3VudGVkKCkge1xuICAgIGNvbnN0IHsgdHJpZ2dlciwgcG9wdXAgfSA9IHRoaXMuJHJlZnNcbiAgICBpZiAodGhpcy50cmlnZ2VyID09PSAnZm9jdXMnKSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSB0cmlnZ2VyLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0LCB0ZXh0YXJlYScpXG4gICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgIHRoaXMuZm9jdXNFdmVudHMgPSBhZGRFdmVudHModGFyZ2V0LCB7XG4gICAgICAgICAgZm9jdXM6ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2hvd1BvcHVwID0gdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgYmx1cjogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zaG93UG9wdXAgPSBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5oaWRlV2hlbkNsaWNrT3V0c2lkZSAmJiAhdGhpcy5hbHdheXNTaG93KSB7XG4gICAgICAvLyBVc2UgJ21vdXNldXAnIGluc3RlYWQgb2YgJ2NsaWNrJywgc2luY2UgY2xpY2sgYXBwZWFycyB0byBoYXBwZW4gYWZ0ZXJcbiAgICAgIC8vIHRoZSBET00gaW5zaWRlIG9mIHBvcHVwcyBjb3VsZCBjaGFuZ2UgaW4gYSB3YXkgc28gdGhhdCB0aGUgY2hlY2tcbiAgICAgIC8vIGBwb3B1cC5jb250YWlucyhldmVudC50YXJnZXQpYCB3b3VsZCBmYWlsOlxuICAgICAgdGhpcy5jbG9zZUV2ZW50cyA9IGFkZEV2ZW50cyh3aW5kb3csIHtcbiAgICAgICAgbW91c2V1cDogZXZlbnQgPT4ge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuc2hvd1BvcHVwICYmXG4gICAgICAgICAgICAhcG9wdXAuY29udGFpbnMoZXZlbnQudGFyZ2V0KSAmJlxuICAgICAgICAgICAgIXRyaWdnZXIuY29udGFpbnMoZXZlbnQudGFyZ2V0KVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5zaG93UG9wdXAgPSBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBibHVyOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zaG93UG9wdXAgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmICh0aGlzLmFsd2F5c1Nob3cpIHtcbiAgICAgIHRoaXMuc2hvd1BvcHVwID0gdHJ1ZVxuICAgIH1cbiAgfSxcblxuICBjcmVhdGVkKCkge1xuICAgIHRoaXMuc2hvd1BvcHVwID0gdGhpcy5zaG93XG4gIH0sXG5cbiAgdW5tb3VudGVkKCkge1xuICAgIHRoaXMuZm9jdXNFdmVudHM/LnJlbW92ZSgpXG4gICAgdGhpcy5jbG9zZUV2ZW50cz8ucmVtb3ZlKClcbiAgICB0aGlzLm1vdXNlTGVhdmVUaW1lciA9IG51bGxcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgdXBkYXRlUG9zaXRpb24oKSB7XG4gICAgICBjb25zdCB7IHRyaWdnZXIsIHBvcHVwIH0gPSB0aGlzLiRyZWZzXG4gICAgICBpZiAodGhpcy5zaG93ICYmIHBvcHVwLm9mZnNldFdpZHRoID09PSAwKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy51cGRhdGVQb3NpdGlvbigpLCAwKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgdGFyZ2V0ID0gaXNTdHJpbmcodGhpcy50YXJnZXQpXG4gICAgICAgID8gdGhpcy4kcmVmc1t0aGlzLnRhcmdldF1cbiAgICAgICAgOiB0aGlzLnRhcmdldFxuICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICAvLyBBY3R1YWxseSByZXNpemUgdGhlIHBvcHVwJ3MgZmlyc3QgY2hpbGQsIHNvIHRoZXkgY2FuIHNldCBzaXplIGxpbWl0cy5cbiAgICAgICAgY29uc3QgZWwgPSB0YXJnZXQgPT09IHBvcHVwID8gdHJpZ2dlciA6IHBvcHVwLmZpcnN0RWxlbWVudENoaWxkXG4gICAgICAgIGlmIChlbCkge1xuICAgICAgICAgIGVsLnN0eWxlLndpZHRoID0gZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXQpLndpZHRoXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgYm91bmRzID0gKHRhcmdldCB8fCB0cmlnZ2VyKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgY29uc3QgdHJpZ2dlckxlZnQgPSBib3VuZHMubGVmdCArIHdpbmRvdy5zY3JvbGxYXG4gICAgICBjb25zdCB0cmlnZ2VyVG9wID0gYm91bmRzLnRvcCArIHdpbmRvdy5zY3JvbGxZXG4gICAgICBjb25zdCB0cmlnZ2VyV2lkdGggPSBib3VuZHMud2lkdGhcbiAgICAgIGNvbnN0IHRyaWdnZXJIZWlnaHQgPSBib3VuZHMuaGVpZ2h0XG4gICAgICBjb25zdCBwb3B1cFdpZHRoID0gcG9wdXAub2Zmc2V0V2lkdGhcbiAgICAgIGNvbnN0IHBvcHVwSGVpZ2h0ID0gcG9wdXAub2Zmc2V0SGVpZ2h0XG5cbiAgICAgIGxldCBbcGFydDEsIHBhcnQyXSA9IHRoaXMucG9wdXBQbGFjZW1lbnQuc3BsaXQoJy0nKSB8fCBbXVxuICAgICAgaWYgKHRoaXMua2VlcEluVmlldykge1xuICAgICAgICBjb25zdCB3aW5XaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoXG4gICAgICAgIGNvbnN0IHdpbkhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodFxuICAgICAgICBpZiAocGFydDEgPT09ICd0b3AnKSB7XG4gICAgICAgICAgaWYgKHRyaWdnZXJUb3AgPCBwb3B1cEhlaWdodCkge1xuICAgICAgICAgICAgcGFydDEgPSAnYm90dG9tJ1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChwYXJ0MSA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgICBpZiAod2luSGVpZ2h0IC0gdHJpZ2dlclRvcCAtIHRyaWdnZXJIZWlnaHQgPCBwb3B1cEhlaWdodCkge1xuICAgICAgICAgICAgcGFydDEgPSAndG9wJ1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChwYXJ0MSA9PT0gJ2xlZnQnKSB7XG4gICAgICAgICAgaWYgKHRyaWdnZXJMZWZ0IDwgcG9wdXBXaWR0aCkge1xuICAgICAgICAgICAgcGFydDEgPSAncmlnaHQnXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHBhcnQxID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgaWYgKHdpbldpZHRoIC0gdHJpZ2dlckxlZnQgLSB0cmlnZ2VyV2lkdGggPCBwb3B1cFdpZHRoKSB7XG4gICAgICAgICAgICBwYXJ0MSA9ICdsZWZ0J1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXJ0MiA9PT0gJ3RvcCcpIHtcbiAgICAgICAgICBpZiAod2luSGVpZ2h0IC0gdHJpZ2dlclRvcCA8IHBvcHVwSGVpZ2h0KSB7XG4gICAgICAgICAgICBwYXJ0MiA9ICdib3R0b20nXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHBhcnQyID09PSAnYm90dG9tJykge1xuICAgICAgICAgIGlmICh0cmlnZ2VyVG9wICsgdHJpZ2dlckhlaWdodCA8IHBvcHVwSGVpZ2h0KSB7XG4gICAgICAgICAgICBwYXJ0MiA9ICd0b3AnXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHBhcnQyID09PSAnbGVmdCcpIHtcbiAgICAgICAgICBpZiAod2luV2lkdGggLSB0cmlnZ2VyTGVmdCA8IHBvcHVwV2lkdGgpIHtcbiAgICAgICAgICAgIHBhcnQyID0gJ3JpZ2h0J1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChwYXJ0MiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgIGlmICh0cmlnZ2VyTGVmdCArIHRyaWdnZXJXaWR0aCA8IHBvcHVwV2lkdGgpIHtcbiAgICAgICAgICAgIHBhcnQyID0gJ2xlZnQnXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxldCBsZWZ0ID0gMFxuICAgICAgbGV0IHRvcCA9IDBcbiAgICAgIHN3aXRjaCAocGFydDEpIHtcbiAgICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgICB0b3AgLT0gcG9wdXBIZWlnaHRcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdsZWZ0JzpcbiAgICAgICAgICBsZWZ0IC09IHBvcHVwV2lkdGhcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgICAgbGVmdCArPSB0cmlnZ2VyV2lkdGhcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICAgIHRvcCArPSB0cmlnZ2VySGVpZ2h0XG4gICAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAocGFydDIpIHtcbiAgICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICAgIGxlZnQgLT0gcG9wdXBXaWR0aCAtIHRyaWdnZXJXaWR0aFxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgICAgdG9wIC09IHBvcHVwSGVpZ2h0IC0gdHJpZ2dlckhlaWdodFxuICAgICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jb3Zlcikge1xuICAgICAgICBpZiAocGFydDEgPT09ICd0b3AnKSB7XG4gICAgICAgICAgdG9wICs9IHRyaWdnZXJIZWlnaHRcbiAgICAgICAgfSBlbHNlIGlmIChwYXJ0MSA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgICB0b3AgLT0gdHJpZ2dlckhlaWdodFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGFyZ2V0ICYmIHRhcmdldCAhPT0gdHJpZ2dlcikge1xuICAgICAgICBjb25zdCB0cmlnZ2VyQm91bmRzID0gdHJpZ2dlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgICBsZWZ0ICs9IHRyaWdnZXJMZWZ0IC0gdHJpZ2dlckJvdW5kcy5sZWZ0XG4gICAgICAgIHRvcCArPSB0cmlnZ2VyVG9wIC0gdHJpZ2dlckJvdW5kcy50b3BcbiAgICAgIH1cbiAgICAgIHBvcHVwLnN0eWxlLmxlZnQgPSBgJHtsZWZ0fXB4YFxuICAgICAgcG9wdXAuc3R5bGUudG9wID0gYCR7dG9wfXB4YFxuICAgIH0sXG5cbiAgICBvbkNsaWNrKCkge1xuICAgICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgIHRoaXMuc2hvd1BvcHVwID0gIXRoaXMuc2hvd1BvcHVwXG4gICAgICB9XG4gICAgfSxcblxuICAgIG9uSG92ZXIoZW50ZXIpIHtcbiAgICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5tb3VzZUxlYXZlVGltZXIpXG4gICAgICAgIGlmIChlbnRlcikge1xuICAgICAgICAgIHRoaXMuc2hvd1BvcHVwID0gdHJ1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0aGlzLmhpZGVEZWxheSkge1xuICAgICAgICAgICAgdGhpcy5tb3VzZUxlYXZlVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5zaG93UG9wdXAgPSBmYWxzZVxuICAgICAgICAgICAgfSwgdGhpcy5oaWRlRGVsYXkpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd1BvcHVwID0gZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5AaW1wb3J0ICcuLi9zdHlsZXMvdHJhbnNpdGlvbnMvaW5kZXguc2Nzcyc7XG5cbi5kaXRvLXRyaWdnZXItY29udGFpbmVyIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG4uZGl0by10cmlnZ2VyLWRpc2FibGVkIHtcbiAgY29sb3I6ICRjb2xvci1kaXNhYmxlZDtcbiAgYm9yZGVyLWNvbG9yOiAkYm9yZGVyLWNvbG9yO1xuICBjdXJzb3I6IGRlZmF1bHQ7XG5cbiAgKiB7XG4gICAgY3Vyc29yOiBkZWZhdWx0ICFpbXBvcnRhbnQ7XG4gICAgQGluY2x1ZGUgdXNlci1zZWxlY3Qobm9uZSk7XG5cbiAgICAmOmZvY3VzIHtcbiAgICAgIGJveC1zaGFkb3c6IG5vbmU7XG4gICAgfVxuICB9XG59XG5cbi5kaXRvLXBvcHVwIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIHotaW5kZXg6IDEwMDA7XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLWlucHV0XG4gIHNsb3QobmFtZT1cImJlZm9yZVwiKVxuICBpbnB1dChcbiAgICA6aWQ9XCJpZFwiXG4gICAgcmVmPVwiaW5wdXRcIlxuICAgIHYtbW9kZWw9XCJjdXJyZW50VmFsdWVcIlxuICAgIDp0eXBlPVwidHlwZVwiXG4gICAgOm5hbWU9XCJuYW1lXCJcbiAgICA6dGl0bGU9XCJ0aXRsZVwiXG4gICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgIDpyZWFkb25seT1cInJlYWRvbmx5XCJcbiAgICA6YXV0b2ZvY3VzPVwiYXV0b2ZvY3VzXCJcbiAgICA6cGxhY2Vob2xkZXI9XCJwbGFjZWhvbGRlclwiXG4gICAgOmF1dG9jb21wbGV0ZT1cImF1dG9jb21wbGV0ZVwiXG4gICAgOmFyaWEtbGFiZWw9XCJ0aXRsZVwiXG4gICAgdi1iaW5kPVwiJGF0dHJzXCJcbiAgKVxuICBzbG90KG5hbWU9XCJhZnRlclwiKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgZW1pdHM6IFsndXBkYXRlOm1vZGVsVmFsdWUnXSxcblxuICBwcm9wczoge1xuICAgIG1vZGVsVmFsdWU6IHsgdHlwZTogW1N0cmluZywgTnVtYmVyXSwgZGVmYXVsdDogbnVsbCB9LFxuICAgIHR5cGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAndGV4dCcgfSxcbiAgICBpZDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBuYW1lOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIHRpdGxlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgcmVhZG9ubHk6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBhdXRvZm9jdXM6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBwbGFjZWhvbGRlcjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBhdXRvY29tcGxldGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnb2ZmJyB9XG4gICAgLypcbiAgICBjbGVhcmFibGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfVxuICAgIHN1ZmZpeEljb246IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgcHJlZml4SWNvbjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfVxuICAgICovXG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY3VycmVudFZhbHVlOiB0aGlzLm1vZGVsVmFsdWUsXG4gICAgICBob3ZlcmluZzogZmFsc2UsXG4gICAgICBmb2N1c2VkOiBmYWxzZVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIHNpemUoKSB7XG4gICAgICAvLyBEZXRlcm1pbmUgc2l6ZSBiYXNlZCBvbiBtaW4gJiBtYXggc2V0dGluZ3MsIGlmIHRoZXkncmUgcHJvdmlkZWQuXG4gICAgICBjb25zdCB7IHNpemUsIG1pbiwgbWF4IH0gPSB0aGlzLiRhdHRyc1xuICAgICAgY29uc3QgZ2V0TGVuZ3RoID0gdmFsdWUgPT4gKHZhbHVlICE9IG51bGwgPyBgJHt2YWx1ZX1gLmxlbmd0aCA6IDApXG4gICAgICByZXR1cm4gc2l6ZSB8fCBnZXRMZW5ndGgobWluKSB8fCBnZXRMZW5ndGgobWF4KSB8fCB1bmRlZmluZWRcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBtb2RlbFZhbHVlKHRvLCBmcm9tKSB7XG4gICAgICBpZiAodG8gIT09IGZyb20pIHtcbiAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSB0b1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBjdXJyZW50VmFsdWUoY3VycmVudFZhbHVlKSB7XG4gICAgICBpZiAoY3VycmVudFZhbHVlICE9PSB0aGlzLm1vZGVsVmFsdWUpIHtcbiAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnLCBjdXJyZW50VmFsdWUpXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBmb2N1cygpIHtcbiAgICAgIHRoaXMuJHJlZnMuaW5wdXQuZm9jdXMoKVxuICAgIH0sXG5cbiAgICBibHVyKCkge1xuICAgICAgdGhpcy4kcmVmcy5pbnB1dC5ibHVyKClcbiAgICB9XG4gIH1cbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLWlucHV0IHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG5cbiAgQGV4dGVuZCAlaW5wdXQ7XG5cbiAgaW5wdXQge1xuICAgIC8vIEluaGVyaXQgYWxsIHN0eWxpbmcgZnJvbSAuZGl0by1pbnB1dFxuICAgIGFsbDogaW5oZXJpdDtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgYm9yZGVyOiAwO1xuICAgIG1hcmdpbjogMDtcbiAgICBwYWRkaW5nOiAwO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPCEtLSBEZXJpdmVkIGZyb20gQVRVSSwgYW5kIGZ1cnRoZXIgZXh0ZW5kZWQ6IGh0dHBzOi8vYWxpcWluLmdpdGh1Yi5pby9hdHVpLyAtLT5cbjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG5UcmlnZ2VyLmRpdG8tZGF0ZS1waWNrZXIoXG4gIHJlZj1cInRyaWdnZXJcIlxuICB2LW1vZGVsOnNob3c9XCJzaG93UG9wdXBcIlxuICB0cmlnZ2VyPVwiY2xpY2tcIlxuICB2LWJpbmQ9XCJ7IHRyYW5zaXRpb24sIHBsYWNlbWVudCwgZGlzYWJsZWQsIHRhcmdldCB9XCJcbilcbiAgdGVtcGxhdGUoI3RyaWdnZXIpXG4gICAgSW5wdXRGaWVsZC5kaXRvLWRhdGUtcGlja2VyLWlucHV0KFxuICAgICAgcmVmPVwiaW5wdXRcIlxuICAgICAgdi1tb2RlbD1cImN1cnJlbnRUZXh0XCJcbiAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgIHJlYWRvbmx5XG4gICAgICA6Y2xhc3M9XCJ7ICdkaXRvLWZvY3VzJzogc2hvd1BvcHVwIH1cIlxuICAgICAgdi1iaW5kPVwieyBwbGFjZWhvbGRlciwgZGlzYWJsZWQgfVwiXG4gICAgICBAZm9jdXM9XCJpbnB1dEZvY3VzZWQgPSB0cnVlXCJcbiAgICAgIEBibHVyPVwiaW5wdXRGb2N1c2VkID0gZmFsc2VcIlxuICAgICAgQGtleWRvd249XCJvbktleURvd25cIlxuICAgIClcbiAgLy8gaWNvbih0eXBlPVwiY2FsZW5kYXJcIiA6Y29sb3I9XCJpY29uQ29sb3JcIilcbiAgdGVtcGxhdGUoI3BvcHVwKVxuICAgIENhbGVuZGFyLmRpdG8tZGF0ZS1waWNrZXItcG9wdXAoXG4gICAgICByZWY9XCJjYWxlbmRhclwiXG4gICAgICB2LW1vZGVsPVwiY3VycmVudFZhbHVlXCJcbiAgICAgIHYtYmluZD1cInsgbG9jYWxlLCBkaXNhYmxlZERhdGUgfVwiXG4gICAgKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCB7IGZvcm1hdCwgZGVmYXVsdEZvcm1hdHMgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IFRyaWdnZXIgZnJvbSAnLi9UcmlnZ2VyLnZ1ZSdcbmltcG9ydCBDYWxlbmRhciBmcm9tICcuL0NhbGVuZGFyLnZ1ZSdcbmltcG9ydCBJbnB1dEZpZWxkIGZyb20gJy4vSW5wdXRGaWVsZC52dWUnXG5pbXBvcnQgeyBnZXRLZXlOYXZpZ2F0aW9uIH0gZnJvbSAnLi4vdXRpbHMvZXZlbnQuanMnXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgY29tcG9uZW50czogeyBUcmlnZ2VyLCBDYWxlbmRhciwgSW5wdXRGaWVsZCB9LFxuICBlbWl0czogWyd1cGRhdGU6bW9kZWxWYWx1ZScsICd1cGRhdGU6c2hvdycsICdmb2N1cycsICdibHVyJ10sXG5cbiAgcHJvcHM6IHtcbiAgICBtb2RlbFZhbHVlOiB7IHR5cGU6IERhdGUsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICB0cmFuc2l0aW9uOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ3NsaWRlJyB9LFxuICAgIHBsYWNlbWVudDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdib3R0b20tbGVmdCcgfSxcbiAgICBwbGFjZWhvbGRlcjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBsb2NhbGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnZW4tVVMnIH0sXG4gICAgZGF0ZUZvcm1hdDogeyB0eXBlOiBPYmplY3QsIGRlZmF1bHQ6ICgpID0+IGRlZmF1bHRGb3JtYXRzLmRhdGUgfSxcbiAgICBzaG93OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICB0YXJnZXQ6IHsgdHlwZTogW1N0cmluZywgSFRNTEVsZW1lbnRdLCBkZWZhdWx0OiAndHJpZ2dlcicgfSxcbiAgICBkaXNhYmxlZERhdGU6IHsgdHlwZTogRnVuY3Rpb24sIGRlZmF1bHQ6ICgpID0+IGZhbHNlIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjdXJyZW50VmFsdWU6IHRoaXMubW9kZWxWYWx1ZSxcbiAgICAgIHNob3dQb3B1cDogdGhpcy5zaG93LFxuICAgICAgaW5wdXRGb2N1c2VkOiBmYWxzZSxcbiAgICAgIGNoYW5nZWQ6IGZhbHNlXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgZm9jdXNlZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlucHV0Rm9jdXNlZCB8fCB0aGlzLnNob3dQb3B1cFxuICAgIH0sXG5cbiAgICBjdXJyZW50VGV4dCgpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGZvcm1hdCh0aGlzLmN1cnJlbnRWYWx1ZSwge1xuICAgICAgICAgIGxvY2FsZTogdGhpcy5sb2NhbGUsXG4gICAgICAgICAgZGF0ZTogdGhpcy5kYXRlRm9ybWF0LFxuICAgICAgICAgIHRpbWU6IGZhbHNlXG4gICAgICAgIH0pIHx8ICcnXG4gICAgICApXG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgbW9kZWxWYWx1ZSh0bywgZnJvbSkge1xuICAgICAgaWYgKCt0byAhPT0gK2Zyb20pIHtcbiAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSB0b1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBjdXJyZW50VmFsdWUoY3VycmVudFZhbHVlKSB7XG4gICAgICBpZiAoK2N1cnJlbnRWYWx1ZSAhPT0gK3RoaXMubW9kZWxWYWx1ZSkge1xuICAgICAgICB0aGlzLmNoYW5nZWQgPSB0cnVlXG4gICAgICAgIHRoaXMuc2hvd1BvcHVwID0gZmFsc2VcbiAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnLCBjdXJyZW50VmFsdWUpXG4gICAgICB9XG4gICAgfSxcblxuICAgIHNob3coc2hvdykge1xuICAgICAgdGhpcy5zaG93UG9wdXAgPSBzaG93XG4gICAgfSxcblxuICAgIHNob3dQb3B1cCh0bywgZnJvbSkge1xuICAgICAgaWYgKHRvIF4gZnJvbSkge1xuICAgICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6c2hvdycsIHRvKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBmb2N1c2VkKHRvLCBmcm9tKSB7XG4gICAgICBpZiAodG8gXiBmcm9tKSB7XG4gICAgICAgIHRoaXMuJGVtaXQodG8gPyAnZm9jdXMnIDogJ2JsdXInKVxuICAgICAgICBpZiAoIXRvICYmIHRoaXMuY2hhbmdlZCkge1xuICAgICAgICAgIC8vIFRPRE86IFRoaXMgc2VlbXMgdG8gY29udHJhZGljdCB0aGUgYGN1cnJlbnRWYWx1ZSgpYCB3YXRjaGVyIGFib3ZlLlxuICAgICAgICAgIC8vICAgICAgIElzIHRoaXMgbmVlZGVkIGF0IGFsbD9cbiAgICAgICAgICB0aGlzLmNoYW5nZWQgPSBmYWxzZVxuICAgICAgICAgIHRoaXMuJGVtaXQoJ3VwZGF0ZTptb2RlbFZhbHVlJywgdGhpcy5jdXJyZW50VmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIG9uS2V5RG93bihldmVudCkge1xuICAgICAgaWYgKHRoaXMuJHJlZnMuY2FsZW5kYXI/Lm5hdmlnYXRlKGdldEtleU5hdmlnYXRpb24oZXZlbnQpKSkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGZvY3VzKCkge1xuICAgICAgdGhpcy4kcmVmcy5pbnB1dC5mb2N1cygpXG4gICAgfSxcblxuICAgIGJsdXIoKSB7XG4gICAgICB0aGlzLiRyZWZzLmlucHV0LmJsdXIoKVxuICAgIH1cbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tZGF0ZS1waWNrZXIge1xuICBtaW4td2lkdGg6IDEwZW07XG5cbiAgLmRpdG8taW5wdXQge1xuICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIHdpZHRoOiAxMDAlO1xuICB9XG59XG5cbi5kaXRvLWRhdGUtcGlja2VyLXBvcHVwIHtcbiAgbWFyZ2luOiAkcG9wdXAtbWFyZ2luO1xufVxuPC9zdHlsZT5cbiIsImV4cG9ydCBmdW5jdGlvbiBzY3JvbGxUbyhlbGVtZW50LCB0bywgZHVyYXRpb24pIHtcbiAgY29uc3QgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gKFxuICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcbiAgICBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gc2V0VGltZW91dChhcmd1bWVudHNbMF0sIDEwKVxuICAgIH1cbiAgKVxuICBpZiAoZHVyYXRpb24gPD0gMCkge1xuICAgIGVsZW1lbnQuc2Nyb2xsVG9wID0gdG9cbiAgfSBlbHNlIHtcbiAgICBjb25zdCBkaWZmZXJlbmNlID0gdG8gLSBlbGVtZW50LnNjcm9sbFRvcFxuICAgIGNvbnN0IHBlclRpY2sgPSBkaWZmZXJlbmNlIC8gZHVyYXRpb24gKiAxMFxuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICBlbGVtZW50LnNjcm9sbFRvcCA9IGVsZW1lbnQuc2Nyb2xsVG9wICsgcGVyVGlja1xuICAgICAgaWYgKGVsZW1lbnQuc2Nyb2xsVG9wID09PSB0bykgcmV0dXJuXG4gICAgICBzY3JvbGxUbyhlbGVtZW50LCB0bywgZHVyYXRpb24gLSAxMClcbiAgICB9KVxuICB9XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gc2V0U2VsZWN0aW9uKGZpZWxkLCBzdGFydCwgZW5kKSB7XG4gIGlmIChmaWVsZC5jcmVhdGVUZXh0UmFuZ2UpIHtcbiAgICBjb25zdCByYW5nZSA9IGZpZWxkLmNyZWF0ZVRleHRSYW5nZSgpXG4gICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSlcbiAgICByYW5nZS5tb3ZlU3RhcnQoJ2NoYXJhY3RlcicsIHN0YXJ0KVxuICAgIHJhbmdlLm1vdmVFbmQoJ2NoYXJhY3RlcicsIGVuZClcbiAgICByYW5nZS5zZWxlY3QoKVxuICAgIGZpZWxkLmZvY3VzKClcbiAgfSBlbHNlIGlmIChmaWVsZC5zZXRTZWxlY3Rpb25SYW5nZSkge1xuICAgIGZpZWxkLmZvY3VzKClcbiAgICBmaWVsZC5zZXRTZWxlY3Rpb25SYW5nZShzdGFydCwgZW5kKVxuICB9IGVsc2UgaWYgKCdzZWxlY3Rpb25TdGFydCcgaW4gZmllbGQpIHtcbiAgICBmaWVsZC5zZWxlY3Rpb25TdGFydCA9IHN0YXJ0XG4gICAgZmllbGQuc2VsZWN0aW9uRW5kID0gZW5kXG4gICAgZmllbGQuZm9jdXMoKVxuICB9XG59XG4iLCI8IS0tIERlcml2ZWQgZnJvbSBBVFVJLCBhbmQgZnVydGhlciBleHRlbmRlZDogaHR0cHM6Ly9hbGlxaW4uZ2l0aHViLmlvL2F0dWkvIC0tPlxuPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cblRyaWdnZXIuZGl0by10aW1lLXBpY2tlcihcbiAgcmVmPVwidHJpZ2dlclwiXG4gIHYtbW9kZWw6c2hvdz1cInNob3dQb3B1cFwiXG4gIHRyaWdnZXI9XCJjbGlja1wiXG4gIHYtYmluZD1cInsgdHJhbnNpdGlvbiwgcGxhY2VtZW50LCBkaXNhYmxlZCwgdGFyZ2V0IH1cIlxuKVxuICB0ZW1wbGF0ZSgjdHJpZ2dlcilcbiAgICBJbnB1dEZpZWxkLmRpdG8tdGltZS1waWNrZXItaW5wdXQoXG4gICAgICByZWY9XCJpbnB1dFwiXG4gICAgICB2LW1vZGVsPVwiY3VycmVudFRleHRcIlxuICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgcmVhZG9ubHlcbiAgICAgIDpjbGFzcz1cInsgJ2RpdG8tZm9jdXMnOiBzaG93UG9wdXAgfVwiXG4gICAgICB2LWJpbmQ9XCJ7IHBsYWNlaG9sZGVyLCBkaXNhYmxlZCB9XCJcbiAgICAgIEBmb2N1cz1cImlucHV0Rm9jdXNlZCA9IHRydWVcIlxuICAgICAgQGJsdXI9XCJpbnB1dEZvY3VzZWQgPSBmYWxzZVwiXG4gICAgICBAa2V5ZG93bj1cIm9uS2V5RG93blwiXG4gICAgKVxuICAgIC8vLSBpY29uKHR5cGU9XCJ0aW1lXCJcbiAgICAvLy0gOmNvbG9yPVwiZGlzYWJsZWQgPyAnI2JmYmZiZicgOiAodGV4dCA/ICcjNjY2JyA6ICcjYmZiZmJmJylcIlxuICAgIC8vLSApXG4gIHRlbXBsYXRlKCNwb3B1cClcbiAgICAuZGl0by10aW1lLXBpY2tlci1wb3B1cFxuICAgICAgLmRpdG8tdGltZS1waWNrZXItcGFuZWxcbiAgICAgICAgdWwuZGl0by10aW1lLXBpY2tlci1ob3VyKFxuICAgICAgICAgIHJlZj1cImhvdXJcIlxuICAgICAgICAgIEBtb3VzZW92ZXI9XCJzZWxlY3Rpb24gPSAwXCJcbiAgICAgICAgKVxuICAgICAgICAgIHRlbXBsYXRlKFxuICAgICAgICAgICAgdi1mb3I9XCJpbmRleCBpbiAyNFwiXG4gICAgICAgICAgKVxuICAgICAgICAgICAgbGkoXG4gICAgICAgICAgICAgIHYtaWY9XCIhZGlzYWJsZWRIb3VyKGluZGV4IC0gMSlcIlxuICAgICAgICAgICAgICA6Y2xhc3M9XCJ7IHNlbGVjdGVkOiBob3VyID09PSBpbmRleCAtIDEgfVwiXG4gICAgICAgICAgICAgIEBjbGljaz1cImhvdXIgPSBpbmRleCAtIDFcIlxuICAgICAgICAgICAgKSB7eyBsZWZ0UGFkKGluZGV4IC0gMSkgfX1cbiAgICAgIC5kaXRvLXRpbWUtcGlja2VyLXBhbmVsXG4gICAgICAgIHVsLmRpdG8tdGltZS1waWNrZXItbWludXRlKFxuICAgICAgICAgIHJlZj1cIm1pbnV0ZVwiXG4gICAgICAgICAgQG1vdXNlb3Zlcj1cInNlbGVjdGlvbiA9IDFcIlxuICAgICAgICApXG4gICAgICAgICAgdGVtcGxhdGUoXG4gICAgICAgICAgICB2LWZvcj1cImluZGV4IGluIDYwXCJcbiAgICAgICAgICApXG4gICAgICAgICAgICBsaShcbiAgICAgICAgICAgICAgdi1pZj1cIiFkaXNhYmxlZE1pbnV0ZShpbmRleCAtIDEpXCJcbiAgICAgICAgICAgICAgOmNsYXNzPVwieyBzZWxlY3RlZDogbWludXRlID09PSBpbmRleCAtIDEgfVwiXG4gICAgICAgICAgICAgIEBjbGljaz1cIm1pbnV0ZSA9IGluZGV4IC0gMVwiXG4gICAgICAgICAgICApIHt7IGxlZnRQYWQoaW5kZXggLSAxKSB9fVxuICAgICAgLmRpdG8tdGltZS1waWNrZXItcGFuZWxcbiAgICAgICAgdWwuZGl0by10aW1lLXBpY2tlci1zZWNvbmQoXG4gICAgICAgICAgcmVmPVwic2Vjb25kXCJcbiAgICAgICAgICBAbW91c2VvdmVyPVwic2VsZWN0aW9uID0gMlwiXG4gICAgICAgIClcbiAgICAgICAgICB0ZW1wbGF0ZShcbiAgICAgICAgICAgIHYtZm9yPVwiaW5kZXggaW4gNjBcIlxuICAgICAgICAgIClcbiAgICAgICAgICAgIGxpKFxuICAgICAgICAgICAgICB2LWlmPVwiIWRpc2FibGVkU2Vjb25kKGluZGV4IC0gMSlcIlxuICAgICAgICAgICAgICA6Y2xhc3M9XCJ7IHNlbGVjdGVkOiBzZWNvbmQgPT09IGluZGV4IC0gMSB9XCJcbiAgICAgICAgICAgICAgQGNsaWNrPVwic2Vjb25kID0gaW5kZXggLSAxXCJcbiAgICAgICAgICAgICkge3sgbGVmdFBhZChpbmRleCAtIDEpIH19XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IFRyaWdnZXIgZnJvbSAnLi9UcmlnZ2VyLnZ1ZSdcbmltcG9ydCBJbnB1dEZpZWxkIGZyb20gJy4vSW5wdXRGaWVsZC52dWUnXG5pbXBvcnQgeyBjb3B5RGF0ZSB9IGZyb20gJy4uL3V0aWxzL2RhdGUuanMnXG5pbXBvcnQgeyBzY3JvbGxUbyB9IGZyb20gJy4uL3V0aWxzL3Njcm9sbC5qcydcbmltcG9ydCB7IHNldFNlbGVjdGlvbiB9IGZyb20gJy4uL3V0aWxzL3NlbGVjdGlvbi5qcydcbmltcG9ydCB7IGdldEtleU5hdmlnYXRpb24gfSBmcm9tICcuLi91dGlscy9ldmVudC5qcydcblxuZXhwb3J0IGRlZmF1bHQge1xuICBjb21wb25lbnRzOiB7IFRyaWdnZXIsIElucHV0RmllbGQgfSxcbiAgZW1pdHM6IFsndXBkYXRlOm1vZGVsVmFsdWUnLCAndXBkYXRlOnNob3cnLCAnY2hhbmdlJywgJ2ZvY3VzJywgJ2JsdXInXSxcblxuICBwcm9wczoge1xuICAgIG1vZGVsVmFsdWU6IHsgdHlwZTogRGF0ZSwgZGVmYXVsdDogbnVsbCB9LFxuICAgIHRyYW5zaXRpb246IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnc2xpZGUnIH0sXG4gICAgcGxhY2VtZW50OiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2JvdHRvbS1sZWZ0JyB9LFxuICAgIHBsYWNlaG9sZGVyOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIHNob3c6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIHRhcmdldDogeyB0eXBlOiBbU3RyaW5nLCBIVE1MRWxlbWVudF0sIGRlZmF1bHQ6ICd0cmlnZ2VyJyB9LFxuICAgIGRpc2FibGVkSG91cjogeyB0eXBlOiBGdW5jdGlvbiwgZGVmYXVsdDogKCkgPT4gZmFsc2UgfSxcbiAgICBkaXNhYmxlZE1pbnV0ZTogeyB0eXBlOiBGdW5jdGlvbiwgZGVmYXVsdDogKCkgPT4gZmFsc2UgfSxcbiAgICBkaXNhYmxlZFNlY29uZDogeyB0eXBlOiBGdW5jdGlvbiwgZGVmYXVsdDogKCkgPT4gZmFsc2UgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGN1cnJlbnRWYWx1ZTogdGhpcy5tb2RlbFZhbHVlLFxuICAgICAgc2hvd1BvcHVwOiB0aGlzLnNob3csXG4gICAgICBpbnB1dEZvY3VzZWQ6IGZhbHNlLFxuICAgICAgc2VsZWN0aW9uOiAwLFxuICAgICAgY2hhbmdlZDogZmFsc2VcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBmb2N1c2VkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW5wdXRGb2N1c2VkIHx8IHRoaXMuc2hvd1BvcHVwXG4gICAgfSxcblxuICAgIGN1cnJlbnRUZXh0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFZhbHVlXG4gICAgICAgID8gYCR7XG4gICAgICAgICAgICB0aGlzLmxlZnRQYWQodGhpcy5ob3VyKVxuICAgICAgICAgIH06JHtcbiAgICAgICAgICAgIHRoaXMubGVmdFBhZCh0aGlzLm1pbnV0ZSlcbiAgICAgICAgICB9OiR7XG4gICAgICAgICAgICB0aGlzLmxlZnRQYWQodGhpcy5zZWNvbmQpXG4gICAgICAgICAgfWBcbiAgICAgICAgOiAnJ1xuICAgIH0sXG5cbiAgICBjdXJyZW50RGF0ZSgpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRoaXMuY3VycmVudFZhbHVlIHx8XG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBEYXRlKCkgb2JqZWN0IHdpdGggdGhlIHRpbWUgc2V0IHRvIDAsIHRvIGJlIHVzZWQgd2hlblxuICAgICAgICAvLyBmaXJzdCBzZXR0aW5nIGFueSBvZiB0aGUgdGltZXMsIGZvciBtZWFuaW5nZnVsIGRhdGVzIGluIGNhc2UgdGhlXG4gICAgICAgIC8vIG9iamVjdCBpcyBzaGFyZWQgd2l0aCBhIERhdGVQaWNrZXIsIGUuZy4gdGhyb3VnaCBEYXRlVGltZVBpY2tlci5cbiAgICAgICAgY29weURhdGUobmV3IERhdGUoKSwgeyBob3VyOiAwLCBtaW51dGU6IDAsIHNlY29uZDogMCwgbWlsbGlzZWNvbmQ6IDAgfSlcbiAgICAgIClcbiAgICB9LFxuXG4gICAgaG91cjoge1xuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50RGF0ZS5nZXRIb3VycygpXG4gICAgICB9LFxuXG4gICAgICBzZXQoaG91cikge1xuICAgICAgICB0aGlzLnNldFRpbWUoeyBob3VyIH0pXG4gICAgICB9XG4gICAgfSxcblxuICAgIG1pbnV0ZToge1xuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50RGF0ZS5nZXRNaW51dGVzKClcbiAgICAgIH0sXG5cbiAgICAgIHNldChtaW51dGUpIHtcbiAgICAgICAgdGhpcy5zZXRUaW1lKHsgbWludXRlIH0pXG4gICAgICB9XG4gICAgfSxcblxuICAgIHNlY29uZDoge1xuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50RGF0ZS5nZXRTZWNvbmRzKClcbiAgICAgIH0sXG5cbiAgICAgIHNldChzZWNvbmQpIHtcbiAgICAgICAgdGhpcy5zZXRUaW1lKHsgc2Vjb25kIH0pXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgbW9kZWxWYWx1ZSh0bywgZnJvbSkge1xuICAgICAgaWYgKCt0byAhPT0gK2Zyb20pIHtcbiAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSB0b1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBjdXJyZW50VmFsdWUoZGF0ZSkge1xuICAgICAgaWYgKCtkYXRlICE9PSArdGhpcy5tb2RlbFZhbHVlKSB7XG4gICAgICAgIHRoaXMuY2hhbmdlZCA9IHRydWVcbiAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnLCBkYXRlKVxuICAgICAgICB0aGlzLnNjcm9sbEFsbCgpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGN1cnJlbnRUZXh0OiAndXBkYXRlU2VsZWN0aW9uJyxcblxuICAgIHNlbGVjdGlvbjogJ3VwZGF0ZVNlbGVjdGlvbicsXG5cbiAgICBzaG93KHNob3cpIHtcbiAgICAgIHRoaXMuc2hvd1BvcHVwID0gc2hvd1xuICAgIH0sXG5cbiAgICBzaG93UG9wdXAodG8sIGZyb20pIHtcbiAgICAgIGlmICh0bykge1xuICAgICAgICB0aGlzLnVwZGF0ZVNlbGVjdGlvbigpXG4gICAgICAgIHRoaXMuc2Nyb2xsQWxsKDApXG4gICAgICB9XG4gICAgICBpZiAodG8gXiBmcm9tKSB7XG4gICAgICAgIHRoaXMuJGVtaXQoJ3VwZGF0ZTpzaG93JywgdG8pXG4gICAgICB9XG4gICAgfSxcblxuICAgIGZvY3VzZWQodG8sIGZyb20pIHtcbiAgICAgIGlmICh0byBeIGZyb20pIHtcbiAgICAgICAgdGhpcy4kZW1pdCh0byA/ICdmb2N1cycgOiAnYmx1cicpXG4gICAgICAgIGlmICghdG8gJiYgdGhpcy5jaGFuZ2VkKSB7XG4gICAgICAgICAgdGhpcy5jaGFuZ2VkID0gZmFsc2VcbiAgICAgICAgICB0aGlzLiRlbWl0KCdjaGFuZ2UnLCB0aGlzLmN1cnJlbnRWYWx1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgbGVmdFBhZCh2YWx1ZSkge1xuICAgICAgcmV0dXJuICgnMCcgKyB2YWx1ZSkuc2xpY2UoLTIpXG4gICAgfSxcblxuICAgIHNldFRpbWUob3ZlcnJpZGVzKSB7XG4gICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IGNvcHlEYXRlKHRoaXMuY3VycmVudERhdGUsIHtcbiAgICAgICAgLi4ub3ZlcnJpZGVzLFxuICAgICAgICBtaWxsaXNlY29uZDogMFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgdXBkYXRlU2VsZWN0aW9uKGZvcmNlID0gZmFsc2UpIHtcbiAgICAgIGlmICh0aGlzLnNob3dQb3B1cCB8fCBmb3JjZSkge1xuICAgICAgICBjb25zdCBzdGFydCA9IDMgKiB0aGlzLnNlbGVjdGlvblxuICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiBzZXRTZWxlY3Rpb24odGhpcy4kcmVmcy5pbnB1dCwgc3RhcnQsIHN0YXJ0ICsgMikpXG4gICAgICB9XG4gICAgfSxcblxuICAgIHNjcm9sbEFsbChkdXJhdGlvbiA9IDEwMCkge1xuICAgICAgY29uc3Qgc2Nyb2xsID0gKHJlZiwgdmFsdWUpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy4kcmVmc1tyZWZdXG4gICAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgICAvLyBGaXJzdCBhbmQgbGFzdCBvbmUgYWRkIDMgdGltZXMgdGhlIG1hcmdpblxuICAgICAgICAgIGNvbnN0IGxpbmVIZWlnaHQgPSB0YXJnZXQuc2Nyb2xsSGVpZ2h0IC8gKHRhcmdldC5jaGlsZHJlbi5sZW5ndGggKyA2KVxuICAgICAgICAgIHNjcm9sbFRvKHRhcmdldCwgTWF0aC5yb3VuZCh2YWx1ZSAqIGxpbmVIZWlnaHQpLCBkdXJhdGlvbilcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICBzY3JvbGwoJ2hvdXInLCB0aGlzLmhvdXIpXG4gICAgICAgIHNjcm9sbCgnbWludXRlJywgdGhpcy5taW51dGUpXG4gICAgICAgIHNjcm9sbCgnc2Vjb25kJywgdGhpcy5zZWNvbmQpXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBvbktleURvd24oZXZlbnQpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkID0gWydob3VyJywgJ21pbnV0ZScsICdzZWNvbmQnXVt0aGlzLnNlbGVjdGlvbl1cbiAgICAgIGlmIChzZWxlY3RlZCkge1xuICAgICAgICBjb25zdCB7IGhvciwgdmVyLCBlbnRlciB9ID0gZ2V0S2V5TmF2aWdhdGlvbihldmVudClcbiAgICAgICAgaWYgKGhvcikge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5zZWxlY3Rpb24gKyBob3JcbiAgICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IHZhbHVlIDwgMCA/IDIgOiB2YWx1ZSA+IDIgPyAwIDogdmFsdWVcbiAgICAgICAgfSBlbHNlIGlmICh2ZXIpIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXNbc2VsZWN0ZWRdICsgdmVyXG4gICAgICAgICAgY29uc3QgeyBsZW5ndGggfSA9IHRoaXMuJHJlZnNbc2VsZWN0ZWRdLmNoaWxkcmVuXG4gICAgICAgICAgdGhpc1tzZWxlY3RlZF0gPVxuICAgICAgICAgICAgdmFsdWUgPCAwXG4gICAgICAgICAgICAgID8gdmFsdWUgKyBsZW5ndGhcbiAgICAgICAgICAgICAgOiB2YWx1ZSA+PSBsZW5ndGhcbiAgICAgICAgICAgICAgICA/IHZhbHVlIC0gbGVuZ3RoXG4gICAgICAgICAgICAgICAgOiB2YWx1ZVxuICAgICAgICB9XG4gICAgICAgIGlmIChlbnRlcikge1xuICAgICAgICAgIHRoaXMuc2hvd1BvcHVwID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICBpZiAoaG9yIHx8IHZlciB8fCBlbnRlcikge1xuICAgICAgICAgIHRoaXMudXBkYXRlU2VsZWN0aW9uKHRydWUpXG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGZvY3VzKCkge1xuICAgICAgdGhpcy4kcmVmcy5pbnB1dC5mb2N1cygpXG4gICAgfSxcblxuICAgIGJsdXIoKSB7XG4gICAgICB0aGlzLiRyZWZzLmlucHV0LmJsdXIoKVxuICAgIH1cbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tdGltZS1waWNrZXIge1xuICAuZGl0by1pbnB1dCB7XG4gICAgd2lkdGg6IDEwMCU7XG4gIH1cbn1cblxuLmRpdG8tdGltZS1waWNrZXItcG9wdXAge1xuICBtYXgtd2lkdGg6IDE2MHB4O1xuICBtYXJnaW46ICRwb3B1cC1tYXJnaW47XG59XG5cbiR0aW1lLXBpY2tlci1saW5lLWhlaWdodDogMjRweDtcblxuLmRpdG8tdGltZS1waWNrZXIge1xuICAuZGl0by1pbnB1dCB7XG4gICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtcztcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgd2lkdGg6IDEwMCU7XG5cbiAgICAuZGl0by1pY29uLXRpbWUge1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICB0b3A6IDA7XG4gICAgICByaWdodDogN3B4O1xuICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgIH1cbiAgfVxufVxuXG4uZGl0by10aW1lLXBpY2tlci1wb3B1cCB7XG4gIGxpc3Qtc3R5bGU6IG5vbmU7XG4gIGJhY2tncm91bmQ6ICRjb2xvci13aGl0ZTtcbiAgYm9yZGVyOiAkYm9yZGVyLXN0eWxlO1xuICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcbiAgYm94LXNoYWRvdzogJHNoYWRvdy13aW5kb3c7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG5cbi5kaXRvLXRpbWUtcGlja2VyLXBvcHVwIC5kaXRvLXRpbWUtcGlja2VyLXBhbmVsIHtcbiAgZmxvYXQ6IGxlZnQ7XG4gIGJvcmRlcjogJGJvcmRlci1zdHlsZTtcbiAgYm9yZGVyLXdpZHRoOiAwIDFweCAwO1xuICBtYXJnaW4tbGVmdDogLTFweDtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgd2lkdGg6IGNhbGMoMTAwJSAvIDMgKyAxcHgpO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuXG4gICY6bGFzdC1jaGlsZCB7XG4gICAgYm9yZGVyLXJpZ2h0OiAwO1xuICB9XG5cbiAgdWwge1xuICAgIG92ZXJmbG93LXg6IGhpZGRlbjtcbiAgICBvdmVyZmxvdy15OiBhdXRvO1xuICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgbWFyZ2luOiAwO1xuICAgIC8vIEhpZGUgc2Nyb2xsYmFyOlxuICAgIGJveC1zaXppbmc6IGNvbnRlbnQtYm94O1xuICAgIHBhZGRpbmc6IDAgMTdweCAwIDA7XG4gICAgaGVpZ2h0OiA3ICogJHRpbWUtcGlja2VyLWxpbmUtaGVpZ2h0O1xuXG4gICAgJiA+IGxpIHtcbiAgICAgIGJveC1zaXppbmc6IGNvbnRlbnQtYm94O1xuICAgICAgYmFja2dyb3VuZDogJGNvbG9yLXdoaXRlO1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBoZWlnaHQ6ICR0aW1lLXBpY2tlci1saW5lLWhlaWdodDtcbiAgICAgIGxpbmUtaGVpZ2h0OiAkdGltZS1waWNrZXItbGluZS1oZWlnaHQ7XG4gICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zO1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICBAaW5jbHVkZSB1c2VyLXNlbGVjdChub25lKTtcblxuICAgICAgJjpmaXJzdC1jaGlsZCB7XG4gICAgICAgIG1hcmdpbi10b3A6IDMgKiAkdGltZS1waWNrZXItbGluZS1oZWlnaHQ7XG4gICAgICB9XG5cbiAgICAgICY6bGFzdC1jaGlsZCB7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDMgKiAkdGltZS1waWNrZXItbGluZS1oZWlnaHQ7XG4gICAgICB9XG5cbiAgICAgICY6aG92ZXIge1xuICAgICAgICBiYWNrZ3JvdW5kOiAkY29sb3ItaGlnaGxpZ2h0O1xuICAgICAgfVxuXG4gICAgICAmLnNlbGVjdGVkLFxuICAgICAgJi5zZWxlY3RlZDpob3ZlciB7XG4gICAgICAgIGNvbG9yOiAkY29sb3ItdGV4dC1pbnZlcnRlZDtcbiAgICAgICAgYmFja2dyb3VuZDogJGNvbG9yLWFjdGl2ZTtcbiAgICAgIH1cblxuICAgICAgJi5kaXNhYmxlZCB7XG4gICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgICAgY29sb3I6ICRjb2xvci1kaXNhYmxlZDtcbiAgICAgIH1cblxuICAgICAgJi5kaXNhYmxlZDpob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1kYXRlLXRpbWUtcGlja2VyKHJlZj1cInBpY2tlclwiKVxuICAuZGl0by1waWNrZXJzKDpjbGFzcz1cInsgJ2RpdG8tZm9jdXMnOiBmb2N1c2VkIH1cIilcbiAgICBEYXRlUGlja2VyKFxuICAgICAgcmVmPVwiZGF0ZVwiXG4gICAgICB2LW1vZGVsPVwiY3VycmVudFZhbHVlXCJcbiAgICAgIHYtbW9kZWw6c2hvdz1cInNob3dEYXRlXCJcbiAgICAgIHBsYWNlbWVudD1cImJvdHRvbS1sZWZ0XCJcbiAgICAgIDp0YXJnZXQ9XCIkcmVmcy5waWNrZXJcIlxuICAgICAgdi1iaW5kPVwieyB0cmFuc2l0aW9uLCBwbGFjZWhvbGRlciwgbG9jYWxlLCBkYXRlRm9ybWF0LCBkaXNhYmxlZCB9XCJcbiAgICAgIEBmb2N1cz1cImRhdGVGb2N1c2VkID0gdHJ1ZVwiXG4gICAgICBAYmx1cj1cImRhdGVGb2N1c2VkID0gZmFsc2VcIlxuICAgIClcbiAgICBUaW1lUGlja2VyKFxuICAgICAgcmVmPVwidGltZVwiXG4gICAgICB2LW1vZGVsPVwiY3VycmVudFZhbHVlXCJcbiAgICAgIHYtbW9kZWw6c2hvdz1cInNob3dUaW1lXCJcbiAgICAgIHBsYWNlaG9sZGVyPVwiXCJcbiAgICAgIHBsYWNlbWVudD1cImJvdHRvbS1yaWdodFwiXG4gICAgICA6dGFyZ2V0PVwiJHJlZnMucGlja2VyXCJcbiAgICAgIHYtYmluZD1cInsgdHJhbnNpdGlvbiwgZGlzYWJsZWQgfVwiXG4gICAgICBAZm9jdXM9XCJ0aW1lRm9jdXNlZCA9IHRydWVcIlxuICAgICAgQGJsdXI9XCJ0aW1lRm9jdXNlZCA9IGZhbHNlXCJcbiAgICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IHsgZGVmYXVsdEZvcm1hdHMgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IERhdGVQaWNrZXIgZnJvbSAnLi9EYXRlUGlja2VyLnZ1ZSdcbmltcG9ydCBUaW1lUGlja2VyIGZyb20gJy4vVGltZVBpY2tlci52dWUnXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgY29tcG9uZW50czogeyBEYXRlUGlja2VyLCBUaW1lUGlja2VyIH0sXG4gIGVtaXRzOiBbJ3VwZGF0ZTptb2RlbFZhbHVlJywgJ2NoYW5nZScsICdmb2N1cycsICdibHVyJ10sXG5cbiAgcHJvcHM6IHtcbiAgICBtb2RlbFZhbHVlOiB7IHR5cGU6IERhdGUsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICB0cmFuc2l0aW9uOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ3NsaWRlJyB9LFxuICAgIHBsYWNlaG9sZGVyOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIGRhdGVGb3JtYXQ6IHsgdHlwZTogT2JqZWN0LCBkZWZhdWx0OiAoKSA9PiBkZWZhdWx0Rm9ybWF0cy5kYXRlIH0sXG4gICAgbG9jYWxlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2VuLVVTJyB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjdXJyZW50VmFsdWU6IHRoaXMubW9kZWxWYWx1ZSxcbiAgICAgIHNob3dEYXRlOiBmYWxzZSxcbiAgICAgIHNob3dUaW1lOiBmYWxzZSxcbiAgICAgIGRhdGVGb2N1c2VkOiBmYWxzZSxcbiAgICAgIHRpbWVGb2N1c2VkOiBmYWxzZSxcbiAgICAgIGNoYW5nZWQ6IGZhbHNlXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgZm9jdXNlZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGVGb2N1c2VkIHx8IHRoaXMudGltZUZvY3VzZWRcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBtb2RlbFZhbHVlKHRvLCBmcm9tKSB7XG4gICAgICBpZiAoK3RvICE9PSArZnJvbSkge1xuICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IHRvXG4gICAgICB9XG4gICAgfSxcblxuICAgIGN1cnJlbnRWYWx1ZShkYXRlKSB7XG4gICAgICBpZiAoK2RhdGUgIT09ICt0aGlzLm1vZGVsVmFsdWUpIHtcbiAgICAgICAgdGhpcy5jaGFuZ2VkID0gdHJ1ZVxuICAgICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6bW9kZWxWYWx1ZScsIGRhdGUpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGZvY3VzZWQodG8sIGZyb20pIHtcbiAgICAgIGlmICh0byBeIGZyb20pIHtcbiAgICAgICAgdGhpcy4kZW1pdCh0byA/ICdmb2N1cycgOiAnYmx1cicpXG4gICAgICAgIGlmICghdG8gJiYgdGhpcy5jaGFuZ2VkKSB7XG4gICAgICAgICAgdGhpcy5jaGFuZ2VkID0gZmFsc2VcbiAgICAgICAgICB0aGlzLiRlbWl0KCdjaGFuZ2UnLCB0aGlzLmN1cnJlbnRWYWx1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZm9jdXMoKSB7XG4gICAgICB0aGlzLiRyZWZzLmRhdGUuZm9jdXMoKVxuICAgIH0sXG5cbiAgICBibHVyKCkge1xuICAgICAgdGhpcy4kcmVmcy5kYXRlLmJsdXIoKVxuICAgICAgdGhpcy4kcmVmcy50aW1lLmJsdXIoKVxuICAgIH1cbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tZGF0ZS10aW1lLXBpY2tlciB7XG4gIC5kaXRvLXBpY2tlcnMge1xuICAgIEBleHRlbmQgJWlucHV0O1xuXG4gICAgcGFkZGluZzogMDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuXG4gICAgLmRpdG8taW5wdXQge1xuICAgICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAgIGJvcmRlcjogMDtcbiAgICB9XG4gIH1cblxuICAuZGl0by1kYXRlLXBpY2tlciB7XG4gICAgd2lkdGg6IDYwJTtcbiAgICBtaW4td2lkdGg6IDYuOWVtO1xuXG4gICAgLmRpdG8taW5wdXQge1xuICAgICAgcGFkZGluZy1yaWdodDogMDtcbiAgICB9XG4gIH1cblxuICAuZGl0by10aW1lLXBpY2tlciB7XG4gICAgd2lkdGg6IDQwJTtcbiAgICBtaW4td2lkdGg6IDUuNGVtO1xuXG4gICAgLmRpdG8taW5wdXQge1xuICAgICAgcGFkZGluZy1sZWZ0OiAwO1xuICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbmkuZGl0by1pY29uKDpjbGFzcz1cImBkaXRvLWljb24tJHtuYW1lfWBcIilcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5leHBvcnQgZGVmYXVsdCB7XG4gIHByb3BzOiB7XG4gICAgbmFtZToge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgcmVxdWlyZWQ6IHRydWVcbiAgICB9XG4gIH1cbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi8vIGB5YXJuIGJ1aWxkOmljb25zYCBjb252ZXJ0cyB0aGUgaWNvbiBTVkcgZmlsZXMgdG8gc2lsZW50IGNsYXNzZXMgaW5zaWRlXG4vLyBgc3JjL3N0eWxlcy9taXhpbnMvX2ljb25zLnNjc3NgLCBtYWtpbmcgdGhlbSBhdmFpbGFibGUgdG8gYWxsIG90aGVyIHNhc3Ncbi8vIGNvZGUgdGhyb3VnaCBgX2ltcG9ydHNgLlxuLy8gSW4gb3JkZXIgdG8gYmUgYWJsZSB0byB1c2UgdGhlbSBhcyBub3JtYWwgQ1NTIGNsYXNzZXMsIGNvbnZlcnQgdGhlbSBoZXJlOlxuQGVhY2ggJG5hbWUgaW4gJGljb25zIHtcbiAgLmRpdG8taWNvbi0jeyRuYW1lfSB7XG4gICAgQGV4dGVuZCAlaWNvbi0jeyRuYW1lfTtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjwhLS0gZXNsaW50LWRpc2FibGUgdnVlL25vLXRlbXBsYXRlLXNoYWRvdyAtLT5cbjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1wYWdpbmF0aW9uXG4gIC5kaXRvLXBhZ2luYXRpb24tdG90YWwoXG4gICAgdi1pZj1cInNob3dUb3RhbFwiXG4gIClcbiAgICB0ZW1wbGF0ZShcbiAgICAgIHYtaWY9XCJ0b3RhbCA+IDBcIlxuICAgICkge3sgZmlyc3QgfX0g4oCTIHt7IGxhc3QgfX1cbiAgICB0ZW1wbGF0ZShcbiAgICAgIHYtZWxzZVxuICAgICkgMFxuICAgIHwgLyB7eyB0b3RhbCB9fVxuICAuZGl0by1idXR0b25zLmRpdG8tYnV0dG9ucy1yb3VuZFxuICAgIGJ1dHRvbi5kaXRvLWJ1dHRvbihcbiAgICAgIHYtZm9yPVwicGFnZSBpbiBwYWdlUmFuZ2VcIlxuICAgICAgOmNsYXNzPVwiZ2V0UGFnZUNsYXNzKHBhZ2UpXCJcbiAgICAgIDpkaXNhYmxlZD1cInBhZ2UuZGlzYWJsZWRcIlxuICAgICAgQGNsaWNrPVwib25DbGlja1BhZ2UocGFnZSlcIlxuICAgIClcbiAgICAgIHNwYW4oXG4gICAgICAgIHYtaWY9XCJwYWdlLnRleHRcIlxuICAgICAgKSB7eyBwYWdlLnRleHQgfX1cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5leHBvcnQgZGVmYXVsdCB7XG4gIGVtaXRzOiBbJ3VwZGF0ZTpwYWdlJ10sXG5cbiAgcHJvcHM6IHtcbiAgICB0b3RhbDogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IDAgfSxcbiAgICBwYWdlOiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMSB9LFxuICAgIHBhZ2VTaXplOiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMTAgfSxcbiAgICBzaG93VG90YWw6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZSB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGFnZVJhbmdlOiBbXSxcbiAgICAgIHNob3dQcmV2OiB0cnVlLFxuICAgICAgc2hvd05leHQ6IHRydWUsXG4gICAgICBudW1QYWdlczogMCxcbiAgICAgIGN1cnJlbnRQYWdlU2l6ZTogdGhpcy5wYWdlU2l6ZSxcbiAgICAgIGN1cnJlbnRQYWdlOiB0aGlzLnBhZ2VcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBmaXJzdCgpIHtcbiAgICAgIHJldHVybiAodGhpcy5jdXJyZW50UGFnZSAtIDEpICogdGhpcy5jdXJyZW50UGFnZVNpemUgKyAxXG4gICAgfSxcblxuICAgIGxhc3QoKSB7XG4gICAgICByZXR1cm4gTWF0aC5taW4odGhpcy5maXJzdCArIHRoaXMuY3VycmVudFBhZ2VTaXplIC0gMSwgdGhpcy50b3RhbClcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICB0b3RhbDogJ3VwZGF0ZVBhZ2VSYW5nZScsXG4gICAgc2hvd1ByZXY6ICd1cGRhdGVQYWdlUmFuZ2UnLFxuICAgIHNob3dOZXh0OiAndXBkYXRlUGFnZVJhbmdlJyxcblxuICAgIHBhZ2UocGFnZSkge1xuICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IHBhZ2VcbiAgICB9LFxuXG4gICAgcGFnZVNpemUocGFnZVNpemUpIHtcbiAgICAgIHRoaXMuY3VycmVudFBhZ2VTaXplID0gcGFnZVNpemVcbiAgICB9LFxuXG4gICAgY3VycmVudFBhZ2VTaXplKGN1cnJlbnRQYWdlU2l6ZSkge1xuICAgICAgdGhpcy5udW1QYWdlcyA9IE1hdGguY2VpbCh0aGlzLnRvdGFsIC8gY3VycmVudFBhZ2VTaXplKVxuICAgICAgaWYgKHRoaXMuY3VycmVudFBhZ2UgPiB0aGlzLm51bVBhZ2VzKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSB0aGlzLm51bVBhZ2VzXG4gICAgICB9XG4gICAgICB0aGlzLnVwZGF0ZVBhZ2VSYW5nZSgpXG4gICAgfSxcblxuICAgIGN1cnJlbnRQYWdlKHRvLCBmcm9tKSB7XG4gICAgICBpZiAodG8gIT09IGZyb20pIHtcbiAgICAgICAgdGhpcy51cGRhdGVQYWdlUmFuZ2UoKVxuICAgICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6cGFnZScsIHRvKVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBjcmVhdGVkKCkge1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSB0aGlzLnBhZ2VcbiAgICB0aGlzLmN1cnJlbnRQYWdlU2l6ZSA9IHRoaXMucGFnZVNpemVcbiAgfSxcblxuICBtb3VudGVkKCkge1xuICAgIHRoaXMudXBkYXRlUGFnZVJhbmdlKClcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgb25DbGlja1BhZ2UocGFnZSkge1xuICAgICAgaWYgKHBhZ2UuaW5kZXggJiYgIXBhZ2UuZGlzYWJsZWQgJiYgcGFnZS5pbmRleCAhPT0gdGhpcy5jdXJyZW50UGFnZSkge1xuICAgICAgICB0aGlzLmN1cnJlbnRQYWdlID0gcGFnZS5pbmRleFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBnZXRQYWdlQ2xhc3MocGFnZSkge1xuICAgICAgY29uc3QgY2xhc3NlcyA9IHtcbiAgICAgICAgJ2RpdG8tc2VsZWN0ZWQnOiBwYWdlLmFjdGl2ZVxuICAgICAgfVxuICAgICAgaWYgKHBhZ2UudHlwZSkge1xuICAgICAgICBjbGFzc2VzW2BkaXRvLWJ1dHRvbi0ke3BhZ2UudHlwZX1gXSA9IHRydWVcbiAgICAgIH1cbiAgICAgIHJldHVybiBjbGFzc2VzXG4gICAgfSxcblxuICAgIHVwZGF0ZVBhZ2VSYW5nZSgpIHtcbiAgICAgIGNvbnN0IHsgc2hvd1ByZXYsIHNob3dOZXh0LCB0b3RhbCwgY3VycmVudFBhZ2VTaXplLCBjdXJyZW50UGFnZSB9ID0gdGhpc1xuICAgICAgY29uc3Qgc2hvd0xlbmd0aCA9IHNob3dQcmV2ICsgc2hvd05leHQgKyAxXG4gICAgICBjb25zdCBudW1QYWdlcyA9ICh0aGlzLm51bVBhZ2VzID0gTWF0aC5jZWlsKHRvdGFsIC8gY3VycmVudFBhZ2VTaXplKSlcblxuICAgICAgbGV0IHN0YXJ0ID0gMVxuICAgICAgbGV0IGVuZCA9IDFcbiAgICAgIGlmIChudW1QYWdlcyA8PSBzaG93TGVuZ3RoKSB7XG4gICAgICAgIGVuZCA9IG51bVBhZ2VzXG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRQYWdlIDw9IHNob3dQcmV2ICsgMSkge1xuICAgICAgICBlbmQgPSBzaG93TGVuZ3RoXG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRQYWdlID49IG51bVBhZ2VzIC0gc2hvd05leHQpIHtcbiAgICAgICAgZW5kID0gbnVtUGFnZXNcbiAgICAgICAgc3RhcnQgPSBudW1QYWdlcyAtIHNob3dMZW5ndGggKyAxXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGFydCA9IGN1cnJlbnRQYWdlIC0gc2hvd1ByZXZcbiAgICAgICAgZW5kID0gY3VycmVudFBhZ2UgKyBzaG93TmV4dFxuICAgICAgfVxuXG4gICAgICBjb25zdCBwYWdlUmFuZ2UgPSBbXVxuICAgICAgcGFnZVJhbmdlLnB1c2goe1xuICAgICAgICBpbmRleDogY3VycmVudFBhZ2UgLSAxLFxuICAgICAgICB0eXBlOiAncHJldicsXG4gICAgICAgIGRpc2FibGVkOiBjdXJyZW50UGFnZSA8PSAxXG4gICAgICB9KVxuICAgICAgaWYgKHN0YXJ0ID49IDIpIHtcbiAgICAgICAgcGFnZVJhbmdlLnB1c2goeyBpbmRleDogMSwgdGV4dDogMSB9KVxuICAgICAgfVxuICAgICAgaWYgKHN0YXJ0ID4gMikge1xuICAgICAgICBwYWdlUmFuZ2UucHVzaCh7XG4gICAgICAgICAgaW5kZXg6IE1hdGgubWF4KDEsIGN1cnJlbnRQYWdlIC0gMTApLFxuICAgICAgICAgIHR5cGU6ICdlbGxpcHNpcy1wcmV2J1xuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSsrKSB7XG4gICAgICAgIHBhZ2VSYW5nZS5wdXNoKHtcbiAgICAgICAgICBpbmRleDogaSxcbiAgICAgICAgICB0ZXh0OiBpLFxuICAgICAgICAgIGFjdGl2ZTogaSA9PT0gY3VycmVudFBhZ2VcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGlmIChlbmQgPCBudW1QYWdlcyAtIDEpIHtcbiAgICAgICAgcGFnZVJhbmdlLnB1c2goe1xuICAgICAgICAgIGluZGV4OiBNYXRoLm1pbihudW1QYWdlcywgY3VycmVudFBhZ2UgKyAxMCksXG4gICAgICAgICAgdHlwZTogJ2VsbGlwc2lzLW5leHQnXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBpZiAoZW5kIDw9IG51bVBhZ2VzIC0gMSkge1xuICAgICAgICBwYWdlUmFuZ2UucHVzaCh7IGluZGV4OiBudW1QYWdlcywgdGV4dDogbnVtUGFnZXMgfSlcbiAgICAgIH1cbiAgICAgIHBhZ2VSYW5nZS5wdXNoKHtcbiAgICAgICAgaW5kZXg6IGN1cnJlbnRQYWdlICsgMSxcbiAgICAgICAgdHlwZTogJ25leHQnLFxuICAgICAgICBkaXNhYmxlZDogY3VycmVudFBhZ2UgPj0gbnVtUGFnZXNcbiAgICAgIH0pXG5cbiAgICAgIHRoaXMucGFnZVJhbmdlID0gcGFnZVJhbmdlXG4gICAgfVxuICB9XG59XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1wYWdpbmF0aW9uIHtcbiAgZGlzcGxheTogZmxleDtcblxuICAuZGl0by1wYWdpbmF0aW9uLXRvdGFsIHtcbiAgICBAaW5jbHVkZSBlbGxpcHNpcztcblxuICAgIG1hcmdpbjogMCAwLjVlbTtcbiAgICBsaW5lLWhlaWdodDogJGlucHV0LWhlaWdodDtcbiAgfVxuXG4gIC5kaXRvLWJ1dHRvbiB7XG4gICAgdHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZSwgY29sb3IgMHMsIGJhY2tncm91bmQgMHMsIGJvcmRlciAwcztcbiAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zO1xuICAgIHBhZGRpbmc6IDAgMC41ZW07XG5cbiAgICAmLXByZXYsXG4gICAgJi1uZXh0IHtcbiAgICAgICY6OmJlZm9yZSB7XG4gICAgICAgIEBleHRlbmQgJWljb24tYXJyb3c7XG4gICAgICB9XG4gICAgfVxuXG4gICAgJi1wcmV2OjpiZWZvcmUge1xuICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoLTEpO1xuICAgIH1cblxuICAgICYtZWxsaXBzaXMtcHJldixcbiAgICAmLWVsbGlwc2lzLW5leHQge1xuICAgICAgJjo6YmVmb3JlIHtcbiAgICAgICAgQGV4dGVuZCAlaWNvbi1lbGxpcHNpcztcbiAgICAgIH1cblxuICAgICAgJjpob3Zlcjo6YmVmb3JlIHtcbiAgICAgICAgQGV4dGVuZCAlaWNvbi1jaGV2cm9ucztcbiAgICAgIH1cblxuICAgICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAgIGJvcmRlcjogMDtcbiAgICAgIHBhZGRpbmc6IDA7XG4gICAgICBtYXJnaW46IDA7XG4gICAgICBjb2xvcjogJGNvbG9yLXRleHQ7XG5cbiAgICAgICY6Zm9jdXMge1xuICAgICAgICBjb2xvcjogJGNvbG9yLWFjdGl2ZTtcbiAgICAgIH1cblxuICAgICAgJjphY3RpdmUge1xuICAgICAgICBib3gtc2hhZG93OiBub25lO1xuICAgICAgfVxuICAgIH1cblxuICAgICYtZWxsaXBzaXMtcHJldjo6YmVmb3JlIHtcbiAgICAgIHRyYW5zZm9ybTogc2NhbGVYKC0xKTtcbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tc3dpdGNoKFxuICA6Y2xhc3M9XCJjbGFzc2VzXCJcbiAgOnN0eWxlPVwic3R5bGVzXCJcbilcbiAgLmRpdG8tc3dpdGNoLXBhbmVcbiAgICBpbnB1dChcbiAgICAgIDppZD1cImlkXCJcbiAgICAgIHJlZj1cImlucHV0XCJcbiAgICAgIHYtYmluZD1cIiRhdHRyc1wiXG4gICAgICB2LW1vZGVsPVwiY2hlY2tlZFwiXG4gICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgOm5hbWU9XCJuYW1lXCJcbiAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICApXG4gICAgLmRpdG8tc3dpdGNoLWJ1dHRvblxuICAgIHNwYW4uZGl0by1zd2l0Y2gtbGFiZWwoXG4gICAgICB2LWlmPVwibGFiZWxzXCJcbiAgICApXG4gICAgICBzbG90KFxuICAgICAgICB2LWlmPVwiY2hlY2tlZFwiXG4gICAgICAgIG5hbWU9XCJjaGVja2VkXCJcbiAgICAgICkge3sgbGFiZWxzLmNoZWNrZWQgfHwgJ29uJyB9fVxuICAgICAgc2xvdChcbiAgICAgICAgdi1lbHNlXG4gICAgICAgIG5hbWU9XCJ1bmNoZWNrZWRcIlxuICAgICAgKSB7eyBsYWJlbHMudW5jaGVja2VkIHx8ICdvZmYnIH19XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuZXhwb3J0IGRlZmF1bHQge1xuICBlbWl0czogWyd1cGRhdGU6bW9kZWxWYWx1ZScsICdjaGFuZ2UnXSxcblxuICBwcm9wczoge1xuICAgIG1vZGVsVmFsdWU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBpZDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBuYW1lOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgbGFiZWxzOiB7IHR5cGU6IFtPYmplY3QsIEJvb2xlYW5dLCBkZWZhdWx0OiBmYWxzZSB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY2hlY2tlZDogdGhpcy5tb2RlbFZhbHVlXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgY2xhc3NlcygpIHtcbiAgICAgIGNvbnN0IHsgY2hlY2tlZCwgZGlzYWJsZWQgfSA9IHRoaXNcbiAgICAgIHJldHVybiB7XG4gICAgICAgICdkaXRvLWNoZWNrZWQnOiBjaGVja2VkLFxuICAgICAgICAnZGl0by1kaXNhYmxlZCc6IGRpc2FibGVkXG4gICAgICB9XG4gICAgfSxcblxuICAgIHN0eWxlcygpIHtcbiAgICAgIGNvbnN0IHsgbGFiZWxzOiB7IGNoZWNrZWQsIHVuY2hlY2tlZCB9ID0ge30gfSA9IHRoaXNcbiAgICAgIC8vIENhbGN1bGF0ZSBgLS1zd2l0Y2gtd2lkdGhgIGluIGByZW1gLCBiYXNlZCBvbiBsYWJlbCBsZW5ndGguXG4gICAgICBjb25zdCBsZW5ndGggPSBNYXRoLm1heCgwLCBjaGVja2VkPy5sZW5ndGgsIHVuY2hlY2tlZD8ubGVuZ3RoKVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJy0tc3dpdGNoLXdpZHRoJzogbGVuZ3RoID8gYCR7bGVuZ3RoICogMS41fXJlbWAgOiBudWxsXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgbW9kZWxWYWx1ZShtb2RlbFZhbHVlKSB7XG4gICAgICB0aGlzLmNoZWNrZWQgPSBtb2RlbFZhbHVlXG4gICAgfSxcblxuICAgIGNoZWNrZWQoY2hlY2tlZCkge1xuICAgICAgaWYgKGNoZWNrZWQgIT09IHRoaXMubW9kZWxWYWx1ZSkge1xuICAgICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6bW9kZWxWYWx1ZScsIGNoZWNrZWQpXG4gICAgICAgIHRoaXMuJGVtaXQoJ2NoYW5nZScsIGNoZWNrZWQpXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBmb2N1cygpIHtcbiAgICAgIHRoaXMuJHJlZnMuaW5wdXQuZm9jdXMoKVxuICAgIH1cbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tc3dpdGNoIHtcbiAgLy8gVXNlIHdob2xlIG11bHRpcGxlcyBvZiBgcmVtYCBmb3Igc2l6ZXMgYW5kIGBweGAgbWFyZ2lucy9wYWRkaW5nIGFsb25nXG4gIC8vIHdpdGggYGNhbGMoKWAgdG8gZW5kIHVwIHdpdGggZXZlbiBwaXhlbCBzaXplcy4gYHJlbWAgaXMgbmVlZGVkIGJlY2F1c2Ugd2VcbiAgLy8gY2hhbmdlIGBmb250LXNpemVgIGluc2lkZSBgLmRpdG8tc3dpdGNoLWJ1dHRvbmBcbiAgLS1zd2l0Y2gtd2lkdGg6IDRyZW07XG4gIC0tc3dpdGNoLWhlaWdodDogMnJlbTtcbiAgLS1zd2l0Y2gtbWFyZ2luOiAycHg7XG4gIC0tc3dpdGNoLXBhZGRpbmc6IDNweDtcbiAgLS1zd2l0Y2gtc3BlZWQ6IDMwMG1zO1xuICAtLWxhYmVsLW1hcmdpbjogMC41ZW07XG4gIC0td2lkdGg6IGNhbGModmFyKC0tc3dpdGNoLXdpZHRoKSAtIDIgKiB2YXIoLS1zd2l0Y2gtbWFyZ2luKSk7XG4gIC0taGVpZ2h0OiBjYWxjKHZhcigtLXN3aXRjaC1oZWlnaHQpIC0gMiAqIHZhcigtLXN3aXRjaC1tYXJnaW4pKTtcbiAgLS1vZmZzZXQ6IGNhbGModmFyKC0td2lkdGgpIC0gdmFyKC0taGVpZ2h0KSk7XG5cbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGhlaWdodDogdmFyKC0tc3dpdGNoLWhlaWdodCk7XG4gIC8vIFRvIG1ha2UgaW5saW5lIGxhYmVscyBhcHBlYXIgb24gY29uc2lzdGVudCBiYXNlbGluZTpcbiAgdmVydGljYWwtYWxpZ246IGJvdHRvbTtcbiAgQGluY2x1ZGUgdXNlci1zZWxlY3Qobm9uZSk7XG5cbiAgLmRpdG8tc3dpdGNoLXBhbmUge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB3aWR0aDogdmFyKC0td2lkdGgpO1xuICAgIGhlaWdodDogdmFyKC0taGVpZ2h0KTtcbiAgfVxuXG4gIC5kaXRvLXN3aXRjaC1wYW5lLFxuICAuZGl0by1zd2l0Y2gtbGFiZWwge1xuICAgIHRvcDogNTAlO1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbiAgfVxuXG4gIGlucHV0IHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgYXBwZWFyYW5jZTogbm9uZTtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgYm9yZGVyLXJhZGl1czogMWVtO1xuICAgIGJhY2tncm91bmQ6ICRjb2xvci1saWdodDtcbiAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMC4zcywgYmFja2dyb3VuZC1jb2xvciAwLjNzO1xuICB9XG5cbiAgLmRpdG8tc3dpdGNoLWJ1dHRvbiB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIC8vIFNldCBmb250LXNpemUgdG8gaGVpZ2h0LCBzbyB3ZSBjYW4gdXNlIHdpZHRoL2hlaWdodCA9IDFlbSBmb3IgY2lyY2xlOlxuICAgIGZvbnQtc2l6ZTogY2FsYyh2YXIoLS1oZWlnaHQpIC0gMiAqIHZhcigtLXN3aXRjaC1wYWRkaW5nKSk7XG4gICAgdG9wOiB2YXIoLS1zd2l0Y2gtcGFkZGluZyk7XG4gICAgbGVmdDogdmFyKC0tc3dpdGNoLXBhZGRpbmcpO1xuICAgIHdpZHRoOiAxZW07XG4gICAgaGVpZ2h0OiAxZW07XG4gICAgYm9yZGVyLXJhZGl1czogMC41ZW07XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBiYWNrZ3JvdW5kOiAkY29sb3Itd2hpdGU7XG4gICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIHZhcigtLXN3aXRjaC1zcGVlZCk7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApO1xuICB9XG5cbiAgLmRpdG8tc3dpdGNoLWJ1dHRvbixcbiAgLmRpdG8tc3dpdGNoLWxhYmVsIHtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgfVxuXG4gIC5kaXRvLXN3aXRjaC1sYWJlbCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHJpZ2h0OiB2YXIoLS1sYWJlbC1tYXJnaW4pO1xuICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gICAgY29sb3I6ICRjb2xvci13aGl0ZTtcbiAgfVxuXG4gICYuZGl0by1jaGVja2VkIHtcbiAgICBpbnB1dCB7XG4gICAgICBiYWNrZ3JvdW5kOiAkY29sb3ItYWN0aXZlO1xuICAgIH1cblxuICAgIC5kaXRvLXN3aXRjaC1idXR0b24ge1xuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKHZhcigtLW9mZnNldCkpO1xuICAgIH1cblxuICAgIC5kaXRvLXN3aXRjaC1sYWJlbCB7XG4gICAgICBsZWZ0OiB2YXIoLS1sYWJlbC1tYXJnaW4pO1xuICAgICAgcmlnaHQ6IHVuc2V0O1xuICAgIH1cbiAgfVxuXG4gICYuZGl0by1kaXNhYmxlZCB7XG4gICAgQGV4dGVuZCAlYnV0dG9uLWRpc2FibGVkO1xuICB9XG5cbiAgJjpmb2N1cy13aXRoaW46bm90KDpob3Zlcikge1xuICAgIC5kaXRvLXN3aXRjaC1idXR0b24ge1xuICAgICAgYm94LXNoYWRvdzogJHNoYWRvdy1mb2N1cztcbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8c2NyaXB0PlxuaW1wb3J0IHsgaCBhcyBjcmVhdGVFbGVtZW50LCBUcmFuc2l0aW9uIH0gZnJvbSAndnVlJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZnVuY3Rpb24gVHJhbnNpdGlvbkhlaWdodCh7IGVuYWJsZWQgfSwgeyBzbG90cyB9KSB7XG4gIHJldHVybiBlbmFibGVkXG4gICAgPyBjcmVhdGVFbGVtZW50KFRyYW5zaXRpb24sIHByb3BzLCBzbG90cylcbiAgICA6IHNsb3RzLmRlZmF1bHQoKVxufVxuXG5UcmFuc2l0aW9uSGVpZ2h0LnByb3BzID0ge1xuICBlbmFibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWUgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBUcmFuc2l0aW9uSGVpZ2h0XG5cbmNvbnN0IHNldFN0eWxlID0gKGVsZW1lbnQsIHN0eWxlKSA9PiBPYmplY3QuYXNzaWduKGVsZW1lbnQuc3R5bGUsIHN0eWxlKVxuXG4vLyBGb3JjZSByZXBhaW50IHRvIG1ha2Ugc3VyZSB0aGUgYW5pbWF0aW9uIGlzIHRyaWdnZXJlZCBjb3JyZWN0bHkuXG5jb25zdCBmb3JjZVJlcGFpbnQgPSBlbGVtZW50ID0+IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkuaGVpZ2h0XG5cbmNvbnN0IHByb3BzID0ge1xuICBuYW1lOiAnaGVpZ2h0JyxcblxuICBvbkFmdGVyRW50ZXIoZWxlbWVudCkge1xuICAgIC8vIEEgdGltZW91dCBiZWZvcmUgc2V0dGluZyBzdHlsZSBpcyBvbmx5IHJlYWxseSBuZWVkZWQgYWZ0ZXIgY2FsbHMgdG9cbiAgICAvLyBgZm9yY2VSZXBhaW50KClgLCBidXQgdXNpbmcgb25lIGhlcmUgdG9vIHByZXNlcnZlcyBleGVjdXRpb24gc2VxdWVuY2Ugc29cbiAgICAvLyB0aGF0IHRoZSBjYWxsIGZyb20gYGVudGVyKClgIGNhbiBuZXZlciBvdXRydW4gdGhlIG9uZSBmcm9tIGBhZnRlckVudGVyKClgXG4gICAgc2V0VGltZW91dCgoKSA9PiBzZXRTdHlsZShlbGVtZW50LCB7IGhlaWdodDogJ2F1dG8nIH0pKVxuICB9LFxuXG4gIG9uRW50ZXIoZWxlbWVudCkge1xuICAgIGNvbnN0IHsgd2lkdGggfSA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudClcbiAgICBzZXRTdHlsZShlbGVtZW50LCB7XG4gICAgICB3aWR0aCxcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgdmlzaWJpbGl0eTogJ2hpZGRlbicsXG4gICAgICBoZWlnaHQ6ICdhdXRvJ1xuICAgIH0pXG4gICAgY29uc3QgeyBoZWlnaHQgfSA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudClcbiAgICBzZXRTdHlsZShlbGVtZW50LCB7XG4gICAgICB3aWR0aDogbnVsbCxcbiAgICAgIHBvc2l0aW9uOiBudWxsLFxuICAgICAgdmlzaWJpbGl0eTogbnVsbCxcbiAgICAgIGhlaWdodDogMFxuICAgIH0pXG4gICAgZm9yY2VSZXBhaW50KGVsZW1lbnQpXG4gICAgc2V0VGltZW91dCgoKSA9PiBzZXRTdHlsZShlbGVtZW50LCB7IGhlaWdodCB9KSlcbiAgfSxcblxuICBvbkxlYXZlKGVsZW1lbnQpIHtcbiAgICBjb25zdCB7IGhlaWdodCB9ID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KVxuICAgIHNldFN0eWxlKGVsZW1lbnQsIHsgaGVpZ2h0IH0pXG4gICAgZm9yY2VSZXBhaW50KGVsZW1lbnQpXG4gICAgc2V0VGltZW91dCgoKSA9PiBzZXRTdHlsZShlbGVtZW50LCB7IGhlaWdodDogMCB9KSlcbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuJGR1cmF0aW9uOiAwLjE1cztcblxuLmhlaWdodC1lbnRlci1hY3RpdmUsXG4uaGVpZ2h0LWxlYXZlLWFjdGl2ZSB7XG4gIHRyYW5zaXRpb246IGhlaWdodCAkZHVyYXRpb24gJGVhc2Utb3V0LXF1YXJ0O1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4uaGVpZ2h0LWVudGVyLWFjdGl2ZSB7XG4gIGFuaW1hdGlvbjogc2xpZGUtZW50ZXIgJGR1cmF0aW9uICRlYXNlLW91dC1xdWFydDtcbn1cblxuLmhlaWdodC1sZWF2ZS1hY3RpdmUge1xuICBhbmltYXRpb246IHNsaWRlLWxlYXZlICRkdXJhdGlvbiAkZWFzZS1vdXQtcXVhcnQ7XG59XG5cbi5oZWlnaHQtZW50ZXItZnJvbSxcbi5oZWlnaHQtbGVhdmUtdG8ge1xuICBoZWlnaHQ6IDA7XG59XG48L3N0eWxlPlxuIiwiaW1wb3J0IHsgZGVmaW5lQ29tcG9uZW50LCByZWYsIHdhdGNoLCBvblNjb3BlRGlzcG9zZSwgaCB9IGZyb20gJ3Z1ZS1kZW1pJztcbmltcG9ydCB7IGNyZWF0ZUZvY3VzVHJhcCB9IGZyb20gJ2ZvY3VzLXRyYXAnO1xuaW1wb3J0IHsgdW5yZWZFbGVtZW50IH0gZnJvbSAnQHZ1ZXVzZS9jb3JlJztcblxuY29uc3QgVXNlRm9jdXNUcmFwID0gLyogQF9fUFVSRV9fICovIC8qICNfX1BVUkVfXyAqLyBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIlVzZUZvY3VzVHJhcFwiLFxuICBwcm9wczogW1wiYXNcIiwgXCJvcHRpb25zXCJdLFxuICBzZXR1cChwcm9wcywgeyBzbG90cyB9KSB7XG4gICAgbGV0IHRyYXA7XG4gICAgY29uc3QgdGFyZ2V0ID0gcmVmKCk7XG4gICAgY29uc3QgYWN0aXZhdGUgPSAoKSA9PiB0cmFwICYmIHRyYXAuYWN0aXZhdGUoKTtcbiAgICBjb25zdCBkZWFjdGl2YXRlID0gKCkgPT4gdHJhcCAmJiB0cmFwLmRlYWN0aXZhdGUoKTtcbiAgICB3YXRjaChcbiAgICAgICgpID0+IHVucmVmRWxlbWVudCh0YXJnZXQpLFxuICAgICAgKGVsKSA9PiB7XG4gICAgICAgIGlmICghZWwpXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0cmFwID0gY3JlYXRlRm9jdXNUcmFwKGVsLCBwcm9wcy5vcHRpb25zIHx8IHt9KTtcbiAgICAgICAgYWN0aXZhdGUoKTtcbiAgICAgIH0sXG4gICAgICB7IGZsdXNoOiBcInBvc3RcIiB9XG4gICAgKTtcbiAgICBvblNjb3BlRGlzcG9zZSgoKSA9PiBkZWFjdGl2YXRlKCkpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBpZiAoc2xvdHMuZGVmYXVsdClcbiAgICAgICAgcmV0dXJuIGgocHJvcHMuYXMgfHwgXCJkaXZcIiwgeyByZWY6IHRhcmdldCB9LCBzbG90cy5kZWZhdWx0KCkpO1xuICAgIH07XG4gIH1cbn0pO1xuXG5leHBvcnQgeyBVc2VGb2N1c1RyYXAgfTtcbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1kaWFsb2coXG4gIHJlZj1cImRpYWxvZ1wiXG4gIHJvbGU9XCJkaWFsb2dcIlxuICBhcmlhLWV4cGFuZGVkPVwidHJ1ZVwiXG4gIGFyaWEtbW9kYWw9XCJ0cnVlXCJcbiAgOnN0eWxlPVwieyAnLS13aWR0aCc6IGAke3NldHRpbmdzLndpZHRofXB4YCB9XCJcbiAgQG1vdXNldXA9XCJvbk1vdXNlVXBcIlxuKVxuICBVc2VGb2N1c1RyYXAuZGl0by1kaWFsb2dfX2ZvY3VzLXRyYXAoXG4gICAgOm9wdGlvbnM9XCJ7IGltbWVkaWF0ZTogdHJ1ZSwgZmFsbGJhY2tGb2N1czogKCkgPT4gJHJlZnMuZGlhbG9nIH1cIlxuICApXG4gICAgZm9ybS5kaXRvLXNjcm9sbC1wYXJlbnQoXG4gICAgICBAc3VibWl0LnByZXZlbnQ9XCJzdWJtaXRcIlxuICAgIClcbiAgICAgIERpdG9TY2hlbWEuZGl0by1zY3JvbGwoXG4gICAgICAgIDpzY2hlbWE9XCJzY2hlbWFcIlxuICAgICAgICA6ZGF0YT1cImRpYWxvZ0RhdGFcIlxuICAgICAgKVxuICAgICAgICB0ZW1wbGF0ZSgjYnV0dG9ucylcbiAgICAgICAgICBEaXRvQnV0dG9ucy5kaXRvLWJ1dHRvbnMtbGFyZ2UoXG4gICAgICAgICAgICA6YnV0dG9ucz1cImJ1dHRvblNjaGVtYXNcIlxuICAgICAgICAgICAgOmRhdGE9XCJkaWFsb2dEYXRhXCJcbiAgICAgICAgICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IHsgY2xvbmUgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IHsgYWRkRXZlbnRzIH0gZnJvbSAnQGRpdG9qcy91aS9zcmMnXG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuaW1wb3J0IHsgZ2V0QnV0dG9uU2NoZW1hcyB9IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcbmltcG9ydCB7IFVzZUZvY3VzVHJhcCB9IGZyb20gJ0B2dWV1c2UvaW50ZWdyYXRpb25zL3VzZUZvY3VzVHJhcC9jb21wb25lbnQnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b0RpYWxvZycsIHtcbiAgY29tcG9uZW50czogeyBVc2VGb2N1c1RyYXAgfSxcbiAgZW1pdHM6IFsncmVtb3ZlJ10sXG5cbiAgcHJvdmlkZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJGRpYWxvZ0NvbXBvbmVudDogKCkgPT4gdGhpc1xuICAgIH1cbiAgfSxcblxuICBwcm9wczoge1xuICAgIGNvbXBvbmVudHM6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGJ1dHRvbnM6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHByb21pc2U6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGRhdGE6IHsgdHlwZTogT2JqZWN0LCBkZWZhdWx0OiAoKSA9PiAoe30pIH0sXG4gICAgc2V0dGluZ3M6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQ6ICgpID0+ICh7XG4gICAgICAgIHdpZHRoOiA0ODAsXG4gICAgICAgIGNsaWNrVG9DbG9zZTogZmFsc2VcbiAgICAgIH0pXG4gICAgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgLy8gTWFrZSBzdXJlIGRpYWxvZyBkYXRhIGNvbnRhaW5zIGFsbCB0aGUgZXhwZWN0ZWQga2V5c1xuICAgIGNvbnN0IGRpYWxvZ0RhdGEgPSBjbG9uZSh0aGlzLmRhdGEpXG4gICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5jb21wb25lbnRzKSB7XG4gICAgICBpZiAoIShrZXkgaW4gZGlhbG9nRGF0YSkpIHtcbiAgICAgICAgZGlhbG9nRGF0YVtrZXldID0gbnVsbFxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgd2luZG93RXZlbnRzOiBudWxsLFxuICAgICAgZGlhbG9nRGF0YVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGRpYWxvZ0NvbXBvbmVudCgpIHtcbiAgICAgIHJldHVybiB0aGlzXG4gICAgfSxcblxuICAgIHNjaGVtYSgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbXBvbmVudHM6IHRoaXMuY29tcG9uZW50c1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBidXR0b25TY2hlbWFzKCkge1xuICAgICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoZ2V0QnV0dG9uU2NoZW1hcyh0aGlzLmJ1dHRvbnMpKS5tYXAoXG4gICAgICAgICAgLy8gUHJvY2VzcyB0aGUgYnV0dG9uIHNjaGVtYXMgdG8gYWRkIGRlZmF1bHQgY2xpY2sgZXZlbnRzXG4gICAgICAgICAgLy8gZm9yIGJvdGggJ3N1Ym1pdCcgYW5kICdjYW5jZWwnIGJ1dHRvbnM6XG4gICAgICAgICAgKFtrZXksIHNjaGVtYV0pID0+IHtcbiAgICAgICAgICAgIGlmIChrZXkgPT09ICdjYW5jZWwnICYmICFzY2hlbWEuZXZlbnRzKSB7XG4gICAgICAgICAgICAgIHNjaGVtYSA9IHtcbiAgICAgICAgICAgICAgICAuLi5zY2hlbWEsXG4gICAgICAgICAgICAgICAgZXZlbnRzOiB7XG4gICAgICAgICAgICAgICAgICBjbGljazogKCkgPT4gdGhpcy5jYW5jZWwoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFtrZXksIHNjaGVtYV1cbiAgICAgICAgICB9XG4gICAgICAgIClcbiAgICAgIClcbiAgICB9LFxuXG4gICAgaGFzQnV0dG9ucygpIHtcbiAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmJ1dHRvblNjaGVtYXMpLmxlbmd0aCA+IDBcbiAgICB9LFxuXG4gICAgaGFzQ2FuY2VsKCkge1xuICAgICAgcmV0dXJuICEhdGhpcy5idXR0b25TY2hlbWFzLmNhbmNlbFxuICAgIH1cbiAgfSxcblxuICBtb3VudGVkKCkge1xuICAgIHRoaXMud2luZG93RXZlbnRzID0gYWRkRXZlbnRzKHdpbmRvdywge1xuICAgICAga2V5dXA6IGV2ZW50ID0+IHtcbiAgICAgICAgaWYgKCh0aGlzLmhhc0NhbmNlbCB8fCAhdGhpcy5oYXNCdXR0b25zKSAmJiBldmVudC5rZXlDb2RlID09PSAyNykge1xuICAgICAgICAgIHRoaXMuY2FuY2VsKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH0sXG5cbiAgdW5tb3VudGVkKCkge1xuICAgIHRoaXMud2luZG93RXZlbnRzLnJlbW92ZSgpXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIHJlbW92ZSgpIHtcbiAgICAgIHRoaXMuJGVtaXQoJ3JlbW92ZScpXG4gICAgfSxcblxuICAgIHJlc29sdmUodmFsdWUpIHtcbiAgICAgIHRoaXMucHJvbWlzZS5yZXNvbHZlKHZhbHVlKVxuICAgICAgdGhpcy5yZW1vdmUoKVxuICAgIH0sXG5cbiAgICByZWplY3QodmFsdWUpIHtcbiAgICAgIHRoaXMucHJvbWlzZS5yZWplY3QodmFsdWUpXG4gICAgICB0aGlzLnJlbW92ZSgpXG4gICAgfSxcblxuICAgIHN1Ym1pdCgpIHtcbiAgICAgIHRoaXMucmVzb2x2ZSh0aGlzLmRpYWxvZ0RhdGEpXG4gICAgfSxcblxuICAgIGNhbmNlbCgpIHtcbiAgICAgIHRoaXMucmVzb2x2ZShudWxsKVxuICAgIH0sXG5cbiAgICBjbG9zZSgpIHtcbiAgICAgIHRoaXMuY2FuY2VsKClcbiAgICB9LFxuXG4gICAgb25Nb3VzZVVwKCkge1xuICAgICAgaWYgKHRoaXMuc2V0dGluZ3MuY2xpY2tUb0Nsb3NlKSB7XG4gICAgICAgIHRoaXMuY2xvc2UoKVxuICAgICAgfVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLWRpYWxvZyB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgZGlzcGxheTogZmxleDtcbiAgaW5zZXQ6IDA7XG4gIHotaW5kZXg6IDIwMDA7XG4gIHBhZGRpbmc6ICRjb250ZW50LXBhZGRpbmc7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAvLyBQcmV2ZW50IHNjcm9sbGluZyBvZiB0aGUgcGFnZSBiZWhpbmQgdGhlIGRpYWxvZzpcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjIpO1xuXG4gICZfX2ZvY3VzLXRyYXAge1xuICAgIG1heC1oZWlnaHQ6IDEwMCU7XG4gIH1cblxuICAvLyBUT0RPOiBgJl9faW5uZXJgXG4gIGZvcm0ge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgYmFja2dyb3VuZDogd2hpdGU7XG4gICAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG4gICAgbWF4LXdpZHRoOiB2YXIoLS13aWR0aCwgNDgwcHgpO1xuICAgIG1heC1oZWlnaHQ6IDEwMCU7XG4gICAgYm94LXNoYWRvdzogMCAyMHB4IDYwcHggLTJweCByZ2JhKDI3LCAzMywgNTgsIDAuNCk7XG4gIH1cbn1cblxuLmRpdG8tZGlhbG9nLWVudGVyLWFjdGl2ZSxcbi5kaXRvLWRpYWxvZy1sZWF2ZS1hY3RpdmUge1xuICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMTVzO1xuXG4gIGZvcm0ge1xuICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjI1cztcbiAgfVxufVxuXG4uZGl0by1kaWFsb2ctZW50ZXItZnJvbSxcbi5kaXRvLWRpYWxvZy1sZWF2ZS10byB7XG4gIG9wYWNpdHk6IDA7XG5cbiAgZm9ybSB7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0yMHB4KTtcbiAgfVxufVxuPC9zdHlsZT5cbiIsImltcG9ydCB7IGlzT2JqZWN0IH0gZnJvbSAnQGRpdG9qcy91dGlscydcbmltcG9ydCB7IGFkZEV2ZW50cyB9IGZyb20gJ0BkaXRvanMvdWkvc3JjJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQge1xuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBkb21IYW5kbGVyczogW11cbiAgICB9XG4gIH0sXG5cbiAgdW5tb3VudGVkKCkge1xuICAgIGZvciAoY29uc3QgeyByZW1vdmUgfSBvZiB0aGlzLmRvbUhhbmRsZXJzKSB7XG4gICAgICByZW1vdmUoKVxuICAgIH1cbiAgICB0aGlzLmRvbUhhbmRsZXJzID0gW11cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZG9tT24oZWxlbWVudCwgdHlwZSwgaGFuZGxlcikge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYWRkRXZlbnRzKFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICBpc09iamVjdCh0eXBlKSA/IHR5cGUgOiB7IFt0eXBlXTogaGFuZGxlciB9XG4gICAgICApXG4gICAgICB0aGlzLmRvbUhhbmRsZXJzLnB1c2gocmVzdWx0KVxuICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cbiAgfVxufVxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLXJvb3RcbiAgVnVlTm90aWZpY2F0aW9ucy5kaXRvLW5vdGlmaWNhdGlvbnMoXG4gICAgcmVmPVwibm90aWZpY2F0aW9uc1wiXG4gICAgcG9zaXRpb249XCJ0b3AgcmlnaHRcIlxuICAgIGNsYXNzZXM9XCJkaXRvLW5vdGlmaWNhdGlvblwiXG4gIClcbiAgVHJhbnNpdGlvbkdyb3VwKG5hbWU9XCJkaXRvLWRpYWxvZ1wiKVxuICAgIERpdG9EaWFsb2coXG4gICAgICB2LWZvcj1cIihkaWFsb2csIGtleSkgaW4gZGlhbG9nc1wiXG4gICAgICA6a2V5PVwia2V5XCJcbiAgICAgIDpjb21wb25lbnRzPVwiZGlhbG9nLmNvbXBvbmVudHNcIlxuICAgICAgOmJ1dHRvbnM9XCJkaWFsb2cuYnV0dG9uc1wiXG4gICAgICA6cHJvbWlzZT1cImRpYWxvZy5wcm9taXNlXCJcbiAgICAgIDpkYXRhPVwiZGlhbG9nLmRhdGFcIlxuICAgICAgOnNldHRpbmdzPVwiZGlhbG9nLnNldHRpbmdzXCJcbiAgICAgIEByZW1vdmU9XCJyZW1vdmVEaWFsb2coa2V5KVwiXG4gICAgKVxuICBEaXRvTWVudVxuICBtYWluLmRpdG8tcGFnZS5kaXRvLXNjcm9sbC1wYXJlbnRcbiAgICBEaXRvSGVhZGVyKFxuICAgICAgOnNwaW5uZXI9XCJvcHRpb25zLnNwaW5uZXJcIlxuICAgICAgOmlzTG9hZGluZz1cImlzTG9hZGluZ1wiXG4gICAgKVxuICAgICAgRGl0b0FjY291bnQoXG4gICAgICAgIHYtaWY9XCJ1c2VyXCJcbiAgICAgIClcbiAgICAgIGEuZGl0by1sb2dpbihcbiAgICAgICAgdi1lbHNlLWlmPVwiYWxsb3dMb2dpblwiXG4gICAgICAgIEBjbGljaz1cInJvb3RDb21wb25lbnQubG9naW4oKVwiXG4gICAgICApXG4gICAgICAgIHNwYW4gTG9naW5cbiAgICBSb3V0ZXJWaWV3XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IHsgYXNBcnJheSwgbWFwQ29uY3VycmVudGx5LCBzdHJpcFRhZ3MgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCBEaXRvVXNlciBmcm9tICcuLi9EaXRvVXNlci5qcydcbmltcG9ydCBEaXRvVmlldyBmcm9tICcuLi9jb21wb25lbnRzL0RpdG9WaWV3LnZ1ZSdcbmltcG9ydCBEaXRvRGlhbG9nIGZyb20gJy4vRGl0b0RpYWxvZy52dWUnXG5pbXBvcnQgRG9tTWl4aW4gZnJvbSAnLi4vbWl4aW5zL0RvbU1peGluLmpzJ1xuaW1wb3J0IHtcbiAgcHJvY2Vzc1ZpZXcsXG4gIHJlc29sdmVTY2hlbWFzLFxuICBwcm9jZXNzU2NoZW1hQ29tcG9uZW50c1xufSBmcm9tICcuLi91dGlscy9zY2hlbWEuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b1Jvb3QnLCB7XG4gIG1peGluczogW0RvbU1peGluXSxcbiAgY29tcG9uZW50czogeyBEaXRvRGlhbG9nIH0sXG5cbiAgcHJvdmlkZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJHZpZXdzOiAoKSA9PiB0aGlzLnJlc29sdmVkVmlld3NcbiAgICB9XG4gIH0sXG5cbiAgcHJvcHM6IHtcbiAgICB1bnJlc29sdmVkVmlld3M6IHsgdHlwZTogW09iamVjdCwgRnVuY3Rpb24sIFByb21pc2VdLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIG9wdGlvbnM6IHsgdHlwZTogT2JqZWN0LCBkZWZhdWx0OiAoKSA9PiAoe30pIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICByZXNvbHZlZFZpZXdzOiB7fSxcbiAgICAgIHJlbW92ZVJvdXRlczogbnVsbCxcbiAgICAgIGRpYWxvZ3M6IHt9LFxuICAgICAgYWxsb3dMb2dpbjogZmFsc2UsXG4gICAgICBsb2FkaW5nQ291bnQ6IDBcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBub3RpZmljYXRpb25zKCkge1xuICAgICAgcmV0dXJuIHRoaXMuJHJlZnMubm90aWZpY2F0aW9uc1xuICAgIH0sXG5cbiAgICBpc0xvYWRpbmcoKSB7XG4gICAgICByZXR1cm4gdGhpcy5sb2FkaW5nQ291bnQgPiAwXG4gICAgfVxuICB9LFxuXG4gIGNyZWF0ZWQoKSB7XG4gICAgdGhpcy5hcHBTdGF0ZS50aXRsZSA9IGRvY3VtZW50LnRpdGxlIHx8ICdEaXRvLmpzIEFkbWluJ1xuICAgIC8vIFdpdGggaG90LXJlbG9hZGluZywgaXQgbG9va3MgbGlrZSBkZXN0cm95ZWQgaG9va3MgYXJlbid0IGFsd2F5cyBjYWxsZWRcbiAgICAvLyBmb3Igcm91dGUgY29tcG9uZW50cyBzbyByZXNldCB0aGUgYXJyYXkgb2YgcmVnaXN0ZXJlZCBjb21wb25lbnRzIGluc3RlYWQuXG4gICAgdGhpcy5hcHBTdGF0ZS5yb3V0ZUNvbXBvbmVudHMgPSBbXVxuICB9LFxuXG4gIGFzeW5jIG1vdW50ZWQoKSB7XG4gICAgLy8gQ2xlYXIgdGhlIGxhYmVsIG1hcmtlZCBhcyBhY3RpdmUgb24gYWxsIG1vdXNlIGFuZCBrZXlib2FyZCBldmVudHMsIGV4Y2VwdFxuICAgIC8vIHRoZSBvbmVzIHRoYXQgRGl0b0xhYmVsIGl0c2VsZiBpbnRlcmNlcHRzLlxuICAgIHRoaXMuZG9tT24oZG9jdW1lbnQsIHtcbiAgICAgIGNsaWNrOiBldmVudCA9PiB7XG4gICAgICAgIGlmICghZXZlbnQudGFyZ2V0LmNsb3Nlc3QoJy5kaXRvLWxhYmVsJykpIHtcbiAgICAgICAgICB0aGlzLmFwcFN0YXRlLmFjdGl2ZUxhYmVsID0gbnVsbFxuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICBrZXl1cDogZXZlbnQgPT4ge1xuICAgICAgICBpZiAoZXZlbnQuY29kZSA9PT0gJ1RhYicpIHtcbiAgICAgICAgICB0aGlzLmFwcFN0YXRlLmFjdGl2ZUxhYmVsID0gbnVsbFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgICB0cnkge1xuICAgICAgdGhpcy5hbGxvd0xvZ2luID0gZmFsc2VcbiAgICAgIGlmIChhd2FpdCB0aGlzLmZldGNoVXNlcigpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVzb2x2ZVZpZXdzKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHRoaXMubG9naW4oKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnIpXG4gICAgfVxuICAgIHRoaXMuYWxsb3dMb2dpbiA9IHRydWVcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgbm90aWZ5KHsgdHlwZSA9ICdpbmZvJywgdGl0bGUsIHRleHQgfSA9IHt9KSB7XG4gICAgICB0aXRsZSB8fD0gKFxuICAgICAgICB7XG4gICAgICAgICAgd2FybmluZzogJ1dhcm5pbmcnLFxuICAgICAgICAgIGVycm9yOiAnRXJyb3InLFxuICAgICAgICAgIGluZm86ICdJbmZvcm1hdGlvbicsXG4gICAgICAgICAgc3VjY2VzczogJ1N1Y2Nlc3MnXG4gICAgICAgIH1bdHlwZV0gfHxcbiAgICAgICAgJ05vdGlmaWNhdGlvbidcbiAgICAgIClcbiAgICAgIHRleHQgPSBgPHA+JHtcbiAgICAgICAgYXNBcnJheSh0ZXh0KS5qb2luKCc8L3A+IDxwPicpXG4gICAgICB9PC9wPmAucmVwbGFjZSgvXFxufFxcclxcbnxcXHIvZywgJzxicj4nKVxuICAgICAgY29uc3QgbG9nID0gKFxuICAgICAgICB7XG4gICAgICAgICAgd2FybmluZzogJ3dhcm4nLFxuICAgICAgICAgIGVycm9yOiAnZXJyb3InLFxuICAgICAgICAgIGluZm86ICdsb2cnLFxuICAgICAgICAgIHN1Y2Nlc3M6ICdsb2cnXG4gICAgICAgIH1bdHlwZV0gfHxcbiAgICAgICAgJ2Vycm9yJ1xuICAgICAgKVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGVbbG9nXShzdHJpcFRhZ3ModGV4dCkpXG4gICAgICBjb25zdCB7IG5vdGlmaWNhdGlvbnMgPSB0cnVlIH0gPSB0aGlzLmFwaVxuICAgICAgaWYgKG5vdGlmaWNhdGlvbnMpIHtcbiAgICAgICAgLy8gQ2FsY3VsYXRlIGRpc3BsYXktZHVyYXRpb24gZm9yIHRoZSBub3RpZmljYXRpb24gYmFzZWQgb24gaXRzIGNvbnRlbnRcbiAgICAgICAgLy8gYW5kIHRoZSBzZXR0aW5nIG9mIHRoZSBgZHVyYXRpb25GYWN0b3JgIGNvbmZpZ3VyYXRpb24uIEl0IGRlZmluZXMgdGhlXG4gICAgICAgIC8vIGFtb3VudCBvZiBtaWxsaXNlY29uZHMgbXVsdGlwbGllZCB3aXRoIHRoZSBhbW91bnQgb2YgY2hhcmFjdGVyc1xuICAgICAgICAvLyBkaXNwbGF5ZWQgaW4gdGhlIG5vdGlmaWNhdGlvbiwgcGx1cyA0MCAoNDAgKyB0aXRsZSArIG1lc3NhZ2UpOlxuICAgICAgICBjb25zdCB7IGR1cmF0aW9uRmFjdG9yID0gMjAgfSA9IG5vdGlmaWNhdGlvbnNcbiAgICAgICAgY29uc3QgZHVyYXRpb24gPSAoNDAgKyB0ZXh0Lmxlbmd0aCArIHRpdGxlLmxlbmd0aCkgKiBkdXJhdGlvbkZhY3RvclxuICAgICAgICB0aGlzLiRub3RpZnkoeyB0eXBlLCB0aXRsZSwgdGV4dCwgZHVyYXRpb24gfSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY2xvc2VOb3RpZmljYXRpb25zKCkge1xuICAgICAgdGhpcy5ub3RpZmljYXRpb25zLmRlc3Ryb3lBbGwoKVxuICAgIH0sXG5cbiAgICByZWdpc3RlckxvYWRpbmcoaXNMb2FkaW5nKSB7XG4gICAgICB0aGlzLmxvYWRpbmdDb3VudCArPSBpc0xvYWRpbmcgPyAxIDogLTFcbiAgICB9LFxuXG4gICAgc2hvd0RpYWxvZyh7IGNvbXBvbmVudHMsIGJ1dHRvbnMsIGRhdGEsIHNldHRpbmdzIH0pIHtcbiAgICAgIC8vIFNob3dzIGEgZGl0by1kaWFsb2cgY29tcG9uZW50IGFuZCB3cmFwcyBpdCBpbiBhIHByb21pc2Ugc28gdGhhdCB0aGVcbiAgICAgIC8vIGJ1dHRvbnMgaW4gdGhlIGRpYWxvZyBjYW4gdXNlIGBkaWFsb2cucmVzb2x2ZSgpYCBhbmQgYGRpYWxvZy5yZWplY3QoKWBcbiAgICAgIC8vIHRvIGNsb3NlIHRoZSBtb2RhbCBkaWFsb2cgYW5kIHJlc29sdmUgLyByZWplY3QgdGhlIHByb21pc2UgYXQgb25jZS5cbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWFzeW5jLXByb21pc2UtZXhlY3V0b3JcbiAgICAgICAgYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIC8vIFByb2Nlc3MgY29tcG9uZW50cyB0byByZXNvbHZlIGFzeW5jIHNjaGVtYXMuXG4gICAgICAgICAgY29uc3Qgcm91dGVzID0gW11cbiAgICAgICAgICBhd2FpdCBwcm9jZXNzU2NoZW1hQ29tcG9uZW50cyh0aGlzLmFwaSwgeyBjb21wb25lbnRzIH0sIHJvdXRlcywgMClcbiAgICAgICAgICBpZiAocm91dGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgJ0RpYWxvZ3MgZG8gbm90IHN1cHBvcnQgY29tcG9uZW50cyB0aGF0IHByb2R1Y2Ugcm91dGVzJ1xuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBrZXkgPSBgZGlhbG9nLSR7KytkaWFsb2dJZH1gXG4gICAgICAgICAgdGhpcy5kaWFsb2dzW2tleV0gPSB7XG4gICAgICAgICAgICBjb21wb25lbnRzLFxuICAgICAgICAgICAgYnV0dG9ucyxcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICBzZXR0aW5ncyxcbiAgICAgICAgICAgIHByb21pc2U6IHsgcmVzb2x2ZSwgcmVqZWN0IH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIClcbiAgICB9LFxuXG4gICAgcmVtb3ZlRGlhbG9nKGtleSkge1xuICAgICAgZGVsZXRlIHRoaXMuZGlhbG9nc1trZXldXG4gICAgfSxcblxuICAgIGFzeW5jIGxvZ2luKCkge1xuICAgICAgdGhpcy5hbGxvd0xvZ2luID0gdHJ1ZVxuICAgICAgY29uc3Qge1xuICAgICAgICBhZGRpdGlvbmFsQ29tcG9uZW50cyxcbiAgICAgICAgcmVkaXJlY3RBZnRlckxvZ2luXG4gICAgICB9ID0gdGhpcy5vcHRpb25zLmxvZ2luIHx8IHt9XG4gICAgICBjb25zdCBsb2dpbkRhdGEgPSBhd2FpdCB0aGlzLnNob3dEaWFsb2coe1xuICAgICAgICBjb21wb25lbnRzOiB7XG4gICAgICAgICAgdXNlcm5hbWU6IHtcbiAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgIGF1dG9mb2N1czogdHJ1ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgcGFzc3dvcmQ6IHtcbiAgICAgICAgICAgIHR5cGU6ICdwYXNzd29yZCdcbiAgICAgICAgICB9LFxuICAgICAgICAgIC4uLmFkZGl0aW9uYWxDb21wb25lbnRzXG4gICAgICAgIH0sXG4gICAgICAgIGJ1dHRvbnM6IHtcbiAgICAgICAgICBjYW5jZWw6IHtcbiAgICAgICAgICAgIHR5cGU6ICdidXR0b24nLFxuICAgICAgICAgICAgdGV4dDogJ0NhbmNlbCdcbiAgICAgICAgICAgIC8vIE5PVEU6IFRoZSBjbGljayBldmVudCBpcyBhZGRlZCBpbiBEaXRvRGlhbG9nLmJ1dHRvblNjaGVtYXMoKVxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBsb2dpbjoge1xuICAgICAgICAgICAgdHlwZTogJ3N1Ym1pdCcsXG4gICAgICAgICAgICB0ZXh0OiAnTG9naW4nXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgaWYgKGxvZ2luRGF0YSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5zZW5kUmVxdWVzdCh7XG4gICAgICAgICAgICByZXNvdXJjZTogdGhpcy5hcGkudXNlcnMubG9naW4sXG4gICAgICAgICAgICBkYXRhOiBsb2dpbkRhdGEsXG4gICAgICAgICAgICBpbnRlcm5hbDogdHJ1ZVxuICAgICAgICAgIH0pXG4gICAgICAgICAgaWYgKHJlZGlyZWN0QWZ0ZXJMb2dpbikge1xuICAgICAgICAgICAgbG9jYXRpb24ucmVwbGFjZShyZWRpcmVjdEFmdGVyTG9naW4pXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0VXNlcihyZXNwb25zZS5kYXRhLnVzZXIpXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJlc29sdmVWaWV3cygpXG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IGVyci5yZXNwb25zZT8uZGF0YT8uZXJyb3JcbiAgICAgICAgICB0aGlzLm5vdGlmeSh7XG4gICAgICAgICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgICAgICAgdGl0bGU6ICdBdXRoZW50aWNhdGlvbiBFcnJvcicsXG4gICAgICAgICAgICB0ZXh0OiBlcnJvciB8fCBlcnJcbiAgICAgICAgICB9KVxuICAgICAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyLCBlcnIucmVzcG9uc2UpXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMubG9naW4oKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIG5hdmlnYXRlSG9tZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLm5hdmlnYXRlKCcvJylcbiAgICB9LFxuXG4gICAgYXN5bmMgbG9nb3V0KCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnNlbmRSZXF1ZXN0KHtcbiAgICAgICAgICByZXNvdXJjZTogdGhpcy5hcGkudXNlcnMubG9nb3V0LFxuICAgICAgICAgIGludGVybmFsOiB0cnVlXG4gICAgICAgIH0pXG4gICAgICAgIGlmIChyZXNwb25zZS5kYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgICB0aGlzLnNldFVzZXIobnVsbClcbiAgICAgICAgICB0aGlzLm5hdmlnYXRlSG9tZSgpXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycilcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgZmV0Y2hVc2VyKCkge1xuICAgICAgbGV0IHVzZXIgPSBudWxsXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuc2VuZFJlcXVlc3Qoe1xuICAgICAgICAgIHJlc291cmNlOiB0aGlzLmFwaS51c2Vycy5zZXNzaW9uLFxuICAgICAgICAgIGludGVybmFsOiB0cnVlXG4gICAgICAgIH0pXG4gICAgICAgIHVzZXIgPSByZXNwb25zZS5kYXRhLnVzZXIgfHwgbnVsbFxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRoaXMubm90aWZ5KHtcbiAgICAgICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgICAgIHRpdGxlOiAnQXV0aGVudGljYXRpb24gRXJyb3InLFxuICAgICAgICAgIHRleHQ6IGVyclxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgdGhpcy5zZXRVc2VyKHVzZXIpXG4gICAgICByZXR1cm4gdXNlclxuICAgIH0sXG5cbiAgICBzZXRVc2VyKHVzZXIpIHtcbiAgICAgIHRoaXMuYXBwU3RhdGUudXNlciA9IChcbiAgICAgICAgdXNlciAmJlxuICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodXNlciwgRGl0b1VzZXIucHJvdG90eXBlKVxuICAgICAgKVxuICAgICAgLy8gQ2xlYXIgcmVzb2x2ZWQgdmlld3Mgd2hlbiB1c2VyIGlzIGxvZ2dlZCBvdXQuXG4gICAgICBpZiAoIXVzZXIpIHtcbiAgICAgICAgdGhpcy5yZXNvbHZlZFZpZXdzID0ge31cbiAgICAgICAgdGhpcy5uYXZpZ2F0ZUhvbWUoKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBlbnN1cmVVc2VyKCkge1xuICAgICAgaWYgKCEoYXdhaXQgdGhpcy5mZXRjaFVzZXIoKSkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5sb2dpbigpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIHJlc29sdmVWaWV3cygpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMucmVzb2x2ZWRWaWV3cyA9IGF3YWl0IHJlc29sdmVTY2hlbWFzKHRoaXMudW5yZXNvbHZlZFZpZXdzKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKCFlcnJvci5yZXF1ZXN0KSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcilcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5sb2dpbigpXG4gICAgICB9XG4gICAgICAvLyBDb2xsZWN0IGFsbCByb3V0ZXMgZnJvbSB0aGUgcm9vdCBzY2hlbWEgY29tcG9uZW50c1xuICAgICAgY29uc3Qgcm91dGVzID0gYXdhaXQgbWFwQ29uY3VycmVudGx5KFxuICAgICAgICBPYmplY3QuZW50cmllcyh0aGlzLnJlc29sdmVkVmlld3MpLFxuICAgICAgICAoW25hbWUsIHNjaGVtYV0pID0+IHByb2Nlc3NWaWV3KERpdG9WaWV3LCB0aGlzLmFwaSwgc2NoZW1hLCBuYW1lKVxuICAgICAgKVxuICAgICAgLy8gTm93IHRoYXQgdGhlIHJvdXRlcyBhcmUgbG9hZGVkLCByZXBsYWNlIGFsbCBleGlzdGluZyByb3V0ZXMgd2l0aCB0aGVcbiAgICAgIC8vIG5ldyByb3V0ZXMsIGFuZCByZXN0b3JlIHRoZSBjdXJyZW50IHBhdGguXG4gICAgICBjb25zdCB7IGZ1bGxQYXRoIH0gPSB0aGlzLiRyb3V0ZVxuICAgICAgdGhpcy5yZW1vdmVSb3V0ZXM/LigpXG4gICAgICB0aGlzLnJlbW92ZVJvdXRlcyA9IGFkZFJvdXRlcyh0aGlzLiRyb3V0ZXIsIFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdyb290JyxcbiAgICAgICAgICBwYXRoOiAnLycsXG4gICAgICAgICAgY29tcG9uZW50czoge31cbiAgICAgICAgfSxcbiAgICAgICAgLi4ucm91dGVzXG4gICAgICBdKVxuICAgICAgdGhpcy4kcm91dGVyLnJlcGxhY2UoZnVsbFBhdGgpXG4gICAgfVxuICB9XG59KVxuXG5sZXQgZGlhbG9nSWQgPSAwXG5cbmZ1bmN0aW9uIGFkZFJvdXRlcyhyb3V0ZXIsIHJvdXRlcykge1xuICBjb25zdCByZW1vdmVycyA9IFtdXG4gIGZvciAoY29uc3Qgcm91dGUgb2Ygcm91dGVzKSB7XG4gICAgY29uc3QgcmVtb3ZlUm91dGUgPSByb3V0ZXIuYWRkUm91dGUocm91dGUpXG4gICAgcmVtb3ZlcnMucHVzaChyZW1vdmVSb3V0ZSlcbiAgfVxuXG4gIHJldHVybiAoKSA9PiB7XG4gICAgZm9yIChjb25zdCByZW1vdmUgb2YgcmVtb3ZlcnMpIHtcbiAgICAgIHJlbW92ZSgpXG4gICAgfVxuICB9XG59XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvc3R5bGUnO1xuXG4uZGl0by1hcHAsXG4uZGl0by1yb290IHtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgZGlzcGxheTogZmxleDtcbn1cblxuLmRpdG8tcm9vdCB7XG4gIC5kaXRvLXBhZ2Uge1xuICAgIGJhY2tncm91bmQ6ICRjb250ZW50LWNvbG9yLWJhY2tncm91bmQ7XG4gICAgLy8gVGhlIHJvb3QtbGV2ZWwgdmlld3MgYW5kIGZvcm1zIG1heSBoYXZlIGEgYC5kaXRvLXNjaGVtYS1oZWFkZXJgIHRoYXRcbiAgICAvLyBzaG91bGQgYXBwZWFyIGxheWVyZWQgb3ZlciBgLmRpdG8tbWVudWAsIHdoaWxlIGhhdmluZyBgb3ZlcmxheTogaGlkZGVuYFxuICAgIC8vIHNldCBieSBgLmRpdG8tc2Nyb2xsLXBhcmVudGAgdG8gZGVsZWdhdGUgc2Nyb2xsaW5nIHRvIGAuZGl0by1zY3JvbGxgLlxuICAgIC8vIEluIG9yZGVyIHRvIG5vdCBoYXZlIHRoZSBoZWFkZXIgY2xpcHBlZCwgYWRqdXN0IHRoZSB0b3AgaGVyZTpcbiAgICA+IC5kaXRvLWZvcm0sXG4gICAgPiAuZGl0by12aWV3IHtcbiAgICAgIG1hcmdpbi10b3A6IC0kbWVudS1oZWlnaHQ7XG4gICAgICBwYWRkaW5nLXRvcDogJG1lbnUtaGVpZ2h0O1xuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG5uYXYuZGl0by1tZW51LmRpdG8tc2Nyb2xsLXBhcmVudFxuICBoMSB7eyBhcHBTdGF0ZS50aXRsZSB9fVxuICB1bC5kaXRvLXNjcm9sbFxuICAgIGxpKFxuICAgICAgdi1mb3I9XCJ2aWV3IGluIHZpZXdzXCJcbiAgICApXG4gICAgICBSb3V0ZXJMaW5rKFxuICAgICAgICB2LWlmPVwic2hvdWxkUmVuZGVyKHZpZXcpXCJcbiAgICAgICAgdi1zbG90PVwieyBpc0FjdGl2ZSwgaHJlZiwgcm91dGUgfVwiXG4gICAgICAgIGN1c3RvbVxuICAgICAgICA6dG89XCJgLyR7dmlldy5wYXRofWBcIlxuICAgICAgKVxuICAgICAgICBhLmRpdG8tbGluayhcbiAgICAgICAgICA6aHJlZj1cImhyZWZcIlxuICAgICAgICAgIDpjbGFzcz1cInsgJ2RpdG8tYWN0aXZlJzogaXNBY3RpdmUgfVwiXG4gICAgICAgICAgQGNsaWNrLnByZXZlbnQ9XCJvbkNsaWNrTGluayhyb3V0ZSlcIlxuICAgICAgICApIHt7IGdldExhYmVsKHZpZXcpIH19XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvTWVudScsIHtcbiAgbWV0aG9kczoge1xuICAgIG9uQ2xpY2tMaW5rKHJvdXRlKSB7XG4gICAgICB0aGlzLiRyb3V0ZXIucHVzaCh7IC4uLnJvdXRlLCBmb3JjZTogdHJ1ZSB9KVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLW1lbnUge1xuICBmbGV4OiBpbml0aWFsO1xuICBmb250LXNpemU6ICRtZW51LWZvbnQtc2l6ZTtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgQGluY2x1ZGUgdXNlci1zZWxlY3Qobm9uZSk7XG5cbiAgdWwge1xuICAgIGJhY2tncm91bmQ6ICRjb2xvci1saWdodGVyO1xuICAgIGJvcmRlci1yaWdodDogJGJvcmRlci1zdHlsZTtcbiAgfVxuXG4gIGEsXG4gIGgxIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgfVxuXG4gIGgxIHtcbiAgICBwYWRkaW5nOiAkbWVudS1wYWRkaW5nO1xuICAgIGxpbmUtaGVpZ2h0OiAkbWVudS1saW5lLWhlaWdodDtcbiAgICBmb250LXdlaWdodDogYm9sZDtcbiAgICBiYWNrZ3JvdW5kOiAkY29sb3ItZGFya2VyO1xuICAgIGJvcmRlci1yaWdodDogJGJvcmRlci13aWR0aCBzb2xpZCAkY29sb3ItZGFya2VzdDtcbiAgICBjb2xvcjogJGNvbG9yLXdoaXRlO1xuICB9XG5cbiAgLmRpdG8tbGluayB7XG4gICAgcGFkZGluZzogJG1lbnUtcGFkZGluZztcbiAgICBsaW5lLWhlaWdodDogJG1lbnUtbGluZS1oZWlnaHQ7XG5cbiAgICAmLmRpdG8tYWN0aXZlIHtcbiAgICAgIGNvbG9yOiAkY29sb3Itd2hpdGU7XG4gICAgICBiYWNrZ3JvdW5kOiAkY29sb3ItYWN0aXZlO1xuICAgIH1cbiAgfVxufVxuXG4uZGl0by1saW5rIHtcbiAgJjpmb2N1czpub3QoOmFjdGl2ZSwgLmRpdG8tYWN0aXZlKSB7XG4gICAgYm94LXNoYWRvdzogJHNoYWRvdy1mb2N1cztcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1zcGlubmVyKFxuICB2LXNob3c9XCJsb2FkaW5nXCJcbilcbiAgLy8tIFRPRE86IENvbnZlcnQgdG8gQkVNXG4gIC52LXB1bHNlLnYtcHVsc2UxKDpzdHlsZT1cIltzcGlubmVyU3R5bGUsIHNwaW5uZXJEZWxheTFdXCIpXG4gIC52LXB1bHNlLnYtcHVsc2UyKDpzdHlsZT1cIltzcGlubmVyU3R5bGUsIHNwaW5uZXJEZWxheTJdXCIpXG4gIC52LXB1bHNlLnYtcHVsc2UzKDpzdHlsZT1cIltzcGlubmVyU3R5bGUsIHNwaW5uZXJEZWxheTNdXCIpXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuZXhwb3J0IGRlZmF1bHQge1xuICBwcm9wczoge1xuICAgIGxvYWRpbmc6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfSxcbiAgICBjb2xvcjoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJyM1ZGM1OTYnXG4gICAgfSxcbiAgICBzaXplOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiAnMTVweCdcbiAgICB9LFxuICAgIG1hcmdpbjoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJzJweCdcbiAgICB9LFxuICAgIHJhZGl1czoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJzEwMCUnXG4gICAgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgLy8gVE9ETzogQ29udmVydCB0byB1c2luZyBvbmx5IGNsYXNzZXNcbiAgICByZXR1cm4ge1xuICAgICAgc3Bpbm5lclN0eWxlOiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogdGhpcy5jb2xvcixcbiAgICAgICAgd2lkdGg6IHRoaXMuc2l6ZSxcbiAgICAgICAgaGVpZ2h0OiB0aGlzLnNpemUsXG4gICAgICAgIG1hcmdpbjogdGhpcy5tYXJnaW4sXG4gICAgICAgIGJvcmRlclJhZGl1czogdGhpcy5yYWRpdXMsXG4gICAgICAgIGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snLFxuICAgICAgICBhbmltYXRpb25OYW1lOiAndi1wdWxzZVN0cmV0Y2hEZWxheScsXG4gICAgICAgIGFuaW1hdGlvbkR1cmF0aW9uOiAnMC43NXMnLFxuICAgICAgICBhbmltYXRpb25JdGVyYXRpb25Db3VudDogJ2luZmluaXRlJyxcbiAgICAgICAgYW5pbWF0aW9uVGltaW5nRnVuY3Rpb246ICdjdWJpYy1iZXppZXIoLjIsLjY4LC4xOCwxLjA4KScsXG4gICAgICAgIGFuaW1hdGlvbkZpbGxNb2RlOiAnYm90aCdcbiAgICAgIH0sXG4gICAgICBzcGlubmVyRGVsYXkxOiB7XG4gICAgICAgIGFuaW1hdGlvbkRlbGF5OiAnMC4xMnMnXG4gICAgICB9LFxuICAgICAgc3Bpbm5lckRlbGF5Mjoge1xuICAgICAgICBhbmltYXRpb25EZWxheTogJzAuMjRzJ1xuICAgICAgfSxcbiAgICAgIHNwaW5uZXJEZWxheTM6IHtcbiAgICAgICAgYW5pbWF0aW9uRGVsYXk6ICcwLjM2cydcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBrZXlmcmFtZXMgdi1wdWxzZVN0cmV0Y2hEZWxheSB7XG4gIDAlLFxuICA4MCUge1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7XG4gICAgb3BhY2l0eTogMTtcbiAgfVxuXG4gIDQ1JSB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgwLjEpO1xuICAgIG9wYWNpdHk6IDAuNztcbiAgfVxufVxuXG5Aa2V5ZnJhbWVzIHYtcHVsc2VTdHJldGNoRGVsYXkge1xuICAwJSxcbiAgODAlIHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xuICAgIG9wYWNpdHk6IDE7XG4gIH1cblxuICA0NSUge1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMC4xKTtcbiAgICBvcGFjaXR5OiAwLjc7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxubmF2LmRpdG8taGVhZGVyXG4gIC5kaXRvLXRyYWlsXG4gICAgdWxcbiAgICAgIGxpKFxuICAgICAgICB2LWZvcj1cIihjb21wb25lbnQsIGluZGV4KSBpbiB0cmFpbFwiXG4gICAgICApXG4gICAgICAgIHRlbXBsYXRlKFxuICAgICAgICAgIHYtaWY9XCJpbmRleCA9PT0gdHJhaWwubGVuZ3RoIC0gMVwiXG4gICAgICAgIClcbiAgICAgICAgICBzcGFuKDpjbGFzcz1cImdldEJyZWFkY3J1bWJDbGFzcyhjb21wb25lbnQpXCIpXG4gICAgICAgICAgICB8IHt7IGNvbXBvbmVudC5icmVhZGNydW1iIH19XG4gICAgICAgIFJvdXRlckxpbmsuZGl0by1icmVhZGNydW1iKFxuICAgICAgICAgIHYtZWxzZVxuICAgICAgICAgIDp0bz1cImNvbXBvbmVudC5wYXRoXCJcbiAgICAgICAgKVxuICAgICAgICAgIHNwYW4oOmNsYXNzPVwiZ2V0QnJlYWRjcnVtYkNsYXNzKGNvbXBvbmVudClcIilcbiAgICAgICAgICAgIHwge3sgY29tcG9uZW50LmJyZWFkY3J1bWIgfX1cbiAgICBEaXRvU3Bpbm5lcihcbiAgICAgIHYtaWY9XCJpc0xvYWRpbmdcIlxuICAgIClcbiAgc2xvdFxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5pbXBvcnQgRGl0b1NwaW5uZXIgZnJvbSAnLi9EaXRvU3Bpbm5lci52dWUnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b0hlYWRlcicsIHtcbiAgY29tcG9uZW50czogeyBEaXRvU3Bpbm5lciB9LFxuXG4gIHByb3BzOiB7XG4gICAgc3Bpbm5lcjoge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdDogbnVsbFxuICAgIH0sXG4gICAgaXNMb2FkaW5nOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICB0cmFpbCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmFwcFN0YXRlLnJvdXRlQ29tcG9uZW50cy5maWx0ZXIoXG4gICAgICAgIGNvbXBvbmVudCA9PiAhIWNvbXBvbmVudC5yb3V0ZVJlY29yZFxuICAgICAgKVxuICAgIH1cbiAgfSxcblxuICBjcmVhdGVkKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHNpemUgPSAnOHB4JyxcbiAgICAgIGNvbG9yID0gJyM5OTknXG4gICAgfSA9IHRoaXMuc3Bpbm5lciB8fCB7fVxuICAgIC8vIFRPRE86IFRoaXMgaXMgYSBoYWNrIHRvIHNldCB0aGUgZGVmYXVsdCBwcm9wcyBmb3IgdGhlIERpdG9TcGlubmVyLlxuICAgIC8vIFBhc3MgdGhlbSBvbiB0aHJvdWdoIHRoZSB0ZW1wbGF0ZSBpbnN0ZWFkIVxuICAgIGNvbnN0IHsgcHJvcHMgfSA9IERpdG9TcGlubmVyXG4gICAgcHJvcHMuc2l6ZS5kZWZhdWx0ID0gc2l6ZVxuICAgIHByb3BzLmNvbG9yLmRlZmF1bHQgPSBjb2xvclxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBnZXRCcmVhZGNydW1iQ2xhc3MoY29tcG9uZW50KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAnZGl0by1kaXJ0eSc6IGNvbXBvbmVudC5pc0RpcnR5XG4gICAgICB9XG4gICAgfVxuICB9XG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8taGVhZGVyIHtcbiAgYmFja2dyb3VuZDogJGNvbG9yLWJsYWNrO1xuICBmb250LXNpemU6ICRtZW51LWZvbnQtc2l6ZTtcbiAgbGluZS1oZWlnaHQ6ICRtZW51LWxpbmUtaGVpZ2h0O1xuICB6LWluZGV4OiAkbWVudS16LWluZGV4O1xuICBAaW5jbHVkZSB1c2VyLXNlbGVjdChub25lKTtcblxuICBzcGFuIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgcGFkZGluZzogJG1lbnUtcGFkZGluZztcbiAgICBjb2xvcjogJGNvbG9yLXdoaXRlO1xuICB9XG5cbiAgLmRpdG8tdHJhaWwge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBoZWlnaHQ6IDNlbTtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBtYXgtd2lkdGg6ICRjb250ZW50LXdpZHRoICsgJGNvbnRlbnQtcGFkZGluZztcblxuICAgIHVsIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgfVxuXG4gICAgYSB7XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIHBhZGRpbmctcmlnaHQ6IDAuNGVtO1xuXG4gICAgICAkYW5nbGU6IDMzZGVnO1xuXG4gICAgICAmOmhvdmVyIHtcbiAgICAgICAgY29sb3I6ICM5OTk5OTk7XG4gICAgICB9XG5cbiAgICAgICY6OmJlZm9yZSxcbiAgICAgICY6OmFmdGVyIHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICBjb250ZW50OiAnJztcbiAgICAgICAgd2lkdGg6IDFweDtcbiAgICAgICAgaGVpZ2h0OiAxLjJlbTtcbiAgICAgICAgcmlnaHQ6IC0xcHg7XG4gICAgICAgIGJhY2tncm91bmQ6ICRjb2xvci1kYXJrO1xuICAgICAgfVxuXG4gICAgICAmOjpiZWZvcmUge1xuICAgICAgICB0b3A6IDUwJTtcbiAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoJGFuZ2xlKTtcbiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogdG9wO1xuICAgICAgfVxuXG4gICAgICAmOjphZnRlciB7XG4gICAgICAgIGJvdHRvbTogNTAlO1xuICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtJGFuZ2xlKTtcbiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogYm90dG9tO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC5kaXRvLXNwaW5uZXIge1xuICAgIG1hcmdpbi10b3A6ICRtZW51LXBhZGRpbmctdmVyO1xuICB9XG5cbiAgLmRpdG8tZGlydHkge1xuICAgICY6OmFmdGVyIHtcbiAgICAgIGNvbnRlbnQ6ICcnO1xuICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogJGNvbG9yLXdoaXRlO1xuICAgICAgd2lkdGg6IDhweDtcbiAgICAgIGhlaWdodDogOHB4O1xuICAgICAgbWFyZ2luOiAycHg7XG4gICAgICBtYXJnaW4tbGVmdDogMC41ZW07XG4gICAgICBib3JkZXItcmFkaXVzOiAxMDAlO1xuICAgIH1cbiAgfVxuXG4gIC5kaXRvLWFjY291bnQsXG4gIC5kaXRvLWxvZ2luIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAwO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgfVxuXG4gIC5kaXRvLWFjY291bnQge1xuICAgIGxlZnQ6ICRjb250ZW50LXdpZHRoICsgJGNvbnRlbnQtcGFkZGluZyAqIDI7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCJpbXBvcnQgRG9tTWl4aW4gZnJvbSAnLi9Eb21NaXhpbi5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgbWl4aW5zOiBbRG9tTWl4aW5dLFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHB1bGxkb3duOiB7XG4gICAgICAgIG9wZW46IGZhbHNlLFxuICAgICAgICBzdGFydFRpbWU6IDAsXG4gICAgICAgIGNoZWNrVGltZTogdHJ1ZSxcbiAgICAgICAgZXZlbnRzOiB7XG4gICAgICAgICAgbW91c2Vkb3duOiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldFB1bGxkb3duT3BlbihmYWxzZSlcbiAgICAgICAgICAgIHRoaXMucHVsbGRvd24uaGFuZGxlcnMucmVtb3ZlKClcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgbW91c2V1cDogKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMub25QdWxsZG93bk1vdXNlVXAobnVsbCkpIHtcbiAgICAgICAgICAgICAgdGhpcy5wdWxsZG93bi5oYW5kbGVycy5yZW1vdmUoKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgaGFuZGxlcnM6IG51bGxcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIG9uUHVsbGRvd25Nb3VzZURvd24odmFsdWUpIHtcbiAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgdGhpcy5zZXRQdWxsZG93bk9wZW4odHJ1ZSlcbiAgICAgICAgdGhpcy5jaGVja1RpbWUgPSB0cnVlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNoZWNrVGltZSA9IGZhbHNlXG4gICAgICB9XG4gICAgfSxcblxuICAgIG9uUHVsbGRvd25Nb3VzZVVwKHZhbHVlKSB7XG4gICAgICBjb25zdCB7IHN0YXJ0VGltZSB9ID0gdGhpcy5wdWxsZG93blxuICAgICAgaWYgKCF0aGlzLmNoZWNrVGltZSB8fCBzdGFydFRpbWUgJiYgKERhdGUubm93KCkgLSBzdGFydFRpbWUgPiAyNTApKSB7XG4gICAgICAgIHRoaXMuc2V0UHVsbGRvd25PcGVuKGZhbHNlKVxuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICB0aGlzLm9uUHVsbGRvd25TZWxlY3QodmFsdWUpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgb25QdWxsZG93blNlbGVjdCgvKiB2YWx1ZSAqLykge1xuICAgICAgLy8gTk9URTogVG8gYmUgb3ZlcnJpZGRlbi5cbiAgICB9LFxuXG4gICAgc2V0UHVsbGRvd25PcGVuKG9wZW4pIHtcbiAgICAgIHRoaXMucHVsbGRvd24ub3BlbiA9IG9wZW5cbiAgICAgIHRoaXMucHVsbGRvd24uc3RhcnRUaW1lID0gb3BlbiA/IERhdGUubm93KCkgOiAwXG4gICAgICBpZiAob3Blbikge1xuICAgICAgICB0aGlzLnB1bGxkb3duLmhhbmRsZXJzID0gdGhpcy5kb21Pbihkb2N1bWVudCwgdGhpcy5wdWxsZG93bi5ldmVudHMpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tYWNjb3VudFxuICBhKFxuICAgIEBtb3VzZWRvd24uc3RvcD1cIm9uUHVsbGRvd25Nb3VzZURvd24oKVwiXG4gIClcbiAgICBzcGFuIHt7IHVzZXIudXNlcm5hbWUgfX1cbiAgdWwuZGl0by1wdWxsZG93big6Y2xhc3M9XCJ7ICdkaXRvLW9wZW4nOiBwdWxsZG93bi5vcGVuIH1cIilcbiAgICBsaShcbiAgICAgIHYtZm9yPVwiKGxhYmVsLCB2YWx1ZSkgb2YgaXRlbXNcIlxuICAgIClcbiAgICAgIGEoXG4gICAgICAgIEBtb3VzZWRvd24uc3RvcD1cIm9uUHVsbGRvd25Nb3VzZURvd24odmFsdWUpXCJcbiAgICAgICAgQG1vdXNldXA9XCJvblB1bGxkb3duTW91c2VVcCh2YWx1ZSlcIlxuICAgICAgKSB7eyBsYWJlbCB9fVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5pbXBvcnQgUHVsbGRvd25NaXhpbiBmcm9tICcuLi9taXhpbnMvUHVsbGRvd25NaXhpbi5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvQWNjb3VudCcsIHtcbiAgbWl4aW5zOiBbUHVsbGRvd25NaXhpbl0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaXRlbXM6IHtcbiAgICAgICAgc2V0dGluZ3M6ICdTZXR0aW5ncycsXG4gICAgICAgIGxvZ291dDogJ0xvZ291dCdcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIG9uUHVsbGRvd25TZWxlY3QodmFsdWUpIHtcbiAgICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgICAgY2FzZSAnbG9nb3V0JzpcbiAgICAgICAgICB0aGlzLnJvb3RDb21wb25lbnQubG9nb3V0KClcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdzZXR0aW5ncyc6XG4gICAgICAgICAgY29uc29sZS5pbmZvKCdUT0RPOiBJbXBsZW1lbnQgU2V0dGluZ3MnKVxuICAgICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuICB9XG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tYWNjb3VudCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcblxuICAuZGl0by1wdWxsZG93biB7XG4gICAgdG9wOiAkcHVsbGRvd24tcGFkZGluZy12ZXI7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuY29tcG9uZW50KFxuICB2LWlmPVwiY29udGVudFwiXG4gIDppcz1cIm9wdGlvbnMudGFnIHx8IHRhZ1wiXG4gIDpjbGFzcz1cImNsYXNzZXNcIlxuICA6c3R5bGU9XCJzdHlsZXNcIlxuKSB7eyBvcHRpb25zLnRleHQgfX1cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuaW1wb3J0IHsgaXNPYmplY3QsIGlzU3RyaW5nLCBhc0FycmF5IH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvRWxlbWVudCcsIHtcbiAgcHJvcHM6IHtcbiAgICB0YWc6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnc3BhbicgfSxcbiAgICBjb250ZW50OiB7IHR5cGU6IFtTdHJpbmcsIE9iamVjdF0sIGRlZmF1bHQ6IG51bGwgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgb3B0aW9ucygpIHtcbiAgICAgIGNvbnN0IHsgY29udGVudCB9ID0gdGhpc1xuICAgICAgcmV0dXJuIGlzT2JqZWN0KGNvbnRlbnQpID8gY29udGVudCA6IHsgdGV4dDogY29udGVudCB9XG4gICAgfSxcblxuICAgIGNsYXNzZXMoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi50aGlzLiRhdHRycy5jbGFzcyxcbiAgICAgICAgLi4uYXNPYmplY3QodGhpcy5vcHRpb25zLmNsYXNzKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzdHlsZXMoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi50aGlzLiRhdHRycy5zdHlsZSxcbiAgICAgICAgLi4uYXNPYmplY3QodGhpcy5vcHRpb25zLnN0eWxlKVxuICAgICAgfVxuICAgIH1cbiAgfVxufSlcblxuZnVuY3Rpb24gYXNPYmplY3QodmFsdWUpIHtcbiAgcmV0dXJuIGFzQXJyYXkodmFsdWUpLnJlZHVjZSgob2JqZWN0LCBlbnRyeSkgPT4ge1xuICAgIGlmIChpc1N0cmluZyhlbnRyeSkpIHtcbiAgICAgIG9iamVjdFtlbnRyeV0gPSB0cnVlXG4gICAgfSBlbHNlIGlmIChpc09iamVjdChlbnRyeSkpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24ob2JqZWN0LCBlbnRyeSlcbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdFxuICB9LCB7fSlcbn1cbjwvc2NyaXB0PlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbmNvbXBvbmVudC5kaXRvLWxhYmVsKFxuICB2LWlmPVwidGV4dCB8fCBjb2xsYXBzaWJsZVwiXG4gIDppcz1cInRhZ1wiXG4gIHYtYmluZD1cImF0dHJpYnV0ZXNcIlxuICA6Y2xhc3M9XCJ7ICdkaXRvLWFjdGl2ZSc6IGlzQWN0aXZlIH1cIlxuKVxuICAuZGl0by1jaGV2cm9uKFxuICAgIHYtaWY9XCJjb2xsYXBzaWJsZVwiXG4gICAgOmNsYXNzPVwieyAnZGl0by1vcGVuZWQnOiAhY29sbGFwc2VkIH1cIlxuICApXG4gIERpdG9FbGVtZW50LmRpdG8tbGFiZWwtcHJlZml4KFxuICAgIHYtZm9yPVwiKHByZWZpeCwgaW5kZXgpIG9mIHByZWZpeGVzXCJcbiAgICA6a2V5PVwiYHByZWZpeC0ke2luZGV4fWBcIlxuICAgIHRhZz1cInNwYW5cIlxuICAgIDpjb250ZW50PVwicHJlZml4XCJcbiAgKVxuICBsYWJlbChcbiAgICA6Zm9yPVwiZGF0YVBhdGhcIlxuICAgIHYtaHRtbD1cInRleHRcIlxuICApXG4gIERpdG9FbGVtZW50LmRpdG8tbGFiZWwtc3VmZml4KFxuICAgIHYtZm9yPVwiKHN1ZmZpeCwgaW5kZXgpIG9mIHN1ZmZpeGVzXCJcbiAgICA6a2V5PVwiYHN1ZmZpeC0ke2luZGV4fWBcIlxuICAgIHRhZz1cInNwYW5cIlxuICAgIDpjb250ZW50PVwic3VmZml4XCJcbiAgKVxuICBzbG90KG5hbWU9XCJlZGl0LWJ1dHRvbnNcIilcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuaW1wb3J0IHsgaXNPYmplY3QsIGFzQXJyYXkgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9MYWJlbCcsIHtcbiAgZW1pdHM6IFsnZXhwYW5kJ10sXG5cbiAgcHJvcHM6IHtcbiAgICBsYWJlbDogeyB0eXBlOiBbU3RyaW5nLCBPYmplY3RdLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgZGF0YVBhdGg6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgY29sbGFwc2VkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgY29sbGFwc2libGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgdGFnKCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29sbGFwc2libGUgPyAnYScgOiAnZGl2J1xuICAgIH0sXG5cbiAgICB0ZXh0KCkge1xuICAgICAgY29uc3QgeyBsYWJlbCB9ID0gdGhpc1xuICAgICAgcmV0dXJuIGlzT2JqZWN0KGxhYmVsKSA/IGxhYmVsPy50ZXh0IDogbGFiZWxcbiAgICB9LFxuXG4gICAgcHJlZml4ZXMoKSB7XG4gICAgICByZXR1cm4gYXNBcnJheSh0aGlzLmxhYmVsPy5wcmVmaXgpXG4gICAgfSxcblxuICAgIHN1ZmZpeGVzKCkge1xuICAgICAgcmV0dXJuIGFzQXJyYXkodGhpcy5sYWJlbD8uc3VmZml4KVxuICAgIH0sXG5cbiAgICBhdHRyaWJ1dGVzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29sbGFwc2libGUgPyB7IG9uQ2xpY2s6IHRoaXMub25DbGljayB9IDoge31cbiAgICB9LFxuXG4gICAgaXNBY3RpdmUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5hcHBTdGF0ZS5hY3RpdmVMYWJlbCA9PT0gdGhpc1xuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgb25DbGljaygpIHtcbiAgICAgIHRoaXMuYXBwU3RhdGUuYWN0aXZlTGFiZWwgPSB0aGlzXG4gICAgICB0aGlzLiRlbWl0KCdleHBhbmQnLCB0aGlzLmNvbGxhcHNlZClcbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1sYWJlbCB7XG4gIC0tbGFiZWwtcGFkZGluZzogMDtcbiAgLy8gRm9yIGJ1dHRvbnMgYW5kIGNoZXZyb24gdG8gYWxpZ24gcmlnaHQ6XG4gIGRpc3BsYXk6IGZsZXg7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgLy8gVmVydGljYWxseSBjZW50ZXIgYWxsIGl0ZW1zIGluIHRoZSBsYWJlbCwgZS5nLiBjaGV2cm9uLCBlZGl0LWJ1dHRvbnMuXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIHBhZGRpbmc6IHZhcigtLWxhYmVsLXBhZGRpbmcpO1xuICBtYXJnaW46IDAgMCAkZm9ybS1zcGFjaW5nLWhhbGYgMDtcblxuICBsYWJlbCB7XG4gICAgZGlzcGxheTogaW5saW5lO1xuICAgIGN1cnNvcjogaW5oZXJpdDtcbiAgICBmb250LXdlaWdodDogYm9sZDtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICB9XG5cbiAgbGFiZWwsXG4gIC5kaXRvLWxhYmVsLXByZWZpeCxcbiAgLmRpdG8tbGFiZWwtc3VmZml4IHtcbiAgICAmOm50aC1sYXN0LWNoaWxkKDIpIHtcbiAgICAgIC8vIFRvIHN0cmV0Y2ggZWl0aGVyIGxhYmVsIG9yIC5kaXRvLWxhYmVsLXN1ZmZpeCB0byBmdWxsIGF2YWlsYWJsZSB3aWR0aFxuICAgICAgLy8gc28gdGhhdCBidXR0b25zIGFsd2F5cyBhcHBlYXIgcmlnaHQtYWxpZ25lZDpcbiAgICAgIGZsZXg6IDEgMSBhdXRvO1xuICAgIH1cblxuICAgICY6OmFmdGVyIHtcbiAgICAgIGNvbnRlbnQ6ICdcXGEwJzsgLy8gJm5ic3A7O1xuICAgIH1cbiAgfVxuXG4gIC5kaXRvLWxhYmVsLXByZWZpeCxcbiAgLmRpdG8tbGFiZWwtc3VmZml4IHtcbiAgICBAaW5jbHVkZSB1c2VyLXNlbGVjdChub25lKTtcbiAgICBAaW5jbHVkZSBlbGxpcHNpcztcbiAgfVxuXG4gIC5kaXRvLWJ1dHRvbnMge1xuICAgIC8vIE1vdmUgdGhlIGxhYmVsIHBhZGRpbmcgaW5zaWRlIC5kaXRvLWJ1dHRvbnMsIHNvIHRoYXQgaXQgY2FwdHVyZXMgYWxsXG4gICAgLy8gbmVhciBtb3VzZSBldmVudHM6XG4gICAgbWFyZ2luOiBjYWxjKC0xICogdmFyKC0tbGFiZWwtcGFkZGluZykpO1xuICAgIG1hcmdpbi1sZWZ0OiAwO1xuICAgIHBhZGRpbmc6IHZhcigtLWxhYmVsLXBhZGRpbmcpO1xuICB9XG5cbiAgJi5kaXRvLXdpZHRoLWZpbGwge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIC8vIEluIG9yZGVyIGZvciBlbGxpcHNpcyB0byB3b3JrIG9uIGxhYmVscyB3aXRob3V0IGFmZmVjdGluZyBvdGhlciBsYXlvdXQsXG4gICAgLy8gd2UgbmVlZCB0byBwb3NpdGlvbiBpdCBhYnNvbHV0ZWx5IGluc2lkZSBpdHMgY29udGFpbmVyLlxuICAgIGxhYmVsIHtcbiAgICAgIEBpbmNsdWRlIGVsbGlwc2lzO1xuXG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICBtYXgtd2lkdGg6IDEwMCU7XG4gICAgfVxuXG4gICAgJjo6YWZ0ZXIge1xuICAgICAgLy8gU2luY2UgPGxhYmVsPiB1c2VzIGBwb3NpdGlvbjogYWJzb2x1dGVgLCBzZXQgY29udGVudCB0byBhIHplcm8td2lkdGhcbiAgICAgIC8vIHNwYWNlIG9uIGl0cyBwYXJlbnQgdG8gZW5mb3JjZSB0aGUgcmlnaHQgdGV4dCBoZWlnaHQgaW4gdGhlIGNvbnRhaW5lclxuICAgICAgY29udGVudDogJ1xcMjAwYic7IC8vIHplcm8td2lkdGggc3BhY2U7XG4gICAgfVxuICB9XG59XG5cbmEuZGl0by1sYWJlbCB7XG4gICY6aG92ZXIge1xuICAgIC5kaXRvLWNoZXZyb24ge1xuICAgICAgY29sb3I6ICRjb2xvci1kYXJrZXI7XG4gICAgfVxuICB9XG5cbiAgJjpmb2N1czpub3QoOmFjdGl2ZSwgLmRpdG8tYWN0aXZlKSB7XG4gICAgLmRpdG8tY2hldnJvbiB7XG4gICAgICAtd2Via2l0LXRleHQtc3Ryb2tlOiAkYm9yZGVyLXdpZHRoICRjb2xvci1hY3RpdmU7XG4gICAgfVxuICAgIC8vIERpc3BsYXkgbGFiZWxzIGluIGNvbXBhY3Qgc2NoZW1hIGFzIGlubGluZS1ibG9ja3MsIHRvIGFsbG93IGNvbXBhY3RcbiAgICAvLyBsYXlvdXRzIHdpdGggYHdpZHRoOiAnYXV0bydgIGVsZW1lbnRzOlxuICAgIC8vIFRPRE86IEZpbmQgYSBiZXR0ZXIgd2F5IHRvIGNvbnRyb2wgdGhpcyBiZWhhdmlvci5cbiAgfVxufVxuXG4uZGl0by1zY2hlbWEtY29tcGFjdCB7XG4gID4gLmRpdG8tc2NoZW1hLWNvbnRlbnQge1xuICAgID4gLmRpdG8tcGFuZSB7XG4gICAgICA+IC5kaXRvLWNvbnRhaW5lciB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZmxvdzogcm93IHdyYXA7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBiYXNlbGluZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCJpbXBvcnQgRGl0b0NvbnRleHQgZnJvbSAnLi4vRGl0b0NvbnRleHQuanMnXG5pbXBvcnQge1xuICBnZXRJdGVtRm9ybVNjaGVtYSxcbiAgZ2V0SXRlbUlkLFxuICBnZXRJdGVtVWlkLFxuICBpc0xpc3RTb3VyY2Vcbn0gZnJvbSAnLi4vdXRpbHMvc2NoZW1hLmpzJ1xuaW1wb3J0IHsgYXBwZW5kRGF0YVBhdGggfSBmcm9tICcuLi91dGlscy9kYXRhLmpzJ1xuaW1wb3J0IHsgaXNPYmplY3QsIGlzU3RyaW5nLCBpc0Z1bmN0aW9uIH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgbWV0aG9kczoge1xuICAgIGdldEl0ZW1Gb3JtU2NoZW1hLFxuXG4gICAgZ2V0SXRlbVVpZCxcblxuICAgIGdldEl0ZW1JZChzb3VyY2VTY2hlbWEsIGl0ZW0sIGluZGV4ID0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNUcmFuc2llbnQgJiYgaW5kZXggIT09IG51bGxcbiAgICAgICAgPyBTdHJpbmcoaW5kZXgpXG4gICAgICAgIDogZ2V0SXRlbUlkKHNvdXJjZVNjaGVtYSwgaXRlbSlcbiAgICB9LFxuXG4gICAgZ2V0SXRlbURhdGFQYXRoKHNvdXJjZVNjaGVtYSwgaW5kZXgpIHtcbiAgICAgIGxldCB7IGRhdGFQYXRoIH0gPSB0aGlzXG4gICAgICBpZiAoc291cmNlU2NoZW1hICE9PSB0aGlzLnNjaGVtYSkge1xuICAgICAgICBkYXRhUGF0aCA9IGFwcGVuZERhdGFQYXRoKGRhdGFQYXRoLCBzb3VyY2VTY2hlbWEubmFtZSlcbiAgICAgIH1cbiAgICAgIGlmIChpbmRleCAhPSBudWxsKSB7XG4gICAgICAgIGRhdGFQYXRoID0gYXBwZW5kRGF0YVBhdGgoZGF0YVBhdGgsIGluZGV4KVxuICAgICAgfVxuICAgICAgcmV0dXJuIGRhdGFQYXRoXG4gICAgfSxcblxuICAgIGZpbmRJdGVtSWRJbmRleChzb3VyY2VTY2hlbWEsIGRhdGEsIGl0ZW1JZCkge1xuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmlzVHJhbnNpZW50XG4gICAgICAgID8gLy8gRm9yIHRyYW5zaWVudCBkYXRhLCB0aGUgaW5kZXggaXMgdXNlZCBhcyB0aGUgaWRcbiAgICAgICAgICBpdGVtSWRcbiAgICAgICAgOiBkYXRhPy5maW5kSW5kZXgoXG4gICAgICAgICAgICAoaXRlbSwgaW5kZXgpID0+IChcbiAgICAgICAgICAgICAgdGhpcy5nZXRJdGVtSWQoc291cmNlU2NoZW1hLCBpdGVtLCBpbmRleCkgPT09IGl0ZW1JZFxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgIHJldHVybiBpbmRleCAhPT0gLTEgPyBpbmRleCA6IG51bGxcbiAgICB9LFxuXG4gICAgZ2V0SXRlbUxhYmVsKHNvdXJjZVNjaGVtYSwgaXRlbSwge1xuICAgICAgaW5kZXggPSBudWxsLFxuICAgICAgZXh0ZW5kZWQgPSBmYWxzZSxcbiAgICAgIGFzT2JqZWN0ID0gZmFsc2VcbiAgICB9ID0ge30pIHtcbiAgICAgIGNvbnN0IHsgaXRlbUxhYmVsIH0gPSBzb3VyY2VTY2hlbWFcbiAgICAgIGlmICghaXRlbSB8fCAhZXh0ZW5kZWQgJiYgaXRlbUxhYmVsID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfVxuXG4gICAgICBsZXQgZGF0YVBhdGhcbiAgICAgIGNvbnN0IGdldERhdGFQYXRoID0gKCkgPT5cbiAgICAgICAgKGRhdGFQYXRoIHx8PSB0aGlzLmdldEl0ZW1EYXRhUGF0aChzb3VyY2VTY2hlbWEsIGluZGV4KSlcblxuICAgICAgbGV0IGZvcm1MYWJlbFxuICAgICAgY29uc3QgZ2V0Rm9ybUxhYmVsID0gKCkgPT5cbiAgICAgICAgKGZvcm1MYWJlbCB8fD0gdGhpcy5nZXRMYWJlbChcbiAgICAgICAgICBnZXRJdGVtRm9ybVNjaGVtYShzb3VyY2VTY2hlbWEsIGl0ZW0sIHRoaXMuY29udGV4dClcbiAgICAgICAgKSlcblxuICAgICAgbGV0IHRleHRcbiAgICAgIGxldCBwcmVmaXhcbiAgICAgIGxldCBzdWZmaXhcbiAgICAgIGlmIChpc0Z1bmN0aW9uKGl0ZW1MYWJlbCkpIHtcbiAgICAgICAgY29uc3QgbGFiZWwgPSBpdGVtTGFiZWwuY2FsbChcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIG5ldyBEaXRvQ29udGV4dCh0aGlzLCB7XG4gICAgICAgICAgICBuZXN0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgZGF0YTogaXRlbSxcbiAgICAgICAgICAgIHZhbHVlOiBpdGVtLFxuICAgICAgICAgICAgaW5kZXgsXG5cbiAgICAgICAgICAgIGdldCBkYXRhUGF0aCgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGdldERhdGFQYXRoKClcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGdldCBmb3JtTGFiZWwoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBnZXRGb3JtTGFiZWwoKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICAgaWYgKGlzT2JqZWN0KGxhYmVsKSkge1xuICAgICAgICAgIDsoeyB0ZXh0LCBwcmVmaXgsIHN1ZmZpeCB9ID0gbGFiZWwpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGV4dCA9IGxhYmVsXG4gICAgICAgIH1cbiAgICAgICAgLy8gSXQncyB1cCB0byBgaXRlbUxhYmVsKClgIGVudGlyZWx5IHRvIHByb2R1Y2UgdGhlIGxhYmVsOlxuICAgICAgICBleHRlbmRlZCA9IGZhbHNlXG4gICAgICB9IGVsc2UgaWYgKGlzU3RyaW5nKGl0ZW1MYWJlbCkgJiYgIShpdGVtTGFiZWwgaW4gaXRlbSkpIHtcbiAgICAgICAgLy8gYGl0ZW1MYWJlbGAgY2FuIGJlIGJvdGggYSBrZXksIG9yIHNpbXBseSBhIGxhYmVsLlxuICAgICAgICB0ZXh0ID0gaXRlbUxhYmVsXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBMb29rIHVwIHRoZSBuYW1lIG9uIHRoZSBpdGVtLCBieSB0aGVzZSBydWxlczpcbiAgICAgICAgLy8gMS4gSWYgYGl0ZW1MYWJlbGAgaXMgYSBzdHJpbmcsIHVzZSBpdCBhcyB0aGUgcHJvcGVydHkga2V5XG4gICAgICAgIC8vIDIuIE90aGVyd2lzZSwgaWYgdGhlcmUgYXJlIGNvbHVtbnMsIHVzZSB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0XG4gICAgICAgIC8vIDMuIE90aGVyd2lzZSwgc2VlIGlmIHRoZSBpdGVtIGhhcyBhIHByb3BlcnR5IG5hbWVkICduYW1lJ1xuICAgICAgICBjb25zdCB7IGNvbHVtbnMgfSA9IHNvdXJjZVNjaGVtYVxuICAgICAgICBjb25zdCBrZXkgPSAoXG4gICAgICAgICAgaXNTdHJpbmcoaXRlbUxhYmVsKSAmJiBpdGVtTGFiZWwgfHxcbiAgICAgICAgICBpc0xpc3RTb3VyY2Uoc291cmNlU2NoZW1hKSAmJiBjb2x1bW5zICYmIE9iamVjdC5rZXlzKGNvbHVtbnMpWzBdIHx8XG4gICAgICAgICAgJ25hbWUnXG4gICAgICAgIClcbiAgICAgICAgdGV4dCA9IGl0ZW1ba2V5XVxuICAgICAgfVxuICAgICAgY29uc3QgaGFkTGFiZWwgPSAhIXRleHRcbiAgICAgIC8vIElmIG5vIGxhYmVsIHdhcyBmb3VuZCBzbyBmYXIsIHRyeSB0byBwcm9kdWNlIG9uZSBmcm9tIHRoZSBpbmRleC5cbiAgICAgIGlmICh0ZXh0ID09IG51bGwpIHtcbiAgICAgICAgLy8gQWx3YXlzIHVzZSBleHRlbmRlZCBzdHlsZSB3aGVuIGF1dG8tZ2VuZXJhdGluZyBsYWJlbHMgZnJvbSBpbmRleC9pZDpcbiAgICAgICAgZXh0ZW5kZWQgPSB0cnVlXG4gICAgICAgIHRleHQgPVxuICAgICAgICAgIGlzTGlzdFNvdXJjZShzb3VyY2VTY2hlbWEpICYmIGluZGV4ICE9PSBudWxsXG4gICAgICAgICAgICA/ICh0ZXh0ID0gYCR7aW5kZXggKyAxfWApXG4gICAgICAgICAgICA6ICcnXG4gICAgICB9XG4gICAgICBpZiAoZXh0ZW5kZWQpIHtcbiAgICAgICAgY29uc3QgZm9ybUxhYmVsID0gZ2V0Rm9ybUxhYmVsKClcbiAgICAgICAgaWYgKGZvcm1MYWJlbCkge1xuICAgICAgICAgIC8vIElmIGEgbGFiZWwgd2FzIHByb3ZpZGVkLCBwdXQgaW4gcXVvdGVzIHdoZW4gcHJlZml4ZWQgd2l0aCB0aGVcbiAgICAgICAgICAvLyBmb3JtIGxhYmVsIGZvciB0aGUgZXh0ZW5kZWQgc3R5bGU6XG4gICAgICAgICAgdGV4dCA9IGAke2Zvcm1MYWJlbH0gJHtoYWRMYWJlbCA/IGAnJHt0ZXh0fSdgIDogdGV4dH1gXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBhc09iamVjdCA/IHsgdGV4dCwgcHJlZml4LCBzdWZmaXggfSA6IHRleHRcbiAgICB9XG4gIH1cbn1cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG5zbG90KG5hbWU9XCJiZWZvcmVcIilcbi5kaXRvLXNjaGVtYShcbiAgdi1iaW5kPVwiJGF0dHJzXCJcbilcbiAgLmRpdG8tc2NoZW1hLWNvbnRlbnRcbiAgICAuZGl0by1zY2hlbWEtaGVhZGVyKFxuICAgICAgdi1pZj1cImhhc0xhYmVsIHx8IGhhc1RhYnMgfHwgY2xpcGJvYXJkXCJcbiAgICAgIDpjbGFzcz1cInsgJ2RpdG8tc2NoZW1hLW1lbnUtaGVhZGVyJzogbWVudUhlYWRlciB9XCJcbiAgICApXG4gICAgICBEaXRvTGFiZWwoXG4gICAgICAgIHYtaWY9XCJoYXNMYWJlbFwiXG4gICAgICAgIDpsYWJlbD1cImxhYmVsXCJcbiAgICAgICAgOmRhdGFQYXRoPVwiZGF0YVBhdGhcIlxuICAgICAgICA6Y29sbGFwc2libGU9XCJjb2xsYXBzaWJsZVwiXG4gICAgICAgIDpjb2xsYXBzZWQ9XCIhb3BlbmVkXCJcbiAgICAgICAgQGV4cGFuZD1cIm9uRXhwYW5kXCJcbiAgICAgIClcbiAgICAgICAgLy8tIFBhc3MgZWRpdC1idXR0b25zIHRocm91Z2ggdG8gZGl0by1sYWJlbCdzIG93biBlZGl0LWJ1dHRvbnMgc2xvdDpcbiAgICAgICAgdGVtcGxhdGUoXG4gICAgICAgICAgdi1pZj1cImlubGluZWRcIlxuICAgICAgICAgICNlZGl0LWJ1dHRvbnNcbiAgICAgICAgKVxuICAgICAgICAgIHNsb3QobmFtZT1cImVkaXQtYnV0dG9uc1wiKVxuICAgICAgRGl0b1RhYnMoXG4gICAgICAgIHYtaWY9XCJ0YWJzXCJcbiAgICAgICAgOnRhYnM9XCJ0YWJzXCJcbiAgICAgICAgOnNlbGVjdGVkVGFiPVwic2VsZWN0ZWRUYWJcIlxuICAgICAgKVxuICAgICAgRGl0b0NsaXBib2FyZChcbiAgICAgICAgOmNsaXBib2FyZD1cImNsaXBib2FyZFwiXG4gICAgICAgIDpkYXRhUGF0aD1cImRhdGFQYXRoXCJcbiAgICAgICAgOmRhdGE9XCJkYXRhXCJcbiAgICAgIClcbiAgICB0ZW1wbGF0ZShcbiAgICAgIHYtaWY9XCJoYXNUYWJzXCJcbiAgICApXG4gICAgICBEaXRvUGFuZS5kaXRvLXBhbmUtdGFiKFxuICAgICAgICB2LWZvcj1cIih0YWJTY2hlbWEsIHRhYikgaW4gdGFic1wiXG4gICAgICAgIHJlZj1cInRhYnNcIlxuICAgICAgICA6a2V5PVwidGFiXCJcbiAgICAgICAgOnZpc2libGU9XCJzZWxlY3RlZFRhYiA9PT0gdGFiXCJcbiAgICAgICAgOnRhYj1cInRhYlwiXG4gICAgICAgIDpzY2hlbWE9XCJ0YWJTY2hlbWFcIlxuICAgICAgICA6ZGF0YVBhdGg9XCJkYXRhUGF0aFwiXG4gICAgICAgIDpkYXRhPVwiZGF0YVwiXG4gICAgICAgIDptZXRhPVwibWV0YVwiXG4gICAgICAgIDpzdG9yZT1cInN0b3JlXCJcbiAgICAgICAgOnNpbmdsZT1cIiFpbmxpbmVkICYmICFoYXNNYWluUGFuZVwiXG4gICAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICAgICAgOmdlbmVyYXRlTGFiZWxzPVwiZ2VuZXJhdGVMYWJlbHNcIlxuICAgICAgKVxuICAgIFRyYW5zaXRpb25IZWlnaHQoOmVuYWJsZWQ9XCJpbmxpbmVkXCIpXG4gICAgICBEaXRvUGFuZS5kaXRvLXBhbmUtbWFpbihcbiAgICAgICAgdi1pZj1cImhhc01haW5QYW5lICYmIG9wZW5lZFwiXG4gICAgICAgIHJlZj1cImNvbXBvbmVudHNcIlxuICAgICAgICA6c2NoZW1hPVwic2NoZW1hXCJcbiAgICAgICAgOmRhdGFQYXRoPVwiZGF0YVBhdGhcIlxuICAgICAgICA6ZGF0YT1cImRhdGFcIlxuICAgICAgICA6bWV0YT1cIm1ldGFcIlxuICAgICAgICA6c3RvcmU9XCJzdG9yZVwiXG4gICAgICAgIDpzaW5nbGU9XCIhaW5saW5lZCAmJiAhaGFzVGFic1wiXG4gICAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICAgICAgOmdlbmVyYXRlTGFiZWxzPVwiZ2VuZXJhdGVMYWJlbHNcIlxuICAgICAgKVxuICAgIHNsb3QoXG4gICAgICB2LWlmPVwiIWlubGluZWQgJiYgaXNQb3B1bGF0ZWRcIlxuICAgICAgbmFtZT1cImJ1dHRvbnNcIlxuICAgIClcbiAgdGVtcGxhdGUoXG4gICAgdi1pZj1cImlubGluZWRcIlxuICApXG4gICAgc2xvdChcbiAgICAgIHYtaWY9XCIhaGFzTGFiZWxcIlxuICAgICAgbmFtZT1cImVkaXQtYnV0dG9uc1wiXG4gICAgKVxuICB0ZW1wbGF0ZShcbiAgICB2LWVsc2UtaWY9XCJpc1BvcHVsYXRlZFwiXG4gIClcbiAgICBEaXRvUGFuZWxzKFxuICAgICAgOnBhbmVscz1cInBhbmVsRW50cmllc1wiXG4gICAgICA6ZGF0YT1cImRhdGFcIlxuICAgICAgOm1ldGE9XCJtZXRhXCJcbiAgICAgIDpzdG9yZT1cInN0b3JlXCJcbiAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICApXG5zbG90KG5hbWU9XCJhZnRlclwiKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCB7XG4gIGlzT2JqZWN0LFxuICBpc0FycmF5LFxuICBpc0Z1bmN0aW9uLFxuICBpc1JlZ0V4cCxcbiAgcGFyc2VEYXRhUGF0aCxcbiAgbm9ybWFsaXplRGF0YVBhdGgsXG4gIGxhYmVsaXplXG59IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgeyBUcmFuc2l0aW9uSGVpZ2h0IH0gZnJvbSAnQGRpdG9qcy91aS9zcmMnXG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuaW1wb3J0IEl0ZW1NaXhpbiBmcm9tICcuLi9taXhpbnMvSXRlbU1peGluLmpzJ1xuaW1wb3J0IHsgYXBwZW5kRGF0YVBhdGgsIGdldFBhcmVudEl0ZW0gfSBmcm9tICcuLi91dGlscy9kYXRhLmpzJ1xuaW1wb3J0IHtcbiAgZ2V0TmFtZWRTY2hlbWFzLFxuICBnZXRQYW5lbEVudHJpZXMsXG4gIHNldERlZmF1bHRWYWx1ZXMsXG4gIHByb2Nlc3NEYXRhXG59IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcbmltcG9ydCB7IGdldFN0b3JlQWNjZXNzb3IgfSBmcm9tICcuLi91dGlscy9hY2Nlc3Nvci5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvU2NoZW1hJywge1xuICBtaXhpbnM6IFtJdGVtTWl4aW5dLFxuICBjb21wb25lbnRzOiB7IFRyYW5zaXRpb25IZWlnaHQgfSxcblxuICBwcm92aWRlKCkge1xuICAgIHJldHVybiB7XG4gICAgICAkc2NoZW1hQ29tcG9uZW50OiAoKSA9PiB0aGlzXG4gICAgfVxuICB9LFxuXG4gIGluamVjdDogW1xuICAgICckc2NoZW1hUGFyZW50Q29tcG9uZW50J1xuICBdLFxuXG4gIHByb3BzOiB7XG4gICAgc2NoZW1hOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBkYXRhUGF0aDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICcnIH0sXG4gICAgZGF0YTogeyB0eXBlOiBPYmplY3QsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBtZXRhOiB7IHR5cGU6IE9iamVjdCwgZGVmYXVsdDogKCkgPT4gKHt9KSB9LFxuICAgIHN0b3JlOiB7IHR5cGU6IE9iamVjdCwgZGVmYXVsdDogKCkgPT4gKHt9KSB9LFxuICAgIGxhYmVsOiB7IHR5cGU6IFtTdHJpbmcsIE9iamVjdF0sIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBpbmxpbmVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBjb2xsYXBzZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBjb2xsYXBzaWJsZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGdlbmVyYXRlTGFiZWxzOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWUgfSxcbiAgICBoYXNPd25EYXRhOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgbWVudUhlYWRlcjogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICBjb25zdCB7IGRhdGEgfSA9IHRoaXMuc2NoZW1hXG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIEFsbG93IHNjaGVtYSB0byBwcm92aWRlIG1vcmUgZGF0YSB0aHJvdWdoIGBzY2hlbWEuZGF0YWAsIHZ1ZS1zdHlsZTpcbiAgICAgIC4uLihcbiAgICAgICAgZGF0YSAmJiBpc0Z1bmN0aW9uKGRhdGEpXG4gICAgICAgICAgPyBkYXRhKHRoaXMuY29udGV4dClcbiAgICAgICAgICA6IGRhdGFcbiAgICAgICksXG4gICAgICBjb21wb25lbnRzUmVnaXN0cnk6IHt9LFxuICAgICAgcGFuZXNSZWdpc3RyeToge30sXG4gICAgICBwYW5lbHNSZWdpc3RyeToge31cbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBzY2hlbWFDb21wb25lbnQoKSB7XG4gICAgICAvLyBPdmVycmlkZSBEaXRvTWl4aW4ncyBzY2hlbWFDb21wb25lbnQoKSB3aGljaCB1c2VzIHRoZSBpbmplY3RlZCB2YWx1ZS5cbiAgICAgIHJldHVybiB0aGlzXG4gICAgfSxcblxuICAgIHBhcmVudFNjaGVtYUNvbXBvbmVudCgpIHtcbiAgICAgIC8vIERvbid0IHJldHVybiB0aGUgYWN0dWFsIHBhcmVudCBzY2hlbWEgaXMgdGhpcyBzY2hlbWEgaGFuZGxlcyBpdHMgb3duXG4gICAgICAvLyBkYXRhLiBUaGlzIHByZXZlbnRzIGRlbGVnYXRpbmcgZXZlbnRzIHRvIHRoZSBwYXJlbnQsIGFuZCByZWdpc3RlcmluZ1xuICAgICAgLy8gY29tcG9uZW50cyB3aXRoIHRoZSBwYXJlbnQgdGhhdCB3b3VsZCBjYXVzZSBpdCB0byBzZXQgaXNEaXJ0eSBmbGFncy5cbiAgICAgIHJldHVybiB0aGlzLmhhc093bkRhdGEgPyBudWxsIDogdGhpcy5wYXJlbnRDb21wb25lbnQuc2NoZW1hQ29tcG9uZW50XG4gICAgfSxcblxuICAgIHBhbmVsRW50cmllcygpIHtcbiAgICAgIGNvbnN0IHBhbmVsRW50cmllcyA9IGdldFBhbmVsRW50cmllcyh0aGlzLnNjaGVtYS5wYW5lbHMsICcnKVxuICAgICAgZm9yIChjb25zdCBwYW5lIG9mIHRoaXMucGFuZXMpIHtcbiAgICAgICAgcGFuZWxFbnRyaWVzLnB1c2goLi4ucGFuZS5wYW5lbEVudHJpZXMpXG4gICAgICB9XG4gICAgICByZXR1cm4gcGFuZWxFbnRyaWVzXG4gICAgfSxcblxuICAgIHRhYnMoKSB7XG4gICAgICByZXR1cm4gZ2V0TmFtZWRTY2hlbWFzKHRoaXMuc2NoZW1hLnRhYnMpXG4gICAgfSxcblxuICAgIHNlbGVjdGVkVGFiKCkge1xuICAgICAgY29uc3QgY3VycmVudFRhYiA9IHRoaXMuJHJvdXRlLmhhc2g/LnNsaWNlKDEpIHx8IG51bGxcbiAgICAgIGNvbnN0IHRhYiA9XG4gICAgICAgIGN1cnJlbnRUYWIgJiYgdGhpcy5zaG91bGRSZW5kZXIodGhpcy50YWJzW2N1cnJlbnRUYWJdKVxuICAgICAgICAgID8gY3VycmVudFRhYlxuICAgICAgICAgIDogdGhpcy5kZWZhdWx0VGFiPy5uYW1lIHx8IG51bGxcbiAgICAgIGlmICh0YWIgIT09IGN1cnJlbnRUYWIpIHtcbiAgICAgICAgLy8gVE9ETzogTW92ZSB0aGlzIHdhdGNoZXIhXG4gICAgICAgIC8vIEFueSB0YWIgY2hhbmdlIG5lZWRzIHRvIGJlIHJlZmxlY3RlZCBpbiB0aGUgcm91dGVyIGFsc28uXG4gICAgICAgIHRoaXMuJHJvdXRlci5yZXBsYWNlKHsgaGFzaDogYCMke3RhYn1gIH0pXG4gICAgICB9XG4gICAgICByZXR1cm4gdGFiXG4gICAgfSxcblxuICAgIGRlZmF1bHRUYWIoKSB7XG4gICAgICBsZXQgZmlyc3QgPSBudWxsXG4gICAgICBpZiAodGhpcy50YWJzKSB7XG4gICAgICAgIGZvciAoY29uc3QgdGFiIG9mIE9iamVjdC52YWx1ZXModGhpcy50YWJzKSkge1xuICAgICAgICAgIGNvbnN0IHsgZGVmYXVsdFRhYiB9ID0gdGFiXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgaXNGdW5jdGlvbihkZWZhdWx0VGFiKVxuICAgICAgICAgICAgICA/IGRlZmF1bHRUYWIodGhpcy5jb250ZXh0KVxuICAgICAgICAgICAgICA6IGRlZmF1bHRUYWJcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiB0YWJcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFmaXJzdCkge1xuICAgICAgICAgICAgZmlyc3QgPSB0YWJcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmaXJzdFxuICAgIH0sXG5cbiAgICBjbGlwYm9hcmQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY2hlbWE/LmNsaXBib2FyZFxuICAgIH0sXG5cbiAgICBwYXJlbnREYXRhKCkge1xuICAgICAgY29uc3QgZGF0YSA9IGdldFBhcmVudEl0ZW0odGhpcy5yb290RGF0YSwgdGhpcy5kYXRhUGF0aCwgZmFsc2UpXG4gICAgICByZXR1cm4gZGF0YSAhPT0gdGhpcy5kYXRhID8gZGF0YSA6IG51bGxcbiAgICB9LFxuXG4gICAgcHJvY2Vzc2VkRGF0YSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NEYXRhKHsgdGFyZ2V0OiAnc2VydmVyJywgc2NoZW1hT25seTogdHJ1ZSB9KVxuICAgIH0sXG5cbiAgICBjbGlwYm9hcmREYXRhKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJHNjaGVtYTogdGhpcy5zY2hlbWEubmFtZSxcbiAgICAgICAgLi4udGhpcy5wcm9jZXNzRGF0YSh7IHRhcmdldDogJ2NsaXBib2FyZCcsIHNjaGVtYU9ubHk6IHRydWUgfSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gVGhlIGZvbGxvd2luZyBjb21wdXRlZCBwcm9wZXJ0aWVzIGFyZSBzaW1pbGFyIHRvIGBEaXRvQ29udGV4dGBcbiAgICAvLyBwcm9wZXJ0aWVzLCBzbyB0aGF0IHdlIGNhbiBhY2Nlc3MgdGhlc2Ugb24gYHRoaXNgIGFzIHdlbGw6XG4gICAgLy8gTk9URTogV2hpbGUgaW50ZXJuYWxseSwgd2Ugc3BlYWsgb2YgYGRhdGFgLCBpbiB0aGUgQVBJIHN1cmZhY2UgdGhlXG4gICAgLy8gdGVybSBgaXRlbWAgaXMgdXNlZCBmb3IgdGhlIGRhdGEgdGhhdCByZWxhdGVzIHRvIGVkaXRpbmcgb2JqZWN0cy5cbiAgICAvLyBOT1RFOiBUaGlzIHNob3VsZCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIGFzOlxuICAgIC8vIHJldHVybiBnZXRJdGVtKHRoaXMucm9vdERhdGEsIHRoaXMuZGF0YVBhdGgsIGZhbHNlKVxuICAgIGl0ZW0oKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhXG4gICAgfSxcblxuICAgIHBhcmVudEl0ZW0oKSB7XG4gICAgICByZXR1cm4gdGhpcy5wYXJlbnREYXRhXG4gICAgfSxcblxuICAgIHJvb3RJdGVtKCkge1xuICAgICAgcmV0dXJuIHRoaXMucm9vdERhdGFcbiAgICB9LFxuXG4gICAgcHJvY2Vzc2VkSXRlbSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NlZERhdGFcbiAgICB9LFxuXG4gICAgY2xpcGJvYXJkSXRlbSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmNsaXBib2FyZERhdGFcbiAgICB9LFxuXG4gICAgZm9ybUxhYmVsKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0TGFiZWwoXG4gICAgICAgIHRoaXMuZ2V0SXRlbUZvcm1TY2hlbWEodGhpcy5zb3VyY2VTY2hlbWEsIHRoaXMuZGF0YSwgdGhpcy5jb250ZXh0KVxuICAgICAgKVxuICAgIH0sXG5cbiAgICBpc0RpcnR5KCkge1xuICAgICAgcmV0dXJuIHRoaXMuc29tZUNvbXBvbmVudChpdCA9PiBpdC5pc0RpcnR5KVxuICAgIH0sXG5cbiAgICBpc1RvdWNoZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zb21lQ29tcG9uZW50KGl0ID0+IGl0LmlzVG91Y2hlZClcbiAgICB9LFxuXG4gICAgaXNWYWxpZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmV2ZXJ5Q29tcG9uZW50KGl0ID0+IGl0LmlzVmFsaWQpXG4gICAgfSxcblxuICAgIGlzVmFsaWRhdGVkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZXZlcnlDb21wb25lbnQoaXQgPT4gaXQuaXNWYWxpZGF0ZWQpXG4gICAgfSxcblxuICAgIGhhc0RhdGEoKSB7XG4gICAgICByZXR1cm4gISF0aGlzLmRhdGFcbiAgICB9LFxuXG4gICAgaGFzTGFiZWwoKSB7XG4gICAgICByZXR1cm4gISF0aGlzLmxhYmVsIHx8IHRoaXMuY29sbGFwc2libGVcbiAgICB9LFxuXG4gICAgaGFzVGFicygpIHtcbiAgICAgIHJldHVybiAhdGhpcy5pbmxpbmVkICYmICEhdGhpcy50YWJzXG4gICAgfSxcblxuICAgIGhhc01haW5QYW5lKCkge1xuICAgICAgY29uc3QgeyBjb21wb25lbnRzIH0gPSB0aGlzLnNjaGVtYVxuICAgICAgcmV0dXJuICEhY29tcG9uZW50cyAmJiBPYmplY3Qua2V5cyhjb21wb25lbnRzKS5sZW5ndGggPiAwXG4gICAgfSxcblxuICAgIG9wZW5lZDogZ2V0U3RvcmVBY2Nlc3Nvcignb3BlbmVkJywge1xuICAgICAgZGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmNvbGxhcHNlZFxuICAgICAgfVxuICAgIH0pLFxuXG4gICAgY29tcG9uZW50cygpIHtcbiAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMuY29tcG9uZW50c1JlZ2lzdHJ5KVxuICAgIH0sXG5cbiAgICBwYW5lcygpIHtcbiAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMucGFuZXNSZWdpc3RyeSlcbiAgICB9LFxuXG4gICAgcGFuZWxzKCkge1xuICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5wYW5lbHNSZWdpc3RyeSlcbiAgICB9LFxuXG4gICAgY29tcG9uZW50c0J5RGF0YVBhdGgoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fbGlzdEVudHJpZXNCeURhdGFQYXRoKHRoaXMuY29tcG9uZW50c1JlZ2lzdHJ5KVxuICAgIH0sXG5cbiAgICBwYW5lc0J5RGF0YVBhdGgoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fbGlzdEVudHJpZXNCeURhdGFQYXRoKHRoaXMucGFuZXNSZWdpc3RyeSlcbiAgICB9LFxuXG4gICAgcGFuZWxzQnlEYXRhUGF0aCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9saXN0RW50cmllc0J5RGF0YVBhdGgodGhpcy5wYW5lbHNSZWdpc3RyeSlcbiAgICB9XG4gIH0sXG5cbiAgY3JlYXRlZCgpIHtcbiAgICB0aGlzLl9yZWdpc3Rlcih0cnVlKVxuICAgIHRoaXMuc2V0dXBTY2hlbWFGaWVsZHMoKVxuICAgIC8vIERlbGVnYXRlIGNoYW5nZSBldmVudHMgdGhyb3VnaCB0byBwYXJlbnQgc2NoZW1hOlxuICAgIHRoaXMuZGVsZWdhdGUoJ2NoYW5nZScsIHRoaXMucGFyZW50U2NoZW1hQ29tcG9uZW50KVxuICAgIHRoaXMuZW1pdEV2ZW50KCdpbml0aWFsaXplJykgLy8gTm90IGAnY3JlYXRlJ2AsIHNpbmNlIHRoYXQncyBmb3IgZGF0YS5cbiAgfSxcblxuICB1bm1vdW50ZWQoKSB7XG4gICAgdGhpcy5lbWl0RXZlbnQoJ2Rlc3Ryb3knKVxuICAgIHRoaXMuX3JlZ2lzdGVyKGZhbHNlKVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBnZXRDb21wb25lbnRzQnlEYXRhUGF0aChkYXRhUGF0aCwgbWF0Y2gpIHtcbiAgICAgIHJldHVybiB0aGlzLl9nZXRFbnRyaWVzQnlEYXRhUGF0aChcbiAgICAgICAgdGhpcy5jb21wb25lbnRzQnlEYXRhUGF0aCxcbiAgICAgICAgZGF0YVBhdGgsXG4gICAgICAgIG1hdGNoXG4gICAgICApXG4gICAgfSxcblxuICAgIGdldENvbXBvbmVudEJ5RGF0YVBhdGgoZGF0YVBhdGgsIG1hdGNoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRDb21wb25lbnRzQnlEYXRhUGF0aChkYXRhUGF0aCwgbWF0Y2gpWzBdIHx8IG51bGxcbiAgICB9LFxuXG4gICAgZ2V0Q29tcG9uZW50c0J5TmFtZShkYXRhUGF0aCwgbWF0Y2gpIHtcbiAgICAgIHJldHVybiB0aGlzLl9nZXRFbnRyaWVzQnlOYW1lKHRoaXMuY29tcG9uZW50c0J5RGF0YVBhdGgsIGRhdGFQYXRoLCBtYXRjaClcbiAgICB9LFxuXG4gICAgZ2V0Q29tcG9uZW50QnlOYW1lKG5hbWUsIG1hdGNoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRDb21wb25lbnRzQnlOYW1lKG5hbWUsIG1hdGNoKVswXSB8fCBudWxsXG4gICAgfSxcblxuICAgIGdldENvbXBvbmVudHMoZGF0YVBhdGhPck5hbWUsIG1hdGNoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0RW50cmllcyh0aGlzLmNvbXBvbmVudHNCeURhdGFQYXRoLCBkYXRhUGF0aE9yTmFtZSwgbWF0Y2gpXG4gICAgfSxcblxuICAgIGdldENvbXBvbmVudChkYXRhUGF0aE9yTmFtZSwgbWF0Y2gpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldENvbXBvbmVudHMoZGF0YVBhdGhPck5hbWUsIG1hdGNoKVswXSB8fCBudWxsXG4gICAgfSxcblxuICAgIGdldFBhbmVsc0J5RGF0YVBhdGgoZGF0YVBhdGgsIG1hdGNoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0RW50cmllc0J5RGF0YVBhdGgodGhpcy5wYW5lbHNCeURhdGFQYXRoLCBkYXRhUGF0aCwgbWF0Y2gpXG4gICAgfSxcblxuICAgIGdldFBhbmVsQnlEYXRhUGF0aChkYXRhUGF0aCwgbWF0Y2gpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFBhbmVsc0J5RGF0YVBhdGgoZGF0YVBhdGgsIG1hdGNoKVswXSB8fCBudWxsXG4gICAgfSxcblxuICAgIGdldFBhbmVscyhkYXRhUGF0aE9yTmFtZSwgbWF0Y2gpIHtcbiAgICAgIHJldHVybiB0aGlzLl9nZXRFbnRyaWVzKHRoaXMucGFuZWxzQnlEYXRhUGF0aCwgZGF0YVBhdGhPck5hbWUsIG1hdGNoKVxuICAgIH0sXG5cbiAgICBnZXRQYW5lbChkYXRhUGF0aE9yTmFtZSwgbWF0Y2gpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFBhbmVscyhkYXRhUGF0aE9yTmFtZSwgbWF0Y2gpWzBdIHx8IG51bGxcbiAgICB9LFxuXG4gICAgc29tZUNvbXBvbmVudChjYWxsYmFjaykge1xuICAgICAgcmV0dXJuIHRoaXMuaXNQb3B1bGF0ZWQgJiYgdGhpcy5jb21wb25lbnRzLnNvbWUoY2FsbGJhY2spXG4gICAgfSxcblxuICAgIGV2ZXJ5Q29tcG9uZW50KGNhbGxiYWNrKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1BvcHVsYXRlZCAmJiB0aGlzLmNvbXBvbmVudHMuZXZlcnkoY2FsbGJhY2spXG4gICAgfSxcblxuICAgIG9uRXhwYW5kKGV4cGFuZCkge1xuICAgICAgdGhpcy5lbWl0RXZlbnQoJ2V4cGFuZCcsIHtcbiAgICAgICAgLy8gVE9ETzogQWN0dWFsbHkgZXhwb3NlIHRoaXMgb24gRGl0b0NvbnRleHQ/XG4gICAgICAgIGNvbnRleHQ6IHsgZXhwYW5kIH1cbiAgICAgIH0pXG4gICAgICAvLyBQcmV2ZW50IGNsb3NpbmcgdGhlIHNjaGVtYSB3aXRoIGludmFsaWQgZGF0YSwgc2luY2UgdGhlIGluLWNvbXBvbmVudFxuICAgICAgLy8gdmFsaWRhdGlvbiB3aWxsIG5vdCBiZSBleGVjdXRlZCBvbmNlIGl0J3MgY2xvc2VkLlxuXG4gICAgICAvLyBUT0RPOiBNb3ZlIHZhbGlkYXRpb24gb3V0IG9mIGNvbXBvbmVudHMsIHRvIHNjaGVtYSwganVzdCBsaWtlXG4gICAgICAvLyBwcm9jZXNzaW5nLCBhbmQgdXNlIGBzaG93VmFsaWRhdGlvbkVycm9ycygpYCBmb3IgdGhlIHJlc3VsdGluZyBlcnJvcnMsXG4gICAgICAvLyB0aGVuIHJlbW92ZSB0aGlzIHJlcXVpcmVtZW50LCBzaW5jZSB3ZSBjYW4gdmFsaWRhdGUgY2xvc2VkIGZvcm1zIGFuZFxuICAgICAgLy8gc2NoZW1hcyB0aGVuLlxuICAgICAgaWYgKCF0aGlzLm9wZW5lZCB8fCBleHBhbmQgfHwgdGhpcy52YWxpZGF0ZUFsbCgpKSB7XG4gICAgICAgIHRoaXMub3BlbmVkID0gZXhwYW5kXG4gICAgICB9XG4gICAgfSxcblxuICAgIG9uQ2hhbmdlKCkge1xuICAgICAgdGhpcy5lbWl0RXZlbnQoJ2NoYW5nZScpXG4gICAgfSxcblxuICAgIHJlc2V0VmFsaWRhdGlvbigpIHtcbiAgICAgIGZvciAoY29uc3QgY29tcG9uZW50IG9mIHRoaXMuY29tcG9uZW50cykge1xuICAgICAgICBjb21wb25lbnQucmVzZXRWYWxpZGF0aW9uKClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY2xlYXJFcnJvcnMoKSB7XG4gICAgICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiB0aGlzLmNvbXBvbmVudHMpIHtcbiAgICAgICAgY29tcG9uZW50LmNsZWFyRXJyb3JzKClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZm9jdXMoKSB7XG4gICAgICB0aGlzLnBhcmVudFNjaGVtYUNvbXBvbmVudD8uZm9jdXMoKVxuICAgICAgdGhpcy5vcGVuZWQgPSB0cnVlXG4gICAgfSxcblxuICAgIHZhbGlkYXRlQWxsKG1hdGNoLCBub3RpZnkgPSB0cnVlKSB7XG4gICAgICBjb25zdCB7IGNvbXBvbmVudHNCeURhdGFQYXRoIH0gPSB0aGlzXG4gICAgICBsZXQgZGF0YVBhdGhzXG4gICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgY29uc3QgY2hlY2sgPSBpc0Z1bmN0aW9uKG1hdGNoKVxuICAgICAgICAgID8gbWF0Y2hcbiAgICAgICAgICA6IGlzUmVnRXhwKG1hdGNoKVxuICAgICAgICAgICAgPyBmaWVsZCA9PiBtYXRjaC50ZXN0KGZpZWxkKVxuICAgICAgICAgICAgOiBudWxsXG4gICAgICAgIGRhdGFQYXRocyA9IGNoZWNrXG4gICAgICAgICAgPyBPYmplY3Qua2V5cyhjb21wb25lbnRzQnlEYXRhUGF0aCkuZmlsdGVyKGNoZWNrKVxuICAgICAgICAgIDogaXNBcnJheShtYXRjaClcbiAgICAgICAgICAgID8gbWF0Y2hcbiAgICAgICAgICAgIDogW21hdGNoXVxuICAgICAgfVxuICAgICAgaWYgKG5vdGlmeSkge1xuICAgICAgICB0aGlzLmNsZWFyRXJyb3JzKClcbiAgICAgIH1cbiAgICAgIGxldCBpc1ZhbGlkID0gdHJ1ZVxuICAgICAgbGV0IGZpcnN0ID0gdHJ1ZVxuICAgICAgZGF0YVBhdGhzIHx8PSBPYmplY3Qua2V5cyhjb21wb25lbnRzQnlEYXRhUGF0aClcbiAgICAgIGZvciAoY29uc3QgZGF0YVBhdGggb2YgZGF0YVBhdGhzKSB7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudHMgPSB0aGlzLmdldENvbXBvbmVudHNCeURhdGFQYXRoKGRhdGFQYXRoKVxuICAgICAgICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiBjb21wb25lbnRzKSB7XG4gICAgICAgICAgaWYgKCFjb21wb25lbnQudmFsaWRhdGUobm90aWZ5KSkge1xuICAgICAgICAgICAgLy8gRm9jdXMgZmlyc3QgZXJyb3IgZmllbGRcbiAgICAgICAgICAgIGlmIChub3RpZnkgJiYgZmlyc3QpIHtcbiAgICAgICAgICAgICAgY29tcG9uZW50LmZvY3VzKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpcnN0ID0gZmFsc2VcbiAgICAgICAgICAgIGlzVmFsaWQgPSBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG5vdGlmeSAmJiAhaXNWYWxpZCkge1xuICAgICAgICB0aGlzLm5vdGlmeUVycm9ycygpXG4gICAgICB9XG4gICAgICByZXR1cm4gaXNWYWxpZFxuICAgIH0sXG5cbiAgICB2ZXJpZnlBbGwobWF0Y2gpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlQWxsKG1hdGNoLCBmYWxzZSlcbiAgICB9LFxuXG4gICAgYXN5bmMgc2hvd1ZhbGlkYXRpb25FcnJvcnMoZXJyb3JzLCBmb2N1cykge1xuICAgICAgdGhpcy5jbGVhckVycm9ycygpXG4gICAgICBsZXQgZmlyc3QgPSB0cnVlXG4gICAgICBjb25zdCB1bm1hdGNoZWQgPSBbXVxuICAgICAgZm9yIChjb25zdCBbZGF0YVBhdGgsIGVycnNdIG9mIE9iamVjdC5lbnRyaWVzKGVycm9ycykpIHtcbiAgICAgICAgLy8gSWYgdGhlIHNjaGVtYSBpcyBhIGRhdGEtcm9vdCwgcHJlZml4IGl0cyBvd24gZGF0YVBhdGggdG8gYWxsIGVycm9ycyxcbiAgICAgICAgLy8gc2luY2UgdGhlIGRhdGEgdGhhdCBpdCBzZW5kcyBhbmQgdmFsaWRhdGVzIHdpbGwgYmUgdW5wcmVmaXhlZC5cbiAgICAgICAgY29uc3QgZnVsbERhdGFQYXRoID0gdGhpcy5oYXNPd25EYXRhXG4gICAgICAgICAgPyBhcHBlbmREYXRhUGF0aCh0aGlzLmRhdGFQYXRoLCBkYXRhUGF0aClcbiAgICAgICAgICA6IGRhdGFQYXRoXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMsIHRoaXMuZGF0YVBhdGgsIHRoaXMuaGFzT3duRGF0YSwgZnVsbERhdGFQYXRoKVxuICAgICAgICAvLyBDb252ZXJ0IGZyb20gSmF2YVNjcmlwdCBwcm9wZXJ0eSBhY2Nlc3Mgbm90YXRpb24sIHRvIG91ciBvd24gZm9ybVxuICAgICAgICAvLyBvZiByZWxhdGl2ZSBKU09OIHBvaW50ZXJzIGFzIGRhdGEtcGF0aHM6XG4gICAgICAgIGNvbnN0IGRhdGFQYXRoUGFydHMgPSBwYXJzZURhdGFQYXRoKGZ1bGxEYXRhUGF0aClcbiAgICAgICAgbGV0IGZvdW5kID0gZmFsc2VcbiAgICAgICAgY29uc3QgY29tcG9uZW50cyA9IHRoaXMuZ2V0Q29tcG9uZW50c0J5RGF0YVBhdGgoZGF0YVBhdGhQYXJ0cylcbiAgICAgICAgZm9yIChjb25zdCBjb21wb25lbnQgb2YgY29tcG9uZW50cykge1xuICAgICAgICAgIGlmIChjb21wb25lbnQuc2hvd1ZhbGlkYXRpb25FcnJvcnMoZXJycywgZmlyc3QgJiYgZm9jdXMpKSB7XG4gICAgICAgICAgICBmb3VuZCA9IHRydWVcbiAgICAgICAgICAgIGZpcnN0ID0gZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICAgIC8vIENvdWxkbid0IGZpbmQgYSBjb21wb25lbnQgaW4gYW4gYWN0aXZlIGZvcm0gZm9yIHRoZSBnaXZlbiBkYXRhUGF0aC5cbiAgICAgICAgICAvLyBTZWUgaWYgd2UgY2FuIGZpbmQgYSBjb21wb25lbnQgc2VydmluZyBhIHBhcnQgb2YgdGhlIGRhdGFQYXRoLFxuICAgICAgICAgIC8vIGFuZCB0YWtlIGl0IGZyb20gdGhlcmU6XG4gICAgICAgICAgY29uc3QgcHJvcGVydHkgPSBkYXRhUGF0aFBhcnRzLnBvcCgpXG4gICAgICAgICAgd2hpbGUgKGRhdGFQYXRoUGFydHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50cyA9IHRoaXMuZ2V0Q29tcG9uZW50c0J5RGF0YVBhdGgoZGF0YVBhdGhQYXJ0cylcbiAgICAgICAgICAgIGZvciAoY29uc3QgY29tcG9uZW50IG9mIGNvbXBvbmVudHMpIHtcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGF3YWl0IGNvbXBvbmVudC5uYXZpZ2F0ZVRvQ29tcG9uZW50Py4oXG4gICAgICAgICAgICAgICAgICBmdWxsRGF0YVBhdGgsXG4gICAgICAgICAgICAgICAgICBzdWJDb21wb25lbnRzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZvdW5kID0gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBjb21wb25lbnQgb2Ygc3ViQ29tcG9uZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycnMgPSBlcnJvcnNbY29tcG9uZW50LmRhdGFQYXRoXVxuICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycnMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zaG93VmFsaWRhdGlvbkVycm9ycyhlcnJzLCBmaXJzdCAmJiBmb2N1cylcbiAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm91bmRcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIC8vIEZvdW5kIGEgbmVzdGVkIGZvcm0gdG8gZGlzcGxheSBhdCBsZWFzdCBwYXJ0cyBmbyB0aGUgZXJyb3JzLlxuICAgICAgICAgICAgICAgIC8vIFdlIGNhbid0IHNob3cgYWxsIGVycm9ycyBhdCBvbmNlLCBzbyB3ZSdyZSBkb25lLiBEb24ndCBjYWxsXG4gICAgICAgICAgICAgICAgLy8gYG5vdGlmeUVycm9ycygpYCB5ZXQsIGFzIHdlIGNhbiBvbmx5IGRpc3BsYXkgaXQgb25jZVxuICAgICAgICAgICAgICAgIC8vIGBzaG93VmFsaWRhdGlvbkVycm9ycygpYCB3YXMgY2FsbGVkIGZyb20gYERpdG9Gb3JtLm1vdW50ZWQoKWBcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gU3RpbGwgaGVyZSwgc28ga2VlcCByZW1vdmluZyB0aGUgbGFzdCBwYXJ0IHVudGlsIHdlIGZpbmQgYSBtYXRjaC5cbiAgICAgICAgICAgIGRhdGFQYXRoUGFydHMucG9wKClcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gV2hlbiB0aGUgZXJyb3IgY2FuJ3QgYmUgbWF0Y2hlZCwgYWRkIGl0IHRvIGEgbGlzdCBvZiB1bm1hdGNoZWRcbiAgICAgICAgICAvLyBlcnJvcnMgd2l0aCBkZWNlbnQgbWVzc2FnZSwgdG8gcmVwb3J0IGF0IHRoZSBlbmQuXG4gICAgICAgICAgY29uc3QgZmllbGQgPSBsYWJlbGl6ZShwcm9wZXJ0eSlcbiAgICAgICAgICBmb3IgKGNvbnN0IGVyciBvZiBlcnJzKSB7XG4gICAgICAgICAgICBjb25zdCBwcmVmaXggPSBmaWVsZFxuICAgICAgICAgICAgICA/IGBUaGUgZmllbGQgJHtmaWVsZH1gXG4gICAgICAgICAgICAgIDogYFRoZSAke3RoaXMuZm9ybUxhYmVsfWBcbiAgICAgICAgICAgIHVubWF0Y2hlZC5wdXNoKGAke3ByZWZpeH0gJHtlcnIubWVzc2FnZX1gKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmaXJzdCA9IGZhbHNlXG4gICAgICB9XG4gICAgICBpZiAoIWZpcnN0KSB7XG4gICAgICAgIHRoaXMubm90aWZ5RXJyb3JzKHVubWF0Y2hlZC5qb2luKCdcXG4nKSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgbm90aWZ5RXJyb3JzKG1lc3NhZ2UpIHtcbiAgICAgIHRoaXMubm90aWZ5KHtcbiAgICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgICAgdGl0bGU6ICdWYWxpZGF0aW9uIEVycm9ycycsXG4gICAgICAgIHRleHQ6IG1lc3NhZ2UgfHwgJ1BsZWFzZSBjb3JyZWN0IHRoZSBoaWdobGlnaHRlZCBlcnJvcnMuJ1xuICAgICAgfSlcbiAgICB9LFxuXG4gICAgcmVzZXREYXRhKCkge1xuICAgICAgLy8gV2UgY2FuJ3Qgc2V0IGB0aGlzLmRhdGEgPSAuLi5gIGJlY2F1c2UgaXQncyBhIHByb3BlcnR5LCBidXQgd2UgY2FuIHNldFxuICAgICAgLy8gYWxsIGtub3duIHByb3BlcnRpZXMgb24gaXQgdG8gdGhlIHZhbHVlcyByZXR1cm5lZCBieVxuICAgICAgLy8gYHNldERlZmF1bHRWYWx1ZXMoKWAsIGFzIHRoZXkgYXJlIGFsbCByZWFjdGl2ZSBhbHJlYWR5IGZyb20gdGhlIHN0YXJ0czpcbiAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5kYXRhLCBzZXREZWZhdWx0VmFsdWVzKHRoaXMuc2NoZW1hLCB7fSwgdGhpcykpXG4gICAgICB0aGlzLmNsZWFyRXJyb3JzKClcbiAgICB9LFxuXG4gICAgc2V0RGF0YShkYXRhKSB7XG4gICAgICBmb3IgKGNvbnN0IG5hbWUgaW4gZGF0YSkge1xuICAgICAgICBpZiAobmFtZSBpbiB0aGlzLmRhdGEpIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdnVlL25vLW11dGF0aW5nLXByb3BzXG4gICAgICAgICAgdGhpcy5kYXRhW25hbWVdID0gZGF0YVtuYW1lXVxuICAgICAgICAgIGZvciAoY29uc3QgY29tcG9uZW50IG9mIHRoaXMuZ2V0Q29tcG9uZW50c0J5TmFtZShuYW1lKSkge1xuICAgICAgICAgICAgY29tcG9uZW50Lm1hcmtEaXJ0eSgpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGZpbHRlckRhdGEoZGF0YSkge1xuICAgICAgLy8gRmlsdGVycyBvdXQgYXJyYXlzIGFuZCBvYmplY3RzIHRoYXQgYXJlIGJhY2sgYnkgZGF0YSByZXNvdXJjZXNcbiAgICAgIC8vIHRoZW1zZWx2ZXMsIGFzIHRob3NlIGFyZSBhbHJlYWR5IHRha2luZyBjYXJlIG9mIHRocm91Z2ggdGhlaXIgb3duIEFQSVxuICAgICAgLy8gcmVzb3VyY2UgZW5kLXBvaW50cyBhbmQgc2hvdWxkbid0IGJlIHNldC5cbiAgICAgIGNvbnN0IGNvcHkgPSB7fVxuICAgICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRhdGEpKSB7XG4gICAgICAgIGlmIChpc0FycmF5KHZhbHVlKSB8fCBpc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgICBjb25zdCBjb21wb25lbnRzID0gdGhpcy5nZXRDb21wb25lbnRzQnlOYW1lKG5hbWUpXG4gICAgICAgICAgaWYgKGNvbXBvbmVudHMuc29tZShjb21wb25lbnQgPT4gY29tcG9uZW50LnByb3ZpZGVzRGF0YSkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvcHlbbmFtZV0gPSB2YWx1ZVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNvcHlcbiAgICB9LFxuXG4gICAgcHJvY2Vzc0RhdGEoeyB0YXJnZXQgPSAnY2xpcGJvYXJkJywgc2NoZW1hT25seSA9IHRydWUgfSA9IHt9KSB7XG4gICAgICByZXR1cm4gcHJvY2Vzc0RhdGEoXG4gICAgICAgIHRoaXMuc2NoZW1hLFxuICAgICAgICB0aGlzLnNvdXJjZVNjaGVtYSxcbiAgICAgICAgdGhpcy5kYXRhLFxuICAgICAgICB0aGlzLmRhdGFQYXRoLFxuICAgICAgICB7XG4gICAgICAgICAgLy8gTmVlZGVkIGZvciBEaXRvQ29udGV4dCBoYW5kbGluZyBpbnNpZGUgYHByb2Nlc3NEYXRhYCBhbmRcbiAgICAgICAgICAvLyBgcHJvY2Vzc1NjaGVtYURhdGEoKWA6XG4gICAgICAgICAgY29tcG9uZW50OiB0aGlzLFxuICAgICAgICAgIHNjaGVtYU9ubHksXG4gICAgICAgICAgdGFyZ2V0XG4gICAgICAgIH1cbiAgICAgIClcbiAgICB9LFxuXG4gICAgX3JlZ2lzdGVyKGFkZCkge1xuICAgICAgLy8gYCRzY2hlbWFQYXJlbnRDb21wb25lbnQoKWAgaXMgb25seSBzZXQgaWYgb25lIG9mIHRoZSBhbmNlc3RvcnMgdXNlc1xuICAgICAgLy8gdGhlIGBTY2hlbWFQYXJlbnRNaXhpbmA6XG4gICAgICB0aGlzLiRzY2hlbWFQYXJlbnRDb21wb25lbnQoKT8uX3JlZ2lzdGVyU2NoZW1hQ29tcG9uZW50KHRoaXMsIGFkZClcbiAgICB9LFxuXG4gICAgX3JlZ2lzdGVyQ29tcG9uZW50KGNvbXBvbmVudCwgYWRkKSB7XG4gICAgICB0aGlzLl9yZWdpc3RlckVudHJ5KHRoaXMuY29tcG9uZW50c1JlZ2lzdHJ5LCBjb21wb25lbnQsIGFkZClcbiAgICAgIC8vIE9ubHkgcmVnaXN0ZXIgd2l0aCB0aGUgcGFyZW50IGlmIHNjaGVtYSBzaGFyZXMgZGF0YSB3aXRoIGl0LlxuICAgICAgdGhpcy5wYXJlbnRTY2hlbWFDb21wb25lbnQ/Ll9yZWdpc3RlckNvbXBvbmVudChjb21wb25lbnQsIGFkZClcbiAgICB9LFxuXG4gICAgX3JlZ2lzdGVyUGFuZShwYW5lLCBhZGQpIHtcbiAgICAgIHRoaXMuX3JlZ2lzdGVyRW50cnkodGhpcy5wYW5lc1JlZ2lzdHJ5LCBwYW5lLCBhZGQpXG4gICAgfSxcblxuICAgIF9yZWdpc3RlclBhbmVsKHBhbmVsLCBhZGQpIHtcbiAgICAgIHRoaXMuX3JlZ2lzdGVyRW50cnkodGhpcy5wYW5lbHNSZWdpc3RyeSwgcGFuZWwsIGFkZClcbiAgICB9LFxuXG4gICAgX3JlZ2lzdGVyRW50cnkocmVnaXN0cnksIGVudHJ5LCBhZGQpIHtcbiAgICAgIGNvbnN0IHVpZCA9IGVudHJ5LiR1aWRcbiAgICAgIGlmIChhZGQpIHtcbiAgICAgICAgcmVnaXN0cnlbdWlkXSA9IGVudHJ5XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgcmVnaXN0cnlbdWlkXVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBfbGlzdEVudHJpZXNCeURhdGFQYXRoKHJlZ2lzdHJ5KSB7XG4gICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhyZWdpc3RyeSkucmVkdWNlKChlbnRyaWVzQnlEYXRhUGF0aCwgZW50cnkpID0+IHtcbiAgICAgICAgLy8gTXVsdGlwbGUgZW50cmllcyBjYW4gYmUgbGlua2VkIHRvIHRoZSBzYW1lIGRhdGEtcGF0aCwgZS5nLiB3aGVuXG4gICAgICAgIC8vIHRoZXJlIGFyZSB0YWJzLiBMaW5rIGVhY2ggZGF0YS1wYXRoIHRvIGFuIGFycmF5IG9mIGVudHJpZXMuXG4gICAgICAgIGNvbnN0IHsgZGF0YVBhdGggfSA9IGVudHJ5XG4gICAgICAgIGNvbnN0IGVudHJpZXMgPSAoZW50cmllc0J5RGF0YVBhdGhbZGF0YVBhdGhdIHx8PSBbXSlcbiAgICAgICAgZW50cmllcy5wdXNoKGVudHJ5KVxuICAgICAgICByZXR1cm4gZW50cmllc0J5RGF0YVBhdGhcbiAgICAgIH0sIHt9KVxuICAgIH0sXG5cbiAgICBfZ2V0RW50cmllcyhlbnRyaWVzQnlEYXRhUGF0aCwgZGF0YVBhdGgsIG1hdGNoKSB7XG4gICAgICByZXR1cm4gbm9ybWFsaXplRGF0YVBhdGgoZGF0YVBhdGgpLnN0YXJ0c1dpdGgodGhpcy5kYXRhUGF0aClcbiAgICAgICAgPyB0aGlzLl9nZXRFbnRyaWVzQnlEYXRhUGF0aChlbnRyaWVzQnlEYXRhUGF0aCwgZGF0YVBhdGgsIG1hdGNoKVxuICAgICAgICA6IHRoaXMuX2dldEVudHJpZXNCeU5hbWUoZW50cmllc0J5RGF0YVBhdGgsIGRhdGFQYXRoLCBtYXRjaClcbiAgICB9LFxuXG4gICAgX2dldEVudHJpZXNCeURhdGFQYXRoKGVudHJpZXNCeURhdGFQYXRoLCBkYXRhUGF0aCwgbWF0Y2gpIHtcbiAgICAgIHJldHVybiB0aGlzLl9maWx0ZXJFbnRyaWVzKFxuICAgICAgICBlbnRyaWVzQnlEYXRhUGF0aFtub3JtYWxpemVEYXRhUGF0aChkYXRhUGF0aCldIHx8IFtdLFxuICAgICAgICBtYXRjaFxuICAgICAgKVxuICAgIH0sXG5cbiAgICBfZ2V0RW50cmllc0J5TmFtZShlbnRyaWVzQnlEYXRhUGF0aCwgbmFtZSwgbWF0Y2gpIHtcbiAgICAgIHJldHVybiB0aGlzLl9maWx0ZXJFbnRyaWVzKFxuICAgICAgICBlbnRyaWVzQnlEYXRhUGF0aFthcHBlbmREYXRhUGF0aCh0aGlzLmRhdGFQYXRoLCBuYW1lKV0gfHwgW10sXG4gICAgICAgIG1hdGNoXG4gICAgICApXG4gICAgfSxcblxuICAgIF9maWx0ZXJFbnRyaWVzKGVudHJpZXMsIG1hdGNoKSB7XG4gICAgICByZXR1cm4gbWF0Y2ggPyBlbnRyaWVzLmZpbHRlcihtYXRjaCkgOiBlbnRyaWVzXG4gICAgfVxuICB9XG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tc2NoZW1hIHtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgLy8gVG8gZGlzcGxheSBzY2hlbWEgbmV4dCB0byBwYW5lbHM6XG4gIGRpc3BsYXk6IGZsZXg7XG4gIG1pbi1oZWlnaHQ6IDEwMCU7XG5cbiAgPiAuZGl0by1zY2hlbWEtY29udGVudCB7XG4gICAgZmxleDogMSAxIDEwMCU7XG4gICAgLy8gU28gdGhhdCBzY2hlbWEgYnV0dG9ucyBjYW4gYmUgc3RpY2t5IHRvIHRoZSBib3R0b206XG4gICAgZGlzcGxheTogZ3JpZDtcbiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IG1pbi1jb250ZW50O1xuXG4gICAgPiAqOm9ubHktY2hpbGQge1xuICAgICAgZ3JpZC1yb3ctZW5kOiBub25lO1xuICAgIH1cblxuICAgIG1heC13aWR0aDogJGNvbnRlbnQtd2lkdGg7XG4gICAgcGFkZGluZzogJGNvbnRlbnQtcGFkZGluZztcbiAgfVxuXG4gID4gLmRpdG8tYnV0dG9ucyxcbiAgPiAuZGl0by1wYW5lbHMge1xuICAgIGZsZXg6IDEgMSAwJTtcbiAgfVxuXG4gID4gLmRpdG8tYnV0dG9ucyB7XG4gICAgbWFyZ2luLWxlZnQ6ICRmb3JtLXNwYWNpbmc7XG4gIH1cblxuICA+IC5kaXRvLXBhbmVscyB7XG4gICAgcGFkZGluZzogJGNvbnRlbnQtcGFkZGluZyAkY29udGVudC1wYWRkaW5nICRjb250ZW50LXBhZGRpbmcgMDtcbiAgfVxuXG4gIC8vIERpc3BsYXkgYSBydWxlciBiZXR3ZWVuIHRhYmJlZCBjb21wb25lbnRzIGFuZCB0b3dhcmRzIHRoZSAuZGl0by1idXR0b25zXG4gIC5kaXRvLXBhbmUtdGFiICsgLmRpdG8tcGFuZS1tYWluIHtcbiAgICAmOjpiZWZvcmUge1xuICAgICAgLy8gVXNlIGEgcHNldWRvIGVsZW1lbnQgdG8gZGlzcGxheSBhIHJ1bGVyIHdpdGggcHJvcGVyIG1hcmdpbnNcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgY29udGVudDogJyc7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGJvcmRlci1ib3R0b206ICRib3JkZXItc3R5bGU7XG4gICAgICAvLyBBZGQgcmVtb3ZlZCAkZm9ybS1zcGFjaW5nIGFnYWluIHRvIHRoZSBydWxlclxuICAgICAgbWFyZ2luOiAkY29udGVudC1wYWRkaW5nICRmb3JtLXNwYWNpbmctaGFsZiAkZm9ybS1zcGFjaW5nLWhhbGY7XG4gICAgfVxuICB9XG59XG5cbi5kaXRvLXNjaGVtYS1oZWFkZXIge1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG5cbiAgLmRpdG8tdGFicyxcbiAgLmRpdG8tY2xpcGJvYXJkIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLXNlbGY6IGZsZXgtZW5kO1xuICB9XG5cbiAgLmRpdG8tY2xpcGJvYXJkIHtcbiAgICAmOm9ubHktY2hpbGQge1xuICAgICAgbWFyZ2luLWxlZnQ6IGF1dG87XG4gICAgfVxuXG4gICAgLmRpdG8tYnV0dG9uIHtcbiAgICAgIG1hcmdpbjogMCAwICR0YWItbWFyZ2luICR0YWItbWFyZ2luO1xuICAgIH1cbiAgfVxuXG4gICYuZGl0by1zY2hlbWEtbWVudS1oZWFkZXIge1xuICAgIC8vIEJyaW5nIHRoZSB0YWJzIHVwIHRvIHRoZSBtZW51LlxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBoZWlnaHQ6ICRtZW51LWhlaWdodDtcbiAgICBwYWRkaW5nOiAwICRtZW51LXBhZGRpbmctaG9yO1xuICAgIG1heC13aWR0aDogJGNvbnRlbnQtd2lkdGg7XG4gICAgdG9wOiAwO1xuICAgIGxlZnQ6IDA7XG4gICAgcmlnaHQ6IDA7XG4gICAgei1pbmRleDogJG1lbnUtei1pbmRleDtcbiAgICAvLyBUdXJuIG9mZiBwb2ludGVyIGV2ZW50cyBzbyB0aGF0IERpdG9UcmFpbCBrZWVwcyByZWNlaXZpbmcgZXZlbnRzLi4uXG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgLy8gLi4uYnV0IGFsbG93IGludGVyYWN0aW9uIHdpdGggdGhlIHRhYnMgYW5kIGJ1dHRvbnMgKGUuZy4gY2xpcGJvYXJkKVxuICAgIC8vIGxheWVyZWQgb24gdG9wIG9mIERpdG9UcmFpbC5cbiAgICAuZGl0by10YWJzLFxuICAgIC5kaXRvLWJ1dHRvbnMge1xuICAgICAgcG9pbnRlci1ldmVudHM6IGF1dG87XG4gICAgICBsaW5lLWhlaWdodDogJG1lbnUtbGluZS1oZWlnaHQ7XG4gICAgICBmb250LXNpemU6ICRtZW51LWZvbnQtc2l6ZTtcbiAgICB9XG4gIH1cblxuICBidXR0b24uZGl0by1sYWJlbCB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgLy8gQ2F0Y2ggYWxsIGNsaWNrcywgZXZlbiB3aGVuIGl0IHdvdWxkIGJlIHBhcnRpYWxseSBjb3ZlcmVkIGJ5IHNjaGVtYS5cbiAgICB6LWluZGV4OiAxO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbkRpdG9TY2hlbWEuZGl0by1zY2hlbWEtaW5saW5lZChcbiAgOnNjaGVtYT1cInNjaGVtYVwiXG4gIDpkYXRhUGF0aD1cImRhdGFQYXRoXCJcbiAgOmRhdGE9XCJkYXRhXCJcbiAgOm1ldGE9XCJtZXRhXCJcbiAgOnN0b3JlPVwic3RvcmVcIlxuICA6bGFiZWw9XCJpc0NvbXBhY3QgPyBudWxsIDogbGFiZWxcIlxuICA6aW5saW5lZD1cInRydWVcIlxuICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gIDpjb2xsYXBzZWQ9XCJjb2xsYXBzZWRcIlxuICA6Y29sbGFwc2libGU9XCJjb2xsYXBzaWJsZVwiXG4gIDpnZW5lcmF0ZUxhYmVscz1cIiFpc0NvbXBhY3RcIlxuICA6Y2xhc3M9XCJ7ICdkaXRvLXNjaGVtYS1jb21wYWN0JzogaXNDb21wYWN0IH1cIlxuKVxuICAvLy0gUmVuZGVyIGRpdG8tZWRpdC1idXR0b25zIGZvciBpbmxpbmVkIHNjaGVtYXMgc2VwYXJhdGVseSBmcm9tIGFsbFxuICAvLy0gb3RoZXJzIGluIGBUeXBlTGlzdGAgYXMgYSBzY29wZSwgZm9yIGJldHRlciBoYW5kbGluZyBvZiBsYXlvdXQuXG4gIHRlbXBsYXRlKCNlZGl0LWJ1dHRvbnMpXG4gICAgRGl0b0VkaXRCdXR0b25zKFxuICAgICAgdi1pZj1cImRlbGV0YWJsZSB8fCBkcmFnZ2FibGUgfHwgZWRpdGFibGVcIlxuICAgICAgOmRlbGV0YWJsZT1cImRlbGV0YWJsZVwiXG4gICAgICA6ZHJhZ2dhYmxlPVwiZHJhZ2dhYmxlXCJcbiAgICAgIDplZGl0YWJsZT1cImVkaXRhYmxlXCJcbiAgICAgIDplZGl0UGF0aD1cImVkaXRQYXRoXCJcbiAgICAgIDpzY2hlbWE9XCJzY2hlbWFcIlxuICAgICAgOmRhdGFQYXRoPVwiZGF0YVBhdGhcIlxuICAgICAgOmRhdGE9XCJkYXRhXCJcbiAgICAgIDptZXRhPVwibWV0YVwiXG4gICAgICA6c3RvcmU9XCJzdG9yZVwiXG4gICAgICBAZGVsZXRlPVwiJGVtaXQoJ2RlbGV0ZScpXCJcbiAgICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCB7IGlzQ29tcGFjdCB9IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b1NjaGVtYUlubGluZWQnLCB7XG4gIGVtaXRzOiBbJ2RlbGV0ZSddLFxuXG4gIHByb3BzOiB7XG4gICAgc2NoZW1hOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBkYXRhUGF0aDogeyB0eXBlOiBTdHJpbmcsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZGF0YTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgbWV0YTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgc3RvcmU6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGxhYmVsOiB7IHR5cGU6IFtTdHJpbmcsIE9iamVjdF0sIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGNvbGxhcHNlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGNvbGxhcHNpYmxlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgZHJhZ2dhYmxlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgZWRpdGFibGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBkZWxldGFibGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBlZGl0UGF0aDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgaXNDb21wYWN0KCkge1xuICAgICAgcmV0dXJuIGlzQ29tcGFjdCh0aGlzLnNjaGVtYSlcbiAgICB9LFxuXG4gICAgaGFzTGFiZWwoKSB7XG4gICAgICByZXR1cm4gIXRoaXMuaXNDb21wYWN0ICYmICEhdGhpcy5sYWJlbFxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXNjaGVtYS1pbmxpbmVkIHtcbiAgPiAuZGl0by1zY2hlbWEtY29udGVudCB7XG4gICAgcGFkZGluZzogMDtcblxuICAgID4gLmRpdG8tc2NoZW1hLWhlYWRlciB7XG4gICAgICAvLyBDaGFuZ2Ugc3BhY2luZyBzbyAuZGl0by1sYWJlbCBjb3ZlcnMgdGhlIGZ1bGwgLmRpdG8tc2NoZW1hLWhlYWRlci5cbiAgICAgIG1hcmdpbjogLSRmb3JtLXNwYWNpbmc7XG5cbiAgICAgIC5kaXRvLWxhYmVsIHtcbiAgICAgICAgLy8gQWRkIHJlbW92ZWQgJGZvcm0tc3BhY2luZyBhZ2FpblxuICAgICAgICAtLWxhYmVsLXBhZGRpbmc6ICN7JGZvcm0tc3BhY2luZ307XG5cbiAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgYm94LXNpemluZzogY29udGVudC1ib3g7XG4gICAgICAgIC8vIEJlY2F1c2UgdGFibGVzIGhhdmUgYSBmdW5ueSB3YXkgb2YgYWxsb3dpbmcgdG9vIG11Y2ggd2lkdGggZ3Jvd3RoOlxuICAgICAgICBtYXgtd2lkdGg6ICRjb250ZW50LXdpZHRoO1xuICAgICAgICAvLyBQcmV2ZW50IGNvbGxhcHNpbmcgdG8gbWluLWhlaWdodCB3aGVuIGFsb25lIGluXG4gICAgICAgIC8vIC5kaXRvLXNjaGVtYS1jb250ZW50LCBkdWUgdG8gZ3JpZC10ZW1wbGF0ZS1yb3dzOiBtaW4tY29udGVudFxuICAgICAgICBtaW4taGVpZ2h0OiAyZW07XG4gICAgICB9XG5cbiAgICAgICYgKyAuZGl0by1wYW5lIHtcbiAgICAgICAgLy8gTmVlZGVkIGZvciB0cmFuc2l0aW9uLWhlaWdodCBpbiBEaXRvU2NoZW1hOlxuICAgICAgICBtaW4taGVpZ2h0OiAkZm9ybS1zcGFjaW5nO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjwhLS0gZXNsaW50LWRpc2FibGUgdnVlL25vLXRlbXBsYXRlLXNoYWRvdyAtLT5cbjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1wYW5lKFxuICB2LWlmPVwiaXNQb3B1bGF0ZWQgJiYgY29tcG9uZW50U2NoZW1hcy5sZW5ndGggPiAwXCJcbiAgdi1zaG93PVwidmlzaWJsZVwiXG4pXG4gIHRlbXBsYXRlKFxuICAgIHYtZm9yPWB7XG4gICAgICBzY2hlbWEsXG4gICAgICBkYXRhUGF0aCxcbiAgICAgIG5lc3RlZERhdGFQYXRoLFxuICAgICAgbmVzdGVkLFxuICAgICAgc3RvcmVcbiAgICB9IGluIGNvbXBvbmVudFNjaGVtYXNgXG4gIClcbiAgICAuZGl0by1icmVhayhcbiAgICAgIHYtaWY9XCJzY2hlbWEuYnJlYWsgPT09ICdiZWZvcmUnXCJcbiAgICApXG4gICAgRGl0b0NvbnRhaW5lcihcbiAgICAgIHYtaWY9XCJzaG91bGRSZW5kZXIoc2NoZW1hKVwiXG4gICAgICA6a2V5PVwibmVzdGVkRGF0YVBhdGhcIlxuICAgICAgOnNjaGVtYT1cInNjaGVtYVwiXG4gICAgICA6ZGF0YVBhdGg9XCJkYXRhUGF0aFwiXG4gICAgICA6ZGF0YT1cImRhdGFcIlxuICAgICAgOm1ldGE9XCJtZXRhXCJcbiAgICAgIDpzdG9yZT1cInN0b3JlXCJcbiAgICAgIDpzaW5nbGU9XCJpc1NpbmdsZUNvbXBvbmVudFwiXG4gICAgICA6bmVzdGVkPVwibmVzdGVkXCJcbiAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICAgIDpnZW5lcmF0ZUxhYmVscz1cImdlbmVyYXRlTGFiZWxzXCJcbiAgICApXG4gICAgLmRpdG8tYnJlYWsoXG4gICAgICB2LWlmPVwic2NoZW1hLmJyZWFrID09PSAnYWZ0ZXInXCJcbiAgICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCB7IGFwcGVuZERhdGFQYXRoIH0gZnJvbSAnLi4vdXRpbHMvZGF0YS5qcydcbmltcG9ydCB7IGdldEFsbFBhbmVsRW50cmllcywgaXNOZXN0ZWQgfSBmcm9tICcuLi91dGlscy9zY2hlbWEuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b1BhbmUnLCB7XG4gIHByb3ZpZGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICR0YWJDb21wb25lbnQ6ICgpID0+IHRoaXMudGFiQ29tcG9uZW50XG4gICAgfVxuICB9LFxuXG4gIHByb3BzOiB7XG4gICAgc2NoZW1hOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBkYXRhUGF0aDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICcnIH0sXG4gICAgZGF0YTogeyB0eXBlOiBPYmplY3QsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBtZXRhOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBzdG9yZTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgdGFiOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIHNpbmdsZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIHZpc2libGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZSB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgZ2VuZXJhdGVMYWJlbHM6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZSB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICB0YWJDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpcy50YWIgPyB0aGlzIDogdGhpcy4kdGFiQ29tcG9uZW50KClcbiAgICB9LFxuXG4gICAgY29tcG9uZW50U2NoZW1hcygpIHtcbiAgICAgIC8vIENvbXB1dGUgYSBjb21wb25lbnRzIGxpc3Qgd2hpY2ggaGFzIHRoZSBkYXRhUGF0aCBiYWtlZCBpbnRvIGl0cyBrZXlzXG4gICAgICAvLyBhbmQgYWRkcyB0aGUga2V5IGFzIHRoZSBuYW1lIHRvIGVhY2ggY29tcG9uZW50LCB1c2VkIGZvciBsYWJlbHMsIGV0Yy5cbiAgICAgIC8vIE5PVEU6IHNjaGVtYSBjYW4gYmUgbnVsbCB3aGlsZSBtdWx0aS1mb3JtIGxpc3RzIGxvYWQgdGhlaXIgZGF0YSxcbiAgICAgIC8vIGJlY2F1c2Ugb25seSB0aGUgYXZhaWxhYmxlIGRhdGEgd2lsbCBkZXRlcm1pbmUgdGhlIHR5cGUgb2YgZm9ybS5cbiAgICAgIC8vIFdoZW4gZWRpdGluZyBwcmltaXRpdmUgdmFsdWVzIHRocm91Z2ggYSBmb3JtLCBkbyBub3QgYXBwZW5kICduYW1lJyB0b1xuICAgICAgLy8gdGhlIGNvbXBvbmVudCdzIGRhdGFQYXRoIHNvIGl0IGNhbiBiZSBtYXBwZWQgdG8gZnJvbSB2YWxpZGF0aW9uIGVycm9ycy5cbiAgICAgIC8vIE5PVEU6IE5vdCBhbGwgc2NoZW1hcyAvIGNvbXBvbmVudHMgaGF2ZSBhIHNvdXJjZVNjaGVtYSwgZS5nLiBkaWFsb2dzLlxuICAgICAgY29uc3Qgd3JhcFByaW1pdGl2ZXMgPSB0aGlzLnNvdXJjZVNjaGVtYT8ud3JhcFByaW1pdGl2ZXNcbiAgICAgIHJldHVybiBPYmplY3QuZW50cmllcyh0aGlzLnNjaGVtYT8uY29tcG9uZW50cyB8fCB7fSkubWFwKFxuICAgICAgICAoW25hbWUsIHNjaGVtYV0pID0+IHtcbiAgICAgICAgICAvLyBBbHdheXMgYWRkIG5hbWUgdG8gY29tcG9uZW50IHNjaGVtYS5cbiAgICAgICAgICBzY2hlbWEubmFtZSA9IG5hbWVcbiAgICAgICAgICAvLyBTaGFyZSBkYXRhUGF0aCBhbmQgc3RvcmUgd2l0aCBwYXJlbnQgaWYgbm90IG5lc3RlZDpcbiAgICAgICAgICBjb25zdCBuZXN0ZWQgPSBpc05lc3RlZChzY2hlbWEpXG4gICAgICAgICAgY29uc3QgbmVzdGVkRGF0YVBhdGggPSBhcHBlbmREYXRhUGF0aCh0aGlzLmRhdGFQYXRoLCBuYW1lKVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzY2hlbWEsXG4gICAgICAgICAgICBkYXRhUGF0aDpcbiAgICAgICAgICAgICAgbmVzdGVkICYmICF3cmFwUHJpbWl0aXZlc1xuICAgICAgICAgICAgICAgID8gbmVzdGVkRGF0YVBhdGhcbiAgICAgICAgICAgICAgICA6IHRoaXMuZGF0YVBhdGgsXG4gICAgICAgICAgICBuZXN0ZWREYXRhUGF0aCxcbiAgICAgICAgICAgIG5lc3RlZCxcbiAgICAgICAgICAgIHN0b3JlOiBuZXN0ZWQgPyB0aGlzLmdldENoaWxkU3RvcmUobmFtZSkgOiB0aGlzLnN0b3JlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApXG4gICAgfSxcblxuICAgIHBhbmVsRW50cmllcygpIHtcbiAgICAgIC8vIEdhdGhlciBhbGwgcGFuZWwgc2NoZW1hcyBmcm9tIGFsbCBjb21wb25lbnQgc2NoZW1hcywgYnkgZmluZGluZyB0aG9zZVxuICAgICAgLy8gdGhhdCB3YW50IHRvIHByb3ZpZGUgYSBwYW5lbC4gU2VlIGBnZXRBbGxQYW5lbEVudHJpZXMoKWAgZm9yIGRldGFpbHMuXG4gICAgICByZXR1cm4gdGhpcy5jb21wb25lbnRTY2hlbWFzLmZsYXRNYXAoXG4gICAgICAgICh7IHNjaGVtYSwgbmVzdGVkRGF0YVBhdGg6IGRhdGFQYXRoIH0pID0+XG4gICAgICAgICAgZ2V0QWxsUGFuZWxFbnRyaWVzKFxuICAgICAgICAgICAgdGhpcy5hcGksXG4gICAgICAgICAgICBzY2hlbWEsXG4gICAgICAgICAgICBkYXRhUGF0aCxcbiAgICAgICAgICAgIHRoaXMuc2NoZW1hQ29tcG9uZW50LFxuICAgICAgICAgICAgdGhpcy50YWJDb21wb25lbnRcbiAgICAgICAgICApXG4gICAgICApXG4gICAgfSxcblxuICAgIGlzU2luZ2xlQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2luZ2xlICYmIHRoaXMuY29tcG9uZW50U2NoZW1hcy5sZW5ndGggPT09IDFcbiAgICB9XG4gIH0sXG5cbiAgY3JlYXRlZCgpIHtcbiAgICB0aGlzLl9yZWdpc3Rlcih0cnVlKVxuICB9LFxuXG4gIHVubW91bnRlZCgpIHtcbiAgICB0aGlzLl9yZWdpc3RlcihmYWxzZSlcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgX3JlZ2lzdGVyKGFkZCkge1xuICAgICAgdGhpcy5zY2hlbWFDb21wb25lbnQuX3JlZ2lzdGVyUGFuZSh0aGlzLCBhZGQpXG4gICAgfSxcblxuICAgIGZvY3VzKCkge1xuICAgICAgaWYgKHRoaXMudGFiKSB7XG4gICAgICAgIHRoaXMuJHJvdXRlci5wdXNoKHsgaGFzaDogYCMke3RoaXMudGFifWAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1wYW5lIHtcbiAgZGlzcGxheTogZmxleDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBmbGV4LWZsb3c6IHJvdyB3cmFwO1xuICBhbGlnbi1jb250ZW50OiBmbGV4LXN0YXJ0O1xuICBhbGlnbi1pdGVtczogYmFzZWxpbmU7XG4gIC8vIFJlbW92ZSB0aGUgcGFkZGluZyBhZGRlZCBieSBgLmRpdG8tY29udGFpbmVyYCBpbnNpZGUgYC5kaXRvLXBhbmVgOlxuICBtYXJnaW46ICgtJGZvcm0tc3BhY2luZykgKC0kZm9ybS1zcGFjaW5nLWhhbGYpO1xuICAvLyBBZGQgcmVtb3ZlZCBob3Jpem9udGFsIG1hcmdpbiBhZ2FpbiB0byBtYXgtd2lkdGg6XG4gIG1heC13aWR0aDogJGNvbnRlbnQtd2lkdGggKyAyICogJGZvcm0tc3BhY2luZy1oYWxmO1xuICAvLyBVc2UgYGZsZXg6IDAlYCBmb3IgYWxsIGAuZGl0by1wYW5lYCBleGNlcHQgYC5kaXRvLXBhbmUtbWFpbmAsXG4gIC8vIHNvIHRoYXQgdGhlIGAuZGl0by1idXR0b25zLW1haW5gIGNhbiBiZSBtb3ZlZCBhbGwgdGhlIHdheSB0byB0aGUgYm90dG9tLlxuICBmbGV4OiAwJTtcblxuICAmLmRpdG8tcGFuZS1tYWluIHtcbiAgICBmbGV4OiAxMDAlO1xuICB9XG5cbiAgLmRpdG8tc2NoZW1hLWhlYWRlcjpub3QoLmRpdG8tc2NoZW1hLW1lbnUtaGVhZGVyKSArICYge1xuICAgIC8vIENsZWFyIHRvcC1tYXJnaW4gaWYgdGhlIGNvbXBvbmVudHMgYXJlIHByZWNlZGVkIGJ5IGEgc2NoZW1hIGhlYWRlci5cbiAgICBtYXJnaW4tdG9wOiAwO1xuICB9XG5cbiAgLmRpdG8tY29udGFpbmVyLS1vbWl0LXBhZGRpbmcgPiAmIHtcbiAgICAvLyBDbGVhciBtYXJnaW5zIHNldCBhYm92ZSBhZ2FpbiBpZiBwYXJlbnQgaXMgb21pdHRpbmcgcGFkZGluZy5cbiAgICBtYXJnaW46IDA7XG4gICAgbWF4LXdpZHRoOiB1bnNldDtcbiAgfVxuXG4gIC5kaXRvLWJyZWFrIHtcbiAgICBmbGV4OiAxMDAlO1xuICAgIGhlaWdodDogMDtcbiAgfVxufVxuPC9zdHlsZT5cbiIsImltcG9ydCB7IGlzU3RyaW5nIH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRnJhY3Rpb24odmFsdWUpIHtcbiAgY29uc3QgbWF0Y2ggPSAoXG4gICAgaXNTdHJpbmcodmFsdWUpICYmXG4gICAgdmFsdWUubWF0Y2goL15cXHMqKFsrLV0/XFxkKylcXHMqXFwvXFxzKihbKy1dP1xcZCspXFxzKiQvKVxuICApXG4gIGlmIChtYXRjaCkge1xuICAgIGNvbnN0IFssIGRpdmlkZW5kLCBkaXZpc29yXSA9IG1hdGNoXG4gICAgcmV0dXJuIHBhcnNlRmxvYXQoZGl2aWRlbmQpIC8gcGFyc2VGbG9hdChkaXZpc29yKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBwYXJzZUZsb2F0KHZhbHVlKVxuICB9XG59XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tY29udGFpbmVyKFxuICB2LXNob3c9XCJjb21wb25lbnRWaXNpYmxlXCJcbiAgOmNsYXNzPVwiY29udGFpbmVyQ2xhc3NcIlxuICA6c3R5bGU9XCJjb250YWluZXJTdHlsZVwiXG4pXG4gIERpdG9MYWJlbChcbiAgICB2LWlmPVwiaGFzTGFiZWxcIlxuICAgIDpsYWJlbD1cImxhYmVsXCJcbiAgICA6ZGF0YVBhdGg9XCJsYWJlbERhdGFQYXRoXCJcbiAgICA6Y2xhc3M9XCJjb21wb25lbnRDbGFzc1wiXG4gIClcbiAgY29tcG9uZW50LmRpdG8tY29tcG9uZW50KFxuICAgIDppcz1cInR5cGVDb21wb25lbnRcIlxuICAgIDpzY2hlbWE9XCJzY2hlbWFcIlxuICAgIDpkYXRhUGF0aD1cImRhdGFQYXRoXCJcbiAgICA6ZGF0YT1cImRhdGFcIlxuICAgIDptZXRhPVwibWV0YVwiXG4gICAgOnN0b3JlPVwic3RvcmVcIlxuICAgIDpzaW5nbGU9XCJzaW5nbGVcIlxuICAgIDpuZXN0ZWQ9XCJuZXN0ZWRcIlxuICAgIDpkaXNhYmxlZD1cImNvbXBvbmVudERpc2FibGVkXCJcbiAgICA6Y2xhc3M9XCJjb21wb25lbnRDbGFzc1wiXG4gICAgQGVycm9ycz1cIm9uRXJyb3JzXCJcbiAgKVxuICBEaXRvRXJyb3JzKDplcnJvcnM9XCJlcnJvcnNcIilcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgeyBpc1N0cmluZywgaXNOdW1iZXIgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCBEaXRvQ29udGV4dCBmcm9tICcuLi9EaXRvQ29udGV4dC5qcydcbmltcG9ydCB7IGdldFNjaGVtYUFjY2Vzc29yIH0gZnJvbSAnLi4vdXRpbHMvYWNjZXNzb3IuanMnXG5pbXBvcnQgeyBnZXRUeXBlQ29tcG9uZW50LCBhbGlnbkJvdHRvbSwgb21pdFBhZGRpbmcgfSBmcm9tICcuLi91dGlscy9zY2hlbWEuanMnXG5pbXBvcnQgeyBwYXJzZUZyYWN0aW9uIH0gZnJvbSAnLi4vdXRpbHMvbWF0aC5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvQ29udGFpbmVyJywge1xuICBwcm9wczoge1xuICAgIHNjaGVtYTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZGF0YVBhdGg6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnJyB9LFxuICAgIGRhdGE6IHsgdHlwZTogW09iamVjdCwgQXJyYXldLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIG1ldGE6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHN0b3JlOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBzaW5nbGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBuZXN0ZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZSB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZ2VuZXJhdGVMYWJlbHM6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZSB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXJyb3JzOiBudWxsXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgY29udGV4dCgpIHtcbiAgICAgIHJldHVybiBuZXcgRGl0b0NvbnRleHQodGhpcywgeyBuZXN0ZWQ6IHRoaXMubmVzdGVkIH0pXG4gICAgfSxcblxuICAgIHR5cGVDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gZ2V0VHlwZUNvbXBvbmVudCh0aGlzLnNjaGVtYS50eXBlKVxuICAgIH0sXG5cbiAgICBoYXNMYWJlbCgpIHtcbiAgICAgIGNvbnN0IHsgbGFiZWwgfSA9IHRoaXMuc2NoZW1hXG4gICAgICByZXR1cm4gKFxuICAgICAgICBsYWJlbCAhPT0gZmFsc2UgJiYgKFxuICAgICAgICAgICEhbGFiZWwgfHxcbiAgICAgICAgICB0aGlzLmdlbmVyYXRlTGFiZWxzICYmIHRoaXMudHlwZUNvbXBvbmVudD8uZ2VuZXJhdGVMYWJlbFxuICAgICAgICApXG4gICAgICApXG4gICAgfSxcblxuICAgIGxhYmVsKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaGFzTGFiZWwgPyB0aGlzLmdldExhYmVsKHRoaXMuc2NoZW1hKSA6IG51bGxcbiAgICB9LFxuXG4gICAgbGFiZWxEYXRhUGF0aCgpIHtcbiAgICAgIC8vIFVubmVzdGVkIHR5cGVzIGRvbid0IGhhdmUgYSBkYXRhUGF0aCBmb3IgdGhlbXNlbHZlcywgZG9uJ3QgdXNlIGl0OlxuICAgICAgcmV0dXJuIHRoaXMubmVzdGVkID8gdGhpcy5kYXRhUGF0aCA6IG51bGxcbiAgICB9LFxuXG4gICAgY29tcG9uZW50V2lkdGg6IGdldFNjaGVtYUFjY2Vzc29yKCd3aWR0aCcsIHtcbiAgICAgIHR5cGU6IFtTdHJpbmcsIE51bWJlcl0sXG4gICAgICBkZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlQ29tcG9uZW50Py5kZWZhdWx0V2lkdGhcbiAgICAgIH0sXG4gICAgICBnZXQod2lkdGgpIHtcbiAgICAgICAgLy8gVXNlIDEwMCUgPT0gMS4wIGFzIGRlZmF1bHQgd2lkdGggd2hlbiBub3RoaW5nIGlzIHNldDpcbiAgICAgICAgcmV0dXJuIHdpZHRoID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IDEuMFxuICAgICAgICAgIDogaXNTdHJpbmcod2lkdGgpXG4gICAgICAgICAgICA/IHdpZHRoLm1hdGNoKC9eXFxzKls8Pl0/XFxzKiguKikkLylbMV0gLy8gUmVtb3ZlIHdpZHRoIG9wZXJhdG9yXG4gICAgICAgICAgICA6IHdpZHRoXG4gICAgICB9XG4gICAgfSksXG5cbiAgICBjb21wb25lbnRXaWR0aE9wZXJhdG9yOiBnZXRTY2hlbWFBY2Nlc3Nvcignd2lkdGgnLCB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBnZXQod2lkdGgpIHtcbiAgICAgICAgcmV0dXJuIGlzU3RyaW5nKHdpZHRoKVxuICAgICAgICAgID8gd2lkdGgubWF0Y2goL15cXHMqKFs8Pl0/KS8pWzFdIHx8IG51bGxcbiAgICAgICAgICA6IG51bGxcbiAgICAgIH1cbiAgICB9KSxcblxuICAgIGNvbXBvbmVudFZpc2libGU6IGdldFNjaGVtYUFjY2Vzc29yKCd2aXNpYmxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGVDb21wb25lbnQ/LmRlZmF1bHRWaXNpYmxlXG4gICAgICB9XG4gICAgfSksXG5cbiAgICBjb21wb25lbnREaXNhYmxlZDogZ2V0U2NoZW1hQWNjZXNzb3IoJ2Rpc2FibGVkJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgZ2V0KGRpc2FibGVkKSB7XG4gICAgICAgIHJldHVybiBkaXNhYmxlZCB8fCB0aGlzLmRpc2FibGVkXG4gICAgICB9XG4gICAgfSksXG5cbiAgICBjb250YWluZXJDbGFzcygpIHtcbiAgICAgIGNvbnN0IHsgY2xhc3M6IGNvbnRhaW5lckNsYXNzIH0gPSB0aGlzLnNjaGVtYVxuICAgICAgY29uc3QgcHJlZml4ID0gJ2RpdG8tY29udGFpbmVyJ1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgW2Ake3ByZWZpeH0tLXNpbmdsZWBdOiB0aGlzLnNpbmdsZSxcbiAgICAgICAgW2Ake3ByZWZpeH0tLWhhcy1sYWJlbGBdOiB0aGlzLmhhc0xhYmVsLFxuICAgICAgICBbYCR7cHJlZml4fS0tYWxpZ24tYm90dG9tYF06IGFsaWduQm90dG9tKHRoaXMuc2NoZW1hKSxcbiAgICAgICAgW2Ake3ByZWZpeH0tLW9taXQtcGFkZGluZ2BdOiBvbWl0UGFkZGluZyh0aGlzLnNjaGVtYSksXG4gICAgICAgIC4uLihcbiAgICAgICAgICBpc1N0cmluZyhjb250YWluZXJDbGFzcylcbiAgICAgICAgICAgID8geyBbY29udGFpbmVyQ2xhc3NdOiB0cnVlIH1cbiAgICAgICAgICAgIDogY29udGFpbmVyQ2xhc3NcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBjb21wb25lbnRCYXNpcygpIHtcbiAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy5jb21wb25lbnRXaWR0aFxuICAgICAgLy8gJ2F1dG8nID0gbm8gZml0dGluZzpcbiAgICAgIGNvbnN0IGJhc2lzID0gW251bGwsICdhdXRvJywgJ2ZpbGwnXS5pbmNsdWRlcyh3aWR0aClcbiAgICAgICAgPyAnYXV0bydcbiAgICAgICAgOiAvJSQvLnRlc3Qod2lkdGgpXG4gICAgICAgICAgPyBwYXJzZUZsb2F0KHdpZHRoKSAvLyBwZXJjZW50YWdlXG4gICAgICAgICAgOiAvW2Etel0vLnRlc3Qod2lkdGgpXG4gICAgICAgICAgICA/IHdpZHRoIC8vIG5hdGl2ZSB1bml0c1xuICAgICAgICAgICAgOiBwYXJzZUZyYWN0aW9uKHdpZHRoKSAqIDEwMCAvLyBmcmFjdGlvblxuICAgICAgcmV0dXJuIGlzTnVtYmVyKGJhc2lzKSA/IGAke2Jhc2lzfSVgIDogYmFzaXNcbiAgICB9LFxuXG4gICAgY29udGFpbmVyU3R5bGUoKSB7XG4gICAgICAvLyBJbnRlcnByZXQgJz41MCUnIGFzICc1MCUsIGZsZXgtZ3JvdzogMWBcbiAgICAgIGNvbnN0IGdyb3cgPSAoXG4gICAgICAgIHRoaXMuY29tcG9uZW50V2lkdGhPcGVyYXRvciA9PT0gJz4nIHx8XG4gICAgICAgIHRoaXMuY29tcG9uZW50V2lkdGggPT09ICdmaWxsJ1xuICAgICAgKVxuICAgICAgLy8gSW50ZXJwcmV0ICc8NTAlJyBhcyAnNTAlLCBmbGV4LXNocmluazogMWBcbiAgICAgIGNvbnN0IHNocmluayA9IHRoaXMuY29tcG9uZW50V2lkdGhPcGVyYXRvciA9PT0gJzwnXG4gICAgICByZXR1cm4ge1xuICAgICAgICBmbGV4OiBgJHtncm93ID8gMSA6IDB9ICR7c2hyaW5rID8gMSA6IDB9ICR7dGhpcy5jb21wb25lbnRCYXNpc31gXG4gICAgICB9XG4gICAgfSxcblxuICAgIGNvbXBvbmVudENsYXNzKCkge1xuICAgICAgY29uc3QgYmFzaXNJc0F1dG8gPSB0aGlzLmNvbXBvbmVudEJhc2lzID09PSAnYXV0bydcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC8vIFRPRE86IEJFTVxuICAgICAgICAnZGl0by1zaW5nbGUnOiB0aGlzLnNpbmdsZSxcbiAgICAgICAgJ2RpdG8tZGlzYWJsZWQnOiB0aGlzLmNvbXBvbmVudERpc2FibGVkLFxuICAgICAgICAnZGl0by13aWR0aC1maWxsJzogIWJhc2lzSXNBdXRvIHx8IHRoaXMuY29tcG9uZW50V2lkdGggPT09ICdmaWxsJyxcbiAgICAgICAgJ2RpdG8td2lkdGgtYXV0byc6IGJhc2lzSXNBdXRvLFxuICAgICAgICAnZGl0by1oYXMtZXJyb3JzJzogISF0aGlzLmVycm9yc1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgb25FcnJvcnMoZXJyb3JzKSB7XG4gICAgICB0aGlzLmVycm9ycyA9IGVycm9yc1xuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLWNvbnRhaW5lciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZmxvdzogY29sdW1uO1xuICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgLy8gTmVlZGVkIGZvciBiZXR0ZXIgdmVydGljYWwgYWxpZ25tZW50OlxuICBhbGlnbi1zZWxmOiBzdHJldGNoO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAvLyBUbyBwcmV2ZW50IGxpc3QgdGFibGVzIGZyb20gYmxvd2luZyBvdXQgb2YgdGhlaXIgZmxleCBib3ggY29udGFpbmVycy5cbiAgbWF4LXdpZHRoOiAxMDAlO1xuICAvLyBDYW5ub3QgdXNlIG1hcmdpbiBoZXJlIGFzIGl0IG5lZWRzIHRvIGJlIHBhcnQgb2YgYm94LXNpemluZyBmb3JcbiAgLy8gcGVyY2VudGFnZXMgaW4gZmxleC1iYXNpcyB0byB3b3JrLlxuICBwYWRkaW5nOiAkZm9ybS1zcGFjaW5nICRmb3JtLXNwYWNpbmctaGFsZjtcblxuICAmOmVtcHR5IHtcbiAgICBwYWRkaW5nOiAwO1xuICB9XG5cbiAgJi0tYWxpZ24tYm90dG9tIHtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGVuZDsgLy8gVG8gYWxpZ24gY29tcG9uZW50cyB3aXRoIGFuZCB3aXRob3V0IGxhYmVscy5cbiAgfVxuXG4gICYtLW9taXQtcGFkZGluZyB7XG4gICAgcGFkZGluZzogMDtcblxuICAgID4gLmRpdG8tbGFiZWwge1xuICAgICAgbWFyZ2luOiAkZm9ybS1zcGFjaW5nICRmb3JtLXNwYWNpbmctaGFsZiAwO1xuICAgIH1cbiAgfVxuXG4gICYtLXNpbmdsZSB7XG4gICAgaGVpZ2h0OiAxMDAlOyAvLyBTbyB0aGF0IGxpc3QgYnV0dG9ucyBjYW4gYmUgc3RpY2t5IGF0IHRoZSBib3R0b207XG4gIH1cbn1cblxuLy8gTk9URTogVGhpcyBpcyBub3QgbmVzdGVkIGluc2lkZSBgLmRpdG8tY29udGFpbmVyYCBzbyB0aGF0IG90aGVyXG4vLyB0eXBlIGNvbXBvbmVudHMgY2FuIG92ZXJyaWRlIGAuZGl0by13aWR0aC1maWxsYCBjbGFzcyAoZmlsdGVyIHByZWNlZGVuY2UpLlxuLmRpdG8tY29tcG9uZW50IHtcbiAgJi5kaXRvLXdpZHRoLWZpbGwge1xuICAgIHdpZHRoOiAxMDAlO1xuXG4gICAgJi5kaXRvLWNoZWNrYm94LFxuICAgICYuZGl0by1yYWRpby1idXR0b24ge1xuICAgICAgLy8gV2ViS2l0IGRvZXNuJ3QgbGlrZSBjaGFuZ2VkIHdpZHRoIG9uIGNoZWNrYm94ZXMgYW5kIHJhZGlvcywgb3ZlcnJpZGU6XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgICB3aWR0aDogYXV0bztcbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tdGFic1xuICB0ZW1wbGF0ZShcbiAgICB2LWZvcj1cIih0YWJTY2hlbWEsIGtleSkgaW4gdGFic1wiXG4gIClcbiAgICBSb3V0ZXJMaW5rLmRpdG8tbGluayhcbiAgICAgIHYtaWY9XCJzaG91bGRSZW5kZXIodGFiU2NoZW1hKVwiXG4gICAgICA6a2V5PVwia2V5XCJcbiAgICAgIDp0bz1cInsgaGFzaDogYCMke2tleX1gIH1cIlxuICAgICAgOmNsYXNzPVwieyAnZGl0by1hY3RpdmUnOiBzZWxlY3RlZFRhYiA9PT0ga2V5IH1cIlxuICAgICkge3sgZ2V0TGFiZWwodGFiU2NoZW1hLCBrZXkpIH19XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvVGFicycsIHtcbiAgcHJvcHM6IHtcbiAgICB0YWJzOiB7IHR5cGU6IE9iamVjdCwgZGVmYXVsdDogbnVsbCB9LFxuICAgIHNlbGVjdGVkVGFiOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4kdGFiLWNvbG9yLWJhY2tncm91bmQ6ICRjb2xvci1saWdodGVzdDtcbiR0YWItY29sb3ItaW5hY3RpdmU6ICRjb2xvci1saWdodDtcbiR0YWItY29sb3ItYWN0aXZlOiAkY29sb3ItbGlnaHRlc3Q7XG4kdGFiLWNvbG9yLWhvdmVyOiAkY29sb3Itd2hpdGU7XG5cbi5kaXRvLXRhYnMge1xuICAvLyBTZWU6IGh0dHBzOi8vY29kZXBlbi5pby90aG9sZXgvcGVuL2h2ZUJ4L1xuICBtYXJnaW4tbGVmdDogYXV0bztcblxuICBhIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBAaW5jbHVkZSB1c2VyLXNlbGVjdChub25lKTtcblxuICAgIGJhY2tncm91bmQ6ICR0YWItY29sb3ItaW5hY3RpdmU7XG4gICAgcGFkZGluZzogJHRhYi1wYWRkaW5nLXZlciAkdGFiLXBhZGRpbmctaG9yO1xuICAgIG1hcmdpbi1sZWZ0OiAkdGFiLW1hcmdpbjtcbiAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAkdGFiLXJhZGl1cztcbiAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogJHRhYi1yYWRpdXM7XG5cbiAgICAmOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQ6ICR0YWItY29sb3ItaG92ZXI7XG4gICAgfVxuXG4gICAgJjphY3RpdmUge1xuICAgICAgYmFja2dyb3VuZDogJHRhYi1jb2xvci1hY3RpdmU7XG4gICAgfVxuXG4gICAgJi5kaXRvLWFjdGl2ZSB7XG4gICAgICBiYWNrZ3JvdW5kOiAkdGFiLWNvbG9yLWJhY2tncm91bmQ7XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi8vLSBPbmx5IHNob3cgcGFuZWxzIGluIHRhYnMgd2hlbiB0aGUgdGFicyBhcmUgYWxzbyB2aXNpYmxlLlxuY29tcG9uZW50LmRpdG8tcGFuZWwoXG4gIHYtc2hvdz1cInZpc2libGUgJiYgKCFwYW5lbFRhYkNvbXBvbmVudCB8fCBwYW5lbFRhYkNvbXBvbmVudC52aXNpYmxlKVwiXG4gIDppcz1cInBhbmVsVGFnXCJcbiAgQHN1Ym1pdC5wcmV2ZW50XG4pXG4gIERpdG9TY2hlbWEuZGl0by1wYW5lbF9fc2NoZW1hKFxuICAgIDpzY2hlbWE9XCJwYW5lbFNjaGVtYVwiXG4gICAgOmRhdGFQYXRoPVwicGFuZWxEYXRhUGF0aFwiXG4gICAgOmRhdGE9XCJwYW5lbERhdGFcIlxuICAgIDptZXRhPVwibWV0YVwiXG4gICAgOnN0b3JlPVwic3RvcmVcIlxuICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICA6aGFzT3duRGF0YT1cImhhc093bkRhdGFcIlxuICApXG4gICAgdGVtcGxhdGUoI2JlZm9yZSlcbiAgICAgIGgyLmRpdG8tcGFuZWxfX2hlYWRlcig6Y2xhc3M9XCJ7ICdkaXRvLXBhbmVsX19oZWFkZXItLXN0aWNreSc6IHN0aWNreSB9XCIpXG4gICAgICAgIHNwYW4ge3sgZ2V0TGFiZWwoc2NoZW1hKSB9fVxuICAgICAgICBEaXRvQnV0dG9ucy5kaXRvLWJ1dHRvbnMtc21hbGwoXG4gICAgICAgICAgOmJ1dHRvbnM9XCJwYW5lbEJ1dHRvblNjaGVtYXNcIlxuICAgICAgICAgIDpkYXRhUGF0aD1cInBhbmVsRGF0YVBhdGhcIlxuICAgICAgICAgIDpkYXRhPVwicGFuZWxEYXRhXCJcbiAgICAgICAgICA6bWV0YT1cIm1ldGFcIlxuICAgICAgICAgIDpzdG9yZT1cInN0b3JlXCJcbiAgICAgICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gICAgICAgIClcbiAgICB0ZW1wbGF0ZSgjYnV0dG9ucylcbiAgICAgIERpdG9CdXR0b25zKFxuICAgICAgICA6YnV0dG9ucz1cImJ1dHRvblNjaGVtYXNcIlxuICAgICAgICA6ZGF0YVBhdGg9XCJwYW5lbERhdGFQYXRoXCJcbiAgICAgICAgOmRhdGE9XCJwYW5lbERhdGFcIlxuICAgICAgICA6bWV0YT1cIm1ldGFcIlxuICAgICAgICA6c3RvcmU9XCJzdG9yZVwiXG4gICAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICAgIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgeyBpc0Z1bmN0aW9uIH0gZnJvbSAnQGRpdG9qcy91dGlscydcbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5pbXBvcnQgVmFsaWRhdG9yTWl4aW4gZnJvbSAnLi4vbWl4aW5zL1ZhbGlkYXRvck1peGluLmpzJ1xuaW1wb3J0IHsgZ2V0QnV0dG9uU2NoZW1hcyB9IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcbmltcG9ydCB7IGdldFNjaGVtYUFjY2Vzc29yIH0gZnJvbSAnLi4vdXRpbHMvYWNjZXNzb3IuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b1BhbmVsJywge1xuICBtaXhpbnM6IFtWYWxpZGF0b3JNaXhpbl0sXG5cbiAgcHJvdmlkZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJHBhbmVsQ29tcG9uZW50OiAoKSA9PiB0aGlzLFxuICAgICAgJHRhYkNvbXBvbmVudDogKCkgPT4gdGhpcy5wYW5lbFRhYkNvbXBvbmVudFxuICAgIH1cbiAgfSxcblxuICBwcm9wczoge1xuICAgIHNjaGVtYTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZGF0YVBhdGg6IHsgdHlwZTogU3RyaW5nLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGRhdGE6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIG1ldGE6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHN0b3JlOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHBhbmVsVGFiQ29tcG9uZW50OiB7IHR5cGU6IE9iamVjdCwgZGVmYXVsdDogbnVsbCB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgb3duRGF0YTogbnVsbFxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIHBhbmVsQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9LFxuXG4gICAgdGFiQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMucGFuZWxUYWJDb21wb25lbnRcbiAgICB9LFxuXG4gICAgYnV0dG9uU2NoZW1hcygpIHtcbiAgICAgIHJldHVybiBnZXRCdXR0b25TY2hlbWFzKHRoaXMuc2NoZW1hLmJ1dHRvbnMpXG4gICAgfSxcblxuICAgIHBhbmVsQnV0dG9uU2NoZW1hcygpIHtcbiAgICAgIHJldHVybiBnZXRCdXR0b25TY2hlbWFzKHRoaXMuc2NoZW1hLnBhbmVsQnV0dG9ucylcbiAgICB9LFxuXG4gICAgdGFyZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hLnRhcmdldCB8fCB0aGlzLmRhdGFQYXRoXG4gICAgfSxcblxuICAgIGhhc093bkRhdGEoKSB7XG4gICAgICByZXR1cm4gISF0aGlzLm93bkRhdGFcbiAgICB9LFxuXG4gICAgcGFuZWxEYXRhKCkge1xuICAgICAgcmV0dXJuIHRoaXMub3duRGF0YSB8fCB0aGlzLmRhdGFcbiAgICB9LFxuXG4gICAgcGFuZWxTY2hlbWEoKSB7XG4gICAgICBpZiAodGhpcy5oYXNPd25EYXRhKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNjaGVtYVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gUmVtb3ZlIGBkYXRhYCBmcm9tIHRoZSBzY2hlbWEsIHNvIHRoYXQgRGl0b1NjaGVtYSBpc24ndCB1c2luZyBpdCB0b1xuICAgICAgICAvLyBwcm9kdWNlIGl0cyBvd24gZGF0YS4gU2VlICRmaWx0ZXJzIHBhbmVsIGZvciBtb3JlIGRldGFpbHMgb24gZGF0YS5cbiAgICAgICAgY29uc3QgeyBkYXRhLCAuLi5zY2hlbWEgfSA9IHRoaXMuc2NoZW1hXG4gICAgICAgIHJldHVybiBzY2hlbWFcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgcGFuZWxUYWcoKSB7XG4gICAgICAvLyBQYW5lbHMgdGhhdCBwcm92aWRlIHRoZWlyIG93biBkYXRhIG5lZWQgdGhlaXIgb3duIGZvcm0uXG4gICAgICByZXR1cm4gdGhpcy5oYXNPd25EYXRhID8gJ2Zvcm0nIDogJ2RpdidcbiAgICB9LFxuXG4gICAgcGFuZWxEYXRhUGF0aCgpIHtcbiAgICAgIC8vIElmIHRoZSBwYW5lbCBwcm92aWRlcyBpdHMgb3duIGRhdGEsIHRoZW4gaXQgbmVlZHMgdG8gcHJlZml4IGFsbFxuICAgICAgLy8gY29tcG9uZW50cyB3aXRoIGl0cyBkYXRhLXBhdGgsIGJ1dCBpZiBpdCBzaGFyZXMgZGF0YSB3aXRoIHRoZSBzY2hlbWFcbiAgICAgIC8vIGNvbXBvbmVudCwgdGhlbiBpdCBzaG91bGQgc2hhcmUgdGhlIGRhdGEtcGF0aCBuYW1lIHNwYWNlIHRvby5cbiAgICAgIHJldHVybiB0aGlzLmhhc093bkRhdGEgPyB0aGlzLmRhdGFQYXRoIDogdGhpcy5zY2hlbWFDb21wb25lbnQuZGF0YVBhdGhcbiAgICB9LFxuXG4gICAgdmlzaWJsZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ3Zpc2libGUnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgIH0pLFxuXG4gICAgc3RpY2t5OiBnZXRTY2hlbWFBY2Nlc3Nvcignc3RpY2t5Jywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSlcbiAgfSxcblxuICBjcmVhdGVkKCkge1xuICAgIHRoaXMuX3JlZ2lzdGVyKHRydWUpXG4gICAgLy8gTk9URTogVGhpcyBpcyBub3QgdGhlIHNhbWUgYXMgYHNjaGVtYS5kYXRhYCBoYW5kbGluZyBpbiBEaXRvU2NoZW1hLFxuICAgIC8vIHdoZXJlIHRoZSBkYXRhIGlzIGFkZGVkIHRvIHRoZSBhY3R1YWwgY29tcG9uZW50LlxuICAgIGNvbnN0IHsgZGF0YSB9ID0gdGhpcy5zY2hlbWFcbiAgICBpZiAoZGF0YSkge1xuICAgICAgdGhpcy5vd25EYXRhID0gaXNGdW5jdGlvbihkYXRhKVxuICAgICAgICA/IGRhdGEodGhpcy5jb250ZXh0KVxuICAgICAgICA6IGRhdGFcbiAgICB9XG4gIH0sXG5cbiAgdW5tb3VudGVkKCkge1xuICAgIHRoaXMuX3JlZ2lzdGVyKGZhbHNlKVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBfcmVnaXN0ZXIoYWRkKSB7XG4gICAgICAvLyBSZWdpc3RlciB0aGUgcGFuZWxzIHNvIHRoYXQgb3RoZXIgY29tcG9uZW50cyBjYW4gZmluZCB0aGVtIGJ5IHRoZWlyXG4gICAgICAvLyBkYXRhLXBhdGgsIGUuZy4gaW4gVHlwZUxpc3Qub25GaWx0ZXJFcnJvcnMoKVxuICAgICAgdGhpcy5zY2hlbWFDb21wb25lbnQuX3JlZ2lzdGVyUGFuZWwodGhpcywgYWRkKVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXBhbmVsIHtcbiAgcGFkZGluZy1ib3R0b206ICRjb250ZW50LXBhZGRpbmc7XG5cbiAgJl9faGVhZGVyIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBwYWRkaW5nOiAkaW5wdXQtcGFkZGluZztcbiAgICBiYWNrZ3JvdW5kOiAkYnV0dG9uLWNvbG9yO1xuICAgIGJvcmRlcjogJGJvcmRlci1zdHlsZTtcbiAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcbiAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG5cbiAgICAmLS1zdGlja3kge1xuICAgICAgJG1hcmdpbjogJGlucHV0LWhlaWdodC1mYWN0b3IgKiAkbGluZS1oZWlnaHQgKiAkZm9udC1zaXplLXNtYWxsICtcbiAgICAgICAgJGZvcm0tc3BhY2luZztcblxuICAgICAgcG9zaXRpb246IHN0aWNreTtcbiAgICAgIHRvcDogJGNvbnRlbnQtcGFkZGluZztcbiAgICAgIG1hcmdpbi1ib3R0b206ICRtYXJnaW47XG4gICAgICB6LWluZGV4OiAxO1xuXG4gICAgICAmICsgKiB7XG4gICAgICAgIG1hcmdpbi10b3A6IC0kbWFyZ2luO1xuICAgICAgfVxuXG4gICAgICAmOjpiZWZvcmUge1xuICAgICAgICBjb250ZW50OiAnJztcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgYmFja2dyb3VuZDogJGNvbnRlbnQtY29sb3ItYmFja2dyb3VuZDtcbiAgICAgICAgbGVmdDogMDtcbiAgICAgICAgcmlnaHQ6IDA7XG4gICAgICAgIGhlaWdodDogJGNvbnRlbnQtcGFkZGluZztcbiAgICAgICAgdG9wOiAtJGNvbnRlbnQtcGFkZGluZztcbiAgICAgICAgbWFyZ2luOiAtJGJvcmRlci13aWR0aDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAuZGl0by1idXR0b25zIHtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIHJpZ2h0OiAkaW5wdXQtcGFkZGluZy12ZXI7XG4gICAgICB0b3A6IDUwJTtcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbiAgICB9XG4gIH1cblxuICAmX19zY2hlbWEge1xuICAgIGZvbnQtc2l6ZTogJGZvbnQtc2l6ZS1zbWFsbDtcbiAgICBiYWNrZ3JvdW5kOiAkY29udGVudC1jb2xvci1iYWNrZ3JvdW5kO1xuICAgIGJvcmRlcjogJGJvcmRlci1zdHlsZTtcbiAgICBib3JkZXItdG9wOiAwO1xuICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6ICRib3JkZXItcmFkaXVzO1xuICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcblxuICAgID4gLmRpdG8tc2NoZW1hLWNvbnRlbnQge1xuICAgICAgcGFkZGluZzogJGZvcm0tc3BhY2luZy1oYWxmICRmb3JtLXNwYWNpbmc7XG5cbiAgICAgIC5kaXRvLWNvbnRhaW5lciB7XG4gICAgICAgIHBhZGRpbmc6ICRmb3JtLXNwYWNpbmctaGFsZjtcbiAgICAgIH1cblxuICAgICAgLmRpdG8tb2JqZWN0IHtcbiAgICAgICAgYm9yZGVyOiAwO1xuICAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgfVxuXG4gICAgICA+IC5kaXRvLWJ1dHRvbnMge1xuICAgICAgICAtLWJ1dHRvbi1tYXJnaW46ICN7JGZvcm0tc3BhY2luZ307XG5cbiAgICAgICAgcGFkZGluZzogJGZvcm0tc3BhY2luZy1oYWxmIDA7XG5cbiAgICAgICAgLmRpdG8tY29udGFpbmVyIHtcbiAgICAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLmRpdG8tbGFiZWwge1xuICAgICAgbWFyZ2luOiAwO1xuXG4gICAgICBsYWJlbCB7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLmRpdG8tcGFuZSB7XG4gICAgICBtYXJnaW46IDAgKC0kZm9ybS1zcGFjaW5nLWhhbGYpO1xuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1wYW5lbHMoXG4gIHYtaWY9XCJwYW5lbHMubGVuZ3RoID4gMFwiXG4pXG4gIHRlbXBsYXRlKFxuICAgIHYtZm9yPVwieyBzY2hlbWEsIGRhdGFQYXRoLCB0YWJDb21wb25lbnQgfSBpbiBwYW5lbHNcIlxuICApXG4gICAgRGl0b1BhbmVsKFxuICAgICAgdi1pZj1cInNob3VsZFJlbmRlcihzY2hlbWEpXCJcbiAgICAgIDprZXk9XCJnZXRQYW5lbEtleShkYXRhUGF0aCwgdGFiQ29tcG9uZW50KVwiXG4gICAgICA6c2NoZW1hPVwic2NoZW1hXCJcbiAgICAgIDpkYXRhUGF0aD1cImRhdGFQYXRoXCJcbiAgICAgIDpkYXRhPVwiZGF0YVwiXG4gICAgICA6bWV0YT1cIm1ldGFcIlxuICAgICAgOnN0b3JlPVwiZ2V0Q2hpbGRTdG9yZShzY2hlbWEubmFtZSlcIlxuICAgICAgOmRpc2FibGVkPVwic2NoZW1hLmRpc2FibGVkICE9IG51bGwgPyBzY2hlbWEuZGlzYWJsZWQgOiBkaXNhYmxlZFwiXG4gICAgICA6cGFuZWxUYWJDb21wb25lbnQ9XCJ0YWJDb21wb25lbnRcIlxuICAgIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9QYW5lbHMnLCB7XG4gIHByb3BzOiB7XG4gICAgcGFuZWxzOiB7IHR5cGU6IEFycmF5LCBkZWZhdWx0OiBudWxsIH0sXG4gICAgZGF0YTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgbWV0YTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgc3RvcmU6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIHJlcXVpcmVkOiB0cnVlIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0UGFuZWxLZXkoZGF0YVBhdGgsIHRhYkNvbXBvbmVudCkge1xuICAgICAgLy8gQWxsb3cgc2VwYXJhdGUgdGFicyB0byB1c2UgcGFuZWxzIG9mIHRoZSBzYW1lIG5hbWUsIGJ5XG4gICAgICAvLyBwcmVmaXhpbmcgdGhlaXIga2V5IHdpdGggdGhlIHRhYiBuYW1lLlxuICAgICAgcmV0dXJuIHRhYkNvbXBvbmVudCA/IGAke3RhYkNvbXBvbmVudC50YWJ9XyR7ZGF0YVBhdGh9YCA6IGRhdGFQYXRoXG4gICAgfVxuICB9XG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tcGFuZWxzIHtcbiAgbWF4LXdpZHRoOiAkY29udGVudC1zaWRlYmFyLXdpZHRoO1xuICBtaW4td2lkdGg6IGNhbGMoJGNvbnRlbnQtc2lkZWJhci13aWR0aCAvIDIpO1xufVxuPC9zdHlsZT5cbiIsImltcG9ydCB7IHVzZVNsb3RzLCBDb21tZW50IH0gZnJvbSAndnVlJ1xuaW1wb3J0IHsgaXNTdHJpbmcsIGFzQXJyYXkgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG5leHBvcnQgZnVuY3Rpb24gaGFzVk5vZGVDb250ZW50KHZub2RlKSB7XG4gIHJldHVybiB2bm9kZSAmJiBhc0FycmF5KHZub2RlKS5zb21lKHZub2RlID0+IHZub2RlLnR5cGUgIT09IENvbW1lbnQpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNTbG90Q29udGVudChzbG90LCBwcm9wcyA9IHt9KSB7XG4gIHNsb3QgPSBpc1N0cmluZyhzbG90KSA/IHVzZVNsb3RzKClbc2xvdF0gOiBzbG90XG4gIHJldHVybiBoYXNWTm9kZUNvbnRlbnQoc2xvdD8uKHByb3BzKSlcbn1cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1idXR0b25zKFxuICB2LWlmPVwiYnV0dG9uU2NoZW1hcyB8fCBoYXNTbG90Q29udGVudCgkc2xvdHMuZGVmYXVsdClcIlxuKVxuICB0ZW1wbGF0ZShcbiAgICB2LWZvcj1cIihidXR0b25TY2hlbWEsIGJ1dHRvbkRhdGFQYXRoKSBpbiBidXR0b25TY2hlbWFzXCJcbiAgKVxuICAgIERpdG9Db250YWluZXIoXG4gICAgICB2LWlmPVwic2hvdWxkUmVuZGVyKGJ1dHRvblNjaGVtYSlcIlxuICAgICAgOmtleT1cImJ1dHRvbkRhdGFQYXRoXCJcbiAgICAgIDpzY2hlbWE9XCJidXR0b25TY2hlbWFcIlxuICAgICAgOmRhdGFQYXRoPVwiYnV0dG9uRGF0YVBhdGhcIlxuICAgICAgOmRhdGE9XCJkYXRhXCJcbiAgICAgIDptZXRhPVwibWV0YVwiXG4gICAgICA6c3RvcmU9XCJnZXRDaGlsZFN0b3JlKGJ1dHRvblNjaGVtYS5uYW1lKVwiXG4gICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gICAgICA6Z2VuZXJhdGVMYWJlbHM9XCJmYWxzZVwiXG4gICAgKVxuICB0ZW1wbGF0ZShcbiAgICB2LWZvcj1cInZub2RlIG9mICRzbG90cy5kZWZhdWx0Py4oKVwiXG4gIClcbiAgICAvLy0gUmVuZGVyIGVhY2ggbm9kZSBpbiB0aGUgZGVmYXVsdCBzbG90IHRocm91Z2ggYGRpdG8tdm5vZGVgLFxuICAgIC8vLSBzbyBpdCBjYW4gYmUgd3JhcHBlZCBpbiBhIGAuZGl0by1jb250YWluZXJgIGNsYXNzLlxuICAgIC5kaXRvLWNvbnRhaW5lcihcbiAgICAgIHYtaWY9XCJoYXNWTm9kZUNvbnRlbnQodm5vZGUpXCJcbiAgICApXG4gICAgICBEaXRvVm5vZGUoOnZub2RlPVwidm5vZGVcIilcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuaW1wb3J0IHsgYXBwZW5kRGF0YVBhdGggfSBmcm9tICcuLi91dGlscy9kYXRhLmpzJ1xuaW1wb3J0IHsgaGFzU2xvdENvbnRlbnQsIGhhc1ZOb2RlQ29udGVudCB9IGZyb20gJy4uL3V0aWxzL3Z1ZS5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvQnV0dG9ucycsIHtcbiAgcHJvdmlkZToge1xuICAgICR0YWJDb21wb25lbnQ6ICgpID0+IG51bGxcbiAgfSxcblxuICBwcm9wczoge1xuICAgIGJ1dHRvbnM6IHsgdHlwZTogT2JqZWN0LCBkZWZhdWx0OiBudWxsIH0sXG4gICAgZGF0YVBhdGg6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnJyB9LFxuICAgIGRhdGE6IHsgdHlwZTogW09iamVjdCwgQXJyYXldLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgbWV0YTogeyB0eXBlOiBPYmplY3QsIGRlZmF1bHQ6ICgpID0+ICh7fSkgfSxcbiAgICBzdG9yZTogeyB0eXBlOiBPYmplY3QsIGRlZmF1bHQ6ICgpID0+ICh7fSkgfSxcbiAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBidXR0b25TY2hlbWFzKCkge1xuICAgICAgLy8gQ29tcHV0ZSBhIGJ1dHRvbnMgbGlzdCB3aGljaCBoYXMgdGhlIGRhdGFQYXRoIGJha2VkIGludG8gaXRzIGtleXMuXG4gICAgICBjb25zdCB7IGRhdGFQYXRoLCBidXR0b25zIH0gPSB0aGlzXG4gICAgICByZXR1cm4gYnV0dG9uc1xuICAgICAgICA/IE9iamVjdC52YWx1ZXMoYnV0dG9ucykucmVkdWNlKChzY2hlbWFzLCBidXR0b24pID0+IHtcbiAgICAgICAgICAgIHNjaGVtYXNbYXBwZW5kRGF0YVBhdGgoZGF0YVBhdGgsIGJ1dHRvbi5uYW1lKV0gPSBidXR0b25cbiAgICAgICAgICAgIHJldHVybiBzY2hlbWFzXG4gICAgICAgICAgfSwge30pXG4gICAgICAgIDogbnVsbFxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgaGFzU2xvdENvbnRlbnQsXG4gICAgaGFzVk5vZGVDb250ZW50XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG4uZGl0by1idXR0b25zIHtcbiAgPiAuZGl0by1jb250YWluZXIge1xuICAgIHBhZGRpbmc6IDA7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLy8tIFNldCBgQGNsaWNrLnN0b3BgIHRvIHByZXZlbnQgY2xpY2sgZXZlbnRzIGZyb20gYnViYmxpbmcgdG8gZGl0by1sYWJlbC5cbkRpdG9CdXR0b25zLmRpdG8tZWRpdC1idXR0b25zLmRpdG8tYnV0dG9ucy1yb3VuZChcbiAgOmJ1dHRvbnM9XCJidXR0b25zXCJcbiAgOmRhdGFQYXRoPVwiZGF0YVBhdGhcIlxuICA6ZGF0YT1cImRhdGFcIlxuICA6bWV0YT1cIm1ldGFcIlxuICA6c3RvcmU9XCJzdG9yZVwiXG4gIEBjbGljay5zdG9wXG4pXG4gIC8vLSBGaXJlZm94IGRvZXNuJ3QgbGlrZSA8YnV0dG9uPiBoZXJlLCBzbyB1c2UgPGE+IGluc3RlYWQ6XG4gIGEuZGl0by1idXR0b24oXG4gICAgdi1pZj1cImlzRHJhZ2dhYmxlXCJcbiAgICB2LWJpbmQ9XCJnZXRCdXR0b25BdHRyaWJ1dGVzKHZlcmJzLmRyYWcpXCJcbiAgKVxuICBSb3V0ZXJMaW5rLmRpdG8tYnV0dG9uKFxuICAgIHYtaWY9XCJpc0VkaXRhYmxlXCJcbiAgICA6dG89XCJ7IHBhdGg6IGVkaXRQYXRoIH1cIlxuICAgIHYtYmluZD1cImdldEJ1dHRvbkF0dHJpYnV0ZXModmVyYnMuZWRpdClcIlxuICApXG4gIERpdG9DcmVhdGVCdXR0b24oXG4gICAgdi1pZj1cImlzQ3JlYXRhYmxlXCJcbiAgICA6c2NoZW1hPVwic2NoZW1hXCJcbiAgICA6cGF0aD1cImNyZWF0ZVBhdGhcIlxuICAgIDp2ZXJiPVwidmVyYnMuY3JlYXRlXCJcbiAgICA6dGV4dD1cImNyZWF0ZUJ1dHRvblRleHRcIlxuICApXG4gIGJ1dHRvbi5kaXRvLWJ1dHRvbihcbiAgICB2LWlmPVwiaXNEZWxldGFibGVcIlxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIHYtYmluZD1cImdldEJ1dHRvbkF0dHJpYnV0ZXModmVyYnMuZGVsZXRlKVwiXG4gICAgQGNsaWNrPVwiJGVtaXQoJ2RlbGV0ZScpXCJcbiAgKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5pbXBvcnQgeyBjYXBpdGFsaXplIH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvRWRpdEJ1dHRvbnMnLCB7XG4gIGVtaXRzOiBbJ2RlbGV0ZSddLFxuXG4gIHByb3BzOiB7XG4gICAgZHJhZ2dhYmxlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgZWRpdGFibGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBjcmVhdGFibGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBkZWxldGFibGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBlZGl0UGF0aDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBjcmVhdGVQYXRoOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIGJ1dHRvbnM6IHsgdHlwZTogT2JqZWN0LCBkZWZhdWx0OiBudWxsIH0sXG4gICAgc2NoZW1hOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBkYXRhUGF0aDogeyB0eXBlOiBTdHJpbmcsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZGF0YTogeyB0eXBlOiBbT2JqZWN0LCBBcnJheV0sIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBtZXRhOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBzdG9yZTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGZvcm1MYWJlbCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldExhYmVsKHRoaXMuc2NoZW1hLmZvcm0pXG4gICAgfSxcblxuICAgIGlzRHJhZ2dhYmxlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaGFzT3B0aW9uKCdkcmFnZ2FibGUnKVxuICAgIH0sXG5cbiAgICBpc0VkaXRhYmxlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaGFzT3B0aW9uKCdlZGl0YWJsZScpICYmICEhdGhpcy5lZGl0UGF0aFxuICAgIH0sXG5cbiAgICBpc0NyZWF0YWJsZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhc09wdGlvbignY3JlYXRhYmxlJykgJiYgISF0aGlzLmNyZWF0ZVBhdGhcbiAgICB9LFxuXG4gICAgaXNEZWxldGFibGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5oYXNPcHRpb24oJ2RlbGV0YWJsZScpXG4gICAgfSxcblxuICAgIGNyZWF0ZUJ1dHRvblRleHQoKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAvLyBBbGxvdyBzY2hlbWEgdG8gb3ZlcnJpZGUgY3JlYXRlIGJ1dHRvbiB0aHJvdWdoIGNyZWF0YWJsZSBvYmplY3Q6XG4gICAgICAgIHRoaXMuc2NoZW1hLmNyZWF0YWJsZT8ubGFiZWwgfHwgKFxuICAgICAgICAgIC8vIEF1dG8tZ2VuZXJhdGUgY3JlYXRlIGJ1dHRvbiBsYWJlbHMgZnJvbSBmcm9tIGxhYmVscyBmb3IgbGlzdFxuICAgICAgICAgIC8vIHNvdXJjZXMgd2l0aCBvbmx5IG9uZSBmb3JtOlxuICAgICAgICAgIHRoaXMuZm9ybUxhYmVsICYmXG4gICAgICAgICAgYCR7Y2FwaXRhbGl6ZSh0aGlzLnZlcmJzLmNyZWF0ZSl9ICR7dGhpcy5mb3JtTGFiZWx9YFxuICAgICAgICApIHx8XG4gICAgICAgIG51bGxcbiAgICAgIClcbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGhhc09wdGlvbihuYW1lKSB7XG4gICAgICAvLyBUaGUgb3B0aW9ucyBvZiB0aGUgb3V0ZXIgY29tcG9uZW50IGFyZSBwYXNzZWQgdG8gdGhlIGJ1dHRvbnMgY29tcG9uZW50XG4gICAgICAvLyB0aHJvdWdoIHByb3BlcnRpZXMgYHRoaXNbbmFtZV1gLCBidXQgY2FuIGJlIGRpc2FibGVkIG9uIGEgcGVyLWZvcm1cbiAgICAgIC8vIGJhc2lzIGJ5IHNldHRpbmcgYHNjaGVtYVtuYW1lXWAgdG8gYGZhbHNlYC5cbiAgICAgIHJldHVybiAhISh0aGlzW25hbWVdICYmIHRoaXMuc2NoZW1hW25hbWVdICE9PSBmYWxzZSlcbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG4uZGl0by1lZGl0LWJ1dHRvbnMge1xuICAvLyBPdmVycmlkZSBjdXJzb3IgZnJvbSBjb2xsYXBzaWJsZSBkaXRvLWxhYmVsOlxuICBjdXJzb3I6IGRlZmF1bHQ7XG4gIGZsZXg6IG5vbmU7XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLWNyZWF0ZS1idXR0b25cbiAgdGVtcGxhdGUoXG4gICAgdi1pZj1cInNob3dQdWxsZG93blwiXG4gIClcbiAgICBidXR0b24uZGl0by1idXR0b24oXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIDpjbGFzcz1cImBkaXRvLWJ1dHRvbi0ke3ZlcmJ9YFwiXG4gICAgICA6dGl0bGU9XCJsYWJlbGl6ZSh2ZXJiKVwiXG4gICAgICBAbW91c2Vkb3duLnN0b3A9XCJvblB1bGxkb3duTW91c2VEb3duKClcIlxuICAgICkge3sgdGV4dCB9fVxuICAgIHVsLmRpdG8tcHVsbGRvd24oOmNsYXNzPVwieyAnZGl0by1vcGVuJzogcHVsbGRvd24ub3BlbiB9XCIpXG4gICAgICBsaShcbiAgICAgICAgdi1mb3I9XCIoZm9ybSwgdHlwZSkgaW4gZm9ybXNcIlxuICAgICAgKVxuICAgICAgICBhKFxuICAgICAgICAgIHYtaWY9XCJzaG91bGRSZW5kZXIoZm9ybSlcIlxuICAgICAgICAgIHYtc2hvdz1cInNob3VsZFNob3coZm9ybSlcIlxuICAgICAgICAgIDpjbGFzcz1cImdldEZvcm1DbGFzcyhmb3JtLCB0eXBlKVwiXG4gICAgICAgICAgQG1vdXNlZG93bi5zdG9wPVwib25QdWxsZG93bk1vdXNlRG93bih0eXBlKVwiXG4gICAgICAgICAgQG1vdXNldXA9XCJvblB1bGxkb3duTW91c2VVcCh0eXBlKVwiXG4gICAgICAgICkge3sgZ2V0TGFiZWwoZm9ybSkgfX1cbiAgYnV0dG9uLmRpdG8tYnV0dG9uKFxuICAgIHYtZWxzZVxuICAgIDp0eXBlPVwiaXNJbmxpbmVkID8gJ2J1dHRvbicgOiAnc3VibWl0J1wiXG4gICAgOmNsYXNzPVwiYGRpdG8tYnV0dG9uLSR7dmVyYn1gXCJcbiAgICA6dGl0bGU9XCJsYWJlbGl6ZSh2ZXJiKVwiXG4gICAgQGNsaWNrPVwiY3JlYXRlSXRlbShmb3Jtcy5kZWZhdWx0KVwiXG4gICkge3sgdGV4dCB9fVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5pbXBvcnQgUHVsbGRvd25NaXhpbiBmcm9tICcuLi9taXhpbnMvUHVsbGRvd25NaXhpbi5qcydcbmltcG9ydCB7IGdldEZvcm1TY2hlbWFzLCBpc0lubGluZWQgfSBmcm9tICcuLi91dGlscy9zY2hlbWEuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b0NyZWF0ZUJ1dHRvbicsIHtcbiAgbWl4aW5zOiBbUHVsbGRvd25NaXhpbl0sXG5cbiAgcHJvcHM6IHtcbiAgICBzY2hlbWE6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHBhdGg6IHsgdHlwZTogU3RyaW5nLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHZlcmI6IHsgdHlwZTogU3RyaW5nLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHRleHQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGZvcm1zKCkge1xuICAgICAgcmV0dXJuIGdldEZvcm1TY2hlbWFzKHRoaXMuc2NoZW1hLCB0aGlzLmNvbnRleHQpXG4gICAgfSxcblxuICAgIGlzSW5saW5lZCgpIHtcbiAgICAgIHJldHVybiBpc0lubGluZWQodGhpcy5zY2hlbWEpXG4gICAgfSxcblxuICAgIHNob3dQdWxsZG93bigpIHtcbiAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmZvcm1zKS5sZW5ndGggPiAxIHx8ICF0aGlzLmZvcm1zLmRlZmF1bHRcbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGNyZWF0ZUl0ZW0oZm9ybSwgdHlwZSA9IG51bGwpIHtcbiAgICAgIGlmICh0aGlzLnNob3VsZFJlbmRlcihmb3JtKSAmJiAhdGhpcy5zaG91bGREaXNhYmxlKGZvcm0pKSB7XG4gICAgICAgIGlmICh0aGlzLmlzSW5saW5lZCkge1xuICAgICAgICAgIHRoaXMuc291cmNlQ29tcG9uZW50LmNyZWF0ZUl0ZW0oZm9ybSwgdHlwZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLiRyb3V0ZXIucHVzaCh7XG4gICAgICAgICAgICBwYXRoOiBgJHt0aGlzLnBhdGh9L2NyZWF0ZWAsXG4gICAgICAgICAgICBxdWVyeTogeyB0eXBlIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBhbGxvd2VkIHRvIGNyZWF0ZSBpdGVtIGZvciBnaXZlbiBmb3JtJylcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZ2V0Rm9ybUNsYXNzKGZvcm0sIHR5cGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIFtgZGl0by10eXBlLSR7dHlwZX1gXTogdHJ1ZSxcbiAgICAgICAgJ2RpdG8tZGlzYWJsZWQnOiB0aGlzLnNob3VsZERpc2FibGUoZm9ybSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgb25QdWxsZG93blNlbGVjdCh0eXBlKSB7XG4gICAgICB0aGlzLmNyZWF0ZUl0ZW0odGhpcy5mb3Jtc1t0eXBlXSwgdHlwZSlcbiAgICAgIHRoaXMuc2V0UHVsbGRvd25PcGVuKGZhbHNlKVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbi5kaXRvLWNyZWF0ZS1idXR0b24ge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG5cbiAgLmRpdG8tcHVsbGRvd24ge1xuICAgIHJpZ2h0OiAwO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLWNsaXBib2FyZC5kaXRvLWJ1dHRvbnMuZGl0by1idXR0b25zLXJvdW5kKFxuICB2LWlmPVwiY2xpcGJvYXJkXCJcbilcbiAgYnV0dG9uLmRpdG8tYnV0dG9uLmRpdG8tYnV0dG9uLWNvcHkoXG4gICAgcmVmPVwiY29weURhdGFcIlxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIHRpdGxlPVwiQ29weSBEYXRhXCJcbiAgICA6ZGlzYWJsZWQ9XCIhY29weUVuYWJsZWRcIlxuICAgIEBjbGljaz1cIm9uQ29weVwiXG4gIClcbiAgYnV0dG9uLmRpdG8tYnV0dG9uLmRpdG8tYnV0dG9uLXBhc3RlKFxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIHRpdGxlPVwiUGFzdGUgRGF0YVwiXG4gICAgOmRpc2FibGVkPVwiIXBhc3RlRW5hYmxlZFwiXG4gICAgQGNsaWNrPVwib25QYXN0ZVwiXG4gIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgeyBpc09iamVjdCwgY2xvbmUsIGRlaW5kZW50IH0gZnJvbSAnQGRpdG9qcy91dGlscydcbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5pbXBvcnQgRGl0b0NvbnRleHQgZnJvbSAnLi4vRGl0b0NvbnRleHQuanMnXG5pbXBvcnQgRG9tTWl4aW4gZnJvbSAnLi4vbWl4aW5zL0RvbU1peGluLmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9DbGlwYm9hcmQnLCB7XG4gIG1peGluczogW0RvbU1peGluXSxcblxuICBwcm9wczoge1xuICAgIGNsaXBib2FyZDogeyB0eXBlOiBbQm9vbGVhbiwgT2JqZWN0XSwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBkYXRhUGF0aDogeyB0eXBlOiBTdHJpbmcsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZGF0YTogeyB0eXBlOiBbT2JqZWN0LCBBcnJheV0sIGRlZmF1bHQ6IG51bGwgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvcHlFbmFibGVkOiBmYWxzZSxcbiAgICAgIHBhc3RlRW5hYmxlZDogZmFsc2UsXG4gICAgICBmaXhDbGlwYm9hcmQ6IHRydWVcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBjbGlwYm9hcmRPcHRpb25zKCkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0KHRoaXMuY2xpcGJvYXJkKSA/IHRoaXMuY2xpcGJvYXJkIDoge31cbiAgICB9LFxuXG4gICAgY29weURhdGEoKSB7XG4gICAgICBjb25zdCB7IGNvcHkgfSA9IHRoaXMuY2xpcGJvYXJkT3B0aW9uc1xuICAgICAgcmV0dXJuIGNvcHlcbiAgICAgICAgPyBjbGlwYm9hcmREYXRhID0+XG4gICAgICAgICAgICBjb3B5LmNhbGwoXG4gICAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICAgIG5ldyBEaXRvQ29udGV4dCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgY2xpcGJvYXJkRGF0YVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICA6IGNsaXBib2FyZERhdGEgPT4gY2xvbmUoY2xpcGJvYXJkRGF0YSlcbiAgICB9LFxuXG4gICAgcGFzdGVEYXRhKCkge1xuICAgICAgY29uc3QgeyBwYXN0ZSB9ID0gdGhpcy5jbGlwYm9hcmRPcHRpb25zXG4gICAgICByZXR1cm4gcGFzdGVcbiAgICAgICAgPyBjbGlwYm9hcmREYXRhID0+XG4gICAgICAgICAgICBwYXN0ZS5jYWxsKFxuICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICBuZXcgRGl0b0NvbnRleHQodGhpcywge1xuICAgICAgICAgICAgICAgIGNsaXBib2FyZERhdGFcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgOiBjbGlwYm9hcmREYXRhID0+IGNsaXBib2FyZERhdGFcbiAgICB9XG4gIH0sXG5cbiAgbW91bnRlZCgpIHtcbiAgICAvLyBDaGVjayBjbGlwYm9hcmQgY29udGVudCB3aGVuZXZlciBzb21ldGhpbmcgZ2V0cyBjb3BpZWQgb3IgdGhlIHdpbmRvdyBnZXRzXG4gICAgLy8gKHJlKWFjdGl2YXRlZCwgYXMgdGhvc2UgYXJlIHRoZSBtb21lbnRzIHdoZW4gdGhlIGNsaXBib2FyZCBjYW4gY2hhbmdlOlxuICAgIHRoaXMuZG9tT24oZG9jdW1lbnQsIHtcbiAgICAgIGNvcHk6IHRoaXMuY2hlY2tDbGlwYm9hcmRcbiAgICB9KVxuICAgIHRoaXMuZG9tT24od2luZG93LCB7XG4gICAgICBmb2N1czogdGhpcy5jaGVja0NsaXBib2FyZFxuICAgIH0pXG4gICAgdGhpcy4kd2F0Y2goJ2RhdGEnLCB7XG4gICAgICAvLyBDaGVjayByaWdodCBhd2F5IGFsc28gaW4gY2FzZSB0aGVyZSdzIGFscmVhZHkgZGF0YSAoZS5nLiBjcmVhdGUgZm9ybSkuXG4gICAgICBpbW1lZGlhdGU6IHRydWUsXG4gICAgICBoYW5kbGVyOiAodG8sIGZyb20pID0+IHtcbiAgICAgICAgaWYgKHRvICE9PSBmcm9tKSB7XG4gICAgICAgICAgdGhpcy5jaGVja0NsaXBib2FyZCgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBhc3luYyBnZXRDbGlwYm9hcmREYXRhKHJlcG9ydCkge1xuICAgICAgLy8gVXNlIHRoZSBpbnRlcm5hbCBjbGlwYm9hcmQgYXMgZmFsbGJhY2suXG4gICAgICBsZXQgeyBjbGlwYm9hcmREYXRhIH0gPSB0aGlzLmFwcFN0YXRlXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBqc29uID0gYXdhaXQgbmF2aWdhdG9yLmNsaXBib2FyZD8ucmVhZFRleHQ/LigpXG4gICAgICAgIGlmICh0aGlzLmZpeENsaXBib2FyZCAmJiBqc29uKSB7XG4gICAgICAgICAgLy8gVGhpcyBhcHBlYXJzIHRvIGJlIG5lZWRlZCBvbiBTYWZhcmkgdG8gcHJldmVudCBhIHN0cmFuZ2UgXCJQYXN0ZVwiXG4gICAgICAgICAgLy8gYnV0dG9uIGZyb20gYXBwZWFyaW5nIHdoZW4gdGhlIGNsaXBib2FyZCBpcyBhY2Nlc3NlZCAod2h5PyEpLlxuICAgICAgICAgIGF3YWl0IG5hdmlnYXRvci5jbGlwYm9hcmQ/LndyaXRlVGV4dD8uKGpzb24pXG4gICAgICAgICAgdGhpcy5maXhDbGlwYm9hcmQgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIGlmIChqc29uKSB7XG4gICAgICAgICAgY2xpcGJvYXJkRGF0YSA9IEpTT04ucGFyc2UoanNvbilcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChyZXBvcnQpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVyciwgZXJyLm5hbWUsIGVyci5tZXNzYWdlKVxuICAgICAgICAgIGlmIChlcnIubmFtZSA9PT0gJ1N5bnRheEVycm9yJykge1xuICAgICAgICAgICAgYWxlcnQoZGVpbmRlbnRgXG4gICAgICAgICAgICAgIFRoZSBkYXRhIGluIHRoZSBjbGlwYm9hcmQgYXBwZWFycyB0byBiZSBtYWxmb3JtZWQ6XG4gICAgICAgICAgICAgICR7ZXJyLm1lc3NhZ2V9XG4gICAgICAgICAgICBgKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgeyAkc2NoZW1hLCAuLi5kYXRhIH0gPSBjbGlwYm9hcmREYXRhIHx8IHt9XG4gICAgICByZXR1cm4gJHNjaGVtYSA9PT0gdGhpcy5zY2hlbWFDb21wb25lbnQ/LnNjaGVtYS5uYW1lID8gZGF0YSA6IG51bGxcbiAgICB9LFxuXG4gICAgYXN5bmMgY2hlY2tDbGlwYm9hcmQoKSB7XG4gICAgICB0aGlzLmNvcHlFbmFibGVkID0gISF0aGlzLmRhdGFcbiAgICAgIC8vIFNlZSBpZiB0aGUgY2xpcGJvYXJkIGNvbnRlbnQgaXMgdmFsaWQgSlNPTiBkYXRhIHRoYXQgaXMgY29tcGF0aWJsZVxuICAgICAgLy8gd2l0aCB0aGUgY3VycmVudCB0YXJnZXQgc2NoZW1hLCBhbmQgb25seSB0aGVuIGFjdGl2YXRlIHRoZSBwYXN0aW5nOlxuICAgICAgdGhpcy5wYXN0ZUVuYWJsZWQgPSAhIShhd2FpdCB0aGlzLmdldENsaXBib2FyZERhdGEoZmFsc2UpKSAvLyBkb24ndCByZXBvcnRcbiAgICB9LFxuXG4gICAgYXN5bmMgb25Db3B5KCkge1xuICAgICAgbGV0IGRhdGEgPSB0aGlzLnNjaGVtYUNvbXBvbmVudD8uY2xpcGJvYXJkRGF0YVxuICAgICAgdHJ5IHtcbiAgICAgICAgZGF0YSA9IGRhdGEgJiYgdGhpcy5jb3B5RGF0YShkYXRhKVxuICAgICAgICAvLyBLZWVwIGFuIGludGVybmFsIGNsaXBib2FyZCBhcyBmYWxsYmFjay5cbiAgICAgICAgdGhpcy5hcHBTdGF0ZS5jbGlwYm9hcmREYXRhID0gZGF0YVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCAyKVxuICAgICAgICAgIGF3YWl0IG5hdmlnYXRvci5jbGlwYm9hcmQ/LndyaXRlVGV4dD8uKGpzb24pXG4gICAgICAgICAgLy8gU2VlIGlmIHdlIGNhbiBhY3RpdmF0ZSB0aGUgcGFzdGUgYnV0dG9uLCBkZXBlbmRpbmcgb24gYnJvd3NlcnM6XG4gICAgICAgICAgYXdhaXQgdGhpcy5jaGVja0NsaXBib2FyZCgpXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyLCBlcnIubmFtZSwgZXJyLm1lc3NhZ2UpXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpXG4gICAgICAgIGFsZXJ0KGVycm9yLm1lc3NhZ2UpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIG9uUGFzdGUoKSB7XG4gICAgICBsZXQgZGF0YSA9IGF3YWl0IHRoaXMuZ2V0Q2xpcGJvYXJkRGF0YSh0cnVlKSAvLyByZXBvcnRcbiAgICAgIHRyeSB7XG4gICAgICAgIGRhdGEgPSBkYXRhICYmIHRoaXMucGFzdGVEYXRhKGRhdGEpXG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgdGhpcy5zY2hlbWFDb21wb25lbnQuc2V0RGF0YShkYXRhKVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKVxuICAgICAgICBhbGVydChlcnJvci5tZXNzYWdlKVxuICAgICAgfVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuIiwiLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaXNMb2FkaW5nOiBmYWxzZVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgc2V0TG9hZGluZyhpc0xvYWRpbmcsIHsgdXBkYXRlUm9vdCA9IGZhbHNlLCB1cGRhdGVWaWV3ID0gZmFsc2UgfSA9IHt9KSB7XG4gICAgICBpZiAoIXRoaXMuaXNMb2FkaW5nIF4gIWlzTG9hZGluZykge1xuICAgICAgICAvLyBCb29sZWFuIHhvclxuICAgICAgICB0aGlzLmlzTG9hZGluZyA9ICEhaXNMb2FkaW5nXG4gICAgICAgIGlmICh1cGRhdGVSb290KSB7XG4gICAgICAgICAgdGhpcy5yb290Q29tcG9uZW50LnJlZ2lzdGVyTG9hZGluZyhpc0xvYWRpbmcpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwZGF0ZVZpZXcpIHtcbiAgICAgICAgICB0aGlzLnZpZXdDb21wb25lbnQuc2V0TG9hZGluZyh0aGlzLmlzTG9hZGluZylcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IEl0ZW1NaXhpbiBmcm9tICcuL0l0ZW1NaXhpbi5qcydcbmltcG9ydCBMb2FkaW5nTWl4aW4gZnJvbSAnLi9Mb2FkaW5nTWl4aW4uanMnXG5pbXBvcnQgeyBzZXREZWZhdWx0VmFsdWVzIH0gZnJvbSAnLi4vdXRpbHMvc2NoZW1hLmpzJ1xuaW1wb3J0IHsgaXNPYmplY3QsIGlzU3RyaW5nLCBsYWJlbGl6ZSB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgeyBnZXRSZXNvdXJjZSB9IGZyb20gJy4uL3V0aWxzL3Jlc291cmNlLmpzJ1xuaW1wb3J0IERpdG9Db250ZXh0IGZyb20gJy4uL0RpdG9Db250ZXh0LmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQge1xuICBtaXhpbnM6IFtJdGVtTWl4aW4sIExvYWRpbmdNaXhpbl0sXG5cbiAgcHJvdmlkZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJHJlc291cmNlQ29tcG9uZW50OiAoKSA9PiB0aGlzLFxuICAgICAgLy8gUGFzcyBsb2NhbCB2ZXJicyBvdmVycmlkZXMgb24gdG8gY2hpbGRyZW4sIHNlZSB2ZXJicygpIGNvbXB1dGVkIHByb3AuXG4gICAgICAkdmVyYnM6ICgpID0+IHRoaXMudmVyYnMsXG4gICAgICAkaXNQb3B1bGF0ZWQ6ICgpID0+IHRoaXMuaGFzRGF0YVxuICAgIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBsb2FkZWREYXRhOiBudWxsXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgcmVzb3VyY2VDb21wb25lbnQoKSB7XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH0sXG5cbiAgICByZXNvdXJjZSgpIHtcbiAgICAgIC8vIFJldHVybnMgdGhlIHJlc291cmNlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHJlc291cmNlIGZvciB0aGVcbiAgICAgIC8vIGFzc29jaWF0ZWQgc291cmNlIHNjaGVtYS5cbiAgICAgIHJldHVybiB0aGlzLmdldFJlc291cmNlKClcbiAgICB9LFxuXG4gICAgcHJvdmlkZXNEYXRhKCkge1xuICAgICAgLy8gVGhpcyBjb21wb25lbnQgaXMgYSBkYXRhLXNvdXJjZSBpZiBpdCBoYXMgYW4gYXNzb2NpYXRlZCBBUEkgcmVzb3VyY2U6XG4gICAgICByZXR1cm4gISF0aGlzLnJlc291cmNlXG4gICAgfSxcblxuICAgIGxpbmtzVG9WaWV3KCkge1xuICAgICAgLy8gUmV0dXJucyBgZmFsc2VgaGVyZSwgYnV0IGlzIG92ZXJyaWRkZW4gdG8gcmV0dXJuIGB0cnVlYCBpblxuICAgICAgLy8gYFNvdXJjZU1peGluYCBmb3IgY29tcG9uZW50IHRoYXQgZG8gbm90IHByb3ZpZGUgdGhlaXIgb3duIGRhdGEsIGJ1dFxuICAgICAgLy8gZWRpdCB0aGVpciBpdGVtcyB0aHJvdWdoIGEgbGlua2VkIHZpZXcuICBJbiB0aGlzIGNhc2UsIHJlYWwgaWRzIG5lZWQgdG9cbiAgICAgIC8vIGJlIHVzZWQuXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9LFxuXG4gICAgaXNUcmFuc2llbnQoKSB7XG4gICAgICAvLyBDaGVjayB0aGUgZm9ybSB0aGF0IHRoaXMgY29tcG9uZW50IGJlbG9uZ3MgdG8gYXMgd2VsbCwgc2luY2UgaXQgbWF5IGJlXG4gICAgICAvLyBpbiBjcmVhdGlvbiBtb2RlLCB3aGljaCBtYWtlcyBpdCB0cmFuc2llbnQuXG4gICAgICAvLyBOT1RFOiBUaGlzIGRvZXMgbm90IGxvb3AgZW5kbGVzc2x5IGJlY2F1c2UgRGl0b0Zvcm0gcmVkZWZpbmVzXG4gICAgICAvLyBgaXNUcmFuc2llbnQoKWAgdG8gb25seSByZXR1cm4gYCF0aGlzLnByb3ZpZGVzRGF0YWAuXG4gICAgICBjb25zdCBmb3JtID0gdGhpcy5mb3JtQ29tcG9uZW50XG4gICAgICByZXR1cm4gKFxuICAgICAgICAhdGhpcy5wcm92aWRlc0RhdGEgJiZcbiAgICAgICAgIXRoaXMubGlua3NUb1ZpZXcgfHxcbiAgICAgICAgZm9ybSAmJiAoXG4gICAgICAgICAgZm9ybS5pc1RyYW5zaWVudCB8fFxuICAgICAgICAgIGZvcm0uaXNDcmVhdGluZ1xuICAgICAgICApXG4gICAgICApXG4gICAgfSxcblxuICAgIHRyYW5zaWVudE5vdGUoKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLmlzVHJhbnNpZW50ICYmIChcbiAgICAgICAgICAnPGI+Tm90ZTwvYj46IHRoZSBwYXJlbnQgc3RpbGwgbmVlZHMgdG8gYmUgc2F2ZWQgJyArXG4gICAgICAgICAgJ2luIG9yZGVyIHRvIHBlcnNpc3QgdGhpcyBjaGFuZ2UuJ1xuICAgICAgICApXG4gICAgICApXG4gICAgfSxcblxuICAgIHNob3VsZExvYWQoKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAhdGhpcy5pc1RyYW5zaWVudCAmJlxuICAgICAgICAhdGhpcy5pc0xvYWRpbmdcbiAgICAgIClcbiAgICB9LFxuXG4gICAgLy8gQG92ZXJyaWRhYmxlXG4gICAgaGFzRGF0YSgpIHtcbiAgICAgIC8vIEJhc2UgZGVmaW5pdGlvbiwgd2lsbCBiZSBvdmVycmlkZGVuIGJ5IERpdG9Gb3JtIGFuZCBTb3VyY2VNaXhpblxuICAgICAgcmV0dXJuICEhdGhpcy5sb2FkZWREYXRhXG4gICAgfSxcblxuICAgIHZlcmJzKCkge1xuICAgICAgLy8gVGhlIGFjdHVhbCBjb2RlIGlzIHRoZSBgZ2V0VmVyYnMoKWAgbWV0aG9kLCBmb3IgZWFzaWVyIG92ZXJyaWRpbmcgb2ZcbiAgICAgIC8vIHRoaXMgY29tcHV0ZWQgcHJvcGVydHkgaW4gY29tcG9uZW50cyB0aGF0IHVzZSB0aGUgUmVzb3VyY2VNaXhpbi5cbiAgICAgIHJldHVybiB0aGlzLmdldFZlcmJzKClcbiAgICB9LFxuXG4gICAgcGFnaW5hdGlvblJhbmdlKCkge1xuICAgICAgLy8gT25seSBhcHBseSBwYWdpbmF0aW9uIHRvIGxpc3RzLlxuICAgICAgY29uc3QgeyBwYWdpbmF0ZTogYW1vdW50IH0gPSB0aGlzLnNvdXJjZVNjaGVtYVxuICAgICAgaWYgKHRoaXMuaXNMaXN0U291cmNlICYmIGFtb3VudCkge1xuICAgICAgICBjb25zdCB7IHBhZ2UgPSAwIH0gPSB0aGlzLnF1ZXJ5IHx8IHt9XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gcGFnZSAqIGFtb3VudFxuICAgICAgICByZXR1cm4gW3N0YXJ0LCBzdGFydCArIGFtb3VudCAtIDFdXG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH0sXG5cbiAgICBxdWVyeVBhcmFtcygpIHtcbiAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5wYWdpbmF0aW9uUmFuZ2VcbiAgICAgIGNvbnN0IHsgcGFnZSwgLi4ucXVlcnkgfSA9IHRoaXMucXVlcnkgfHwge31cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnF1ZXJ5LCAvLyBRdWVyeSBtYXkgb3ZlcnJpZGUgc2NvcGUuXG4gICAgICAgIC4uLihyYW5nZSAmJiB7XG4gICAgICAgICAgLy8gUGFzcyBwYWdpbmF0aW9uIGFzIHJhbmdlLCBzbyB0aGF0IHdlIGF1dG9tYXRpY2FsbHkgZ2V0IE9iamVjdGlvbidzXG4gICAgICAgICAgLy8gcmVzdWx0cyBjb3VudGluZzpcbiAgICAgICAgICByYW5nZTogcmFuZ2Uuam9pbignLCcpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGNyZWF0ZWQoKSB7XG4gICAgLy8gV2hlbiBjcmVhdGluZyBuZXN0ZWQgZGF0YSwgd2Ugc3RpbGwgbmVlZCB0byBjYWxsIHNldHVwRGF0YSgpXG4gICAgaWYgKHRoaXMucHJvdmlkZXNEYXRhIHx8IHRoaXMuaXNDcmVhdGluZykge1xuICAgICAgdGhpcy5zZXR1cERhdGEoKVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0UmVzb3VyY2UoKSB7XG4gICAgICAvLyBUaGlzIGlzIGRlZmluZWQgYXMgYSBtZXRob2Qgc28gdGhlIGNvbXB1dGVkIGByZXNvdXJjZWAgZ2V0dGVyIGNhblxuICAgICAgLy8gYmUgb3ZlcnJpZGRlbiBhbmQgYHN1cGVyYCBmdW5jdGlvbmFsaXR5IGNhbiBzdGlsbCBiZSBhY2Nlc3NlZC5cbiAgICAgIHJldHVybiBnZXRSZXNvdXJjZSh0aGlzLnNvdXJjZVNjaGVtYT8ucmVzb3VyY2UsIHtcbiAgICAgICAgdHlwZTogJ2NvbGxlY3Rpb24nLFxuICAgICAgICBwYXJlbnQ6IHRoaXMucGFyZW50Rm9ybUNvbXBvbmVudD8ucmVzb3VyY2UgPz8gbnVsbFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgZ2V0VmVyYnMoKSB7XG4gICAgICBjb25zdCB2ZXJicyA9IHRoaXMuJHZlcmJzKClcbiAgICAgIHJldHVybiB0aGlzLmlzVHJhbnNpZW50XG4gICAgICAgID8ge1xuICAgICAgICAgICAgLi4udmVyYnMsXG4gICAgICAgICAgICAvLyBPdmVycmlkZSBkZWZhdWx0IHZlcmJzIHdpdGggdGhlaXIgdHJhbnNpZW50IHZlcnNpb25zOlxuICAgICAgICAgICAgY3JlYXRlOiAnYWRkJyxcbiAgICAgICAgICAgIGNyZWF0ZWQ6ICdhZGRlZCcsXG4gICAgICAgICAgICBzYXZlOiAnYXBwbHknLFxuICAgICAgICAgICAgc2F2ZWQ6ICdhcHBsaWVkJyxcbiAgICAgICAgICAgIGRlbGV0ZTogJ3JlbW92ZScsXG4gICAgICAgICAgICBkZWxldGVkOiAncmVtb3ZlZCdcbiAgICAgICAgICB9XG4gICAgICAgIDogdmVyYnNcbiAgICB9LFxuXG4gICAgLy8gQG92ZXJyaWRhYmxlXG4gICAgY2xlYXJEYXRhKCkge1xuICAgICAgdGhpcy5sb2FkZWREYXRhID0gbnVsbFxuICAgIH0sXG5cbiAgICAvLyBAb3ZlcnJpZGFibGVcbiAgICBzZXREYXRhKGRhdGEpIHtcbiAgICAgIHRoaXMubG9hZGVkRGF0YSA9IGRhdGFcbiAgICB9LFxuXG4gICAgc2V0dXBEYXRhKCkge1xuICAgICAgLy8gQWN0dWFsIGNvZGUgaXMgaW4gc2VwYXJhdGUgZnVuY3Rpb24gc28gaXQncyBlYXNlciB0byBvdmVycmlkZVxuICAgICAgLy8gYHNldHVwRGF0YSgpYCBhbmQgYW5kIGNhbGwgYGVuc3VyZURhdGEoKWAgZnJvbSB0aGUgb3ZlcnJpZGVzLFxuICAgICAgLy8gc2VlIERpdG9Gb3JtIGFuZCBTb3VyY2VNaXhpbi5cbiAgICAgIHRoaXMuZW5zdXJlRGF0YSgpXG4gICAgfSxcblxuICAgIGVuc3VyZURhdGEoKSB7XG4gICAgICBpZiAodGhpcy5zaG91bGRMb2FkKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0RhdGEpIHtcbiAgICAgICAgICB0aGlzLnJlbG9hZERhdGEoKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMubG9hZERhdGEodHJ1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICByZWxvYWREYXRhKCkge1xuICAgICAgdGhpcy5sb2FkRGF0YShmYWxzZSlcbiAgICB9LFxuXG4gICAgbG9hZERhdGEoY2xlYXIpIHtcbiAgICAgIGlmICghdGhpcy5pc1RyYW5zaWVudCkge1xuICAgICAgICBpZiAoY2xlYXIpIHtcbiAgICAgICAgICB0aGlzLmNsZWFyRGF0YSgpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZXF1ZXN0RGF0YSgpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGNyZWF0ZURhdGEoc2NoZW1hLCB0eXBlKSB7XG4gICAgICByZXR1cm4gc2V0RGVmYXVsdFZhbHVlcyhzY2hlbWEsIHR5cGUgPyB7IHR5cGUgfSA6IHt9LCB0aGlzKVxuICAgIH0sXG5cbiAgICByZXF1ZXN0RGF0YSgpIHtcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5xdWVyeVBhcmFtc1xuICAgICAgdGhpcy5oYW5kbGVSZXF1ZXN0KHsgbWV0aG9kOiAnZ2V0JywgcXVlcnkgfSwgKGVyciwgcmVzcG9uc2UpID0+IHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBkYXRhPy50eXBlID09PSAnRmlsdGVyVmFsaWRhdGlvbicgJiZcbiAgICAgICAgICAgICAgdGhpcy5vbkZpbHRlckVycm9ycz8uKGRhdGEuZXJyb3JzKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNVbmF1dGhvcml6ZWRFcnJvcihyZXNwb25zZSkpIHtcbiAgICAgICAgICAgICAgLy8gVE9ETzogQ2FuIHdlIHJlYWxseSBzd2FsbG93IHRoZXNlIGVycm9ycz9cbiAgICAgICAgICAgICAgLy8gSXMgY2FsbGluZyBgZW5zdXJlVXNlcigpYCBpbiBgb25CZWZvcmVSZXF1ZXN0KClgIGVub3VnaD9cbiAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zZXREYXRhKHJlc3BvbnNlLmRhdGEpXG4gICAgICAgICAgdGhpcy5lbWl0U2NoZW1hRXZlbnQoJ2xvYWQnKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBpc1ZhbGlkYXRpb25FcnJvcihyZXNwb25zZSkge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlPy5zdGF0dXMgPT09IDQwMFxuICAgIH0sXG5cbiAgICBpc1VuYXV0aG9yaXplZEVycm9yKHJlc3BvbnNlKSB7XG4gICAgICByZXR1cm4gcmVzcG9uc2U/LnN0YXR1cyA9PT0gNDAxXG4gICAgfSxcblxuICAgIGFzeW5jIGhhbmRsZVJlcXVlc3QoXG4gICAgICB7XG4gICAgICAgIG1ldGhvZCxcbiAgICAgICAgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlLFxuICAgICAgICBxdWVyeSxcbiAgICAgICAgZGF0YVxuICAgICAgfSxcbiAgICAgIGNhbGxiYWNrXG4gICAgKSB7XG4gICAgICBjb25zdCBsb2FkaW5nT3B0aW9ucyA9IHtcbiAgICAgICAgdXBkYXRlUm9vdDogdHJ1ZSwgLy8gRGlzcGxheSBzcGlubmVyIGluIGhlYWRlciB3aGVuIGxvYWRpbmcgaW4gcmVzb3VyY2VzXG4gICAgICAgIHVwZGF0ZVZpZXc6IHRoaXMuaXNJblZpZXcgLy8gTm90aWZ5IHZpZXcgb2YgbG9hZGluZyBmb3IgdmlldyBjb21wb25lbnRzXG4gICAgICB9XG4gICAgICB0aGlzLnNldExvYWRpbmcodHJ1ZSwgbG9hZGluZ09wdGlvbnMpXG4gICAgICBjb25zdCByZXF1ZXN0ID0geyBtZXRob2QsIHJlc291cmNlLCBkYXRhLCBxdWVyeSB9XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuc2VuZFJlcXVlc3QocmVxdWVzdClcbiAgICAgICAgLy8gUGFzcyBib3RoIHJlcXVlc3QgYW5kIHJlc3BvbnNlIHRvIHRoZSBjYWxsYmFjaywgc28gdGhleSBjYW4gYmVcbiAgICAgICAgLy8gZXhwb3NlZCB0byBmdXJ0aGVyIGNhbGxiYWNrcyB0aHJvdWdoIERpdG9Db250ZXh0LlxuICAgICAgICBjYWxsYmFjayhudWxsLCByZXNwb25zZSlcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIElmIGNhbGxiYWNrIHJldHVybnMgdHJ1ZSwgZXJyb3JzIHdlcmUgYWxyZWFkeSBoYW5kbGVkLlxuICAgICAgICBjb25zdCB7IHJlc3BvbnNlIH0gPSBlcnJvclxuICAgICAgICBpZiAoIWNhbGxiYWNrKGVycm9yLCByZXNwb25zZSkpIHtcbiAgICAgICAgICBjb25zdCBkYXRhID0gcmVzcG9uc2U/LmRhdGFcbiAgICAgICAgICBjb25zdCB0aXRsZSA9IGlzU3RyaW5nKGRhdGE/LnR5cGUpXG4gICAgICAgICAgICA/IGxhYmVsaXplKGRhdGEudHlwZSlcbiAgICAgICAgICAgIDogJ0Vycm9yJ1xuICAgICAgICAgIGNvbnN0IHRleHQgPSBkYXRhPy5tZXNzYWdlID8/IGVycm9yXG4gICAgICAgICAgdGhpcy5ub3RpZnkoeyB0eXBlOiAnZXJyb3InLCB0aXRsZSwgdGV4dCB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnNldExvYWRpbmcoZmFsc2UsIGxvYWRpbmdPcHRpb25zKVxuICAgIH0sXG5cbiAgICBnZXRQYXlsb2FkRGF0YShidXR0b24sIG1ldGhvZCkge1xuICAgICAgLy8gQ29udmVudGlvbjogb25seSBwb3N0LCBwdXQgYW5kIHBhdGNoIHJlcXVlc3RzIHBhc3MgdGhlIGRhdGEgYXMgcGF5bG9hZC5cbiAgICAgIHJldHVybiAoXG4gICAgICAgIFsncG9zdCcsICdwdXQnLCAncGF0Y2gnXS5pbmNsdWRlcyhtZXRob2QpICYmIChcbiAgICAgICAgICAvLyBUT0RPOiBVc2UgYGhhbmRsZURhdGFTY2hlbWEoKWAgYXN5bmNocm9ub3VzbHkgaGVyZSBpbnN0ZWFkLCB0b1xuICAgICAgICAgIC8vIG9mZmVyIHRoZSBzYW1lIGFtb3VudCBvZiBwb3NzaWJpbGl0aWVzIGZvciBkYXRhIGxvYWRpbmcuXG4gICAgICAgICAgYnV0dG9uLmdldFNjaGVtYVZhbHVlKFsncmVzb3VyY2UnLCAnZGF0YSddKSB8fFxuICAgICAgICAgIGJ1dHRvbi5wcm9jZXNzZWRJdGVtXG4gICAgICAgIClcbiAgICAgIClcbiAgICB9LFxuXG4gICAgYXN5bmMgc3VibWl0KGJ1dHRvbikge1xuICAgICAgY29uc3QgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZShidXR0b24uc2NoZW1hLnJlc291cmNlLCB7XG4gICAgICAgIHBhcmVudDogdGhpcy5yZXNvdXJjZVxuICAgICAgfSlcbiAgICAgIGlmIChyZXNvdXJjZSkge1xuICAgICAgICBjb25zdCB7IG1ldGhvZCB9ID0gcmVzb3VyY2VcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZ2V0UGF5bG9hZERhdGEoYnV0dG9uLCBtZXRob2QpXG4gICAgICAgIHJldHVybiB0aGlzLnN1Ym1pdFJlc291cmNlKGJ1dHRvbiwgcmVzb3VyY2UsIG1ldGhvZCwgZGF0YSlcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0sXG5cbiAgICBhc3luYyBzdWJtaXRSZXNvdXJjZShidXR0b24sIHJlc291cmNlLCBtZXRob2QsIGRhdGEsIHtcbiAgICAgIHNldERhdGEgPSBmYWxzZSxcbiAgICAgIG9uU3VjY2VzcyxcbiAgICAgIG9uRXJyb3IsXG4gICAgICBub3RpZnlTdWNjZXNzID0gKCkgPT5cbiAgICAgICAgdGhpcy5ub3RpZnkoe1xuICAgICAgICAgIHR5cGU6ICdzdWNjZXNzJyxcbiAgICAgICAgICB0aXRsZTogJ1JlcXVlc3QgU3VjY2Vzc2Z1bCcsXG4gICAgICAgICAgdGV4dDogJ1JlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWxseSBzZW50LidcbiAgICAgICAgfSksXG4gICAgICBub3RpZnlFcnJvciA9IGVycm9yID0+XG4gICAgICAgIHRoaXMubm90aWZ5KHtcbiAgICAgICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgICAgIHRpdGxlOiAnUmVxdWVzdCBFcnJvcicsXG4gICAgICAgICAgdGV4dDogW1xuICAgICAgICAgICAgYFVuYWJsZSB0byBzZW5kIHJlcXVlc3Qke2Vycm9yID8gJzonIDogJyd9YCxcbiAgICAgICAgICAgIGVycm9yPy5tZXNzYWdlIHx8IGVycm9yXG4gICAgICAgICAgXVxuICAgICAgICB9KVxuICAgIH0gPSB7fSkge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICB0aGlzLmhhbmRsZVJlcXVlc3QoXG4gICAgICAgICAgeyBtZXRob2QsIHJlc291cmNlLCBkYXRhIH0sXG4gICAgICAgICAgYXN5bmMgKGVyciwgcmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSByZXNwb25zZT8uZGF0YVxuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAvLyBTZWUgaWYgd2UncmUgZGVhbGluZyB3aXRoIGEgRGl0byB2YWxpZGF0aW9uIGVycm9yOlxuICAgICAgICAgICAgICBjb25zdCBlcnJvcnMgPSB0aGlzLmlzVmFsaWRhdGlvbkVycm9yKHJlc3BvbnNlKSAmJiBkYXRhLmVycm9yc1xuICAgICAgICAgICAgICBpZiAoZXJyb3JzKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zaG93VmFsaWRhdGlvbkVycm9ycyhlcnJvcnMsIHRydWUpXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBpc09iamVjdChkYXRhKSA/IGRhdGEgOiBlcnJcbiAgICAgICAgICAgICAgICBvbkVycm9yPy4oZXJyb3IpXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5lbWl0QnV0dG9uRXZlbnQoYnV0dG9uLCAnZXJyb3InLCB7XG4gICAgICAgICAgICAgICAgICBub3RpZnk6IG5vdGlmeUVycm9yLFxuICAgICAgICAgICAgICAgICAgZXJyb3JcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHVuZGVybHlpbmcgZGF0YSBiZWZvcmUgY2FsbGluZyBgbm90aWZ5KClgIG9yXG4gICAgICAgICAgICAgIC8vIGB0aGlzLml0ZW1MYWJlbGAsIHNvIGlkIGlzIHNldCBhZnRlciBjcmVhdGluZyBuZXcgaXRlbXMuXG4gICAgICAgICAgICAgIGlmIChzZXREYXRhICYmIGRhdGEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldERhdGEoZGF0YSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBvblN1Y2Nlc3M/LigpXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuZW1pdEJ1dHRvbkV2ZW50KGJ1dHRvbiwgJ3N1Y2Nlc3MnLCB7XG4gICAgICAgICAgICAgICAgbm90aWZ5OiBub3RpZnlTdWNjZXNzXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIClcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVtaXRCdXR0b25FdmVudChidXR0b24sIGV2ZW50LCB7IG5vdGlmeSwgZXJyb3IgfSkge1xuICAgICAgLy8gQ3JlYXRlIHRoZSBjb250ZXh0IG91dHNpZGUgb2YgYGVtaXRFdmVudCgpYCwgc28gdGhhdFxuICAgICAgLy8gYGNvbnRleHQud2FzTm90aWZpZWRgIGNhbiBiZSBjaGVja2VkIGFmdGVyLlxuICAgICAgY29uc3QgY29udGV4dCA9IG5ldyBEaXRvQ29udGV4dChidXR0b24sIHtcbiAgICAgICAgbmVzdGVkOiBmYWxzZSxcbiAgICAgICAgZGF0YTogdGhpcy5kYXRhLFxuICAgICAgICBpdGVtTGFiZWw6IHRoaXMuaXRlbUxhYmVsLFxuICAgICAgICBlcnJvclxuICAgICAgfSlcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGJ1dHRvbi5lbWl0RXZlbnQoZXZlbnQsIHsgY29udGV4dCB9KVxuICAgICAgaWYgKFxuICAgICAgICBub3RpZnkgJiZcbiAgICAgICAgLy8gUHJldmVudCBkZWZhdWx0IGlmIGFueXRoaW5nIHdhcyByZXR1cm5lZCBmcm9tIHRoZSBldmVudCBoYW5kbGVyLlxuICAgICAgICByZXMgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAvLyBEbyBub3QgZGlzcGxheSBkZWZhdWx0IG5vdGlmaWNhdGlvbiBpZiB0aGUgZXZlbnQgaGFuZGxlciBhbHJlYWR5XG4gICAgICAgIC8vIGRpc3BsYXllZCBhIG5vdGlmaWNhdGlvbi5cbiAgICAgICAgIWNvbnRleHQud2FzTm90aWZpZWRcbiAgICAgICkge1xuICAgICAgICBub3RpZnkoZXJyb3IpXG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzXG4gICAgfVxuICB9XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVBhdGgocGF0aCkge1xuICAvLyBGb3IgcGF0aHMgc3RhcmluZyB3aXRoIGAvYCwgd2UgY2FuIHVzZSB0aGUgbmF0aXZlIGBVUkwoKWAgY2xhc3MgdG8gcmVzb2x2ZVxuICAvLyB0aGUgcGF0aCwgd2hpY2ggd2lsbCBhbHNvIGhhbmRsZSBgLi5gIGFuZCBgLmAgc2VnbWVudHM6XG4gIHJldHVybiBuZXcgVVJMKGBmaWxlOiR7cGF0aH1gKS5wYXRobmFtZVxufVxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLWZvcm0uZGl0by1zY3JvbGwtcGFyZW50KFxuICA6Y2xhc3M9XCJ7ICdkaXRvLWZvcm0tbmVzdGVkJzogaXNOZXN0ZWRSb3V0ZSB9XCJcbiAgOmRhdGEtcmVzb3VyY2U9XCJzb3VyY2VTY2hlbWEucGF0aFwiXG4pXG4gIC8vLSBOT1RFOiBOZXN0ZWQgZm9ybSBjb21wb25lbnRzIGFyZSBrZXB0IGFsaXZlIGJ5IHVzaW5nIGB2LXNob3dgIGluc3RlYWQgb2ZcbiAgLy8tIGB2LWlmYCBoZXJlLCBzbyBldmVudCBoYW5kbGluZyBhbmQgb3RoZXIgdGhpbmdzIHN0aWxsIHdvcmsgd2l0aCBuZXN0ZWRcbiAgLy8tIGVkaXRpbmcuIE9ubHkgcmVuZGVyIGEgcm91dGVyLXZpZXcgaGVyZSBpZiB0aGlzIGlzbid0IHRoZSBsYXN0IGRhdGEgcm91dGVcbiAgLy8tIGFuZCBub3QgYSBuZXN0ZWQgZm9ybSByb3V0ZSwgd2hpY2ggd2lsbCBhcHBlYXIgZWxzZXdoZXJlIGluIGl0cyBvd24gdmlldy5cbiAgUm91dGVyVmlldyhcbiAgICB2LWlmPVwiIShpc0xhc3RVbm5lc3RlZFJvdXRlIHx8IGlzTmVzdGVkUm91dGUpXCJcbiAgICB2LXNob3c9XCIhaXNBY3RpdmVcIlxuICApXG4gIC8vLSBVc2UgYSA8ZGl2PiBmb3IgaW5saW5lZCBmb3JtcywgYXMgd2Ugc2hvdWxkbid0IG5lc3QgYWN0dWFsIDxmb3JtPiB0YWdzLlxuICBjb21wb25lbnQuZGl0by1zY3JvbGwoXG4gICAgdi1zaG93PVwiaXNBY3RpdmVcIlxuICAgIDppcz1cImlzTmVzdGVkUm91dGUgPyAnZGl2JyA6ICdmb3JtJ1wiXG4gICAgQHN1Ym1pdC5wcmV2ZW50XG4gIClcbiAgICBEaXRvU2NoZW1hKFxuICAgICAgOnNjaGVtYT1cInNjaGVtYVwiXG4gICAgICA6ZGF0YVBhdGg9XCJkYXRhUGF0aFwiXG4gICAgICA6ZGF0YT1cImRhdGFcIlxuICAgICAgOm1ldGE9XCJtZXRhXCJcbiAgICAgIDpzdG9yZT1cInN0b3JlXCJcbiAgICAgIDpkaXNhYmxlZD1cImlzTG9hZGluZ1wiXG4gICAgICA6bWVudUhlYWRlcj1cInRydWVcIlxuICAgIClcbiAgICAgIHRlbXBsYXRlKCNidXR0b25zKVxuICAgICAgICBEaXRvQnV0dG9ucy5kaXRvLWJ1dHRvbnMtcm91bmQuZGl0by1idXR0b25zLW1haW4uZGl0by1idXR0b25zLWxhcmdlKFxuICAgICAgICAgIDpidXR0b25zPVwiYnV0dG9uU2NoZW1hc1wiXG4gICAgICAgICAgOmRhdGFQYXRoPVwiZGF0YVBhdGhcIlxuICAgICAgICAgIDpkYXRhPVwiZGF0YVwiXG4gICAgICAgICAgOm1ldGE9XCJtZXRhXCJcbiAgICAgICAgICA6c3RvcmU9XCJzdG9yZVwiXG4gICAgICAgICAgOmRpc2FibGVkPVwiaXNMb2FkaW5nXCJcbiAgICAgICAgKVxuICAgIC8vLSBQcmV2ZW50IGltcGxpY2l0IHN1Ym1pc3Npb24gb2YgdGhlIGZvcm0sIGZvciBleGFtcGxlIHdoZW4gdHlwaW5nIGVudGVyXG4gICAgLy8tIGluIGFuIGlucHV0IGZpZWxkLlxuICAgIC8vLSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNTE1MDc4MDZcbiAgICBidXR0b24oXG4gICAgICB2LXNob3c9XCJmYWxzZVwiXG4gICAgICB0eXBlPVwic3VibWl0XCJcbiAgICAgIGRpc2FibGVkXG4gICAgKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCB7IGNsb25lLCBjYXBpdGFsaXplLCBwYXJzZURhdGFQYXRoLCBtZXJnZSB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuaW1wb3J0IFJvdXRlTWl4aW4gZnJvbSAnLi4vbWl4aW5zL1JvdXRlTWl4aW4uanMnXG5pbXBvcnQgUmVzb3VyY2VNaXhpbiBmcm9tICcuLi9taXhpbnMvUmVzb3VyY2VNaXhpbi5qcydcbmltcG9ydCB7IGdldFJlc291cmNlLCBnZXRNZW1iZXJSZXNvdXJjZSB9IGZyb20gJy4uL3V0aWxzL3Jlc291cmNlLmpzJ1xuaW1wb3J0IHsgZ2V0QnV0dG9uU2NoZW1hcywgaXNPYmplY3RTb3VyY2UgfSBmcm9tICcuLi91dGlscy9zY2hlbWEuanMnXG5pbXBvcnQgeyByZXNvbHZlUGF0aCB9IGZyb20gJy4uL3V0aWxzL3BhdGguanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b0Zvcm0nLCB7XG4gIG1peGluczogW1JvdXRlTWl4aW4sIFJlc291cmNlTWl4aW5dLFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNyZWF0ZWREYXRhOiBudWxsLFxuICAgICAgY2xvbmVkRGF0YTogdW5kZWZpbmVkLFxuICAgICAgc291cmNlS2V5OiBudWxsLFxuICAgICAgaXNGb3JtOiB0cnVlXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgdmVyYnMoKSB7XG4gICAgICAvLyBBZGQgc3VibWl0IC8gc3VibWl0dGVkIHRvIHRoZSB2ZXJicyByZXR1cm5lZCBieSBSZXNvdXJjZU1peGluXG4gICAgICAvLyBOT1RFOiBUaGVzZSBnZXQgcGFzc2VkIG9uIHRvIGNoaWxkcmVuIHRocm91Z2g6XG4gICAgICAvLyBgcHJvdmlkZSgpIC4uLiB7ICR2ZXJiczogKCkgPT4gdGhpcy52ZXJicyB9YCBpbiBSZXNvdXJjZU1peGluXG4gICAgICBjb25zdCB2ZXJicyA9IHRoaXMuZ2V0VmVyYnMoKVxuICAgICAgY29uc3QgeyBpc0NyZWF0aW5nLCBwcm92aWRlc0RhdGEgfSA9IHRoaXNcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnZlcmJzLFxuICAgICAgICBzdWJtaXQ6IGlzQ3JlYXRpbmcgPyB2ZXJicy5jcmVhdGUgOiB2ZXJicy5zYXZlLFxuICAgICAgICBzdWJtaXR0ZWQ6IGlzQ3JlYXRpbmcgPyB2ZXJicy5jcmVhdGVkIDogdmVyYnMuc2F2ZWQsXG4gICAgICAgIGNhbmNlbDogcHJvdmlkZXNEYXRhID8gdmVyYnMuY2FuY2VsIDogdmVyYnMuY2xvc2UsXG4gICAgICAgIGNhbmNlbGxlZDogcHJvdmlkZXNEYXRhID8gdmVyYnMuY2FuY2VsbGVkIDogdmVyYnMuY2xvc2VkXG4gICAgICB9XG4gICAgfSxcblxuICAgIHNjaGVtYSgpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRoaXMuZ2V0SXRlbUZvcm1TY2hlbWEoXG4gICAgICAgICAgdGhpcy5zb3VyY2VTY2hlbWEsXG4gICAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gZGF0YSB5ZXQsIHByb3ZpZGUgYW4gZW1wdHkgb2JqZWN0IHdpdGgganVzdCB0aGVcbiAgICAgICAgICAvLyByaWdodCB0eXBlIHNldCwgc28gdGhlIGZvcm0gY2FuIGFsd2F5cyBiZSBkZXRlcm1pbmVkLlxuICAgICAgICAgIHRoaXMuZGF0YSB8fCB7IHR5cGU6IHRoaXMudHlwZSB9LFxuICAgICAgICAgIHRoaXMuY29udGV4dFxuICAgICAgICApIHx8IHt9XG4gICAgICApIC8vIEFsd2F5cyByZXR1cm4gYSBzY2hlbWEgb2JqZWN0IHNvIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgZm9yIGl0LlxuICAgIH0sXG5cbiAgICBidXR0b25TY2hlbWFzKCkge1xuICAgICAgcmV0dXJuIGdldEJ1dHRvblNjaGVtYXMoXG4gICAgICAgIG1lcmdlKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNhbmNlbDoge1xuICAgICAgICAgICAgICB0eXBlOiAnYnV0dG9uJyxcbiAgICAgICAgICAgICAgZXZlbnRzOiB7XG4gICAgICAgICAgICAgICAgY2xpY2s6ICgpID0+IHRoaXMuY2FuY2VsKClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgc3VibWl0OiAhdGhpcy5pc011dGF0aW5nICYmIHtcbiAgICAgICAgICAgICAgdHlwZTogJ3N1Ym1pdCcsXG4gICAgICAgICAgICAgIC8vIFN1Ym1pdCBidXR0b25zIGNsb3NlIHRoZSBmb3JtIGJ5IGRlZmF1bHQ6XG4gICAgICAgICAgICAgIGNsb3NlRm9ybTogdHJ1ZSxcbiAgICAgICAgICAgICAgZXZlbnRzOiB7XG4gICAgICAgICAgICAgICAgY2xpY2s6ICh7IGNvbXBvbmVudDogYnV0dG9uIH0pID0+IGJ1dHRvbi5zdWJtaXQoKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICB0aGlzLnNjaGVtYS5idXR0b25zXG4gICAgICAgIClcbiAgICAgIClcbiAgICB9LFxuXG4gICAgaXNBY3RpdmUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc0xhc3RSb3V0ZSB8fCB0aGlzLmlzTGFzdFVubmVzdGVkUm91dGVcbiAgICB9LFxuXG4gICAgaXNUcmFuc2llbnQoKSB7XG4gICAgICByZXR1cm4gIXRoaXMucHJvdmlkZXNEYXRhXG4gICAgfSxcblxuICAgIGlzQ3JlYXRpbmcoKSB7XG4gICAgICAvLyB0aGlzLnBhcmFtIGlzIGluaGVyaXRlZCBmcm9tIFJvdXRlTWl4aW5cbiAgICAgIHJldHVybiB0aGlzLnBhcmFtID09PSAnY3JlYXRlJ1xuICAgIH0sXG5cbiAgICBpc0RpcnR5KCkge1xuICAgICAgcmV0dXJuICF0aGlzLmlzTXV0YXRpbmcgJiYgISF0aGlzLm1haW5TY2hlbWFDb21wb25lbnQ/LmlzRGlydHlcbiAgICB9LFxuXG4gICAgaXNNdXRhdGluZygpIHtcbiAgICAgIC8vIFdoZW4gYHNvdXJjZVNjaGVtYS5tdXRhdGVgIGlzIHRydWUsIHRoZSBmb3JtIGVkaXRzIHRoZSBpbmhlcml0ZWQgZGF0YVxuICAgICAgLy8gZGlyZWN0bHkgaW5zdGVhZCBvZiBtYWtpbmcgYSBjb3B5IGZvciBwZXJzaXN0ZW5jZSB1cG9uIHN1Ym1pc3Npb24uXG4gICAgICAvLyBTZWUgYGluaGVyaXRlZERhdGEoKWAgY29tcHV0ZWQgcHJvcGVydHkgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgIHJldHVybiAhIXRoaXMuc291cmNlU2NoZW1hLm11dGF0ZVxuICAgIH0sXG5cbiAgICBzZWxlY3RlZFRhYigpIHtcbiAgICAgIHJldHVybiB0aGlzLm1haW5TY2hlbWFDb21wb25lbnQ/LnNlbGVjdGVkVGFiIHx8IG51bGxcbiAgICB9LFxuXG4gICAgdHlwZSgpIHtcbiAgICAgIC8vIFRoZSB0eXBlIG9mIGZvcm0gdG8gY3JlYXRlLCBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgZm9ybXMgdG8gY2hvb3NlIGZyb20uXG4gICAgICByZXR1cm4gdGhpcy4kcm91dGUucXVlcnkudHlwZVxuICAgIH0sXG5cbiAgICBpdGVtSWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc0NyZWF0aW5nXG4gICAgICAgID8gbnVsbFxuICAgICAgICA6IHRoaXMucGFyYW0gPz8gbnVsbFxuICAgIH0sXG5cbiAgICBtZXRob2QoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc0NyZWF0aW5nID8gJ3Bvc3QnIDogJ3BhdGNoJ1xuICAgIH0sXG5cbiAgICByZXNvdXJjZSgpIHtcbiAgICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5nZXRSZXNvdXJjZSgpXG4gICAgICByZXR1cm4gZ2V0TWVtYmVyUmVzb3VyY2UodGhpcy5pdGVtSWQsIHJlc291cmNlKSB8fCByZXNvdXJjZVxuICAgIH0sXG5cbiAgICBicmVhZGNydW1iUHJlZml4KCkge1xuICAgICAgcmV0dXJuIGNhcGl0YWxpemUodGhpcy5pc0NyZWF0aW5nID8gdGhpcy52ZXJicy5jcmVhdGUgOiB0aGlzLnZlcmJzLmVkaXQpXG4gICAgfSxcblxuICAgIGRhdGEoKSB7XG4gICAgICAvLyBSZXR1cm4gZGlmZmVyZW50IGRhdGEgXCJjb250YWluZXJzXCIgYmFzZWQgb24gZGlmZmVyZW50IHNjZW5hcmlvczpcbiAgICAgIC8vIDEuIGNyZWF0ZWREYXRhLCBpZiB3ZSdyZSBpbiBhIGZvcm0gZm9yIGEgbmV3bHkgY3JlYXRlZCBvYmplY3QuXG4gICAgICAvLyAyLiBsb2FkZWREYXRhLCBpZiB0aGUgZm9ybSBpdHNlbGYgaXMgdGhlIHJvb3Qgb2YgdGhlIGRhdGEgKGUuZy4gd2hlblxuICAgICAgLy8gICAgZGlyZWN0bHkgbG9hZGluZyBhbiBlZGl0aW5nIHJvb3QpLlxuICAgICAgLy8gMy4gVGhlIGRhdGEgaW5oZXJpdGVkIGZyb20gdGhlIHBhcmVudCwgd2hpY2ggaXRzZWxmIG1heSBiZSBlaXRoZXIgYVxuICAgICAgLy8gICAgdmlldyB0aGF0IGxvYWRlZCB0aGUgZGF0YSwgb3IgYSBmb3JtIHRoYXQgZWl0aGVyIGxvYWRlZCB0aGUgZGF0YSwgb3JcbiAgICAgIC8vICAgIGFsc28gaW5oZXJpdGVkIGl0IGZyb20gaXRzIHBhcmVudC4gTm90ZSB0aGF0IHdlIHVzZSBhIGNsb25lIG9mIGl0LFxuICAgICAgLy8gICAgc28sIGRhdGEgY2hhbmdlcyBhcmVuJ3QgYXBwbGllZCB1bnRpbCBzZXRTb3VyY2VEYXRhKCkgaXMgY2FsbGVkLlxuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlZERhdGEgfHwgdGhpcy5sb2FkZWREYXRhIHx8IHRoaXMuaW5oZXJpdGVkRGF0YSB8fCBudWxsXG4gICAgfSxcblxuICAgIGRhdGFQYXRoKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0RGF0YVBhdGhGcm9tKHRoaXMuZGF0YUNvbXBvbmVudClcbiAgICB9LFxuXG4gICAgc291cmNlRGF0YSgpIHtcbiAgICAgIC8vIFBvc3NpYmxlIHBhcmVudHMgYXJlIERpdG9Gb3JtIGZvciBmb3Jtcywgb3IgRGl0b1ZpZXcgZm9yIHJvb3QgbGlzdHMuXG4gICAgICAvLyBCb3RoIGhhdmUgYSBkYXRhIHByb3BlcnR5IHdoaWNoIGFic3RyYWN0cyBhd2F5IGxvYWRpbmcgYW5kIGluaGVyaXRpbmdcbiAgICAgIC8vIG9mIGRhdGEuXG4gICAgICAvLyBGb3JtcyB0aGF0IGFyZSBhYm91dCB0byBiZSBkZXN0cm95ZWQgZHVlIHRvIG5hdmlnYXRpb24gbG9vc2UgdGhlaXJcbiAgICAgIC8vIHJvdXRlLXJlY29yZCwgYnV0IG1pZ2h0IHN0aWxsIHRyaWdnZXIgdGhpcyBnZXR0ZXIuIEZpbHRlciB0aG9zZSBvdXQuXG4gICAgICBsZXQgZGF0YSA9IHRoaXMucm91dGVSZWNvcmQgPyB0aGlzLnBhcmVudFJvdXRlQ29tcG9uZW50LmRhdGEgOiBudWxsXG4gICAgICBpZiAoZGF0YSkge1xuICAgICAgICAvLyBIYW5kbGUgbmVzdGVkIGRhdGEgYnkgc3BsaXR0aW5nIHRoZSBkYXRhUGF0aCwgaXRlcmF0ZSB0aHJvdWdoIHRoZVxuICAgICAgICAvLyBhY3R1YWwgZGF0YSBhbmQgbG9vayBuZXN0IGNoaWxkLWRhdGEgdXAuXG4gICAgICAgIGNvbnN0IGRhdGFQYXJ0cyA9IHBhcnNlRGF0YVBhdGgoXG4gICAgICAgICAgdGhpcy5nZXREYXRhUGF0aEZyb20odGhpcy5wYXJlbnRSb3V0ZUNvbXBvbmVudClcbiAgICAgICAgKVxuICAgICAgICAvLyBDb21wYXJlIGRhdGFQYXJ0cyBhZ2FpbnN0IG1hdGNoZWQgcm91dGVQYXRoIHBhcnRzLCB0byBpZGVudGlmeSB0aG9zZVxuICAgICAgICAvLyBwYXJ0cyB0aGF0IG5lZWQgdG8gYmUgdHJlYXRlZCBsaWtlIGlkcyBhbmQgbWFwcGVkIHRvIGluZGljZXMgaW4gZGF0YS5cbiAgICAgICAgY29uc3QgcGF0aFBhcnRzID0gdGhpcy5yb3V0ZVJlY29yZC5wYXRoLnNwbGl0KCcvJylcbiAgICAgICAgY29uc3Qgcm91dGVQYXJ0cyA9IHBhdGhQYXJ0cy5zbGljZShwYXRoUGFydHMubGVuZ3RoIC0gZGF0YVBhcnRzLmxlbmd0aClcbiAgICAgICAgLy8gVE9ETzogRml4IHNpZGUtZWZmZWN0c1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdnVlL25vLXNpZGUtZWZmZWN0cy1pbi1jb21wdXRlZC1wcm9wZXJ0aWVzXG4gICAgICAgIHRoaXMuc291cmNlS2V5ID0gbnVsbFxuICAgICAgICBjb25zdCBsYXN0RGF0YVBhcnQgPSBkYXRhUGFydHNbZGF0YVBhcnRzLmxlbmd0aCAtIDFdXG4gICAgICAgIGlmIChpc09iamVjdFNvdXJjZSh0aGlzLnNvdXJjZVNjaGVtYSkgJiYgbGFzdERhdGFQYXJ0ID09PSAnY3JlYXRlJykge1xuICAgICAgICAgIC8vIElmIHdlIGhhdmUgYW4gb2JqZWN0IHNvdXJjZSBhbmQgYXJlIGNyZWF0aW5nLCB0aGUgZGF0YVBhdGggbmVlZHMgdG9cbiAgICAgICAgICAvLyBiZSBzaG9ydGVuZWQgYnkgdGhlICdjcmVhdGUnIGVudHJ5LiBUaGlzIGlzbid0IG5lZWRlZCBmb3IgbGlzdFxuICAgICAgICAgIC8vIHNvdXJjZXMsIGFzIHRoZXJlIHRoZSBwYXJhbWV0ZXIgaXMgYWN0dWFsbHkgbWFwcGVkIHRvIHRoZSBpdGVtIGlkLlxuICAgICAgICAgIGRhdGFQYXJ0cy5sZW5ndGgtLVxuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gZGF0YVBhcnRzLmxlbmd0aDsgaSA8IGwgJiYgZGF0YTsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgZGF0YVBhcnQgPSBkYXRhUGFydHNbaV1cbiAgICAgICAgICAvLyBJZiB0aGlzIGlzIGFuIDppZCBwYXJ0LCBmaW5kIHRoZSBpbmRleCBvZiB0aGUgaXRlbSB3aXRoIGdpdmVuIGlkLlxuICAgICAgICAgIGNvbnN0IGtleSA9IC9eOmlkLy50ZXN0KHJvdXRlUGFydHNbaV0pXG4gICAgICAgICAgICA/IGRhdGFQYXJ0ID09PSAnY3JlYXRlJ1xuICAgICAgICAgICAgICA/IG51bGwgLy8gVGhlcmUncyBubyBpbmRleCBmb3IgZW50cmllcyBhYm91dCB0byBiZSBjcmVhdGVkXG4gICAgICAgICAgICAgIDogdGhpcy5maW5kSXRlbUlkSW5kZXgodGhpcy5zb3VyY2VTY2hlbWEsIGRhdGEsIGRhdGFQYXJ0KVxuICAgICAgICAgICAgOiBkYXRhUGFydFxuICAgICAgICAgIC8vIFNraXAgdGhlIGZpbmFsIGxvb2t1cCBidXQgcmVtZW1iZXIgYHNvdXJjZUtleWAsIGFzIHdlIHdhbnQgdGhlXG4gICAgICAgICAgLy8gcGFyZW50IGRhdGEgc28gd2UgY2FuIHJlcGxhY2UgdGhlIGVudHJ5IGF0IGBzb3VyY2VLZXlgIG9uIGl0LlxuICAgICAgICAgIGlmIChpID09PSBsIC0gMSkge1xuICAgICAgICAgICAgLy8gVE9ETzogRml4IHNpZGUtZWZmZWN0c1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgICAgICB0aGlzLnNvdXJjZUtleSA9IGtleVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkYXRhID0gZGF0YVtrZXldXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZGF0YVxuICAgIH0sXG5cbiAgICBpbmhlcml0ZWREYXRhKCkge1xuICAgICAgLy8gRGF0YSBpbmhlcml0ZWQgZnJvbSBwYXJlbnQsIGFuZCBjbG9uZWQgdG8gcHJvdGVjdCBhZ2FpbnN0IHJlYWN0aXZlXG4gICAgICAvLyBjaGFuZ2VzIHVudGlsIGNoYW5nZXMgYXJlIGFwcGxpZWQgdGhyb3VnaCBzZXRTb3VyY2VEYXRhKCksIHVubGVzc1xuICAgICAgLy8gYHNvdXJjZVNjaGVtYS5tdXRhdGVgIGlzIHRydWUsIGluIHdoaWNoIGNhc2UgZGF0YSBpcyBtdXRhdGVkIGRpcmVjdGx5LlxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLmlzVHJhbnNpZW50ICYmXG4gICAgICAgIHRoaXMuY2xvbmVkRGF0YSA9PT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHRoaXMuc291cmNlRGF0YSAmJlxuICAgICAgICB0aGlzLnNvdXJjZUtleSAhPT0gbnVsbFxuICAgICAgKSB7XG4gICAgICAgIGxldCBkYXRhID0gdGhpcy5zb3VyY2VEYXRhW3RoaXMuc291cmNlS2V5XVxuICAgICAgICBpZiAoIXRoaXMuaXNNdXRhdGluZykge1xuICAgICAgICAgIC8vIFVzZSBhIHRyaWNrIHRvIHN0b3JlIGNsb25lZCBpbmhlcml0ZWQgZGF0YSBpbiBjbG9uZWREYXRhLCB0byBtYWtlXG4gICAgICAgICAgLy8gaXQgcmVhY3RpdmUgYW5kIHByZXZlbnQgaXQgZnJvbSBiZWluZyBjbG9uZWQgbXVsdGlwbGUgdGltZXMuXG4gICAgICAgICAgLy8gVE9ETzogRml4IHNpZGUtZWZmZWN0c1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB2dWUvbm8tc2lkZS1lZmZlY3RzLWluLWNvbXB1dGVkLXByb3BlcnRpZXNcbiAgICAgICAgICB0aGlzLmNsb25lZERhdGEgPSBkYXRhID0gY2xvbmUoZGF0YSlcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgZGF0YSA9PT0gbnVsbCAmJlxuICAgICAgICAgICF0aGlzLmlzQ3JlYXRpbmcgJiZcbiAgICAgICAgICBpc09iamVjdFNvdXJjZSh0aGlzLnNvdXJjZVNjaGVtYSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gSWYgZGF0YSBvZiBhbiBvYmplY3Qgc291cmNlIGlzIG51bGwsIHJlZGlyZWN0IHRvIGl0cyBjcmVhdGUgcm91dGUuXG4gICAgICAgICAgLy8gVE9ETzogRml4IHNpZGUtZWZmZWN0c1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB2dWUvbm8tc2lkZS1lZmZlY3RzLWluLWNvbXB1dGVkLXByb3BlcnRpZXNcbiAgICAgICAgICB0aGlzLiRyb3V0ZXIucHVzaCh7IHBhdGg6IGAke3RoaXMucGF0aH0vY3JlYXRlYCB9KVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhXG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5jbG9uZWREYXRhXG4gICAgfSxcblxuICAgIC8vIEBvdmVycmlkZSBSZXNvdXJjZU1peGluLmhhc0RhdGEoKVxuICAgIGhhc0RhdGEoKSB7XG4gICAgICByZXR1cm4gISF0aGlzLmRhdGFcbiAgICB9LFxuXG4gICAgaXRlbUxhYmVsKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0SXRlbUxhYmVsKHRoaXMuc291cmNlU2NoZW1hLCB0aGlzLmRhdGEsIHsgZXh0ZW5kZWQ6IHRydWUgfSlcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBzb3VyY2VEYXRhOiAnY2xlYXJDbG9uZWREYXRhJyxcbiAgICAvLyBOZWVkZWQgZm9yIHRoZSAnY3JlYXRlJyByZWRpcmVjdCBpbiBgaW5oZXJpdGVkRGF0YSgpYCB0byB3b3JrOlxuICAgIGNyZWF0ZTogJ3NldHVwRGF0YSdcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZW1pdFNjaGVtYUV2ZW50KGV2ZW50LCBwYXJhbXMpIHtcbiAgICAgIHJldHVybiB0aGlzLm1haW5TY2hlbWFDb21wb25lbnQuZW1pdEV2ZW50KGV2ZW50LCBwYXJhbXMpXG4gICAgfSxcblxuICAgIGdldERhdGFQYXRoRnJvbShyb3V0ZSkge1xuICAgICAgLy8gR2V0IHRoZSBkYXRhIHBhdGggYnkgZGVub3JtYWxpemVQYXRoIHRoZSByZWxhdGl2ZSByb3V0ZSBwYXRoXG4gICAgICByZXR1cm4gdGhpcy5hcGkuZGVub3JtYWxpemVQYXRoKFxuICAgICAgICB0aGlzLnBhdGhcbiAgICAgICAgICAvLyBEaXRvVmlld3MgaGF2ZSBuZXN0ZWQgcm91dGVzLCBzbyBkb24ndCByZW1vdmUgdGhlaXIgcGF0aC5cbiAgICAgICAgICAuc2xpY2UoKHJvdXRlLmlzVmlldyA/IDAgOiByb3V0ZS5wYXRoLmxlbmd0aCkgKyAxKVxuICAgICAgKVxuICAgIH0sXG5cbiAgICAvLyBAb3ZlcnJpZGUgUmVzb3VyY2VNaXhpbi5zZXR1cERhdGEoKVxuICAgIHNldHVwRGF0YSgpIHtcbiAgICAgIGlmICh0aGlzLmlzQ3JlYXRpbmcpIHtcbiAgICAgICAgdGhpcy5jcmVhdGVkRGF0YSB8fD0gdGhpcy5jcmVhdGVEYXRhKHRoaXMuc2NoZW1hLCB0aGlzLnR5cGUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmVuc3VyZURhdGEoKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzZXRTb3VyY2VEYXRhKGRhdGEpIHtcbiAgICAgIGlmICh0aGlzLnNvdXJjZURhdGEgJiYgdGhpcy5zb3VyY2VLZXkgIT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgeyBtYWluU2NoZW1hQ29tcG9uZW50IH0gPSB0aGlzXG4gICAgICAgIHRoaXMuc291cmNlRGF0YVt0aGlzLnNvdXJjZUtleV0gPSBtYWluU2NoZW1hQ29tcG9uZW50LmZpbHRlckRhdGEoZGF0YSlcbiAgICAgICAgbWFpblNjaGVtYUNvbXBvbmVudC5vbkNoYW5nZSgpXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9LFxuXG4gICAgYWRkU291cmNlRGF0YShkYXRhKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RTb3VyY2UodGhpcy5zb3VyY2VTY2hlbWEpXG4gICAgICAgID8gdGhpcy5zZXRTb3VyY2VEYXRhKGRhdGEpXG4gICAgICAgIDogISF0aGlzLnNvdXJjZURhdGE/LnB1c2goZGF0YSlcbiAgICB9LFxuXG4gICAgLy8gQG92ZXJyaWRlIFJlc291cmNlTWl4aW4uY2xlYXJEYXRhKClcbiAgICBjbGVhckRhdGEoKSB7XG4gICAgICB0aGlzLnNldERhdGEobnVsbClcbiAgICB9LFxuXG4gICAgLy8gQG92ZXJyaWRlIFJlc291cmNlTWl4aW4uc2V0RGF0YSgpXG4gICAgc2V0RGF0YShkYXRhKSB7XG4gICAgICAvLyBzZXREYXRhKCkgaXMgY2FsbGVkIGFmdGVyIHN1Ym1pdCB3aGVuIGRhdGEgaGFzIGNoYW5nZWQuXG4gICAgICBpZiAodGhpcy5pc1RyYW5zaWVudCkge1xuICAgICAgICAvLyBGb3IgY29tcG9uZW50cyB3aXRoIHRyYW5zaWVudCBkYXRhLCBtb2RpZnkgdGhpcy5zb3VyY2VEYXRhLlxuICAgICAgICB0aGlzLnNldFNvdXJjZURhdGEoZGF0YSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY3JlYXRlZERhdGEgPSBudWxsXG4gICAgICAgIHRoaXMubG9hZGVkRGF0YSA9IGRhdGFcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY2xlYXJDbG9uZWREYXRhKHRvLCBmcm9tKSB7XG4gICAgICAvLyBPbmx5IGNsZWFyIGlmIHRoZSB3YXRjaGVkIHNvdXJjZURhdGEgaXRzZWxmIGNoYW5nZXMgaW4gdGhlIGZvcm0uXG4gICAgICBpZiAodG8gIT09IGZyb20pIHtcbiAgICAgICAgdGhpcy5jbG9uZWREYXRhID0gdW5kZWZpbmVkXG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIGNhbmNlbCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmNsb3NlKClcbiAgICB9LFxuXG4gICAgYXN5bmMgY2xvc2UoKSB7XG4gICAgICByZXR1cm4gdGhpcy5uYXZpZ2F0ZSh0aGlzLnBhcmVudFJvdXRlQ29tcG9uZW50LnBhdGgpXG4gICAgfSxcblxuICAgIGdldFN1Ym1pdFZlcmIocHJlc2VudCA9IHRydWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzQ3JlYXRpbmdcbiAgICAgICAgPyBwcmVzZW50XG4gICAgICAgICAgPyAnY3JlYXRlJ1xuICAgICAgICAgIDogJ2NyZWF0ZWQnXG4gICAgICAgIDogcHJlc2VudFxuICAgICAgICAgID8gJ3N1Ym1pdCdcbiAgICAgICAgICA6ICdzdWJtaXR0ZWQnXG4gICAgfSxcblxuICAgIGFzeW5jIHN1Ym1pdChidXR0b24sIHsgdmFsaWRhdGUgPSB0cnVlLCBjbG9zZUZvcm0gPSBmYWxzZSB9ID0ge30pIHtcbiAgICAgIGlmICh2YWxpZGF0ZSAmJiAhdGhpcy52YWxpZGF0ZUFsbCgpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBnZXRWZXJiID0gcHJlc2VudCA9PiB0aGlzLnZlcmJzW3RoaXMuZ2V0U3VibWl0VmVyYihwcmVzZW50KV1cblxuICAgICAgLy8gQWxsb3cgYnV0dG9ucyB0byBvdmVycmlkZSBib3RoIG1ldGhvZCBhbmQgcmVzb3VyY2UgcGF0aCB0byBzdWJtaXQgdG86XG4gICAgICBjb25zdCBidXR0b25SZXNvdXJjZSA9IGdldFJlc291cmNlKGJ1dHRvbi5zY2hlbWEucmVzb3VyY2UsIHtcbiAgICAgICAgcGFyZW50OiB0aGlzLnJlc291cmNlXG4gICAgICB9KVxuICAgICAgY29uc3QgcmVzb3VyY2UgPSBidXR0b25SZXNvdXJjZSB8fCB0aGlzLnJlc291cmNlXG4gICAgICBjb25zdCBtZXRob2QgPSByZXNvdXJjZT8ubWV0aG9kIHx8IHRoaXMubWV0aG9kXG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5nZXRQYXlsb2FkRGF0YShidXR0b24sIG1ldGhvZClcbiAgICAgIGxldCBzdWNjZXNzXG4gICAgICBpZiAoIWJ1dHRvblJlc291cmNlICYmIHRoaXMuaXNUcmFuc2llbnQpIHtcbiAgICAgICAgc3VjY2VzcyA9IGF3YWl0IHRoaXMuc3VibWl0VHJhbnNpZW50KGJ1dHRvbiwgcmVzb3VyY2UsIG1ldGhvZCwgZGF0YSwge1xuICAgICAgICAgIG9uU3VjY2VzczogKCkgPT4gdGhpcy5lbWl0U2NoZW1hRXZlbnQodGhpcy5nZXRTdWJtaXRWZXJiKCkpLFxuICAgICAgICAgIG9uRXJyb3I6IGVycm9yID0+XG4gICAgICAgICAgICB0aGlzLmVtaXRTY2hlbWFFdmVudCgnZXJyb3InLCB7XG4gICAgICAgICAgICAgIGNvbnRleHQ6IHsgZXJyb3IgfVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgbm90aWZ5U3VjY2VzczogKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmVyYiA9IGdldFZlcmIoZmFsc2UpXG4gICAgICAgICAgICB0aGlzLm5vdGlmeSh7XG4gICAgICAgICAgICAgIHR5cGU6ICdpbmZvJyxcbiAgICAgICAgICAgICAgdGl0bGU6IHRoaXMuaXNDcmVhdGluZ1xuICAgICAgICAgICAgICAgID8gYEl0ZW0gJHtjYXBpdGFsaXplKHZlcmIpfWBcbiAgICAgICAgICAgICAgICA6IGBDaGFuZ2UgJHtjYXBpdGFsaXplKHZlcmIpfWAsXG4gICAgICAgICAgICAgIHRleHQ6IFtcbiAgICAgICAgICAgICAgICB0aGlzLmlzQ3JlYXRpbmdcbiAgICAgICAgICAgICAgICAgID8gYCR7dGhpcy5pdGVtTGFiZWx9IHdhcyAke3ZlcmJ9LmBcbiAgICAgICAgICAgICAgICAgIDogYENoYW5nZXMgdG8gJHt0aGlzLml0ZW1MYWJlbH0gd2VyZSAke3ZlcmJ9LmAsXG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2llbnROb3RlXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSxcbiAgICAgICAgICBub3RpZnlFcnJvcjogKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmVyYiA9IGdldFZlcmIodHJ1ZSlcbiAgICAgICAgICAgIHRoaXMubm90aWZ5KHtcbiAgICAgICAgICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgdGl0bGU6ICdSZXF1ZXN0IEVycm9yJyxcbiAgICAgICAgICAgICAgdGV4dDogYFVuYWJsZSB0byAke3ZlcmJ9ICR7dGhpcy5pdGVtTGFiZWx9LmBcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3VjY2VzcyA9IGF3YWl0IHRoaXMuc3VibWl0UmVzb3VyY2UoYnV0dG9uLCByZXNvdXJjZSwgbWV0aG9kLCBkYXRhLCB7XG4gICAgICAgICAgc2V0RGF0YTogdHJ1ZSxcbiAgICAgICAgICBvblN1Y2Nlc3M6ICgpID0+IHRoaXMuZW1pdFNjaGVtYUV2ZW50KHRoaXMuZ2V0U3VibWl0VmVyYigpKSxcbiAgICAgICAgICBvbkVycm9yOiBlcnJvciA9PlxuICAgICAgICAgICAgdGhpcy5lbWl0U2NoZW1hRXZlbnQoJ2Vycm9yJywge1xuICAgICAgICAgICAgICBjb250ZXh0OiB7IGVycm9yIH1cbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIG5vdGlmeVN1Y2Nlc3M6ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZlcmIgPSBnZXRWZXJiKGZhbHNlKVxuICAgICAgICAgICAgdGhpcy5ub3RpZnkoe1xuICAgICAgICAgICAgICB0eXBlOiAnc3VjY2VzcycsXG4gICAgICAgICAgICAgIHRpdGxlOiBgU3VjY2Vzc2Z1bGx5ICR7Y2FwaXRhbGl6ZSh2ZXJiKX1gLFxuICAgICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLml0ZW1MYWJlbH0gd2FzICR7dmVyYn0uYFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9LFxuICAgICAgICAgIG5vdGlmeUVycm9yOiBlcnJvciA9PiB7XG4gICAgICAgICAgICBjb25zdCB2ZXJiID0gZ2V0VmVyYih0cnVlKVxuICAgICAgICAgICAgdGhpcy5ub3RpZnkoe1xuICAgICAgICAgICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgICAgICAgICB0aXRsZTogJ1JlcXVlc3QgRXJyb3InLFxuICAgICAgICAgICAgICB0ZXh0OiBbXG4gICAgICAgICAgICAgICAgYFVuYWJsZSB0byAke3ZlcmJ9ICR7dGhpcy5pdGVtTGFiZWx9JHtlcnJvciA/ICc6JyA6ICcnfWAsXG4gICAgICAgICAgICAgICAgZXJyb3I/Lm1lc3NhZ2UgfHwgZXJyb3JcbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICB0aGlzLnJlc2V0VmFsaWRhdGlvbigpXG4gICAgICAgIGlmIChjbG9zZUZvcm0gfHwgYnV0dG9uLmNsb3NlRm9ybSkge1xuICAgICAgICAgIHRoaXMuY2xvc2UoKVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNDcmVhdGluZykge1xuICAgICAgICAgIC8vIFJlZGlyZWN0IHRvIHRoZSBmb3JtIGVkaXRpbmcgdGhlIG5ld2x5IGNyZWF0ZWQgaXRlbTpcbiAgICAgICAgICBjb25zdCBpZCA9IHRoaXMuZ2V0SXRlbUlkKHRoaXMuc2NoZW1hLCB0aGlzLmRhdGEpXG4gICAgICAgICAgdGhpcy4kcm91dGVyLnJlcGxhY2UoeyBwYXRoOiByZXNvbHZlUGF0aChgJHt0aGlzLnBhdGh9Ly4uLyR7aWR9YCkgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHN1Y2Nlc3NcbiAgICB9LFxuXG4gICAgYXN5bmMgc3VibWl0VHJhbnNpZW50KGJ1dHRvbiwgX3Jlc291cmNlLCBfbWV0aG9kLCBkYXRhLCB7XG4gICAgICBvblN1Y2Nlc3MsXG4gICAgICBvbkVycm9yLFxuICAgICAgbm90aWZ5U3VjY2VzcyxcbiAgICAgIG5vdGlmeUVycm9yXG4gICAgfSkge1xuICAgICAgLy8gSGFuZGxlIHRoZSBkZWZhdWx0IFwic3VibWl0dGluZ1wiIG9mIHRyYW5zaWVudCwgbmVzdGVkIGRhdGE6XG4gICAgICBjb25zdCBzdWNjZXNzID0gdGhpcy5pc0NyZWF0aW5nXG4gICAgICAgID8gdGhpcy5hZGRTb3VyY2VEYXRhKGRhdGEpXG4gICAgICAgIDogdGhpcy5zZXRTb3VyY2VEYXRhKGRhdGEpXG4gICAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICBvblN1Y2Nlc3M/LigpXG4gICAgICAgIGF3YWl0IHRoaXMuZW1pdEJ1dHRvbkV2ZW50KGJ1dHRvbiwgJ3N1Y2Nlc3MnLCB7XG4gICAgICAgICAgbm90aWZ5OiBub3RpZnlTdWNjZXNzXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBlcnJvciA9ICdDb3VsZCBub3Qgc3VibWl0IHRyYW5zaWVudCBpdGVtJ1xuICAgICAgICBvbkVycm9yPy4oZXJyb3IpXG4gICAgICAgIGF3YWl0IHRoaXMuZW1pdEJ1dHRvbkV2ZW50KGJ1dHRvbiwgJ2Vycm9yJywge1xuICAgICAgICAgIG5vdGlmeTogbm90aWZ5RXJyb3IsXG4gICAgICAgICAgZXJyb3JcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdWNjZXNzXG4gICAgfVxuICB9XG59KVxuPC9zY3JpcHQ+XG4iLCI8c2NyaXB0PlxuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCBEaXRvRm9ybSBmcm9tICcuL0RpdG9Gb3JtLnZ1ZSdcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvRm9ybU5lc3RlZCcsIHtcbiAgZXh0ZW5kczogRGl0b0Zvcm1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG4uZGl0by1mb3JtLW5lc3RlZCB7XG4gICYsXG4gIC5kaXRvLXNjcm9sbCB7XG4gICAgLy8gTm8gc2Nyb2xsaW5nIGluc2lkZSBuZXN0ZWQgZm9ybXMsIGFuZCBwcmV2ZW50IG9wZW4gLm11bHRpc2VsZWN0IGZyb21cbiAgICAvLyBiZWluZyBjcm9wcGVkLlxuICAgIG92ZXJmbG93OiB2aXNpYmxlO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLWVycm9ycyhcbiAgdi1pZj1cImVycm9yc1wiXG4pXG4gIHVsXG4gICAgbGkoXG4gICAgICB2LWZvcj1cImVycm9yIG9mIGVycm9yc1wiXG4gICAgKVxuICAgICAgfCB7eyBlcnJvciB9fVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b0Vycm9ycycsIHtcbiAgcHJvcHM6IHtcbiAgICBlcnJvcnM6IHsgdHlwZTogQXJyYXksIGRlZmF1bHQ6IG51bGwgfVxuICB9XG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tZXJyb3JzIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAxO1xuXG4gIHVsIHtcbiAgICBtYXJnaW4tdG9wOiAxcHg7XG4gICAgY29sb3I6ICRjb2xvci1lcnJvcjtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1zY29wZXNcbiAgUm91dGVyTGluayhcbiAgICB2LWZvcj1cIihzY29wZSwga2V5KSBpbiBzY29wZXNcIlxuICAgIDprZXk9XCJrZXlcIlxuICAgIHYtc2xvdD1cInsgbmF2aWdhdGUgfVwiXG4gICAgOnRvPVwiZ2V0U2NvcGVMaW5rKHNjb3BlKVwiXG4gICAgY3VzdG9tXG4gIClcbiAgICBidXR0b24uZGl0by1idXR0b24oXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIDpjbGFzcz1cInsgJ2RpdG8tc2VsZWN0ZWQnOiBzY29wZS5uYW1lID09PSBxdWVyeS5zY29wZSB9XCJcbiAgICAgIDp0aXRsZT1cInNjb3BlLmhpbnQgfHwgZ2V0TGFiZWwoc2NvcGUpXCJcbiAgICAgIEBjbGljaz1cIm5hdmlnYXRlXCJcbiAgICApIHt7IGdldExhYmVsKHNjb3BlKSB9fVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b1Njb3BlcycsIHtcbiAgcHJvcHM6IHtcbiAgICBxdWVyeTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgc2NvcGVzOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBnZXRTY29wZUxpbmsoc2NvcGUpIHtcbiAgICAgIGNvbnN0IHF1ZXJ5ID0geyAuLi50aGlzLnF1ZXJ5LCBzY29wZTogc2NvcGUubmFtZSB9XG4gICAgICBpZiAocXVlcnkucGFnZSkge1xuICAgICAgICBxdWVyeS5wYWdlID0gMFxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuZ2V0UXVlcnlMaW5rKHF1ZXJ5KVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXNjb3BlcyB7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIGRpc3BsYXk6IGZsZXg7XG5cbiAgLmRpdG8tYnV0dG9uIHtcbiAgICBAaW5jbHVkZSBlbGxpcHNpcztcblxuICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gICAgLy8gQSBiaXQgbW9yZSB0aGFuIHRoZSB3aWR0aCBvZiBlbGxpcHNpcywgdG8gcHJldmVudCByZXBsYWNpbmcgc2hvcnQgd29yZHNcbiAgICAvLyB3aXRoIGVsbGlwc2lzLlxuICAgIG1pbi13aWR0aDogM2VtO1xuICAgIGZsZXg6IDAgMSBhdXRvO1xuXG4gICAgJjpmaXJzdC1jaGlsZCB7XG4gICAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAxZW07XG4gICAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAxZW07XG4gICAgICBwYWRkaW5nLWxlZnQ6IDFlbTtcbiAgICB9XG5cbiAgICAmOmxhc3QtY2hpbGQge1xuICAgICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDFlbTtcbiAgICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAxZW07XG4gICAgICBwYWRkaW5nLXJpZ2h0OiAxZW07XG4gICAgfVxuXG4gICAgJiArIC5kaXRvLWJ1dHRvbiB7XG4gICAgICBtYXJnaW4tbGVmdDogLTFweDtcbiAgICB9IC8vIERvbid0IGNvdmVyIHRoZSBmb2N1c2VkIGJvcmRlciBvZiBidXR0b25zOlxuICAgICY6Zm9jdXMge1xuICAgICAgei1pbmRleDogMTtcbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuUGFnaW5hdGlvbihcbiAgdi1tb2RlbDpwYWdlPVwicGFnZVwiXG4gIDpwYWdlU2l6ZT1cImxpbWl0XCJcbiAgOnRvdGFsPVwidG90YWxcIlxuKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCB7IFBhZ2luYXRpb24gfSBmcm9tICdAZGl0b2pzL3VpL3NyYydcbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b1BhZ2luYXRpb24nLCB7XG4gIGNvbXBvbmVudHM6IHsgUGFnaW5hdGlvbiB9LFxuXG4gIHByb3BzOiB7XG4gICAgcXVlcnk6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGxpbWl0OiB7IHR5cGU6IE51bWJlciwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICB0b3RhbDogeyB0eXBlOiBOdW1iZXIsIHJlcXVpcmVkOiB0cnVlIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIHBhZ2U6IHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuICgrdGhpcy5xdWVyeS5wYWdlIHx8IDApICsgMVxuICAgICAgfSxcblxuICAgICAgc2V0KHBhZ2UpIHtcbiAgICAgICAgaWYgKHRoaXMucGFnZSAhPT0gcGFnZSkge1xuICAgICAgICAgIHRoaXMuJHJvdXRlci5wdXNoKFxuICAgICAgICAgICAgdGhpcy5nZXRRdWVyeUxpbmsoe1xuICAgICAgICAgICAgICAuLi50aGlzLnF1ZXJ5LFxuICAgICAgICAgICAgICBwYWdlOiBwYWdlIC0gMVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cbiIsImltcG9ydCBJdGVtTWl4aW4gZnJvbSAnLi9JdGVtTWl4aW4uanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCB7XG4gIG1peGluczogW0l0ZW1NaXhpbl0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZHJhZ2dpbmc6IGZhbHNlXG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBnZXRTb3J0YWJsZU9wdGlvbnMoZm9yY2VGYWxsYmFjayA9IGZhbHNlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhbmltYXRpb246IDE1MCxcbiAgICAgICAgaGFuZGxlOiAnLmRpdG8tYnV0dG9uLWRyYWcnLFxuICAgICAgICBkcmFnQ2xhc3M6ICdkaXRvLXNvcnRhYmxlLWFjdGl2ZScsXG4gICAgICAgIGNob3NlbkNsYXNzOiAnZGl0by1zb3J0YWJsZS1jaG9zZW4nLFxuICAgICAgICBnaG9zdENsYXNzOiAnZGl0by1zb3J0YWJsZS1naG9zdCcsXG4gICAgICAgIGZhbGxiYWNrQ2xhc3M6ICdkaXRvLXNvcnRhYmxlLWZhbGxiYWNrJyxcbiAgICAgICAgZm9yY2VGYWxsYmFjayxcbiAgICAgICAgb25TdGFydDogdGhpcy5vblN0YXJ0RHJhZyxcbiAgICAgICAgb25FbmQ6IHRoaXMub25FbmREcmFnXG4gICAgICB9XG4gICAgfSxcblxuICAgIG9uU3RhcnREcmFnKCkge1xuICAgICAgdGhpcy5kcmFnZ2luZyA9IHRydWVcbiAgICB9LFxuXG4gICAgb25FbmREcmFnKHsgb2xkSW5kZXgsIG5ld0luZGV4IH0pIHtcbiAgICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZVxuICAgICAgaWYgKG9sZEluZGV4ICE9PSBuZXdJbmRleCkge1xuICAgICAgICB0aGlzLm9uQ2hhbmdlKClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgdXBkYXRlT3JkZXIoc291cmNlU2NoZW1hLCBsaXN0LCBwYWdpbmF0aW9uUmFuZ2UpIHtcbiAgICAgIGNvbnN0IHsgb3JkZXJLZXkgfSA9IHNvdXJjZVNjaGVtYVxuICAgICAgaWYgKG9yZGVyS2V5KSB7XG4gICAgICAgIC8vIFJlb3JkZXIgdGhlIGNoYW5nZWQgZW50cmllcyBieSB0aGVpciBvcmRlciBrZXksIHRha2luZyBwYWdpbmF0aW9uXG4gICAgICAgIC8vIG9mZnNldHMgaW50byBhY2NvdW50OlxuICAgICAgICBjb25zdCBvZmZzZXQgPSBwYWdpbmF0aW9uUmFuZ2U/LlswXSB8fCAwXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGxpc3RbaV1bb3JkZXJLZXldID0gaSArIG9mZnNldFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbGlzdFxuICAgIH1cbiAgfVxufVxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLXRyZWUtaXRlbShcbiAgOmlkPVwiZGF0YVBhdGhcIlxuICA6Y2xhc3M9YHtcbiAgICAnZGl0by1kcmFnZ2luZyc6IGRyYWdnaW5nLFxuICAgICdkaXRvLWFjdGl2ZSc6IGFjdGl2ZVxuICB9YFxuICA6c3R5bGU9XCJsZXZlbCA+IDAgJiYgeyAnLS1sZXZlbCc6IGxldmVsIH1cIlxuKVxuICAuZGl0by10cmVlLWhlYWRlcihcbiAgICB2LWlmPVwibGFiZWxcIlxuICApXG4gICAgLmRpdG8tdHJlZS1icmFuY2goXG4gICAgICB2LWlmPVwibnVtRW50cmllc1wiXG4gICAgICBAY2xpY2suc3RvcD1cIm9wZW5lZCA9ICFvcGVuZWRcIlxuICAgIClcbiAgICAgIC5kaXRvLWNoZXZyb24oXG4gICAgICAgIHYtaWY9XCJudW1FbnRyaWVzXCJcbiAgICAgICAgOmNsYXNzPVwieyAnZGl0by1vcGVuZWQnOiBvcGVuZWQgfVwiXG4gICAgICApXG4gICAgICAuZGl0by10cmVlLWxhYmVsKFxuICAgICAgICB2LWh0bWw9XCJsYWJlbFwiXG4gICAgICApXG4gICAgICAuZGl0by10cmVlLWluZm8oXG4gICAgICAgIHYtaWY9XCJkZXRhaWxzXCJcbiAgICAgICkge3sgZGV0YWlscyB9fVxuICAgIC5kaXRvLXRyZWUtbGVhZihcbiAgICAgIHYtZWxzZVxuICAgIClcbiAgICAgIC5kaXRvLXRyZWUtbGFiZWwoXG4gICAgICAgIHYtaHRtbD1cImxhYmVsXCJcbiAgICAgIClcbiAgICAuZGl0by1idXR0b25zLmRpdG8tYnV0dG9ucy1zbWFsbChcbiAgICAgIHYtaWY9XCJoYXNFZGl0QnV0dG9uc1wiXG4gICAgKVxuICAgICAgLy8tIEZpcmVmb3ggZG9lc24ndCBsaWtlIDxidXR0b24+IGhlcmUsIHNvIHVzZSA8YT4gaW5zdGVhZDpcbiAgICAgIGEuZGl0by1idXR0b24oXG4gICAgICAgIHYtaWY9XCJkcmFnZ2FibGVcIlxuICAgICAgICB2LWJpbmQ9XCJnZXRCdXR0b25BdHRyaWJ1dGVzKHZlcmJzLmRyYWcpXCJcbiAgICAgIClcbiAgICAgIGJ1dHRvbi5kaXRvLWJ1dHRvbihcbiAgICAgICAgdi1pZj1cImVkaXRhYmxlXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIHYtYmluZD1cImdldEJ1dHRvbkF0dHJpYnV0ZXModmVyYnMuZWRpdClcIlxuICAgICAgICBAY2xpY2s9XCJvbkVkaXRcIlxuICAgICAgKVxuICAgICAgYnV0dG9uLmRpdG8tYnV0dG9uKFxuICAgICAgICB2LWlmPVwiZGVsZXRhYmxlXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIHYtYmluZD1cImdldEJ1dHRvbkF0dHJpYnV0ZXModmVyYnMuZGVsZXRlKVwiXG4gICAgICAgIEBjbGljaz1cIm9uRGVsZXRlXCJcbiAgICAgIClcbiAgdGFibGUuZGl0by1wcm9wZXJ0aWVzKFxuICAgIHYtaWY9XCJwcm9wZXJ0aWVzXCJcbiAgICB2LXNob3c9XCJvcGVuZWRcIlxuICApXG4gICAgdHIoXG4gICAgICB2LWZvcj1cInByb3BlcnR5IGluIHByb3BlcnRpZXNcIlxuICAgIClcbiAgICAgIHRkXG4gICAgICAgIERpdG9MYWJlbChcbiAgICAgICAgICB2LWlmPVwicHJvcGVydHkubGFiZWwgIT09IGZhbHNlXCJcbiAgICAgICAgICA6ZGF0YVBhdGg9XCJnZXRQcm9wZXJ0eURhdGFQYXRoKHByb3BlcnR5KVwiXG4gICAgICAgICAgOmxhYmVsPVwiZ2V0TGFiZWwocHJvcGVydHkpXCJcbiAgICAgICAgKVxuICAgICAgRGl0b1RhYmxlQ2VsbChcbiAgICAgICAgOmNlbGw9XCJwcm9wZXJ0eVwiXG4gICAgICAgIDpzY2hlbWE9XCJwcm9wZXJ0eVwiXG4gICAgICAgIDpkYXRhUGF0aD1cImdldFByb3BlcnR5RGF0YVBhdGgocHJvcGVydHkpXCJcbiAgICAgICAgOmRhdGE9XCJkYXRhXCJcbiAgICAgICAgOm1ldGE9XCJuZXN0ZWRNZXRhXCJcbiAgICAgICAgOnN0b3JlPVwic3RvcmVcIlxuICAgICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gICAgICApXG4gIERpdG9EcmFnZ2FibGUoXG4gICAgdi1pZj1cImNoaWxkcmVuU2NoZW1hXCJcbiAgICB2LXNob3c9XCJvcGVuZWRcIlxuICAgIDptb2RlbFZhbHVlPVwidXBkYXRlT3JkZXIoY2hpbGRyZW5TY2hlbWEsIGNoaWxkcmVuTGlzdClcIlxuICAgIDpvcHRpb25zPVwiZ2V0U29ydGFibGVPcHRpb25zKHRydWUpXCJcbiAgICA6ZHJhZ2dhYmxlPVwiY2hpbGRyZW5EcmFnZ2FibGVcIlxuICAgIEB1cGRhdGU6bW9kZWxWYWx1ZT1cInZhbHVlID0+IChjaGlsZHJlbkxpc3QgPSB2YWx1ZSlcIlxuICApXG4gICAgRGl0b1RyZWVJdGVtKFxuICAgICAgdi1mb3I9XCIoaXRlbSwgaW5kZXgpIGluIGNoaWxkcmVuSXRlbXNcIlxuICAgICAgOmtleT1cImdldEl0ZW1VaWQoY2hpbGRyZW5TY2hlbWEsIGl0ZW0uZGF0YSlcIlxuICAgICAgOnNjaGVtYT1cImNoaWxkcmVuU2NoZW1hXCJcbiAgICAgIDpkYXRhUGF0aD1cImdldEl0ZW1EYXRhUGF0aChjaGlsZHJlblNjaGVtYSwgaW5kZXgpXCJcbiAgICAgIDpkYXRhPVwiaXRlbS5kYXRhXCJcbiAgICAgIDpwYXRoPVwiaXRlbS5wYXRoXCJcbiAgICAgIDpvcGVuPVwiaXRlbS5vcGVuXCJcbiAgICAgIDphY3RpdmU9XCJpdGVtLmFjdGl2ZVwiXG4gICAgICA6ZHJhZ2dhYmxlPVwiY2hpbGRyZW5EcmFnZ2FibGVcIlxuICAgICAgOmxhYmVsPVwiZ2V0SXRlbUxhYmVsKGNoaWxkcmVuU2NoZW1hLCBpdGVtLmRhdGEsIHsgaW5kZXggfSlcIlxuICAgICAgOmxldmVsPVwibGV2ZWwgKyAxXCJcbiAgICApXG4gICAgLy8tIFRPRE86IENvbnZlcnQgZGl0by10cmVlLWl0ZW0gdG8gdXNlIGRpdG8tbGFiZWwgaW50ZXJuYWxseSwgYW5kIHRoZW5cbiAgICAvLy0gcGFzcyBgYXNPYmplY3Q6IHRydWVgIGluIHRoZSBgZ2V0SXRlbUxhYmVsKClgIGNhbGwgYWJvdmUuXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCBTb3J0YWJsZU1peGluIGZyb20gJy4uL21peGlucy9Tb3J0YWJsZU1peGluLmpzJ1xuaW1wb3J0IHsgYXBwZW5kRGF0YVBhdGggfSBmcm9tICcuLi91dGlscy9kYXRhLmpzJ1xuaW1wb3J0IHsgZ2V0U2NoZW1hQWNjZXNzb3IgfSBmcm9tICcuLi91dGlscy9hY2Nlc3Nvci5qcydcbmltcG9ydCB7IGdldE5hbWVkU2NoZW1hcywgaGFzRm9ybVNjaGVtYSB9IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvVHJlZUl0ZW0nLCB7XG4gIG1peGluczogW1NvcnRhYmxlTWl4aW5dLFxuICBpbmplY3Q6IFsnY29udGFpbmVyJ10sXG5cbiAgcHJvcHM6IHtcbiAgICBzY2hlbWE6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGRhdGFQYXRoOiB7IHR5cGU6IFN0cmluZywgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBkYXRhOiB7IHR5cGU6IFtBcnJheSwgT2JqZWN0XSwgZGVmYXVsdDogbnVsbCB9LFxuICAgIHBhdGg6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnJyB9LFxuICAgIG9wZW46IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBhY3RpdmU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBkcmFnZ2FibGU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBsYWJlbDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBsZXZlbDogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IDAgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9wZW5lZDogdGhpcy5vcGVuIHx8IHRoaXMuc2NoZW1hLm9wZW5cbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBtZXRhKCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyLm1ldGFcbiAgICB9LFxuXG4gICAgc3RvcmUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb250YWluZXIuc3RvcmVcbiAgICB9LFxuXG4gICAgZGlzYWJsZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb250YWluZXIuZGlzYWJsZWRcbiAgICB9LFxuXG4gICAgbmVzdGVkTWV0YSgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnRoaXMubWV0YSxcbiAgICAgICAgc2NoZW1hOiB0aGlzLnNjaGVtYVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBwcm9wZXJ0aWVzKCkge1xuICAgICAgcmV0dXJuIGdldE5hbWVkU2NoZW1hcyh0aGlzLnNjaGVtYS5wcm9wZXJ0aWVzKVxuICAgIH0sXG5cbiAgICAvLyBUT0RPOiBTaG91bGQgdGhpcyBiZSBuYW1lZCBgc291cmNlU2NoZW1hYCBpbnN0ZWFkPyBVc2UgU291cmNlTWl4aW4/XG4gICAgY2hpbGRyZW5TY2hlbWEoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY2hlbWEuY2hpbGRyZW5cbiAgICB9LFxuXG4gICAgY2hpbGRyZW5MaXN0KCkge1xuICAgICAgY29uc3QgbmFtZSA9IHRoaXMuY2hpbGRyZW5TY2hlbWE/Lm5hbWVcbiAgICAgIHJldHVybiBuYW1lICYmIHRoaXMuZGF0YVtuYW1lXVxuICAgIH0sXG5cbiAgICBjaGlsZHJlbkRyYWdnYWJsZSgpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRoaXMuY2hpbGRyZW5MaXN0Py5sZW5ndGggPiAxICYmXG4gICAgICAgIHRoaXMuZ2V0U2NoZW1hVmFsdWUoJ2RyYWdnYWJsZScsIHtcbiAgICAgICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICAgIHNjaGVtYTogdGhpcy5jaGlsZHJlblNjaGVtYVxuICAgICAgICB9KVxuICAgICAgKVxuICAgIH0sXG5cbiAgICBudW1DaGlsZHJlbigpIHtcbiAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuTGlzdD8ubGVuZ3RoIHx8IDBcbiAgICB9LFxuXG4gICAgbnVtUHJvcGVydGllcygpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXM/Lmxlbmd0aCB8fCAwXG4gICAgfSxcblxuICAgIG51bUVudHJpZXMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5udW1Qcm9wZXJ0aWVzICsgdGhpcy5udW1DaGlsZHJlblxuICAgIH0sXG5cbiAgICBjaGlsZHJlbkl0ZW1zKCkge1xuICAgICAgY29uc3QgeyBjaGlsZHJlblNjaGVtYSwgY2hpbGRyZW5MaXN0IH0gPSB0aGlzXG4gICAgICBpZiAoY2hpbGRyZW5TY2hlbWEgJiYgY2hpbGRyZW5MaXN0KSB7XG4gICAgICAgIGNvbnN0IHsgZWRpdFBhdGggfSA9IHRoaXMuY29udGFpbmVyXG4gICAgICAgIGNvbnN0IGNoaWxkcmVuT3BlbiA9ICF0aGlzLnBhdGggJiYgY2hpbGRyZW5TY2hlbWEub3BlblxuICAgICAgICAvLyBCdWlsZCBhIGNoaWxkcmVuIGxpc3Qgd2l0aCBjaGlsZCBtZXRhIGluZm9ybWF0aW9uIGZvciB0aGUgdGVtcGxhdGUuXG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZU9yZGVyKFxuICAgICAgICAgIGNoaWxkcmVuU2NoZW1hLFxuICAgICAgICAgIGNoaWxkcmVuTGlzdC5tYXAoKGRhdGEsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwYXRoID0gKFxuICAgICAgICAgICAgICBjaGlsZHJlblNjaGVtYS5wYXRoICYmXG4gICAgICAgICAgICAgIGAke3RoaXMucGF0aH0vJHtjaGlsZHJlblNjaGVtYS5wYXRofS8ke2luZGV4fWBcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGNvbnN0IG9wZW4gPSAoXG4gICAgICAgICAgICAgIGNoaWxkcmVuT3BlbiB8fFxuICAgICAgICAgICAgICAvLyBPbmx5IGNvdW50IGFzIFwiaW4gZWRpdCBwYXRoXCIgd2hlbiBpdCdzIG5vdCB0aGUgZnVsbCBlZGl0IHBhdGguXG4gICAgICAgICAgICAgIGVkaXRQYXRoLnN0YXJ0c1dpdGgocGF0aCkgJiYgcGF0aC5sZW5ndGggPCBlZGl0UGF0aC5sZW5ndGhcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGNvbnN0IGFjdGl2ZSA9IGVkaXRQYXRoID09PSBwYXRoXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgICBvcGVuLFxuICAgICAgICAgICAgICBhY3RpdmVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICB9XG4gICAgICByZXR1cm4gW11cbiAgICB9LFxuXG4gICAgZGV0YWlscygpIHtcbiAgICAgIGNvbnN0IHsgbnVtQ2hpbGRyZW4gfSA9IHRoaXNcbiAgICAgIHJldHVybiAoXG4gICAgICAgIG51bUNoaWxkcmVuICYmXG4gICAgICAgIGAke251bUNoaWxkcmVufSAke1xuICAgICAgICAgIG51bUNoaWxkcmVuID09PSAxID8gJ2l0ZW0nIDogJ2l0ZW1zJ1xuICAgICAgICB9YFxuICAgICAgKVxuICAgIH0sXG5cbiAgICBoYXNFZGl0QnV0dG9ucygpIHtcbiAgICAgIHJldHVybiB0aGlzLmRyYWdnYWJsZSB8fCB0aGlzLmVkaXRhYmxlIHx8IHRoaXMuZGVsZXRhYmxlXG4gICAgfSxcblxuICAgIC8vIFRPRE86IFN1cHBvcnQgY3JlYXRhYmxlIVxuICAgIC8vIFRPRE86IEFkZCBzdXBwb3J0IGZvciBjcmVhdGFibGUsIGVkaXRhYmxlIGFuZCBkZWxldGFibGUgb3ZlcnJpZGVzIG9uIHRoZVxuICAgIC8vIGFzc29jaWF0ZWQgZm9ybXMsIGp1c3QgbGlrZSBpbiBgVHlwZUxpc3RgIGFuZCBgVHlwZU9iamVjdGAsIHRocm91Z2hcbiAgICAvLyBgRGl0b0VkaXRCdXR0b25zYC4gSXQgd291bGQgYmUgYmVzdCB0byB1c2UgYERpdG9FZGl0QnV0dG9uc2AgaGVyZSB0b28uXG4gICAgY3JlYXRhYmxlOiBnZXRTY2hlbWFBY2Nlc3NvcignY3JlYXRhYmxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgZ2V0KGNyZWF0YWJsZSkge1xuICAgICAgICByZXR1cm4gY3JlYXRhYmxlICYmIGhhc0Zvcm1TY2hlbWEodGhpcy5zY2hlbWEpXG4gICAgICB9XG4gICAgfSksXG5cbiAgICBlZGl0YWJsZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ2VkaXRhYmxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgZ2V0KGVkaXRhYmxlKSB7XG4gICAgICAgIHJldHVybiBlZGl0YWJsZSAmJiBoYXNGb3JtU2NoZW1hKHRoaXMuc2NoZW1hKVxuICAgICAgfVxuICAgIH0pLFxuXG4gICAgZGVsZXRhYmxlOiBnZXRTY2hlbWFBY2Nlc3NvcignZGVsZXRhYmxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSlcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0UHJvcGVydHlEYXRhUGF0aChwcm9wZXJ0eSkge1xuICAgICAgcmV0dXJuIGFwcGVuZERhdGFQYXRoKHRoaXMuZGF0YVBhdGgsIHByb3BlcnR5Lm5hbWUpXG4gICAgfSxcblxuICAgIG9uRWRpdCgpIHtcbiAgICAgIC8vIEFsbCB3ZSBnb3QgdG8gZG8gaXMgcHVzaCB0aGUgcmlnaHQgZWRpdCBwYXRoIHRvIHRoZSByb3V0ZXIsIHRoZSByZXN0XG4gICAgICAvLyBpcyBoYW5kbGVkIGJ5IG91ciByb3V0ZXMsIGFsbG93aW5nIHJlbG9hZHMgYXMgd2VsbC5cbiAgICAgIHRoaXMuJHJvdXRlci5wdXNoKHtcbiAgICAgICAgcGF0aDogYCR7dGhpcy5jb250YWluZXIucGF0aH0ke3RoaXMucGF0aH1gLFxuICAgICAgICAvLyBQcmVzZXJ2ZSBjdXJyZW50IHF1ZXJ5XG4gICAgICAgIHF1ZXJ5OiB0aGlzLiRyb3V0ZS5xdWVyeVxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgb25EZWxldGUoKSB7XG4gICAgICAvLyBUT0RPOiBJbXBsZW1lbnQhXG4gICAgfSxcblxuICAgIG9uQ2hhbmdlKCkge1xuICAgICAgdGhpcy5jb250YWluZXIub25DaGFuZ2UoKVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXRyZWUtaXRlbSB7XG4gIC0tY2hldnJvbi1pbmRlbnQ6ICN7JGNoZXZyb24taW5kZW50fTtcblxuICA+IC5kaXRvLXRyZWUtaGVhZGVyIHtcbiAgICA+IC5kaXRvLXRyZWUtYnJhbmNoLFxuICAgID4gLmRpdG8tdHJlZS1sZWFmIHtcbiAgICAgIC8vIFVzZSBgLS1sZXZlbGAgQ1NTIHZhcmlhYmxlIHRvIGNhbGN1bGF0ZWQgdGhlIGFjY3VtdWxhdGVkIGluZGVudFxuICAgICAgLy8gcGFkZGluZyBkaXJlY3RseSBpbnN0ZWFkIG9mIGhhdmluZyBpdCBhY2N1bXVsYXRlIGluIG5lc3RlZCBDU1MuXG4gICAgICAvLyBUaGlzIHdheSwgd2UgY2FuIGtlZXAgdGhlIC5kaXRvLWFjdGl2ZSBhcmVhIGNvdmVyIHRoZSBmdWxsIHdpZHRoOlxuICAgICAgcGFkZGluZy1sZWZ0OiBjYWxjKHZhcigtLWNoZXZyb24taW5kZW50KSAqICh2YXIoLS1sZXZlbCwgMSkgLSAxKSk7XG4gICAgfVxuICB9XG5cbiAgLmRpdG8tdHJlZS1icmFuY2gge1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgfVxuXG4gIC5kaXRvLXRyZWUtaGVhZGVyIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgfVxuXG4gIC5kaXRvLXRyZWUtYnJhbmNoLFxuICAuZGl0by10cmVlLWxlYWYge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleDogYXV0bztcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbWFyZ2luOiAxcHggMDtcbiAgICBAaW5jbHVkZSB1c2VyLXNlbGVjdChub25lKTtcbiAgfVxuXG4gIC5kaXRvLXRyZWUtbGFiZWwsXG4gIC5kaXRvLXRyZWUtaW5mbyB7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgfVxuXG4gIC5kaXRvLXRyZWUtaW5mbyB7XG4gICAgcGFkZGluZy1sZWZ0OiAwLjM1ZW07XG4gICAgY29sb3I6IHJnYmEoJGNvbG9yLWJsYWNrLCAwLjIpO1xuICB9XG5cbiAgLmRpdG8tYnV0dG9ucyB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIG1hcmdpbjogMXB4IDAgMXB4IDFlbTtcbiAgfVxuXG4gIC5kaXRvLXRyZWUtaGVhZGVyOmhvdmVyIHtcbiAgICA+IC5kaXRvLWJ1dHRvbnMge1xuICAgICAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbiAgICB9IC8vIEhpZGUgYnV0dG9ucyBkdXJpbmcgZHJhZ2dpbmdcbiAgfVxuXG4gICYuZGl0by1kcmFnZ2luZyB7XG4gICAgLmRpdG8tdHJlZS1oZWFkZXIge1xuICAgICAgPiAuZGl0by1idXR0b25zIHtcbiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gICYuZGl0by1hY3RpdmUge1xuICAgID4gLmRpdG8tdHJlZS1oZWFkZXIge1xuICAgICAgYmFja2dyb3VuZDogJGNvbG9yLWFjdGl2ZTtcbiAgICAgIHBhZGRpbmc6IDAgJGlucHV0LXBhZGRpbmctaG9yO1xuICAgICAgbWFyZ2luOiAwICgtJGlucHV0LXBhZGRpbmctaG9yKTtcblxuICAgICAgPiAuZGl0by10cmVlLWJyYW5jaCB7XG4gICAgICAgID4gLmRpdG8tY2hldnJvbjo6YmVmb3JlIHtcbiAgICAgICAgICBjb2xvcjogJGNvbG9yLXdoaXRlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgID4gKiA+IC5kaXRvLXRyZWUtbGFiZWwge1xuICAgICAgICBjb2xvcjogJGNvbG9yLXdoaXRlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC5kaXRvLXByb3BlcnRpZXMge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIG1hcmdpbi1sZWZ0OiAkY2hldnJvbi1pbmRlbnQ7XG5cbiAgICA+IHRyIHtcbiAgICAgIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTtcbiAgICB9XG5cbiAgICAuZGl0by1sYWJlbCB7XG4gICAgICBtYXJnaW46IDA7XG5cbiAgICAgICY6OmFmdGVyIHtcbiAgICAgICAgY29udGVudDogJzogJztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxudGhlYWQuZGl0by10YWJsZS1oZWFkXG4gIHRyXG4gICAgdGVtcGxhdGUoXG4gICAgICB2LWZvcj1cImNvbHVtbiBpbiBjb2x1bW5zXCJcbiAgICApXG4gICAgICB0aChcbiAgICAgICAgdi1pZj1cInNob3VsZFJlbmRlcihjb2x1bW4pXCJcbiAgICAgICAgOmNsYXNzPVwiZ2V0Q29sdW1uQ2xhc3MoY29sdW1uKVwiXG4gICAgICApXG4gICAgICAgIFJvdXRlckxpbmsoXG4gICAgICAgICAgdi1pZj1cImNvbHVtbi5zb3J0YWJsZVwiXG4gICAgICAgICAgdi1zbG90PVwieyBuYXZpZ2F0ZSB9XCJcbiAgICAgICAgICA6dG89XCJnZXRTb3J0TGluayhjb2x1bW4pXCJcbiAgICAgICAgICBjdXN0b21cbiAgICAgICAgKVxuICAgICAgICAgIGJ1dHRvbi5kaXRvLWJ1dHRvbihcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgOmNsYXNzPVwiZ2V0U29ydENsYXNzKGNvbHVtbilcIlxuICAgICAgICAgICAgQGNsaWNrPVwibmF2aWdhdGVcIlxuICAgICAgICAgIClcbiAgICAgICAgICAgIC5kaXRvLW9yZGVyLWFycm93c1xuICAgICAgICAgICAgc3BhbiB7eyBnZXRMYWJlbChjb2x1bW4pIH19XG4gICAgICAgIHNwYW4oXG4gICAgICAgICAgdi1lbHNlXG4gICAgICAgICkge3sgZ2V0TGFiZWwoY29sdW1uKSB9fVxuICAgIHRoKFxuICAgICAgdi1pZj1cImhhc0VkaXRCdXR0b25zXCJcbiAgICApXG4gICAgICAvLy0gRW1wdHkgPHNwYW4+IGlzIG5lZWRlZCBmb3Igc3R5bGluZywgc2VlIF90YWJsZS5zY3NzXG4gICAgICBzcGFuXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9Db21wb25lbnQgZnJvbSAnLi4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCB7IGh5cGhlbmF0ZSB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b1RhYmxlSGVhZCcsIHtcbiAgcHJvcHM6IHtcbiAgICBxdWVyeTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgY29sdW1uczogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgaGFzRWRpdEJ1dHRvbnM6IHsgdHlwZTogQm9vbGVhbiwgcmVxdWlyZWQ6IHRydWUgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgc29ydCgpIHtcbiAgICAgIGNvbnN0IG9yZGVyID0gKHRoaXMucXVlcnkub3JkZXIgfHwgJycpLnNwbGl0KC9cXHMrLylcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IG9yZGVyWzBdLFxuICAgICAgICBvcmRlcjogb3JkZXJbMV1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGdldENvbHVtbkNsYXNzKGNvbHVtbikge1xuICAgICAgcmV0dXJuIGBkaXRvLWNvbHVtbi0ke2h5cGhlbmF0ZShjb2x1bW4ubmFtZSl9YFxuICAgIH0sXG5cbiAgICBnZXRTb3J0Q2xhc3MoY29sdW1uKSB7XG4gICAgICByZXR1cm4gdGhpcy5zb3J0Lm5hbWUgPT09IGNvbHVtbi5uYW1lXG4gICAgICAgID8gYGRpdG8tc2VsZWN0ZWQgZGl0by1vcmRlci0ke3RoaXMuc29ydC5vcmRlcn1gXG4gICAgICAgIDogbnVsbFxuICAgIH0sXG5cbiAgICBnZXRTb3J0TGluayhjb2x1bW4pIHtcbiAgICAgIC8vIFRvZ2dsZSBvcmRlciBpZiB0aGUgc2FtZSBjb2x1bW4gaXMgY2xpY2tlZCBhZ2Fpbi5cbiAgICAgIGNvbnN0IG9yZGVyID1cbiAgICAgICAgdGhpcy5zb3J0Lm5hbWUgPT09IGNvbHVtbi5uYW1lICYmIHRoaXMuc29ydC5vcmRlciA9PT0gJ2FzYydcbiAgICAgICAgICA/ICdkZXNjJ1xuICAgICAgICAgIDogJ2FzYydcbiAgICAgIHJldHVybiB0aGlzLmdldFF1ZXJ5TGluayh7XG4gICAgICAgIC4uLnRoaXMucXVlcnksXG4gICAgICAgIG9yZGVyOiBgJHtjb2x1bW4ubmFtZX0gJHtvcmRlcn1gXG4gICAgICB9KVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXRhYmxlLWhlYWQge1xuICBAaW5jbHVkZSB1c2VyLXNlbGVjdChub25lKTtcblxuICB0ciB7XG4gICAgdGgge1xuICAgICAgcGFkZGluZzogMDtcbiAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gICAgICB0ZXh0LWFsaWduOiBsZWZ0O1xuICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcblxuICAgICAgLmRpdG8tYnV0dG9uIHtcbiAgICAgICAgLy8gQ29udmVudGlvbjogTmVzdGVkIHNwYW5zIGhhbmRsZSBwYWRkaW5nLCBzZWUgYmVsb3dcbiAgICAgICAgcGFkZGluZzogMDtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIHRleHQtYWxpZ246IGluaGVyaXQ7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gICAgICB9XG5cbiAgICAgIHNwYW4ge1xuICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgICAgIC8vIENvbnZlbnRpb246IE5lc3RlZCBzcGFucyBoYW5kbGUgcGFkZGluZ1xuICAgICAgICBwYWRkaW5nOiAkaW5wdXQtcGFkZGluZztcblxuICAgICAgICAmOmVtcHR5OjphZnRlciB7XG4gICAgICAgICAgLy8gUHJldmVudCBlbXB0eSA8dGg+IGZyb20gY29sbGFwc2luZ1xuICAgICAgICAgIGNvbnRlbnQ6ICdcXDIwMGInOyAvLyB6ZXJvLXdpZHRoIHNwYWNlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgID4gc3BhbiB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG50ZChcbiAgOmNsYXNzPVwiY2VsbC5jbGFzc1wiXG4gIDpzdHlsZT1cImNlbGwuc3R5bGVcIlxuKVxuICAvLy0gVE9ETzogSW1wbGVtZW50IGlubGluZWQgY29tcG9uZW50cyBpbiBjZWxsIG1vZGUhXG4gIGNvbXBvbmVudChcbiAgICB2LWlmPVwiY2VsbC5jb21wb25lbnRcIlxuICAgIDppcz1cImNlbGwuY29tcG9uZW50XCJcbiAgICA6c2NoZW1hPVwic2NoZW1hXCJcbiAgICA6ZGF0YVBhdGg9XCJkYXRhUGF0aFwiXG4gICAgOmRhdGE9XCJkYXRhXCJcbiAgICA6bWV0YT1cIm1ldGFcIlxuICAgIDpzdG9yZT1cInN0b3JlXCJcbiAgICA6bmVzdGVkPVwibmVzdGVkXCJcbiAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gIClcbiAgc3BhbihcbiAgICB2LWVsc2VcbiAgICB2LWh0bWw9XCJyZW5kZXJDZWxsKGRhdGEpXCJcbiAgKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4uL0RpdG9Db21wb25lbnQuanMnXG5pbXBvcnQgRGl0b0NvbnRleHQgZnJvbSAnLi4vRGl0b0NvbnRleHQuanMnXG5pbXBvcnQgeyBhcHBlbmREYXRhUGF0aCB9IGZyb20gJy4uL3V0aWxzL2RhdGEuanMnXG5pbXBvcnQgeyBlc2NhcGVIdG1sIH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9Db21wb25lbnQuY29tcG9uZW50KCdEaXRvVGFibGVDZWxsJywge1xuICBwcm9wczoge1xuICAgIGNlbGw6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHNjaGVtYTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgZGF0YVBhdGg6IHsgdHlwZTogU3RyaW5nLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIGRhdGE6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIG1ldGE6IHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHN0b3JlOiB7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICBuZXN0ZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZSB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgcmVuZGVyQ2VsbChpdGVtKSB7XG4gICAgICBjb25zdCB7IG5hbWUsIHJlbmRlciB9ID0gdGhpcy5jZWxsXG4gICAgICBjb25zdCB2YWx1ZSA9IGl0ZW1bbmFtZV1cbiAgICAgIHJldHVybiByZW5kZXJcbiAgICAgICAgPyByZW5kZXIuY2FsbChcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICBuZXcgRGl0b0NvbnRleHQodGhpcywge1xuICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgZGF0YTogaXRlbSxcbiAgICAgICAgICAgICAgZGF0YVBhdGg6IGFwcGVuZERhdGFQYXRoKHRoaXMuZGF0YVBhdGgsIG5hbWUpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICAgOiBlc2NhcGVIdG1sKHZhbHVlKVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuIiwiaW1wb3J0IHsgbmV4dFRpY2ssIGRlZmluZUNvbXBvbmVudCwgcmVmLCByZWFjdGl2ZSwgaCB9IGZyb20gJ3Z1ZS1kZW1pJztcbmltcG9ydCB7IHRyeU9uTW91bnRlZCwgdHJ5T25TY29wZURpc3Bvc2UsIHVucmVmRWxlbWVudCwgZGVmYXVsdERvY3VtZW50LCB0b1ZhbHVlLCB1c2VWTW9kZWwgfSBmcm9tICdAdnVldXNlL2NvcmUnO1xuaW1wb3J0IFNvcnRhYmxlIGZyb20gJ3NvcnRhYmxlanMnO1xuXG52YXIgX19kZWZQcm9wID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xudmFyIF9fZ2V0T3duUHJvcFN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xudmFyIF9faGFzT3duUHJvcCA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgX19wcm9wSXNFbnVtID0gT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcbnZhciBfX2RlZk5vcm1hbFByb3AgPSAob2JqLCBrZXksIHZhbHVlKSA9PiBrZXkgaW4gb2JqID8gX19kZWZQcm9wKG9iaiwga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlIH0pIDogb2JqW2tleV0gPSB2YWx1ZTtcbnZhciBfX3NwcmVhZFZhbHVlcyA9IChhLCBiKSA9PiB7XG4gIGZvciAodmFyIHByb3AgaW4gYiB8fCAoYiA9IHt9KSlcbiAgICBpZiAoX19oYXNPd25Qcm9wLmNhbGwoYiwgcHJvcCkpXG4gICAgICBfX2RlZk5vcm1hbFByb3AoYSwgcHJvcCwgYltwcm9wXSk7XG4gIGlmIChfX2dldE93blByb3BTeW1ib2xzKVxuICAgIGZvciAodmFyIHByb3Agb2YgX19nZXRPd25Qcm9wU3ltYm9scyhiKSkge1xuICAgICAgaWYgKF9fcHJvcElzRW51bS5jYWxsKGIsIHByb3ApKVxuICAgICAgICBfX2RlZk5vcm1hbFByb3AoYSwgcHJvcCwgYltwcm9wXSk7XG4gICAgfVxuICByZXR1cm4gYTtcbn07XG52YXIgX19vYmpSZXN0ID0gKHNvdXJjZSwgZXhjbHVkZSkgPT4ge1xuICB2YXIgdGFyZ2V0ID0ge307XG4gIGZvciAodmFyIHByb3AgaW4gc291cmNlKVxuICAgIGlmIChfX2hhc093blByb3AuY2FsbChzb3VyY2UsIHByb3ApICYmIGV4Y2x1ZGUuaW5kZXhPZihwcm9wKSA8IDApXG4gICAgICB0YXJnZXRbcHJvcF0gPSBzb3VyY2VbcHJvcF07XG4gIGlmIChzb3VyY2UgIT0gbnVsbCAmJiBfX2dldE93blByb3BTeW1ib2xzKVxuICAgIGZvciAodmFyIHByb3Agb2YgX19nZXRPd25Qcm9wU3ltYm9scyhzb3VyY2UpKSB7XG4gICAgICBpZiAoZXhjbHVkZS5pbmRleE9mKHByb3ApIDwgMCAmJiBfX3Byb3BJc0VudW0uY2FsbChzb3VyY2UsIHByb3ApKVxuICAgICAgICB0YXJnZXRbcHJvcF0gPSBzb3VyY2VbcHJvcF07XG4gICAgfVxuICByZXR1cm4gdGFyZ2V0O1xufTtcbmZ1bmN0aW9uIHVzZVNvcnRhYmxlKGVsLCBsaXN0LCBvcHRpb25zID0ge30pIHtcbiAgbGV0IHNvcnRhYmxlO1xuICBjb25zdCBfYSA9IG9wdGlvbnMsIHsgZG9jdW1lbnQgPSBkZWZhdWx0RG9jdW1lbnQgfSA9IF9hLCByZXNldE9wdGlvbnMgPSBfX29ialJlc3QoX2EsIFtcImRvY3VtZW50XCJdKTtcbiAgY29uc3QgZGVmYXVsdE9wdGlvbnMgPSB7XG4gICAgb25VcGRhdGU6IChlKSA9PiB7XG4gICAgICBtb3ZlQXJyYXlFbGVtZW50KGxpc3QsIGUub2xkSW5kZXgsIGUubmV3SW5kZXgpO1xuICAgIH1cbiAgfTtcbiAgY29uc3Qgc3RhcnQgPSAoKSA9PiB7XG4gICAgY29uc3QgdGFyZ2V0ID0gdHlwZW9mIGVsID09PSBcInN0cmluZ1wiID8gZG9jdW1lbnQgPT0gbnVsbCA/IHZvaWQgMCA6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZWwpIDogdW5yZWZFbGVtZW50KGVsKTtcbiAgICBpZiAoIXRhcmdldClcbiAgICAgIHJldHVybjtcbiAgICBzb3J0YWJsZSA9IG5ldyBTb3J0YWJsZSh0YXJnZXQsIF9fc3ByZWFkVmFsdWVzKF9fc3ByZWFkVmFsdWVzKHt9LCBkZWZhdWx0T3B0aW9ucyksIHJlc2V0T3B0aW9ucykpO1xuICB9O1xuICBjb25zdCBzdG9wID0gKCkgPT4gc29ydGFibGUgPT0gbnVsbCA/IHZvaWQgMCA6IHNvcnRhYmxlLmRlc3Ryb3koKTtcbiAgdHJ5T25Nb3VudGVkKHN0YXJ0KTtcbiAgdHJ5T25TY29wZURpc3Bvc2Uoc3RvcCk7XG4gIHJldHVybiB7IHN0b3AsIHN0YXJ0IH07XG59XG5mdW5jdGlvbiBtb3ZlQXJyYXlFbGVtZW50KGxpc3QsIGZyb20sIHRvKSB7XG4gIGNvbnN0IGFycmF5ID0gdG9WYWx1ZShsaXN0KTtcbiAgaWYgKHRvID49IDAgJiYgdG8gPCBhcnJheS5sZW5ndGgpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gYXJyYXkuc3BsaWNlKGZyb20sIDEpWzBdO1xuICAgIG5leHRUaWNrKCgpID0+IGFycmF5LnNwbGljZSh0bywgMCwgZWxlbWVudCkpO1xuICB9XG59XG5cbmNvbnN0IFVzZVNvcnRhYmxlID0gLyogQF9fUFVSRV9fICovIC8qICNfX1BVUkVfXyAqLyBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcIlVzZVNvcnRhYmxlXCIsXG4gIG1vZGVsOiB7XG4gICAgLy8gQ29tcGF0aWJsZSB3aXRoIHZ1ZTJcbiAgICBwcm9wOiBcIm1vZGVsVmFsdWVcIixcbiAgICBldmVudDogXCJ1cGRhdGU6bW9kZWxWYWx1ZVwiXG4gIH0sXG4gIHByb3BzOiB7XG4gICAgbW9kZWxWYWx1ZToge1xuICAgICAgdHlwZTogQXJyYXksXG4gICAgICByZXF1aXJlZDogdHJ1ZVxuICAgIH0sXG4gICAgdGFnOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiBcImRpdlwiXG4gICAgfSxcbiAgICBvcHRpb25zOiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICByZXF1aXJlZDogdHJ1ZVxuICAgIH1cbiAgfSxcbiAgc2V0dXAocHJvcHMsIHsgc2xvdHMgfSkge1xuICAgIGNvbnN0IGxpc3QgPSB1c2VWTW9kZWwocHJvcHMsIFwibW9kZWxWYWx1ZVwiKTtcbiAgICBjb25zdCB0YXJnZXQgPSByZWYoKTtcbiAgICBjb25zdCBkYXRhID0gcmVhY3RpdmUodXNlU29ydGFibGUodGFyZ2V0LCBsaXN0LCBwcm9wcy5vcHRpb25zKSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGlmIChzbG90cy5kZWZhdWx0KVxuICAgICAgICByZXR1cm4gaChwcm9wcy50YWcsIHsgcmVmOiB0YXJnZXQgfSwgc2xvdHMuZGVmYXVsdChkYXRhKSk7XG4gICAgfTtcbiAgfVxufSk7XG5cbmV4cG9ydCB7IFVzZVNvcnRhYmxlIH07XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuVXNlU29ydGFibGUoXG4gIHYtaWY9XCJkcmFnZ2FibGVcIlxuICA6dGFnPVwidGFnXCJcbiAgOm1vZGVsVmFsdWU9XCJtb2RlbFZhbHVlXCJcbiAgOm9wdGlvbnM9XCJvcHRpb25zXCJcbiAgQHVwZGF0ZTptb2RlbFZhbHVlPVwiJGVtaXQoJ3VwZGF0ZTptb2RlbFZhbHVlJywgJGV2ZW50KVwiXG4pXG4gIHNsb3RcbmNvbXBvbmVudChcbiAgdi1lbHNlXG4gIDppcz1cInRhZ1wiXG4pXG4gIHNsb3RcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50J1xuaW1wb3J0IHsgVXNlU29ydGFibGUgfSBmcm9tICdAdnVldXNlL2ludGVncmF0aW9ucy91c2VTb3J0YWJsZS9jb21wb25lbnQnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCgnRGl0b0RyYWdnYWJsZScsIHtcbiAgY29tcG9uZW50czogeyBVc2VTb3J0YWJsZSB9LFxuICBlbWl0czogWyd1cGRhdGU6bW9kZWxWYWx1ZSddLFxuXG4gIHByb3BzOiB7XG4gICAgbW9kZWxWYWx1ZToge1xuICAgICAgdHlwZTogQXJyYXksXG4gICAgICByZXF1aXJlZDogdHJ1ZVxuICAgIH0sXG4gICAgdGFnOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiAnZGl2J1xuICAgIH0sXG4gICAgb3B0aW9uczoge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgcmVxdWlyZWQ6IHRydWVcbiAgICB9LFxuICAgIGRyYWdnYWJsZToge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cbiIsIjxzY3JpcHQ+XG5pbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZnVuY3Rpb24gRGl0b1ZOb2RlKHsgdm5vZGUgfSkge1xuICByZXR1cm4gdm5vZGVcbn1cblxuRGl0b1ZOb2RlLnByb3BzID0ge1xuICB2bm9kZTogeyB0eXBlOiBPYmplY3QsIHJlcXVpcmVkOiB0cnVlIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRGl0b0NvbXBvbmVudC5jb21wb25lbnQoJ0RpdG9Wbm9kZScsIERpdG9WTm9kZSlcbjwvc2NyaXB0PlxuIiwiLy8gRGl0b1R5cGVDb21wb25lbnQgaXMgdGhlIGFic3RyYWN0IGJhc2UgY29tcG9uZW50IGZvciBhbGwgb3RoZXIgdHlwZVxuLy8gY29tcG9uZW50cyBpbnNpZGUgdGhlIHR5cGVzLyBmb2xkZXIuIFRoZXJlJ3MgYWxzbyBhIHNlcGFyYXRlIGNvbmNyZXRlXG4vLyBgRGl0b1R5cGVDb21wb25lbnQudnVlYCBjb21wb25lbnQsIHVzZSB0byByZW5kZXIgYHsgdHlwZTogJ2NvbXBvbmVudCcgfWBcbmltcG9ydCB7IGFzQXJyYXksIGNhbWVsaXplIH0gZnJvbSAnQGRpdG9qcy91dGlscydcbmltcG9ydCBEaXRvQ29tcG9uZW50IGZyb20gJy4vRGl0b0NvbXBvbmVudC5qcydcbmltcG9ydCBUeXBlTWl4aW4gZnJvbSAnLi9taXhpbnMvVHlwZU1peGluLmpzJ1xuaW1wb3J0IHsgcmVnaXN0ZXJUeXBlQ29tcG9uZW50LCBnZXRUeXBlQ29tcG9uZW50IH0gZnJvbSAnLi91dGlscy9zY2hlbWEuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCB7XG4gIGV4dGVuZHM6IERpdG9Db21wb25lbnQsXG4gIG1peGluczogW1R5cGVNaXhpbl0sXG5cbiAgbmF0aXZlRmllbGQ6IGZhbHNlLFxuICB0ZXh0RmllbGQ6IGZhbHNlLFxuICAvLyBTZXQgcmVhc29uYWJsZSBkZWZhdWx0cyBmb3IgYWxsIG9mIHRoZXNlIHRoYXQgYXJlIHVzZWQgYnkgbW9zdCB0eXBlXG4gIC8vIGNvbXBvbmVudHMuIFRoZXNlIG9ubHkgbmVlZCBkZWZpbmluZyBpbiBzdWItY2xhc3NlcyB3aGVuIHRoZXkgZGlmZmVyLlxuICBkZWZhdWx0VmFsdWU6IG51bGwsXG4gIGRlZmF1bHROZXN0ZWQ6IHRydWUsXG4gIGRlZmF1bHRWaXNpYmxlOiB0cnVlLFxuICBnZW5lcmF0ZUxhYmVsOiB0cnVlLFxuICBleGNsdWRlVmFsdWU6IGZhbHNlLFxuICBpZ25vcmVNaXNzaW5nVmFsdWU6IG51bGwsXG4gIGFsaWduQm90dG9tOiB0cnVlLFxuICBvbWl0UGFkZGluZzogZmFsc2UsXG5cbiAgY29tcG9uZW50OiBEaXRvQ29tcG9uZW50LmNvbXBvbmVudCxcblxuICBnZXQ6IGdldFR5cGVDb21wb25lbnQsXG5cbiAgcmVnaXN0ZXIodHlwZXMsIGRlZmluaXRpb24gPSB7fSkge1xuICAgIHR5cGVzID0gYXNBcnJheSh0eXBlcylcbiAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudChcbiAgICAgIGBEaXRvVHlwZSR7Y2FtZWxpemUodHlwZXNbMF0sIHRydWUpfWAsXG4gICAgICBkZWZpbml0aW9uXG4gICAgKVxuICAgIGZvciAoY29uc3QgdHlwZSBvZiB0eXBlcykge1xuICAgICAgcmVnaXN0ZXJUeXBlQ29tcG9uZW50KHR5cGUsIGNvbXBvbmVudClcbiAgICB9XG4gICAgcmV0dXJuIGNvbXBvbmVudFxuICB9XG59XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuYnV0dG9uLmRpdG8tYnV0dG9uKFxuICA6aWQ9XCJkYXRhUGF0aFwiXG4gIHJlZj1cImVsZW1lbnRcIlxuICA6dHlwZT1cInR5cGVcIlxuICA6dGl0bGU9XCJ0aXRsZVwiXG4gIDpjbGFzcz1cImJ1dHRvbkNsYXNzXCJcbiAgdi1iaW5kPVwiYXR0cmlidXRlc1wiXG4pIHt7IHRleHQgfX1cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b1R5cGVDb21wb25lbnQgZnJvbSAnLi4vRGl0b1R5cGVDb21wb25lbnQuanMnXG5pbXBvcnQgeyBnZXRTY2hlbWFBY2Nlc3NvciB9IGZyb20gJy4uL3V0aWxzL2FjY2Vzc29yLmpzJ1xuaW1wb3J0IHsgaGFzUmVzb3VyY2UgfSBmcm9tICcuLi91dGlscy9yZXNvdXJjZS5qcydcbmltcG9ydCB7IGxhYmVsaXplIH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoXG4gIFsnYnV0dG9uJywgJ3N1Ym1pdCddLFxuICAvLyBAdnVlL2NvbXBvbmVudFxuICB7XG4gICAgZGVmYXVsdFZhbHVlOiAoKSA9PiB1bmRlZmluZWQsIC8vIENhbGxiYWNrIHRvIG92ZXJyaWRlIGBkZWZhdWx0VmFsdWU6IG51bGxgXG4gICAgZXhjbHVkZVZhbHVlOiB0cnVlLFxuICAgIGdlbmVyYXRlTGFiZWw6IGZhbHNlLFxuICAgIGRlZmF1bHRXaWR0aDogJ2F1dG8nLFxuXG4gICAgY29tcHV0ZWQ6IHtcbiAgICAgIHZlcmIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZlcmJzW3RoaXMubmFtZV1cbiAgICAgIH0sXG5cbiAgICAgIGJ1dHRvbkNsYXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52ZXJiID8gYGRpdG8tYnV0dG9uLSR7dGhpcy52ZXJifWAgOiBudWxsXG4gICAgICB9LFxuXG4gICAgICB0ZXh0OiBnZXRTY2hlbWFBY2Nlc3NvcigndGV4dCcsIHtcbiAgICAgICAgdHlwZTogU3RyaW5nXG4gICAgICB9KSxcblxuICAgICAgdGl0bGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRleHQgfHwgbGFiZWxpemUodGhpcy52ZXJiKVxuICAgICAgfSxcblxuICAgICAgY2xvc2VGb3JtOiBnZXRTY2hlbWFBY2Nlc3NvcignY2xvc2VGb3JtJywge1xuICAgICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZVxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgbWV0aG9kczoge1xuICAgICAgLy8gQG92ZXJyaWRlXG4gICAgICBnZXRFdmVudHMoKSB7XG4gICAgICAgIGNvbnN0IHsgb25Gb2N1cywgb25CbHVyLCBvbkNsaWNrIH0gPSB0aGlzXG4gICAgICAgIHJldHVybiB7IG9uRm9jdXMsIG9uQmx1ciwgb25DbGljayB9XG4gICAgICB9LFxuXG4gICAgICBhc3luYyBzdWJtaXQob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNvdXJjZUNvbXBvbmVudD8uc3VibWl0KHRoaXMsIG9wdGlvbnMpXG4gICAgICB9LFxuXG4gICAgICBhc3luYyBvbkNsaWNrKCkge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmVtaXRFdmVudCgnY2xpY2snLCB7XG4gICAgICAgICAgcGFyZW50OiB0aGlzLnNjaGVtYUNvbXBvbmVudFxuICAgICAgICB9KVxuICAgICAgICAvLyBIYXZlIGJ1dHRvbnMgdGhhdCBkZWZpbmUgcmVzb3VyY2VzIGNhbGwgYHRoaXMuc3VibWl0KClgIGJ5IGRlZmF1bHQ6XG4gICAgICAgIGlmIChcbiAgICAgICAgICByZXMgPT09IHVuZGVmaW5lZCAmJiAvLyBNZWFuaW5nOiBkb24ndCBwcmV2ZW50IGRlZmF1bHQuXG4gICAgICAgICAgaGFzUmVzb3VyY2UodGhpcy5zY2hlbWEpXG4gICAgICAgICkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuc3VibWl0KClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuKVxuPC9zY3JpcHQ+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuaW5wdXQuZGl0by1jaGVja2JveChcbiAgOmlkPVwiZGF0YVBhdGhcIlxuICByZWY9XCJlbGVtZW50XCJcbiAgdi1tb2RlbD1cInZhbHVlXCJcbiAgdHlwZT1cImNoZWNrYm94XCJcbiAgdi1iaW5kPVwiYXR0cmlidXRlc1wiXG4pXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoJ2NoZWNrYm94Jywge1xuICBuYXRpdmVGaWVsZDogdHJ1ZVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLWNoZWNrYm94IHtcbiAgQGV4dGVuZCAlaW5wdXQtYm9yZGVybGVzcztcbn1cbjwvc3R5bGU+XG4iLCJpbXBvcnQge1xuICBpc09iamVjdCxcbiAgaXNGdW5jdGlvbixcbiAgaXNQcm9taXNlLFxuICBub3JtYWxpemVEYXRhUGF0aCxcbiAgZ2V0VmFsdWVBdERhdGFQYXRoXG59IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgeyByZWFjdGl2ZSB9IGZyb20gJ3Z1ZSdcbmltcG9ydCBMb2FkaW5nTWl4aW4gZnJvbSAnLi9Mb2FkaW5nTWl4aW4uanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCB7XG4gIG1peGluczogW0xvYWRpbmdNaXhpbl0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICAgIGFzeW5jRGF0YUVudHJpZXM6IHt9XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBoYW5kbGVEYXRhU2NoZW1hKHNjaGVtYSwgbmFtZSwge1xuICAgICAgcmVzb2x2ZUNvdW50ZXIgPSAxLFxuICAgICAgLi4ubG9hZGluZ09wdGlvbnNcbiAgICB9ID0ge30pIHtcbiAgICAgIGlmICghaXNPYmplY3Qoc2NoZW1hKSkge1xuICAgICAgICBzY2hlbWEgPSB7IGRhdGE6IHNjaGVtYSB9XG4gICAgICB9XG4gICAgICBsZXQgeyBkYXRhID0gdW5kZWZpbmVkLCBkYXRhUGF0aCA9IG51bGwgfSA9IHNjaGVtYVxuICAgICAgLy8gU2VlIGlmIHRoZXJlIGlzIGFzeW5jIGRhdGEgbG9hZGluZyBhbHJlYWR5IGluIHByb2Nlc3MuXG4gICAgICBjb25zdCBhc3luY0VudHJ5ID0gKHRoaXMuYXN5bmNEYXRhRW50cmllc1tuYW1lXSB8fD0gcmVhY3RpdmUoe1xuICAgICAgICBkZXBlbmRlbmN5RnVuY3Rpb246IG51bGwsXG4gICAgICAgIHJlc29sdmVDb3VudGVyOiAwLFxuICAgICAgICByZXNvbHZlZERhdGE6IG51bGwsXG4gICAgICAgIHJlc29sdmluZzogZmFsc2VcbiAgICAgIH0pKVxuICAgICAgLy8gSWYgdGhlIGRhdGEgY2FsbGJhY2sgcHJvdmlkZWQgYSBkZXBlbmRlbmN5IGZ1bmN0aW9uIHdoZW4gaXQgd2FzIGNhbGxlZCxcbiAgICAgIC8vIGNhbCBpdCBpbiBldmVyeSBjYWxsIG9mIGBoYW5kbGVEYXRhU2NoZW1hKClgIHRvIGZvcmNlIFZ1ZSB0byBrZWVwIHRyYWNrXG4gICAgICAvLyBvZiB0aGUgYXN5bmMgZGVwZW5kZW5jaWVzLlxuICAgICAgYXN5bmNFbnRyeS5kZXBlbmRlbmN5RnVuY3Rpb24/Lih0aGlzLmNvbnRleHQpXG5cbiAgICAgIGlmIChhc3luY0VudHJ5LnJlc29sdmVDb3VudGVyID4gMCkge1xuICAgICAgICAvLyBJZiB0aGUgZGF0YSB3YXMgcmVzb2x2ZWQgYWxyZWFkeSwgcmV0dXJuIGl0IGFuZCBjbGVhciB0aGUgdmFsdWUgb25jZVxuICAgICAgICAvLyBgcmVzb2x2ZUNvdW50ZXJgIHJlYWNoZXMgemVyby4gQ291bnRpbmcgaXMgbmVlZGVkIGJlY2F1c2UgZGVwZW5kaW5nXG4gICAgICAgIC8vIG9uIHRoZSB1c2Ugb2YgZGF0YSBhbmQgcmVhY3Rpdml0eSwgbXVsdGlwbGUgY2FsbHMgdG8gdGhlIGNvbXB1dGVkXG4gICAgICAgIC8vIGdldHRlciBhcmUgdHJpZ2dlcmVkIHdoZW4gdGhlIGRhdGEgaXMgY2hhbmdpbmcuIENsZWFyaW5nIHRoZSByZXNvbHZlZFxuICAgICAgICAvLyBkYXRhIHdvcmtzIGJlY2F1c2UgVnVlIGNhY2hlcyB0aGUgcmVzdWx0IG9mIGNvbXB1dGVkIGdldHRlcnMgYW5kIG9ubHlcbiAgICAgICAgLy8gcmVldmFsdWF0ZXMgaWYgb25lIG9mIHRoZSBkZXBlbmRlbmNpZXMgY2hhbmdlZC4gVGhpcyBpcyB0byBlbnN1cmVcbiAgICAgICAgLy8gdGhhdCBhIGNhY2hlZCB2YWx1ZSBoZXJlIGRvZXNuJ3QgYmxvY2sgLyBvdmVycmlkZSByZWV2YWx1YXRpb246XG4gICAgICAgIGNvbnN0IHsgcmVzb2x2ZWREYXRhIH0gPSBhc3luY0VudHJ5XG4gICAgICAgIGlmICgtLWFzeW5jRW50cnkucmVzb2x2ZUNvdW50ZXIgPT09IDApIHtcbiAgICAgICAgICBhc3luY0VudHJ5LnJlc29sdmVkRGF0YSA9IG51bGxcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzb2x2ZWREYXRhXG4gICAgICB9XG4gICAgICAvLyBBdm9pZCBjYWxsaW5nIHRoZSBkYXRhIGZ1bmN0aW9uIHR3aWNlOlxuICAgICAgaWYgKGFzeW5jRW50cnkucmVzb2x2aW5nKSB7XG4gICAgICAgIGRhdGEgPSBudWxsXG4gICAgICB9IGVsc2UgaWYgKGRhdGEpIHtcbiAgICAgICAgaWYgKGlzRnVuY3Rpb24oZGF0YSkpIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBkYXRhKHRoaXMuY29udGV4dClcbiAgICAgICAgICAvLyBJZiB0aGUgcmVzdWx0IG9mIHRoZSBkYXRhIGZ1bmN0aW9uIGlzIGFub3RoZXIgZnVuY3Rpb24sIHRoZW4gdGhlXG4gICAgICAgICAgLy8gZmlyc3QgZGF0YSBmdW5jdGlvbiBpcyB0aGVyZSB0byB0cmFjayBkZXBlbmRlbmNpZXMgYW5kIHRoZSByZWFsXG4gICAgICAgICAgLy8gZGF0YSBsb2FkaW5nIGhhcHBlbnMgaW4gdGhlIGZ1bmN0aW9uIHRoYXQgaXQgcmV0dXJuZWQuIEtlZXAgdHJhY2tcbiAgICAgICAgICAvLyBpdCBpbiBgZGVwZW5kZW5jeUZ1bmN0aW9uYCBzbyBpdCBjYW4gYmUgY2FsbGVkIG9uIGVhY2ggY2FsbCBvZlxuICAgICAgICAgIC8vIGBoYW5kbGVEYXRhU2NoZW1hKClgIHRvIGtlZXAgdGhlIGRlcGVuZGVuY2llcyBpbnRhY3QsIGFuZCBjYWxsXG4gICAgICAgICAgLy8gdGhlIGZ1bmN0aW9uIHRoYXQgaXQgcmV0dXJuZWQgb25jZSB0byBnZXQgdGhlIGFjdHVhbCBkYXRhOlxuICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKHJlc3VsdCkpIHtcbiAgICAgICAgICAgIGFzeW5jRW50cnkuZGVwZW5kZW5jeUZ1bmN0aW9uID0gZGF0YVxuICAgICAgICAgICAgZGF0YSA9IHJlc3VsdCh0aGlzLmNvbnRleHQpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRhdGEgPSByZXN1bHRcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzUHJvbWlzZShkYXRhKSkge1xuICAgICAgICAgIC8vIElmIHRoZSBkYXRhIGlzIGFzeW5jaHJvbm91cywgaXQgY2FuJ3QgYmUgcmV0dXJuZWQgc3RyYWlnaHQgYXdheS5cbiAgICAgICAgICAvLyBCdXQgd2UgY2FuIGNoZWF0IHVzaW5nIGNvbXB1dGVkIHByb3BlcnRpZXMgYW5kIGByZXNvbHZlZERhdGFgLFxuICAgICAgICAgIC8vIHdoaWNoIGlzIGdvaW5nIHRvIHJlY2VpdmUgdGhlIGxvYWRlZCBkYXRhIGFzeW5jaHJvbm91c2x5LFxuICAgICAgICAgIC8vIHRyaWdnZXJpbmcgYSByZWNvbXB1dGUgb2YgdGhlIGNvbXB1dGVkIHByb3BlcnR5IHRoYXQgY2FsbHNcbiAgICAgICAgICAvLyBgaGFuZGxlRGF0YVNjaGVtYSgpYC5cbiAgICAgICAgICBhc3luY0VudHJ5LnJlc29sdmluZyA9IHRydWVcbiAgICAgICAgICB0aGlzLnJlc29sdmVEYXRhKGRhdGEsIGxvYWRpbmdPcHRpb25zKS50aGVuKGRhdGEgPT4ge1xuICAgICAgICAgICAgYXN5bmNFbnRyeS5yZXNvbHZlQ291bnRlciA9IHJlc29sdmVDb3VudGVyXG4gICAgICAgICAgICBhc3luY0VudHJ5LnJlc29sdmVkRGF0YSA9IGRhdGFcbiAgICAgICAgICAgIGFzeW5jRW50cnkucmVzb2x2aW5nID0gZmFsc2VcbiAgICAgICAgICB9KVxuICAgICAgICAgIC8vIENsZWFyIGRhdGEgdW50aWwgcHJvbWlzZSBpcyByZXNvbHZlZCBhbmQgYHJlc29sdmVkRGF0YWAgaXMgc2V0XG4gICAgICAgICAgZGF0YSA9IG51bGxcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChkYXRhUGF0aCkge1xuICAgICAgICBkYXRhID0gZ2V0VmFsdWVBdERhdGFQYXRoKFxuICAgICAgICAgIHRoaXMucm9vdERhdGEsXG4gICAgICAgICAgbm9ybWFsaXplRGF0YVBhdGgoYCR7dGhpcy5kYXRhUGF0aH0vJHtkYXRhUGF0aH1gKVxuICAgICAgICApXG4gICAgICB9XG4gICAgICByZXR1cm4gZGF0YVxuICAgIH0sXG5cbiAgICBhc3luYyByZXNvbHZlRGF0YShsb2FkLCBsb2FkaW5nT3B0aW9ucyA9IHt9KSB7XG4gICAgICAvLyBVc2UgYSB0aW1lb3V0IHRvIGFsbG93IGFscmVhZHkgcmVzb2x2ZWQgcHJvbWlzZXMgdG8gcmV0dXJuIGRhdGEgd2l0aG91dFxuICAgICAgLy8gc2hvd2luZyBhIGxvYWRpbmcgaW5kaWNhdG9yLlxuICAgICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2V0TG9hZGluZyh0cnVlLCBsb2FkaW5nT3B0aW9ucyksIDApXG4gICAgICBsZXQgZGF0YSA9IG51bGxcbiAgICAgIHRyeSB7XG4gICAgICAgIGRhdGEgPSBhd2FpdCAoaXNGdW5jdGlvbihsb2FkKSA/IGxvYWQoKSA6IGxvYWQpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLmFkZEVycm9yKGVycm9yLm1lc3NhZ2UgfHwgZXJyb3IpXG4gICAgICB9XG4gICAgICBjbGVhclRpbWVvdXQodGltZXIpXG4gICAgICB0aGlzLnNldExvYWRpbmcoZmFsc2UsIGxvYWRpbmdPcHRpb25zKVxuICAgICAgcmV0dXJuIGRhdGFcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBEaXRvQ29udGV4dCBmcm9tICcuLi9EaXRvQ29udGV4dC5qcydcbmltcG9ydCBEYXRhTWl4aW4gZnJvbSAnLi9EYXRhTWl4aW4uanMnXG5pbXBvcnQgeyBnZXRTY2hlbWFBY2Nlc3NvciB9IGZyb20gJy4uL3V0aWxzL2FjY2Vzc29yLmpzJ1xuaW1wb3J0IHsgc2V0VGVtcG9yYXJ5SWQsIGlzUmVmZXJlbmNlIH0gZnJvbSAnLi4vdXRpbHMvZGF0YS5qcydcbmltcG9ydCB7XG4gIGlzT2JqZWN0LFxuICBpc0FycmF5LFxuICBpc1N0cmluZyxcbiAgaXNGdW5jdGlvbixcbiAgbm9ybWFsaXplRGF0YVBhdGgsXG4gIGxhYmVsaXplLFxuICBkZWJvdW5jZUFzeW5jXG59IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCB7XG4gIG1peGluczogW0RhdGFNaXhpbl0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaGFzT3B0aW9uczogZmFsc2VcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBzZWxlY3RlZFZhbHVlOiB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIGNvbnN0IGNvbnZlcnRWYWx1ZSA9IHZhbHVlID0+XG4gICAgICAgICAgdGhpcy5yZWxhdGVcbiAgICAgICAgICAgID8gdGhpcy5oYXNPcHRpb24odmFsdWUpXG4gICAgICAgICAgICAgID8gdGhpcy5nZXRWYWx1ZUZvck9wdGlvbih2YWx1ZSlcbiAgICAgICAgICAgICAgOiBudWxsXG4gICAgICAgICAgICA6IHZhbHVlXG4gICAgICAgIGNvbnN0IHZhbHVlID0gaXNBcnJheSh0aGlzLnZhbHVlKVxuICAgICAgICAgID8gdGhpcy52YWx1ZS5tYXAoY29udmVydFZhbHVlKS5maWx0ZXIodmFsdWUgPT4gdmFsdWUgIT09IG51bGwpXG4gICAgICAgICAgOiBjb252ZXJ0VmFsdWUodGhpcy52YWx1ZSlcbiAgICAgICAgaWYgKFxuICAgICAgICAgIC8vIFdoZW4gcmVsYXRpbmcgYW5kIGFzIHNvb24gYXMgdGhlIG9wdGlvbnMgYXJlIGF2YWlsYWJsZS4uLlxuICAgICAgICAgIHRoaXMucmVsYXRlICYmXG4gICAgICAgICAgdGhpcy5oYXNPcHRpb25zICYmIChcbiAgICAgICAgICAgIC8vIC4uLmlmIHRoZSB2YWx1ZSBpcyBmb3JjZWQgdG8gbnVsbCBiZWNhdXNlIGEgZGlzYXBwZWFyZWQgb3B0aW9uLi4uXG4gICAgICAgICAgICB2YWx1ZSA9PT0gbnVsbCAmJiB0aGlzLnZhbHVlICE9PSBudWxsIHx8XG4gICAgICAgICAgICAvLyAuLi5vciBpZiB0aGUgdmFsdWUgaXMgYSByZWZlcmVuY2UsIHJlcGxhY2UgaXQgd2l0aCBpdHMgb3B0aW9uXG4gICAgICAgICAgICAvLyB2YWx1ZSwgc28gdGhhdCBpdCdsbCBob2xkIGFjdHVhbCBkYXRhLCBub3QganVzdCBhIHJlZmVyZW5jZSBpZC5cbiAgICAgICAgICAgIGlzUmVmZXJlbmNlKHRoaXMudmFsdWUpXG4gICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBUT0RPOiBGaXggc2lkZS1lZmZlY3RzXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHZ1ZS9uby1zaWRlLWVmZmVjdHMtaW4tY29tcHV0ZWQtcHJvcGVydGllc1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZSA9IHZhbHVlXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlXG4gICAgICB9LFxuXG4gICAgICBzZXQodmFsdWUpIHtcbiAgICAgICAgY29uc3QgY29udmVydCA9IHZhbHVlID0+XG4gICAgICAgICAgdGhpcy5yZWxhdGVcbiAgICAgICAgICAgID8gdGhpcy5nZXRPcHRpb25Gb3JWYWx1ZSh2YWx1ZSlcbiAgICAgICAgICAgIDogdmFsdWVcbiAgICAgICAgdGhpcy52YWx1ZSA9IGlzQXJyYXkodmFsdWUpXG4gICAgICAgICAgPyB2YWx1ZS5tYXAoY29udmVydClcbiAgICAgICAgICA6IGNvbnZlcnQodmFsdWUpXG4gICAgICB9XG4gICAgfSxcblxuICAgIHNlbGVjdGVkT3B0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0T3B0aW9uRm9yVmFsdWUodGhpcy5zZWxlY3RlZFZhbHVlKVxuICAgIH0sXG5cbiAgICBvcHRpb25zKCkge1xuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuaGFuZGxlRGF0YVNjaGVtYSh0aGlzLnNjaGVtYS5vcHRpb25zLCAnb3B0aW9ucycsIHtcbiAgICAgICAgcmVzb2x2ZUNvdW50ZXI6IDFcbiAgICAgIH0pID8/IFtdXG4gICAgICBpZiAoIWlzQXJyYXkoZGF0YSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG9wdGlvbnMgZGF0YSwgc2hvdWxkIGJlIGFycmF5OiAke2RhdGF9YClcbiAgICAgIH1cbiAgICAgIC8vIFRPRE86IEZpeCBzaWRlLWVmZmVjdHNcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB2dWUvbm8tc2lkZS1lZmZlY3RzLWluLWNvbXB1dGVkLXByb3BlcnRpZXNcbiAgICAgIHRoaXMuaGFzT3B0aW9ucyA9IGRhdGEubGVuZ3RoID4gMFxuICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc09wdGlvbnMoZGF0YSlcbiAgICB9LFxuXG4gICAgYWN0aXZlT3B0aW9ucygpIHtcbiAgICAgIC8vIFRoaXMgaXMgb3ZlcnJpZGRlbiBpbiBgVHlwZU11bHRpc2VsZWN0YCB0byByZXR1cm4gdGhlIGBzZWFyY2hlZE9wdGlvbnNgXG4gICAgICAvLyB3aGVuIGEgc2VhcmNoIGZpbHRlciB3YXMgYXBwbGllZC5cbiAgICAgIHJldHVybiB0aGlzLm9wdGlvbnNcbiAgICB9LFxuXG4gICAgcmVsYXRlOiBnZXRTY2hlbWFBY2Nlc3NvcigncmVsYXRlJywge1xuICAgICAgLy8gVE9ETzogQ29udmVydCB0byBgcmVsYXRlQnk6ICdpZCdgXG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAvLyBXZSBjYW5ub3QgdXNlIHNjaGVtYSBhY2Nlc3NvciBjYWxsYmFjayBtYWdpYyBmb3IgYHJlbGF0ZWAgYXMgd2UgbmVlZFxuICAgICAgLy8gdGhpcyBvdXRzaWRlIG9mIHRoZSBjb21wb25lbnQncyBsaWZlLXNwYW4sIHNlZSBgcHJvY2Vzc0RhdGEoKWAgYmVsb3cuXG4gICAgICBjYWxsYmFjazogZmFsc2VcbiAgICB9KSxcblxuICAgIGdyb3VwQnk6IGdldFNjaGVtYUFjY2Vzc29yKCdncm91cEJ5Jywge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogbnVsbFxuICAgIH0pLFxuXG4gICAgLy8gVE9ETzogUmVuYW1lIHRvIGBvcHRpb25zLmxhYmVsS2V5YCAvIGBvcHRpb25MYWJlbEtleWA/XG4gICAgb3B0aW9uTGFiZWw6IGdldFNjaGVtYUFjY2Vzc29yKCdvcHRpb25zLmxhYmVsJywge1xuICAgICAgdHlwZTogW1N0cmluZywgRnVuY3Rpb25dLFxuICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIGdldChsYWJlbCkge1xuICAgICAgICAvLyBJZiBubyBgbGFiZWxgIHdhcyBwcm92aWRlZCBidXQgdGhlIG9wdGlvbnMgYXJlIG9iamVjdHMsIGFzc3VtZSBhXG4gICAgICAgIC8vIGRlZmF1bHQgdmFsdWUgb2YgJ2xhYmVsJzpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBsYWJlbCB8fFxuICAgICAgICAgIHRoaXMuZ2V0T3B0aW9uS2V5KCdsYWJlbCcpIHx8XG4gICAgICAgICAgbnVsbFxuICAgICAgICApXG4gICAgICB9XG4gICAgfSksXG5cbiAgICAvLyBUT0RPOiBSZW5hbWUgdG8gYG9wdGlvbnMudmFsdWVLZXlgIC8gYG9wdGlvblZhbHVlS2V5YD9cbiAgICBvcHRpb25WYWx1ZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ29wdGlvbnMudmFsdWUnLCB7XG4gICAgICB0eXBlOiBbU3RyaW5nLCBGdW5jdGlvbl0sXG4gICAgICBkZWZhdWx0OiBudWxsLFxuICAgICAgZ2V0KHZhbHVlKSB7XG4gICAgICAgIC8vIElmIG5vIGBsYWJlbGAgd2FzIHByb3ZpZGVkIGJ1dCB0aGUgb3B0aW9ucyBhcmUgb2JqZWN0cywgYXNzdW1lIGFcbiAgICAgICAgLy8gZGVmYXVsdCB2YWx1ZSBvZiAndmFsdWUnOlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIHZhbHVlIHx8XG4gICAgICAgICAgdGhpcy5yZWxhdGUgJiYgJ2lkJyB8fFxuICAgICAgICAgIHRoaXMuZ2V0T3B0aW9uS2V5KCd2YWx1ZScpIHx8XG4gICAgICAgICAgbnVsbFxuICAgICAgICApXG4gICAgICB9XG4gICAgfSksXG5cbiAgICAvLyBUT0RPOiBDb25zaWRlciBtb3Zpbmcgc2VhcmNoIHRvIGBvcHRpb25zLnNlYXJjaGA/XG4gICAgc2VhcmNoRmlsdGVyOiBnZXRTY2hlbWFBY2Nlc3Nvcignc2VhcmNoJywge1xuICAgICAgdHlwZTogW09iamVjdCwgRnVuY3Rpb25dLFxuICAgICAgZGVmYXVsdDogbnVsbCxcbiAgICAgIGdldChzZWFyY2gpIHtcbiAgICAgICAgaWYgKHNlYXJjaCkge1xuICAgICAgICAgIGNvbnN0IHsgZmlsdGVyLCBkZWJvdW5jZSB9ID0gaXNGdW5jdGlvbihzZWFyY2gpXG4gICAgICAgICAgICA/IHsgZmlsdGVyOiBzZWFyY2ggfVxuICAgICAgICAgICAgOiBzZWFyY2hcbiAgICAgICAgICByZXR1cm4gZGVib3VuY2UgPyBkZWJvdW5jZUFzeW5jKGZpbHRlciwgZGVib3VuY2UpIDogZmlsdGVyXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSxcblxuICAgIGdyb3VwQnlMYWJlbCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdyb3VwQnkgPyAnbGFiZWwnIDogbnVsbFxuICAgIH0sXG5cbiAgICBncm91cEJ5T3B0aW9ucygpIHtcbiAgICAgIHJldHVybiB0aGlzLmdyb3VwQnkgPyAnb3B0aW9ucycgOiBudWxsXG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBnZXRPcHRpb25LZXkoa2V5KSB7XG4gICAgICBjb25zdCBbb3B0aW9uXSA9IHRoaXMuYWN0aXZlT3B0aW9uc1xuICAgICAgcmV0dXJuIGlzT2JqZWN0KG9wdGlvbikgJiYga2V5IGluIG9wdGlvbiA/IGtleSA6IG51bGxcbiAgICB9LFxuXG4gICAgcHJvY2Vzc09wdGlvbnMob3B0aW9ucykge1xuICAgICAgaWYgKG9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgIGlmICh0aGlzLnJlbGF0ZSkge1xuICAgICAgICAgIC8vIElmIGlkcyBhcmUgbWlzc2luZyBhbmQgd2Ugd2FudCB0byByZWxhdGUsIHNldCB0ZW1wb3JhcnkgaWRzLlxuICAgICAgICAgIC8vIE5PVEU6IFdlIG5lZWQgdG8gbW9kaWZ5IHRoZSBhY3R1YWwgZGF0YSwgbWFraW5nIGEgY29weSB3b24ndCB3b3JrXG4gICAgICAgICAgLy8gYXMgaXQgd29uJ3QgcHJvcGFnYXRlLlxuICAgICAgICAgIC8vIE5PVEU6IFRoaXMgb25seSBtYWtlcyBzZW5zZSBpZiB0aGUgZGF0YSBpcyBmcm9tIHRoZSBncmFwaCB0aGF0XG4gICAgICAgICAgLy8gd2UncmUgY3VycmVudGx5IGVkaXRpbmcuXG4gICAgICAgICAgZm9yIChjb25zdCBvcHRpb24gb2Ygb3B0aW9ucykge1xuICAgICAgICAgICAgaWYgKCEoJ2lkJyBpbiBvcHRpb24pKSB7XG4gICAgICAgICAgICAgIHNldFRlbXBvcmFyeUlkKG9wdGlvbiwgJ2lkJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZ3JvdXBCeSkge1xuICAgICAgICAgIGNvbnN0IGdyb3VwZWQgPSB7fVxuICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zLnJlZHVjZShcbiAgICAgICAgICAgIChyZXN1bHRzLCBvcHRpb24pID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgZ3JvdXAgPSBvcHRpb25bdGhpcy5ncm91cEJ5XVxuICAgICAgICAgICAgICBsZXQgZW50cnkgPSBncm91cGVkW2dyb3VwXVxuICAgICAgICAgICAgICBpZiAoIWVudHJ5KSB7XG4gICAgICAgICAgICAgICAgZW50cnkgPSBncm91cGVkW2dyb3VwXSA9IHtcbiAgICAgICAgICAgICAgICAgIFt0aGlzLmdyb3VwQnlMYWJlbF06IGdyb3VwLFxuICAgICAgICAgICAgICAgICAgW3RoaXMuZ3JvdXBCeU9wdGlvbnNdOiBbXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2goZW50cnkpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZW50cnkub3B0aW9ucy5wdXNoKG9wdGlvbilcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHNcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbXVxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG9wdGlvbnNcbiAgICB9LFxuXG4gICAgaGFzT3B0aW9uKG9wdGlvbikge1xuICAgICAgcmV0dXJuICEhdGhpcy5nZXRPcHRpb25Gb3JWYWx1ZSh0aGlzLmdldFZhbHVlRm9yT3B0aW9uKG9wdGlvbikpXG4gICAgfSxcblxuICAgIGdldE9wdGlvbkZvclZhbHVlKHZhbHVlKSB7XG4gICAgICBjb25zdCBmaW5kT3B0aW9uID0gKG9wdGlvbnMsIHZhbHVlLCBncm91cEJ5KSA9PiB7XG4gICAgICAgIC8vIFNlYXJjaCBmb3IgdGhlIG9wdGlvbiBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gdmFsdWUgYW5kIHJldHVybiB0aGVcbiAgICAgICAgLy8gd2hvbGUgb2JqZWN0LlxuICAgICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBvcHRpb25zKSB7XG4gICAgICAgICAgaWYgKGdyb3VwQnkpIHtcbiAgICAgICAgICAgIGNvbnN0IGZvdW5kID0gZmluZE9wdGlvbihvcHRpb24ub3B0aW9ucywgdmFsdWUsIG51bGwpXG4gICAgICAgICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gdGhpcy5nZXRWYWx1ZUZvck9wdGlvbihvcHRpb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9uXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLm9wdGlvblZhbHVlXG4gICAgICAgID8gZmluZE9wdGlvbih0aGlzLmFjdGl2ZU9wdGlvbnMsIHZhbHVlLCB0aGlzLmdyb3VwQnkpXG4gICAgICAgIDogdmFsdWVcbiAgICB9LFxuXG4gICAgZ2V0VmFsdWVGb3JPcHRpb24ob3B0aW9uKSB7XG4gICAgICBjb25zdCB7IG9wdGlvblZhbHVlIH0gPSB0aGlzXG4gICAgICByZXR1cm4gaXNTdHJpbmcob3B0aW9uVmFsdWUpXG4gICAgICAgID8gb3B0aW9uPy5bb3B0aW9uVmFsdWVdXG4gICAgICAgIDogaXNGdW5jdGlvbihvcHRpb25WYWx1ZSlcbiAgICAgICAgICA/IG9wdGlvblZhbHVlLmNhbGwodGhpcywgbmV3IERpdG9Db250ZXh0KHRoaXMsIHsgb3B0aW9uIH0pKVxuICAgICAgICAgIDogb3B0aW9uXG4gICAgfSxcblxuICAgIGdldExhYmVsRm9yT3B0aW9uKG9wdGlvbikge1xuICAgICAgY29uc3QgeyBvcHRpb25MYWJlbCB9ID0gdGhpc1xuICAgICAgcmV0dXJuIGlzU3RyaW5nKG9wdGlvbkxhYmVsKVxuICAgICAgICA/IG9wdGlvbj8uW29wdGlvbkxhYmVsXVxuICAgICAgICA6IGlzRnVuY3Rpb24ob3B0aW9uTGFiZWwpXG4gICAgICAgICAgPyBvcHRpb25MYWJlbC5jYWxsKHRoaXMsIG5ldyBEaXRvQ29udGV4dCh0aGlzLCB7IG9wdGlvbiB9KSlcbiAgICAgICAgICA6IGxhYmVsaXplKGAke29wdGlvbn1gKVxuICAgIH1cbiAgfSxcblxuICBwcm9jZXNzVmFsdWUoc2NoZW1hLCB2YWx1ZSwgZGF0YVBhdGgsIGdyYXBoKSB7XG4gICAgaWYgKHNjaGVtYS5yZWxhdGUpIHtcbiAgICAgIC8vIEZvciBpbnRlcm5hbGx5IHJlbGF0aW5nIGRhdGEgKGBzY2hlbWEub3B0aW9ucy5kYXRhUGF0aGApLCB3ZSBuZWVkIHRvXG4gICAgICAvLyBwcm9jZXNzIGJvdGggdGhlIG9wdGlvbnMgKGZvciAnI3JlZicpIGFuZCB0aGUgdmFsdWUgKCcjaWQnKS5cbiAgICAgIC8vIFNlZSBgRGF0YU1peGluLmhhbmRsZURhdGFTY2hlbWEoKWA6XG4gICAgICBjb25zdCBwYXRoID0gc2NoZW1hLm9wdGlvbnM/LmRhdGFQYXRoXG4gICAgICBjb25zdCByZWxhdGVkRGF0YVBhdGggPSBwYXRoXG4gICAgICAgID8gbm9ybWFsaXplRGF0YVBhdGgoYCR7ZGF0YVBhdGh9LyR7cGF0aH1gKVxuICAgICAgICA6IG51bGxcbiAgICAgIGdyYXBoLmFkZFJlbGF0aW9uKGRhdGFQYXRoLCByZWxhdGVkRGF0YVBhdGgsIHNjaGVtYSlcbiAgICAgIGlmIChyZWxhdGVkRGF0YVBhdGgpIHtcbiAgICAgICAgZ3JhcGguc2V0U291cmNlUmVsYXRlZChyZWxhdGVkRGF0YVBhdGgpXG4gICAgICB9XG4gICAgICAvLyBDb252ZXJ0IHJlbGF0aW5nIG9iamVjdHMgdG8gYSBzaGFsbG93IGNvcHkgd2l0aCBvbmx5IHRoZSBpZCBsZWZ0LlxuICAgICAgLy8gVE9ETzogQ29udmVydCB0byB1c2luZyBgcmVsYXRlQnlgOlxuICAgICAgY29uc3QgcHJvY2Vzc1JlbGF0ZSA9IHZhbHVlID0+ICh2YWx1ZSA/IHsgaWQ6IHZhbHVlLmlkIH0gOiB2YWx1ZSlcbiAgICAgIC8vIFNlbGVjdGVkIG9wdGlvbnMgY2FuIGJlIGJvdGggb2JqZWN0cyAmIGFycmF5cywgZS5nLiAnY2hlY2tib3hlcyc6XG4gICAgICB2YWx1ZSA9IGlzQXJyYXkodmFsdWUpXG4gICAgICAgID8gdmFsdWUubWFwKHByb2Nlc3NSZWxhdGUpXG4gICAgICAgIDogcHJvY2Vzc1JlbGF0ZSh2YWx1ZSlcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cbn1cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG51bC5kaXRvLWNoZWNrYm94ZXMoXG4gIDppZD1cImRhdGFQYXRoXCJcbiAgOmNsYXNzPVwiYGRpdG8tbGF5b3V0LSR7c2NoZW1hLmxheW91dCB8fCAndmVydGljYWwnfWBcIlxuKVxuICBsaShcbiAgICB2LWZvcj1cIm9wdGlvbiBpbiBvcHRpb25zXCJcbiAgKVxuICAgIGxhYmVsXG4gICAgICBpbnB1dC5kaXRvLWNoZWNrYm94KFxuICAgICAgICByZWY9XCJlbGVtZW50XCJcbiAgICAgICAgdi1tb2RlbD1cInNlbGVjdGVkT3B0aW9uc1wiXG4gICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgIDp2YWx1ZT1cImdldFZhbHVlRm9yT3B0aW9uKG9wdGlvbilcIlxuICAgICAgICB2LWJpbmQ9XCJhdHRyaWJ1dGVzXCJcbiAgICAgIClcbiAgICAgIHwge3sgZ2V0TGFiZWxGb3JPcHRpb24ob3B0aW9uKSB9fVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcbmltcG9ydCBPcHRpb25zTWl4aW4gZnJvbSAnLi4vbWl4aW5zL09wdGlvbnNNaXhpbi5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKCdjaGVja2JveGVzJywge1xuICBtaXhpbnM6IFtPcHRpb25zTWl4aW5dLFxuXG4gIG5hdGl2ZUZpZWxkOiB0cnVlLFxuICBkZWZhdWx0VmFsdWU6IFtdLFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgc2VsZWN0ZWRPcHRpb25zOiB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5zZWxlY3RlZFZhbHVlIHx8IFtdKS5maWx0ZXIodmFsdWUgPT4gdmFsdWUpXG4gICAgICB9LFxuXG4gICAgICBzZXQob3B0aW9uKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZSA9IG9wdGlvbiB8fCBbXVxuICAgICAgfVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLWNoZWNrYm94ZXMge1xuICBsYWJlbCB7XG4gICAgQGV4dGVuZCAlaW5wdXQtYm9yZGVybGVzcztcbiAgfVxuXG4gIC5kaXRvLWNoZWNrYm94IHtcbiAgICBtYXJnaW4tcmlnaHQ6ICRmb3JtLXNwYWNpbmc7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tY29kZShcbiAgOmlkPVwiZGF0YVBhdGhcIlxuICByZWY9XCJjb2RlXCJcbiAgOnN0eWxlPVwic3R5bGVcIlxuKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcbmltcG9ydCBEb21NaXhpbiBmcm9tICcuLi9taXhpbnMvRG9tTWl4aW4uanMnXG5pbXBvcnQgQ29kZUZsYXNrIGZyb20gJ2NvZGVmbGFzaydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKCdjb2RlJywge1xuICBtaXhpbnM6IFtEb21NaXhpbl0sXG4gIGFsaWduQm90dG9tOiBmYWxzZSxcblxuICBjb21wdXRlZDoge1xuICAgIGxpbmVzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hLmxpbmVzIHx8IDNcbiAgICB9LFxuXG4gICAgc3R5bGUoKSB7XG4gICAgICByZXR1cm4gYGhlaWdodDogY2FsYygke3RoaXMubGluZXN9ZW0gKiB2YXIoLS1saW5lLWhlaWdodCkpYFxuICAgIH1cbiAgfSxcblxuICBtb3VudGVkKCkge1xuICAgIGNvbnN0IGZsYXNrID0gbmV3IENvZGVGbGFzayh0aGlzLiRyZWZzLmNvZGUsIHtcbiAgICAgIGxhbmd1YWdlOiB0aGlzLnNjaGVtYS5sYW5ndWFnZSB8fCAnamF2YXNjcmlwdCcsXG4gICAgICB0YWJTaXplOiB0aGlzLnNjaGVtYS5pbmRlbnRTaXplIHx8IDIsXG4gICAgICBsaW5lTnVtYmVyczogZmFsc2VcbiAgICB9KVxuXG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZVxuICAgIGxldCBpZ25vcmVXYXRjaCA9IGZhbHNlXG4gICAgbGV0IGlnbm9yZVVwZGF0ZSA9IGZhbHNlXG5cbiAgICBjb25zdCBvbkNoYW5nZSA9ICgpID0+IHtcbiAgICAgIGlmICghdGhpcy5mb2N1c2VkICYmIGNoYW5nZWQpIHtcbiAgICAgICAgY2hhbmdlZCA9IGZhbHNlXG4gICAgICAgIHRoaXMub25DaGFuZ2UoKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG9uRm9jdXMgPSAoKSA9PiB0aGlzLm9uRm9jdXMoKVxuXG4gICAgY29uc3Qgb25CbHVyID0gKCkgPT4ge1xuICAgICAgdGhpcy5vbkJsdXIoKVxuICAgICAgb25DaGFuZ2UoKVxuICAgIH1cblxuICAgIHRoaXMuZG9tT24odGhpcy4kcmVmcy5jb2RlLnF1ZXJ5U2VsZWN0b3IoJ3RleHRhcmVhJyksIHtcbiAgICAgIGZvY3VzOiBvbkZvY3VzLFxuICAgICAgYmx1cjogb25CbHVyXG4gICAgfSlcblxuICAgIGNvbnN0IHNldENvZGUgPSBjb2RlID0+IHtcbiAgICAgIGlmIChjb2RlICE9PSBmbGFzay5jb2RlKSB7XG4gICAgICAgIGlnbm9yZVVwZGF0ZSA9IHRydWVcbiAgICAgICAgZmxhc2sudXBkYXRlQ29kZShjb2RlKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHNldFZhbHVlID0gdmFsdWUgPT4ge1xuICAgICAgaWYgKHZhbHVlICE9PSB0aGlzLnZhbHVlKSB7XG4gICAgICAgIGlnbm9yZVdhdGNoID0gdHJ1ZVxuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWVcbiAgICAgICAgY2hhbmdlZCA9IHRydWVcbiAgICAgICAgb25DaGFuZ2UoKVxuICAgICAgfVxuICAgIH1cblxuICAgIGZsYXNrLm9uVXBkYXRlKHZhbHVlID0+IHtcbiAgICAgIGlmIChpZ25vcmVVcGRhdGUpIHtcbiAgICAgICAgaWdub3JlVXBkYXRlID0gZmFsc2VcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldFZhbHVlKHZhbHVlKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICB0aGlzLiR3YXRjaCgndmFsdWUnLCB2YWx1ZSA9PiB7XG4gICAgICBpZiAoaWdub3JlV2F0Y2gpIHtcbiAgICAgICAgaWdub3JlV2F0Y2ggPSBmYWxzZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0Q29kZSh2YWx1ZSB8fCAnJylcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgc2V0Q29kZSh0aGlzLnZhbHVlIHx8ICcnKVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBmb2N1c0VsZW1lbnQoKSB7XG4gICAgICB0aGlzLiRlbC5xdWVyeVNlbGVjdG9yKCd0ZXh0YXJlYScpPy5mb2N1cygpXG4gICAgfVxuICB9XG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tY29kZSB7XG4gIEBleHRlbmQgJWlucHV0O1xuXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgLy8gRm9yIHByb3BlciBzaXppbmcgb2YgY29udGVudCBhbG9uZyB3aXRoIDpzdHlsZT1cInN0eWxlXCIgc2V0dGluZyBhYm92ZSxcbiAgLy8gZm9yIHByb3BlciBsaW5lLWhlaWdodCBjYWxjdWxhdGlvbi5cbiAgcGFkZGluZzogJGlucHV0LXBhZGRpbmc7XG5cbiAgLmNvZGVmbGFzayB7XG4gICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAvLyBJZ25vcmUgdGhlIHBhcmVudCBwYWRkaW5nIGRlZmluZWQgYWJvdmUgd2hpY2ggaXMgb25seSBuZWVkZWQgdG8gc2V0XG4gICAgLy8gdGhlIGRlc2lyZWQgaGVpZ2h0IHdpdGggOnN0eWxlPVwic3R5bGVcIi5cbiAgICB0b3A6IDA7XG4gICAgbGVmdDogMDtcbiAgfVxuXG4gIC5jb2RlZmxhc2tfX3RleHRhcmVhLFxuICAuY29kZWZsYXNrX19wcmUge1xuICAgIC8vIFVzZSBzYW1lIHBhZGRpbmcgYXMgLmRpdG8tY29kZVxuICAgIHBhZGRpbmc6ICRpbnB1dC1wYWRkaW5nO1xuICB9XG5cbiAgLmNvZGVmbGFza19fdGV4dGFyZWEsXG4gIC5jb2RlZmxhc2tfX2NvZGUsXG4gIC5jb2RlZmxhc2tfX2xpbmVzIHtcbiAgICBmb250LWZhbWlseTogJGZvbnQtZmFtaWx5LW1vbm87XG4gICAgZm9udC1zaXplOiB2YXIoLS1mb250LXNpemUpO1xuICAgIGxpbmUtaGVpZ2h0OiB2YXIoLS1saW5lLWhlaWdodCk7XG4gIH1cblxuICAuY29kZWZsYXNrX19saW5lcyB7XG4gICAgcGFkZGluZzogJGlucHV0LXBhZGRpbmc7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuVHJpZ2dlci5kaXRvLWNvbG9yKFxuICB2LW1vZGVsOnNob3c9XCJzaG93UG9wdXBcIlxuICB0cmlnZ2VyPVwiY2xpY2tcIlxuKVxuICB0ZW1wbGF0ZSgjdHJpZ2dlcilcbiAgICAuZGl0by1pbnB1dCg6Y2xhc3M9XCJ7ICdkaXRvLWZvY3VzJzogc2hvd1BvcHVwIH1cIilcbiAgICAgIGlucHV0KFxuICAgICAgICA6aWQ9XCJkYXRhUGF0aFwiXG4gICAgICAgIHJlZj1cImVsZW1lbnRcIlxuICAgICAgICB2LW1vZGVsPVwiaGV4VmFsdWVcIlxuICAgICAgICB0eXBlPVwiaW5wdXRcIlxuICAgICAgICBzaXplPVwiOFwiXG4gICAgICAgIHYtYmluZD1cImF0dHJpYnV0ZXNcIlxuICAgICAgKVxuICAgICAgLmRpdG8tY29sb3ItcHJldmlldy5kaXRvLWluaGVyaXQtZm9jdXMoXG4gICAgICAgIHYtaWY9XCJ2YWx1ZVwiXG4gICAgICApXG4gICAgICAgIGRpdig6c3R5bGU9XCJ7IGJhY2tncm91bmQ6IGAjJHtoZXhWYWx1ZSB8fCAnMDAwMDAwMDAnfWAgfVwiKVxuICAgICAgYnV0dG9uLmRpdG8tYnV0dG9uLWNsZWFyLmRpdG8tYnV0dG9uLW92ZXJsYXkoXG4gICAgICAgIHYtaWY9XCJzaG93Q2xlYXJCdXR0b25cIlxuICAgICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gICAgICAgIEBjbGljay5zdG9wPVwiY2xlYXJcIlxuICAgICAgKVxuICB0ZW1wbGF0ZSgjcG9wdXApXG4gICAgU2tldGNoUGlja2VyLmRpdG8tY29sb3ItcGlja2VyKFxuICAgICAgdi1tb2RlbD1cImNvbG9yVmFsdWVcIlxuICAgICAgOmRpc2FibGVBbHBoYT1cIiFhbHBoYVwiXG4gICAgICA6ZGlzYWJsZUZpZWxkcz1cIiFpbnB1dHNcIlxuICAgICAgOnByZXNldENvbG9ycz1cInByZXNldHNcIlxuICAgIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgdGlueWNvbG9yIGZyb20gJ3Rpbnljb2xvcjInXG5pbXBvcnQgeyBTa2V0Y2ggYXMgU2tldGNoUGlja2VyIH0gZnJvbSAnQGxrNzcvdnVlMy1jb2xvcidcbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcbmltcG9ydCB7IFRyaWdnZXIgfSBmcm9tICdAZGl0b2pzL3VpL3NyYydcbmltcG9ydCB7IGdldFNjaGVtYUFjY2Vzc29yIH0gZnJvbSAnLi4vdXRpbHMvYWNjZXNzb3IuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvVHlwZUNvbXBvbmVudC5yZWdpc3RlcignY29sb3InLCB7XG4gIGNvbXBvbmVudHM6IHsgVHJpZ2dlciwgU2tldGNoUGlja2VyIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2hvd1BvcHVwOiBmYWxzZSxcbiAgICAgIGNvbnZlcnRlZEhleFZhbHVlOiBudWxsXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgY29sb3JWYWx1ZToge1xuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZSB8fCB7fVxuICAgICAgfSxcblxuICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGZvcm1hdCA9IHRoaXMuY29sb3JGb3JtYXRcbiAgICAgICAgY29uc3Qga2V5ID0gKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC8vIE5PVEU6IHZ1ZTMtY29sb3IgY2FsbHMgaXQgJ2hleCcsIHdoaWxlIHRpbnljb2xvciBjYWxscyBpdCAnaGV4NidcbiAgICAgICAgICAgIGhleDogdmFsdWU/LmEgPCAxID8gJ2hleDgnIDogJ2hleCcsXG4gICAgICAgICAgICByZ2I6ICdyZ2JhJ1xuICAgICAgICAgIH1bZm9ybWF0XSB8fFxuICAgICAgICAgIGZvcm1hdFxuICAgICAgICApXG4gICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWVba2V5XVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudmFsdWUgPSB0aW55Y29sb3IodmFsdWUpLnRvU3RyaW5nKGZvcm1hdClcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uQ2hhbmdlKClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgaGV4VmFsdWU6IHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgaWYgKHRoaXMudmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgIC8vIFRPRE86IEZpeCBzaWRlLWVmZmVjdHNcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdnVlL25vLXNpZGUtZWZmZWN0cy1pbi1jb21wdXRlZC1wcm9wZXJ0aWVzXG4gICAgICAgICAgdGhpcy5jb252ZXJ0ZWRIZXhWYWx1ZSA9IG51bGxcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5mb2N1c2VkKSB7XG4gICAgICAgICAgY29uc3QgY29sb3IgPSB0aW55Y29sb3IodGhpcy52YWx1ZSlcbiAgICAgICAgICBpZiAoY29sb3IuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICAvLyBUT0RPOiBGaXggc2lkZS1lZmZlY3RzXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgICAgIHRoaXMuY29udmVydGVkSGV4VmFsdWUgPSBjb2xvclxuICAgICAgICAgICAgICAudG9TdHJpbmcoY29sb3IuZ2V0QWxwaGEoKSA8IDEgPyAnaGV4OCcgOiAnaGV4NicpXG4gICAgICAgICAgICAgIC5zbGljZSgxKVxuICAgICAgICAgICAgICAudG9VcHBlckNhc2UoKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jb252ZXJ0ZWRIZXhWYWx1ZVxuICAgICAgfSxcblxuICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgIHRoaXMuY29udmVydGVkSGV4VmFsdWUgPSB2YWx1ZVxuICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBUT0RPOiBgZm9ybWF0YCBjbGFzaGVzIHdpdGggVHlwZU1peGluLmZvcm1hdCgpYCwgd2hpY2ggc2hhbGwgYmUgcmVuYW1lZFxuICAgIC8vIHNvb24gdG8gYGZvcm1hdFZhbHVlKClgLiBSZW5hbWUgYGNvbG9yRm9ybWF0YCBiYWNrIHRvIGBmb3JtYXRgIGFmdGVyLlxuICAgIGNvbG9yRm9ybWF0OiBnZXRTY2hlbWFBY2Nlc3NvcignZm9ybWF0Jywge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgZGVmYXVsdDogJ2hleCdcbiAgICB9KSxcblxuICAgIC8vIFRPRE86IFJlbmFtZSB0byBgc2hvd0FscGhhYD9cbiAgICBhbHBoYTogZ2V0U2NoZW1hQWNjZXNzb3IoJ2FscGhhJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSksXG5cbiAgICAvLyBUT0RPOiBSZW5hbWUgdG8gYHNob3dJbnB1dHNgP1xuICAgIGlucHV0czogZ2V0U2NoZW1hQWNjZXNzb3IoJ2lucHV0cycsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfSksXG5cbiAgICBwcmVzZXRzOiBnZXRTY2hlbWFBY2Nlc3NvcigncHJlc2V0cycsIHtcbiAgICAgIHR5cGU6IEFycmF5LFxuICAgICAgZGVmYXVsdDogW1xuICAgICAgICAnI2ZmZmZmZicsXG4gICAgICAgICcjYzNjM2MzJyxcbiAgICAgICAgJyM3ZjdmN2YnLFxuICAgICAgICAnIzAwMDAwMCcsXG4gICAgICAgICcjODgwMDE1JyxcbiAgICAgICAgJyNlZDFjMjQnLFxuICAgICAgICAnI2ZmN2YyNycsXG4gICAgICAgICcjZmZmMjAwJyxcblxuICAgICAgICAnIzIyYjE0YycsXG4gICAgICAgICcjMDBhMmU4JyxcbiAgICAgICAgJyMzZjQ4Y2MnLFxuICAgICAgICAnI2EzNDlhNCcsXG4gICAgICAgICcjYjk3YTU3JyxcbiAgICAgICAgJyNmZmFlYzknLFxuICAgICAgICAnI2ZmYzkwZScsXG4gICAgICAgICcjMDAwMDAwMDAnXG4gICAgICBdXG4gICAgfSlcbiAgfSxcblxuICB3YXRjaDoge1xuICAgIGZvY3VzZWQoZm9jdXNlZCkge1xuICAgICAgaWYgKCFmb2N1c2VkICYmIHRoaXMuY29udmVydGVkSGV4VmFsdWUpIHtcbiAgICAgICAgY29uc3QgY29sb3IgPSB0aW55Y29sb3IoYCMke3RoaXMuY29udmVydGVkSGV4VmFsdWV9YClcbiAgICAgICAgaWYgKGNvbG9yPy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gY29sb3IudG9TdHJpbmcodGhpcy5jb2xvckZvcm1hdClcbiAgICAgICAgICAvLyBUT0RPOiBFbWl0ICdpbnB1dCcgaGVyZSBpbnN0ZWFkLCBhbmQgJ2NoYW5nZScgaW4gYmx1ciwgbGlrZSBvdGhlcnMuXG4gICAgICAgICAgdGhpcy5vbkNoYW5nZSgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4kY29sb3Itc3dhdGNoLXdpZHRoOiAkcGF0dGVybi10cmFuc3BhcmVuY3ktc2l6ZTtcbiRjb2xvci1zd2F0Y2gtcmFkaXVzOiAkYm9yZGVyLXJhZGl1cyAtICRib3JkZXItd2lkdGg7XG5cbi5kaXRvLWNvbG9yIHtcbiAgLmRpdG8taW5wdXQge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcblxuICAgIGlucHV0IHtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zO1xuICAgICAgcGFkZGluZy1yaWdodDogJGNvbG9yLXN3YXRjaC13aWR0aDtcbiAgICB9XG4gIH1cblxuICAuZGl0by1idXR0b24tY2xlYXIge1xuICAgIG1hcmdpbi1yaWdodDogJGNvbG9yLXN3YXRjaC13aWR0aDtcbiAgfVxuXG4gIC5kaXRvLWNvbG9yLXBpY2tlciB7XG4gICAgbWFyZ2luOiAkcG9wdXAtbWFyZ2luO1xuICAgIGJvcmRlcjogJGJvcmRlci1zdHlsZTtcbiAgICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcbiAgICBiYWNrZ3JvdW5kOiAkY29sb3Itd2hpdGU7XG4gICAgYm94LXNoYWRvdzogJHNoYWRvdy13aW5kb3c7XG4gIH1cblxuICAuZGl0by1jb2xvci1wcmV2aWV3IHtcbiAgICBiYWNrZ3JvdW5kOiAkcGF0dGVybi10cmFuc3BhcmVuY3k7XG4gICAgYm9yZGVyLWxlZnQ6ICRib3JkZXItc3R5bGU7XG5cbiAgICAmLFxuICAgIGRpdiB7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICB3aWR0aDogJGNvbG9yLXN3YXRjaC13aWR0aDtcbiAgICAgIHRvcDogMDtcbiAgICAgIHJpZ2h0OiAwO1xuICAgICAgYm90dG9tOiAwO1xuICAgICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6ICRjb2xvci1zd2F0Y2gtcmFkaXVzO1xuICAgICAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6ICRjb2xvci1zd2F0Y2gtcmFkaXVzO1xuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG5jb21wb25lbnQoXG4gIDppcz1cInNjaGVtYS5jb21wb25lbnRcIlxuICB2LWJpbmQ9XCIkcHJvcHNcIlxuKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbi8vIFRoaXMgaXMgdGhlIGdlbmVyYWwgcHVycG9zZSAnY29tcG9uZW50JyB0eXBlLCB3aGljaCBjYW4gcmVzb2x2ZSB0byBhbnkgY3VzdG9tXG4vLyBjb21wb25lbnQgdGhyb3VnaCBgc2NoZW1hLmNvbXBvbmVudGAsIHNlZSBgcmVzb2x2ZVNjaGVtYUNvbXBvbmVudCgpYC4gVGhpc1xuLy8gY2FuIGJlIHVzZWQgdG8gbmVzdCBhcmJpdHJhcnkgdnVlIGNvbXBvbmVudHMgaW4gc2NoZW1hOlxuLy8ge1xuLy8gICB0eXBlOiAnY29tcG9uZW50Jyxcbi8vICAgY29tcG9uZW50OiBpbXBvcnQoJy4vY29tcG9uZW50Jylcbi8vIH1cblxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IHsgcmVzb2x2ZVNjaGVtYUNvbXBvbmVudCB9IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKCdjb21wb25lbnQnLCB7XG4gIC8vIE92ZXJyaWRlIHRoZSBzdGFuZGFyZCBgZGVmYXVsdFZhbHVlOiBudWxsYCB0byBub3Qgc2V0IGFueSBkYXRhIGZvciBjdXN0b21cbiAgLy8gY29tcG9uZW50cywgdW5sZXNzIHRoZXkgcHJvdmlkZSBhIGRlZmF1bHQgdmFsdWUuXG4gIGRlZmF1bHRWYWx1ZTogKCkgPT4gdW5kZWZpbmVkLCAvLyBDYWxsYmFjayB0byBvdmVycmlkZSBgZGVmYXVsdFZhbHVlOiBudWxsYFxuICBhbGlnbkJvdHRvbTogZmFsc2UsXG4gIGlnbm9yZU1pc3NpbmdWYWx1ZTogc2NoZW1hID0+ICEoJ2RlZmF1bHQnIGluIHNjaGVtYSksXG5cbiAgYXN5bmMgcHJvY2Vzc1NjaGVtYShhcGksIHNjaGVtYSkge1xuICAgIGF3YWl0IHJlc29sdmVTY2hlbWFDb21wb25lbnQoc2NoZW1hKVxuICB9XG59KVxuPC9zY3JpcHQ+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLy8tIFRPRE86IEZpbmQgYSBiZXR0ZXIgd2F5IHRvIHRyaWdnZXIgZXZhbHVhdGlvbiBvZiBgdmFsdWVgIHRoYXQgZG9zZSBub3Rcbi8vLSBpbnZvbHZlIGFjdHVhbGx5IHJlbmRlcmluZyBpdCB3aGVuIHRoZSBjb21wb25lbnQgaXMgbm90IHZpc2libGUuXG5pbnB1dC5kaXRvLXRleHQuZGl0by1pbnB1dChcbiAgOmlkPVwiZGF0YVBhdGhcIlxuICByZWY9XCJlbGVtZW50XCJcbiAgOm5hbWU9XCJuYW1lXCJcbiAgdHlwZT1cInRleHRcIlxuICA6dmFsdWU9XCJ2YWx1ZVwiXG4gIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgOnJlYWRvbmx5PVwidHJ1ZVwiXG4pXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IFR5cGVNaXhpbiBmcm9tICcuLi9taXhpbnMvVHlwZU1peGluLmpzJ1xuaW1wb3J0IERhdGFNaXhpbiBmcm9tICcuLi9taXhpbnMvRGF0YU1peGluLmpzJ1xuXG5leHBvcnQgZGVmYXVsdCBEaXRvVHlwZUNvbXBvbmVudC5yZWdpc3RlcihcbiAgWydjb21wdXRlZCcsICdkYXRhJywgJ2hpZGRlbiddLFxuICAvLyBAdnVlL2NvbXBvbmVudFxuICB7XG4gICAgbWl4aW5zOiBbRGF0YU1peGluXSxcblxuICAgIGRlZmF1bHRWYWx1ZTogKCkgPT4gdW5kZWZpbmVkLCAvLyBDYWxsYmFjayB0byBvdmVycmlkZSBgZGVmYXVsdFZhbHVlOiBudWxsYFxuICAgIGRlZmF1bHRWaXNpYmxlOiBmYWxzZSxcblxuICAgIGNvbXB1dGVkOiB7XG4gICAgICB2YWx1ZToge1xuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgY29uc3QgeyBzY2hlbWEgfSA9IHRoaXNcbiAgICAgICAgICBpZiAoc2NoZW1hLmRhdGEgfHwgc2NoZW1hLmRhdGFQYXRoKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuaGFuZGxlRGF0YVNjaGVtYShzY2hlbWEsICdzY2hlbWEnLCB7XG4gICAgICAgICAgICAgIC8vIE1vZGlmeWluZyBgdGhpcy5kYXRhYCBiZWxvdyB0cmlnZ2VycyBhbm90aGVyIGNhbGwgb2YgdGhlXG4gICAgICAgICAgICAgIC8vIGB2YWx1ZWAgZ2V0dGVyLCBzbyB1c2UgYSB2YWx1ZSBvZiAyIGZvciBgcmVzb2x2ZUNvdW50ZXJgIHRvXG4gICAgICAgICAgICAgIC8vIHJldHVybiB0aGUgcmVzb2x2ZWQgZGF0YSB0d2ljZS5cbiAgICAgICAgICAgICAgcmVzb2x2ZUNvdW50ZXI6IDJcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAvLyBUT0RPOiBGaXggc2lkZS1lZmZlY3RzXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgICAgIHRoaXMuZGF0YVt0aGlzLm5hbWVdID0gdmFsdWVcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFR5cGVNaXhpbi5jb21wdXRlZC52YWx1ZS5nZXQuY2FsbCh0aGlzKVxuICAgICAgICB9LFxuXG4gICAgICAgIHNldCh2YWx1ZSkge1xuICAgICAgICAgIFR5cGVNaXhpbi5jb21wdXRlZC52YWx1ZS5zZXQuY2FsbCh0aGlzLCB2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuKVxuPC9zY3JpcHQ+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tZGF0ZVxuICBjb21wb25lbnQoXG4gICAgOmlzPVwiZ2V0Q29tcG9uZW50KHR5cGUpXCJcbiAgICA6aWQ9XCJkYXRhUGF0aFwiXG4gICAgcmVmPVwiZWxlbWVudFwiXG4gICAgdi1tb2RlbD1cImRhdGVWYWx1ZVwiXG4gICAgOmxvY2FsZT1cImxvY2FsZVwiXG4gICAgOmRhdGVGb3JtYXQ9XCJ7IC4uLmFwaS5mb3JtYXRzLmRhdGUsIC4uLmRhdGVGb3JtYXQgfVwiXG4gICAgdi1iaW5kPVwiYXR0cmlidXRlc1wiXG4gIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b1R5cGVDb21wb25lbnQgZnJvbSAnLi4vRGl0b1R5cGVDb21wb25lbnQuanMnXG5pbXBvcnQgeyBnZXRTY2hlbWFBY2Nlc3NvciB9IGZyb20gJy4uL3V0aWxzL2FjY2Vzc29yLmpzJ1xuaW1wb3J0IHsgRGF0ZVBpY2tlciwgVGltZVBpY2tlciwgRGF0ZVRpbWVQaWNrZXIgfSBmcm9tICdAZGl0b2pzL3VpL3NyYydcbmltcG9ydCB7IGlzRGF0ZSB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKFxuICBbJ2RhdGUnLCAnZGF0ZXRpbWUnLCAndGltZSddLFxuICAvLyBAdnVlL2NvbXBvbmVudFxuICB7XG4gICAgY29tcG9uZW50czogeyBEYXRlUGlja2VyLCBUaW1lUGlja2VyLCBEYXRlVGltZVBpY2tlciB9LFxuICAgIC8vIFRPRE86IFRoaXMgaXMgb25seSBoZXJlIHNvIHdlIGdldCBwbGFjZWhvbGRlciBhZGRlZC4gQ29tZSB1cCB3aXRoIGFcbiAgICAvLyBiZXR0ZXIgd2F5IHRvIHN1cHBvcnQgYXR0cmlidXRlcyBwZXIgY29tcG9uZW50IChhIGxpc3Qgb2YgYWN0dWFsbHlcbiAgICAvLyBzdXBwb3J0ZWQgYXR0cmlidXRlcylcbiAgICBuYXRpdmVGaWVsZDogdHJ1ZSxcbiAgICB0ZXh0RmllbGQ6IHRydWUsXG5cbiAgICBjb21wdXRlZDoge1xuICAgICAgZGF0ZVZhbHVlOiB7XG4gICAgICAgIGdldCgpIHtcbiAgICAgICAgICBjb25zdCB7IHZhbHVlIH0gPSB0aGlzXG4gICAgICAgICAgcmV0dXJuIHZhbHVlID8gbmV3IERhdGUodmFsdWUpIDogdmFsdWVcbiAgICAgICAgfSxcblxuICAgICAgICBzZXQodmFsdWUpIHtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWVcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgZGF0ZUZvcm1hdDogZ2V0U2NoZW1hQWNjZXNzb3IoJ2RhdGVGb3JtYXQnLCB7XG4gICAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgICAgZGVmYXVsdDogbnVsbFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgbWV0aG9kczoge1xuICAgICAgZ2V0Q29tcG9uZW50KHR5cGUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkYXRlOiAnZGF0ZS1waWNrZXInLFxuICAgICAgICAgIHRpbWU6ICd0aW1lLXBpY2tlcicsXG4gICAgICAgICAgZGF0ZXRpbWU6ICdkYXRlLXRpbWUtcGlja2VyJ1xuICAgICAgICB9W3R5cGVdXG4gICAgICB9XG4gICAgfSxcblxuICAgIHByb2Nlc3NWYWx1ZShzY2hlbWEsIHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNEYXRlKHZhbHVlKSA/IHZhbHVlLnRvSVNPU3RyaW5nKCkgOiB2YWx1ZVxuICAgIH1cbiAgfVxuKVxuPC9zY3JpcHQ+XG4iLCJpbXBvcnQgRGl0b0NvbXBvbmVudCBmcm9tICcuLi9EaXRvQ29tcG9uZW50LmpzJ1xuaW1wb3J0IFJlc291cmNlTWl4aW4gZnJvbSAnLi9SZXNvdXJjZU1peGluLmpzJ1xuaW1wb3J0IFNjaGVtYVBhcmVudE1peGluIGZyb20gJy4uL21peGlucy9TY2hlbWFQYXJlbnRNaXhpbi5qcydcbmltcG9ydCB7IGdldFNjaGVtYUFjY2Vzc29yLCBnZXRTdG9yZUFjY2Vzc29yIH0gZnJvbSAnLi4vdXRpbHMvYWNjZXNzb3IuanMnXG5pbXBvcnQgeyBnZXRNZW1iZXJSZXNvdXJjZSB9IGZyb20gJy4uL3V0aWxzL3Jlc291cmNlLmpzJ1xuaW1wb3J0IHtcbiAgcHJvY2Vzc1JvdXRlU2NoZW1hLFxuICBwcm9jZXNzRm9ybXMsXG4gIGdldE5hbWVkU2NoZW1hcyxcbiAgZ2V0QnV0dG9uU2NoZW1hcyxcbiAgaGFzRm9ybVNjaGVtYSxcbiAgZ2V0Rm9ybVNjaGVtYXMsXG4gIGdldFZpZXdTY2hlbWEsXG4gIGlzQ29tcGFjdCxcbiAgaXNJbmxpbmVkLFxuICBpc09iamVjdFNvdXJjZSxcbiAgaXNMaXN0U291cmNlXG59IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcbmltcG9ydCB7XG4gIGlzT2JqZWN0LFxuICBpc1N0cmluZyxcbiAgaXNBcnJheSxcbiAgaXNOdW1iZXIsXG4gIGVxdWFscyxcbiAgcGFyc2VEYXRhUGF0aCxcbiAgbm9ybWFsaXplRGF0YVBhdGhcbn0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IHtcbiAgbWl4aW5zOiBbUmVzb3VyY2VNaXhpbiwgU2NoZW1hUGFyZW50TWl4aW5dLFxuXG4gIGRlZmF1bHRWYWx1ZShzY2hlbWEpIHtcbiAgICByZXR1cm4gaXNMaXN0U291cmNlKHNjaGVtYSkgPyBbXSA6IG51bGxcbiAgfSxcblxuICBwcm92aWRlKCkge1xuICAgIHJldHVybiB7XG4gICAgICAkc291cmNlQ29tcG9uZW50OiAoKSA9PiB0aGlzXG4gICAgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdyYXBwZWRQcmltaXRpdmVzOiBudWxsLFxuICAgICAgaWdub3JlUm91dGVDaGFuZ2U6IGZhbHNlLFxuICAgICAgdW53cmFwcGluZ1ByaW1pdGl2ZXM6IGZhbHNlXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgc291cmNlQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9LFxuXG4gICAgaXNPYmplY3RTb3VyY2UoKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RTb3VyY2UodGhpcy50eXBlKVxuICAgIH0sXG5cbiAgICBpc0xpc3RTb3VyY2UoKSB7XG4gICAgICByZXR1cm4gaXNMaXN0U291cmNlKHRoaXMudHlwZSlcbiAgICB9LFxuXG4gICAgLy8gQG92ZXJyaWRlIFJlc291cmNlTWl4aW4uaGFzRGF0YSgpXG4gICAgaGFzRGF0YSgpIHtcbiAgICAgIHJldHVybiAhIXRoaXMudmFsdWVcbiAgICB9LFxuXG4gICAgaXNSZWFkeSgpIHtcbiAgICAgIC8vIExpc3RzIHRoYXQgaGF2ZSBubyBkYXRhIGFuZCBubyBhc3NvY2lhdGVkIHJlc291cmNlIHNob3VsZCBzdGlsbCByZW5kZXIsXG4gICAgICAvLyBhcyB0aGV5IG1heSBiZSBnZXR0aW5nIHRoZWlyIGRhdGEgZWxzZXdoZXJlLCBlLmcuIGBjb21wdXRlKClgLlxuICAgICAgcmV0dXJuIHRoaXMuaGFzRGF0YSB8fCAhdGhpcy5wcm92aWRlc0RhdGFcbiAgICB9LFxuXG4gICAgaXNJblZpZXcoKSB7XG4gICAgICByZXR1cm4gISF0aGlzLnZpZXdDb21wb25lbnRcbiAgICB9LFxuXG4gICAgd3JhcFByaW1pdGl2ZXMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY2hlbWEud3JhcFByaW1pdGl2ZXNcbiAgICB9LFxuXG4gICAgbGlzdERhdGE6IHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgbGV0IGRhdGEgPSB0aGlzLnZhbHVlXG4gICAgICAgIGlmICh0aGlzLmlzT2JqZWN0U291cmNlKSB7XG4gICAgICAgICAgLy8gQ29udmVydCB0byBsaXN0IGFycmF5LlxuICAgICAgICAgIGRhdGEgPSBkYXRhICE9IG51bGwgPyBbZGF0YV0gOiBbXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIElmIGRhdGEgZ2V0cyBpbmhlcml0ZWQgZnJvbSBwYXJlbnQsIHVud3JhcHBpbmcgaXMgbm90IGhhcHBlbmluZ1xuICAgICAgICAgIC8vIGF0IHRoZSByb290IGluIGBzZXREYXRhKClgLCBidXQgaGVyZSBpbnN0ZWFkLlxuICAgICAgICAgIGRhdGEgPSB0aGlzLnVud3JhcExpc3REYXRhKGRhdGEpIHx8IGRhdGFcbiAgICAgICAgfVxuICAgICAgICBkYXRhIHx8PSBbXVxuICAgICAgICBjb25zdCB7IHdyYXBQcmltaXRpdmVzIH0gPSB0aGlzXG4gICAgICAgIGlmICh3cmFwUHJpbWl0aXZlcykge1xuICAgICAgICAgIGlmICh0aGlzLnVud3JhcHBpbmdQcmltaXRpdmVzKSB7XG4gICAgICAgICAgICAvLyBXZSdyZSBkb25lIHVud3JhcHBpbmcgb25jZSBgbGlzdERhdGFgIGlzIHJlZXZhbHVhdGVkLCBzbyBzZXRcbiAgICAgICAgICAgIC8vIHRoaXMgdG8gYGZhbHNlYCBhZ2Fpbi4gU2VlIGB3cmFwcGVkUHJpbWl0aXZlc2Agd2F0Y2hlciBhYm92ZS5cbiAgICAgICAgICAgIC8vIFRPRE86IEZpeCBzaWRlLWVmZmVjdHNcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICAgICAgdGhpcy51bndyYXBwaW5nUHJpbWl0aXZlcyA9IGZhbHNlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIENvbnZlcnQgZGF0YSB0byBhIGxpc3Qgb2Ygd3JhcHBlZCBwcmltaXRpdmVzLCBhbmQgcmV0dXJuIGl0LlxuICAgICAgICAgICAgLy8gVE9ETzogRml4IHNpZGUtZWZmZWN0c1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgICAgICB0aGlzLndyYXBwZWRQcmltaXRpdmVzID0gZGF0YS5tYXAodmFsdWUgPT4gKHtcbiAgICAgICAgICAgICAgW3dyYXBQcmltaXRpdmVzXTogdmFsdWVcbiAgICAgICAgICAgIH0pKVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhpcy53cmFwcGVkUHJpbWl0aXZlc1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhXG4gICAgICB9LFxuXG4gICAgICBzZXQoZGF0YSkge1xuICAgICAgICBpZiAodGhpcy53cmFwUHJpbWl0aXZlcykge1xuICAgICAgICAgIHRoaXMud3JhcHBlZFByaW1pdGl2ZXMgPSBkYXRhXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuaXNPYmplY3RTb3VyY2VcbiAgICAgICAgICAgID8gZGF0YSAmJiBkYXRhLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgPyBkYXRhWzBdXG4gICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICAgICAgOiBkYXRhXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgb2JqZWN0RGF0YToge1xuICAgICAgZ2V0KCkge1xuICAgICAgICAvLyBBbHdheXMgZ28gdGhyb3VnaCBgbGlzdERhdGFgIGludGVybmFsbHksIHdoaWNoIGRvZXMgYWxsIHRoZVxuICAgICAgICAvLyBwcm9jZXNzaW5nIG9mIGB3cmFwUHJpbWl0aXZlc2AsIGV0Yy5cbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdERhdGFbMF0gfHwgbnVsbFxuICAgICAgfSxcblxuICAgICAgc2V0KGRhdGEpIHtcbiAgICAgICAgdGhpcy5saXN0RGF0YSA9IGRhdGEgPyBbZGF0YV0gOiBbXVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzb3VyY2VTY2hlbWEoKSB7XG4gICAgICAvLyBUaGUgc291cmNlU2NoZW1hIG9mIGEgbGlzdCBpcyB0aGUgbGlzdCdzIHNjaGVtYSBpdHNlbGYuXG4gICAgICByZXR1cm4gdGhpcy5zY2hlbWFcbiAgICB9LFxuXG4gICAgcGF0aCgpIHtcbiAgICAgIC8vIFRoaXMgaXMgdXNlZCBpbiBUeXBlTGlzdCBmb3IgRGl0b0Zvcm1DaG9vc2VyLlxuICAgICAgcmV0dXJuIHRoaXMucm91dGVDb21wb25lbnQuZ2V0Q2hpbGRQYXRoKHRoaXMuc2NoZW1hLnBhdGgpXG4gICAgfSxcblxuICAgIGRlZmF1bHRRdWVyeSgpIHtcbiAgICAgIGNvbnN0IHsgZGVmYXVsdE9yZGVyOiBvcmRlciB9ID0gdGhpc1xuICAgICAgcmV0dXJuIG9yZGVyID8geyBvcmRlciB9IDoge31cbiAgICB9LFxuXG4gICAgcXVlcnk6IGdldFN0b3JlQWNjZXNzb3IoJ3F1ZXJ5Jywge1xuICAgICAgZ2V0KHF1ZXJ5KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4udGhpcy5kZWZhdWx0UXVlcnksXG4gICAgICAgICAgLi4ucXVlcnlcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgc2V0KHF1ZXJ5KSB7XG4gICAgICAgIC8vIEFsd2F5cyBrZWVwIHRoZSBkaXNwbGF5ZWQgcXVlcnkgcGFyYW1ldGVycyBpbiBzeW5jIHdpdGggdGhlIHN0b3JlZFxuICAgICAgICAvLyBvbmVzLiBVc2Ugc2NvcGUgYW5kIHBhZ2UgZnJvbSB0aGUgbGlzdCBzY2hlbWEgYXMgZGVmYXVsdHMsIGJ1dCBhbGxvd1xuICAgICAgICAvLyB0aGUgcm91dGUgcXVlcnkgcGFyYW1ldGVycyB0byBvdmVycmlkZSB0aGVtLlxuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgc2NvcGUgPSB0aGlzLmRlZmF1bHRTY29wZT8ubmFtZSxcbiAgICAgICAgICBwYWdlID0gdGhpcy5zY2hlbWEucGFnZVxuICAgICAgICB9ID0gdGhpcy5xdWVyeVxuICAgICAgICAvLyBQcmVzZXJ2ZSAvIG1lcmdlIGN1cnJlbnRseSBzdG9yZWQgdmFsdWVzLlxuICAgICAgICBxdWVyeSA9IHtcbiAgICAgICAgICAuLi50aGlzLnF1ZXJ5LFxuICAgICAgICAgIC4uLihzY29wZSAhPSBudWxsICYmIHsgc2NvcGUgfSksXG4gICAgICAgICAgLi4uKHBhZ2UgIT0gbnVsbCAmJiB7IHBhZ2UgfSksXG4gICAgICAgICAgLi4ucXVlcnlcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWVxdWFscyhxdWVyeSwgdGhpcy4kcm91dGUucXVlcnkpKSB7XG4gICAgICAgICAgLy8gVGVsbCB0aGUgYCRyb3V0ZWAgd2F0Y2hlciB0byBpZ25vcmUgdGhlIGNoYW5nZWQgdHJpZ2dlcmVkIGhlcmU6XG4gICAgICAgICAgdGhpcy5pZ25vcmVSb3V0ZUNoYW5nZSA9IHRydWVcbiAgICAgICAgICB0aGlzLiRyb3V0ZXIucmVwbGFjZSh7IHF1ZXJ5LCBoYXNoOiB0aGlzLiRyb3V0ZS5oYXNoIH0pXG4gICAgICAgICAgLy8gQ2hhbmdlIHRoZSByb3V0ZSBxdWVyeSBwYXJhbWV0ZXJzLCBidXQgZG9uJ3QgdHJpZ2dlciBhIHJvdXRlXG4gICAgICAgICAgLy8gY2hhbmdlLCBhcyB0aGF0IHdvdWxkIGNhdXNlIHRoZSBsaXN0IHRvIHJlbG9hZC5cbiAgICAgICAgICAvLyByZXBsYWNlUm91dGUoeyBxdWVyeSB9KVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBxdWVyeSAvLyBMZXQgZ2V0U3RvcmVBY2Nlc3NvcigpIGRvIHRoZSBhY3R1YWwgc2V0dGluZ1xuICAgICAgfVxuICAgIH0pLFxuXG4gICAgdG90YWw6IGdldFN0b3JlQWNjZXNzb3IoJ3RvdGFsJyksXG5cbiAgICBjb2x1bW5zKCkge1xuICAgICAgcmV0dXJuIGdldE5hbWVkU2NoZW1hcyh0aGlzLnNjaGVtYS5jb2x1bW5zKVxuICAgIH0sXG5cbiAgICBzY29wZXMoKSB7XG4gICAgICByZXR1cm4gZ2V0TmFtZWRTY2hlbWFzKHRoaXMuc2NoZW1hLnNjb3BlcylcbiAgICB9LFxuXG4gICAgZGVmYXVsdFNjb3BlKCkge1xuICAgICAgbGV0IGZpcnN0ID0gbnVsbFxuICAgICAgaWYgKHRoaXMuc2NvcGVzKSB7XG4gICAgICAgIGZvciAoY29uc3Qgc2NvcGUgb2YgT2JqZWN0LnZhbHVlcyh0aGlzLnNjb3BlcykpIHtcbiAgICAgICAgICBpZiAoc2NvcGUuZGVmYXVsdFNjb3BlKSB7XG4gICAgICAgICAgICByZXR1cm4gc2NvcGVcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFmaXJzdCkge1xuICAgICAgICAgICAgZmlyc3QgPSBzY29wZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZpcnN0XG4gICAgfSxcblxuICAgIGRlZmF1bHRPcmRlcigpIHtcbiAgICAgIGlmICh0aGlzLmNvbHVtbnMpIHtcbiAgICAgICAgZm9yIChjb25zdCBjb2x1bW4gb2YgT2JqZWN0LnZhbHVlcyh0aGlzLmNvbHVtbnMpKSB7XG4gICAgICAgICAgY29uc3QgeyBkZWZhdWx0U29ydCB9ID0gY29sdW1uXG4gICAgICAgICAgaWYgKGRlZmF1bHRTb3J0KSB7XG4gICAgICAgICAgICBjb25zdCBkaXJlY3Rpb24gPSBpc1N0cmluZyhkZWZhdWx0U29ydCkgPyBkZWZhdWx0U29ydCA6ICdhc2MnXG4gICAgICAgICAgICByZXR1cm4gYCR7Y29sdW1uLm5hbWV9ICR7ZGlyZWN0aW9ufWBcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsXG4gICAgfSxcblxuICAgIG5lc3RlZE1ldGEoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi50aGlzLm1ldGEsXG4gICAgICAgIHNjaGVtYTogdGhpcy5zY2hlbWFcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZm9ybXMoKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhnZXRGb3JtU2NoZW1hcyh0aGlzLnNjaGVtYSwgdGhpcy5jb250ZXh0KSlcbiAgICB9LFxuXG4gICAgLy8gUmV0dXJucyB0aGUgbGlua2VkIHZpZXcgc2NoZW1hIGlmIHRoaXMgc291cmNlIGVkaXRzIGl0IGl0cyBpdGVtcyB0aHJvdWdoXG4gICAgLy8gYSBsaW5rZWQgdmlldy5cbiAgICB2aWV3KCkge1xuICAgICAgcmV0dXJuIGdldFZpZXdTY2hlbWEodGhpcy5zY2hlbWEsIHRoaXMuY29udGV4dClcbiAgICB9LFxuXG4gICAgbGlua3NUb1ZpZXcoKSB7XG4gICAgICByZXR1cm4gISF0aGlzLnZpZXdcbiAgICB9LFxuXG4gICAgYnV0dG9uU2NoZW1hcygpIHtcbiAgICAgIHJldHVybiBnZXRCdXR0b25TY2hlbWFzKHRoaXMuc2NoZW1hLmJ1dHRvbnMpXG4gICAgfSxcblxuICAgIGlzQ29tcGFjdCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmZvcm1zLmV2ZXJ5KGlzQ29tcGFjdClcbiAgICB9LFxuXG4gICAgaXNJbmxpbmVkKCkge1xuICAgICAgcmV0dXJuIGlzSW5saW5lZCh0aGlzLnNjaGVtYSlcbiAgICB9LFxuXG4gICAgcGFnaW5hdGU6IGdldFNjaGVtYUFjY2Vzc29yKCdwYWdpbmF0ZScsIHtcbiAgICAgIHR5cGU6IE51bWJlclxuICAgIH0pLFxuXG4gICAgcmVuZGVyOiBnZXRTY2hlbWFBY2Nlc3NvcigncmVuZGVyJywge1xuICAgICAgdHlwZTogRnVuY3Rpb24sXG4gICAgICBkZWZhdWx0OiBudWxsXG4gICAgfSksXG5cbiAgICBjcmVhdGFibGU6IGdldFNjaGVtYUFjY2Vzc29yKCdjcmVhdGFibGUnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICBnZXQoY3JlYXRhYmxlKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGFibGUgJiYgaGFzRm9ybVNjaGVtYSh0aGlzLnNjaGVtYSlcbiAgICAgICAgICA/IHRoaXMuaXNPYmplY3RTb3VyY2VcbiAgICAgICAgICAgID8gIXRoaXMudmFsdWVcbiAgICAgICAgICAgIDogdHJ1ZVxuICAgICAgICAgIDogZmFsc2VcbiAgICAgIH1cbiAgICB9KSxcblxuICAgIGVkaXRhYmxlOiBnZXRTY2hlbWFBY2Nlc3NvcignZWRpdGFibGUnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICBnZXQoZWRpdGFibGUpIHtcbiAgICAgICAgcmV0dXJuIGVkaXRhYmxlICYmICF0aGlzLmlzSW5saW5lZFxuICAgICAgfVxuICAgIH0pLFxuXG4gICAgZGVsZXRhYmxlOiBnZXRTY2hlbWFBY2Nlc3NvcignZGVsZXRhYmxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSksXG5cbiAgICBkcmFnZ2FibGU6IGdldFNjaGVtYUFjY2Vzc29yKCdkcmFnZ2FibGUnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICBnZXQoZHJhZ2dhYmxlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzTGlzdFNvdXJjZSAmJiB0aGlzLmxpc3REYXRhLmxlbmd0aCA+IDEgJiYgZHJhZ2dhYmxlXG4gICAgICB9XG4gICAgfSksXG5cbiAgICBjb2xsYXBzaWJsZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ2NvbGxhcHNpYmxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IG51bGwsIC8vIHNvIHRoYXQgYD8/YCBiZWxvdyBjYW4gZG8gaXRzIHRoaW5nOlxuICAgICAgZ2V0KGNvbGxhcHNpYmxlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzSW5saW5lZCAmJiAhIShjb2xsYXBzaWJsZSA/PyB0aGlzLmNvbGxhcHNlZCAhPT0gbnVsbClcbiAgICAgIH1cbiAgICB9KSxcblxuICAgIGNvbGxhcHNlZDogZ2V0U2NoZW1hQWNjZXNzb3IoJ2NvbGxhcHNlZCcsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBudWxsXG4gICAgfSlcbiAgfSxcblxuICB3YXRjaDoge1xuICAgICRyb3V0ZSh0bywgZnJvbSkge1xuICAgICAgaWYgKHRoaXMuaWdub3JlUm91dGVDaGFuZ2UpIHtcbiAgICAgICAgdGhpcy5pZ25vcmVSb3V0ZUNoYW5nZSA9IGZhbHNlXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaWYgKGZyb20ucGF0aCA9PT0gdG8ucGF0aCAmJiBmcm9tLmhhc2ggPT09IHRvLmhhc2gpIHtcbiAgICAgICAgLy8gUGF0aHMgYW5kIGhhc2hlcyByZW1haW4gdGhlIHNhbWUsIHNvIG9ubHkgcXVlcmllcyBoYXZlIGNoYW5nZWQuXG4gICAgICAgIC8vIFVwZGF0ZSBmaWx0ZXIgYW5kIHJlbG9hZCBkYXRhIHdpdGhvdXQgY2xlYXJpbmcuXG4gICAgICAgIHRoaXMucXVlcnkgPSB0by5xdWVyeVxuICAgICAgICB0aGlzLmxvYWREYXRhKGZhbHNlKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICB3cmFwcGVkUHJpbWl0aXZlczoge1xuICAgICAgZGVlcDogdHJ1ZSxcbiAgICAgIGhhbmRsZXIodG8sIGZyb20pIHtcbiAgICAgICAgY29uc3QgeyB3cmFwUHJpbWl0aXZlcyB9ID0gdGhpc1xuICAgICAgICAvLyBTa2lwIHRoZSBpbml0aWFsIHNldHRpbmcgb2Ygd3JhcHBlZFByaW1pdGl2ZXMgYXJyYXlcbiAgICAgICAgaWYgKHdyYXBQcmltaXRpdmVzICYmIGZyb20gIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBXaGVuZXZlciB0aGUgd3JhcHBlZFByaW1pdGl2ZXMgY2hhbmdlLCBtYXAgdGhlaXIgdmFsdWVzIGJhY2sgdG9cbiAgICAgICAgICAvLyB0aGUgYXJyYXkgb2YgcHJpbWl0aXZlcywgaW4gYSBwcmltaXRpdmUgd2F5IDopXG4gICAgICAgICAgLy8gQnV0IHNldCBgdW53cmFwcGluZ1ByaW1pdGl2ZXMgPSB0cnVlYCwgc28gdGhlIGBsaXN0RGF0YWAgY29tcHV0ZWRcbiAgICAgICAgICAvLyBwcm9wZXJ0eSBrbm93cyBhYm91dCBpdCwgd2hpY2ggc2V0cyBpdCB0byBgZmFsc2VgIGFnYWluLlxuICAgICAgICAgIHRoaXMudW53cmFwcGluZ1ByaW1pdGl2ZXMgPSB0cnVlXG4gICAgICAgICAgdGhpcy52YWx1ZSA9IHRvLm1hcChvYmplY3QgPT4gb2JqZWN0W3dyYXBQcmltaXRpdmVzXSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgc2V0dXBEYXRhKCkge1xuICAgICAgdGhpcy5xdWVyeSA9IHRoaXMuJHJvdXRlLnF1ZXJ5XG4gICAgICB0aGlzLmVuc3VyZURhdGEoKVxuICAgIH0sXG5cbiAgICAvLyBAb3ZlcnJpZGUgUmVzb3VyY2VNaXhpbi5jbGVhckRhdGEoKVxuICAgIGNsZWFyRGF0YSgpIHtcbiAgICAgIHRoaXMudG90YWwgPSAwXG4gICAgICB0aGlzLnZhbHVlID0gbnVsbFxuICAgIH0sXG5cbiAgICAvLyBAb3ZlcnJpZGUgUmVzb3VyY2VNaXhpbi5zZXREYXRhKClcbiAgICBzZXREYXRhKGRhdGEpIHtcbiAgICAgIC8vIFdoZW4gbmV3IGRhdGEgaXMgbG9hZGVkLCB3ZSBjYW4gc3RvcmUgaXQgcmlnaHQgYmFjayBpbiB0aGUgZGF0YSBvZiB0aGVcbiAgICAgIC8vIHZpZXcgb3IgZm9ybSB0aGF0IGNyZWF0ZWQgdGhpcyBsaXN0IGNvbXBvbmVudC5cbiAgICAgIC8vIFN1cHBvcnQgdHdvIGZvcm1hdHMgZm9yIGxpc3QgZGF0YTpcbiAgICAgIC8vIC0gQXJyYXk6IGBbLi4uXWBcbiAgICAgIC8vIC0gT2JqZWN0OiBgeyByZXN1bHRzOiBbLi4uXSwgdG90YWwgfWAsIHNlZSBgdW53cmFwTGlzdERhdGEoKWBcbiAgICAgIGlmIChcbiAgICAgICAgIWRhdGEgfHxcbiAgICAgICAgdGhpcy5pc0xpc3RTb3VyY2UgJiYgaXNBcnJheShkYXRhKSB8fFxuICAgICAgICB0aGlzLmlzT2JqZWN0U291cmNlICYmIGlzT2JqZWN0KGRhdGEpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IGRhdGFcbiAgICAgIH0gZWxzZSBpZiAodGhpcy51bndyYXBMaXN0RGF0YShkYXRhKSkge1xuICAgICAgICAvLyBUaGUgZm9ybWF0IGRpZG4ndCBtYXRjaCwgc2VlIGlmIHdlIHJlY2VpdmVkIGEgYHsgcmVzdWx0cywgdG90YWwgfWBcbiAgICAgICAgLy8gb2JqZWN0LCBpbiB3aGljaCBjYXNlIGB0aGlzLnZhbHVlYCB3YXMgYWxyZWFkeSBzZXQgYnlcbiAgICAgICAgLy8gYHVud3JhcExpc3REYXRhKClgIGFuZCB3ZSdyZSBkb25lIG5vdy5cbiAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3QoZGF0YSkgJiYgdGhpcy5pc0luVmlldykge1xuICAgICAgICAvLyBUaGUgY29udHJvbGxlciBpcyBzZW5kaW5nIGRhdGEgZm9yIGEgZnVsbCBtdWx0aS1jb21wb25lbnQgdmlldyxcbiAgICAgICAgLy8gaW5jbHVkaW5nIHRoZSBuZXN0ZWQgbGlzdCBkYXRhLlxuICAgICAgICB0aGlzLnZpZXdDb21wb25lbnQuc2V0RGF0YShkYXRhKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICB1bndyYXBMaXN0RGF0YShkYXRhKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuaXNMaXN0U291cmNlICYmXG4gICAgICAgIGlzT2JqZWN0KGRhdGEpICYmXG4gICAgICAgIGlzTnVtYmVyKGRhdGEudG90YWwpICYmXG4gICAgICAgIGlzQXJyYXkoZGF0YS5yZXN1bHRzKVxuICAgICAgKSB7XG4gICAgICAgIC8vIElmIEBkaXRvanMvc2VydmVyIHNlbmRzIGRhdGEgaW4gdGhlIGZvcm0gb2YgYHsgcmVzdWx0cywgdG90YWwgfWBcbiAgICAgICAgLy8gcmVwbGFjZSB0aGUgdmFsdWUgd2l0aCByZXN1bHQsIGJ1dCByZW1lbWJlciB0aGUgdG90YWwgaW4gdGhlIHN0b3JlLlxuICAgICAgICB0aGlzLnRvdGFsID0gZGF0YS50b3RhbFxuICAgICAgICB0aGlzLnZhbHVlID0gZGF0YS5yZXN1bHRzXG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlXG4gICAgICB9XG4gICAgfSxcblxuICAgIGNyZWF0ZUl0ZW0oc2NoZW1hLCB0eXBlKSB7XG4gICAgICBjb25zdCBpdGVtID0gdGhpcy5jcmVhdGVEYXRhKHNjaGVtYSwgdHlwZSlcbiAgICAgIGlmICh0aGlzLmlzT2JqZWN0U291cmNlKSB7XG4gICAgICAgIHRoaXMub2JqZWN0RGF0YSA9IGl0ZW1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubGlzdERhdGEucHVzaChpdGVtKVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY29sbGFwc2libGUpIHtcbiAgICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4gdGhpcy5vcGVuU2NoZW1hQ29tcG9uZW50KC0xKSlcbiAgICAgIH1cbiAgICAgIHRoaXMub25DaGFuZ2UoKVxuICAgICAgcmV0dXJuIGl0ZW1cbiAgICB9LFxuXG4gICAgcmVtb3ZlSXRlbShpdGVtKSB7XG4gICAgICBpZiAodGhpcy5pc09iamVjdFNvdXJjZSkge1xuICAgICAgICB0aGlzLm9iamVjdERhdGEgPSBudWxsXG4gICAgICAgIHRoaXMub25DaGFuZ2UoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgeyBsaXN0RGF0YSB9ID0gdGhpc1xuICAgICAgICBjb25zdCBpbmRleCA9IGxpc3REYXRhICYmIGxpc3REYXRhLmluZGV4T2YoaXRlbSlcbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICBsaXN0RGF0YS5zcGxpY2UoaW5kZXgsIDEpXG4gICAgICAgICAgdGhpcy5vbkNoYW5nZSgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZGVsZXRlSXRlbShpdGVtLCBpbmRleCkge1xuICAgICAgY29uc3QgbGFiZWwgPSAoXG4gICAgICAgIGl0ZW0gJiZcbiAgICAgICAgdGhpcy5nZXRJdGVtTGFiZWwodGhpcy5zY2hlbWEsIGl0ZW0sIHtcbiAgICAgICAgICBpbmRleCxcbiAgICAgICAgICBleHRlbmRlZDogdHJ1ZVxuICAgICAgICB9KVxuICAgICAgKVxuXG4gICAgICBjb25zdCBub3RpZnkgPSAoKSA9PlxuICAgICAgICB0aGlzLm5vdGlmeSh7XG4gICAgICAgICAgdHlwZTogdGhpcy5pc1RyYW5zaWVudCA/ICdpbmZvJyA6ICdzdWNjZXNzJyxcbiAgICAgICAgICB0aXRsZTogJ1N1Y2Nlc3NmdWxseSBSZW1vdmVkJyxcbiAgICAgICAgICB0ZXh0OiBbXG4gICAgICAgICAgICBgJHtsYWJlbH0gd2FzICR7dGhpcy52ZXJicy5kZWxldGVkfS5gLFxuICAgICAgICAgICAgdGhpcy50cmFuc2llbnROb3RlXG4gICAgICAgICAgXVxuICAgICAgICB9KVxuXG4gICAgICBpZiAoXG4gICAgICAgIGl0ZW0gJiZcbiAgICAgICAgd2luZG93LmNvbmZpcm0oXG4gICAgICAgICAgYERvIHlvdSByZWFsbHkgd2FudCB0byAke3RoaXMudmVyYnMuZGVsZXRlfSAke2xhYmVsfT9gXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICBpZiAodGhpcy5pc1RyYW5zaWVudCkge1xuICAgICAgICAgIHRoaXMucmVtb3ZlSXRlbShpdGVtKVxuICAgICAgICAgIG5vdGlmeSgpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgaXRlbUlkID0gdGhpcy5nZXRJdGVtSWQodGhpcy5zY2hlbWEsIGl0ZW0pXG4gICAgICAgICAgY29uc3QgcmVzb3VyY2UgPSBnZXRNZW1iZXJSZXNvdXJjZShpdGVtSWQsIHRoaXMucmVzb3VyY2UpXG4gICAgICAgICAgaWYgKHJlc291cmNlKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVJlcXVlc3QoeyBtZXRob2Q6ICdkZWxldGUnLCByZXNvdXJjZSB9LCBlcnIgPT4ge1xuICAgICAgICAgICAgICBpZiAoIWVycikge1xuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlSXRlbShpdGVtKVxuICAgICAgICAgICAgICAgIG5vdGlmeSgpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5yZWxvYWREYXRhKClcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGdldFNjaGVtYUNvbXBvbmVudChpbmRleCkge1xuICAgICAgY29uc3QgeyBzY2hlbWFDb21wb25lbnRzIH0gPSB0aGlzXG4gICAgICBjb25zdCB7IGxlbmd0aCB9ID0gc2NoZW1hQ29tcG9uZW50c1xuICAgICAgcmV0dXJuIHNjaGVtYUNvbXBvbmVudHNbKChpbmRleCAlIGxlbmd0aCkgKyBsZW5ndGgpICUgbGVuZ3RoXVxuICAgIH0sXG5cbiAgICBvcGVuU2NoZW1hQ29tcG9uZW50KGluZGV4KSB7XG4gICAgICBjb25zdCBzY2hlbWFDb21wb25lbnQgPSB0aGlzLmdldFNjaGVtYUNvbXBvbmVudChpbmRleClcbiAgICAgIGlmIChzY2hlbWFDb21wb25lbnQpIHtcbiAgICAgICAgc2NoZW1hQ29tcG9uZW50Lm9wZW5lZCA9IHRydWVcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgbmF2aWdhdGVUb0NvbXBvbmVudChkYXRhUGF0aCwgb25Db21wbGV0ZSkge1xuICAgICAgaWYgKHRoaXMuY29sbGFwc2libGUpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBkYXRhUGF0aC5zdGFydHNXaXRoKHRoaXMuZGF0YVBhdGgpXG4gICAgICAgICAgPyB0aGlzLmlzTGlzdFNvdXJjZVxuICAgICAgICAgICAgPyBwYXJzZURhdGFQYXRoKGRhdGFQYXRoLnNsaWNlKHRoaXMuZGF0YVBhdGgubGVuZ3RoICsgMSkpWzBdID8/IG51bGxcbiAgICAgICAgICAgIDogMFxuICAgICAgICAgIDogbnVsbFxuICAgICAgICBpZiAoaW5kZXggIT09IG51bGwgJiYgaXNOdW1iZXIoK2luZGV4KSkge1xuICAgICAgICAgIGNvbnN0IHNjaGVtYUNvbXBvbmVudCA9IHRoaXMuZ2V0U2NoZW1hQ29tcG9uZW50KCtpbmRleClcbiAgICAgICAgICBpZiAoc2NoZW1hQ29tcG9uZW50KSB7XG4gICAgICAgICAgICBjb25zdCB7IG9wZW5lZCB9ID0gc2NoZW1hQ29tcG9uZW50XG4gICAgICAgICAgICBpZiAoIW9wZW5lZCkge1xuICAgICAgICAgICAgICBzY2hlbWFDb21wb25lbnQub3BlbmVkID0gdHJ1ZVxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLiRuZXh0VGljaygpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnRzID0gc2NoZW1hQ29tcG9uZW50LmdldENvbXBvbmVudHNCeURhdGFQYXRoKGRhdGFQYXRoKVxuICAgICAgICAgICAgaWYgKGNvbXBvbmVudHMubGVuZ3RoID4gMCAmJiAob25Db21wbGV0ZT8uKGNvbXBvbmVudHMpID8/IHRydWUpKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzY2hlbWFDb21wb25lbnQub3BlbmVkID0gb3BlbmVkXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5uYXZpZ2F0ZVRvUm91dGVDb21wb25lbnQoZGF0YVBhdGgsIG9uQ29tcGxldGUpXG4gICAgfSxcblxuICAgIG5hdmlnYXRlVG9Sb3V0ZUNvbXBvbmVudChkYXRhUGF0aCwgb25Db21wbGV0ZSkge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgY2FsbE9uQ29tcGxldGUgPSAoKSA9PiB7XG4gICAgICAgICAgLy8gUmV0cmlldmUgdGhlIGxhc3Qgcm91dGUgY29tcG9uZW50LCB3aGljaCB3aWxsIGJlIHRoZSBjb21wb25lbnQgdGhhdFxuICAgICAgICAgIC8vIHdlIGp1c3QgbmF2aWdhdGVkIHRvLCBhbmQgcGFzcyBpdCBvbiB0byBgb25Db21wbGV0ZSgpYFxuICAgICAgICAgIGNvbnN0IHsgcm91dGVDb21wb25lbnRzIH0gPSB0aGlzLmFwcFN0YXRlXG4gICAgICAgICAgY29uc3Qgcm91dGVDb21wb25lbnQgPSByb3V0ZUNvbXBvbmVudHNbcm91dGVDb21wb25lbnRzLmxlbmd0aCAtIDFdXG4gICAgICAgICAgcmVzb2x2ZShvbkNvbXBsZXRlPy4oW3JvdXRlQ29tcG9uZW50XSkgPz8gdHJ1ZSlcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRhdGFQYXRoUGFydHMgPSBwYXJzZURhdGFQYXRoKGRhdGFQYXRoKVxuICAgICAgICAvLyBTZWUgaWYgd2UgY2FuIGZpbmQgYSByb3V0ZSB0aGF0IGNhbiBzZXJ2ZSBwYXJ0IG9mIHRoZSBnaXZlbiBkYXRhUGF0aCxcbiAgICAgICAgLy8gYW5kIHRha2UgaXQgZnJvbSB0aGVyZTpcbiAgICAgICAgd2hpbGUgKGRhdGFQYXRoUGFydHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IHBhdGggPSB0aGlzLnJvdXRlQ29tcG9uZW50LmdldENoaWxkUGF0aChcbiAgICAgICAgICAgIHRoaXMuYXBpLm5vcm1hbGl6ZVBhdGgobm9ybWFsaXplRGF0YVBhdGgoZGF0YVBhdGhQYXJ0cykpXG4gICAgICAgICAgKVxuICAgICAgICAgIC8vIFNlZSBpZiB0aGVyZSBhY3R1YWxseSBpcyBhIHJvdXRlIGZvciB0aGlzIHN1Yi1jb21wb25lbnQ6XG4gICAgICAgICAgY29uc3QgeyBtYXRjaGVkIH0gPSB0aGlzLiRyb3V0ZXIubWF0Y2gocGF0aClcbiAgICAgICAgICBpZiAobWF0Y2hlZC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLiRyb3V0ZS5wYXRoID09PSBwYXRoKSB7XG4gICAgICAgICAgICAgIC8vIFdlJ3JlIGFscmVhZHkgdGhlcmUsIHNvIGp1c3QgY2FsbCBgb25Db21wbGV0ZSgpYDpcbiAgICAgICAgICAgICAgY2FsbE9uQ29tcGxldGUoKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gTmF2aWdhdGUgdG8gdGhlIGNvbXBvbmVudCdzIHBhdGgsIHRoZW4gY2FsbCBgb25Db21wbGV0ZSgpYF86XG4gICAgICAgICAgICAgIHRoaXMuJHJvdXRlclxuICAgICAgICAgICAgICAgIC5wdXNoKHsgcGF0aCB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChyZWplY3QpXG4gICAgICAgICAgICAgICAgLy8gV2FpdCBmb3IgdGhlIGxhc3Qgcm91dGUgY29tcG9uZW50IHRvIGJlIG1vdW50ZWQgaW4gdGhlIG5leHRcbiAgICAgICAgICAgICAgICAvLyB0aWNrIGJlZm9yZSBjYWxsaW5nIGBvbkNvbXBsZXRlKClgXG4gICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgdGhpcy4kbmV4dFRpY2soY2FsbE9uQ29tcGxldGUpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gS2VlcCByZW1vdmluZyB0aGUgbGFzdCBwYXJ0IHVudGlsIHdlIGZpbmQgYSBtYXRjaC5cbiAgICAgICAgICBkYXRhUGF0aFBhcnRzLnBvcCgpXG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZShmYWxzZSlcbiAgICAgIH0pXG4gICAgfVxuICB9LCAvLyBlbmQgb2YgYG1ldGhvZHNgXG5cbiAgYXN5bmMgcHJvY2Vzc1NjaGVtYShcbiAgICBhcGksXG4gICAgc2NoZW1hLFxuICAgIG5hbWUsXG4gICAgcm91dGVzLFxuICAgIGxldmVsLFxuICAgIG5lc3RlZCA9IGZhbHNlLFxuICAgIGZsYXR0ZW4gPSBmYWxzZSxcbiAgICBwcm9jZXNzID0gbnVsbFxuICApIHtcbiAgICBwcm9jZXNzUm91dGVTY2hlbWEoYXBpLCBzY2hlbWEsIG5hbWUpXG4gICAgY29uc3QgaW5saW5lZCA9IGlzSW5saW5lZChzY2hlbWEpXG4gICAgaWYgKGlubGluZWQgJiYgc2NoZW1hLnJlc291cmNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdMaXN0cyB3aXRoIG5lc3RlZCBmb3JtcyBjYW5ub3QgbG9hZCBkYXRhIGZyb20gdGhlaXIgb3duIHJlc291cmNlcydcbiAgICAgIClcbiAgICB9XG4gICAgLy8gVXNlIGRpZmZlcmVudGx5IG5hbWVkIHVybCBwYXJhbWV0ZXJzIG9uIGVhY2ggbmVzdGVkIGxldmVsIGZvciBpZCBhc1xuICAgIC8vIG90aGVyd2lzZSB0aGV5IHdvdWxkIGNsYXNoIGFuZCBvdmVycmlkZSBlYWNoIG90aGVyIGluc2lkZSAkcm91dGUucGFyYW1zXG4gICAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vdnVlanMvdnVlLXJvdXRlci9pc3N1ZXMvMTM0NVxuICAgIGNvbnN0IHBhcmFtID0gYGlkJHtsZXZlbCArIDF9YFxuICAgIGNvbnN0IG1ldGEgPSB7XG4gICAgICBhcGksXG4gICAgICBzY2hlbWFcbiAgICB9XG4gICAgY29uc3QgZm9ybU1ldGEgPSB7XG4gICAgICAuLi5tZXRhLFxuICAgICAgLy8gV2hlbiBjaGlsZHJlbiBhcmUgZmxhdHRlbmVkIChlLmcuIHRyZWUtbGlzdHMpLCBpbmNsdWRlIHRoZSBgZmxhdHRlbmBcbiAgICAgIC8vIHNldHRpbmcgYWxzbywgZm9yIGZsYXR0ZW5pbmcgYmVsb3cuXG4gICAgICBmbGF0dGVuLFxuICAgICAgbmVzdGVkLFxuICAgICAgcGFyYW1cbiAgICB9XG4gICAgY29uc3QgY2hpbGRSb3V0ZXMgPSBhd2FpdCBwcm9jZXNzRm9ybXMoYXBpLCBzY2hlbWEsIGxldmVsKVxuICAgIGlmIChwcm9jZXNzKSB7XG4gICAgICBhd2FpdCBwcm9jZXNzKGNoaWxkUm91dGVzLCBsZXZlbCArIDEpXG4gICAgfVxuICAgIC8vIElubGluZWQgZm9ybXMgZG9uJ3QgbmVlZCB0byBhY3R1YWxseSBhZGQgcm91dGVzLlxuICAgIGlmIChoYXNGb3JtU2NoZW1hKHNjaGVtYSkgJiYgIWlubGluZWQpIHtcbiAgICAgIGNvbnN0IGdldFBhdGhXaXRoUGFyYW0gPSAocGF0aCwgcGFyYW0pID0+XG4gICAgICAgIHBhcmFtXG4gICAgICAgICAgPyBwYXRoXG4gICAgICAgICAgICA/IGAke3BhdGh9Lzoke3BhcmFtfWBcbiAgICAgICAgICAgIDogYDoke3BhcmFtfWBcbiAgICAgICAgICA6IHBhdGhcblxuICAgICAgLy8gTGlzdHMgaW4gc2luZ2xlLWNvbXBvbmVudC12aWV3cyAobGV2ZWwgPT09IDApIHVzZSB0aGVpciB2aWV3J3MgcGF0aCxcbiAgICAgIC8vIHdoaWxlIGFsbCBvdGhlcnMgbmVlZCB0aGVpciBwYXRoIHByZWZpeGVkIHdpdGggdGhlIHBhcmVudCdzIHBhdGg6XG4gICAgICBjb25zdCBzb3VyY2VQYXRoID0gbGV2ZWwgPT09IDAgPyAnJyA6IHNjaGVtYS5wYXRoXG4gICAgICBjb25zdCBmb3JtUm91dGUgPSB7XG4gICAgICAgIC8vIE9iamVjdCBzb3VyY2VzIGRvbid0IG5lZWQgaWQgcGFyYW1zIGluIHRoZWlyIGZvcm0gcGF0aHMsIGFzIHRoZXlcbiAgICAgICAgLy8gZGlyZWN0bHkgZWRpdCBvbmUgb2JqZWN0LlxuICAgICAgICBwYXRoOiBnZXRQYXRoV2l0aFBhcmFtKHNvdXJjZVBhdGgsIGlzTGlzdFNvdXJjZShzY2hlbWEpICYmIHBhcmFtKSxcbiAgICAgICAgY29tcG9uZW50OiBEaXRvQ29tcG9uZW50LmNvbXBvbmVudChcbiAgICAgICAgICBuZXN0ZWQgPyAnRGl0b0Zvcm1OZXN0ZWQnIDogJ0RpdG9Gb3JtJ1xuICAgICAgICApLFxuICAgICAgICBtZXRhOiBmb3JtTWV0YVxuICAgICAgfVxuICAgICAgaWYgKGlzT2JqZWN0U291cmNlKHNjaGVtYSkpIHtcbiAgICAgICAgLy8gQWxzbyBhZGQgYSBwYXJhbSByb3V0ZSwgc2ltcGx5IHRvIGhhbmRsZSAnL2NyZWF0ZScgbGlua3MgdGhlIHNhbWVcbiAgICAgICAgLy8gd2F5IHRoYXQgbGlzdHMgZG8sIHdoZXJlIGl0IG92ZXJsYXBzIHdpdGggOmlkIGZvciBpdGVtIGlkcy5cbiAgICAgICAgcm91dGVzLnB1c2goe1xuICAgICAgICAgIC4uLmZvcm1Sb3V0ZSxcbiAgICAgICAgICBwYXRoOiBnZXRQYXRoV2l0aFBhcmFtKHNvdXJjZVBhdGgsIHBhcmFtKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgaWYgKHNvdXJjZVBhdGgpIHtcbiAgICAgICAgLy8gSnVzdCByZWRpcmVjdCBiYWNrIHRvIHRoZSBwYXJlbnQgd2hlbiBhIG5lc3RlZCBzb3VyY2Ugcm91dGUgaXMgaGl0LlxuICAgICAgICByb3V0ZXMucHVzaCh7XG4gICAgICAgICAgcGF0aDogc291cmNlUGF0aCxcbiAgICAgICAgICByZWRpcmVjdDogJy4nLFxuICAgICAgICAgIG1ldGFcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIC8vIFBhcnRpdGlvbiBjaGlsZFJvdXRlcyBpbnRvIHRob3NlIHRoYXQgbmVlZCBmbGF0dGVuaW5nIChlLmcuIHRyZWUtbGlzdHMpXG4gICAgICAvLyBhbmQgdGhvc2UgdGhhdCBkb24ndCwgYW5kIHByb2Nlc3MgZWFjaCBncm91cCBzZXBhcmF0ZWx5IGFmdGVyLlxuICAgICAgY29uc3QgW2ZsYXRSb3V0ZXMsIHN1YlJvdXRlc10gPSBjaGlsZFJvdXRlcy5yZWR1Y2UoXG4gICAgICAgIChyZXMsIHJvdXRlKSA9PiB7XG4gICAgICAgICAgcmVzW3JvdXRlLm1ldGEuZmxhdHRlbiA/IDAgOiAxXS5wdXNoKHJvdXRlKVxuICAgICAgICAgIHJldHVybiByZXNcbiAgICAgICAgfSxcbiAgICAgICAgW1tdLCBbXV1cbiAgICAgIClcbiAgICAgIGlmIChzdWJSb3V0ZXMubGVuZ3RoKSB7XG4gICAgICAgIGZvcm1Sb3V0ZS5jaGlsZHJlbiA9IHN1YlJvdXRlc1xuICAgICAgfVxuICAgICAgcm91dGVzLnB1c2goZm9ybVJvdXRlKVxuICAgICAgLy8gQWRkIHRoZSBwcmVmaXhlZCBmb3JtUm91dGVzIHdpdGggdGhlaXIgY2hpbGRyZW4gZm9yIG5lc3RlZCBsaXN0cy5cbiAgICAgIGlmIChmbGF0Um91dGVzLmxlbmd0aCkge1xuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkUm91dGUgb2YgZmxhdFJvdXRlcykge1xuICAgICAgICAgIHJvdXRlcy5wdXNoKHtcbiAgICAgICAgICAgIC4uLihjaGlsZFJvdXRlLnJlZGlyZWN0ID8gY2hpbGRSb3V0ZSA6IGZvcm1Sb3V0ZSksXG4gICAgICAgICAgICBwYXRoOiBgJHtmb3JtUm91dGUucGF0aH0vJHtjaGlsZFJvdXRlLnBhdGh9YCxcbiAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgLi4uY2hpbGRSb3V0ZS5tZXRhLFxuICAgICAgICAgICAgICBmbGF0dGVuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBwcm9jZXNzVmFsdWUoc2NoZW1hLCB2YWx1ZSwgZGF0YVBhdGgsIGdyYXBoKSB7XG4gICAgZ3JhcGguYWRkU291cmNlKGRhdGFQYXRoLCBzY2hlbWEpXG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cbn1cbiIsImltcG9ydCB7IGlzQXJyYXksIGFzQXJyYXksIGxhYmVsaXplIH0gZnJvbSAnQGRpdG9qcy91dGlscydcbmltcG9ydCB7IGdldE5hbWVkU2NoZW1hcywgcHJvY2Vzc05lc3RlZFNjaGVtYURlZmF1bHRzIH0gZnJvbSAnLi9zY2hlbWEnXG5cbmV4cG9ydCBjb25zdCBmaWx0ZXJDb21wb25lbnRzID0ge1xuICAndGV4dCcoZmlsdGVyKSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IFtcbiAgICAgIHtcbiAgICAgICAgbGFiZWw6ICdjb250YWlucycsXG4gICAgICAgIHZhbHVlOiAnY29udGFpbnMnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBsYWJlbDogJ2VxdWFscycsXG4gICAgICAgIHZhbHVlOiAnZXF1YWxzJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbGFiZWw6ICdzdGFydHMgd2l0aCcsXG4gICAgICAgIHZhbHVlOiAnc3RhcnRzLXdpdGgnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBsYWJlbDogJ2VuZHMgd2l0aCcsXG4gICAgICAgIHZhbHVlOiAnZW5kcy13aXRoJ1xuICAgICAgfVxuICAgIF1cbiAgICByZXR1cm4ge1xuICAgICAgb3BlcmF0b3I6IGZpbHRlci5vcGVyYXRvcnNcbiAgICAgICAgPyB7XG4gICAgICAgICAgICB0eXBlOiAnc2VsZWN0JyxcbiAgICAgICAgICAgIHdpZHRoOiAnMi81JyxcbiAgICAgICAgICAgIG9wdGlvbnM6IGlzQXJyYXkoZmlsdGVyLm9wZXJhdG9ycylcbiAgICAgICAgICAgICAgPyBvcHRpb25zLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgIG9wdGlvbiA9PiBmaWx0ZXIub3BlcmF0b3JzLmluY2x1ZGVzKG9wdGlvbi52YWx1ZSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIDogb3B0aW9ucyxcbiAgICAgICAgICAgIGNsZWFyYWJsZTogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgOiBudWxsLFxuICAgICAgdGV4dDoge1xuICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgIHdpZHRoOiBmaWx0ZXIub3BlcmF0b3JzID8gJzMvNScgOiAnZmlsbCcsXG4gICAgICAgIGNsZWFyYWJsZTogdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICAnZGF0ZS1yYW5nZScoKSB7XG4gICAgLy8gVXNlIHNob3J0ZXIgZGF0ZSBmb3JtYXQgaW4gZGF0ZS1yYW5nZSBmaWx0ZXJzOlxuICAgIGNvbnN0IGRhdGVGb3JtYXQgPSB7XG4gICAgICBkYXk6ICcyLWRpZ2l0JyxcbiAgICAgIG1vbnRoOiAnMi1kaWdpdCcsXG4gICAgICB5ZWFyOiAnbnVtZXJpYydcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGZyb206IHtcbiAgICAgICAgdHlwZTogJ2RhdGV0aW1lJyxcbiAgICAgICAgd2lkdGg6ICcxLzInLFxuICAgICAgICBkYXRlRm9ybWF0LFxuICAgICAgICBjbGVhcmFibGU6IHRydWVcbiAgICAgIH0sXG4gICAgICB0bzoge1xuICAgICAgICB0eXBlOiAnZGF0ZXRpbWUnLFxuICAgICAgICB3aWR0aDogJzEvMicsXG4gICAgICAgIGRhdGVGb3JtYXQsXG4gICAgICAgIGNsZWFyYWJsZTogdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRmlsdGVyc1BhbmVsKGFwaSwgZmlsdGVycywgZGF0YVBhdGgsIHByb3h5KSB7XG4gIGNvbnN0IHsgc3RpY2t5LCAuLi5maWx0ZXJTY2hlbWFzIH0gPSBmaWx0ZXJzXG4gIGNvbnN0IHBhbmVsID0ge1xuICAgIHR5cGU6ICdwYW5lbCcsXG4gICAgbGFiZWw6ICdGaWx0ZXJzJyxcbiAgICBuYW1lOiAnJGZpbHRlcnMnLFxuICAgIHRhcmdldDogZGF0YVBhdGgsXG4gICAgLy8gT3ZlcnJpZGUgdGhlIGRlZmF1bHQgdmFsdWVcbiAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgc3RpY2t5LFxuXG4gICAgLy8gTk9URTogT24gcGFuZWxzLCB0aGUgZGF0YSgpIGNhbGxiYWNrIGRvZXMgc29tZXRoaW5nIGVsc2UgdGhhbiBvbiBub3JtYWxcbiAgICAvLyBzY2hlbWE6IEl0IHByb2R1Y2VzIHRoZSBgZGF0YWAgcHJvcGVydHkgdG8gYmUgcGFzc2VkIHRvIHRoZSBwYW5lbCdzXG4gICAgLy8gc2NoZW1hLCBub3QgdGhlIGRhdGEgdG8gYmUgdXNlZCBmb3IgdGhlIHBhbmVsIGNvbXBvbmVudCBkaXJlY3RseS5cbiAgICBkYXRhKCkge1xuICAgICAgcmV0dXJuIHBhcnNlRmlsdGVyc0RhdGEoXG4gICAgICAgIHBhbmVsLFxuICAgICAgICBwcm94eS5xdWVyeVxuICAgICAgKVxuICAgIH0sXG5cbiAgICBjb21wb25lbnRzOiBjcmVhdGVGaWx0ZXJzQ29tcG9uZW50cyhmaWx0ZXJTY2hlbWFzKSxcbiAgICBidXR0b25zOiBjcmVhdGVGaWx0ZXJzQnV0dG9ucyhmYWxzZSksXG4gICAgcGFuZWxCdXR0b25zOiBjcmVhdGVGaWx0ZXJzQnV0dG9ucyh0cnVlKSxcblxuICAgIGV2ZW50czoge1xuICAgICAgY2hhbmdlKCkge1xuICAgICAgICB0aGlzLmFwcGx5RmlsdGVycygpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGNvbXB1dGVkOiB7XG4gICAgICBmaWx0ZXJzKCkge1xuICAgICAgICByZXR1cm4gZm9ybWF0RmlsdGVyc0RhdGEodGhpcy5zY2hlbWEsIHRoaXMuZGF0YSlcbiAgICAgIH0sXG5cbiAgICAgIGhhc0ZpbHRlcnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbHRlcnMubGVuZ3RoID4gMFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBtZXRob2RzOiB7XG4gICAgICBhcHBseUZpbHRlcnMoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICdhcHBseUZpbHRlcnMoKScsXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgZGF0YTogdGhpcy5kYXRhLFxuICAgICAgICAgICAgZmlsdGVyczogdGhpcy5maWx0ZXJzXG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICBwcm94eS5xdWVyeSA9IHtcbiAgICAgICAgICAuLi5wcm94eS5xdWVyeSxcbiAgICAgICAgICBmaWx0ZXI6IHRoaXMuZmlsdGVycyxcbiAgICAgICAgICAvLyBDbGVhciBwYWdpbmF0aW9uIHdoZW4gYXBwbHlpbmcgb3IgY2xlYXJpbmcgZmlsdGVyczpcbiAgICAgICAgICBwYWdlOiB1bmRlZmluZWRcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgY2xlYXJGaWx0ZXJzKCkge1xuICAgICAgICBjb25zb2xlLmxvZygnY2xlYXJGaWx0ZXJzKCknKVxuICAgICAgICB0aGlzLnJlc2V0RGF0YSgpXG4gICAgICAgIHRoaXMuYXBwbHlGaWx0ZXJzKClcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJvY2Vzc05lc3RlZFNjaGVtYURlZmF1bHRzKGFwaSwgcGFuZWwpXG4gIHJldHVybiBwYW5lbFxufVxuXG5mdW5jdGlvbiBjcmVhdGVGaWx0ZXJzQnV0dG9ucyhzbWFsbCkge1xuICByZXR1cm4ge1xuICAgIGNsZWFyOiB7XG4gICAgICB0eXBlOiAnYnV0dG9uJyxcbiAgICAgIHRleHQ6IHNtYWxsID8gbnVsbCA6ICdDbGVhcicsXG4gICAgICBkaXNhYmxlZDogKHsgc2NoZW1hQ29tcG9uZW50IH0pID0+ICFzY2hlbWFDb21wb25lbnQuaGFzRmlsdGVycyxcbiAgICAgIGV2ZW50czoge1xuICAgICAgICBjbGljayh7IHNjaGVtYUNvbXBvbmVudCB9KSB7XG4gICAgICAgICAgLy8gU2luY2UgcGFuZWwgYnV0dG9ucyBhcmUgb3V0c2lkZSBvZiB0aGUgc2NoZW1hLCB3ZSBuZWVkIHRvIHVzZSB0aGVcbiAgICAgICAgICAvLyBzY2hlbWEgY29tcG9uZW50IHJlY2VpdmVkIGZyb20gdGhlIGluaXRpYWxpemUgZXZlbnQgYmVsb3c6XG4gICAgICAgICAgc2NoZW1hQ29tcG9uZW50LmNsZWFyRmlsdGVycygpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc3VibWl0OiB7XG4gICAgICB0eXBlOiAnc3VibWl0JyxcbiAgICAgIHRleHQ6IHNtYWxsID8gbnVsbCA6ICdGaWx0ZXInLFxuICAgICAgdmlzaWJsZTogIXNtYWxsLFxuICAgICAgZXZlbnRzOiB7XG4gICAgICAgIGNsaWNrKHsgc2NoZW1hQ29tcG9uZW50IH0pIHtcbiAgICAgICAgICBzY2hlbWFDb21wb25lbnQuYXBwbHlGaWx0ZXJzKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVGaWx0ZXJzQ29tcG9uZW50cyhmaWx0ZXJzKSB7XG4gIGNvbnN0IGNvbXBzID0ge31cbiAgZm9yIChjb25zdCBmaWx0ZXIgb2YgT2JqZWN0LnZhbHVlcyhnZXROYW1lZFNjaGVtYXMoZmlsdGVycykgfHwge30pKSB7XG4gICAgLy8gU3VwcG9ydCBib3RoIGN1c3RvbSBmb3JtcyBhbmQgZGVmYXVsdCBmaWx0ZXIgY29tcG9uZW50cywgdGhyb3VnaCB0aGVcbiAgICAvLyBgZmlsdGVyQ29tcG9uZW50c2AgcmVnaXN0cnkuIEV2ZW4gZm9yIGRlZmF1bHQgZmlsdGVycywgc3RpbGwgdXNlIHRoZVxuICAgIC8vIHByb3BlcnRpZXMgaW4gYGZpbHRlcmAgYXMgdGhlIGJhc2UgZm9yIGBmb3JtYCwgc28gdGhpbmdzIGxpa2UgYGxhYmVsYFxuICAgIC8vIGNhbiBiZSBjaGFuZ2VkIG9uIHRoZSByZXN1bHRpbmcgZm9ybS5cbiAgICBjb25zdCB7IGZpbHRlcjogdHlwZSwgd2lkdGgsIC4uLmZvcm0gfSA9IGZpbHRlclxuICAgIGNvbnN0IGNvbXBvbmVudHMgPSB0eXBlXG4gICAgICA/IGZpbHRlckNvbXBvbmVudHNbdHlwZV0/LihmaWx0ZXIpXG4gICAgICA6IGZpbHRlci5jb21wb25lbnRzXG4gICAgaWYgKGNvbXBvbmVudHMpIHtcbiAgICAgIGZvcm0udHlwZSA9ICdmb3JtJ1xuICAgICAgZm9ybS5jb21wb25lbnRzID0ge31cbiAgICAgIC8vIENvbnZlcnQgbGFiZWxzIHRvIHBsYWNlaG9sZGVyczpcbiAgICAgIGZvciAoY29uc3QgW2tleSwgY29tcG9uZW50XSBvZiBPYmplY3QuZW50cmllcyhjb21wb25lbnRzKSkge1xuICAgICAgICBpZiAoY29tcG9uZW50KSB7XG4gICAgICAgICAgY29uc3QgbGFiZWwgPSBjb21wb25lbnQubGFiZWwgfHwgbGFiZWxpemUoY29tcG9uZW50Lm5hbWUgfHwga2V5KVxuICAgICAgICAgIGZvcm0uY29tcG9uZW50c1trZXldID0ge1xuICAgICAgICAgICAgLi4uY29tcG9uZW50LFxuICAgICAgICAgICAgbGFiZWw6IGZhbHNlLFxuICAgICAgICAgICAgcGxhY2Vob2xkZXI6IGxhYmVsXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb21wc1tmaWx0ZXIubmFtZV0gPSB7XG4gICAgICAgIGxhYmVsOiBmb3JtLmxhYmVsLFxuICAgICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIGRlZmF1bHQ6ICgpID0+ICh7fSksXG4gICAgICAgIGZvcm0sXG4gICAgICAgIGlubGluZWQ6IHRydWVcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSW52YWxpZCBmaWx0ZXIgJyR7ZmlsdGVyLm5hbWV9JzogVW5rbm93biBmaWx0ZXIgdHlwZSAnJHt0eXBlfScuYFxuICAgICAgKVxuICAgIH1cbiAgfVxuICByZXR1cm4gY29tcHNcbn1cblxuZnVuY3Rpb24gZ2V0Q29tcG9uZW50c0ZvckZpbHRlcihzY2hlbWEsIG5hbWUpIHtcbiAgY29uc3QgY29tcG9uZW50ID0gc2NoZW1hLmNvbXBvbmVudHNbbmFtZV1cbiAgcmV0dXJuIGNvbXBvbmVudD8uZm9ybT8uY29tcG9uZW50c1xufVxuXG5mdW5jdGlvbiBmb3JtYXRGaWx0ZXJzRGF0YShzY2hlbWEsIGRhdGEpIHtcbiAgY29uc29sZS5sb2coXG4gICAgJ2Zvcm1hdEZpbHRlcnNEYXRhKCknLFxuICAgIHtcbiAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KGRhdGEpLFxuICAgICAgc2NoZW1hOiBKU09OLnN0cmluZ2lmeShPYmplY3Qua2V5cyhzY2hlbWE/LmNvbXBvbmVudHMgfHwge30pKVxuICAgIH1cbiAgKVxuICBjb25zdCBmaWx0ZXJzID0gW11cbiAgZm9yIChjb25zdCBuYW1lIGluIGRhdGEpIHtcbiAgICBjb25zdCBlbnRyeSA9IGRhdGFbbmFtZV1cbiAgICBpZiAoZW50cnkpIHtcbiAgICAgIC8vIE1hcCBjb21wb25lbnRzIHNlcXVlbmNlIHRvIGFyZ3VtZW50czpcbiAgICAgIGNvbnN0IGFyZ3MgPSBPYmplY3Qua2V5cyhnZXRDb21wb25lbnRzRm9yRmlsdGVyKHNjaGVtYSwgbmFtZSkpLm1hcChcbiAgICAgICAga2V5ID0+IGVudHJ5W2tleV0gPz8gbnVsbFxuICAgICAgKVxuICAgICAgLy8gT25seSBhcHBseSBmaWx0ZXIgaWYgdGhlcmUgYXJlIHNvbWUgYXJndW1lbnRzIHRoYXQgYXJlbid0IG51bGw6XG4gICAgICBpZiAoYXJncy5zb21lKHZhbHVlID0+IHZhbHVlICE9PSBudWxsKSkge1xuICAgICAgICBmaWx0ZXJzLnB1c2goYCR7bmFtZX06JHthcmdzLm1hcChKU09OLnN0cmluZ2lmeSkuam9pbignLCcpfWApXG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBmaWx0ZXJzXG59XG5cbmZ1bmN0aW9uIHBhcnNlRmlsdGVyc0RhdGEoc2NoZW1hLCBxdWVyeSkge1xuICBjb25zdCBmaWx0ZXJzID0ge31cbiAgLy8gU2FtZSBhcyBAZGl0b2pzL3NlcnZlcidzIFF1ZXJ5UGFyYW1ldGVycy5maWx0ZXI6IFRyYW5zbGF0ZSB0aGUgc3RyaW5nIGRhdGFcbiAgLy8gZnJvbSAkcm91dGUucXVlcnkgYmFjayB0byBwYXJhbSBsaXN0cyBwZXIgZmlsdGVyOlxuICBpZiAocXVlcnkpIHtcbiAgICBmb3IgKGNvbnN0IGZpbHRlciBvZiBhc0FycmF5KHF1ZXJ5LmZpbHRlcikpIHtcbiAgICAgIGNvbnN0IFssIG5hbWUsIGpzb25dID0gZmlsdGVyLm1hdGNoKC9eKFxcdyspOiguKikkLylcbiAgICAgIHRyeSB7XG4gICAgICAgIGZpbHRlcnNbbmFtZV0gPSBhc0FycmF5KEpTT04ucGFyc2UoYFske2pzb259XWApKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHt9XG4gICAgfVxuICB9XG4gIGNvbnN0IGZpbHRlcnNEYXRhID0ge31cbiAgZm9yIChjb25zdCBuYW1lIGluIHNjaGVtYS5jb21wb25lbnRzKSB7XG4gICAgY29uc3QgZGF0YSA9IHt9XG4gICAgLy8gSWYgd2UgaGF2ZSByZXRyaWV2ZWQgcGFyYW1zIGZyb20gdGhlIHF1ZXJ5LCBmZXRjaCB0aGUgYXNzb2NpYXRlZFxuICAgIC8vIGZvcm0gY29tcG9uZW50cyBzbyB3ZSBjYW4gbWFwIHRoZSB2YWx1ZXMgYmFjayB0byBvYmplY3Qga2V5czpcbiAgICBjb25zdCBhcmdzID0gZmlsdGVyc1tuYW1lXVxuICAgIGlmIChhcmdzKSB7XG4gICAgICBjb25zdCBjb21wb25lbnRzID0gZ2V0Q29tcG9uZW50c0ZvckZpbHRlcihzY2hlbWEsIG5hbWUpXG4gICAgICBpZiAoY29tcG9uZW50cykge1xuICAgICAgICBsZXQgaW5kZXggPSAwXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGNvbXBvbmVudHMpIHtcbiAgICAgICAgICBkYXRhW2tleV0gPSBhcmdzW2luZGV4KytdXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZmlsdGVyc0RhdGFbbmFtZV0gPSBkYXRhXG4gIH1cbiAgcmV0dXJuIGZpbHRlcnNEYXRhXG59XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tbGlzdChcbiAgdi1pZj1cImlzUmVhZHlcIlxuICA6aWQ9XCJkYXRhUGF0aFwiXG4gIDpjbGFzcz1cInNjaGVtYS5jbGFzc1wiXG4gIDpzdHlsZT1cInNjaGVtYS5zdHlsZVwiXG4pXG4gIC5kaXRvLW5hdmlnYXRpb24oXG4gICAgdi1pZj1cInNjb3BlcyB8fCBoYXNQYWdpbmF0aW9uXCJcbiAgKVxuICAgIERpdG9TY29wZXMoXG4gICAgICB2LWlmPVwic2NvcGVzXCJcbiAgICAgIDpxdWVyeT1cInF1ZXJ5XCJcbiAgICAgIDpzY29wZXM9XCJzY29wZXNcIlxuICAgIClcbiAgICAvLy0gV2hlbiB0aGVyZSdzIG9ubHkgcGFnaW5hdGlvbiB3aXRob3V0IHNjb3Blcywgd2UgbmVlZCBhIGdvb2Qgb2wnIHNwYWNlclxuICAgIC8vLSBkaXYsIGZvciB0aGUgbGF5b3V0IG5vdCB0byBicmVhay4uLlxuICAgIC5kaXRvLXNwYWNlcihcbiAgICAgIHYtZWxzZS1pZj1cImhhc1BhZ2luYXRpb25cIlxuICAgIClcbiAgICBEaXRvUGFnaW5hdGlvbihcbiAgICAgIHYtaWY9XCJoYXNQYWdpbmF0aW9uXCJcbiAgICAgIDpxdWVyeT1cInF1ZXJ5XCJcbiAgICAgIDpsaW1pdD1cInBhZ2luYXRlXCJcbiAgICAgIDp0b3RhbD1cInRvdGFsIHx8IDBcIlxuICAgIClcbiAgdGFibGUuZGl0by10YWJsZShcbiAgICA6Y2xhc3M9YHtcbiAgICAgICdkaXRvLXRhYmxlLXNlcGFyYXRvcnMnOiBpc0lubGluZWQsXG4gICAgICAnZGl0by10YWJsZS1sYXJnZXItcGFkZGluZyc6IGhhc0VkaXRCdXR0b25zICYmICFpc0lubGluZWQsXG4gICAgICAnZGl0by10YWJsZS1hbHRlcm5hdGUtY29sb3JzJzogIWlzSW5saW5lZCxcbiAgICAgICdkaXRvLXRhYmxlLWV2ZW4tY291bnQnOiBoYXNFdmVuQ291bnRcbiAgICB9YFxuICApXG4gICAgRGl0b1RhYmxlSGVhZChcbiAgICAgIHYtaWY9XCJjb2x1bW5zXCJcbiAgICAgIDpxdWVyeT1cInF1ZXJ5XCJcbiAgICAgIDpjb2x1bW5zPVwiY29sdW1uc1wiXG4gICAgICA6aGFzRWRpdEJ1dHRvbnM9XCJoYXNFZGl0QnV0dG9uc1wiXG4gICAgKVxuICAgIERpdG9EcmFnZ2FibGUoXG4gICAgICB0YWc9XCJ0Ym9keVwiXG4gICAgICA6bW9kZWxWYWx1ZT1cInVwZGF0ZU9yZGVyKHNvdXJjZVNjaGVtYSwgbGlzdERhdGEsIHBhZ2luYXRpb25SYW5nZSlcIlxuICAgICAgOm9wdGlvbnM9XCJnZXRTb3J0YWJsZU9wdGlvbnMoZmFsc2UpXCJcbiAgICAgIDpkcmFnZ2FibGU9XCJkcmFnZ2FibGVcIlxuICAgICAgQHVwZGF0ZTptb2RlbFZhbHVlPVwidmFsdWUgPT4gKGxpc3REYXRhID0gdmFsdWUpXCJcbiAgICApXG4gICAgICB0cihcbiAgICAgICAgdi1mb3I9XCIoaXRlbSwgaW5kZXgpIGluIGxpc3REYXRhXCJcbiAgICAgICAgOmlkPVwiZ2V0RGF0YVBhdGgoaW5kZXgpXCJcbiAgICAgICAgOmtleT1cImdldEl0ZW1VaWQoc2NoZW1hLCBpdGVtKVwiXG4gICAgICApXG4gICAgICAgIHRlbXBsYXRlKFxuICAgICAgICAgIHYtaWY9XCJjb2x1bW5zXCJcbiAgICAgICAgKVxuICAgICAgICAgIHRlbXBsYXRlKFxuICAgICAgICAgICAgdi1mb3I9XCJjb2x1bW4gaW4gY29sdW1uc1wiXG4gICAgICAgICAgKVxuICAgICAgICAgICAgRGl0b1RhYmxlQ2VsbChcbiAgICAgICAgICAgICAgdi1pZj1cInNob3VsZFJlbmRlcihjb2x1bW4pXCJcbiAgICAgICAgICAgICAgOmtleT1cImNvbHVtbi5uYW1lXCJcbiAgICAgICAgICAgICAgOmNsYXNzPVwiZ2V0Q2VsbENsYXNzKGNvbHVtbilcIlxuICAgICAgICAgICAgICA6Y2VsbD1cImNvbHVtblwiXG4gICAgICAgICAgICAgIDpzY2hlbWE9XCJzY2hlbWFcIlxuICAgICAgICAgICAgICA6ZGF0YVBhdGg9XCJnZXREYXRhUGF0aChpbmRleClcIlxuICAgICAgICAgICAgICA6ZGF0YT1cIml0ZW1cIlxuICAgICAgICAgICAgICA6bWV0YT1cIm5lc3RlZE1ldGFcIlxuICAgICAgICAgICAgICA6c3RvcmU9XCJzdG9yZVwiXG4gICAgICAgICAgICAgIDpuZXN0ZWQ9XCJmYWxzZVwiXG4gICAgICAgICAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkIHx8IGlzTG9hZGluZ1wiXG4gICAgICAgICAgICApXG4gICAgICAgIHRlbXBsYXRlKFxuICAgICAgICAgIHYtZWxzZVxuICAgICAgICApXG4gICAgICAgICAgdGRcbiAgICAgICAgICAgIERpdG9TY2hlbWFJbmxpbmVkKFxuICAgICAgICAgICAgICB2LWlmPVwiaXNJbmxpbmVkXCJcbiAgICAgICAgICAgICAgOmxhYmVsPVwiZ2V0SXRlbUxhYmVsKHNjaGVtYSwgaXRlbSwgeyBpbmRleCwgYXNPYmplY3Q6IHRydWUgfSlcIlxuICAgICAgICAgICAgICA6c2NoZW1hPVwiZ2V0SXRlbUZvcm1TY2hlbWEoc2NoZW1hLCBpdGVtLCBjb250ZXh0KVwiXG4gICAgICAgICAgICAgIDpkYXRhUGF0aD1cImdldERhdGFQYXRoKGluZGV4KVwiXG4gICAgICAgICAgICAgIDpkYXRhPVwiaXRlbVwiXG4gICAgICAgICAgICAgIDptZXRhPVwibmVzdGVkTWV0YVwiXG4gICAgICAgICAgICAgIDpzdG9yZT1cImdldENoaWxkU3RvcmUoaW5kZXgpXCJcbiAgICAgICAgICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWQgfHwgaXNMb2FkaW5nXCJcbiAgICAgICAgICAgICAgOmNvbGxhcHNlZD1cImNvbGxhcHNlZFwiXG4gICAgICAgICAgICAgIDpjb2xsYXBzaWJsZT1cImNvbGxhcHNpYmxlXCJcbiAgICAgICAgICAgICAgOmRlbGV0YWJsZT1cImRlbGV0YWJsZVwiXG4gICAgICAgICAgICAgIDpkcmFnZ2FibGU9XCJkcmFnZ2FibGVcIlxuICAgICAgICAgICAgICA6ZWRpdGFibGU9XCJlZGl0YWJsZVwiXG4gICAgICAgICAgICAgIDplZGl0UGF0aD1cImdldEVkaXRQYXRoKGl0ZW0sIGluZGV4KVwiXG4gICAgICAgICAgICAgIEBkZWxldGU9XCJkZWxldGVJdGVtKGl0ZW0sIGluZGV4KVwiXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBjb21wb25lbnQoXG4gICAgICAgICAgICAgIHYtZWxzZS1pZj1cInNjaGVtYS5jb21wb25lbnRcIlxuICAgICAgICAgICAgICA6aXM9XCJzY2hlbWEuY29tcG9uZW50XCJcbiAgICAgICAgICAgICAgOmRhdGFQYXRoPVwiZ2V0RGF0YVBhdGgoaW5kZXgpXCJcbiAgICAgICAgICAgICAgOmRhdGE9XCJpdGVtXCJcbiAgICAgICAgICAgICAgOm5lc3RlZD1cImZhbHNlXCJcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIHNwYW4oXG4gICAgICAgICAgICAgIHYtZWxzZS1pZj1cInJlbmRlclwiXG4gICAgICAgICAgICAgIHYtaHRtbD1cInJlbmRlcihnZXRDb250ZXh0KGl0ZW0sIGluZGV4KSlcIlxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgc3BhbihcbiAgICAgICAgICAgICAgdi1lbHNlXG4gICAgICAgICAgICAgIHYtaHRtbD1cImdldEl0ZW1MYWJlbChzY2hlbWEsIGl0ZW0sIHsgaW5kZXggfSlcIlxuICAgICAgICAgICAgKVxuICAgICAgICB0ZC5kaXRvLWNlbGwtZWRpdC1idXR0b25zKFxuICAgICAgICAgIHYtaWY9XCJoYXNDZWxsRWRpdEJ1dHRvbnNcIlxuICAgICAgICApXG4gICAgICAgICAgRGl0b0VkaXRCdXR0b25zKFxuICAgICAgICAgICAgOmRlbGV0YWJsZT1cImRlbGV0YWJsZVwiXG4gICAgICAgICAgICA6ZHJhZ2dhYmxlPVwiZHJhZ2dhYmxlXCJcbiAgICAgICAgICAgIDplZGl0YWJsZT1cImVkaXRhYmxlXCJcbiAgICAgICAgICAgIDplZGl0UGF0aD1cImdldEVkaXRQYXRoKGl0ZW0sIGluZGV4KVwiXG4gICAgICAgICAgICA6c2NoZW1hPVwiZ2V0SXRlbUZvcm1TY2hlbWEoc2NoZW1hLCBpdGVtLCBjb250ZXh0KVwiXG4gICAgICAgICAgICA6ZGF0YVBhdGg9XCJnZXREYXRhUGF0aChpbmRleClcIlxuICAgICAgICAgICAgOmRhdGE9XCJpdGVtXCJcbiAgICAgICAgICAgIDptZXRhPVwibmVzdGVkTWV0YVwiXG4gICAgICAgICAgICA6c3RvcmU9XCJnZXRDaGlsZFN0b3JlKGluZGV4KVwiXG4gICAgICAgICAgICBAZGVsZXRlPVwiZGVsZXRlSXRlbShpdGVtLCBpbmRleClcIlxuICAgICAgICAgIClcbiAgICAvLy0gUmVuZGVyIGNyZWF0ZSBidXR0b25zIGluc2lkZSB0YWJsZSB3aGVuIG5vdCBpbiBhIHNpbmdsZSBjb21wb25lbnQgdmlldzpcbiAgICB0Zm9vdChcbiAgICAgIHYtaWY9XCJoYXNMaXN0QnV0dG9ucyAmJiAhc2luZ2xlXCJcbiAgICApXG4gICAgICB0clxuICAgICAgICB0ZC5kaXRvLWNlbGwtZWRpdC1idXR0b25zKDpjb2xzcGFuPVwibnVtQ29sdW1uc1wiKVxuICAgICAgICAgIERpdG9FZGl0QnV0dG9ucyhcbiAgICAgICAgICAgIDpjcmVhdGFibGU9XCJjcmVhdGFibGVcIlxuICAgICAgICAgICAgOmNyZWF0ZVBhdGg9XCJwYXRoXCJcbiAgICAgICAgICAgIDpidXR0b25zPVwiYnV0dG9uU2NoZW1hc1wiXG4gICAgICAgICAgICA6c2NoZW1hPVwic2NoZW1hXCJcbiAgICAgICAgICAgIDpkYXRhUGF0aD1cImRhdGFQYXRoXCJcbiAgICAgICAgICAgIDpkYXRhPVwibGlzdERhdGFcIlxuICAgICAgICAgICAgOm1ldGE9XCJtZXRhXCJcbiAgICAgICAgICAgIDpzdG9yZT1cInN0b3JlXCJcbiAgICAgICAgICApXG4gIC8vLSBSZW5kZXIgY3JlYXRlIGJ1dHRvbnMgb3V0c2lkZSB0YWJsZSB3aGVuIGluIGEgc2luZ2xlIGNvbXBvbmVudCB2aWV3OlxuICBEaXRvRWRpdEJ1dHRvbnMuZGl0by1idXR0b25zLW1haW4uZGl0by1idXR0b25zLWxhcmdlKFxuICAgIHYtaWY9XCJoYXNMaXN0QnV0dG9ucyAmJiBzaW5nbGVcIlxuICAgIDpjcmVhdGFibGU9XCJjcmVhdGFibGVcIlxuICAgIDpjcmVhdGVQYXRoPVwicGF0aFwiXG4gICAgOmJ1dHRvbnM9XCJidXR0b25TY2hlbWFzXCJcbiAgICA6c2NoZW1hPVwic2NoZW1hXCJcbiAgICA6ZGF0YVBhdGg9XCJkYXRhUGF0aFwiXG4gICAgOmRhdGE9XCJsaXN0RGF0YVwiXG4gICAgOm1ldGE9XCJtZXRhXCJcbiAgICA6c3RvcmU9XCJzdG9yZVwiXG4gIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b1R5cGVDb21wb25lbnQgZnJvbSAnLi4vRGl0b1R5cGVDb21wb25lbnQuanMnXG5pbXBvcnQgRGl0b0NvbnRleHQgZnJvbSAnLi4vRGl0b0NvbnRleHQuanMnXG5pbXBvcnQgU291cmNlTWl4aW4gZnJvbSAnLi4vbWl4aW5zL1NvdXJjZU1peGluLmpzJ1xuaW1wb3J0IFNvcnRhYmxlTWl4aW4gZnJvbSAnLi4vbWl4aW5zL1NvcnRhYmxlTWl4aW4uanMnXG5pbXBvcnQge1xuICBnZXRWaWV3RWRpdFBhdGgsXG4gIHJlc29sdmVTY2hlbWFDb21wb25lbnQsXG4gIHJlc29sdmVTY2hlbWFDb21wb25lbnRzXG59IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcbmltcG9ydCB7IGNyZWF0ZUZpbHRlcnNQYW5lbCB9IGZyb20gJy4uL3V0aWxzL2ZpbHRlci5qcydcbmltcG9ydCB7IGFwcGVuZERhdGFQYXRoIH0gZnJvbSAnLi4vdXRpbHMvZGF0YS5qcydcbmltcG9ydCB7IHBpY2tCeSwgZXF1YWxzLCBoeXBoZW5hdGUgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoJ2xpc3QnLCB7XG4gIG1peGluczogW1NvdXJjZU1peGluLCBTb3J0YWJsZU1peGluXSxcbiAgYWxpZ25Cb3R0b206IGZhbHNlLFxuXG4gIGdldFNvdXJjZVR5cGUodHlwZSkge1xuICAgIC8vIE5vIG5lZWQgZm9yIHRyYW5zZm9ybWF0aW9uIGhlcmUuIFNlZSBUeXBlVHJlZUxpc3QgZm9yIGRldGFpbHMuXG4gICAgcmV0dXJuIHR5cGVcbiAgfSxcblxuICBnZXRQYW5lbFNjaGVtYShhcGksIHNjaGVtYSwgZGF0YVBhdGgsIHNjaGVtYUNvbXBvbmVudCkge1xuICAgIGNvbnN0IHsgZmlsdGVycyB9ID0gc2NoZW1hXG4gICAgLy8gU2VlIGlmIHRoaXMgbGlzdCBjb21wb25lbnQgd2FudHMgdG8gZGlzcGxheSBhIGZpbHRlciBwYW5lbCwgYW5kIGlmIHNvLFxuICAgIC8vIGNyZWF0ZSB0aGUgcGFuZWwgc2NoZW1hIGZvciBpdCB0aHJvdWdoIGBnZXRGaWx0ZXJzUGFuZWwoKWAuXG4gICAgaWYgKGZpbHRlcnMpIHtcbiAgICAgIC8vIEF0IHRoZSB0aW1lIG9mIHRoZSBjcmVhdGlvbiBvZiB0aGUgcGFuZWwgc2NoZW1hLCB0aGUgc2NoZW1hQ29tcG9uZW50IGlzXG4gICAgICAvLyBub3QgZmlsbGVkIHlldCwgc28gd2UgY2FuJ3QgZ2V0IHRoZSB0YXJnZXQgY29tcG9uZW50IChkYXRhUGF0aCkgcmlnaHRcbiAgICAgIC8vIGF3YXkuIFVzZSBhIHByb3h5IGFuZCBhIGdldHRlciBpbnN0ZWFkLCB0byBnZXQgYXJvdW5kIHRoaXM6XG4gICAgICBjb25zdCBnZXRMaXN0Q29tcG9uZW50ID0gKCkgPT5cbiAgICAgICAgc2NoZW1hQ29tcG9uZW50LmdldENvbXBvbmVudEJ5RGF0YVBhdGgoXG4gICAgICAgICAgZGF0YVBhdGgsXG4gICAgICAgICAgY29tcG9uZW50ID0+IGNvbXBvbmVudC50eXBlID09PSAnbGlzdCdcbiAgICAgICAgKVxuXG4gICAgICByZXR1cm4gY3JlYXRlRmlsdGVyc1BhbmVsKGFwaSwgZmlsdGVycywgZGF0YVBhdGgsIHtcbiAgICAgICAgLy8gQ3JlYXRlIGEgc2ltcGxlIHByb3h5IHRvIGdldCAvIHNldCB0aGUgcXVlcnksIHNlZSBnZXRGaWx0ZXJzUGFuZWwoKVxuICAgICAgICBnZXQgcXVlcnkoKSB7XG4gICAgICAgICAgcmV0dXJuIGdldExpc3RDb21wb25lbnQoKT8ucXVlcnlcbiAgICAgICAgfSxcbiAgICAgICAgc2V0IHF1ZXJ5KHF1ZXJ5KSB7XG4gICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gZ2V0TGlzdENvbXBvbmVudCgpXG4gICAgICAgICAgY29uc29sZS5sb2coJ3NldCBxdWVyeScsICEhY29tcG9uZW50KVxuICAgICAgICAgIGlmIChjb21wb25lbnQpIHtcbiAgICAgICAgICAgIC8vIEZpbHRlciBvdXQgdW5kZWZpbmVkIHZhbHVlcyBmb3IgY29tcGFyaW5nIHdpdGggZXF1YWxzKClcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlciA9IG9iaiA9PiBwaWNrQnkob2JqLCB2YWx1ZSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICdzZXQgcXVlcnknLFxuICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShmaWx0ZXIocXVlcnkpKSxcbiAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoZmlsdGVyKGNvbXBvbmVudC5xdWVyeSkpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBpZiAoIWVxdWFscyhmaWx0ZXIocXVlcnkpLCBmaWx0ZXIoY29tcG9uZW50LnF1ZXJ5KSkpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2xvYWQgZGF0YScpXG4gICAgICAgICAgICAgIGNvbXBvbmVudC5xdWVyeSA9IHF1ZXJ5XG4gICAgICAgICAgICAgIGNvbXBvbmVudC5sb2FkRGF0YShmYWxzZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgaGFzUGFnaW5hdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnBhZ2luYXRlICYmIHRoaXMudG90YWwgPiB0aGlzLnBhZ2luYXRlXG4gICAgfSxcblxuICAgIGhhc0xpc3RCdXR0b25zKCkge1xuICAgICAgcmV0dXJuICEhKHRoaXMuYnV0dG9uU2NoZW1hcyB8fCB0aGlzLmNyZWF0YWJsZSlcbiAgICB9LFxuXG4gICAgaGFzRWRpdEJ1dHRvbnMoKSB7XG4gICAgICBjb25zdCB7IGxpc3REYXRhIH0gPSB0aGlzXG4gICAgICByZXR1cm4gKFxuICAgICAgICBsaXN0RGF0YS5sZW5ndGggPiAwICYmIChcbiAgICAgICAgICB0aGlzLmVkaXRhYmxlIHx8XG4gICAgICAgICAgdGhpcy5kZWxldGFibGUgfHxcbiAgICAgICAgICB0aGlzLmRyYWdnYWJsZVxuICAgICAgICApXG4gICAgICApXG4gICAgfSxcblxuICAgIGhhc0NlbGxFZGl0QnV0dG9ucygpIHtcbiAgICAgIHJldHVybiAhdGhpcy5pc0lubGluZWQgJiYgdGhpcy5oYXNFZGl0QnV0dG9uc1xuICAgIH0sXG5cbiAgICBoYXNFdmVuQ291bnQoKSB7XG4gICAgICByZXR1cm4gISh0aGlzLmxpc3REYXRhLmxlbmd0aCAlIDIpXG4gICAgfSxcblxuICAgIG51bUNvbHVtbnMoKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAodGhpcy5jb2x1bW5zID8gT2JqZWN0LmtleXModGhpcy5jb2x1bW5zKS5sZW5ndGggOiAxKSArXG4gICAgICAgICh0aGlzLmhhc0NlbGxFZGl0QnV0dG9ucyA/IDEgOiAwKVxuICAgICAgKVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0RGF0YVBhdGgoaW5kZXgpIHtcbiAgICAgIHJldHVybiBhcHBlbmREYXRhUGF0aCh0aGlzLmRhdGFQYXRoLCBpbmRleClcbiAgICB9LFxuXG4gICAgZ2V0RWRpdFBhdGgoaXRlbSwgaW5kZXgpIHtcbiAgICAgIGlmICh0aGlzLmVkaXRhYmxlKSB7XG4gICAgICAgIGNvbnN0IHBhdGggPSBnZXRWaWV3RWRpdFBhdGgodGhpcy5zY2hlbWEsIHRoaXMuY29udGV4dCkgfHwgdGhpcy5wYXRoXG4gICAgICAgIGNvbnN0IGlkID0gdGhpcy5nZXRJdGVtSWQodGhpcy5zY2hlbWEsIGl0ZW0sIGluZGV4KVxuICAgICAgICByZXR1cm4gYCR7cGF0aH0vJHtpZH1gXG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH0sXG5cbiAgICBnZXRDZWxsQ2xhc3MoY29sdW1uKSB7XG4gICAgICByZXR1cm4gYGRpdG8tY2VsbC0ke2h5cGhlbmF0ZShjb2x1bW4ubmFtZSl9YFxuICAgIH0sXG5cbiAgICBnZXRDb250ZXh0KGl0ZW0sIGluZGV4KSB7XG4gICAgICByZXR1cm4gbmV3IERpdG9Db250ZXh0KHRoaXMsIHtcbiAgICAgICAgZGF0YTogaXRlbSxcbiAgICAgICAgdmFsdWU6IGl0ZW0sXG4gICAgICAgIGluZGV4LFxuICAgICAgICBkYXRhUGF0aDogdGhpcy5nZXREYXRhUGF0aChpbmRleClcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIG9uRmlsdGVyRXJyb3JzKGVycm9ycykge1xuICAgICAgY29uc3QgZmlsdGVyc0RhdGFQYXRoID0gYXBwZW5kRGF0YVBhdGgodGhpcy5kYXRhUGF0aCwgJyRmaWx0ZXJzJylcbiAgICAgIGNvbnN0IHBhbmVsID0gdGhpcy5zY2hlbWFDb21wb25lbnQuZ2V0UGFuZWxCeURhdGFQYXRoKGZpbHRlcnNEYXRhUGF0aClcbiAgICAgIGlmIChwYW5lbCkge1xuICAgICAgICBwYW5lbC5zaG93VmFsaWRhdGlvbkVycm9ycyhlcnJvcnMsIHRydWUpXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGFzeW5jIHByb2Nlc3NTY2hlbWEoXG4gICAgYXBpLFxuICAgIHNjaGVtYSxcbiAgICBuYW1lLFxuICAgIHJvdXRlcyxcbiAgICBsZXZlbCxcbiAgICBuZXN0ZWQgPSBmYWxzZSxcbiAgICBmbGF0dGVuID0gZmFsc2UsXG4gICAgcHJvY2VzcyA9IG51bGxcbiAgKSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgcmVzb2x2ZVNjaGVtYUNvbXBvbmVudChzY2hlbWEpLFxuICAgICAgcmVzb2x2ZVNjaGVtYUNvbXBvbmVudHMoc2NoZW1hLmNvbHVtbnMpLFxuICAgICAgU291cmNlTWl4aW4ucHJvY2Vzc1NjaGVtYShcbiAgICAgICAgYXBpLFxuICAgICAgICBzY2hlbWEsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHJvdXRlcyxcbiAgICAgICAgbGV2ZWwsXG4gICAgICAgIG5lc3RlZCxcbiAgICAgICAgZmxhdHRlbixcbiAgICAgICAgcHJvY2Vzc1xuICAgICAgKVxuICAgIF0pXG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1saXN0IHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuXG4gIC5kaXRvLW5hdmlnYXRpb24ge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgIHBhZGRpbmctYm90dG9tOiAkY29udGVudC1wYWRkaW5nLWhhbGY7XG4gICAgQGluY2x1ZGUgdXNlci1zZWxlY3Qobm9uZSk7XG5cbiAgICAmOmVtcHR5IHtcbiAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuXG4gICAgLmRpdG8tc2NvcGVzLFxuICAgIC5kaXRvLXBhZ2luYXRpb24ge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXg6IDAgMSBhdXRvO1xuICAgICAgbWluLXdpZHRoOiAwO1xuICAgIH1cbiAgfVxuXG4gICYuZGl0by1zaW5nbGUge1xuICAgIC8vIFNvIHRoYXQgbGlzdCBidXR0b25zIGNhbiBiZSBzdGlja3kgdG8gdGhlIGJvdHRvbTpcbiAgICBkaXNwbGF5OiBncmlkO1xuICAgIGdyaWQtdGVtcGxhdGUtcm93czogbWluLWNvbnRlbnQ7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbkRpdG9MYWJlbC5kaXRvLWxhYmVsLWNvbXBvbmVudChcbiAgOmxhYmVsPVwidmFsdWVcIlxuICA6ZGF0YVBhdGg9XCJkYXRhUGF0aFwiXG4pXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoJ2xhYmVsJywge1xuICBleGNsdWRlVmFsdWU6IHRydWUsXG4gIGdlbmVyYXRlTGFiZWw6IGZhbHNlLFxuICBhbGlnbkJvdHRvbTogZmFsc2Vcbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG4uZGl0by1sYWJlbC1jb21wb25lbnQge1xuICBkaXNwbGF5OiBmbGV4O1xuICBoZWlnaHQ6IDJlbTtcbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tbWFya3VwKDppZD1cImRhdGFQYXRoXCIpXG4gIC5kaXRvLW1hcmt1cC10b29sYmFyKDplZGl0b3I9XCJlZGl0b3JcIilcbiAgICAuZGl0by1idXR0b25zLmRpdG8tYnV0dG9ucy10b29sYmFyKFxuICAgICAgdi1pZj1cImdyb3VwZWRCdXR0b25zLmxlbmd0aCA+IDBcIlxuICAgIClcbiAgICAgIC5kaXRvLWJ1dHRvbi1ncm91cChcbiAgICAgICAgdi1mb3I9XCJidXR0b25zIGluIGdyb3VwZWRCdXR0b25zXCJcbiAgICAgIClcbiAgICAgICAgYnV0dG9uLmRpdG8tYnV0dG9uKFxuICAgICAgICAgIHYtZm9yPVwieyBuYW1lLCBpY29uLCBpc0FjdGl2ZSwgb25DbGljayB9IGluIGJ1dHRvbnNcIlxuICAgICAgICAgIDprZXk9XCJuYW1lXCJcbiAgICAgICAgICA6Y2xhc3M9XCJ7ICdkaXRvLWFjdGl2ZSc6IGlzQWN0aXZlIH1cIlxuICAgICAgICAgIEBjbGljaz1cIm9uQ2xpY2tcIlxuICAgICAgICApXG4gICAgICAgICAgSWNvbig6bmFtZT1cImljb25cIilcbiAgRWRpdG9yQ29udGVudC5kaXRvLW1hcmt1cC1lZGl0b3IoXG4gICAgcmVmPVwiZWRpdG9yXCJcbiAgICA6ZWRpdG9yPVwiZWRpdG9yXCJcbiAgICA6c3R5bGU9XCJzdHlsZXNcIlxuICApXG4gIC5kaXRvLXJlc2l6ZShcbiAgICB2LWlmPVwicmVzaXphYmxlXCJcbiAgICBAbW91c2Vkb3duLnN0b3AucHJldmVudD1cIm9uRHJhZ1Jlc2l6ZVwiXG4gIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b1R5cGVDb21wb25lbnQgZnJvbSAnLi4vRGl0b1R5cGVDb21wb25lbnQuanMnXG5pbXBvcnQgRG9tTWl4aW4gZnJvbSAnLi4vbWl4aW5zL0RvbU1peGluLmpzJ1xuaW1wb3J0IHsgZ2V0U2NoZW1hQWNjZXNzb3IgfSBmcm9tICcuLi91dGlscy9hY2Nlc3Nvci5qcydcbmltcG9ydCB7IEVkaXRvciwgRWRpdG9yQ29udGVudCwgTWFyaywgZ2V0TWFya0F0dHJpYnV0ZXMgfSBmcm9tICdAdGlwdGFwL3Z1ZS0zJ1xuLy8gaW1wb3J0IHsgdG9nZ2xlTWFyayB9IGZyb20gJ3RpcHRhcC1jb21tYW5kcydcbi8vIEVzc2VudGlhbHM6XG5pbXBvcnQgeyBEb2N1bWVudCB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLWRvY3VtZW50J1xuaW1wb3J0IHsgVGV4dCB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLXRleHQnXG4vLyBNYXJrczpcbmltcG9ydCB7IEJvbGQgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi1ib2xkJ1xuaW1wb3J0IHsgQ29kZSB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLWNvZGUnXG5pbXBvcnQgeyBJdGFsaWMgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi1pdGFsaWMnXG5pbXBvcnQgeyBMaW5rIH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24tbGluaydcbmltcG9ydCB7IFN0cmlrZSB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLXN0cmlrZSdcbmltcG9ydCB7IFVuZGVybGluZSB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLXVuZGVybGluZSdcbi8vIE5vZGVzOlxuaW1wb3J0IHsgQmxvY2txdW90ZSB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLWJsb2NrcXVvdGUnXG5pbXBvcnQgeyBDb2RlQmxvY2sgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi1jb2RlLWJsb2NrJ1xuaW1wb3J0IHsgSGFyZEJyZWFrIH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24taGFyZC1icmVhaydcbmltcG9ydCB7IEhlYWRpbmcgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi1oZWFkaW5nJ1xuaW1wb3J0IHsgUGFyYWdyYXBoIH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24tcGFyYWdyYXBoJ1xuaW1wb3J0IHsgSG9yaXpvbnRhbFJ1bGUgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi1ob3Jpem9udGFsLXJ1bGUnXG5pbXBvcnQgeyBPcmRlcmVkTGlzdCB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLW9yZGVyZWQtbGlzdCdcbmltcG9ydCB7IEJ1bGxldExpc3QgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi1idWxsZXQtbGlzdCdcbmltcG9ydCB7IExpc3RJdGVtIH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24tbGlzdC1pdGVtJ1xuLy8gVE9ETzpcbi8vIGltcG9ydCB7IEltYWdlIH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24taW1hZ2UnXG4vLyBpbXBvcnQgeyBNZW50aW9uIH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24tbWVudGlvbidcbi8vIGltcG9ydCB7IENvZGVCbG9ja0hpZ2hsaWdodCB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLWNvZGUtYmxvY2staGlnaGxpZ2h0J1xuLy8gaW1wb3J0IHsgVGFibGUgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi10YWJsZSdcbi8vIGltcG9ydCB7IFRhYmxlQ2VsbCB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLXRhYmxlLWNlbGwnXG4vLyBpbXBvcnQgeyBUYWJsZUhlYWRlciB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLXRhYmxlLWhlYWRlcidcbi8vIGltcG9ydCB7IFRhYmxlTm9kZXMgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi10YWJsZS1ub2Rlcydcbi8vIGltcG9ydCB7IFRhYmxlUm93IH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24tdGFibGUtcm93J1xuLy8gaW1wb3J0IHsgVGFza0xpc3QgfSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi10YXNrLWxpc3QnXG4vLyBpbXBvcnQgeyBUYXNrSXRlbSB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLXRhc2staXRlbSdcbi8vIFRvb2xzOlxuaW1wb3J0IHsgSGlzdG9yeSB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLWhpc3RvcnknXG5cbmltcG9ydCB7IEljb24gfSBmcm9tICdAZGl0b2pzL3VpL3NyYydcbmltcG9ydCB7XG4gIGlzQXJyYXksXG4gIGlzT2JqZWN0LFxuICB1bmRlcnNjb3JlLFxuICBoeXBoZW5hdGUsXG4gIGRlYm91bmNlLFxuICBjYW1lbGl6ZVxufSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoJ21hcmt1cCcsIHtcbiAgbWl4aW5zOiBbRG9tTWl4aW5dLFxuICBjb21wb25lbnRzOiB7XG4gICAgRWRpdG9yQ29udGVudCxcbiAgICBJY29uXG4gIH0sXG5cbiAgYWxpZ25Cb3R0b206IGZhbHNlLFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVkaXRvcjogbnVsbCxcbiAgICAgIGhlaWdodDogbnVsbFxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGxpbmVzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hLmxpbmVzIHx8IDEwXG4gICAgfSxcblxuICAgIHN0eWxlcygpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGhlaWdodDogdGhpcy5oZWlnaHQgfHwgYGNhbGMoJHt0aGlzLmxpbmVzfWVtICogdmFyKC0tbGluZS1oZWlnaHQpKWBcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgbWFya0J1dHRvbnMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRCdXR0b25zKCdtYXJrcycsIHtcbiAgICAgICAgYm9sZDogdHJ1ZSxcbiAgICAgICAgaXRhbGljOiB0cnVlLFxuICAgICAgICB1bmRlcmxpbmU6IHRydWUsXG4gICAgICAgIHN0cmlrZTogdHJ1ZSxcbiAgICAgICAgc21hbGw6IHRydWUsXG4gICAgICAgIGNvZGU6IHRydWUsXG4gICAgICAgIGxpbms6IHtcbiAgICAgICAgICBvbkNsaWNrOiBlZGl0b3IgPT4gdGhpcy5vbkNsaWNrTGluayhlZGl0b3IpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGJhc2ljTm9kZUJ1dHRvbnMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRCdXR0b25zKCdub2RlcycsIHtcbiAgICAgICAgcGFyYWdyYXBoOiB7XG4gICAgICAgICAgLy8gRG8gbm90IHNob3cgdGhlIHBhcmFncmFwaCBjb21tYW5kIGFzIGFjdGl2ZSBpZiBhbnkgb2YgdGhlIGJsb2NrXG4gICAgICAgICAgLy8gY29tbWFuZHMgYXJlIGFsc28gYWN0aXZlOlxuICAgICAgICAgIGlnbm9yZUFjdGl2ZTogKCkgPT5cbiAgICAgICAgICAgIHRoaXMub3RoZXJOb2RlQnV0dG9ucy5zb21lKGJ1dHRvbiA9PiBidXR0b24uaXNBY3RpdmUpXG4gICAgICAgIH0sXG4gICAgICAgIGhlYWRpbmc6IHtcbiAgICAgICAgICBhdHRyaWJ1dGU6ICdsZXZlbCcsXG4gICAgICAgICAgdmFsdWVzOiBbMSwgMiwgMywgNCwgNSwgNl1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgb3RoZXJOb2RlQnV0dG9ucygpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldEJ1dHRvbnMoJ25vZGVzJywge1xuICAgICAgICBidWxsZXRMaXN0OiB0cnVlLFxuICAgICAgICBvcmRlcmVkTGlzdDogdHJ1ZSxcbiAgICAgICAgYmxvY2txdW90ZTogdHJ1ZSxcbiAgICAgICAgY29kZUJsb2NrOiB0cnVlXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICB0b29sQnV0dG9ucygpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldEJ1dHRvbnMoJ3Rvb2xzJywge1xuICAgICAgICB1bmRvOiB0cnVlLFxuICAgICAgICByZWRvOiB0cnVlXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBncm91cGVkQnV0dG9ucygpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbWFya0J1dHRvbnMsXG4gICAgICAgIGJhc2ljTm9kZUJ1dHRvbnMsXG4gICAgICAgIG90aGVyTm9kZUJ1dHRvbnMsXG4gICAgICAgIHRvb2xCdXR0b25zXG4gICAgICB9ID0gdGhpc1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgbWFya0J1dHRvbnMsXG4gICAgICAgIGJhc2ljTm9kZUJ1dHRvbnMsXG4gICAgICAgIG90aGVyTm9kZUJ1dHRvbnMsXG4gICAgICAgIHRvb2xCdXR0b25zXG4gICAgICBdLmZpbHRlcihidXR0b25zID0+IGJ1dHRvbnMubGVuZ3RoID4gMClcbiAgICB9LFxuXG4gICAgcGFyc2VPcHRpb25zKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcHJlc2VydmVXaGl0ZXNwYWNlOiB7XG4gICAgICAgICAgJ2NvbGxhcHNlJzogZmFsc2UsXG4gICAgICAgICAgJ3ByZXNlcnZlJzogdHJ1ZSxcbiAgICAgICAgICAncHJlc2VydmUtYWxsJzogJ2Z1bGwnXG4gICAgICAgIH1bdGhpcy53aGl0ZXNwYWNlXVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBlZGl0b3JPcHRpb25zKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZWRpdGFibGU6ICF0aGlzLnJlYWR5b25seSxcbiAgICAgICAgYXV0b0ZvY3VzOiB0aGlzLmF1dG9mb2N1cyxcbiAgICAgICAgZGlzYWJsZUlucHV0UnVsZXM6ICF0aGlzLmVuYWJsZVJ1bGVzLmlucHV0LFxuICAgICAgICBkaXNhYmxlUGFzdGVSdWxlczogIXRoaXMuZW5hYmxlUnVsZXMucGFzdGUsXG4gICAgICAgIHBhcnNlT3B0aW9uczogdGhpcy5wYXJzZU9wdGlvbnNcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgcmVzaXphYmxlOiBnZXRTY2hlbWFBY2Nlc3NvcigncmVzaXphYmxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSksXG5cbiAgICB3aGl0ZXNwYWNlOiBnZXRTY2hlbWFBY2Nlc3Nvcignd2hpdGVzcGFjZScsIHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICdjb2xsYXBzZSdcbiAgICAgIC8vIFBvc3NpYmxlIHZhbHVlcyBhcmU6ICdjb2xsYXBzZScsICdwcmVzZXJ2ZScsICdwcmVzZXJ2ZS1hbGwnXG4gICAgfSksXG5cbiAgICBlbmFibGVSdWxlczogZ2V0U2NoZW1hQWNjZXNzb3IoJ2VuYWJsZVJ1bGVzJywge1xuICAgICAgdHlwZTogW09iamVjdCwgQm9vbGVhbl0sXG4gICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgIGdldChlbmFibGVSdWxlcykge1xuICAgICAgICByZXR1cm4gaXNPYmplY3QoZW5hYmxlUnVsZXMpXG4gICAgICAgICAgPyBlbmFibGVSdWxlc1xuICAgICAgICAgIDoge1xuICAgICAgICAgICAgICBpbnB1dDogISFlbmFibGVSdWxlcyxcbiAgICAgICAgICAgICAgcGFzdGU6ICEhZW5hYmxlUnVsZXNcbiAgICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgcmVhZHlvbmx5OiAndXBkYXRlRWRpdG9yT3B0aW9ucycsXG4gICAgYXV0b2ZvY3VzOiAndXBkYXRlRWRpdG9yT3B0aW9ucycsXG4gICAgZW5hYmxlUnVsZXM6ICd1cGRhdGVFZGl0b3JPcHRpb25zJ1xuICB9LFxuXG4gIGNyZWF0ZWQoKSB7XG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZVxuICAgIGxldCBpZ25vcmVXYXRjaCA9IGZhbHNlXG5cbiAgICBjb25zdCBvbkNoYW5nZSA9ICgpID0+IHtcbiAgICAgIGlmICghdGhpcy5mb2N1c2VkICYmIGNoYW5nZWQpIHtcbiAgICAgICAgY2hhbmdlZCA9IGZhbHNlXG4gICAgICAgIHRoaXMub25DaGFuZ2UoKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG9uRm9jdXMgPSAoKSA9PiB0aGlzLm9uRm9jdXMoKVxuXG4gICAgY29uc3Qgb25CbHVyID0gKCkgPT4ge1xuICAgICAgdGhpcy5vbkJsdXIoKVxuICAgICAgb25DaGFuZ2UoKVxuICAgIH1cblxuICAgIGNvbnN0IHNldFZhbHVlRGVib3VuY2VkID0gZGVib3VuY2UoZWRpdG9yID0+IHtcbiAgICAgIGlnbm9yZVdhdGNoID0gdHJ1ZVxuICAgICAgdGhpcy52YWx1ZSA9IGVkaXRvci5nZXRIVE1MKClcbiAgICAgIGNoYW5nZWQgPSB0cnVlXG4gICAgICBvbkNoYW5nZSgpXG4gICAgfSwgMTAwKVxuXG4gICAgY29uc3Qgb25VcGRhdGUgPSAoeyBlZGl0b3IgfSkgPT4ge1xuICAgICAgc2V0VmFsdWVEZWJvdW5jZWQoZWRpdG9yKVxuICAgICAgdGhpcy5vbklucHV0KClcbiAgICB9XG5cbiAgICB0aGlzLiR3YXRjaCgndmFsdWUnLCB2YWx1ZSA9PiB7XG4gICAgICBpZiAoaWdub3JlV2F0Y2gpIHtcbiAgICAgICAgaWdub3JlV2F0Y2ggPSBmYWxzZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5lZGl0b3Iuc2V0Q29udGVudCh2YWx1ZSwgZmFsc2UsIHRoaXMucGFyc2VPcHRpb25zKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICB0aGlzLmVkaXRvciA9IG5ldyBFZGl0b3Ioe1xuICAgICAgLi4udGhpcy5lZGl0b3JPcHRpb25zLFxuICAgICAgb25Gb2N1cyxcbiAgICAgIG9uQmx1cixcbiAgICAgIG9uVXBkYXRlLFxuICAgICAgZXh0ZW5zaW9uczogdGhpcy5nZXRFeHRlbnNpb25zKCksXG4gICAgICBjb250ZW50OiB0aGlzLnZhbHVlIHx8ICcnXG4gICAgfSlcbiAgfSxcblxuICB1bm1vdW50ZWQoKSB7XG4gICAgdGhpcy5lZGl0b3IuZGVzdHJveSgpXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIG9uRHJhZ1Jlc2l6ZShldmVudCkge1xuICAgICAgY29uc3QgZ2V0UG9pbnQgPSAoeyBjbGllbnRYOiB4LCBjbGllbnRZOiB5IH0pID0+ICh7IHgsIHkgfSlcblxuICAgICAgbGV0IHByZXZZID0gZ2V0UG9pbnQoZXZlbnQpLnlcbiAgICAgIGxldCBoZWlnaHQgPSBwYXJzZUZsb2F0KGdldENvbXB1dGVkU3R5bGUodGhpcy4kcmVmcy5lZGl0b3IuJGVsKS5oZWlnaHQpXG5cbiAgICAgIGNvbnN0IG1vdXNlbW92ZSA9IGV2ZW50ID0+IHtcbiAgICAgICAgY29uc3QgeyB5IH0gPSBnZXRQb2ludChldmVudClcbiAgICAgICAgaGVpZ2h0ICs9IHkgLSBwcmV2WVxuICAgICAgICBwcmV2WSA9IHlcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBgJHtNYXRoLm1heChoZWlnaHQsIDApfXB4YFxuICAgICAgfVxuXG4gICAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMuZG9tT24oZG9jdW1lbnQsIHtcbiAgICAgICAgbW91c2Vtb3ZlLFxuXG4gICAgICAgIG1vdXNldXAoZXZlbnQpIHtcbiAgICAgICAgICBtb3VzZW1vdmUoZXZlbnQpXG4gICAgICAgICAgaGFuZGxlcnMucmVtb3ZlKClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgdXBkYXRlRWRpdG9yT3B0aW9ucygpIHtcbiAgICAgIHRoaXMuZWRpdG9yLnNldE9wdGlvbnModGhpcy5lZGl0b3JPcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBvbkNsaWNrTGluayhlZGl0b3IpIHtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBhd2FpdCB0aGlzLnJvb3RDb21wb25lbnQuc2hvd0RpYWxvZyh7XG4gICAgICAgIGNvbXBvbmVudHM6IHtcbiAgICAgICAgICBocmVmOiB7XG4gICAgICAgICAgICB0eXBlOiAndXJsJyxcbiAgICAgICAgICAgIGxhYmVsOiAnTGluaycsXG4gICAgICAgICAgICBhdXRvZm9jdXM6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRpdGxlOiB7XG4gICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICBsYWJlbDogJ1RpdGxlJ1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgYnV0dG9uczoge1xuICAgICAgICAgIGNhbmNlbDoge30sXG4gICAgICAgICAgYXBwbHk6IHsgdHlwZTogJ3N1Ym1pdCcgfSxcbiAgICAgICAgICByZW1vdmU6IHtcbiAgICAgICAgICAgIGV2ZW50czoge1xuICAgICAgICAgICAgICBjbGljayh7IGRpYWxvZ0NvbXBvbmVudCB9KSB7XG4gICAgICAgICAgICAgICAgZGlhbG9nQ29tcG9uZW50LnJlc29sdmUobnVsbClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZGF0YTogZ2V0TWFya0F0dHJpYnV0ZXModGhpcy5lZGl0b3Iuc3RhdGUsICdsaW5rJylcbiAgICAgIH0pXG4gICAgICBpZiAoYXR0cmlidXRlcykge1xuICAgICAgICBsZXQgeyBocmVmLCB0aXRsZSB9ID0gYXR0cmlidXRlc1xuICAgICAgICBpZiAoaHJlZikge1xuICAgICAgICAgIC8vIFNlZSBpZiBgaHJlZmAgY2FuIGJlIHBhcnNlZCBhcyBhIFVSTCwgYW5kIGlmIG5vdCxcbiAgICAgICAgICAvLyBwcmVmaXggaXQgd2l0aCBhIGRlZmF1bHQgcHJvdG9jb2wuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXdcbiAgICAgICAgICAgIG5ldyBVUkwoaHJlZilcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIGhyZWYgPSBgaHR0cHM6Ly8ke2hyZWZ9YFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlZGl0b3IuY29tbWFuZHMuc2V0TGluayh7IGhyZWYsIHRpdGxlIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlZGl0b3IuY29tbWFuZHMudW5zZXRMaW5rKClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZ2V0RXh0ZW5zaW9ucygpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbWFya3MgPSB7fSxcbiAgICAgICAgbm9kZXMgPSB7fSxcbiAgICAgICAgdG9vbHMgPSB7fVxuICAgICAgfSA9IHRoaXMuc2NoZW1hXG4gICAgICByZXR1cm4gW1xuICAgICAgICAvLyBFc3NlbnRpYWxzOlxuICAgICAgICBEb2N1bWVudCxcbiAgICAgICAgVGV4dCxcbiAgICAgICAgUGFyYWdyYXBoLCAvLyBidXR0b24gY2FuIGJlIGNvbnRyb2xsZWQsIGJ1dCBub2RlIG5lZWRzIHRvIGJlIG9uLlxuXG4gICAgICAgIC8vIE1hcmtzOiBgc2NoZW1hLm1hcmtzYFxuICAgICAgICBtYXJrcy5ib2xkICYmIEJvbGQsXG4gICAgICAgIG1hcmtzLml0YWxpYyAmJiBJdGFsaWMsXG4gICAgICAgIG1hcmtzLnVuZGVybGluZSAmJiBVbmRlcmxpbmUsXG4gICAgICAgIG1hcmtzLnN0cmlrZSAmJiBTdHJpa2UsXG4gICAgICAgIG1hcmtzLnNtYWxsICYmIFNtYWxsLFxuICAgICAgICBtYXJrcy5jb2RlICYmIENvZGUsXG4gICAgICAgIG1hcmtzLmxpbmsgJiYgTGlua1dpdGhUaXRsZSxcblxuICAgICAgICAvLyBOb2RlczogYHNjaGVtYS5ub2Rlc2BcbiAgICAgICAgbm9kZXMuYmxvY2txdW90ZSAmJiBCbG9ja3F1b3RlLFxuICAgICAgICBub2Rlcy5jb2RlQmxvY2sgJiYgQ29kZUJsb2NrLFxuICAgICAgICBIYXJkQnJlYWssIC8vIFRPRE86IFNob3VsZCB0aGlzIGFsd2F5cyBvbj9cbiAgICAgICAgbm9kZXMuaGVhZGluZyAmJiBIZWFkaW5nLmNvbmZpZ3VyZSh7IGxldmVsczogbm9kZXMuaGVhZGluZyB9KSxcbiAgICAgICAgbm9kZXMuaG9yaXpvbnRhbFJ1bGUgJiYgSG9yaXpvbnRhbFJ1bGUsXG4gICAgICAgIChub2Rlcy5vcmRlcmVkTGlzdCB8fCBub2Rlcy5idWxsZXRMaXN0KSAmJiBMaXN0SXRlbSxcbiAgICAgICAgbm9kZXMuYnVsbGV0TGlzdCAmJiBCdWxsZXRMaXN0LFxuICAgICAgICBub2Rlcy5vcmRlcmVkTGlzdCAmJiBPcmRlcmVkTGlzdCxcbiAgICAgICAgLy8gVE9ETzpcbiAgICAgICAgLy8gbm9kZXMudG9kb0xpc3QgJiYgVG9kb0l0ZW0sXG4gICAgICAgIC8vIG5vZGVzLnRvZG9MaXN0ICYmIFRvZG9MaXN0LFxuXG4gICAgICAgIC8vIFRvb2xzOiBgc2NoZW1hLnRvb2xzYFxuICAgICAgICB0b29scy5oaXN0b3J5ICYmIEhpc3RvcnlcbiAgICAgIF0uZmlsdGVyKGV4dGVuc2lvbiA9PiAhIWV4dGVuc2lvbilcbiAgICB9LFxuXG4gICAgZ2V0QnV0dG9ucyhzZXR0aW5nc05hbWUsIGRlc2NyaXB0aW9ucykge1xuICAgICAgY29uc3QgbGlzdCA9IFtdXG5cbiAgICAgIGNvbnN0IGFkZEJ1dHRvbiA9ICh7IG5hbWUsIGljb24sIGF0dHJpYnV0ZXMsIGlnbm9yZUFjdGl2ZSwgb25DbGljayB9KSA9PiB7XG4gICAgICAgIGxpc3QucHVzaCh7XG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBpY29uLFxuICAgICAgICAgIGlzQWN0aXZlOiAoXG4gICAgICAgICAgICB0aGlzLmVkaXRvci5pc0FjdGl2ZShuYW1lLCBhdHRyaWJ1dGVzKSAmJlxuICAgICAgICAgICAgKGlnbm9yZUFjdGl2ZSA9PSBudWxsIHx8ICFpZ25vcmVBY3RpdmUoKSlcbiAgICAgICAgICApLFxuICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGB0b2dnbGUke2NhbWVsaXplKG5hbWUsIHRydWUpfWBcbiAgICAgICAgICAgIGlmICh0aGlzLmVkaXRvci5jb21tYW5kc1trZXldKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNvbW1hbmQgPSBhdHRyaWJ1dGVzID0+XG4gICAgICAgICAgICAgICAgdGhpcy5lZGl0b3IuY2hhaW4oKVtrZXldKGF0dHJpYnV0ZXMpLmZvY3VzKCkucnVuKClcbiAgICAgICAgICAgICAgb25DbGlja1xuICAgICAgICAgICAgICAgID8gb25DbGljayh0aGlzLmVkaXRvciwgYXR0cmlidXRlcylcbiAgICAgICAgICAgICAgICA6IGNvbW1hbmQoYXR0cmlidXRlcylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5zY2hlbWFbc2V0dGluZ3NOYW1lXVxuICAgICAgaWYgKHNldHRpbmdzKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgZGVzY3JpcHRpb25dIG9mIE9iamVjdC5lbnRyaWVzKGRlc2NyaXB0aW9ucykpIHtcbiAgICAgICAgICBjb25zdCBzZXR0aW5nTmFtZSA9IFsndW5kbycsICdyZWRvJ10uaW5jbHVkZXMoa2V5KSA/ICdoaXN0b3J5JyA6IGtleVxuICAgICAgICAgIGNvbnN0IHNldHRpbmcgPSBzZXR0aW5nc1tzZXR0aW5nTmFtZV1cbiAgICAgICAgICBjb25zdCBuYW1lID0gdW5kZXJzY29yZShrZXkpXG4gICAgICAgICAgY29uc3QgaWNvbiA9IGh5cGhlbmF0ZShrZXkpXG4gICAgICAgICAgaWYgKHNldHRpbmcpIHtcbiAgICAgICAgICAgIGlmIChkZXNjcmlwdGlvbiA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICBhZGRCdXR0b24oeyBuYW1lLCBpY29uIH0pXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KGRlc2NyaXB0aW9uKSkge1xuICAgICAgICAgICAgICBjb25zdCB7IGF0dHJpYnV0ZSwgdmFsdWVzLCBpZ25vcmVBY3RpdmUsIG9uQ2xpY2sgfSA9IGRlc2NyaXB0aW9uXG4gICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNBcnJheSh2YWx1ZXMpICYmIGlzQXJyYXkoc2V0dGluZykpIHtcbiAgICAgICAgICAgICAgICAgIC8vIFN1cHBvcnQgaGVhZGluZyBsZXZlbCBhdHRyczpcbiAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZXR0aW5nLmluY2x1ZGVzKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgIGFkZEJ1dHRvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogYCR7aWNvbn0tJHt2YWx1ZX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlczogeyBbYXR0cmlidXRlXTogdmFsdWUgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZUFjdGl2ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2tcbiAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGFkZEJ1dHRvbih7IG5hbWUsIGljb24sIGlnbm9yZUFjdGl2ZSwgb25DbGljayB9KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbGlzdFxuICAgIH0sXG5cbiAgICBmb2N1c0VsZW1lbnQoKSB7XG4gICAgICB0aGlzLiRlbC5zY3JvbGxJbnRvVmlldz8uKClcbiAgICAgIHRoaXMuZWRpdG9yLmZvY3VzKClcbiAgICB9XG4gIH1cbn0pXG5cbmNvbnN0IFNtYWxsID0gTWFyay5jcmVhdGUoe1xuICBuYW1lOiAnc21hbGwnLFxuXG4gIHBhcnNlSFRNTCgpIHtcbiAgICByZXR1cm4gW3sgdGFnOiAnc21hbGwnIH1dXG4gIH0sXG5cbiAgcmVuZGVySFRNTCgpIHtcbiAgICByZXR1cm4gWydzbWFsbCcsIDBdXG4gIH0sXG5cbiAgYWRkQ29tbWFuZHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNldFNtYWxsOlxuICAgICAgICBhdHRyaWJ1dGVzID0+XG4gICAgICAgICh7IGNvbW1hbmRzIH0pID0+IHtcbiAgICAgICAgICByZXR1cm4gY29tbWFuZHMuc2V0TWFyayh0aGlzLm5hbWUsIGF0dHJpYnV0ZXMpXG4gICAgICAgIH0sXG4gICAgICB0b2dnbGVTbWFsbDpcbiAgICAgICAgYXR0cmlidXRlcyA9PlxuICAgICAgICAoeyBjb21tYW5kcyB9KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGNvbW1hbmRzLnRvZ2dsZU1hcmsodGhpcy5uYW1lLCBhdHRyaWJ1dGVzKVxuICAgICAgICB9LFxuICAgICAgdW5zZXRTbWFsbDpcbiAgICAgICAgKCkgPT5cbiAgICAgICAgKHsgY29tbWFuZHMgfSkgPT4ge1xuICAgICAgICAgIHJldHVybiBjb21tYW5kcy51bnNldE1hcmsodGhpcy5uYW1lKVxuICAgICAgICB9XG4gICAgfVxuICB9XG59KVxuXG5jb25zdCBMaW5rV2l0aFRpdGxlID0gTGluay5leHRlbmQoe1xuICBpbmNsdXNpdmU6IGZhbHNlLFxuICBzY2hlbWE6IHtcbiAgICBhdHRyczoge1xuICAgICAgaHJlZjoge1xuICAgICAgICBkZWZhdWx0OiBudWxsXG4gICAgICB9LFxuICAgICAgdGl0bGU6IHtcbiAgICAgICAgZGVmYXVsdDogbnVsbFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBwYXJzZUhUTUwoKSB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICB7XG4gICAgICAgICAgdGFnOiAnYScsXG4gICAgICAgICAgZ2V0QXR0cnM6IGVsZW1lbnQgPT4gKHtcbiAgICAgICAgICAgIGhyZWY6IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdocmVmJyksXG4gICAgICAgICAgICB0aXRsZTogZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3RpdGxlJylcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSxcblxuICAgIHJlbmRlckhUTUwobm9kZSkge1xuICAgICAgcmV0dXJuIFsnYScsIG5vZGUuYXR0cnMsIDBdXG4gICAgfVxuICB9XG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tbWFya3VwIHtcbiAgQGV4dGVuZCAlaW5wdXQ7XG5cbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuXG4gIC5kaXRvLXJlc2l6ZSB7XG4gICAgQGV4dGVuZCAlaWNvbi1yZXNpemU7XG5cbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiB1bnNldDtcbiAgICBsZWZ0OiB1bnNldDtcbiAgICByaWdodDogMDtcbiAgICBib3R0b206IDA7XG4gICAgd2lkdGg6IDFlbTtcbiAgICBoZWlnaHQ6IDFlbTtcbiAgfVxuXG4gIC5Qcm9zZU1pcnJvciB7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIG91dGxpbmU6IG5vbmU7XG4gIH1cblxuICAuZGl0by1tYXJrdXAtZWRpdG9yIHtcbiAgICBvdmVyZmxvdy15OiBzY3JvbGw7XG4gICAgLy8gTW92ZSBwYWRkaW5nIFwiaW5zaWRlXCIgZWRpdG9yIHRvIGNvcnJlY3RseSBwb3NpdGlvbiBzY3JvbGxiYXJcbiAgICBtYXJnaW4tcmlnaHQ6IC0kaW5wdXQtcGFkZGluZy1ob3I7XG4gICAgcGFkZGluZy1yaWdodDogJGlucHV0LXBhZGRpbmctaG9yO1xuICB9XG5cbiAgLmRpdG8tYnV0dG9ucy10b29sYmFyIHtcbiAgICBtYXJnaW46ICRpbnB1dC1wYWRkaW5nLXZlciAwO1xuICB9XG5cbiAgaDEsXG4gIGgyLFxuICBoMyxcbiAgcCxcbiAgdWwsXG4gIG9sLFxuICBwcmUsXG4gIGJsb2NrcXVvdGUge1xuICAgIG1hcmdpbjogMXJlbSAwO1xuXG4gICAgJjpmaXJzdC1jaGlsZCB7XG4gICAgICBtYXJnaW4tdG9wOiAwO1xuICAgIH1cblxuICAgICY6bGFzdC1jaGlsZCB7XG4gICAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgIH1cbiAgfVxuXG4gIGgxLFxuICBoMixcbiAgaDMge1xuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xuICB9XG5cbiAgaDEge1xuICAgIGZvbnQtc2l6ZTogMS40cmVtO1xuICB9XG5cbiAgaDIge1xuICAgIGZvbnQtc2l6ZTogMS4ycmVtO1xuICB9XG5cbiAgdWwge1xuICAgIGxpc3Qtc3R5bGU6IGRpc2M7XG4gIH1cblxuICBjb2RlIHtcbiAgICBmb250LWZhbWlseTogJGZvbnQtZmFtaWx5LW1vbm87XG4gIH1cblxuICBwcmUge1xuICAgIHBhZGRpbmc6IDAuN3JlbSAxcmVtO1xuICAgIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzO1xuICAgIGJhY2tncm91bmQ6ICRjb2xvci1kYXJrZXI7XG4gICAgY29sb3I6ICRjb2xvci13aGl0ZTtcbiAgICBvdmVyZmxvdy14OiBhdXRvO1xuXG4gICAgY29kZSB7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICB9XG4gIH1cblxuICBwIGNvZGUge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICBwYWRkaW5nOiAwIDAuM3JlbTtcbiAgICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcbiAgICBiYWNrZ3JvdW5kOiAkY29sb3ItbGlnaHRlcjtcbiAgfVxuXG4gIGEge1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICBjb2xvcjogYmx1ZTtcbiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcbiAgfVxuXG4gIHVsLFxuICBvbCB7XG4gICAgcGFkZGluZy1sZWZ0OiAycmVtO1xuICB9XG5cbiAgbGkge1xuICAgICYgPiBwLFxuICAgICYgPiBvbCxcbiAgICAmID4gdWwge1xuICAgICAgbWFyZ2luOiAwO1xuICAgIH1cbiAgfVxuXG4gIGJsb2NrcXVvdGUge1xuICAgIGJvcmRlci1sZWZ0OiAzcHggc29saWQgJGNvbG9yLWxpZ2h0ZXI7XG4gICAgcGFkZGluZy1sZWZ0OiAxcmVtO1xuICAgIGZvbnQtc3R5bGU6IGl0YWxpYztcblxuICAgIHAge1xuICAgICAgbWFyZ2luOiAwO1xuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1tdWx0aXNlbGVjdChcbiAgOmNsYXNzPWB7XG4gICAgJ2RpdG8tbXVsdGlzZWxlY3Qtc2luZ2xlJzogIW11bHRpcGxlLFxuICAgICdkaXRvLW11bHRpc2VsZWN0LW11bHRpcGxlJzogbXVsdGlwbGVcbiAgfWBcbilcbiAgVnVlTXVsdGlzZWxlY3QoXG4gICAgcmVmPVwiZWxlbWVudFwiXG4gICAgdi1tb2RlbD1cInNlbGVjdGVkT3B0aW9uc1wiXG4gICAgOmNsYXNzPVwieyAnbXVsdGlzZWxlY3QtLXNob3ctaGlnaGxpZ2h0Jzogc2hvd0hpZ2hsaWdodCB9XCJcbiAgICA6c2hvd0xhYmVscz1cImZhbHNlXCJcbiAgICA6cGxhY2Vob2xkZXI9XCJwbGFjZWhvbGRlclwiXG4gICAgdGFnUGxhY2Vob2xkZXI9XCJQcmVzcyBlbnRlciB0byBhZGQgbmV3IHRhZ1wiXG4gICAgOm9wdGlvbnM9XCJwb3B1bGF0ZSAmJiBhY3RpdmVPcHRpb25zIHx8IFtdXCJcbiAgICA6Y3VzdG9tTGFiZWw9XCJnZXRMYWJlbEZvck9wdGlvblwiXG4gICAgOnRyYWNrQnk9XCJvcHRpb25WYWx1ZVwiXG4gICAgOmdyb3VwTGFiZWw9XCJncm91cEJ5TGFiZWxcIlxuICAgIDpncm91cFZhbHVlcz1cImdyb3VwQnlPcHRpb25zXCJcbiAgICA6bXVsdGlwbGU9XCJtdWx0aXBsZVwiXG4gICAgOnRhZ2dhYmxlPVwidGFnZ2FibGVcIlxuICAgIDpzZWFyY2hhYmxlPVwic2VhcmNoYWJsZVwiXG4gICAgOmludGVybmFsU2VhcmNoPVwiIXNlYXJjaEZpbHRlclwiXG4gICAgOnByZXNlcnZlU2VhcmNoPVwiISFzZWFyY2hGaWx0ZXJcIlxuICAgIDpjbGVhck9uU2VsZWN0PVwiIXNlYXJjaEZpbHRlclwiXG4gICAgOmNsb3NlT25TZWxlY3Q9XCIhc3RheU9wZW5cIlxuICAgIDpsb2FkaW5nPVwiaXNMb2FkaW5nXCJcbiAgICB2LWJpbmQ9XCJhdHRyaWJ1dGVzXCJcbiAgICBAb3Blbj1cIm9uT3BlblwiXG4gICAgQGNsb3NlPVwib25DbG9zZVwiXG4gICAgQHRhZz1cIm9uQWRkVGFnXCJcbiAgICBAc2VhcmNoLWNoYW5nZT1cIm9uU2VhcmNoQ2hhbmdlXCJcbiAgKVxuICBidXR0b24uZGl0by1idXR0b24tY2xlYXIuZGl0by1idXR0b24tb3ZlcmxheShcbiAgICB2LWlmPVwic2hvd0NsZWFyQnV0dG9uXCJcbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gICAgQGNsaWNrPVwiY2xlYXJcIlxuICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IERpdG9Db250ZXh0IGZyb20gJy4uL0RpdG9Db250ZXh0LmpzJ1xuaW1wb3J0IFR5cGVNaXhpbiBmcm9tICcuLi9taXhpbnMvVHlwZU1peGluLmpzJ1xuaW1wb3J0IE9wdGlvbnNNaXhpbiBmcm9tICcuLi9taXhpbnMvT3B0aW9uc01peGluLmpzJ1xuaW1wb3J0IFZ1ZU11bHRpc2VsZWN0IGZyb20gJ3Z1ZS1tdWx0aXNlbGVjdCdcbmltcG9ydCB7IGdldFNjaGVtYUFjY2Vzc29yIH0gZnJvbSAnLi4vdXRpbHMvYWNjZXNzb3IuanMnXG5pbXBvcnQgeyBpc0Jvb2xlYW4gfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoJ211bHRpc2VsZWN0Jywge1xuICBtaXhpbnM6IFtPcHRpb25zTWl4aW5dLFxuICBjb21wb25lbnRzOiB7IFZ1ZU11bHRpc2VsZWN0IH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaXNNb3VudGVkOiBmYWxzZSxcbiAgICAgIHNlYXJjaGVkT3B0aW9uczogbnVsbCxcbiAgICAgIHBvcHVsYXRlOiBmYWxzZVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIHNlbGVjdGVkT3B0aW9uczoge1xuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tdWx0aXBsZVxuICAgICAgICAgID8gKHRoaXMuc2VsZWN0ZWRWYWx1ZSB8fCBbXSlcbiAgICAgICAgICAgICAgLm1hcChcbiAgICAgICAgICAgICAgICAvLyBJZiBhbiBvcHRpb24gY2Fubm90IGJlIGZvdW5kLCB3ZSBtYXkgYmUgaW4gdGFnZ2FibGUgbW9kZSBhbmRcbiAgICAgICAgICAgICAgICAvLyBjYW4gYWRkIGl0LlxuICAgICAgICAgICAgICAgIHZhbHVlID0+IChcbiAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0T3B0aW9uRm9yVmFsdWUodmFsdWUpIHx8IHRoaXMuYWRkVGFnT3B0aW9uKHZhbHVlKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAvLyBGaWx0ZXIgb3V0IG9wdGlvbnMgdGhhdCB3ZSBjb3VsZG4ndCBtYXRjaC5cbiAgICAgICAgICAgICAgLy8gVE9ETzogU2hvdWxkIHdlIGRpc3BsYXkgYW4gZXJyb3IgaW5zdGVhZD9cbiAgICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAgIDogdGhpcy5zZWxlY3RlZE9wdGlvblxuICAgICAgfSxcblxuICAgICAgc2V0KG9wdGlvbikge1xuICAgICAgICAvLyBDb252ZXJ0IHZhbHVlIHRvIG9wdGlvbnMgb2JqZWN0LCBzaW5jZSB2dWUtbXVsdGlzZWxlY3QgY2FuJ3QgbWFwIHRoYXRcbiAgICAgICAgLy8gaXRzZWxmIHVuZm9ydHVuYXRlbHkuIGB0cmFjay1ieWAgaXMgdXNlZCBmb3IgOmtleSBtYXBwaW5nIGl0IHNlZW1zLlxuICAgICAgICB0aGlzLnNlbGVjdGVkVmFsdWUgPSB0aGlzLm11bHRpcGxlXG4gICAgICAgICAgPyAob3B0aW9uIHx8IFtdKS5tYXAodmFsdWUgPT4gdGhpcy5nZXRWYWx1ZUZvck9wdGlvbih2YWx1ZSkpXG4gICAgICAgICAgOiB0aGlzLmdldFZhbHVlRm9yT3B0aW9uKG9wdGlvbilcbiAgICAgICAgdGhpcy5vbkNoYW5nZSgpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGFjdGl2ZU9wdGlvbnMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZWFyY2hlZE9wdGlvbnMgfHwgdGhpcy5vcHRpb25zXG4gICAgfSxcblxuICAgIG11bHRpcGxlOiBnZXRTY2hlbWFBY2Nlc3NvcignbXVsdGlwbGUnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9KSxcblxuICAgIHNlYXJjaGFibGU6IGdldFNjaGVtYUFjY2Vzc29yKCdzZWFyY2hhYmxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSksXG5cbiAgICB0YWdnYWJsZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ3RhZ2dhYmxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSksXG5cbiAgICBzdGF5T3BlbjogZ2V0U2NoZW1hQWNjZXNzb3IoJ3N0YXlPcGVuJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSksXG5cbiAgICBwbGFjZWhvbGRlcigpIHtcbiAgICAgIGxldCB7IHBsYWNlaG9sZGVyLCBzZWFyY2hhYmxlLCB0YWdnYWJsZSB9ID0gdGhpcy5zY2hlbWFcbiAgICAgIGlmIChpc0Jvb2xlYW4ocGxhY2Vob2xkZXIpKSB7XG4gICAgICAgIHBsYWNlaG9sZGVyID0gcGxhY2Vob2xkZXIgPyB1bmRlZmluZWQgOiBudWxsXG4gICAgICB9XG4gICAgICByZXR1cm4gcGxhY2Vob2xkZXIgPT09IHVuZGVmaW5lZFxuICAgICAgICA/IHNlYXJjaGFibGUgJiYgdGFnZ2FibGVcbiAgICAgICAgICA/IGBTZWFyY2ggb3IgYWRkIGEgJHt0aGlzLmxhYmVsfWBcbiAgICAgICAgICA6IHNlYXJjaGFibGVcbiAgICAgICAgICAgID8gYFNlbGVjdCBvciBzZWFyY2ggJHt0aGlzLmxhYmVsfWBcbiAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgIDogcGxhY2Vob2xkZXJcbiAgICB9LFxuXG4gICAgc2hvd0hpZ2hsaWdodCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzTW91bnRlZCAmJiB0aGlzLiRyZWZzLmVsZW1lbnQucG9pbnRlckRpcnR5XG4gICAgfVxuICB9LFxuXG4gIG1vdW50ZWQoKSB7XG4gICAgdGhpcy5pc01vdW50ZWQgPSB0cnVlXG4gICAgaWYgKHRoaXMuYXV0b2ZvY3VzKSB7XG4gICAgICAvLyB2dWUtbXVsdGlzZWxlY3QgZG9lc24ndCBzdXBwb3J0IHRoZSBhdXRvZm9jdXMgYXR0cmlidXRlLiBXZSBuZWVkIHRvXG4gICAgICAvLyBoYW5kbGUgaXQgaGVyZS5cbiAgICAgIHRoaXMuZm9jdXMoKVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgYWRkVGFnT3B0aW9uKHRhZykge1xuICAgICAgaWYgKHRoaXMudGFnZ2FibGUpIHtcbiAgICAgICAgY29uc3QgeyBvcHRpb25MYWJlbCwgb3B0aW9uVmFsdWUgfSA9IHRoaXNcbiAgICAgICAgY29uc3Qgb3B0aW9uID1cbiAgICAgICAgICBvcHRpb25MYWJlbCAmJiBvcHRpb25WYWx1ZVxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgW29wdGlvbkxhYmVsXTogdGFnLFxuICAgICAgICAgICAgICAgIC8vIFRPRE86IERlZmluZSBhIHNpbXBsZSBzY2hlbWEgb3B0aW9uIHRvIGNvbnZlcnQgdGhlIHRhZyB2YWx1ZVxuICAgICAgICAgICAgICAgIC8vIHRvIHNvbWV0aGluZyBlbHNlLCBlLmcuIGB0b1RhZzogdGFnID0+IHVuZGVyc2NvcmUodGFnKWBcbiAgICAgICAgICAgICAgICBbb3B0aW9uVmFsdWVdOiB0YWdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB0YWdcbiAgICAgICAgdGhpcy5vcHRpb25zLnB1c2gob3B0aW9uKVxuICAgICAgICByZXR1cm4gb3B0aW9uXG4gICAgICB9XG4gICAgfSxcblxuICAgIGZvY3VzRWxlbWVudCgpIHtcbiAgICAgIHRoaXMuJHJlZnMuZWxlbWVudC5hY3RpdmF0ZSgpXG4gICAgfSxcblxuICAgIG9uT3BlbigpIHtcbiAgICAgIHRoaXMucG9wdWxhdGUgPSB0cnVlXG4gICAgfSxcblxuICAgIG9uQ2xvc2UoKSB7XG4gICAgICAvLyBTaW5jZSB3ZSBkb24ndCBmaXJlIGJsdXIgZXZlbnRzIHdoaWxlIHRoZSBtdWx0aXNlbGVjdCBpcyBvcGVuIChzZWVcbiAgICAgIC8vIGJlbG93KSwgd2UgbmVlZCB0byBkbyBpdCBoZXJlLCB3aGVuIGl0J3MgYWN0dWFsbHkgY2xvc2VkLlxuICAgICAgaWYgKHRoaXMuZm9jdXNlZCkge1xuICAgICAgICB0aGlzLm9uQmx1cigpXG4gICAgICB9XG4gICAgfSxcblxuICAgIG9uQmx1cigpIHtcbiAgICAgIGlmICghdGhpcy4kcmVmcy5lbGVtZW50LmlzT3Blbikge1xuICAgICAgICBUeXBlTWl4aW4ubWV0aG9kcy5vbkJsdXIuY2FsbCh0aGlzKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBvbkFkZFRhZyh0YWcpIHtcbiAgICAgIGNvbnN0IG9wdGlvbiA9IHRoaXMuYWRkVGFnT3B0aW9uKHRhZylcbiAgICAgIGlmIChvcHRpb24pIHtcbiAgICAgICAgdGhpcy52YWx1ZS5wdXNoKHRoaXMuZ2V0VmFsdWVGb3JPcHRpb24ob3B0aW9uKSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgb25TZWFyY2hDaGFuZ2UocXVlcnkpIHtcbiAgICAgIGlmICh0aGlzLnNlYXJjaEZpbHRlcikge1xuICAgICAgICBpZiAocXVlcnkpIHtcbiAgICAgICAgICAvLyBTZXQgYHNlYXJjaGVkT3B0aW9uc2AgdG8gYW4gZW1wdHkgYXJyYXksIGJlZm9yZSBpdCB3aWxsIGJlXG4gICAgICAgICAgLy8gcG9wdWxhdGVkIGFzeW5jaHJvbm91c2x5IHdpdGggdGhlIGFjdHVhbCByZXN1bHRzLlxuICAgICAgICAgIHRoaXMuc2VhcmNoZWRPcHRpb25zID0gW11cbiAgICAgICAgICB0aGlzLnNlYXJjaGVkT3B0aW9ucyA9IGF3YWl0IHRoaXMucmVzb2x2ZURhdGEoXG4gICAgICAgICAgICAoKSA9PiB0aGlzLnNlYXJjaEZpbHRlcihuZXcgRGl0b0NvbnRleHQodGhpcywgeyBxdWVyeSB9KSlcbiAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQ2xlYXIgYHNlYXJjaGVkT3B0aW9uc2Agd2hlbiB0aGUgcXVlcnkgaXMgY2xlYXJlZC5cbiAgICAgICAgICB0aGlzLnNlYXJjaGVkT3B0aW9ucyA9IG51bGxcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5AaW1wb3J0ICd2dWUtbXVsdGlzZWxlY3QvZGlzdC92dWUtbXVsdGlzZWxlY3QuY3NzJztcblxuJHNwaW5uZXItd2lkdGg6ICRzZWxlY3QtYXJyb3ctd2lkdGg7XG4kdGFnLWljb24td2lkdGg6IDEuOGVtO1xuJHRhZy1tYXJnaW46IDJweDtcbiR0YWctcGFkZGluZzogM3B4O1xuJHRhZy1saW5lLWhlaWdodDogMWVtO1xuXG4uZGl0by1tdWx0aXNlbGVjdCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcblxuICAmLmRpdG8tbXVsdGlzZWxlY3Qtc2luZ2xlIHtcbiAgICAtLWlucHV0LXdpZHRoOiAxMDAlO1xuICB9XG5cbiAgJi5kaXRvLW11bHRpc2VsZWN0LW11bHRpcGxlIHtcbiAgICAtLWlucHV0LXdpZHRoOiBhdXRvO1xuICB9XG5cbiAgJi5kaXRvLWhhcy1lcnJvcnMge1xuICAgICZfX3RhZ3Mge1xuICAgICAgYm9yZGVyLWNvbG9yOiAkY29sb3ItZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLmRpdG8tYnV0dG9uLWNsZWFyIHtcbiAgICB3aWR0aDogJHNwaW5uZXItd2lkdGg7XG4gIH1cblxuICAubXVsdGlzZWxlY3Qge1xuICAgICRzZWxmOiBsYXN0LXNlbGVjdG9yKCYpO1xuXG4gICAgZm9udC1zaXplOiBpbmhlcml0O1xuICAgIG1pbi1oZWlnaHQ6IGluaGVyaXQ7XG4gICAgY29sb3I6ICRjb2xvci1ibGFjaztcblxuICAgICYtLWFjdGl2ZSB7XG4gICAgICAjeyRzZWxmfV9fcGxhY2Vob2xkZXIge1xuICAgICAgICAvLyBEb24ndCB1c2UgYGRpc3BsYXk6IG5vbmVgIHRvIGhpZGUgcGxhY2UtaG9sZGVyLCBhcyB0aGUgbGF5b3V0IHdvdWxkXG4gICAgICAgIC8vIGNvbGxhcHNlLlxuICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgICAgIH1cblxuICAgICAgI3skc2VsZn1fX3NpbmdsZSxcbiAgICAgICN7JHNlbGZ9X19pbnB1dCB7XG4gICAgICAgIC8vIFNhZGx5LCB2dWUtc2VsZWN0IHNldHMgYHN0eWxlPVwid2lkdGhcImAgaW4gYWRkaXRpb24gdG8gdXNpbmcgY2xhc3Nlc1xuICAgICAgICAvLyBzbyBgIWltcG9ydGFudGAgaXMgbmVjZXNzYXJ5OlxuICAgICAgICB3aWR0aDogdmFyKC0taW5wdXQtd2lkdGgpICFpbXBvcnRhbnQ7XG4gICAgICB9XG5cbiAgICAgICN7JHNlbGZ9X190YWdzIHtcbiAgICAgICAgYm9yZGVyLWNvbG9yOiAkY29sb3ItYWN0aXZlO1xuICAgICAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAwO1xuICAgICAgICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMDtcbiAgICAgIH1cblxuICAgICAgI3skc2VsZn1fX2NvbnRlbnQtd3JhcHBlciB7XG4gICAgICAgIGJvcmRlcjogJGJvcmRlci13aWR0aCBzb2xpZCAkY29sb3ItYWN0aXZlO1xuICAgICAgICBib3JkZXItdG9wLWNvbG9yOiAkYm9yZGVyLWNvbG9yO1xuICAgICAgICBtYXJnaW46IC0xcHggMCAwO1xuICAgICAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAwO1xuICAgICAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMDtcbiAgICAgIH1cblxuICAgICAgJiN7JHNlbGZ9LS1hYm92ZSB7XG4gICAgICAgICN7JHNlbGZ9X190YWdzIHtcbiAgICAgICAgICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcbiAgICAgICAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAwO1xuICAgICAgICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgI3skc2VsZn1fX2NvbnRlbnQtd3JhcHBlciB7XG4gICAgICAgICAgYm9yZGVyOiAkYm9yZGVyLXdpZHRoIHNvbGlkICRjb2xvci1hY3RpdmU7XG4gICAgICAgICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogJGJvcmRlci1jb2xvcjtcbiAgICAgICAgICBtYXJnaW46IDAgMCAtMXB4O1xuICAgICAgICAgIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzO1xuICAgICAgICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDA7XG4gICAgICAgICAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAmX190YWdzIHtcbiAgICAgIGZvbnQtc2l6ZTogaW5oZXJpdDtcbiAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgICAgbWluLWhlaWdodDogaW5oZXJpdDtcbiAgICAgIHBhZGRpbmc6IDAgJHNwaW5uZXItd2lkdGggMCAwO1xuICAgICAgLy8gU28gdGFncyBjYW4gZmxvYXQgb24gbXVsdGlwbGUgbGluZXMgYW5kIGhhdmUgcHJvcGVyIG1hcmdpbnM6XG4gICAgICBwYWRkaW5nLWJvdHRvbTogJHRhZy1tYXJnaW47XG4gICAgfVxuXG4gICAgJl9fdGFnIHtcbiAgICAgIGZsb2F0OiBsZWZ0O1xuICAgICAgbWFyZ2luOiAkdGFnLW1hcmdpbiAwIDAgJHRhZy1tYXJnaW47XG4gICAgICBib3JkZXItcmFkaXVzOiAxZW07XG4gICAgICBwYWRkaW5nOiAkdGFnLXBhZGRpbmcgJHRhZy1pY29uLXdpZHRoICR0YWctcGFkZGluZyAwLjhlbTtcbiAgICAgIGxpbmUtaGVpZ2h0OiAkdGFnLWxpbmUtaGVpZ2h0O1xuICAgICAgaGVpZ2h0OiBjYWxjKCRpbnB1dC1oZWlnaHQgLSAyICogJHRhZy1wYWRkaW5nKTtcbiAgICB9XG5cbiAgICAmX190YWdzLXdyYXAge1xuICAgICAgb3ZlcmZsb3c6IGF1dG87XG4gICAgICBsaW5lLWhlaWdodDogMDtcbiAgICB9XG5cbiAgICAmX19zaW5nbGUsXG4gICAgJl9fcGxhY2Vob2xkZXIsXG4gICAgJl9faW5wdXQge1xuICAgICAgZm9udC1zaXplOiBpbmhlcml0O1xuICAgICAgbGluZS1oZWlnaHQ6IGluaGVyaXQ7XG4gICAgICBtaW4taGVpZ2h0OiAwO1xuICAgICAgbWFyZ2luOiAwIDAgMXB4IDA7XG4gICAgICAvLyBTYWRseSwgdnVlLXNlbGVjdCBzZXRzIHN0eWxlPVwicGFkZGluZzogLi4uO1wiIGluIGFkZGl0aW9uIHRvIHVzaW5nXG4gICAgICAvLyBjbGFzc2VzLCBzbyBgIWltcG9ydGFudGAgaXMgbmVjZXNzYXJ5OlxuICAgICAgcGFkZGluZzogJGlucHV0LXBhZGRpbmcgIWltcG9ydGFudDtcbiAgICAgIC8vIFNvIGlucHV0IGNhbiBmbG9hdCBuZXh0IHRvIHRhZ3MgYW5kIGhhdmUgcHJvcGVyIG1hcmdpbnMgd2l0aFxuICAgICAgLy8gJl9fdGFnczpcbiAgICAgIHBhZGRpbmctYm90dG9tOiAwICFpbXBvcnRhbnQ7XG4gICAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgIH1cblxuICAgICZfX3BsYWNlaG9sZGVyLFxuICAgICZfX2lucHV0OjpwbGFjZWhvbGRlciB7XG4gICAgICBjb2xvcjogJGNvbG9yLXBsYWNlaG9sZGVyO1xuICAgIH1cblxuICAgICZfX3BsYWNlaG9sZGVyIHtcbiAgICAgICY6OmFmdGVyIHtcbiAgICAgICAgLy8gRW5mb3JjZSBhY3R1YWwgbGluZS1oZWlnaHQgZm9yIHBvc2l0aW9uaW5nLlxuICAgICAgICBjb250ZW50OiAnXFwyMDBiJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAmX19zZWxlY3QsXG4gICAgJl9fc3Bpbm5lciB7XG4gICAgICBwYWRkaW5nOiAwO1xuICAgICAgLy8gJGJvcmRlci13aWR0aCB0byBwcmV2ZW50IG1hc2tpbmcgYm9yZGVyIHdpdGggJl9fc3Bpbm5lclxuICAgICAgdG9wOiAkYm9yZGVyLXdpZHRoO1xuICAgICAgcmlnaHQ6ICRib3JkZXItd2lkdGg7XG4gICAgICBib3R0b206ICRib3JkZXItd2lkdGg7XG4gICAgICBoZWlnaHQ6IGluaGVyaXQ7XG4gICAgICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcbiAgICB9XG5cbiAgICAmX19zZWxlY3Qge1xuICAgICAgd2lkdGg6IDA7XG4gICAgICBtYXJnaW4tcmlnaHQ6IGNhbGMoJHNlbGVjdC1hcnJvdy13aWR0aCAvIDIpO1xuXG4gICAgICAmOjpiZWZvcmUge1xuICAgICAgICBAaW5jbHVkZSBhcnJvdygkc2VsZWN0LWFycm93LXNpemUpO1xuXG4gICAgICAgIGJvdHRvbTogJHNlbGVjdC1hcnJvdy1ib3R0b207XG4gICAgICAgIHJpZ2h0OiBjYWxjKC0xICogJHNlbGVjdC1hcnJvdy1zaXplIC8gMik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgJl9fc3Bpbm5lciB7XG4gICAgICB3aWR0aDogJHNwaW5uZXItd2lkdGg7XG5cbiAgICAgICY6OmJlZm9yZSxcbiAgICAgICY6OmFmdGVyIHtcbiAgICAgICAgLy8gQ2hhbmdlIHRoZSB3aWR0aCBvZiB0aGUgbG9hZGluZyBzcGlubmVyXG4gICAgICAgIGJvcmRlci13aWR0aDogM3B4O1xuICAgICAgICBib3JkZXItdG9wLWNvbG9yOiAkY29sb3ItYWN0aXZlO1xuICAgICAgICBpbnNldDogMDtcbiAgICAgICAgbWFyZ2luOiBhdXRvO1xuICAgICAgfVxuICAgIH1cblxuICAgICZfX29wdGlvbiB7XG4gICAgICAkb3B0aW9uOiBsYXN0LXNlbGVjdG9yKCYpO1xuXG4gICAgICBtaW4taGVpZ2h0OiB1bnNldDtcbiAgICAgIGhlaWdodDogdW5zZXQ7XG4gICAgICBsaW5lLWhlaWdodDogJHRhZy1saW5lLWhlaWdodDtcbiAgICAgIHBhZGRpbmc6ICRpbnB1dC1wYWRkaW5nO1xuXG4gICAgICAmOjphZnRlciB7XG4gICAgICAgIC8vIEluc3RydWN0aW9uIHRleHQgZm9yIG9wdGlvbnNcbiAgICAgICAgcGFkZGluZzogJGlucHV0LXBhZGRpbmc7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiAkdGFnLWxpbmUtaGVpZ2h0O1xuICAgICAgfVxuXG4gICAgICAvLyBPbmx5IHNob3cgdGhlIGhpZ2hsaWdodCBvbmNlIHRoZSBwdWxsZG93biBoYXMgcmVjZWl2ZWQgbW91c2Ugb3JcbiAgICAgIC8vIGtleWJvYXJkIGludGVyYWN0aW9uLCBpbiB3aGljaCBjYXNlIGAmLS1zaG93LWhpZ2hsaWdodGAgd2lsbCBiZSBzZXQsXG4gICAgICAvLyB3aGljaCBpcyBjb250cm9sbGVkIGJ5IGBwb2ludGVyRGlydHlgIGluIHZ1ZS1tdWx0aXNlbGVjdC5cbiAgICAgIC8vIFVudGlsIHRoZW4sIGNsZWFyIHRoZSBoaWdobGlnaHQgc3R5bGUsIGJ1dCBvbmx5IGlmIGl0IGlzbid0IGFsc29cbiAgICAgIC8vIGRpc2FibGVkIG9yIHNlbGVjdGVkLCBpbiB3aGljaCBjYXNlIHdlIHdhbnQgdG8ga2VlcCB0aGUgc3R5bGUuXG4gICAgICBAYXQtcm9vdCAjeyRzZWxmfTpub3QoI3skc2VsZn0tLXNob3ctaGlnaGxpZ2h0KVxuICAgICAgICAgICN7JG9wdGlvbn06bm90KCN7JG9wdGlvbn0tLWRpc2FibGVkKTpub3QoI3skb3B0aW9ufS0tc2VsZWN0ZWQpIHtcbiAgICAgICAgY29sb3I6ICRjb2xvci10ZXh0O1xuICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICAgIH1cblxuICAgICAgJi0taGlnaGxpZ2h0IHtcbiAgICAgICAgJjo6YWZ0ZXIge1xuICAgICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICAgICAgICBjb2xvcjogJGNvbG9yLXdoaXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgQGF0LXJvb3QgI3skc2VsZn0jeyRzZWxmfS0tc2hvdy1oaWdobGlnaHQgI3tsYXN0LXNlbGVjdG9yKCYpfSB7XG4gICAgICAgICAgY29sb3I6ICRjb2xvci10ZXh0LWludmVydGVkO1xuICAgICAgICAgIGJhY2tncm91bmQ6ICRjb2xvci1hY3RpdmU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgJi0tc2VsZWN0ZWQge1xuICAgICAgICBmb250LXdlaWdodDogbm9ybWFsO1xuICAgICAgICBjb2xvcjogJGNvbG9yLXRleHQ7XG4gICAgICAgIGJhY2tncm91bmQ6ICRjb2xvci1oaWdobGlnaHQ7XG5cbiAgICAgICAgJiN7JG9wdGlvbn0tLWhpZ2hsaWdodCB7XG4gICAgICAgICAgY29sb3I6ICRjb2xvci10ZXh0LWludmVydGVkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgICYtLWRpc2FibGVkIHtcbiAgICAgICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAgICAgY29sb3I6ICRjb2xvci1kaXNhYmxlZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAmX190YWcge1xuICAgICAgY29sb3I6ICRjb2xvci10ZXh0LWludmVydGVkO1xuICAgICAgYmFja2dyb3VuZDogJGNvbG9yLWFjdGl2ZTtcbiAgICB9XG5cbiAgICAmX190YWctaWNvbiB7XG4gICAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgICAgYm9yZGVyLXJhZGl1czogMWVtO1xuICAgICAgd2lkdGg6ICR0YWctaWNvbi13aWR0aDtcbiAgICAgIG1hcmdpbjogMDtcblxuICAgICAgJjo6YWZ0ZXIge1xuICAgICAgICBAZXh0ZW5kICVpY29uLWNsZWFyO1xuXG4gICAgICAgIGZvbnQtc2l6ZTogMC45ZW07XG4gICAgICAgIGNvbG9yOiAkY29sb3ItdGV4dC1pbnZlcnRlZDtcbiAgICAgIH1cblxuICAgICAgJjpob3Zlcjo6YWZ0ZXIge1xuICAgICAgICBjb2xvcjogJGNvbG9yLXRleHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgJl9fdGFncyxcbiAgICAmX19jb250ZW50LXdyYXBwZXIge1xuICAgICAgYm9yZGVyOiAkYm9yZGVyLXN0eWxlO1xuICAgICAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiaW1wb3J0IHsgZ2V0U2NoZW1hQWNjZXNzb3IgfSBmcm9tICcuLi91dGlscy9hY2Nlc3Nvci5qcydcbmltcG9ydCB7IGlzQXJyYXkgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQge1xuICBjb21wdXRlZDoge1xuICAgIGlucHV0VmFsdWU6IHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUgIT09IG51bGwgPyB0aGlzLnZhbHVlIDogJydcbiAgICAgIH0sXG5cbiAgICAgIHNldCh2YWx1ZSkge1xuICAgICAgICB0aGlzLnZhbHVlID1cbiAgICAgICAgICB2YWx1ZSAhPT0gJydcbiAgICAgICAgICAgID8gdGhpcy5pc0ludGVnZXJcbiAgICAgICAgICAgICAgPyBwYXJzZUludCh2YWx1ZSwgMTApXG4gICAgICAgICAgICAgIDogcGFyc2VGbG9hdCh2YWx1ZSlcbiAgICAgICAgICAgIDogbnVsbFxuICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBAb3ZlcnJpZGFibGVcbiAgICBpc0ludGVnZXIoKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9LFxuXG4gICAgc3RlcFZhbHVlKCkge1xuICAgICAgLy8gRG9uJ3Qgc2hvdyBzdGVwcyBpZiB0aGUgaW5wdXQgaXMgYWxzbyBjbGVhcmFibGUsIHNpbmNlIHRoZSBzdGVwIGJ1dHRvbnNcbiAgICAgIC8vIHdvdWxkIGNvbGxpZGUgd2l0aCB0aGUgY2xlYXIgYnV0dG9uLlxuICAgICAgcmV0dXJuIHRoaXMuY2xlYXJhYmxlXG4gICAgICAgID8gbnVsbFxuICAgICAgICA6IHRoaXMuc3RlcCA9PSBudWxsICYmICF0aGlzLmlzSW50ZWdlclxuICAgICAgICAgID8gJ2FueSdcbiAgICAgICAgICA6IHRoaXMuc3RlcFxuICAgIH0sXG5cbiAgICBkZWNpbWFsczogZ2V0U2NoZW1hQWNjZXNzb3IoJ2RlY2ltYWxzJywge1xuICAgICAgdHlwZTogTnVtYmVyXG4gICAgfSksXG5cbiAgICBzdGVwOiBnZXRTY2hlbWFBY2Nlc3Nvcignc3RlcCcsIHtcbiAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgIGdldChzdGVwKSB7XG4gICAgICAgIC8vIEZvciBpbnRlZ2Vycywgcm91bmQgdGhlIHN0ZXBzIHRvIHRoZSBuZXh0IGJpZ2dlciBpbnRlZ2VyIHZhbHVlOlxuICAgICAgICByZXR1cm4gdGhpcy5pc0ludGVnZXIgJiYgc3RlcCAhPSBudWxsID8gTWF0aC5jZWlsKHN0ZXApIDogc3RlcFxuICAgICAgfVxuICAgIH0pLFxuXG4gICAgbWluOiBnZXRTY2hlbWFBY2Nlc3NvcignbWluJywge1xuICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgZ2V0KG1pbikge1xuICAgICAgICBtaW4gPVxuICAgICAgICAgIG1pbiA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IHRoaXMuZ2V0U2NoZW1hVmFsdWUoJ3JhbmdlJywgeyB0eXBlOiBBcnJheSB9KT8uWzBdXG4gICAgICAgICAgICA6IG1pblxuICAgICAgICByZXR1cm4gdGhpcy5pc0ludGVnZXIgJiYgbWluICE9IG51bGwgPyBNYXRoLmZsb29yKG1pbikgOiBtaW5cbiAgICAgIH1cbiAgICB9KSxcblxuICAgIG1heDogZ2V0U2NoZW1hQWNjZXNzb3IoJ21heCcsIHtcbiAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgIGdldChtYXgpIHtcbiAgICAgICAgbWF4ID1cbiAgICAgICAgICBtYXggPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyB0aGlzLmdldFNjaGVtYVZhbHVlKCdyYW5nZScsIHsgdHlwZTogQXJyYXkgfSk/LlsxXVxuICAgICAgICAgICAgOiBtYXhcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNJbnRlZ2VyICYmIG1heCAhPSBudWxsID8gTWF0aC5jZWlsKG1heCkgOiBtYXhcbiAgICAgIH1cbiAgICB9KSxcblxuICAgIHJhbmdlOiBnZXRTY2hlbWFBY2Nlc3NvcigncmFuZ2UnLCB7XG4gICAgICB0eXBlOiBBcnJheSxcbiAgICAgIGdldCgpIHtcbiAgICAgICAgLy8gYHRoaXMubWluYCwgYHRoaXMubWF4YCBhbHJlYWR5IHN1cHBvcnQgYHNjaGVtYS5yYW5nZWAsXG4gICAgICAgIC8vIHNvIHJlZGlyZWN0IHRoZXJlLlxuICAgICAgICBjb25zdCB7IG1pbiwgbWF4IH0gPSB0aGlzXG4gICAgICAgIHJldHVybiBtaW4gIT0gbnVsbCAmJiBtYXggIT0gbnVsbCA/IFttaW4sIG1heF0gOiB1bmRlZmluZWRcbiAgICAgIH0sXG5cbiAgICAgIHNldChyYW5nZSkge1xuICAgICAgICAvLyBQcm92aWRlIGEgc2V0dGVyIHRoYXQgZGVsZWdhdGVzIHRvIGBbdGhpcy5taW4sIHRoaXMubWF4XWAsXG4gICAgICAgIC8vIHNpbmNlIHRob3NlIGFscmVhZHkgaGFuZGxlIGBzY2hlbWEucmFuZ2VgLlxuICAgICAgICBpZiAoaXNBcnJheShyYW5nZSkpIHtcbiAgICAgICAgICA7W3RoaXMubWluLCB0aGlzLm1heF0gPSByYW5nZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0VmFsaWRhdGlvbnMoKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9ucyA9IHt9XG4gICAgICBjb25zdCB7IHJhbmdlLCBtaW4sIG1heCwgZGVjaW1hbHMsIHN0ZXAgfSA9IHRoaXNcbiAgICAgIGlmIChyYW5nZSkge1xuICAgICAgICB2YWxpZGF0aW9ucy5yYW5nZSA9IHJhbmdlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobWluICE9IG51bGwpIHtcbiAgICAgICAgICB2YWxpZGF0aW9ucy5taW4gPSBtaW5cbiAgICAgICAgfVxuICAgICAgICBpZiAobWF4ICE9IG51bGwpIHtcbiAgICAgICAgICB2YWxpZGF0aW9ucy5tYXggPSBtYXhcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRlY2ltYWxzICE9IG51bGwpIHtcbiAgICAgICAgdmFsaWRhdGlvbnMuZGVjaW1hbHMgPSBkZWNpbWFsc1xuICAgICAgfSBlbHNlIGlmIChzdGVwKSB7XG4gICAgICAgIGNvbnN0IGRlY2ltYWxzID0gKGAke3N0ZXB9YC5zcGxpdCgnLicpWzFdIHx8ICcnKS5sZW5ndGhcbiAgICAgICAgaWYgKGRlY2ltYWxzID4gMCkge1xuICAgICAgICAgIHZhbGlkYXRpb25zLmRlY2ltYWxzID0gZGVjaW1hbHNcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWxpZGF0aW9ucy5pbnRlZ2VyID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5pc0ludGVnZXIpIHtcbiAgICAgICAgdmFsaWRhdGlvbnMuaW50ZWdlciA9IHRydWVcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWxpZGF0aW9uc1xuICAgIH1cbiAgfVxufVxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbklucHV0RmllbGQuZGl0by1udW1iZXIoXG4gIDppZD1cImRhdGFQYXRoXCJcbiAgcmVmPVwiZWxlbWVudFwiXG4gIHYtbW9kZWw9XCJpbnB1dFZhbHVlXCJcbiAgdHlwZT1cIm51bWJlclwiXG4gIHYtYmluZD1cImF0dHJpYnV0ZXNcIlxuICA6bWluPVwibWluXCJcbiAgOm1heD1cIm1heFwiXG4gIDpzdGVwPVwic3RlcFZhbHVlXCJcbilcbiAgdGVtcGxhdGUoI2FmdGVyKVxuICAgIGJ1dHRvbi5kaXRvLWJ1dHRvbi1jbGVhci5kaXRvLWJ1dHRvbi1vdmVybGF5KFxuICAgICAgdi1pZj1cInNob3dDbGVhckJ1dHRvblwiXG4gICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gICAgICBAY2xpY2suc3RvcD1cImNsZWFyXCJcbiAgICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IE51bWJlck1peGluIGZyb20gJy4uL21peGlucy9OdW1iZXJNaXhpbi5qcydcbmltcG9ydCB7IElucHV0RmllbGQgfSBmcm9tICdAZGl0b2pzL3VpL3NyYydcblxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoXG4gIFsnbnVtYmVyJywgJ2ludGVnZXInXSxcbiAgLy8gQHZ1ZS9jb21wb25lbnRcbiAge1xuICAgIG1peGluczogW051bWJlck1peGluXSxcbiAgICBjb21wb25lbnRzOiB7IElucHV0RmllbGQgfSxcbiAgICBuYXRpdmVGaWVsZDogdHJ1ZSxcbiAgICB0ZXh0RmllbGQ6IHRydWUsXG5cbiAgICBjb21wdXRlZDoge1xuICAgICAgaXNJbnRlZ2VyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlID09PSAnaW50ZWdlcidcbiAgICAgIH1cbiAgICB9XG4gIH1cbilcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbi8vIE9ubHkgc2hvdyBzcGluIGJ1dHRvbnMgaWYgdGhlIG51bWJlciBjb21wb25lbnQgZGVmaW5lcyBhIHN0ZXAgc2l6ZS5cbmlucHV0W3R5cGU9J251bWJlciddOm5vdChbc3RlcF0pIHtcbiAgJjo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbixcbiAgJjo6LXdlYmtpdC1vdXRlci1zcGluLWJ1dHRvbiB7XG4gICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xuICAgIG1hcmdpbjogMDtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1vYmplY3QoXG4gIHYtaWY9XCJpc1JlYWR5XCJcbiAgOmlkPVwiZGF0YVBhdGhcIlxuICA6Y2xhc3M9XCJzY2hlbWEuY2xhc3NcIlxuICA6c3R5bGU9XCJzY2hlbWEuc3R5bGVcIlxuKVxuICAuZGl0by1vYmplY3QtY29udGVudChcbiAgICB2LWlmPVwib2JqZWN0RGF0YVwiXG4gIClcbiAgICAvLy0gU3VwcG9ydCB0aGUgc2FtZSByZW5kZXJpbmcgb3B0aW9ucyBhcyBUeXBlTGlzdDpcbiAgICBEaXRvU2NoZW1hSW5saW5lZChcbiAgICAgIHYtaWY9XCJpc0lubGluZWRcIlxuICAgICAgOmxhYmVsPVwib2JqZWN0TGFiZWxcIlxuICAgICAgOnNjaGVtYT1cImdldEl0ZW1Gb3JtU2NoZW1hKHNjaGVtYSwgb2JqZWN0RGF0YSwgY29udGV4dClcIlxuICAgICAgOmRhdGFQYXRoPVwiZGF0YVBhdGhcIlxuICAgICAgOmRhdGE9XCJvYmplY3REYXRhXCJcbiAgICAgIDptZXRhPVwibmVzdGVkTWV0YVwiXG4gICAgICA6c3RvcmU9XCJzdG9yZVwiXG4gICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZCB8fCBpc0xvYWRpbmdcIlxuICAgICAgOmNvbGxhcHNlZD1cImNvbGxhcHNlZFwiXG4gICAgICA6Y29sbGFwc2libGU9XCJjb2xsYXBzaWJsZVwiXG4gICAgKVxuICAgIGNvbXBvbmVudChcbiAgICAgIHYtZWxzZS1pZj1cInNjaGVtYS5jb21wb25lbnRcIlxuICAgICAgOmlzPVwic2NoZW1hLmNvbXBvbmVudFwiXG4gICAgICA6ZGF0YVBhdGg9XCJkYXRhUGF0aFwiXG4gICAgICA6ZGF0YT1cIm9iamVjdERhdGFcIlxuICAgICAgOm5lc3RlZD1cImZhbHNlXCJcbiAgICApXG4gICAgc3BhbihcbiAgICAgIHYtZWxzZS1pZj1cInJlbmRlclwiXG4gICAgICB2LWh0bWw9XCJyZW5kZXIoZ2V0Q29udGV4dCgpKVwiXG4gICAgKVxuICAgIHNwYW4oXG4gICAgICB2LWVsc2VcbiAgICAgIHYtaHRtbD1cImdldEl0ZW1MYWJlbChzY2hlbWEsIG9iamVjdERhdGEpXCJcbiAgICApXG4gIERpdG9FZGl0QnV0dG9ucyhcbiAgICA6Y3JlYXRhYmxlPVwiY3JlYXRhYmxlXCJcbiAgICA6ZGVsZXRhYmxlPVwib2JqZWN0RGF0YSAmJiBkZWxldGFibGVcIlxuICAgIDplZGl0YWJsZT1cIm9iamVjdERhdGEgJiYgZWRpdGFibGVcIlxuICAgIDpjcmVhdGVQYXRoPVwicGF0aFwiXG4gICAgOmVkaXRQYXRoPVwicGF0aFwiXG4gICAgOmJ1dHRvbnM9XCJidXR0b25TY2hlbWFzXCJcbiAgICA6c2NoZW1hPVwic2NoZW1hXCJcbiAgICA6ZGF0YVBhdGg9XCJkYXRhUGF0aFwiXG4gICAgOmRhdGE9XCJvYmplY3REYXRhXCJcbiAgICA6cGF0aD1cInBhdGhcIlxuICAgIDptZXRhPVwibWV0YVwiXG4gICAgOnN0b3JlPVwic3RvcmVcIlxuICAgIEBkZWxldGU9XCJkZWxldGVJdGVtKG9iamVjdERhdGEpXCJcbiAgKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcbmltcG9ydCBEaXRvQ29udGV4dCBmcm9tICcuLi9EaXRvQ29udGV4dC5qcydcbmltcG9ydCBTb3VyY2VNaXhpbiBmcm9tICcuLi9taXhpbnMvU291cmNlTWl4aW4uanMnXG5pbXBvcnQgeyByZXNvbHZlU2NoZW1hQ29tcG9uZW50IH0gZnJvbSAnLi4vdXRpbHMvc2NoZW1hLmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoJ29iamVjdCcsIHtcbiAgbWl4aW5zOiBbU291cmNlTWl4aW5dLFxuXG4gIGFsaWduQm90dG9tOiBmYWxzZSxcblxuICBnZXRTb3VyY2VUeXBlKHR5cGUpIHtcbiAgICAvLyBObyBuZWVkIGZvciB0cmFuc2Zvcm1hdGlvbiBoZXJlLiBTZWUgVHlwZVRyZWVMaXN0IGZvciBkZXRhaWxzLlxuICAgIHJldHVybiB0eXBlXG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBvYmplY3RMYWJlbCgpIHtcbiAgICAgIC8vIE9ubHkgc2hvdyBhIGxhYmVsIGlmIHRoZSBvYmplY3QgaXMgY29sbGFwc2libGUuXG4gICAgICByZXR1cm4gdGhpcy5jb2xsYXBzaWJsZVxuICAgICAgICA/IHRoaXMuZ2V0SXRlbUxhYmVsKHRoaXMuc2NoZW1hLCB0aGlzLm9iamVjdERhdGEsIHsgYXNPYmplY3Q6IHRydWUgfSlcbiAgICAgICAgOiBudWxsXG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBnZXRDb250ZXh0KCkge1xuICAgICAgcmV0dXJuIG5ldyBEaXRvQ29udGV4dCh0aGlzLCB7IGRhdGE6IHRoaXMub2JqZWN0RGF0YSB9KVxuICAgIH1cbiAgfSxcblxuICBhc3luYyBwcm9jZXNzU2NoZW1hKFxuICAgIGFwaSxcbiAgICBzY2hlbWEsXG4gICAgbmFtZSxcbiAgICByb3V0ZXMsXG4gICAgbGV2ZWwsXG4gICAgbmVzdGVkID0gZmFsc2UsXG4gICAgZmxhdHRlbiA9IGZhbHNlLFxuICAgIHByb2Nlc3MgPSBudWxsXG4gICkge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIHJlc29sdmVTY2hlbWFDb21wb25lbnQoc2NoZW1hKSxcbiAgICAgIFNvdXJjZU1peGluLnByb2Nlc3NTY2hlbWEoXG4gICAgICAgIGFwaSxcbiAgICAgICAgc2NoZW1hLFxuICAgICAgICBuYW1lLFxuICAgICAgICByb3V0ZXMsXG4gICAgICAgIGxldmVsLFxuICAgICAgICBuZXN0ZWQsXG4gICAgICAgIGZsYXR0ZW4sXG4gICAgICAgIHByb2Nlc3NcbiAgICAgIClcbiAgICBdKVxuICB9XG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tb2JqZWN0IHtcbiAgZGlzcGxheTogZmxleDtcbiAgYm9yZGVyOiAkYm9yZGVyLXN0eWxlO1xuICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcbiAgbWFyZ2luOiAwO1xuICBwYWRkaW5nOiAkZm9ybS1zcGFjaW5nO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuXG4gIC5kaXRvLW9iamVjdC1jb250ZW50IHtcbiAgICBmbGV4OiAwIDEgMTAwJTtcbiAgfVxuXG4gID4gLmRpdG8tYnV0dG9ucyB7XG4gICAgZmxleDogMSAwIDAlO1xuICAgIG1hcmdpbi1sZWZ0OiAkZm9ybS1zcGFjaW5nO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHNjcmlwdD5cbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKCdwYW5lbCcsIHtcbiAgZGVmYXVsdFZhbHVlOiAoKSA9PiB1bmRlZmluZWQsIC8vIENhbGxiYWNrIHRvIG92ZXJyaWRlIGBkZWZhdWx0VmFsdWU6IG51bGxgXG4gIGV4Y2x1ZGVWYWx1ZTogdHJ1ZSxcbiAgZ2VuZXJhdGVMYWJlbDogZmFsc2UsXG4gIGFsaWduQm90dG9tOiBmYWxzZSxcbiAgb21pdFBhZGRpbmc6IHRydWUsXG5cbiAgZ2V0UGFuZWxTY2hlbWEoYXBpLCBzY2hlbWEpIHtcbiAgICAvLyBGb3IgYSBUeXBlUGFuZWwsIHRoZSBjb21wb25lbnQgc2NoZW1hIGlzIGFsc28gdGhlIHBhbmVsIHNjaGVtYSwgYnV0XG4gICAgLy8gcmVtb3ZlIHRoZSBhZGRlZCBuYW1lLCBzbyBpdCBkb2Vzbid0IGdldCBhcHBlbmRlZCB0d2ljZSB0byBkYXRhLXBhdGguXG4gICAgY29uc3QgeyBuYW1lLCAuLi5wYW5lbCB9ID0gc2NoZW1hXG4gICAgcmV0dXJuIHBhbmVsXG4gIH1cbn0pXG48L3NjcmlwdD5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG5wcm9ncmVzcy5kaXRvLXByb2dyZXNzKFxuICA6aWQ9XCJkYXRhUGF0aFwiXG4gIHJlZj1cImVsZW1lbnRcIlxuICA6dmFsdWU9XCJwcm9ncmVzc1ZhbHVlXCJcbiAgOm1heD1cInByb2dyZXNzTWF4XCJcbiAgdi1iaW5kPVwiYXR0cmlidXRlc1wiXG4pXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IE51bWJlck1peGluIGZyb20gJy4uL21peGlucy9OdW1iZXJNaXhpbi5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKCdwcm9ncmVzcycsIHtcbiAgbWl4aW5zOiBbTnVtYmVyTWl4aW5dLFxuICBjb21wdXRlZDoge1xuICAgIHByb2dyZXNzVmFsdWUoKSB7XG4gICAgICBsZXQgeyB2YWx1ZSwgcmFuZ2UsIHN0ZXAgfSA9IHRoaXNcbiAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICBpZiAocmFuZ2UpIHtcbiAgICAgICAgICB2YWx1ZSAtPSByYW5nZVswXVxuICAgICAgICB9XG4gICAgICAgIGlmIChzdGVwKSB7XG4gICAgICAgICAgdmFsdWUgPSBNYXRoLnJvdW5kKHZhbHVlIC8gc3RlcCkgKiBzdGVwXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gJydcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZVxuICAgIH0sXG5cbiAgICBwcm9ncmVzc01heCgpIHtcbiAgICAgIGNvbnN0IHsgcmFuZ2UgfSA9IHRoaXNcbiAgICAgIHJldHVybiByYW5nZSA/IHJhbmdlWzFdIC0gcmFuZ2VbMF0gOiBudWxsXG4gICAgfVxuICB9XG59KVxuPC9zY3JpcHQ+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxudWwuZGl0by1yYWRpby1idXR0b25zKFxuICA6aWQ9XCJkYXRhUGF0aFwiXG4gIDpjbGFzcz1cImBkaXRvLWxheW91dC0ke3NjaGVtYS5sYXlvdXQgfHwgJ3ZlcnRpY2FsJ31gXCJcbilcbiAgbGkoXG4gICAgdi1mb3I9XCJvcHRpb24gaW4gb3B0aW9uc1wiXG4gIClcbiAgICBsYWJlbFxuICAgICAgaW5wdXQuZGl0by1yYWRpby1idXR0b24oXG4gICAgICAgIHJlZj1cImVsZW1lbnRcIlxuICAgICAgICB2LW1vZGVsPVwic2VsZWN0ZWRWYWx1ZVwiXG4gICAgICAgIHR5cGU9XCJyYWRpb1wiXG4gICAgICAgIDp2YWx1ZT1cImdldFZhbHVlRm9yT3B0aW9uKG9wdGlvbilcIlxuICAgICAgICB2LWJpbmQ9XCJhdHRyaWJ1dGVzXCJcbiAgICAgIClcbiAgICAgIHwge3sgZ2V0TGFiZWxGb3JPcHRpb24ob3B0aW9uKSB9fVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcbmltcG9ydCBPcHRpb25zTWl4aW4gZnJvbSAnLi4vbWl4aW5zL09wdGlvbnNNaXhpbi5qcydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKCdyYWRpbycsIHtcbiAgbWl4aW5zOiBbT3B0aW9uc01peGluXSxcblxuICBuYXRpdmVGaWVsZDogdHJ1ZVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXJhZGlvLWJ1dHRvbnMge1xuICBsYWJlbCB7XG4gICAgQGV4dGVuZCAlaW5wdXQtYm9yZGVybGVzcztcbiAgfVxuXG4gIC5kaXRvLXJhZGlvLWJ1dHRvbiB7XG4gICAgbWFyZ2luLXJpZ2h0OiAkZm9ybS1zcGFjaW5nO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLXNlY3Rpb24oOmNsYXNzPVwieyAnZGl0by1zZWN0aW9uLWxhYmVsbGVkJzogISFzY2hlbWEubGFiZWwgfVwiKVxuICBEaXRvUGFuZS5kaXRvLXNlY3Rpb24tcGFuZShcbiAgICA6c2NoZW1hPVwiZ2V0SXRlbUZvcm1TY2hlbWEoc2NoZW1hLCBpdGVtLCBjb250ZXh0KVwiXG4gICAgOmRhdGFQYXRoPVwiZGF0YVBhdGhcIlxuICAgIDpkYXRhPVwiaXRlbVwiXG4gICAgOm1ldGE9XCJtZXRhXCJcbiAgICA6c3RvcmU9XCJzdG9yZVwiXG4gICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IERpdG9UeXBlQ29tcG9uZW50IGZyb20gJy4uL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IHsgZ2V0SXRlbUZvcm1TY2hlbWEsIHByb2Nlc3NTY2hlbWFDb21wb25lbnRzIH0gZnJvbSAnLi4vdXRpbHMvc2NoZW1hLmpzJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoJ3NlY3Rpb24nLCB7XG4gIGRlZmF1bHRWYWx1ZTogKCkgPT4gdW5kZWZpbmVkLCAvLyBDYWxsYmFjayB0byBvdmVycmlkZSBgZGVmYXVsdFZhbHVlOiBudWxsYFxuICBpZ25vcmVNaXNzaW5nVmFsdWU6IHNjaGVtYSA9PiAhc2NoZW1hLm5lc3RlZCAmJiAhKCdkZWZhdWx0JyBpbiBzY2hlbWEpLFxuICBkZWZhdWx0TmVzdGVkOiBmYWxzZSxcbiAgZ2VuZXJhdGVMYWJlbDogZmFsc2UsXG4gIGFsaWduQm90dG9tOiBmYWxzZSxcblxuICBjb21wdXRlZDoge1xuICAgIGl0ZW0oKSB7XG4gICAgICByZXR1cm4gdGhpcy5uZXN0ZWQgPyB0aGlzLnZhbHVlIDogdGhpcy5kYXRhXG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBnZXRJdGVtRm9ybVNjaGVtYVxuICB9LFxuXG4gIGFzeW5jIHByb2Nlc3NTY2hlbWEoYXBpLCBzY2hlbWEsIG5hbWUsIHJvdXRlcywgbGV2ZWwpIHtcbiAgICAvLyBQcm9jZXNzIHNlY3Rpb24gY29tcG9uZW50cyBzbyB0aGVpciBmb3JtcyBnZXQgcmVzb2x2ZWQgdG9vLlxuICAgIGF3YWl0IHByb2Nlc3NTY2hlbWFDb21wb25lbnRzKGFwaSwgc2NoZW1hLCByb3V0ZXMsIGxldmVsKVxuICB9XG59KVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tc2VjdGlvbiB7XG4gICYuZGl0by1zZWN0aW9uLWxhYmVsbGVkIHtcbiAgICBib3JkZXI6ICRib3JkZXItc3R5bGU7XG4gICAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG4gICAgcGFkZGluZzogJGZvcm0tc3BhY2luZztcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi8vLSBOZXN0aW5nIGlzIG5lZWRlZCB0byBtYWtlIGFuIGFycm93IGFwcGVhciBvdmVyIHRoZSBzZWxlY3QgaXRlbTpcbi5kaXRvLXNlbGVjdFxuICBzZWxlY3QoXG4gICAgOmlkPVwiZGF0YVBhdGhcIlxuICAgIHJlZj1cImVsZW1lbnRcIlxuICAgIHYtbW9kZWw9XCJzZWxlY3RlZFZhbHVlXCJcbiAgICB2LWJpbmQ9XCJhdHRyaWJ1dGVzXCJcbiAgICBAbW91c2Vkb3duPVwicG9wdWxhdGUgPSB0cnVlXCJcbiAgICBAZm9jdXM9XCJwb3B1bGF0ZSA9IHRydWVcIlxuICApXG4gICAgdGVtcGxhdGUoXG4gICAgICB2LWlmPVwicG9wdWxhdGVcIlxuICAgIClcbiAgICAgIHRlbXBsYXRlKFxuICAgICAgICB2LWZvcj1cIm9wdGlvbiBpbiBvcHRpb25zXCJcbiAgICAgIClcbiAgICAgICAgb3B0Z3JvdXAoXG4gICAgICAgICAgdi1pZj1cImdyb3VwQnlcIlxuICAgICAgICAgIDpsYWJlbD1cIm9wdGlvbltncm91cEJ5TGFiZWxdXCJcbiAgICAgICAgKVxuICAgICAgICAgIG9wdGlvbihcbiAgICAgICAgICAgIHYtZm9yPVwib3B0IGluIG9wdGlvbltncm91cEJ5T3B0aW9uc11cIlxuICAgICAgICAgICAgOnZhbHVlPVwiZ2V0VmFsdWVGb3JPcHRpb24ob3B0KVwiXG4gICAgICAgICAgKSB7eyBnZXRMYWJlbEZvck9wdGlvbihvcHQpIH19XG4gICAgICAgIG9wdGlvbihcbiAgICAgICAgICB2LWVsc2VcbiAgICAgICAgICA6dmFsdWU9XCJnZXRWYWx1ZUZvck9wdGlvbihvcHRpb24pXCJcbiAgICAgICAgKSB7eyBnZXRMYWJlbEZvck9wdGlvbihvcHRpb24pIH19XG4gICAgdGVtcGxhdGUoXG4gICAgICB2LWVsc2UtaWY9XCJzZWxlY3RlZE9wdGlvblwiXG4gICAgKVxuICAgICAgb3B0aW9uKDp2YWx1ZT1cInNlbGVjdGVkVmFsdWVcIikge3sgZ2V0TGFiZWxGb3JPcHRpb24oc2VsZWN0ZWRPcHRpb24pIH19XG4gIGJ1dHRvbi5kaXRvLWJ1dHRvbi1jbGVhci5kaXRvLWJ1dHRvbi1vdmVybGF5KFxuICAgIHYtaWY9XCJzaG93Q2xlYXJCdXR0b25cIlxuICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICBAY2xpY2s9XCJjbGVhclwiXG4gIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b1R5cGVDb21wb25lbnQgZnJvbSAnLi4vRGl0b1R5cGVDb21wb25lbnQuanMnXG5pbXBvcnQgT3B0aW9uc01peGluIGZyb20gJy4uL21peGlucy9PcHRpb25zTWl4aW4uanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvVHlwZUNvbXBvbmVudC5yZWdpc3Rlcignc2VsZWN0Jywge1xuICBtaXhpbnM6IFtPcHRpb25zTWl4aW5dLFxuXG4gIG5hdGl2ZUZpZWxkOiB0cnVlLFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIERpc2FibGUgbGF6eS1wb3B1bGF0aW9uIGZvciBub3cuXG4gICAgICAvLyBUT0RPOiBTZXQgdG8gYGZhbHNlYCBPbmNlIGxpbmV0byBlMmUgdGVzdHMgYWRkcmVzcyB0aGVpciBpc3N1ZXMuXG4gICAgICBwb3B1bGF0ZTogdHJ1ZVxuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi8vIFRPRE86IE1vdmUgdG8gZGl0by11aVxuJHNlbGVjdC1hcnJvdy1yaWdodDogY2FsYygoJHNlbGVjdC1hcnJvdy13aWR0aCAtICRzZWxlY3QtYXJyb3ctc2l6ZSkgLyAyKTtcblxuLmRpdG8tc2VsZWN0IHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG5cbiAgc2VsZWN0IHtcbiAgICBwYWRkaW5nLXJpZ2h0OiAkc2VsZWN0LWFycm93LXdpZHRoO1xuICB9XG4gIC8vIEhhbmRsZSAuZGl0by13aWR0aC1maWxsIHNlcGFyYXRlbHkgZHVlIHRvIHJlcXVpcmVkIG5lc3Rpbmcgb2Ygc2VsZWN0OlxuICAmLmRpdG8td2lkdGgtZmlsbCB7XG4gICAgc2VsZWN0IHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgIH1cbiAgfVxuXG4gICY6OmFmdGVyIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgQGluY2x1ZGUgYXJyb3coJHNlbGVjdC1hcnJvdy1zaXplKTtcblxuICAgIGJvdHRvbTogJHNlbGVjdC1hcnJvdy1ib3R0b207XG4gICAgcmlnaHQ6IGNhbGMoI3skc2VsZWN0LWFycm93LXJpZ2h0fSArICN7JGJvcmRlci13aWR0aH0pO1xuICB9XG5cbiAgJi5kaXRvLWRpc2FibGVkOjphZnRlciB7XG4gICAgYm9yZGVyLWNvbG9yOiAkYm9yZGVyLWNvbG9yO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLXNsaWRlclxuICBpbnB1dC5kaXRvLXJhbmdlKFxuICAgIDppZD1cImRhdGFQYXRoXCJcbiAgICByZWY9XCJlbGVtZW50XCJcbiAgICB2LW1vZGVsPVwiaW5wdXRWYWx1ZVwiXG4gICAgdHlwZT1cInJhbmdlXCJcbiAgICB2LWJpbmQ9XCJhdHRyaWJ1dGVzXCJcbiAgICA6bWluPVwibWluXCJcbiAgICA6bWF4PVwibWF4XCJcbiAgICA6c3RlcD1cInN0ZXBWYWx1ZVwiXG4gIClcbiAgSW5wdXRGaWVsZC5kaXRvLW51bWJlcihcbiAgICB2LWlmPVwiaW5wdXRcIlxuICAgIHYtbW9kZWw9XCJpbnB1dFZhbHVlXCJcbiAgICB0eXBlPVwibnVtYmVyXCJcbiAgICB2LWJpbmQ9XCJhdHRyaWJ1dGVzXCJcbiAgICA6bWluPVwibWluXCJcbiAgICA6bWF4PVwibWF4XCJcbiAgICA6c3RlcD1cInN0ZXBWYWx1ZVwiXG4gIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b1R5cGVDb21wb25lbnQgZnJvbSAnLi4vRGl0b1R5cGVDb21wb25lbnQuanMnXG5pbXBvcnQgTnVtYmVyTWl4aW4gZnJvbSAnLi4vbWl4aW5zL051bWJlck1peGluLmpzJ1xuaW1wb3J0IHsgZ2V0U2NoZW1hQWNjZXNzb3IgfSBmcm9tICcuLi91dGlscy9hY2Nlc3Nvci5qcydcbmltcG9ydCB7IElucHV0RmllbGQgfSBmcm9tICdAZGl0b2pzL3VpL3NyYydcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmV4cG9ydCBkZWZhdWx0IERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKCdzbGlkZXInLCB7XG4gIG1peGluczogW051bWJlck1peGluXSxcbiAgY29tcG9uZW50czogeyBJbnB1dEZpZWxkIH0sXG4gIG5hdGl2ZUZpZWxkOiB0cnVlLFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgLy8gVE9ETzogUmVuYW1lIHRvIGBzaG93SW5wdXRgP1xuICAgIGlucHV0OiBnZXRTY2hlbWFBY2Nlc3NvcignaW5wdXQnLCB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgIH0pXG4gIH1cbn0pXG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1zbGlkZXIge1xuICBAZXh0ZW5kICVpbnB1dDtcblxuICBkaXNwbGF5OiBmbGV4O1xuXG4gIC5kaXRvLXJhbmdlIHtcbiAgICBmbGV4OiBhdXRvO1xuICAgIGhlaWdodDogY2FsYygxZW0gKiB2YXIoLS1saW5lLWhlaWdodCkpO1xuICB9XG5cbiAgLmRpdG8tbnVtYmVyIHtcbiAgICBib3JkZXI6IDA7XG4gICAgcGFkZGluZzogMDtcbiAgICB0ZXh0LWFsaWduOiByaWdodDtcbiAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cblN3aXRjaEJ1dHRvbi5kaXRvLXN3aXRjaChcbiAgOmlkPVwiZGF0YVBhdGhcIlxuICByZWY9XCJlbGVtZW50XCJcbiAgdi1tb2RlbD1cInZhbHVlXCJcbiAgOmxhYmVscz1cImxhYmVsc1wiXG4gIHYtYmluZD1cImF0dHJpYnV0ZXNcIlxuKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcbmltcG9ydCB7IFN3aXRjaEJ1dHRvbiB9IGZyb20gJ0BkaXRvanMvdWkvc3JjJ1xuXG4vLyBAdnVlL2NvbXBvbmVudFxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoJ3N3aXRjaCcsIHtcbiAgZGVmYXVsdFZhbHVlOiBmYWxzZSxcbiAgZGVmYXVsdFdpZHRoOiAnYXV0bycsXG5cbiAgY29tcG9uZW50czoge1xuICAgIFN3aXRjaEJ1dHRvblxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgbGFiZWxzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hLmxhYmVsc1xuICAgIH1cbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXN3aXRjaCB7XG4gIC5kaXRvLXN3aXRjaC1sYWJlbCB7XG4gICAgZm9udC1zaXplOiAkZm9udC1zaXplLXNtYWxsO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbklucHV0RmllbGQuZGl0by10ZXh0KFxuICA6aWQ9XCJkYXRhUGF0aFwiXG4gIHJlZj1cImVsZW1lbnRcIlxuICB2LW1vZGVsPVwiaW5wdXRWYWx1ZVwiXG4gIDp0eXBlPVwiaW5wdXRUeXBlXCJcbiAgdi1iaW5kPVwiYXR0cmlidXRlc1wiXG4pXG4gIHRlbXBsYXRlKCNhZnRlcilcbiAgICBidXR0b24uZGl0by1idXR0b24tY2xlYXIuZGl0by1idXR0b24tb3ZlcmxheShcbiAgICAgIHYtaWY9XCJzaG93Q2xlYXJCdXR0b25cIlxuICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgICAgQGNsaWNrLnN0b3A9XCJjbGVhclwiXG4gICAgKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcbmltcG9ydCB7IElucHV0RmllbGQgfSBmcm9tICdAZGl0b2pzL3VpL3NyYydcblxuY29uc3QgbWFza2VkUGFzc3dvcmQgPSAnKioqKioqKioqKioqKioqKidcblxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoXG4gIFtcbiAgICAndGV4dCcsXG4gICAgJ2VtYWlsJyxcbiAgICAndXJsJyxcbiAgICAnaG9zdG5hbWUnLFxuICAgICdkb21haW4nLFxuICAgICd0ZWwnLFxuICAgICdwYXNzd29yZCcsXG4gICAgJ2NyZWRpdGNhcmQnXG4gIF0sXG4gIC8vIEB2dWUvY29tcG9uZW50XG4gIHtcbiAgICBjb21wb25lbnRzOiB7IElucHV0RmllbGQgfSxcbiAgICBuYXRpdmVGaWVsZDogdHJ1ZSxcbiAgICB0ZXh0RmllbGQ6IHRydWUsXG4gICAgaWdub3JlTWlzc2luZ1ZhbHVlOiBzY2hlbWEgPT4gc2NoZW1hLnR5cGUgPT09ICdwYXNzd29yZCcsXG5cbiAgICBjb21wdXRlZDoge1xuICAgICAgaW5wdXRUeXBlKCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNyZWRpdGNhcmQ6ICd0ZXh0JyxcbiAgICAgICAgICAgIGhvc3RuYW1lOiAndGV4dCcsXG4gICAgICAgICAgICBkb21haW46ICd0ZXh0J1xuICAgICAgICAgIH1bdGhpcy50eXBlXSB8fFxuICAgICAgICAgIHRoaXMudHlwZVxuICAgICAgICApXG4gICAgICB9LFxuXG4gICAgICBpbnB1dFZhbHVlOiB7XG4gICAgICAgIGdldCgpIHtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy50eXBlID09PSAncGFzc3dvcmQnICYmXG4gICAgICAgICAgICB0aGlzLnZhbHVlID09PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICF0aGlzLmZvY3VzZWRcbiAgICAgICAgICApXG4gICAgICAgICAgICA/IG1hc2tlZFBhc3N3b3JkXG4gICAgICAgICAgICA6IHRoaXMudmFsdWVcbiAgICAgICAgfSxcblxuICAgICAgICBzZXQodmFsdWUpIHtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBtZXRob2RzOiB7XG4gICAgICBnZXRWYWxpZGF0aW9ucygpIHtcbiAgICAgICAgY29uc3QgcnVsZSA9IHtcbiAgICAgICAgICBlbWFpbDogJ2VtYWlsJyxcbiAgICAgICAgICB1cmw6ICd1cmwnLFxuICAgICAgICAgIGhvc3RuYW1lOiAnaG9zdG5hbWUnLFxuICAgICAgICAgIGRvbWFpbjogJ2RvbWFpbicsXG4gICAgICAgICAgcGFzc3dvcmQ6ICdwYXNzd29yZCcsXG4gICAgICAgICAgY3JlZGl0Y2FyZDogJ2NyZWRpdGNhcmQnXG4gICAgICAgIH1bdGhpcy50eXBlXVxuICAgICAgICByZXR1cm4gcnVsZSA/IHsgW3J1bGVdOiB0cnVlIH0gOiB7fVxuICAgICAgfVxuICAgIH1cbiAgfVxuKVxuPC9zY3JpcHQ+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxudGV4dGFyZWEuZGl0by10ZXh0YXJlYS5kaXRvLWlucHV0KFxuICA6aWQ9XCJkYXRhUGF0aFwiXG4gIHJlZj1cImVsZW1lbnRcIlxuICB2LW1vZGVsPVwidmFsdWVcIlxuICB2LWJpbmQ9XCJhdHRyaWJ1dGVzXCJcbiAgOnJvd3M9XCJsaW5lc1wiXG4gIDpjbGFzcz1cInsgJ2RpdG8tcmVzaXphYmxlJzogcmVzaXphYmxlIH1cIlxuKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcbmltcG9ydCB7IGdldFNjaGVtYUFjY2Vzc29yIH0gZnJvbSAnLi4vdXRpbHMvYWNjZXNzb3IuanMnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvVHlwZUNvbXBvbmVudC5yZWdpc3RlcigndGV4dGFyZWEnLCB7XG4gIG5hdGl2ZUZpZWxkOiB0cnVlLFxuICB0ZXh0RmllbGQ6IHRydWUsXG4gIGFsaWduQm90dG9tOiBmYWxzZSxcblxuICBjb21wdXRlZDoge1xuICAgIGxpbmVzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hLmxpbmVzIHx8IDRcbiAgICB9LFxuXG4gICAgcmVzaXphYmxlOiBnZXRTY2hlbWFBY2Nlc3NvcigncmVzaXphYmxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSlcbiAgfVxufSlcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXRleHRhcmVhIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHJlc2l6ZTogbm9uZTtcbiAgbWluLWhlaWdodDogY2FsYygxZW0gKiB2YXIoLS1saW5lLWhlaWdodCkgKyAjezIgKiAkaW5wdXQtcGFkZGluZy12ZXJ9KTtcblxuICAmLmRpdG8tcmVzaXphYmxlIHtcbiAgICByZXNpemU6IHZlcnRpY2FsO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLXRyZWUtbGlzdFxuICBEaXRvU2NvcGVzKFxuICAgIHYtaWY9XCJzY29wZXNcIlxuICAgIDpxdWVyeT1cInF1ZXJ5XCJcbiAgICA6c2NvcGVzPVwic2NvcGVzXCJcbiAgKVxuICAuZGl0by10cmVlLXBhbmVsXG4gICAgRGl0b1RyZWVJdGVtKFxuICAgICAgOnNjaGVtYT1cInRyZWVTY2hlbWFcIlxuICAgICAgOmRhdGFQYXRoPVwidHJlZURhdGFQYXRoXCJcbiAgICAgIDpkYXRhPVwidHJlZURhdGFcIlxuICAgICAgOmRyYWdnYWJsZT1cImRyYWdnYWJsZVwiXG4gICAgICA6b3Blbj1cInRydWVcIlxuICAgIClcbiAgICAuZGl0by10cmVlLWZvcm0tY29udGFpbmVyKFxuICAgICAgdi1pZj1cImhhc0VkaXRhYmxlRm9ybXNcIlxuICAgIClcbiAgICAgIC8vLSBJbmNsdWRlIGEgcm91dGVyLXZpZXcgZm9yIHRoZSBvcHRpb25hbCBEaXRvRm9ybUlubGluZWRcbiAgICAgIFJvdXRlclZpZXdcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgRGl0b1R5cGVDb21wb25lbnQgZnJvbSAnLi4vRGl0b1R5cGVDb21wb25lbnQuanMnXG5pbXBvcnQgU291cmNlTWl4aW4gZnJvbSAnLi4vbWl4aW5zL1NvdXJjZU1peGluLmpzJ1xuaW1wb3J0IHtcbiAgaGFzRm9ybVNjaGVtYSxcbiAgZ2V0Rm9ybVNjaGVtYXMsXG4gIHJlc29sdmVTY2hlbWFDb21wb25lbnRzXG59IGZyb20gJy4uL3V0aWxzL3NjaGVtYS5qcydcblxuZXhwb3J0IGRlZmF1bHQgRGl0b1R5cGVDb21wb25lbnQucmVnaXN0ZXIoXG4gIFsndHJlZS1saXN0JywgJ3RyZWUtb2JqZWN0J10sXG4gIC8vIEB2dWUvY29tcG9uZW50XG4gIHtcbiAgICBtaXhpbnM6IFtTb3VyY2VNaXhpbl0sXG5cbiAgICBhbGlnbkJvdHRvbTogZmFsc2UsXG5cbiAgICBwcm92aWRlKCkge1xuICAgICAgcmV0dXJuIHsgY29udGFpbmVyOiB0aGlzIH1cbiAgICB9LFxuXG4gICAgZ2V0U291cmNlVHlwZSh0eXBlKSB7XG4gICAgICByZXR1cm4gdHlwZSA9PT0gJ3RyZWUtb2JqZWN0JyA/ICdvYmplY3QnIDogJ2xpc3QnXG4gICAgfSxcblxuICAgIGNvbXB1dGVkOiB7XG4gICAgICBwYXRoKCkge1xuICAgICAgICAvLyBBY2Nlc3NlZCBmcm9tIERpdG9UcmVlSXRlbSB0aHJvdWdoIGBjb250YWluZXIucGF0aGA6XG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1Db21wb25lbnQ/LnBhdGhcbiAgICAgIH0sXG5cbiAgICAgIGVkaXRQYXRoKCkge1xuICAgICAgICAvLyBBY2Nlc3NlZCBmcm9tIERpdG9UcmVlSXRlbSB0aHJvdWdoIGBjb250YWluZXIuZWRpdFBhdGhgOlxuICAgICAgICByZXR1cm4gdGhpcy4kcm91dGUucGF0aC5zbGljZSh0aGlzLnBhdGg/Lmxlbmd0aClcbiAgICAgIH0sXG5cbiAgICAgIHRyZWVEYXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0xpc3RTb3VyY2VcbiAgICAgICAgICA/IHsgW3RoaXMubmFtZV06IHRoaXMudmFsdWUgfVxuICAgICAgICAgIDogdGhpcy52YWx1ZVxuICAgICAgfSxcblxuICAgICAgdHJlZURhdGFQYXRoKCkge1xuICAgICAgICAvLyBSZW1vdmUgYG5hbWVgIGZyb20gYGRhdGFQYXRoYCwgYXMgaXQgaXMgYWRkZWRcbiAgICAgICAgLy8gdG8gYHRyZWVEYXRhYCBhbmQgYHRyZWVTY2hlbWFgXG4gICAgICAgIHJldHVybiB0aGlzLmlzTGlzdFNvdXJjZVxuICAgICAgICAgID8gdGhpcy5kYXRhUGF0aC5zbGljZSgwLCB0aGlzLmRhdGFQYXRoLmxlbmd0aCAtIHRoaXMubmFtZS5sZW5ndGgpXG4gICAgICAgICAgOiB0aGlzLmRhdGFQYXRoXG4gICAgICB9LFxuXG4gICAgICB0cmVlU2NoZW1hKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0xpc3RTb3VyY2VcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgY2hpbGRyZW46IHtcbiAgICAgICAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgICAgICAgICAgLi4udGhpcy5zY2hlbWFcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIDogdGhpcy5zY2hlbWFcbiAgICAgIH0sXG5cbiAgICAgIGhhc0VkaXRhYmxlRm9ybXMoKSB7XG4gICAgICAgIGNvbnN0IGhhc0VkaXRhYmxlRm9ybXMgPSBzY2hlbWEgPT4ge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBoYXNGb3JtU2NoZW1hKHNjaGVtYSkgJiYgKFxuICAgICAgICAgICAgICB0aGlzLmdldFNjaGVtYVZhbHVlKCdlZGl0YWJsZScsIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHNjaGVtYVxuICAgICAgICAgICAgICB9KSB8fFxuICAgICAgICAgICAgICBzY2hlbWEuY2hpbGRyZW4gJiZcbiAgICAgICAgICAgICAgaGFzRWRpdGFibGVGb3JtcyhzY2hlbWEuY2hpbGRyZW4pXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYXNFZGl0YWJsZUZvcm1zKHRoaXMuc2NoZW1hKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBwcm9jZXNzU2NoZW1hKFxuICAgICAgYXBpLFxuICAgICAgc2NoZW1hLFxuICAgICAgbmFtZSxcbiAgICAgIHJvdXRlcyxcbiAgICAgIGxldmVsLFxuICAgICAgbmVzdGVkID0gdHJ1ZSxcbiAgICAgIGZsYXR0ZW4gPSBmYWxzZSxcbiAgICAgIHByb2Nlc3MgPSBudWxsXG4gICAgKSB7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIHJlc29sdmVTY2hlbWFDb21wb25lbnRzKHNjaGVtYS5wcm9wZXJ0aWVzKSxcbiAgICAgICAgU291cmNlTWl4aW4ucHJvY2Vzc1NjaGVtYShcbiAgICAgICAgICBhcGksXG4gICAgICAgICAgc2NoZW1hLFxuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgcm91dGVzLFxuICAgICAgICAgIGxldmVsLFxuICAgICAgICAgIG5lc3RlZCxcbiAgICAgICAgICBmbGF0dGVuLFxuICAgICAgICAgIC8vIFBhc3MgcHJvY2VzcygpIHRvIGFkZCBtb3JlIHJvdXRlcyB0byBjaGlsZFJvdXRlczpcbiAgICAgICAgICAoY2hpbGRSb3V0ZXMsIGxldmVsKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IGNoaWxkcmVuIH0gPSBzY2hlbWFcbiAgICAgICAgICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgICAgICAgICAvLyBBZGQgYHR5cGVgIHRvIHRoZSBuZXN0ZWQgdHJlZSBsaXN0LlxuICAgICAgICAgICAgICBjaGlsZHJlbi50eXBlID0gJ3RyZWUtbGlzdCdcbiAgICAgICAgICAgICAgLy8gUmVjdXJzaXZlbHkgY2FsbCBgcHJvY2Vzc1NjaGVtYSgpYCBmb3IgdGhlIG5lc3RlZCB0cmVlIGxpc3Q6XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NTY2hlbWEoXG4gICAgICAgICAgICAgICAgYXBpLFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuLFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuLm5hbWUsXG4gICAgICAgICAgICAgICAgY2hpbGRSb3V0ZXMsXG4gICAgICAgICAgICAgICAgbGV2ZWwsXG4gICAgICAgICAgICAgICAgbmVzdGVkLFxuICAgICAgICAgICAgICAgIHRydWUsIC8vIFBhc3MgYHRydWVgIGZvciBgZmxhdHRlbmAgaW4gdHJlZSBsaXN0cy5cbiAgICAgICAgICAgICAgICBwcm9jZXNzXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIClcbiAgICAgIF0pXG4gICAgfSxcblxuICAgIGdldEZvcm1TY2hlbWFzRm9yUHJvY2Vzc2luZyhzY2hlbWEsIGNvbnRleHQpIHtcbiAgICAgIC8vIENvbnZlcnQgbmVzdGVkIGNoaWxkcmVuIHNjaGVtYSB0byBzdGFuZC1hbG9uZSBzY2hlbWEgY29tcG9uZW50LFxuICAgICAgLy8gcHJlc2VudCBpbiBlYWNoIG9mIHRoZSBmb3JtcywgYXMgcmVxdWlyZWQgYnkgYHByb2Nlc3NTY2hlbWFEYXRhKClgXG4gICAgICBjb25zdCB7IGNoaWxkcmVuIH0gPSBzY2hlbWFcbiAgICAgIHJldHVybiBnZXRGb3JtU2NoZW1hcyhcbiAgICAgICAgc2NoZW1hLFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICBjaGlsZHJlblxuICAgICAgICAgID8gZm9ybSA9PiAoe1xuICAgICAgICAgICAgICAuLi5mb3JtLFxuICAgICAgICAgICAgICBjb21wb25lbnRzOiB7XG4gICAgICAgICAgICAgICAgLi4uZm9ybS5jb21wb25lbnRzLFxuICAgICAgICAgICAgICAgIFtjaGlsZHJlbi5uYW1lXTogY2hpbGRyZW5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICA6IG51bGxcbiAgICAgIClcbiAgICB9XG4gIH1cbilcbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXRyZWUtbGlzdCB7XG4gIEBleHRlbmQgJWZpZWxkO1xuXG4gIC5kaXRvLXRyZWUtcGFuZWwge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuXG4gICAgPiAuZGl0by10cmVlLWl0ZW0ge1xuICAgICAgZmxleDogMSAxIDI1JTtcbiAgICB9XG5cbiAgICA+IC5kaXRvLXRyZWUtZm9ybS1jb250YWluZXIge1xuICAgICAgZmxleDogMCAxIDc1JTtcbiAgICAgIGFsaWduLXNlbGY6IHN0cmV0Y2g7XG4gICAgICBiYWNrZ3JvdW5kOiAkY29udGVudC1jb2xvci1iYWNrZ3JvdW5kO1xuICAgICAgYm9yZGVyLWxlZnQ6ICRib3JkZXItc3R5bGU7XG4gICAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogJGJvcmRlci1yYWRpdXMgLSAxO1xuICAgICAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6ICRib3JkZXItcmFkaXVzIC0gMTtcbiAgICAgIG1hcmdpbjogKC0kaW5wdXQtcGFkZGluZy12ZXIpICgtJGlucHV0LXBhZGRpbmctaG9yKTtcbiAgICAgIG1hcmdpbi1sZWZ0OiAkaW5wdXQtcGFkZGluZy1ob3I7XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiaW1wb3J0IHsgZmlsZXNpemUgfSBmcm9tICdmaWxlc2l6ZSdcblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEZpbGVTaXplKHNpemUpIHtcbiAgcmV0dXJuIGZpbGVzaXplKHNpemUsIHsgYmFzZTogMTAgfSlcbn1cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by11cGxvYWRcbiAgdGFibGUuZGl0by10YWJsZS5kaXRvLXRhYmxlLXNlcGFyYXRvcnMuZGl0by10YWJsZS1iYWNrZ3JvdW5kXG4gICAgLy8tIFN0eWxpbmcgY29tZXMgZnJvbSBEaXRvVGFibGVIZWFkXG4gICAgdGhlYWQuZGl0by10YWJsZS1oZWFkXG4gICAgICB0clxuICAgICAgICB0aFxuICAgICAgICAgIHNwYW4gTmFtZVxuICAgICAgICB0aFxuICAgICAgICAgIHNwYW4gU2l6ZVxuICAgICAgICB0aFxuICAgICAgICAgIHNwYW4gU3RhdHVzXG4gICAgICAgIHRoXG4gICAgICAgICAgc3BhblxuICAgIERpdG9EcmFnZ2FibGUoXG4gICAgICB2LW1vZGVsPVwiZmlsZXNcIlxuICAgICAgdGFnPVwidGJvZHlcIlxuICAgICAgOm9wdGlvbnM9XCJnZXRTb3J0YWJsZU9wdGlvbnMoZmFsc2UpXCJcbiAgICAgIDpkcmFnZ2FibGU9XCJkcmFnZ2FibGVcIlxuICAgIClcbiAgICAgIHRyKFxuICAgICAgICB2LWZvcj1cIihmaWxlLCBpbmRleCkgaW4gZmlsZXNcIlxuICAgICAgICA6a2V5PVwiZmlsZS5rZXlcIlxuICAgICAgKVxuICAgICAgICB0ZChcbiAgICAgICAgICB2LWh0bWw9XCJyZW5kZXJGaWxlKGZpbGUsIGluZGV4KVwiXG4gICAgICAgIClcbiAgICAgICAgdGQge3sgZm9ybWF0RmlsZVNpemUoZmlsZS5zaXplKSB9fVxuICAgICAgICB0ZFxuICAgICAgICAgIHRlbXBsYXRlKFxuICAgICAgICAgICAgdi1pZj1cImZpbGUudXBsb2FkXCJcbiAgICAgICAgICApXG4gICAgICAgICAgICB0ZW1wbGF0ZShcbiAgICAgICAgICAgICAgdi1pZj1cImZpbGUudXBsb2FkLmVycm9yXCJcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfCBFcnJvcjoge3sgZmlsZS51cGxvYWQuZXJyb3IgfX1cbiAgICAgICAgICAgIHRlbXBsYXRlKFxuICAgICAgICAgICAgICB2LWVsc2UtaWY9XCJmaWxlLnVwbG9hZC5hY3RpdmVcIlxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB8IFVwbG9hZGluZy4uLlxuICAgICAgICAgICAgdGVtcGxhdGUoXG4gICAgICAgICAgICAgIHYtZWxzZS1pZj1cImZpbGUudXBsb2FkLnN1Y2Nlc3NcIlxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB8IFVwbG9hZGVkXG4gICAgICAgICAgdGVtcGxhdGUoXG4gICAgICAgICAgICB2LWVsc2VcbiAgICAgICAgICApXG4gICAgICAgICAgICB8IFN0b3JlZFxuICAgICAgICB0ZC5kaXRvLWNlbGwtZWRpdC1idXR0b25zXG4gICAgICAgICAgLmRpdG8tYnV0dG9ucy5kaXRvLWJ1dHRvbnMtcm91bmRcbiAgICAgICAgICAgIC8vLSBGaXJlZm94IGRvZXNuJ3QgbGlrZSA8YnV0dG9uPiBoZXJlLCBzbyB1c2UgPGE+IGluc3RlYWQ6XG4gICAgICAgICAgICBhLmRpdG8tYnV0dG9uKFxuICAgICAgICAgICAgICB2LWlmPVwiZHJhZ2dhYmxlXCJcbiAgICAgICAgICAgICAgdi1iaW5kPVwiZ2V0QnV0dG9uQXR0cmlidXRlcyh2ZXJicy5kcmFnKVwiXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBidXR0b24uZGl0by1idXR0b24oXG4gICAgICAgICAgICAgIHYtaWY9XCJkZWxldGFibGVcIlxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgdi1iaW5kPVwiZ2V0QnV0dG9uQXR0cmlidXRlcyh2ZXJicy5kZWxldGUpXCJcbiAgICAgICAgICAgICAgQGNsaWNrPVwiZGVsZXRlRmlsZShmaWxlLCBpbmRleClcIlxuICAgICAgICAgICAgKVxuICAgIHRmb290XG4gICAgICB0clxuICAgICAgICB0ZCg6Y29sc3Bhbj1cIjRcIilcbiAgICAgICAgICAuZGl0by11cGxvYWQtZm9vdGVyXG4gICAgICAgICAgICBwcm9ncmVzcy5kaXRvLXByb2dyZXNzKFxuICAgICAgICAgICAgICB2LWlmPVwiaXNVcGxvYWRBY3RpdmVcIlxuICAgICAgICAgICAgICA6dmFsdWU9XCJ1cGxvYWRQcm9ncmVzc1wiXG4gICAgICAgICAgICAgIG1heD1cIjEwMFwiXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuZGl0by1idXR0b25zLmRpdG8tYnV0dG9ucy1yb3VuZFxuICAgICAgICAgICAgICBidXR0b24uZGl0by1idXR0b24oXG4gICAgICAgICAgICAgICAgdi1pZj1cImlzVXBsb2FkQWN0aXZlXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBAY2xpY2sucHJldmVudD1cInVwbG9hZC5hY3RpdmUgPSBmYWxzZVwiXG4gICAgICAgICAgICAgICkgQ2FuY2VsIEFsbFxuICAgICAgICAgICAgICBidXR0b24uZGl0by1idXR0b24oXG4gICAgICAgICAgICAgICAgdi1lbHNlLWlmPVwiaXNVcGxvYWRSZWFkeVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgQGNsaWNrLnByZXZlbnQ9XCJ1cGxvYWQuYWN0aXZlID0gdHJ1ZVwiXG4gICAgICAgICAgICAgICkgVXBsb2FkIEFsbFxuICAgICAgICAgICAgICBWdWVVcGxvYWQuZGl0by1idXR0b24uZGl0by1idXR0b24tYWRkLXVwbG9hZChcbiAgICAgICAgICAgICAgICByZWY9XCJ1cGxvYWRcIlxuICAgICAgICAgICAgICAgIHYtbW9kZWw9XCJ1cGxvYWRzXCJcbiAgICAgICAgICAgICAgICA6aW5wdXRJZD1cImRhdGFQYXRoXCJcbiAgICAgICAgICAgICAgICA6bmFtZT1cImRhdGFQYXRoXCJcbiAgICAgICAgICAgICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgOnBvc3RBY3Rpb249XCJ1cGxvYWRQYXRoXCJcbiAgICAgICAgICAgICAgICA6ZXh0ZW5zaW9ucz1cImV4dGVuc2lvbnNcIlxuICAgICAgICAgICAgICAgIDphY2NlcHQ9XCJhY2NlcHRcIlxuICAgICAgICAgICAgICAgIDptdWx0aXBsZT1cIm11bHRpcGxlXCJcbiAgICAgICAgICAgICAgICA6c2l6ZT1cIm1heFNpemVcIlxuICAgICAgICAgICAgICAgIHRpdGxlPVwiVXBsb2FkIEZpbGVzXCJcbiAgICAgICAgICAgICAgICBAaW5wdXQtZmlsdGVyPVwiaW5wdXRGaWx0ZXJcIlxuICAgICAgICAgICAgICAgIEBpbnB1dC1maWxlPVwiaW5wdXRGaWxlXCJcbiAgICAgICAgICAgICAgKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuLi9EaXRvVHlwZUNvbXBvbmVudC5qcydcbmltcG9ydCBEaXRvQ29udGV4dCBmcm9tICcuLi9EaXRvQ29udGV4dC5qcydcbmltcG9ydCBTb3J0YWJsZU1peGluIGZyb20gJy4uL21peGlucy9Tb3J0YWJsZU1peGluLmpzJ1xuaW1wb3J0IHBhcnNlRmlsZVNpemUgZnJvbSAnZmlsZXNpemUtcGFyc2VyJ1xuaW1wb3J0IHsgZ2V0U2NoZW1hQWNjZXNzb3IgfSBmcm9tICcuLi91dGlscy9hY2Nlc3Nvci5qcydcbmltcG9ydCB7IGZvcm1hdEZpbGVTaXplIH0gZnJvbSAnLi4vdXRpbHMvdW5pdHMuanMnXG5pbXBvcnQgeyBhcHBlbmREYXRhUGF0aCB9IGZyb20gJy4uL3V0aWxzL2RhdGEuanMnXG5pbXBvcnQgeyBpc0FycmF5LCBhc0FycmF5LCBlc2NhcGVIdG1sIH0gZnJvbSAnQGRpdG9qcy91dGlscydcbmltcG9ydCBWdWVVcGxvYWQgZnJvbSAndnVlLXVwbG9hZC1jb21wb25lbnQnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5leHBvcnQgZGVmYXVsdCBEaXRvVHlwZUNvbXBvbmVudC5yZWdpc3RlcigndXBsb2FkJywge1xuICBtaXhpbnM6IFtTb3J0YWJsZU1peGluXSxcbiAgY29tcG9uZW50czogeyBWdWVVcGxvYWQgfSxcblxuICBhbGlnbkJvdHRvbTogZmFsc2UsXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdXBsb2FkczogW11cbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICB1cGxvYWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kcmVmcy51cGxvYWRcbiAgICB9LFxuXG4gICAgZmlsZXMoKSB7XG4gICAgICByZXR1cm4gYXNGaWxlcyh0aGlzLnZhbHVlKVxuICAgIH0sXG5cbiAgICBtdWx0aXBsZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ211bHRpcGxlJywge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgLy8gTm8gY2FsbGJhY2sgYXMgaXQncyB1c2VkIGluIGBwcm9jZXNzVmFsdWUoKWBcbiAgICAgIGNhbGxiYWNrOiBmYWxzZVxuICAgIH0pLFxuXG4gICAgZXh0ZW5zaW9uczogZ2V0U2NoZW1hQWNjZXNzb3IoJ2V4dGVuc2lvbnMnLCB7XG4gICAgICB0eXBlOiBbQXJyYXksIFN0cmluZywgUmVnRXhwXVxuICAgIH0pLFxuXG4gICAgYWNjZXB0OiBnZXRTY2hlbWFBY2Nlc3NvcignYWNjZXB0Jywge1xuICAgICAgdHlwZTogQXJyYXksXG4gICAgICBnZXQoYWNjZXB0KSB7XG4gICAgICAgIHJldHVybiBpc0FycmF5KGFjY2VwdCkgPyBhY2NlcHQuam9pbignLCcpIDogYWNjZXB0XG4gICAgICB9XG4gICAgfSksXG5cbiAgICBtYXhTaXplOiBnZXRTY2hlbWFBY2Nlc3NvcignbWF4U2l6ZScsIHtcbiAgICAgIHR5cGU6IFtTdHJpbmcsIE51bWJlcl0sXG4gICAgICBnZXQobWF4U2l6ZSkge1xuICAgICAgICByZXR1cm4gbWF4U2l6ZSA/IHBhcnNlRmlsZVNpemUobWF4U2l6ZSkgOiB1bmRlZmluZWRcbiAgICAgIH1cbiAgICB9KSxcblxuICAgIGRyYWdnYWJsZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ2RyYWdnYWJsZScsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgIGdldChkcmFnZ2FibGUpIHtcbiAgICAgICAgcmV0dXJuIGRyYWdnYWJsZSAmJiB0aGlzLmZpbGVzLmxlbmd0aCA+IDFcbiAgICAgIH1cbiAgICB9KSxcblxuICAgIGRlbGV0YWJsZTogZ2V0U2NoZW1hQWNjZXNzb3IoJ2RlbGV0YWJsZScsIHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH0pLFxuXG4gICAgaXNVcGxvYWRSZWFkeSgpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRoaXMudXBsb2Fkcy5sZW5ndGggJiZcbiAgICAgICAgISh0aGlzLnVwbG9hZC5hY3RpdmUgfHwgdGhpcy51cGxvYWQudXBsb2FkZWQpXG4gICAgICApXG4gICAgfSxcblxuICAgIGlzVXBsb2FkQWN0aXZlKCkge1xuICAgICAgcmV0dXJuIHRoaXMudXBsb2Fkcy5sZW5ndGggJiYgdGhpcy51cGxvYWQuYWN0aXZlXG4gICAgfSxcblxuICAgIHVwbG9hZFByb2dyZXNzKCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGhpcy51cGxvYWRzLnJlZHVjZSgodG90YWwsIGZpbGUpID0+IHRvdGFsICsgZmlsZS5wcm9ncmVzcywgMCkgL1xuICAgICAgICB0aGlzLnVwbG9hZHMubGVuZ3RoXG4gICAgICApXG4gICAgfSxcblxuICAgIHVwbG9hZFBhdGgoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRSZXNvdXJjZVVybCh7XG4gICAgICAgIHR5cGU6ICd1cGxvYWQnLFxuICAgICAgICBwYXRoOiB0aGlzLmFwaS5ub3JtYWxpemVQYXRoKHRoaXMuZGF0YVBhdGgpXG4gICAgICB9KVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZm9ybWF0RmlsZVNpemUsXG5cbiAgICByZW5kZXJGaWxlKGZpbGUsIGluZGV4KSB7XG4gICAgICBjb25zdCB7IHJlbmRlciB9ID0gdGhpcy5zY2hlbWFcbiAgICAgIHJldHVybiByZW5kZXJcbiAgICAgICAgPyByZW5kZXIuY2FsbChcbiAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICBuZXcgRGl0b0NvbnRleHQodGhpcywge1xuICAgICAgICAgICAgICB2YWx1ZTogZmlsZSxcbiAgICAgICAgICAgICAgZGF0YTogdGhpcy5maWxlcyxcbiAgICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICAgIGRhdGFQYXRoOiBhcHBlbmREYXRhUGF0aCh0aGlzLmRhdGFQYXRoLCBpbmRleClcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKVxuICAgICAgICA6IGVzY2FwZUh0bWwoZmlsZS5uYW1lKVxuICAgIH0sXG5cbiAgICBkZWxldGVGaWxlKGZpbGUsIGluZGV4KSB7XG4gICAgICBjb25zdCB7IG5hbWUgfSA9IGZpbGVcblxuICAgICAgaWYgKFxuICAgICAgICBmaWxlICYmXG4gICAgICAgIHdpbmRvdy5jb25maXJtKFxuICAgICAgICAgIGBEbyB5b3UgcmVhbGx5IHdhbnQgdG8gJHt0aGlzLnZlcmJzLnJlbW92ZX0gJHtuYW1lfT9gXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgICAgIHRoaXMudmFsdWUuc3BsaWNlKGluZGV4LCAxKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudmFsdWUgPSBudWxsXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbGUudXBsb2FkKSB7XG4gICAgICAgICAgdGhpcy51cGxvYWQucmVtb3ZlKGZpbGUudXBsb2FkKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMub25DaGFuZ2UoKVxuICAgICAgICB0aGlzLm5vdGlmeSh7XG4gICAgICAgICAgdHlwZTogJ2luZm8nLFxuICAgICAgICAgIHRpdGxlOiAnU3VjY2Vzc2Z1bGx5IFJlbW92ZWQnLFxuICAgICAgICAgIHRleHQ6IGAke25hbWV9IHdhcyAke3RoaXMudmVyYnMuZGVsZXRlZH0uYFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBnZXRGaWxlSW5kZXgoZmlsZSkge1xuICAgICAgcmV0dXJuIHRoaXMubXVsdGlwbGUgJiYgdGhpcy52YWx1ZVxuICAgICAgICA/IHRoaXMudmFsdWUuZmluZEluZGV4KGl0ID0+IGl0LmlkID09PSBmaWxlLmlkKVxuICAgICAgICA6IC0xXG4gICAgfSxcblxuICAgIGFkZEZpbGUoZmlsZSkge1xuICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgaWYgKHRoaXMudmFsdWUpIHtcbiAgICAgICAgICB0aGlzLnZhbHVlLnB1c2goZmlsZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gW2ZpbGVdXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBmaWxlXG4gICAgICB9XG4gICAgfSxcblxuICAgIHJlcGxhY2VGaWxlKGZpbGUsIG5ld0ZpbGUpIHtcbiAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5nZXRGaWxlSW5kZXgoZmlsZSlcbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICBpZiAobmV3RmlsZSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZVtpbmRleF0gPSBuZXdGaWxlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUuc3BsaWNlKGluZGV4LCAxKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IG5ld0ZpbGVcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgcmVtb3ZlRmlsZShmaWxlKSB7XG4gICAgICB0aGlzLnJlcGxhY2VGaWxlKGZpbGUsIG51bGwpXG4gICAgfSxcblxuICAgIGlucHV0RmlsZShuZXdGaWxlLCBvbGRGaWxlKSB7XG4gICAgICBpZiAobmV3RmlsZSAmJiAhb2xkRmlsZSkge1xuICAgICAgICBjb25zdCB7IGlkLCBuYW1lLCBzaXplIH0gPSBuZXdGaWxlXG4gICAgICAgIHRoaXMuYWRkRmlsZSh7IGlkLCBuYW1lLCBzaXplLCB1cGxvYWQ6IG5ld0ZpbGUgfSlcbiAgICAgIH1cbiAgICAgIGlmIChuZXdGaWxlICYmIG9sZEZpbGUpIHtcbiAgICAgICAgY29uc3QgeyBzdWNjZXNzLCBlcnJvciB9ID0gbmV3RmlsZVxuICAgICAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICAgIHRoaXMub25DaGFuZ2UoKVxuICAgICAgICAgIGNvbnN0IGZpbGUgPSBuZXdGaWxlLnJlc3BvbnNlWzBdXG4gICAgICAgICAgaWYgKGZpbGUpIHtcbiAgICAgICAgICAgIGZpbGUudXBsb2FkID0gbmV3RmlsZVxuICAgICAgICAgICAgLy8gUmVwbGFjZSB0aGUgdXBsb2FkIGZpbGUgb2JqZWN0IHdpdGggdGhlIGZpbGUgb2JqZWN0IHJlY2VpdmVkXG4gICAgICAgICAgICAvLyBmcm9tIHRoZSB1cGxvYWQgcmVzcG9uc2UuXG4gICAgICAgICAgICB0aGlzLnJlcGxhY2VGaWxlKG5ld0ZpbGUsIGZpbGUpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlRmlsZShuZXdGaWxlKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChlcnJvcikge1xuICAgICAgICAgIGNvbnN0IHRleHQgPSAoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFib3J0OiAnVXBsb2FkIGFib3J0ZWQnLFxuICAgICAgICAgICAgICBkZW5pZWQ6ICdVcGxvYWQgZGVuaWVkJyxcbiAgICAgICAgICAgICAgZXh0ZW5zaW9uOiBgVW5zdXBwb3J0ZWQgZmlsZS10eXBlOiAke25ld0ZpbGUubmFtZX1gLFxuICAgICAgICAgICAgICBuZXR3b3JrOiAnTmV0d29yayBlcnJvciBlbmNvdW50ZXJlZCBkdXJpbmcgdXBsb2FkJyxcbiAgICAgICAgICAgICAgc2VydmVyOiAnU2VydmVyIGVycm9yIG9jY3VycmVkIGR1cmluZyB1cGxvYWQnLFxuICAgICAgICAgICAgICBzaXplOiBgRmlsZSBpcyB0b28gbGFyZ2U6ICR7Zm9ybWF0RmlsZVNpemUobmV3RmlsZS5zaXplKX1gLFxuICAgICAgICAgICAgICB0aW1lb3V0OiAnVGltZW91dCBvY2N1cnJlZCBkdXJpbmcgdXBsb2FkJ1xuICAgICAgICAgICAgfVtlcnJvcl0gfHxcbiAgICAgICAgICAgIGBVbmtub3duIEZpbGUgVXBsb2FkIEVycm9yOiAnJHtlcnJvcn0nYFxuICAgICAgICAgIClcbiAgICAgICAgICB0aGlzLm5vdGlmeSh7XG4gICAgICAgICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgICAgICAgdGl0bGU6ICdGaWxlIFVwbG9hZCBFcnJvcicsXG4gICAgICAgICAgICB0ZXh0XG4gICAgICAgICAgfSlcbiAgICAgICAgICB0aGlzLnJlbW92ZUZpbGUobmV3RmlsZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBpbnB1dEZpbHRlcihuZXdGaWxlIC8qLCBvbGRGaWxlLCBwcmV2ZW50ICovKSB7XG4gICAgICBjb25zdCB4aHIgPSBuZXdGaWxlPy54aHJcbiAgICAgIGlmICh0aGlzLmFwaS5jb3JzPy5jcmVkZW50aWFscyAmJiB4aHIgJiYgIXhoci53aXRoQ3JlZGVudGlhbHMpIHtcbiAgICAgICAgeGhyLndpdGhDcmVkZW50aWFscyA9IHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgcHJvY2Vzc1ZhbHVlKHNjaGVtYSwgdmFsdWUpIHtcbiAgICAvLyBGaWx0ZXIgb3V0IGFsbCBuZXdseSBhZGRlZCBmaWxlcyB0aGF0IHdlcmVuJ3QgYWN0dWFsbHkgdXBsb2FkZWQuXG4gICAgY29uc3QgZmlsZXMgPSBhc0ZpbGVzKHZhbHVlKVxuICAgICAgLm1hcCgoeyB1cGxvYWQsIC4uLmZpbGUgfSkgPT4gKCF1cGxvYWQgfHwgdXBsb2FkLnN1Y2Nlc3MgPyBmaWxlIDogbnVsbCkpXG4gICAgICAuZmlsdGVyKGZpbGUgPT4gZmlsZSlcbiAgICByZXR1cm4gc2NoZW1hLm11bHRpcGxlID8gZmlsZXMgOiBmaWxlc1swXSB8fCBudWxsXG4gIH1cbn0pXG5cbmZ1bmN0aW9uIGFzRmlsZXModmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID8gYXNBcnJheSh2YWx1ZSkgOiBbXVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tdXBsb2FkIHtcbiAgLmRpdG8tdGFibGUge1xuICAgIHRyIHtcbiAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gICAgfVxuICB9XG5cbiAgLmRpdG8tYnV0dG9uLWFkZC11cGxvYWQge1xuICAgIHBhZGRpbmc6IDA7XG5cbiAgICA+ICoge1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIH1cbiAgfVxuXG4gIC5kaXRvLXVwbG9hZC1mb290ZXIge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuXG4gICAgLmRpdG8tcHJvZ3Jlc3Mge1xuICAgICAgZmxleDogYXV0bztcbiAgICAgIG1hcmdpbi1yaWdodDogJGZvcm0tc3BhY2luZztcbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCJjb25zdCBsb2dnZWREZXByZWNhdGlvbnMgPSBuZXcgU2V0KClcblxuZXhwb3J0IGZ1bmN0aW9uIGRlcHJlY2F0ZShtZXNzYWdlKSB7XG4gIC8vIE9ubHkgbG9nIGRlcHJlY2F0aW9uIG1lc3NhZ2VzIG9uY2UuXG4gIGlmICghbG9nZ2VkRGVwcmVjYXRpb25zLmhhcyhtZXNzYWdlKSkge1xuICAgIGxvZ2dlZERlcHJlY2F0aW9ucy5hZGQobWVzc2FnZSlcbiAgICBjb25zb2xlLndhcm4obWVzc2FnZSlcbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNBcnJheSwgYXNBcnJheSB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRRdWVyeShxdWVyeSkge1xuICBjb25zdCBlbnRyaWVzID0gcXVlcnlcbiAgICA/IGlzQXJyYXkocXVlcnkpXG4gICAgICA/IHF1ZXJ5XG4gICAgICA6IE9iamVjdC5lbnRyaWVzKHF1ZXJ5KVxuICAgIDogW11cbiAgcmV0dXJuIChcbiAgICBuZXcgVVJMU2VhcmNoUGFyYW1zKFxuICAgICAgLy8gRXhwYW5kIGFycmF5IHZhbHVlcyBpbnRvIG11bHRpcGxlIGVudHJpZXMgdW5kZXIgdGhlIHNhbWUga2V5LCBzb1xuICAgICAgLy8gYGZvcm1hdFF1ZXJ5KHsgZm9vOiBbMSwgMl0sIGJhcjogMyB9KWAgPT4gJ2Zvbz0xJmZvbz0yJmJhcj0zJy5cbiAgICAgIGVudHJpZXMucmVkdWNlKFxuICAgICAgICAoZW50cmllcywgW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgZm9yIChjb25zdCB2YWwgb2YgYXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGVudHJpZXMucHVzaChba2V5LCB2YWxdKVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZW50cmllc1xuICAgICAgICB9LFxuICAgICAgICBbXVxuICAgICAgKVxuICAgIClcbiAgICAgIC50b1N0cmluZygpXG4gICAgICAvLyBkZWNvZGUgYWxsIHRoZXNlIGVuY29kZWQgY2hhcmFjdGVycyB0byBoYXZlIHRoZSBzYW1lIGJlaGF2aW9yIGFzXG4gICAgICAvLyB2dWUtcm91dGVyJ3Mgb3duIHF1ZXJ5IGVuY29kaW5nLlxuICAgICAgLnJlcGxhY2VBbGwoLyUoPzoyMXwyNHwyOHwyOXwyQ3wyRnwzQXwzQnwzRHwzRnw0MCkvZywgZGVjb2RlVVJJQ29tcG9uZW50KVxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXBsYWNlUm91dGUoeyBwYXRoLCBxdWVyeSwgaGFzaCB9KSB7XG4gIC8vIFByZXNlcnZlIGBoaXN0b3J5LnN0YXRlYCwgc2VlOlxuICAvLyBodHRwczovL3JvdXRlci52dWVqcy5vcmcvZ3VpZGUvbWlncmF0aW9uLyN1c2FnZS1vZi1oaXN0b3J5LXN0YXRlXG4gIGhpc3RvcnkucmVwbGFjZVN0YXRlKFxuICAgIGhpc3Rvcnkuc3RhdGUsXG4gICAgbnVsbCxcbiAgICBgJHtcbiAgICAgIGxvY2F0aW9uLm9yaWdpblxuICAgIH0ke1xuICAgICAgcGF0aCA/PyBsb2NhdGlvbi5wYXRobmFtZVxuICAgIH0/JHtcbiAgICAgIHF1ZXJ5ID8gZm9ybWF0UXVlcnkocXVlcnkpIDogbG9jYXRpb24uc2VhcmNoLnNsaWNlKDEpXG4gICAgfSR7XG4gICAgICBoYXNoID8/IGxvY2F0aW9uLmhhc2hcbiAgICB9YFxuICApXG59XG4iLCJleHBvcnQgZGVmYXVsdCBbXG4gICdjcmVhdGUnLCAnY3JlYXRlZCcsXG4gICdzYXZlJywgJ3NhdmVkJyxcbiAgJ3N1Ym1pdCcsICdzdWJtaXR0ZWQnLFxuICAnZGVsZXRlJywgJ2RlbGV0ZWQnLFxuICAnZWRpdCcsICdlZGl0ZWQnLFxuICAnY2xlYXInLCAnY2xlYXJlZCcsXG4gICdjbG9zZScsICdjbG9zZWQnLFxuICAnY2FuY2VsJywgJ2NhbmNlbGxlZCcsXG4gICdkcmFnJywgJ2RyYWdnZWQnLFxuICAnbG9naW4nLCAnbG9nZ2VkIGluJ1xuXS5yZWR1Y2UoKHZlcmJzLCB2ZXJiKSA9PiB7XG4gIHZlcmJzW3ZlcmJdID0gdmVyYlxuICByZXR1cm4gdmVyYnNcbn0sIHt9KVxuIiwiaW1wb3J0IHsgY3JlYXRlQXBwLCBoIGFzIGNyZWF0ZUVsZW1lbnQgfSBmcm9tICd2dWUnXG5pbXBvcnQgeyBjcmVhdGVSb3V0ZXIsIGNyZWF0ZVdlYkhpc3RvcnkgfSBmcm9tICd2dWUtcm91dGVyJ1xuaW1wb3J0IFZ1ZU5vdGlmaWNhdGlvbnMgZnJvbSAnQGt5dmcvdnVlMy1ub3RpZmljYXRpb24nXG5pbXBvcnQge1xuICBpc1N0cmluZyxcbiAgaXNBYnNvbHV0ZVVybCxcbiAgbWVyZ2UsXG4gIGh5cGhlbmF0ZSxcbiAgY2FtZWxpemUsXG4gIGRlZmF1bHRGb3JtYXRzXG59IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgKiBhcyBjb21wb25lbnRzIGZyb20gJy4vY29tcG9uZW50cy9pbmRleC5qcydcbmltcG9ydCAqIGFzIHR5cGVzIGZyb20gJy4vdHlwZXMvaW5kZXguanMnXG5pbXBvcnQgRGl0b1Jvb3QgZnJvbSAnLi9jb21wb25lbnRzL0RpdG9Sb290LnZ1ZSdcbmltcG9ydCBEaXRvVHlwZUNvbXBvbmVudCBmcm9tICcuL0RpdG9UeXBlQ29tcG9uZW50LmpzJ1xuaW1wb3J0IHsgZ2V0UmVzb3VyY2UgfSBmcm9tICcuL3V0aWxzL3Jlc291cmNlLmpzJ1xuaW1wb3J0IHsgZGVwcmVjYXRlIH0gZnJvbSAnLi91dGlscy9kZXByZWNhdGUuanMnXG5pbXBvcnQgeyBmb3JtYXRRdWVyeSB9IGZyb20gJy4vdXRpbHMvcm91dGUuanMnXG5pbXBvcnQgdmVyYnMgZnJvbSAnLi92ZXJicy5qcydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGl0b0FkbWluIHtcbiAgY29uc3RydWN0b3IoZWwsIHtcbiAgICAvLyBgZGl0b2AgY29udGFpbnMgdGhlIGJhc2UgYW5kIGFwaSBzZXR0aW5ncyBwYXNzZWQgZnJvbSBgQWRtaW5Db250cm9sbGVyYFxuICAgIGRpdG8gPSB7fSxcbiAgICBhcGksXG4gICAgdmlld3MgPSB7fSxcbiAgICAuLi5vcHRpb25zXG4gIH0gPSB7fSkge1xuICAgIHRoaXMuZWwgPSBlbFxuICAgIC8vIE1lcmdlIGluIGBhcGlgIHNldHRpbmdzIGFzIHBhc3NlZCBmcm9tIGBjb25maWcuYWRtaW5gIGFuZCB0aHJvdWdoIHRoZVxuICAgIC8vIGBBZG1pbkNvbnRyb2xsZXJgIHdpdGggYGFwaWAgdmFsdWVzIGZyb20gZnJvbSAnYWRtaW4vaW5kZXguanMnXG4gICAgLy8gTk9URTogYEFkbWluQ29udHJvbGxlcmAgcHJvdmlkZXMgYGRpdG8uYXBpLmJhc2VgXG4gICAgdGhpcy5hcGkgPSBhcGkgPSBtZXJnZSh7IGJhc2U6ICcvJyB9LCBkaXRvLmFwaSwgYXBpKVxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnNcblxuICAgIC8vIFNldHVwIGRlZmF1bHQgYXBpIHNldHRpbmdzOlxuICAgIGFwaS5sb2NhbGUgfHw9ICdlbi1VUydcbiAgICBhcGkuZm9ybWF0cyA9IG1lcmdlKHt9LCBkZWZhdWx0Rm9ybWF0cywgYXBpLmZvcm1hdHMpXG4gICAgYXBpLnJlcXVlc3QgfHw9IG9wdGlvbnMgPT4gcmVxdWVzdChhcGksIG9wdGlvbnMpXG4gICAgYXBpLmdldEFwaVVybCB8fD0gb3B0aW9ucyA9PiBnZXRBcGlVcmwoYXBpLCBvcHRpb25zKVxuICAgIGFwaS5pc0FwaVVybCB8fD0gdXJsID0+IGlzQXBpVXJsKGFwaSwgdXJsKVxuICAgIC8vIFNldHRpbmcgYGFwaS5ub3JtYWxpemVQYXRocyA9IHRydWUgKHBsdXJhbCkgc2V0cyBib3RoOlxuICAgIC8vIGBhcGkubm9ybWFsaXplUGF0aCA9IGh5cGhlbmF0ZWAgYW5kIGBhcGkuZGVub3JtYWxpemVQYXRoID0gY2FtZWxpemVgXG4gICAgYXBpLm5vcm1hbGl6ZVBhdGggfHw9IGFwaS5ub3JtYWxpemVQYXRocyA/IGh5cGhlbmF0ZSA6IHZhbCA9PiB2YWxcbiAgICBhcGkuZGVub3JtYWxpemVQYXRoIHx8PSBhcGkubm9ybWFsaXplUGF0aHMgPyBjYW1lbGl6ZSA6IHZhbCA9PiB2YWxcblxuICAgIC8vIEFsbG93IGRlZmluaXRpb24gb2YgZGVmYXVsdHMgZm9yIGFkbWluIGNvbXBvbmVudCB0eXBlcywgbmVzdGVkIHBlciB0eXBlOlxuICAgIC8vIGFwaS5kZWZhdWx0cyA9IHtcbiAgICAvLyAgICdtdWx0aXNlbGVjdCc6IHtcbiAgICAvLyAgICAgc2VsZWN0YWJsZTogdHJ1ZVxuICAgIC8vICAgfSxcbiAgICAvLyAgICdmYWtlLXR5cGUnOiBzY2hlbWEgPT4ge1xuICAgIC8vICAgICAvLyBSZXR1cm4gZGVmYXVsdHMsIG9yIGRpcmVjdGx5IG1vZGlmeSB0aGUgc2NoZW1hOlxuICAgIC8vICAgICBPYmplY3QuYXNzaWduKHNjaGVtYSwge1xuICAgIC8vICAgICAgIHR5cGU6ICdyZWFsLXR5cGUnLFxuICAgIC8vICAgICAgIGZvcm1hdDogKHsgdmFsdWUgfSkgPT4gYEZvcm1hdHRlZCAke3ZhbHVlfWAsXG4gICAgLy8gICAgICAgcHJvY2VzczogKHsgdmFsdWUgfSkgPT4gYFByb2Nlc3NlZCAke3ZhbHVlfWBcbiAgICAvLyAgICAgfSlcbiAgICAvLyAgIH1cbiAgICAvLyB9XG5cbiAgICBhcGkuZGVmYXVsdHMgfHw9IHt9XG5cbiAgICAvLyBBbGxvdyB0aGUgY29uZmlndXJhdGlvbiBvZiBhbGwgYXV0aCByZXNvdXJjZXMsIGxpa2Ugc286XG4gICAgLy8gYXBpLnVzZXJzID0ge1xuICAgIC8vICAgcGF0aDogJy9hZG1pbnMnLFxuICAgIC8vICAgLy8gVGhlc2UgYXJlIHRoZSBkZWZhdWx0czpcbiAgICAvLyAgIGxvZ2luOiB7XG4gICAgLy8gICAgIHBhdGg6ICdsb2dpbicsXG4gICAgLy8gICAgIG1ldGhvZDogJ3Bvc3QnXG4gICAgLy8gICB9LFxuICAgIC8vICAgbG9nb3V0OiB7XG4gICAgLy8gICAgIHBhdGg6ICdsb2dvdXQnLFxuICAgIC8vICAgICBtZXRob2Q6ICdwb3N0J1xuICAgIC8vICAgfSxcbiAgICAvLyAgIHNlc3Npb246IHtcbiAgICAvLyAgICAgcGF0aDogJ3Nlc3Npb24nLFxuICAgIC8vICAgICBtZXRob2Q6ICdnZXQnXG4gICAgLy8gICB9XG4gICAgLy8gfVxuICAgIGNvbnN0IHVzZXJzID0gZ2V0UmVzb3VyY2UoYXBpLnVzZXJzLCB7XG4gICAgICB0eXBlOiAnY29sbGVjdGlvbidcbiAgICB9KSB8fCB7fVxuICAgIHVzZXJzLmxvZ2luID0gZ2V0UmVzb3VyY2UodXNlcnMubG9naW4gfHwgJ2xvZ2luJywge1xuICAgICAgbWV0aG9kOiAncG9zdCcsXG4gICAgICBwYXJlbnQ6IHVzZXJzXG4gICAgfSlcbiAgICB1c2Vycy5sb2dvdXQgPSBnZXRSZXNvdXJjZSh1c2Vycy5sb2dvdXQgfHwgJ2xvZ291dCcsIHtcbiAgICAgIG1ldGhvZDogJ3Bvc3QnLFxuICAgICAgcGFyZW50OiB1c2Vyc1xuICAgIH0pXG4gICAgdXNlcnMuc2Vzc2lvbiA9IGdldFJlc291cmNlKHVzZXJzLnNlc3Npb24gfHwgJ3Nlc3Npb24nLCB7XG4gICAgICBtZXRob2Q6ICdnZXQnLFxuICAgICAgcGFyZW50OiB1c2Vyc1xuICAgIH0pXG4gICAgYXBpLnVzZXJzID0gdXNlcnNcblxuICAgIC8vIEFsbG93IG92ZXJyaWRpbmcgb2YgcmVzb3VyY2UgcGF0aCBoYW5kbGVyczpcbiAgICAvLyBhcGkucmVzb3VyY2VzID0ge1xuICAgIC8vICAgY29sbGVjdGlvbihyZXNvdXJjZSkge1xuICAgIC8vICAgICByZXR1cm4gcmVzb3VyY2UucGFyZW50XG4gICAgLy8gICAgICAgPyBgJHtyZXNvdXJjZS5wYXRofT8ke3Jlc291cmNlLnBhcmVudC5wYXRofV9pZD0ke1xuICAgIC8vICAgICAgICAgIHJlc291cmNlLnBhcmVudC5pZH1gXG4gICAgLy8gICAgICAgOiByZXNvdXJjZS5wYXRoXG4gICAgLy8gICB9XG4gICAgLy8gfVxuXG4gICAgYXBpLnJlc291cmNlcyA9IHtcbiAgICAgIGFueShyZXNvdXJjZSkge1xuICAgICAgICBjb25zdCBoYW5kbGVyID0gdGhpc1tyZXNvdXJjZT8udHlwZV0gfHwgdGhpcy5kZWZhdWx0XG4gICAgICAgIHJldHVybiByZXNvdXJjZSAmJiBoYW5kbGVyLmNhbGwodGhpcywgcmVzb3VyY2UpXG4gICAgICB9LFxuXG4gICAgICBkZWZhdWx0KHJlc291cmNlKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudFBhdGggPSB0aGlzLmFueShyZXNvdXJjZS5wYXJlbnQpXG4gICAgICAgIHJldHVybiBwYXJlbnRQYXRoXG4gICAgICAgICAgPyBgJHtwYXJlbnRQYXRofS8ke3Jlc291cmNlLnBhdGh9YFxuICAgICAgICAgIDogcmVzb3VyY2UucGF0aFxuICAgICAgfSxcblxuICAgICAgY29sbGVjdGlvbihyZXNvdXJjZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0KHJlc291cmNlKVxuICAgICAgfSxcblxuICAgICAgbWVtYmVyKHJlc291cmNlKSB7XG4gICAgICAgIC8vIE5PVEU6IFdlIGFzc3VtZSB0aGF0IGFsbCBtZW1iZXJzIGhhdmUgcm9vdC1sZXZlbCBjb2xsZWN0aW9uIHJvdXRlcyxcbiAgICAgICAgLy8gdG8gYXZvaWQgZXhjZXNzaXZlIG5lc3Rpbmcgb2YgKHN1Yi0pY29sbGVjdGlvbiByb3V0ZXMuXG4gICAgICAgIHJldHVybiBgJHtyZXNvdXJjZS5wYXRofS8ke3Jlc291cmNlLmlkfWBcbiAgICAgIH0sXG5cbiAgICAgIHVwbG9hZChyZXNvdXJjZSkge1xuICAgICAgICAvLyBEaXRvIFNlcnZlciBoYW5kbGVzIHVwbG9hZCByb3V0ZXMgb24gdGhlIGNvbGxlY3Rpb24gcmVzb3VyY2U6XG4gICAgICAgIHJldHVybiBgJHt0aGlzLmNvbGxlY3Rpb24ocmVzb3VyY2UucGFyZW50KX0vdXBsb2FkLyR7cmVzb3VyY2UucGF0aH1gXG4gICAgICB9LFxuXG4gICAgICAuLi5hcGkucmVzb3VyY2VzXG4gICAgfVxuXG4gICAgLy8gQWxsb3cgb3ZlcnJpZGluZyAvIGV4dGVuZGluZyBvZiBoZWFkZXJzOlxuICAgIC8vIGFwaS5oZWFkZXJzID0ge1xuICAgIC8vICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgIC8vIH1cbiAgICBhcGkuaGVhZGVycyA9IHtcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAuLi5hcGkuaGVhZGVyc1xuICAgIH1cblxuICAgIGlmIChpc1N0cmluZyhlbCkpIHtcbiAgICAgIGVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlbClcbiAgICB9XG5cbiAgICBjb25zdCBhcHAgPSAodGhpcy5hcHAgPSBjcmVhdGVBcHAoe1xuICAgICAgY29tcG9uZW50czoge1xuICAgICAgICBEaXRvUm9vdCxcbiAgICAgICAgVnVlTm90aWZpY2F0aW9ucyxcbiAgICAgICAgLy8gVGhpcyBtYXkgb25seSBiZSBuZWVkZWQgdG8gYXZvaWQgdHJlZS1zaGFja2luZyBvZiB0aGVzZSBjb21wb25lbnRzLFxuICAgICAgICAvLyBzaW5jZSB0aGV5IGFjdHVhbGx5IGhhbmRsZSByZWdpc3RyeSBpbnRlcm5hbGx5IGFscmVhZHkuXG4gICAgICAgIC8vIFRPRE86IFJlbW92ZSB0aGlzIG9uY2Ugd2UgaGF2ZSBhIGJldHRlciBzb2x1dGlvbi5cbiAgICAgICAgLi4uY29tcG9uZW50cyxcbiAgICAgICAgLi4udHlwZXNcbiAgICAgIH0sXG5cbiAgICAgIC8vIE1vc3QgaW5qZWN0cyBhcmUgZGVmaW5lZCBhcyBmdW5jdGlvbnMsIHRvIHByZXNlcnZlIHJlYWN0aXZlbmVzcyBhY3Jvc3NcbiAgICAgIC8vIHByb3ZpZGUvaW5qZWN0LCBzZWU6XG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdnVlanMvdnVlL2lzc3Vlcy83MDE3I2lzc3VlY29tbWVudC00ODA5MDY2OTFcbiAgICAgIHByb3ZpZGU6IHtcbiAgICAgICAgYXBpLFxuICAgICAgICAvLyBBIGRlZmF1bHQgbGlzdCBvZiB2ZXJicyBhcmUgcHJvdmlkZWQgYnkgJHZlcmJzKCkgYW5kIGNhbiBiZVxuICAgICAgICAvLyBvdmVycmlkZGVuIGF0IGFueSBwb2ludCBpbiB0aGUgY29tcG9uZW50IGhpZXJhcmNoeS5cbiAgICAgICAgJHZlcmJzOiAoKSA9PiB2ZXJicyxcbiAgICAgICAgLy8gUHJvdmlkZSBkZWZhdWx0cyBzbyBEaXRvTWl4aW4gY2FuIGluamVjdCB0aGVtIGZvciBhbGwgY29tcG9uZW50czpcbiAgICAgICAgLy8gICBpbmplY3Q6IFsgICckaXNQb3B1bGF0ZWQnLCAnJHNjaGVtYUNvbXBvbmVudCcsICckcm91dGVDb21wb25lbnQnIF1cbiAgICAgICAgJHZpZXdzOiAoKSA9PiB7fSxcbiAgICAgICAgJGlzUG9wdWxhdGVkOiAoKSA9PiB0cnVlLFxuICAgICAgICAkcGFyZW50Q29tcG9uZW50OiAoKSA9PiBudWxsLFxuICAgICAgICAkc2NoZW1hQ29tcG9uZW50OiAoKSA9PiBudWxsLFxuICAgICAgICAkc2NoZW1hUGFyZW50Q29tcG9uZW50OiAoKSA9PiBudWxsLFxuICAgICAgICAkcm91dGVDb21wb25lbnQ6ICgpID0+IG51bGwsXG4gICAgICAgICRkYXRhQ29tcG9uZW50OiAoKSA9PiBudWxsLFxuICAgICAgICAkc291cmNlQ29tcG9uZW50OiAoKSA9PiBudWxsLFxuICAgICAgICAkcmVzb3VyY2VDb21wb25lbnQ6ICgpID0+IG51bGwsXG4gICAgICAgICRkaWFsb2dDb21wb25lbnQ6ICgpID0+IG51bGwsXG4gICAgICAgICRwYW5lbENvbXBvbmVudDogKCkgPT4gbnVsbCxcbiAgICAgICAgJHRhYkNvbXBvbmVudDogKCkgPT4gbnVsbFxuICAgICAgfSxcblxuICAgICAgcmVuZGVyOiAoKSA9PlxuICAgICAgICBjcmVhdGVFbGVtZW50KERpdG9Sb290LCB7XG4gICAgICAgICAgcmVmOiAncm9vdCcsXG4gICAgICAgICAgY2xhc3M6IGRpdG8uc2V0dGluZ3Mucm9vdENsYXNzLFxuICAgICAgICAgIHVucmVzb2x2ZWRWaWV3czogdmlld3MsXG4gICAgICAgICAgb3B0aW9uc1xuICAgICAgICB9KVxuICAgIH0pKVxuXG4gICAgYXBwLnVzZShWdWVOb3RpZmljYXRpb25zLCB7XG4gICAgICBuYW1lOiAnbm90aWZ5JyxcbiAgICAgIGNvbXBvbmVudE5hbWU6ICdWdWVOb3RpZmljYXRpb25zJ1xuICAgIH0pXG5cbiAgICAvLyByb290LmNvbXBvbmVudCgndnVlLW1vZGFsJywgVnVlTW9kYWwpXG5cbiAgICBhcHAudXNlKFxuICAgICAgY3JlYXRlUm91dGVyKHtcbiAgICAgICAgLy8gU3RhcnQgd2l0aCBhIGNhdGNoLWFsbCByb3V0ZSwgdG8gYmUgcmVwbGFjZWQgYnkgdGhlIGFjdHVhbCByb3V0ZXNcbiAgICAgICAgLy8gb25jZSB0aGUgc2NoZW1hcyBhcmUgbG9hZGVkLCB0byBwcmV2ZW50IHZ1ZS1yb3V0ZXIgZnJvbSBjb21wbGFpbmluZyxcbiAgICAgICAgLy8gc2VlOiBgcmVzb2x2ZVZpZXdzKClgIGluIGBEaXRvUm9vdGAgZm9yIHRoZSBhY3R1YWwgcm91dGUgc2V0dXAuXG4gICAgICAgIHJvdXRlczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdjYXRjaC1hbGwnLFxuICAgICAgICAgICAgcGF0aDogJy86XyguKiknLFxuICAgICAgICAgICAgY29tcG9uZW50czoge31cbiAgICAgICAgICB9XG4gICAgICAgIF0sXG4gICAgICAgIGhpc3Rvcnk6IGNyZWF0ZVdlYkhpc3RvcnkoZGl0by5iYXNlKSxcbiAgICAgICAgbGlua0FjdGl2ZUNsYXNzOiAnJyxcbiAgICAgICAgbGlua0V4YWN0QWN0aXZlQ2xhc3M6ICcnXG4gICAgICB9KVxuICAgIClcblxuICAgIGVsLmNsYXNzTGlzdC5hZGQoJ2RpdG8tYXBwJylcbiAgICBhcHAubW91bnQoZWwpXG4gIH1cblxuICByZWdpc3Rlcih0eXBlLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIERpdG9UeXBlQ29tcG9uZW50LnJlZ2lzdGVyKHR5cGUsIG9wdGlvbnMpXG4gIH1cbn1cblxuY2xhc3MgUmVxdWVzdEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihyZXNwb25zZSkge1xuICAgIHN1cGVyKFxuICAgICAgYFJlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzIGNvZGU6ICR7cmVzcG9uc2Uuc3RhdHVzfSAoJHtcbiAgICAgICAgcmVzcG9uc2Uuc3RhdHVzVGV4dFxuICAgICAgfSlgXG4gICAgKVxuICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlcXVlc3QoYXBpLCB7XG4gIHVybCxcbiAgbWV0aG9kID0gJ2dldCcsXG4gIC8vIFRPRE86IGByZXF1ZXN0LnBhcmFtc2Agd2FzIGRlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mIGBxdWVyeWAgb24gMjAyMi0xMS0wMSxcbiAgLy8gcmVtb3ZlIG9uY2Ugbm90IGluIHVzZSBhbnl3aGVyZSBhbnkgbW9yZS5cbiAgcGFyYW1zID0gbnVsbCxcbiAgcXVlcnkgPSBwYXJhbXMgfHwgbnVsbCxcbiAgaGVhZGVycyA9IG51bGwsXG4gIGRhdGEgPSBudWxsXG59KSB7XG4gIGlmIChwYXJhbXMpIHtcbiAgICBkZXByZWNhdGUoXG4gICAgICBgcmVxdWVzdC5wYXJhbXMgaXMgZGVwcmVjYXRlZC4gVXNlIGFjdGlvbi5tZXRob2QgYW5kIGFjdGlvbi5wYXRoIGluc3RlYWQuYFxuICAgIClcbiAgfVxuXG4gIGNvbnN0IGlzQXBpVXJsID0gYXBpLmlzQXBpVXJsKHVybClcblxuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGFwaS5nZXRBcGlVcmwoeyB1cmwsIHF1ZXJ5IH0pLCB7XG4gICAgbWV0aG9kOiBtZXRob2QudG9VcHBlckNhc2UoKSxcbiAgICAuLi4oZGF0YSAmJiB7IGJvZHk6IEpTT04uc3RyaW5naWZ5KGRhdGEpIH0pLFxuICAgIGhlYWRlcnM6IHtcbiAgICAgIC4uLihpc0FwaVVybCAmJiBhcGkuaGVhZGVycyksXG4gICAgICAuLi5oZWFkZXJzXG4gICAgfSxcbiAgICBjcmVkZW50aWFsczpcbiAgICAgIGlzQXBpVXJsICYmIGFwaS5jb3JzPy5jcmVkZW50aWFsc1xuICAgICAgICA/ICdpbmNsdWRlJ1xuICAgICAgICA6ICdzYW1lLW9yaWdpbidcbiAgfSlcblxuICBpZiAocmVzcG9uc2UuaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpPy5pbmNsdWRlcygnYXBwbGljYXRpb24vanNvbicpKSB7XG4gICAgcmVzcG9uc2UuZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKVxuICB9XG5cbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRocm93IG5ldyBSZXF1ZXN0RXJyb3IocmVzcG9uc2UpXG4gIH1cbiAgcmV0dXJuIHJlc3BvbnNlXG59XG5cbmZ1bmN0aW9uIGlzQXBpVXJsKGFwaSwgdXJsKSB7XG4gIHJldHVybiAhaXNBYnNvbHV0ZVVybCh1cmwpIHx8IHVybC5zdGFydHNXaXRoKGFwaS51cmwpXG59XG5cbmZ1bmN0aW9uIGdldEFwaVVybChhcGksIHsgdXJsLCBxdWVyeSB9KSB7XG4gIGlmICghaXNBYnNvbHV0ZVVybCh1cmwpKSB7XG4gICAgdXJsID0gY29tYmluZVVybHMoYXBpLnVybCwgdXJsKVxuICB9XG4gIC8vIFN1cHBvcnQgb3B0aW9uYWwgcXVlcnkgcGFyYW1ldGVycywgdG8gYmUgYXJlIGFkZGVkIHRvIHRoZSBVUkwuXG4gIGNvbnN0IHNlYXJjaCA9IGZvcm1hdFF1ZXJ5KHF1ZXJ5KVxuICByZXR1cm4gc2VhcmNoID8gYCR7dXJsfT8ke3NlYXJjaH1gIDogdXJsXG59XG5cbmZ1bmN0aW9uIGNvbWJpbmVVcmxzKGJhc2VVcmwsIHJlbGF0aXZlVXJsKSB7XG4gIC8vIFVzZSBzYW1lIGFwcHJvYWNoIGFzIGF4aW9zIGBjb21iaW5lVVJMcygpYCB0byBqb2luIGJhc2VVcmwgJiByZWxhdGl2ZVVybDpcbiAgcmV0dXJuIGAke2Jhc2VVcmwucmVwbGFjZSgvXFwvKyQvLCAnJyl9LyR7cmVsYXRpdmVVcmwucmVwbGFjZSgvXlxcLysvLCAnJyl9YFxufVxuIl0sIm5hbWVzIjpbImFwcFN0YXRlIiwicmVhY3RpdmUiLCJhcHBlbmREYXRhUGF0aCIsImRhdGFQYXRoIiwidG9rZW4iLCJwYXJzZVBhcmVudERhdGFQYXRoIiwicGF0aCIsInBhcnNlRGF0YVBhdGgiLCJwYXJzZUl0ZW1EYXRhUGF0aCIsIm5lc3RlZCIsImdldEl0ZW1EYXRhUGF0aCIsIm5vcm1hbGl6ZURhdGFQYXRoIiwicGFyc2VQYXJlbnRJdGVtRGF0YVBhdGgiLCJpc0ludGVnZXIiLCJnZXRQYXJlbnRJdGVtRGF0YVBhdGgiLCJnZXRJdGVtIiwicm9vdEl0ZW0iLCJnZXRWYWx1ZUF0RGF0YVBhdGgiLCJnZXRQYXJlbnRJdGVtIiwiZ2V0TGFzdERhdGFQYXRoVG9rZW4iLCJnZXRMYXN0RGF0YVBhdGhOYW1lIiwiZ2V0TGFzdERhdGFQYXRoSW5kZXgiLCJpbmRleCIsInRlbXBvcmFyeUlkIiwic2V0VGVtcG9yYXJ5SWQiLCJkYXRhIiwiaWRLZXkiLCJpc1RlbXBvcmFyeUlkIiwiaWQiLCJpc1JlZmVyZW5jZSIsImhhc093blByb3BlcnR5IiwiY29udGV4dHMiLCJnZXQiLCJjb250ZXh0Iiwia2V5IiwiZGVmYXVsdFZhbHVlIiwib2JqZWN0IiwidG9SYXciLCJ2YWx1ZSIsImlzRnVuY3Rpb24iLCJzZXQiLCJEaXRvQ29udGV4dCIsImNvbXBvbmVudCIsIml0ZW0iLCJvcHRpb25zIiwibG9jYXRpb24iLCJyZXNvdXJjZSIsIkVtaXR0ZXJNaXhpbiIsImV2ZW50IiwiY2FsbGJhY2siLCJpc0FycmF5IiwiZXYiLCJpc1BsYWluT2JqZWN0IiwibGlzdGVuZXJzIiwiY2FsbGJhY2tzIiwib24iLCJhcmdzIiwiZW50cnkiLCJfYSIsImNiIiwicXVldWUiLCJyZXNvbHZlIiwibmV4dCIsInJlc3VsdCIsInJlcyIsImVycm9yIiwidGFyZ2V0IiwidHlwZUNoZWNrZXJzIiwiaXNCb29sZWFuIiwiaXNOdW1iZXIiLCJpc1N0cmluZyIsImlzRGF0ZSIsImlzT2JqZWN0IiwiaXNSZWdFeHAiLCJ0eXBlQ29udmVydGVycyIsImFzQXJyYXkiLCJpc01hdGNoaW5nVHlwZSIsInR5cGVzIiwidHlwZSIsImNvbnZlcnRUeXBlIiwiY29udmVydGVyIiwiaGFzUmVzb3VyY2UiLCJzY2hlbWEiLCJnZXRSZXNvdXJjZSIsImRlZmF1bHRzIiwicGFyZW50IiwiZGVmcyIsImdldE1lbWJlclJlc291cmNlIiwicGlja0J5IiwiRGl0b01peGluIiwidWlkIiwibmV4dFVpZCIsImxhYmVsaXplIiwia2V5T3JEYXRhUGF0aCIsImRlZiIsImNvbnZlcnRlZCIsIm5hbWUiLCJ2ZXJiIiwicXVlcnkiLCJ1cmwiLCJtZXRob2QiLCJpbnRlcm5hbCIsImNoZWNrVXNlciIsInJlc3BvbnNlIiwiZXF1YWxzIiwiY29tcG9uZW50cyIsImJ1dHRvbnMiLCJzZXR0aW5ncyIsImNhY2hlIiwiY2FjaGVQYXJlbnQiLCJsb2FkQ2FjaGUiLCJjYWNoZUtleSIsImxvY2FsZSIsImZvcm1hdCIsImEiLCJib2R5IiwiYWNjZXNzb3IiLCJ3YXRjaCIsImV2ZW50cyIsImhhbmRsZXJzIiwiZXhwciIsImFkZEV2ZW50IiwiaHlwaGVuYXRlIiwiaGFzTGlzdGVuZXJzIiwicGFyZW50SGFzTGlzdGVuZXJzIiwiZ2V0Q29udGV4dCIsInBhcmFtcyIsImlzQ3JlZGl0Q2FyZCIsImRlY2ltYWxzIiwibWF0Y2giLCJpc0RvbWFpbiIsImlzRW1haWwiLCJpc0hvc3RuYW1lIiwibWF4IiwibWluIiwicGFzc3dvcmQiLCJpc1VybCIsIlZhbGlkYXRpb25NaXhpbiIsIm5vdGlmeSIsImlzVmFsaWQiLCJydWxlIiwic2V0dGluZyIsInZhbGlkYXRvciIsInZhbGlkYXRpb25zIiwidmFsaWRhdGUiLCJtZXNzYWdlIiwiYWRkTGFiZWwiLCJlcnJvcnMiLCJmb2N1cyIsImdldFNjaGVtYUFjY2Vzc29yIiwiZ2V0U3RvcmVBY2Nlc3NvciIsIlR5cGVNaXhpbiIsImNvbXB1dGVWYWx1ZSIsInBhcnNlIiwic2NoZW1hQ29tcG9uZW50IiwibGFiZWwiLCJjYW1lbGl6ZSIsIm5hdGl2ZUZpZWxkIiwidGV4dEZpZWxkIiwiYXR0cmlidXRlcyIsImFkZCIsIm9uRm9jdXMiLCJvbkJsdXIiLCJvbklucHV0Iiwib25DaGFuZ2UiLCJlbGVtZW50IiwiX2IiLCJ1aWRNYXAiLCJnZXRVaWQiLCJpdGVtSWQiLCJTY2hlbWFHcmFwaCIsIl9fcHVibGljRmllbGQiLCJzdWJHcmFwaCIsInBhcnQiLCJyZWxhdGVkRGF0YVBhdGgiLCJuYW5vaWQiLCJmbGF0dGVuIiwiZ3JhcGgiLCJlbnRyaWVzIiwiJHNldHRpbmdzIiwic3ViS2V5Iiwic291cmNlU2NoZW1hIiwiY2xpcGJvYXJkIiwicmVsYXRlZCIsInJlZmVyZW5jZSIsInNvdXJjZSIsInJlbGF0aW9uIiwidmFsdWVzIiwicmVtb3ZlSWQiLCJyZWZlcmVuY2VJZCIsInJlZktleSIsInJldlZhbHVlIiwidHlwZUNvbXBvbmVudHMiLCJ1bmtub3duVHlwZVJlcG9ydGVkIiwicmVnaXN0ZXJUeXBlQ29tcG9uZW50IiwiZ2V0VHlwZUNvbXBvbmVudCIsImFsbG93TnVsbCIsIml0ZXJhdGVTY2hlbWFDb21wb25lbnRzIiwic2NoZW1hcyIsImlzU2luZ2xlQ29tcG9uZW50VmlldyIsIml0ZXJhdGVOZXN0ZWRTY2hlbWFDb21wb25lbnRzIiwiZ2V0VGFiU2NoZW1hcyIsImZpbmRTY2hlbWFDb21wb25lbnQiLCJzb21lU2NoZW1hQ29tcG9uZW50IiwiaXNTY2hlbWEiLCJpc0Zvcm0iLCJpc1ZpZXciLCJpc1RhYiIsImlzUGFuZWwiLCJnZXRTY2hlbWFJZGVudGlmaWVyIiwicmVzb2x2ZVNjaGVtYSIsInVud3JhcE1vZHVsZSIsImlzUHJvbWlzZSIsImlzTW9kdWxlIiwia2V5cyIsInJlc29sdmVTY2hlbWFzIiwidW5yZXNvbHZlZFNjaGVtYXMiLCJyZXNvbHZlSXRlbSIsIm1hcENvbmN1cnJlbnRseSIsInJlc29sdmVTY2hlbWFDb21wb25lbnQiLCJtYXJrUmF3IiwicmVzb2x2ZVNjaGVtYUNvbXBvbmVudHMiLCJwcm9jZXNzU2NoZW1hQ29tcG9uZW50cyIsImFwaSIsInJvdXRlcyIsImxldmVsIiwicHJvbWlzZXMiLCJwcm9jZXNzIiwicmVsYXRpdmVMZXZlbCIsInByb2Nlc3NTY2hlbWFDb21wb25lbnQiLCJnZXRQYW5lbFNjaGVtYXMiLCJwcm9jZXNzU2NoZW1hRGVmYXVsdHMiLCJwYW5lbCIsImdldFR5cGVPcHRpb25zIiwicHJvY2Vzc1ZpZXciLCJwcm9jZXNzUm91dGVTY2hlbWEiLCJwcm9jZXNzTmVzdGVkU2NoZW1hcyIsImNoaWxkcmVuIiwibWVyZ2UiLCJwcm9jZXNzTmVzdGVkU2NoZW1hRGVmYXVsdHMiLCJmb3JtcyIsImdldEZvcm1TY2hlbWFzIiwiZm9ybSIsInByb2Nlc3NGb3JtcyIsInByb2Nlc3NGb3JtIiwicHJvY2Vzc1RhYiIsInByb2Nlc3NQYW5lbCIsInRhYnMiLCJwYW5lbHMiLCJ0YWIiLCJoYXNGb3JtU2NoZW1hIiwiaGFzTXVsdGlwbGVGb3JtU2NoZW1hcyIsImdldFZpZXdGb3JtU2NoZW1hIiwidmlldyIsInZpZXdTY2hlbWEiLCJnZXRWaWV3U2NoZW1hIiwiZ2V0Vmlld0VkaXRQYXRoIiwibW9kaWZ5Rm9ybSIsImNvbXBhY3QiLCJnZXRJdGVtRm9ybVNjaGVtYUZyb21Gb3JtcyIsImdldEl0ZW1Gb3JtU2NoZW1hIiwiaXNDb21wYWN0IiwiaXNJbmxpbmVkIiwiaXNOZXN0ZWQiLCJvbWl0UGFkZGluZyIsImFsaWduQm90dG9tIiwiZ2V0RGVmYXVsdFZhbHVlIiwiY2xvbmUiLCJpZ25vcmVNaXNzaW5nVmFsdWUiLCJ0eXBlT3B0aW9ucyIsInNldERlZmF1bHRWYWx1ZXMiLCJwcm9jZXNzU2NoZW1hRGF0YSIsInJvb3REYXRhIiwiY29tcHV0ZSIsImNsb25lSXRlbSIsImNvcHkiLCJvcmRlcktleSIsInByb2Nlc3NEYXRhIiwic2NoZW1hT25seSIsInByb2Nlc3NlZERhdGEiLCJ3cmFwUHJpbWl0aXZlcyIsImIiLCJpZDEiLCJpZDIiLCJleGNsdWRlIiwicHJvY2Vzc1ZhbHVlIiwicHJvY2Vzc0JlZm9yZSIsInByb2Nlc3NBZnRlciIsInByb2Nlc3NDb21wb25lbnRzIiwiZ2V0RGF0YVBhdGgiLCJjb21wb25lbnRTY2hlbWEiLCJjb21wb25lbnREYXRhUGF0aCIsInByb2Nlc3NJdGVtIiwicHJvY2Vzc2VkSXRlbSIsImdldE5hbWVkU2NoZW1hcyIsInRvT2JqZWN0IiwiYXJyYXkiLCJ0b1NjaGVtYSIsImdldEJ1dHRvblNjaGVtYXMiLCJnZXRUeXBlIiwic2NoZW1hT3JUeXBlIiwiZ2V0U291cmNlVHlwZSIsImdldFBhbmVsRW50cnkiLCJ0YWJDb21wb25lbnQiLCJnZXRQYW5lbEVudHJpZXMiLCJwYW5lbFNjaGVtYXMiLCJwYW5lbEVudHJpZXMiLCJnZXRBbGxQYW5lbEVudHJpZXMiLCJwYW5lbFNjaGVtYSIsImlzT2JqZWN0U291cmNlIiwiaXNMaXN0U291cmNlIiwiZ2V0SXRlbUlkIiwiZ2V0SXRlbVVpZCIsInJlc29sdmVNZXJnZWRPcHRpb25zIiwibWl4aW5zIiwibWVyZ2VPcHRpb25zIiwidG8iLCJmcm9tIiwibWl4aW4iLCJkaXRvT3B0aW9uS2V5cyIsIkRpdG9Db21wb25lbnQiLCJkZWZpbml0aW9uIiwiRGl0b1VzZXIiLCJyb2xlcyIsInJvbGUiLCJTY2hlbWFQYXJlbnRNaXhpbiIsInNjaGVtYUNvbXBvbmVudHMiLCJWYWxpZGF0b3JNaXhpbiIsIml0IiwiUm91dGVNaXhpbiIsInJvdXRlQ29tcG9uZW50IiwibWF0Y2hlZCIsImkiLCJyZWNvcmQiLCJicmVhZGNydW1iIiwicm91dGVDb21wb25lbnRzIiwib2siLCJ0ZW1wbGF0ZVBhdGgiLCJyb290UGF0aCIsImdldENvbW1vblByZWZpeCIsImlzTG9hZGluZyIsImNvcHlEYXRlIiwiZGF0ZSIsInllYXIiLCJtb250aCIsImRheSIsImhvdXIiLCJtaW51dGUiLCJzZWNvbmQiLCJtaWxsaXNlY29uZCIsIl9zZmNfbWFpbiIsIndlZWtkYXlOYW1lcyIsIm1vbnRoTmFtZXMiLCJnZXRMb2NhbGVOYW1lcyIsIm1vZGUiLCJvdmVycmlkZXMiLCJzdGVwIiwiY3VycmVudFZhbHVlIiwic3RhdGUiLCJob3IiLCJ2ZXIiLCJlbnRlciIsImN1cnJlbnRNb2RlIiwic3RhcnRZZWFyIiwiZmlyc3REYXlXZWVrIiwibnVtRGF5cyIsInByZXZNb250aCIsInByZXZNb250aE51bURheXMiLCJ0b2RheSIsImlzRGF5IiwibmV4dE1vbnRoTmVlZCIsIm5leHRNb250aCIsImxvY2FsZU5hbWVzIiwibmFtZXMiLCJhZGRFdmVudHMiLCJnZXRLZXkiLCJnZXRLZXlOYXZpZ2F0aW9uIiwiY2xhc3NlcyIsInNob3ciLCJ0cmlnZ2VyIiwicG9wdXAiLCJlbCIsImJvdW5kcyIsInRyaWdnZXJMZWZ0IiwidHJpZ2dlclRvcCIsInRyaWdnZXJXaWR0aCIsInRyaWdnZXJIZWlnaHQiLCJwb3B1cFdpZHRoIiwicG9wdXBIZWlnaHQiLCJwYXJ0MSIsInBhcnQyIiwid2luV2lkdGgiLCJ3aW5IZWlnaHQiLCJsZWZ0IiwidG9wIiwidHJpZ2dlckJvdW5kcyIsInNpemUiLCJnZXRMZW5ndGgiLCJUcmlnZ2VyIiwiQ2FsZW5kYXIiLCJJbnB1dEZpZWxkIiwiZGVmYXVsdEZvcm1hdHMiLCJzY3JvbGxUbyIsImR1cmF0aW9uIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwicGVyVGljayIsInNldFNlbGVjdGlvbiIsImZpZWxkIiwic3RhcnQiLCJlbmQiLCJyYW5nZSIsImZvcmNlIiwic2Nyb2xsIiwicmVmIiwibGluZUhlaWdodCIsInNlbGVjdGVkIiwibGVuZ3RoIiwiRGF0ZVBpY2tlciIsIlRpbWVQaWNrZXIiLCJwYWdlIiwicGFnZVNpemUiLCJjdXJyZW50UGFnZVNpemUiLCJzaG93UHJldiIsInNob3dOZXh0IiwidG90YWwiLCJjdXJyZW50UGFnZSIsInNob3dMZW5ndGgiLCJudW1QYWdlcyIsInBhZ2VSYW5nZSIsImNoZWNrZWQiLCJkaXNhYmxlZCIsInVuY2hlY2tlZCIsIm1vZGVsVmFsdWUiLCJUcmFuc2l0aW9uSGVpZ2h0IiwiZW5hYmxlZCIsInNsb3RzIiwiY3JlYXRlRWxlbWVudCIsIlRyYW5zaXRpb24iLCJwcm9wcyIsInNldFN0eWxlIiwic3R5bGUiLCJmb3JjZVJlcGFpbnQiLCJ3aWR0aCIsImhlaWdodCIsIlVzZUZvY3VzVHJhcCIsImRlZmluZUNvbXBvbmVudCIsInRyYXAiLCJhY3RpdmF0ZSIsImRlYWN0aXZhdGUiLCJ1bnJlZkVsZW1lbnQiLCJjcmVhdGVGb2N1c1RyYXAiLCJvblNjb3BlRGlzcG9zZSIsImgiLCJkaWFsb2dEYXRhIiwiRG9tTWl4aW4iLCJyZW1vdmUiLCJoYW5kbGVyIiwiRGl0b0RpYWxvZyIsImVyciIsInRpdGxlIiwidGV4dCIsImxvZyIsInN0cmlwVGFncyIsIm5vdGlmaWNhdGlvbnMiLCJkdXJhdGlvbkZhY3RvciIsInJlamVjdCIsImRpYWxvZ0lkIiwiYWRkaXRpb25hbENvbXBvbmVudHMiLCJyZWRpcmVjdEFmdGVyTG9naW4iLCJsb2dpbkRhdGEiLCJ1c2VyIiwiRGl0b1ZpZXciLCJmdWxsUGF0aCIsImFkZFJvdXRlcyIsInJvdXRlciIsInJlbW92ZXJzIiwicm91dGUiLCJyZW1vdmVSb3V0ZSIsIkRpdG9TcGlubmVyIiwiY29sb3IiLCJQdWxsZG93bk1peGluIiwic3RhcnRUaW1lIiwib3BlbiIsImNvbnRlbnQiLCJhc09iamVjdCIsIkl0ZW1NaXhpbiIsImV4dGVuZGVkIiwiaXRlbUxhYmVsIiwiZm9ybUxhYmVsIiwiZ2V0Rm9ybUxhYmVsIiwicHJlZml4Iiwic3VmZml4IiwiY29sdW1ucyIsImhhZExhYmVsIiwicGFuZSIsImN1cnJlbnRUYWIiLCJmaXJzdCIsImRlZmF1bHRUYWIiLCJkYXRhUGF0aE9yTmFtZSIsImV4cGFuZCIsImNvbXBvbmVudHNCeURhdGFQYXRoIiwiZGF0YVBhdGhzIiwiY2hlY2siLCJ1bm1hdGNoZWQiLCJlcnJzIiwiZnVsbERhdGFQYXRoIiwiZGF0YVBhdGhQYXJ0cyIsImZvdW5kIiwicHJvcGVydHkiLCJzdWJDb21wb25lbnRzIiwicmVnaXN0cnkiLCJlbnRyaWVzQnlEYXRhUGF0aCIsIl9ob2lzdGVkXzEiLCJfb3BlbkJsb2NrIiwiX2NyZWF0ZUVsZW1lbnRCbG9jayIsIl9GcmFnbWVudCIsIl9yZW5kZXJMaXN0IiwiX2N0eCIsIl9ob2lzdGVkXzIiLCJfY3JlYXRlQmxvY2siLCJfY29tcG9uZW50X0RpdG9Db250YWluZXIiLCJuZXN0ZWREYXRhUGF0aCIsInN0b3JlIiwiX2hvaXN0ZWRfMyIsInBhcnNlRnJhY3Rpb24iLCJkaXZpZGVuZCIsImRpdmlzb3IiLCJjb250YWluZXJDbGFzcyIsImJhc2lzIiwiZ3JvdyIsInNocmluayIsImJhc2lzSXNBdXRvIiwiaGFzVk5vZGVDb250ZW50Iiwidm5vZGUiLCJDb21tZW50IiwiaGFzU2xvdENvbnRlbnQiLCJzbG90IiwidXNlU2xvdHMiLCJidXR0b24iLCJjYXBpdGFsaXplIiwiY2xpcGJvYXJkRGF0YSIsInBhc3RlIiwicmVwb3J0IiwianNvbiIsIl9kIiwiX2MiLCJkZWluZGVudCIsIiRzY2hlbWEiLCJfZSIsIkxvYWRpbmdNaXhpbiIsInVwZGF0ZVJvb3QiLCJ1cGRhdGVWaWV3IiwiUmVzb3VyY2VNaXhpbiIsImFtb3VudCIsInZlcmJzIiwiY2xlYXIiLCJsb2FkaW5nT3B0aW9ucyIsInJlcXVlc3QiLCJzZXREYXRhIiwib25TdWNjZXNzIiwib25FcnJvciIsIm5vdGlmeVN1Y2Nlc3MiLCJub3RpZnlFcnJvciIsInJlc29sdmVQYXRoIiwiaXNDcmVhdGluZyIsInByb3ZpZGVzRGF0YSIsImRhdGFQYXJ0cyIsInBhdGhQYXJ0cyIsInJvdXRlUGFydHMiLCJsYXN0RGF0YVBhcnQiLCJsIiwiZGF0YVBhcnQiLCJtYWluU2NoZW1hQ29tcG9uZW50IiwicHJlc2VudCIsImNsb3NlRm9ybSIsImdldFZlcmIiLCJidXR0b25SZXNvdXJjZSIsInN1Y2Nlc3MiLCJfcmVzb3VyY2UiLCJfbWV0aG9kIiwiRGl0b0Zvcm0iLCJzY29wZSIsIlBhZ2luYXRpb24iLCJTb3J0YWJsZU1peGluIiwiZm9yY2VGYWxsYmFjayIsIm9sZEluZGV4IiwibmV3SW5kZXgiLCJsaXN0IiwicGFnaW5hdGlvblJhbmdlIiwib2Zmc2V0IiwiX25vcm1hbGl6ZVN0eWxlIiwiX2NhY2hlIiwiX3dpdGhNb2RpZmllcnMiLCIkZXZlbnQiLCJfbm9ybWFsaXplQ2xhc3MiLCJfY3JlYXRlRWxlbWVudFZOb2RlIiwiX2hvaXN0ZWRfNCIsIl90b0Rpc3BsYXlTdHJpbmciLCJfaG9pc3RlZF81IiwiX2hvaXN0ZWRfNyIsIl9tZXJnZVByb3BzIiwiX3dpdGhEaXJlY3RpdmVzIiwiX2hvaXN0ZWRfOCIsIl9jb21wb25lbnRfRGl0b0xhYmVsIiwiX2NyZWF0ZVZOb2RlIiwiX2NvbXBvbmVudF9EaXRvVGFibGVDZWxsIiwiX2NvbXBvbmVudF9EaXRvRHJhZ2dhYmxlIiwiX2NvbXBvbmVudF9EaXRvVHJlZUl0ZW0iLCJjaGlsZHJlblNjaGVtYSIsImNoaWxkcmVuTGlzdCIsImVkaXRQYXRoIiwiY2hpbGRyZW5PcGVuIiwibnVtQ2hpbGRyZW4iLCJjcmVhdGFibGUiLCJlZGl0YWJsZSIsIm9yZGVyIiwiY29sdW1uIiwicmVuZGVyIiwiZXNjYXBlSHRtbCIsIl9fZGVmUHJvcCIsIl9fZ2V0T3duUHJvcFN5bWJvbHMiLCJfX2hhc093blByb3AiLCJfX3Byb3BJc0VudW0iLCJfX2RlZk5vcm1hbFByb3AiLCJvYmoiLCJfX3NwcmVhZFZhbHVlcyIsInByb3AiLCJfX29ialJlc3QiLCJ1c2VTb3J0YWJsZSIsInNvcnRhYmxlIiwiZG9jdW1lbnQiLCJkZWZhdWx0RG9jdW1lbnQiLCJyZXNldE9wdGlvbnMiLCJkZWZhdWx0T3B0aW9ucyIsImUiLCJtb3ZlQXJyYXlFbGVtZW50IiwiU29ydGFibGUiLCJzdG9wIiwidHJ5T25Nb3VudGVkIiwidHJ5T25TY29wZURpc3Bvc2UiLCJ0b1ZhbHVlIiwibmV4dFRpY2siLCJVc2VTb3J0YWJsZSIsInVzZVZNb2RlbCIsIkRpdG9WTm9kZSIsIkRpdG9UeXBlQ29tcG9uZW50JDEiLCJEaXRvVHlwZUNvbXBvbmVudCIsIm9uQ2xpY2siLCJEYXRhTWl4aW4iLCJyZXNvbHZlQ291bnRlciIsImFzeW5jRW50cnkiLCJyZXNvbHZlZERhdGEiLCJsb2FkIiwidGltZXIiLCJPcHRpb25zTWl4aW4iLCJjb252ZXJ0VmFsdWUiLCJjb252ZXJ0Iiwic2VhcmNoIiwiZmlsdGVyIiwiZGVib3VuY2UiLCJkZWJvdW5jZUFzeW5jIiwib3B0aW9uIiwiZ3JvdXBlZCIsInJlc3VsdHMiLCJncm91cCIsImZpbmRPcHRpb24iLCJncm91cEJ5Iiwib3B0aW9uVmFsdWUiLCJvcHRpb25MYWJlbCIsInByb2Nlc3NSZWxhdGUiLCJmbGFzayIsIkNvZGVGbGFzayIsImNoYW5nZWQiLCJpZ25vcmVXYXRjaCIsImlnbm9yZVVwZGF0ZSIsInNldENvZGUiLCJjb2RlIiwic2V0VmFsdWUiLCJTa2V0Y2hQaWNrZXIiLCJ0aW55Y29sb3IiLCJmb2N1c2VkIiwiRGF0ZVRpbWVQaWNrZXIiLCJTb3VyY2VNaXhpbiIsImRlZmF1bHRTb3J0IiwiZGlyZWN0aW9uIiwiZHJhZ2dhYmxlIiwiY29sbGFwc2libGUiLCJsaXN0RGF0YSIsIm9uQ29tcGxldGUiLCJvcGVuZWQiLCJjYWxsT25Db21wbGV0ZSIsImlubGluZWQiLCJwYXJhbSIsIm1ldGEiLCJmb3JtTWV0YSIsImNoaWxkUm91dGVzIiwiZ2V0UGF0aFdpdGhQYXJhbSIsInNvdXJjZVBhdGgiLCJmb3JtUm91dGUiLCJmbGF0Um91dGVzIiwic3ViUm91dGVzIiwiY2hpbGRSb3V0ZSIsImZpbHRlckNvbXBvbmVudHMiLCJkYXRlRm9ybWF0IiwiY3JlYXRlRmlsdGVyc1BhbmVsIiwiZmlsdGVycyIsInByb3h5Iiwic3RpY2t5IiwiZmlsdGVyU2NoZW1hcyIsInBhcnNlRmlsdGVyc0RhdGEiLCJjcmVhdGVGaWx0ZXJzQ29tcG9uZW50cyIsImNyZWF0ZUZpbHRlcnNCdXR0b25zIiwiZm9ybWF0RmlsdGVyc0RhdGEiLCJzbWFsbCIsImNvbXBzIiwiZ2V0Q29tcG9uZW50c0ZvckZpbHRlciIsImZpbHRlcnNEYXRhIiwiX2NvbXBvbmVudF9EaXRvVGFibGVIZWFkIiwiX2NvbXBvbmVudF9EaXRvU2NoZW1hSW5saW5lZCIsIl9yZXNvbHZlRHluYW1pY0NvbXBvbmVudCIsIl9jb21wb25lbnRfRGl0b0VkaXRCdXR0b25zIiwiX2hvaXN0ZWRfOSIsImdldExpc3RDb21wb25lbnQiLCJmaWx0ZXJzRGF0YVBhdGgiLCJFZGl0b3JDb250ZW50IiwiSWNvbiIsImVkaXRvciIsIm1hcmtCdXR0b25zIiwiYmFzaWNOb2RlQnV0dG9ucyIsIm90aGVyTm9kZUJ1dHRvbnMiLCJ0b29sQnV0dG9ucyIsImVuYWJsZVJ1bGVzIiwic2V0VmFsdWVEZWJvdW5jZWQiLCJvblVwZGF0ZSIsIkVkaXRvciIsImdldFBvaW50IiwieCIsInkiLCJwcmV2WSIsIm1vdXNlbW92ZSIsImRpYWxvZ0NvbXBvbmVudCIsImdldE1hcmtBdHRyaWJ1dGVzIiwiaHJlZiIsIm1hcmtzIiwibm9kZXMiLCJ0b29scyIsIkRvY3VtZW50IiwiVGV4dCIsIlBhcmFncmFwaCIsIkJvbGQiLCJJdGFsaWMiLCJVbmRlcmxpbmUiLCJTdHJpa2UiLCJTbWFsbCIsIkNvZGUiLCJMaW5rV2l0aFRpdGxlIiwiQmxvY2txdW90ZSIsIkNvZGVCbG9jayIsIkhhcmRCcmVhayIsIkhlYWRpbmciLCJIb3Jpem9udGFsUnVsZSIsIkxpc3RJdGVtIiwiQnVsbGV0TGlzdCIsIk9yZGVyZWRMaXN0IiwiSGlzdG9yeSIsImV4dGVuc2lvbiIsInNldHRpbmdzTmFtZSIsImRlc2NyaXB0aW9ucyIsImFkZEJ1dHRvbiIsImljb24iLCJpZ25vcmVBY3RpdmUiLCJkZXNjcmlwdGlvbiIsInNldHRpbmdOYW1lIiwidW5kZXJzY29yZSIsImF0dHJpYnV0ZSIsIk1hcmsiLCJjb21tYW5kcyIsIkxpbmsiLCJub2RlIiwiX2NvbXBvbmVudF9WdWVNdWx0aXNlbGVjdCIsIlZ1ZU11bHRpc2VsZWN0IiwicGxhY2Vob2xkZXIiLCJzZWFyY2hhYmxlIiwidGFnZ2FibGUiLCJ0YWciLCJOdW1iZXJNaXhpbiIsIlN3aXRjaEJ1dHRvbiIsIm1hc2tlZFBhc3N3b3JkIiwiaGFzRWRpdGFibGVGb3JtcyIsImZvcm1hdEZpbGVTaXplIiwiZmlsZXNpemUiLCJWdWVVcGxvYWQiLCJhc0ZpbGVzIiwiYWNjZXB0IiwibWF4U2l6ZSIsInBhcnNlRmlsZVNpemUiLCJmaWxlIiwibmV3RmlsZSIsIm9sZEZpbGUiLCJ4aHIiLCJmaWxlcyIsInVwbG9hZCIsImxvZ2dlZERlcHJlY2F0aW9ucyIsImRlcHJlY2F0ZSIsImZvcm1hdFF1ZXJ5IiwidmFsIiwiRGl0b0FkbWluIiwiZGl0byIsInZpZXdzIiwiZ2V0QXBpVXJsIiwiaXNBcGlVcmwiLCJ1c2VycyIsInBhcmVudFBhdGgiLCJhcHAiLCJjcmVhdGVBcHAiLCJEaXRvUm9vdCIsIlZ1ZU5vdGlmaWNhdGlvbnMiLCJjcmVhdGVSb3V0ZXIiLCJjcmVhdGVXZWJIaXN0b3J5IiwiUmVxdWVzdEVycm9yIiwiaGVhZGVycyIsImlzQWJzb2x1dGVVcmwiLCJjb21iaW5lVXJscyIsImJhc2VVcmwiLCJyZWxhdGl2ZVVybCJdLCJtYXBwaW5ncyI6Im9wR0FFQSxNQUFBQSxHQUFlQyxXQUFTLENBQ3RCLE1BQU8sR0FDUCxnQkFBaUIsQ0FBRSxFQUNuQixLQUFNLEtBQ04sVUFBVyxDQUFFLEVBQ2IsWUFBYSxLQUNiLGNBQWUsSUFDakIsQ0FBQyxFQ0ZNLFNBQVNDLEVBQWVDLEVBQVVDLEVBQU8sQ0FDOUMsT0FBT0QsRUFDSCxHQUFHQSxLQUFZQyxJQUNmQSxDQUNOLENBRU8sU0FBU0MsR0FBb0JGLEVBQVUsQ0FDNUMsTUFBTUcsRUFBT0MsRUFBYSxjQUFDSixDQUFRLEVBQ25DLE9BQUFHLEdBQUEsTUFBQUEsRUFBTSxNQUNDQSxDQUNULENBTU8sU0FBU0UsR0FBa0JMLEVBQVVNLEVBQVMsR0FBTyxDQUMxRCxPQUFPQSxFQUFTSixHQUFvQkYsQ0FBUSxFQUFJSSxFQUFBQSxjQUFjSixDQUFRLENBQ3hFLENBRU8sU0FBU08sR0FBZ0JQLEVBQVVNLEVBQVMsR0FBTyxDQUN4RCxPQUFPRSxvQkFBa0JILEdBQWtCTCxFQUFVTSxDQUFNLENBQUMsQ0FDOUQsQ0FFTyxTQUFTRyxHQUF3QlQsRUFBVU0sRUFBUyxHQUFPLENBQ2hFLE1BQU1ILEVBQU9FLEdBQWtCTCxFQUFVTSxDQUFNLEVBQy9DLEdBQUlILEVBQU0sQ0FHUixJQUFJRixFQUNKLEdBQ0VBLEVBQVFFLEVBQUssSUFBSyxRQUNYRixHQUFTLE1BQVFTLFlBQVUsQ0FBQ1QsQ0FBSyxHQUUxQyxHQUFJQSxHQUFTLEtBQ1gsT0FBT0UsRUFHWCxPQUFPLElBQ1QsQ0FFTyxTQUFTUSxHQUFzQlgsRUFBVU0sRUFBUyxHQUFPLENBQzlELE9BQU9FLG9CQUFrQkMsR0FBd0JULEVBQVVNLENBQU0sQ0FBQyxDQUNwRSxDQUVPLFNBQVNNLEdBQVFDLEVBQVViLEVBQVVN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QUNoRCxDQUNILENBRUEsTUFBTXV3QixXQUFxQixLQUFNLENBQy9CLFlBQVk1c0IsRUFBVSxDQUNwQixNQUNFLG9DQUFvQ0EsRUFBUyxXQUMzQ0EsRUFBUyxhQUVaLEVBQ0QsS0FBSyxTQUFXQSxDQUNqQixDQUNILENBRUEsZUFBZXNjLEdBQVE5VSxFQUFLLENBQzFCLElBQUE1SCxFQUNBLE9BQUFDLEVBQVMsTUFHVCxPQUFBMEIsRUFBUyxLQUNULE1BQUE1QixFQUFRNEIsR0FBVSxLQUNsQixRQUFBc3JCLEVBQVUsS0FDVixLQUFBM3hCLEVBQU8sSUFDVCxFQUFHLFNBQ0dxRyxHQUNGcXFCLEdBQ0UsMEVBQ0QsRUFHSCxNQUFNTyxFQUFXM2tCLEVBQUksU0FBUzVILENBQUcsRUFFM0JJLEVBQVcsTUFBTSxNQUFNd0gsRUFBSSxVQUFVLENBQUUsSUFBQTVILEVBQUssTUFBQUQsQ0FBSyxDQUFFLEVBQUcsQ0FDMUQsT0FBUUUsRUFBTyxZQUFhLEVBQzVCLEdBQUkzRSxHQUFRLENBQUUsS0FBTSxLQUFLLFVBQVVBLENBQUksR0FDdkMsUUFBUyxDQUNQLEdBQUlpeEIsR0FBWTNrQixFQUFJLFFBQ3BCLEdBQUdxbEIsQ0FDSixFQUNELFlBQ0VWLEtBQVlodkIsRUFBQXFLLEVBQUksT0FBSixNQUFBckssRUFBVSxhQUNsQixVQUNBLGFBQ1YsQ0FBRyxFQU1ELElBSkk0RyxFQUFBL0QsRUFBUyxRQUFRLElBQUksY0FBYyxJQUFuQyxNQUFBK0QsRUFBc0MsU0FBUyxzQkFDakQvRCxFQUFTLEtBQU8sTUFBTUEsRUFBUyxLQUFNLEdBR25DLENBQUNBLEVBQVMsR0FDWixNQUFNLElBQUk0c0IsR0FBYTVzQixDQUFRLEVBRWpDLE9BQU9BLENBQ1QsQ0FFQSxTQUFTbXNCLEdBQVMza0IsRUFBSzVILEVBQUssQ0FDMUIsTUFBTyxDQUFDa3RCLEVBQWEsY0FBQ2x0QixDQUFHLEdBQUtBLEVBQUksV0FBVzRILEVBQUksR0FBRyxDQUN0RCxDQUVBLFNBQVMwa0IsR0FBVTFrQixFQUFLLENBQUUsSUFBQTVILEVBQUssTUFBQUQsQ0FBSyxFQUFJLENBQ2pDbXRCLEVBQUFBLGNBQWNsdEIsQ0FBRyxJQUNwQkEsRUFBTW10QixHQUFZdmxCLEVBQUksSUFBSzVILENBQUcsR0FHaEMsTUFBTThpQixFQUFTbUosR0FBWWxzQixDQUFLLEVBQ2hDLE9BQU8raUIsRUFBUyxHQUFHOWlCLEtBQU84aUIsSUFBVzlpQixDQUN2QyxDQUVBLFNBQVNtdEIsR0FBWUMsRUFBU0MsRUFBYSxDQUV6QyxNQUFPLEdBQUdELEVBQVEsUUFBUSxPQUFRLEVBQUUsS0FBS0MsRUFBWSxRQUFRLE9BQVEsRUFBRSxHQUN6RSIsInhfZ29vZ2xlX2lnbm9yZUxpc3QiOls0Niw4M119