@beam3_dev/api_module 0.0.44 → 0.0.46

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.
@@ -1,5 +1,5 @@
1
- (function(u,b){typeof exports=="object"&&typeof module<"u"?b(exports,require("uuid"),require("luxon"),require("@widget-lab/3ddashboard-utils")):typeof define=="function"&&define.amd?define(["exports","uuid","luxon","@widget-lab/3ddashboard-utils"],b):(u=typeof globalThis<"u"?globalThis:u||self,b(u["@beam3_dev/api_module"]={},u.uuid,u.luxon,u["@widget-lab/3ddashboard-utils"]))})(this,function(u,b,U,C){"use strict";function A(){return b.v4()}const v={b3M3Yellow:"#FFB300",b3AboutageBlue:"#42A5F5",b3UsinageGreen:"#689F38",b3PanneauOrange:"#ff8000",b3M350percent:"#fafa6e",b3M380percent:"#aae479",b3M390percent:"#64c987",b3M3100percent:"#23aa8f",b3M3105percent:"#00898a",b3M3110percent:"#176877",b3M3120percent:"#2a4858",b3Aboutage50percent:"#fafa6e",b3Aboutage80percent:"#aae479",b3Aboutage90percent:"#64c987",b3Aboutage100percent:"#23aa8f",b3Aboutage105percent:"#00898a",b3Aboutage110percent:"#176877",b3Aboutage120percent:"#2a4858",b3Warning:"#FF0000",b3Edit1:"#AD1457",b3Edit2:"#F4511E",b3Edit3:"#009688",b3Edit4:"#D50000",b3Edit5:"#039BE5",b3Edit6:"#9E69AF",b3Edit7:"#A79B8E",b3Edit8:"#616161",b3Edit9:"#795548"};async function H(e,t=void 0,n=void 0){const s=parseInt(e);await fetch("https://apicarto.ign.fr/api/codes-postaux/communes/"+s,{method:"GET",headers:{Accept:"application/json"}}).then(i=>i.json()).then(i=>{t&&t(i)}).catch(i=>{n&&n(i),console.error("Erreur : "+i)})}async function z(e,t=void 0,n=void 0){e=encodeURIComponent(e),await fetch("https://api-adresse.data.gouv.fr/search/?q="+e+"&limit=15",{method:"GET",headers:{Accept:"application/json"}}).then(s=>s.json()).then(s=>{t&&t(s)}).catch(s=>{n&&n(s),console.error("Erreur : "+s)})}async function Q(e,t=v){let n=U.DateTime.now().year;const s=e,i=[],c=a=>{for(let r in a)i.push({date:r,comment:a[r]})};for(let a=n;a<=n+1;a++)await fetch("https://calendrier.api.gouv.fr/jours-feries/metropole/"+a+".json",{method:"GET",headers:{Accept:"application/json"}}).then(r=>r.json()).then(r=>{c(r)}).catch(r=>console.error("Erreur : "+r));return(()=>{const a=s.length===0?{events:[]}:s;for(let r of i)a.events.findIndex(l=>l.start===U.DateTime.fromISO(r.date).toISODate()&&l.name==="Férié : "+r.comment)===-1&&a.events.push({name:"Férié : "+r.comment,start:U.DateTime.fromISO(r.date).toISODate(),end:U.DateTime.fromISO(r.date).toISODate(),color:t.b3BusinnessDays,timed:!1});return a})()}async function Z(e,t,n=!0){const s=e.events.findIndex(i=>i.uuid===t.uuid);return s===-1?e.events.push(t):n?e.events[s]=t:e.events.splice(s,1),e.length>0&&e.sort((i,c)=>i.start-c.start),e}function m(e,t){C.requirejs(["DS/WAFData/WAFData"],n=>{n.authenticatedRequest(e,t)})}function ee(e,t,n){C.requirejs(["DS/DataDragAndDrop/DataDragAndDrop"],s=>{s.draggable(e,{data:t,start:n})})}function te(e,t=void 0){C.requirejs(["DS/TagNavigatorProxy/TagNavigatorProxy"],n=>{let s;s===void 0&&(s=n.createProxy({widgetId:C.widget.id,filteringMode:"WithFilteringServices"}),t!==void 0&&s.addEvent("onFilterSubjectsChange",t)),s.setSubjectsTags(e)})}function ne(e,t){C.requirejs(["DS/DataDragAndDrop/DataDragAndDrop"],n=>{n.droppable(e,{drop:t})})}async function se(e,t=void 0,n=void 0){C.requirejs(["DS/i3DXCompassServices/i3DXCompassServices"],s=>{(!e||e==="")&&(e=C.widget.getValue("PlatFormInstanceId")),(!e||e==="")&&(e=void 0),t&&t(s.getPlatformServices({platformId:e,onComplete:t,onFailure:n}))})}function ae(){let e={};return C.requirejs(["DS/PlatformAPI/PlatformAPI"],t=>{const n=t.getTenant(),s=t.getUser(),i=t.getAllApplicationConfigurations(),c=t.getApplicationConfiguration("com.3ds.wp.passport.cors");e={tenant:n,user:s,appsConfiguration:i,appConf:c}}),console.log("%cRETOUR API :","color:blue",e),e}function ie(e,t,n){const s={base:`${e.space}`,uri:"/resources/AppsMngt/api/custom/applications",option:`?filter=${e.tenant}`},i=`${s.base}${s.uri}${s.option}`;m(i,{method:"GET",headers:{"Content-Type":"application/json",Accept:"application/json"},onComplete(c,o,a){const r=JSON.parse(c),d=r.data.map(l=>{const p=l.attributes.name,f=l.id;return{name:p,id:f}});t&&t(d,r)},onFailure(c,o){const a=c;a.msg=o.errormsg,a.errCode=o.errorcode,n&&n(a)}})}function oe(e,t=void 0,n=void 0){let s=`${e.space}/resources/AppsMngt/user?platform=${e.tenant}&limit=-1`;m(s,{onComplete(i,c,o){const a=JSON.parse(i);console.log("_AppMngt_get_users => ",a),t&&t(a)},onFailure(i,c){const o=i;o.msg=c.errormsg,o.errCode=c.errorcode,n&&n(o)}})}function re(e,t,n=void 0,s=void 0){let i=`${e.space}/resources/AppsMngt/user?platform=${e.tenant}&id=${t}`;m(i,{onComplete(c,o,a){const r=JSON.parse(c);n&&n(r)},onFailure(c,o){const a=c;a.msg=o.errormsg,a.errCode=o.errorcode,s&&s(a)}})}const I={"Content-Type":"application/json",Accept:"application/json,text/javascript,*/*"};function ce(e,t,n=void 0,s=void 0){const{space:i,currentUser:c}=e,a=`${i}${{URIUGr:"/3drdfpersist/resources/v1/usersgroup"}.URIUGr}`,r={groups:[{title:t.title,description:t.description,members:t.members||[c.email,"samuel.mureau@beam3.fr"],pending_members:[],sharing:t.sharing,visibility:t.visibility}]};m(a,{method:"POST",headers:I,data:JSON.stringify(r),onComplete(d){n&&n(JSON.parse(d))},onFailure(d,l){console.log(d);const p=d;p.msg=l.errormsg,p.errCode=l.errorcode,console.log("❌ sendDirectMessage => ",p),s&&s(p)}})}function de(e,t,n=void 0,s=void 0){const{space:i,tenant:c}=e,o=i,a=`/3drdfpersist/v1/resources/${t}`,r=`?$mask=dsaccess:Mask.GroupUI.Properties&tenant=dstenant:${c}`,d=`${o}${a}${r}`;m(d,{opts:{method:"GET",headers:{"Content-Type":"application/json",Accept:"application/json,text/javascript,*/*"}},onComplete(f){n&&n(JSON.parse(f))},onFailure(f,g){const _=f;_.msg=g.errormsg,_.errCode=g.errorcode,s&&s(_)}})}function M(e,t=void 0,n=void 0){const{space:s,tenant:i}=e,c=s,o="/3drdfpersist/resources/v1/option-sets/dsusergroup:ListOfGroupResponsibilities/options",a=`?tenant=dstenant:${i}`,r={method:"GET",Accept:"application/json,*/*,test/javascript"},d=`${c}${o}${a}`;m(d,{OPTsH:r,onComplete(l){t&&t(JSON.parse(l))},onFailure(l,p){const f=l;f.msg=p.errormsg,f.errCode=p.errorcode,n&&n(f)}})}function le(e,t=void 0,n=void 0){const{space:s,currentUser:i}=e,a=`${s}/3drdfpersist/resources/v1/usersgroup?select=uri,title,description,owner,members,pending_members,creation_date,modification_date,visibility`,d={method:"GET",headers:{"Content-Type":"application/json",Accept:"application/json,text/javascript,*/*"}};try{m(a,{opts:d,onComplete(l){const p=JSON.parse(l),f={},g=p.groups.filter(_=>_.uri.startsWith("uuid:"));if(i&&Object.keys(i).length>0){const _=g.filter(y=>y.owner===i.email),S=g.filter(y=>y.members.includes(i.email)),h=_.concat(S);f.iam=h,f.UG=g,f.iamMember=S,M(e,y=>{f.rules=y,t&&t(f)},y=>{n&&n(y)})}},onFailure(l){n&&n(l)}})}catch(l){console.log(l)}}function ue(e,t){const{space:n}=e,i=`${n}/3drdfpersist/resources/v1/usersgroup/${t}`;m(i,{method:"DELETE"})}function pe(e,t,n,s=void 0,i=void 0){const{space:c,tenant:o}=e,a={URITI:"/3drdfpersist/resources/v1/template-instances",URIUGr:"/3drdfpersist/resources/v1/usersgroup",nextURICh:"/characteristics",nextURIGr:"/group",nexURImem:"/members",OPTsTI:"?$mask=dsaccess:Mask.GroupUI.Properties",OPTsTenant:`tenant=dstenant:${o}`},r=n,d=`${c}${a.URIUGr}/${t}`,l=JSON.stringify(r);m(d,{headers:I,method:"PATCH",data:l,type:"json",onComplete(p){s&&s(p)},onFailure(p){i&&i(p)}})}function fe(e,t,n,s=void 0,i=void 0){const{space:c}=e,a=`${c}/3drdfpersist/resources/v1/usersgroup/${t}/sharing`;m(a,{method:"PATCH",headers:I,data:JSON.stringify(n),type:"json",onComplete(d){s&&s(d)},onFailure(d){i&&i(d)}})}function me(e,t,n=void 0,s=void 0){const{space:i}=e,o=`${i}/3drdfpersist/resources/v1/usersgroup/${t}/sharing`;m(o,{opts:{method:"GET",headers:{"Content-Type":"application/json",Accept:"application/json,text/javascript,*/*"}},onComplete(d){n&&n(JSON.parse(d))},onFailure(d){s&&s(d)}})}async function P(e,t=void 0,n=void 0,s=void 0){const i=e.space;if(t===void 0){console.log("Le paramètre docid est obligatoire");return}const c=i+`/resources/v1/modeler/documents/${t}`;m(c,{onComplete(o,a,r){const d=JSON.parse(o);n&&n(d)},onFailure(o){s&&s(o)}})}function F(e,t=void 0,n=void 0){if(e.objID&&e.objID!==""){let s=`${e.space}/resources/v1/modeler/documents/${e.objID}`;m(s,{onComplete(i,c,o){const a=JSON.parse(i);e.token=a?.csrf?.value,e.datas=a?.data[0],t&&(console.log("info => ",a),t(e))},onFailure(i){n&&n(i)}})}else D(e)}function D(e,t=void 0,n=void 0){if(e.space){const s=e.space+"/resources/v1/application/CSRF";m(s,{onComplete(i,c,o){const a=JSON.parse(i);t&&t(a.csrf.value)},onFailure(i,c,o){n&&n({response:i,headers:c,xhr:o})}})}else n&&n("ERROR : url du 3DSpace non défini.")}function k(e,t,n=void 0,s=void 0){let i=e.space+`/resources/v1/modeler/documents/${t}/files/DownloadTicket`;F(e,c=>{m(i,{method:"PUT",headers:{ENO_CSRF_TOKEN:e.token},onComplete(o){let a=JSON.parse(o);if(a.success===!0)try{const r=a.data[0].dataelements.ticketURL;n&&n(r)}catch(r){s&&s(r)}},onFailure(o,a){console.log("☠️ error => ",o,a),s&&s(o,a)}})},s)}function ge(e,t,n,s=void 0,i=void 0){const c=`${e.space}/resources/v1/modeler/documents/${t}/files/DownloadTicket`;m(c,{method:"PUT",headers:{ENO_CSRF_TOKEN:n},onComplete(o){let a=JSON.parse(o);if(a.success===!0)try{const r=a.data[0].dataelements.ticketURL;s&&s(r)}catch(r){i&&i(r)}},onFailure(o){i&&i(o)}})}function L(e,t,n,s,i,c=void 0,o=void 0){F(e,t,a=>{J(e,t,n,s,i,a.csrf.value,c,o)})}function J(e,t,n,s,i,c,o=void 0,a=void 0){const r=e.space+`/resources/v1/modeler/documents/${t}/files/CheckinTicket`;m(r,{method:"PUT",headers:{ENO_CSRF_TOKEN:c},onComplete(d,l,p){const f=JSON.parse(d).data[0].dataelements,g=new FormData;g.append("__fcs__jobTicket",f.ticket),g.append("file_0",s,i);const _={};_.method="POST",_.data=g,_.onComplete=function(S){let h="temp_"+Date.now(),y={method:"PUT",headers:{ENO_CSRF_TOKEN:c},data:JSON.stringify({data:[{id:t,relateddata:{files:[{id:n,dataelements:{title:i,receipt:S},updateAction:"REVISE"}]},tempId:h}]}),type:"json",onComplete(T){o&&o(T)},onFailure(T){a&&a(T)}};m(e.space+"/resources/v1/modeler/documents",y)},_.onFailure=function(S){a&&a(S)},_.timeout=0,m(f.ticketURL,_)}})}async function _e(e,t,n,s,i=void 0,c=void 0){const o=e.space,a=e.token,r=e.ctx,d=new FormData,l=new Blob([JSON.stringify(t)],{type:"text/plain"}),p={url_Ticket:`${o}/resources/v1/modeler/documents/files/CheckinTicket`,url_Post:`${o}/resources/v1/modeler/documents/?SecurityContext=ctx::${r}`};if(!o&&o!==""){console.log("le store._3DSpace est vide");return}m(p.url_Ticket,{method:"PUT",headers:{ENO_CSRF_TOKEN:a.value},onComplete(f,g,_){const S=JSON.parse(f).data[0].dataelements;d.append("__fcs__jobTicket",S.ticket),d.append("filename",l,n);const h={method:"POST",data:d,onComplete(O){if(r!==""&&a!==""){const $={method:"POST",headers:{ENO_CSRF_TOKEN:a,Accept:"application/json","Content-Type":"application/json"},data:JSON.stringify({data:[{type:"Document",dataelements:{title:`Title_${n.toLowerCase().split(" ").join("_")}`,policy:"Document Release",description:s},relateddata:{files:[{dataelements:{title:`${n}.json`,receipt:O}}]},tempId:A()}]}),type:"json",timeout:0,onComplete:y,onFailure:T};r!==""&&m(p.url_Post,$)}else console.warn("le store est vide")},onFailure:T};function y(O){console.log("Success -- response ",O.data[0]),i&&i(O)}function T(O,$){console.log("Erreur -- response ",O,`
2
- headers `,$),c&&c(O)}m(S.ticketURL,h)}})}function N(e,t=void 0,n=void 0,s=void 0,i=void 0,c=void 0){const o=`${e.space}/resources/modeler/pno/person?current=true&select=preferredcredentials&select=collabspaces`;m(o,{method:"GET",onComplete(a){const r=JSON.parse(a);let d="",l,p,f;if(t){let g=r.collabspaces.find(_=>_.title===t);if(g){l=t;let _=g.couples;_=_.filter((S,h,y)=>h===y.findIndex(T=>T.organization.pid===S.organization.pid&&T.role.pid===S.role.pid)),n&&(Array.isArray(n)?n.forEach(S=>{f||_.forEach(h=>{if(S===h.role.name&&s===h.organization.title)f=S,p=s;else if(S===h.role.name){let y=_.filter(T=>T.role.name===S);y.length===1?(f=y[0].role.name,p=y[0].organization.title):c(y)}})}):_.forEach(S=>{if(n===S.role.name&&s===S.organization.title)f=n,p=s;else if(n===S.role.name){let h=_.filter(y=>y.role.name===n);h.length===1?(f=h[0].role.name,p=h[0].organization.title):c(h)}}))}}l&&p&&f?(d=f+"."+p+"."+l,i(d)):r.preferredcredentials?(d=r.preferredcredentials.role.name+"."+r.preferredcredentials.organization.title+"."+r.preferredcredentials.collabspace.title,i(d)):c&&(d=f+"."+p+"."+l,c(d))},onFailure(a){console.log("Erreur de récupération du contexte de sécurité. => ",a)}})}async function j(e,t=void 0,n=void 0,s=void 0){const i=e.objID;(i===void 0||i==="")&&console.warn("_3DSpace_download_doc() / Le paramètre objectId est obligatoire"),(e.space===""||!e.space)&&console.warn("_3DSpace_download_doc() / Le paramètre space est obligatoire");try{k(e,i,c=>{console.log("_3dspace_download_doc / _3DSpace_file_url / response ",c),m(c,{headers:{ENO_CSRF_TOKEN:e.token},onComplete(o){const a=JSON.parse(o);t&&t(a)},onFailure(o,a,r){n&&(console.log("error http",o),n({error:o,headers:a,xhr:r}))}})},c=>{n&&n(c),console.log("*_3dspace_download_doc / error file URL *",c)})}catch(c){console.log("*_3dspace_download_doc / error file URL *",c)}}async function E(e,t,n=void 0,s=void 0){let i=[];for(let a=0;a<t.length;a+=80){const r=t.slice(a,a+80);i.push(r)}const o=a=>{G(e,i[a],()=>{a++,a<i.length&&o(a)},r=>{n&&n(r)})};o(0)}function G(e,t,n=void 0,s=void 0,i=void 0){const c=[];t.forEach(r=>{c.push({id:r})});let o=JSON.stringify({csrf:{name:"ENO_CSRF_TOKEN",value:e.token},data:c});const a=`${e.space}/resources/v1/modeler/documents/DownloadTicket?tenant=${e.tenant}&e6w-lang=fr&e6w-timezone=-120`;m(a,{method:"PUT",data:o,type:"json",onComplete(r){const d=r.data;r.success===!0&&(n&&n(),d.forEach(l=>{try{const p=l.dataelements.fileName,f=l.dataelements.ticketURL;m(f,{onComplete:g=>{s&&s({objectId:l.id,fileName:p,data:JSON.parse(g)})},onFailure:g=>{console.log("error http",g)}})}catch(p){console.log(p),i&&i(p)}}))},onFailure(r){console.log(r),i&&i(r)}})}function Se(e,t,n=void 0,s=void 0){return new Promise(i=>{if(e.token===""&&D(e),t!==void 0&&t!==""&&t!==null){const c=`${e.space}/resources/v1/modeler/dslc/maturity/getNextStates`;N(e.space,"ESPACE COMMUN",["VPLMProjectLeader","VPLMCreator"],void 0,a=>e.ctx=a,a=>{console.log("onError =>",a)});let o={method:"POST",headers:{SecurityContext:"ctx::"+e.ctx,ENO_CSRF_TOKEN:e.token,Accept:"application/json","Content-Type":"application/json"},data:JSON.stringify({data:[{id:t}]}),type:"json",onComplete(a){n&&n(a)},onFailure(a){s&&s(a)}};m(c,o)}})}function he(e,t,n,s=void 0,i=void 0){return new Promise(c=>{if(e.token===""&&D(e),t!==void 0&&t!==""&&t!==null){const o=`${e.space}/resources/v1/modeler/dslc/maturity/changeState`;N(e.space,"ESPACE COMMUN",["VPLMProjectLeader","VPLMCreator"],void 0,r=>e.ctx=r,r=>{console.log("onError =>",r)});let a={method:"POST",headers:{SecurityContext:"ctx::"+e.ctx,ENO_CSRF_TOKEN:e.token,Accept:"application/json","Content-Type":"application/json"},data:JSON.stringify({data:[{id:t,nextState:n}]}),type:"json",onComplete(r){s&&s(r)},onFailure(r){i&&i(r)}};m(o,a)}})}function ye(e,t,n=void 0,s=void 0){return new Promise(i=>{if(e.token===""&&D(e),t!==void 0&&t!==""&&t!==null){const c=`${e.space}/resources/v1/dslc/versiongraph?withThumbnail=0&withIsLastVersion=0&withAttributes=0&withCopyFrom=0&tenant=${e.tenant}`;N(e.space,"ESPACE COMMUN",["VPLMProjectLeader","VPLMCreator"],void 0,a=>e.ctx=a,a=>{console.log("onError =>",a)});let o={method:"POST",headers:{securitycontext:"ctx::"+e.ctx,ENO_CSRF_TOKEN:e.token,Accept:"application/json","Content-Type":"application/json"},data:JSON.stringify({graphRequests:[{id:t}]}),type:"json",onComplete(a){n&&n(a)},onFailure(a){s&&s(a)}};m(c,o)}})}function we(e,t,n=void 0,s=void 0){return new Promise(i=>{if(e.token===""&&D(e),t!==void 0&&t!==""&&t!==null){const c=`${e.space}/resources/lifecycle/revise/prepare_revise_maskattributes?tenant=${e.tenant}`;N(e.space,"ESPACE COMMUN",["VPLMProjectLeader","VPLMCreator"],void 0,a=>e.ctx=a,a=>{console.log("onError =>",a)});let o={method:"POST",headers:{SecurityContext:"ctx::"+e.ctx,ENO_CSRF_TOKEN:e.token,Accept:"application/json","Content-Type":"application/json"},data:JSON.stringify({data:[{"attribute[PLMReference.V_versionComment]":null,physicalid:t,type:"Document",tenant:e.tenant,objectId:t,policy:"Document Release",availableSemantic:["E","LAST","NEW","DUP"]}]}),type:"json",onComplete(a){n&&n(a)},onFailure(a){s&&s(a)}};m(c,o)}})}function Te(e,t,n,s=void 0,i=void 0){return new Promise(c=>{if(e.token===""&&D(e),t!==void 0&&t!==""&&t!==null){const o=`${e.space}/resources/lifecycle/revise/major?tenant=${e.tenant}`;N(e.space,"ESPACE COMMUN",["VPLMProjectLeader","VPLMCreator"],void 0,r=>e.ctx=r,r=>{console.log("onError =>",r)});let a={method:"POST",headers:{securitycontext:"ctx::"+e.ctx,ENO_CSRF_TOKEN:e.token,Accept:"application/json","Content-Type":"application/json"},data:JSON.stringify({data:[{physicalid:t,proposedRevision:n,modifiedAttributes:{revision:n}}],folderid:null,notificationTimeout:600}),type:"json",onComplete(r){s&&s(r)},onFailure(r){i&&i(r)}};m(o,a)}})}//!SECTION
1
+ (function(u,b){typeof exports=="object"&&typeof module<"u"?b(exports,require("uuid"),require("luxon"),require("@widget-lab/3ddashboard-utils")):typeof define=="function"&&define.amd?define(["exports","uuid","luxon","@widget-lab/3ddashboard-utils"],b):(u=typeof globalThis<"u"?globalThis:u||self,b(u["@beam3_dev/api_module"]={},u.uuid,u.luxon,u["@widget-lab/3ddashboard-utils"]))})(this,function(u,b,U,C){"use strict";function A(){return b.v4()}const v={b3M3Yellow:"#FFB300",b3AboutageBlue:"#42A5F5",b3UsinageGreen:"#689F38",b3PanneauOrange:"#ff8000",b3M350percent:"#fafa6e",b3M380percent:"#aae479",b3M390percent:"#64c987",b3M3100percent:"#23aa8f",b3M3105percent:"#00898a",b3M3110percent:"#176877",b3M3120percent:"#2a4858",b3Aboutage50percent:"#fafa6e",b3Aboutage80percent:"#aae479",b3Aboutage90percent:"#64c987",b3Aboutage100percent:"#23aa8f",b3Aboutage105percent:"#00898a",b3Aboutage110percent:"#176877",b3Aboutage120percent:"#2a4858",b3Warning:"#FF0000",b3Edit1:"#AD1457",b3Edit2:"#F4511E",b3Edit3:"#009688",b3Edit4:"#D50000",b3Edit5:"#039BE5",b3Edit6:"#9E69AF",b3Edit7:"#A79B8E",b3Edit8:"#616161",b3Edit9:"#795548"};async function H(e,t=void 0,n=void 0){const s=parseInt(e);await fetch("https://apicarto.ign.fr/api/codes-postaux/communes/"+s,{method:"GET",headers:{Accept:"application/json"}}).then(i=>i.json()).then(i=>{t&&t(i)}).catch(i=>{n&&n(i),console.error("Erreur : "+i)})}async function z(e,t=void 0,n=void 0){e=encodeURIComponent(e),await fetch("https://api-adresse.data.gouv.fr/search/?q="+e+"&limit=15",{method:"GET",headers:{Accept:"application/json"}}).then(s=>s.json()).then(s=>{t&&t(s)}).catch(s=>{n&&n(s),console.error("Erreur : "+s)})}async function Q(e,t=v){let n=U.DateTime.now().year;const s=e,i=[],c=a=>{for(let r in a)i.push({date:r,comment:a[r]})};for(let a=n;a<=n+1;a++)await fetch("https://calendrier.api.gouv.fr/jours-feries/metropole/"+a+".json",{method:"GET",headers:{Accept:"application/json"}}).then(r=>r.json()).then(r=>{c(r)}).catch(r=>console.error("Erreur : "+r));return(()=>{const a=s.length===0?{events:[]}:s;for(let r of i)a.events.findIndex(l=>l.start===U.DateTime.fromISO(r.date).toISODate()&&l.name==="Férié : "+r.comment)===-1&&a.events.push({name:"Férié : "+r.comment,start:U.DateTime.fromISO(r.date).toISODate(),end:U.DateTime.fromISO(r.date).toISODate(),color:t.b3BusinnessDays,timed:!1});return a})()}async function Z(e,t,n=!0){const s=e.events.findIndex(i=>i.uuid===t.uuid);return s===-1?e.events.push(t):n?e.events[s]=t:e.events.splice(s,1),e.length>0&&e.sort((i,c)=>i.start-c.start),e}function m(e,t){C.requirejs(["DS/WAFData/WAFData"],n=>{n.authenticatedRequest(e,t)})}function ee(e,t,n){C.requirejs(["DS/DataDragAndDrop/DataDragAndDrop"],s=>{s.draggable(e,{data:t,start:n})})}function te(e,t=void 0){C.requirejs(["DS/TagNavigatorProxy/TagNavigatorProxy"],n=>{let s;s===void 0&&(s=n.createProxy({widgetId:C.widget.id,filteringMode:"WithFilteringServices"}),t!==void 0&&s.addEvent("onFilterSubjectsChange",t)),s.setSubjectsTags(e)})}function ne(e,t){C.requirejs(["DS/DataDragAndDrop/DataDragAndDrop"],n=>{n.droppable(e,{drop:t})})}async function se(e,t=void 0,n=void 0){C.requirejs(["DS/i3DXCompassServices/i3DXCompassServices"],s=>{(!e||e==="")&&(e=C.widget.getValue("PlatFormInstanceId")),(!e||e==="")&&(e=void 0),t&&t(s.getPlatformServices({platformId:e,onComplete:t,onFailure:n}))})}function ae(){let e={};return C.requirejs(["DS/PlatformAPI/PlatformAPI"],t=>{const n=t.getTenant(),s=t.getUser(),i=t.getAllApplicationConfigurations(),c=t.getApplicationConfiguration("com.3ds.wp.passport.cors");e={tenant:n,user:s,appsConfiguration:i,appConf:c}}),console.log("%cRETOUR API :","color:blue",e),e}function ie(e,t,n){const s={base:`${e.space}`,uri:"/resources/AppsMngt/api/custom/applications",option:`?filter=${e.tenant}`},i=`${s.base}${s.uri}${s.option}`;m(i,{method:"GET",headers:{"Content-Type":"application/json",Accept:"application/json"},onComplete(c,o,a){const r=JSON.parse(c),d=r.data.map(l=>{const p=l.attributes.name,f=l.id;return{name:p,id:f}});t&&t(d,r)},onFailure(c,o){const a=c;a.msg=o.errormsg,a.errCode=o.errorcode,n&&n(a)}})}function oe(e,t=void 0,n=void 0){let s=`${e.space}/resources/AppsMngt/user?platform=${e.tenant}&limit=-1`;m(s,{onComplete(i,c,o){const a=JSON.parse(i);console.log("_AppMngt_get_users => ",a),t&&t(a)},onFailure(i,c){const o=i;o.msg=c.errormsg,o.errCode=c.errorcode,n&&n(o)}})}function re(e,t,n=void 0,s=void 0){let i=`${e.space}/resources/AppsMngt/user?platform=${e.tenant}&id=${t}`;m(i,{onComplete(c,o,a){const r=JSON.parse(c);n&&n(r)},onFailure(c,o){const a=c;a.msg=o.errormsg,a.errCode=o.errorcode,s&&s(a)}})}const I={"Content-Type":"application/json",Accept:"application/json,text/javascript,*/*"};function ce(e,t,n=void 0,s=void 0){const{space:i,currentUser:c}=e,a=`${i}${{URIUGr:"/3drdfpersist/resources/v1/usersgroup"}.URIUGr}`,r={groups:[{title:t.title,description:t.description,members:t.members||[c.email,"samuel.mureau@beam3.fr"],pending_members:[],sharing:t.sharing,visibility:t.visibility}]};m(a,{method:"POST",headers:I,data:JSON.stringify(r),onComplete(d){n&&n(JSON.parse(d))},onFailure(d,l){console.log(d);const p=d;p.msg=l.errormsg,p.errCode=l.errorcode,console.log("❌ sendDirectMessage => ",p),s&&s(p)}})}function de(e,t,n=void 0,s=void 0){const{space:i,tenant:c}=e,o=i,a=`/3drdfpersist/v1/resources/${t}`,r=`?$mask=dsaccess:Mask.GroupUI.Properties&tenant=dstenant:${c}`,d=`${o}${a}${r}`;m(d,{opts:{method:"GET",headers:{"Content-Type":"application/json",Accept:"application/json,text/javascript,*/*"}},onComplete(f){n&&n(JSON.parse(f))},onFailure(f,g){const _=f;_.msg=g.errormsg,_.errCode=g.errorcode,s&&s(_)}})}function M(e,t=void 0,n=void 0){const{space:s,tenant:i}=e,c=s,o="/3drdfpersist/resources/v1/option-sets/dsusergroup:ListOfGroupResponsibilities/options",a=`?tenant=dstenant:${i}`,r={method:"GET",Accept:"application/json,*/*,test/javascript"},d=`${c}${o}${a}`;m(d,{OPTsH:r,onComplete(l){t&&t(JSON.parse(l))},onFailure(l,p){const f=l;f.msg=p.errormsg,f.errCode=p.errorcode,n&&n(f)}})}function le(e,t=void 0,n=void 0){const{space:s,currentUser:i}=e,a=`${s}/3drdfpersist/resources/v1/usersgroup?select=uri,title,description,owner,members,pending_members,creation_date,modification_date,visibility`,d={method:"GET",headers:{"Content-Type":"application/json",Accept:"application/json,text/javascript,*/*"}};try{m(a,{opts:d,onComplete(l){const p=JSON.parse(l),f={},g=p.groups.filter(_=>_.uri.startsWith("uuid:"));if(i&&Object.keys(i).length>0){const _=g.filter(y=>y.owner===i.email),S=g.filter(y=>y.members.includes(i.email)),h=_.concat(S);f.iam=h,f.UG=g,f.iamMember=S,M(e,y=>{f.rules=y,t&&t(f)},y=>{n&&n(y)})}},onFailure(l){n&&n(l)}})}catch(l){console.log(l)}}function ue(e,t){const{space:n}=e,i=`${n}/3drdfpersist/resources/v1/usersgroup/${t}`;m(i,{method:"DELETE"})}function pe(e,t,n,s=void 0,i=void 0){const{space:c,tenant:o}=e,a={URITI:"/3drdfpersist/resources/v1/template-instances",URIUGr:"/3drdfpersist/resources/v1/usersgroup",nextURICh:"/characteristics",nextURIGr:"/group",nexURImem:"/members",OPTsTI:"?$mask=dsaccess:Mask.GroupUI.Properties",OPTsTenant:`tenant=dstenant:${o}`},r=n,d=`${c}${a.URIUGr}/${t}`,l=JSON.stringify(r);m(d,{headers:I,method:"PATCH",data:l,type:"json",onComplete(p){s&&s(p)},onFailure(p){i&&i(p)}})}function fe(e,t,n,s=void 0,i=void 0){const{space:c}=e,a=`${c}/3drdfpersist/resources/v1/usersgroup/${t}/sharing`;m(a,{method:"PATCH",headers:I,data:JSON.stringify(n),type:"json",onComplete(d){s&&s(d)},onFailure(d){i&&i(d)}})}function me(e,t,n=void 0,s=void 0){const{space:i}=e,o=`${i}/3drdfpersist/resources/v1/usersgroup/${t}/sharing`;m(o,{opts:{method:"GET",headers:{"Content-Type":"application/json",Accept:"application/json,text/javascript,*/*"}},onComplete(d){n&&n(JSON.parse(d))},onFailure(d){s&&s(d)}})}async function P(e,t=void 0,n=void 0,s=void 0){const i=e.space;if(t===void 0){console.log("Le paramètre docid est obligatoire");return}const c=i+`/resources/v1/modeler/documents/${t}`;m(c,{onComplete(o,a,r){const d=JSON.parse(o);n&&n(d)},onFailure(o){s&&s(o)}})}function F(e,t=void 0,n=void 0){if(e.objID&&e.objID!==""){let s=`${e.space}/resources/v1/modeler/documents/${e.objID}`;m(s,{onComplete(i,c,o){const a=JSON.parse(i);e.token=a?.csrf?.value,e.datas=a?.data[0],t&&t(e)},onFailure(i){n&&n(i)}})}else D(e)}function D(e,t=void 0,n=void 0){if(e.space){const s=e.space+"/resources/v1/application/CSRF";m(s,{onComplete(i,c,o){const a=JSON.parse(i);t&&t(a.csrf.value)},onFailure(i,c,o){n&&n({response:i,headers:c,xhr:o})}})}else n&&n("ERROR : url du 3DSpace non défini.")}function k(e,t,n=void 0,s=void 0){let i=e.space+`/resources/v1/modeler/documents/${t}/files/DownloadTicket`;F(e,c=>{m(i,{method:"PUT",headers:{ENO_CSRF_TOKEN:e.token},onComplete(o){let a=JSON.parse(o);if(a.success===!0)try{const r=a.data[0].dataelements.ticketURL;n&&n(r)}catch(r){s&&s(r)}},onFailure(o,a){console.log("☠️ error => ",o,a),s&&s(o,a)}})},s)}function ge(e,t,n,s=void 0,i=void 0){const c=`${e.space}/resources/v1/modeler/documents/${t}/files/DownloadTicket`;n||(n=e.token),m(c,{method:"PUT",headers:{ENO_CSRF_TOKEN:n},onComplete(o){let a=JSON.parse(o);if(a.success===!0)try{const r=a.data[0].dataelements.ticketURL;s&&s(r)}catch(r){i&&i(r)}},onFailure(o){i&&i(o)}})}function L(e,t,n,s,i,c=void 0,o=void 0){F(e,t,a=>{J(e,t,n,s,i,a.csrf.value,c,o)})}function J(e,t,n,s,i,c,o=void 0,a=void 0){const r=e.space+`/resources/v1/modeler/documents/${t}/files/CheckinTicket`;m(r,{method:"PUT",headers:{ENO_CSRF_TOKEN:c},onComplete(d,l,p){const f=JSON.parse(d).data[0].dataelements,g=new FormData;g.append("__fcs__jobTicket",f.ticket),g.append("file_0",s,i);const _={};_.method="POST",_.data=g,_.onComplete=function(S){let h="temp_"+Date.now(),y={method:"PUT",headers:{ENO_CSRF_TOKEN:c},data:JSON.stringify({data:[{id:t,relateddata:{files:[{id:n,dataelements:{title:i,receipt:S},updateAction:"REVISE"}]},tempId:h}]}),type:"json",onComplete(T){o&&o(T)},onFailure(T){a&&a(T)}};m(e.space+"/resources/v1/modeler/documents",y)},_.onFailure=function(S){a&&a(S)},_.timeout=0,m(f.ticketURL,_)}})}async function _e(e,t,n,s,i=void 0,c=void 0){const o=e.space,a=e.token,r=e.ctx,d=new FormData,l=new Blob([JSON.stringify(t)],{type:"text/plain"}),p={url_Ticket:`${o}/resources/v1/modeler/documents/files/CheckinTicket`,url_Post:`${o}/resources/v1/modeler/documents/?SecurityContext=ctx::${r}`};if(!o&&o!==""){console.log("le store._3DSpace est vide");return}m(p.url_Ticket,{method:"PUT",headers:{ENO_CSRF_TOKEN:a.value},onComplete(f,g,_){const S=JSON.parse(f).data[0].dataelements;d.append("__fcs__jobTicket",S.ticket),d.append("filename",l,n);const h={method:"POST",data:d,onComplete(O){if(r!==""&&a!==""){const $={method:"POST",headers:{ENO_CSRF_TOKEN:a,Accept:"application/json","Content-Type":"application/json"},data:JSON.stringify({data:[{type:"Document",dataelements:{title:`Title_${n.toLowerCase().split(" ").join("_")}`,policy:"Document Release",description:s},relateddata:{files:[{dataelements:{title:`${n}.json`,receipt:O}}]},tempId:A()}]}),type:"json",timeout:0,onComplete:y,onFailure:T};r!==""&&m(p.url_Post,$)}else console.warn("le store est vide")},onFailure:T};function y(O){console.log("Success -- response ",O.data[0]),i&&i(O)}function T(O,$){console.log("Erreur -- response ",O,`
2
+ headers `,$),c&&c(O)}m(S.ticketURL,h)}})}function N(e,t=void 0,n=void 0,s=void 0,i=void 0,c=void 0){const o=`${e.space}/resources/modeler/pno/person?current=true&select=preferredcredentials&select=collabspaces`;m(o,{method:"GET",onComplete(a){const r=JSON.parse(a);let d="",l,p,f;if(t){let g=r.collabspaces.find(_=>_.title===t);if(g){l=t;let _=g.couples;_=_.filter((S,h,y)=>h===y.findIndex(T=>T.organization.pid===S.organization.pid&&T.role.pid===S.role.pid)),n&&(Array.isArray(n)?n.forEach(S=>{f||_.forEach(h=>{if(S===h.role.name&&s===h.organization.title)f=S,p=s;else if(S===h.role.name){let y=_.filter(T=>T.role.name===S);y.length===1?(f=y[0].role.name,p=y[0].organization.title):c(y)}})}):_.forEach(S=>{if(n===S.role.name&&s===S.organization.title)f=n,p=s;else if(n===S.role.name){let h=_.filter(y=>y.role.name===n);h.length===1?(f=h[0].role.name,p=h[0].organization.title):c(h)}}))}}l&&p&&f?(d=f+"."+p+"."+l,i(d)):r.preferredcredentials?(d=r.preferredcredentials.role.name+"."+r.preferredcredentials.organization.title+"."+r.preferredcredentials.collabspace.title,i(d)):c&&(d=f+"."+p+"."+l,c(d))},onFailure(a){console.log("Erreur de récupération du contexte de sécurité. => ",a)}})}async function j(e,t=void 0,n=void 0,s=void 0){const i=e.objID;(i===void 0||i==="")&&console.warn("_3DSpace_download_doc() / Le paramètre objectId est obligatoire"),(e.space===""||!e.space)&&console.warn("_3DSpace_download_doc() / Le paramètre space est obligatoire");try{console.log("_3DSpace_download_doc / credentials",e),k(e,i,c=>{m(c,{headers:{ENO_CSRF_TOKEN:e.token},onComplete(o){const a=JSON.parse(o);t&&t(a)},onFailure(o,a,r){n&&(console.log("error http",o),n({error:o,headers:a,xhr:r}))}})},c=>{n&&n(c),console.log("*_3dspace_download_doc / error file URL *",c)})}catch(c){console.log("*_3dspace_download_doc / error file URL *",c)}}async function E(e,t,n=void 0,s=void 0){let i=[];for(let a=0;a<t.length;a+=80){const r=t.slice(a,a+80);i.push(r)}const o=a=>{G(e,i[a],()=>{a++,a<i.length&&o(a)},r=>{n&&n(r)})};o(0)}function G(e,t,n=void 0,s=void 0,i=void 0){const c=[];t.forEach(r=>{c.push({id:r})});let o=JSON.stringify({csrf:{name:"ENO_CSRF_TOKEN",value:e.token},data:c});const a=`${e.space}/resources/v1/modeler/documents/DownloadTicket?tenant=${e.tenant}&e6w-lang=fr&e6w-timezone=-120`;m(a,{method:"PUT",data:o,type:"json",onComplete(r){const d=r.data;r.success===!0&&(n&&n(),d.forEach(l=>{try{const p=l.dataelements.fileName,f=l.dataelements.ticketURL;m(f,{onComplete:g=>{s&&s({objectId:l.id,fileName:p,data:JSON.parse(g)})},onFailure:g=>{console.log("error http",g)}})}catch(p){console.log(p),i&&i(p)}}))},onFailure(r){console.log(r),i&&i(r)}})}function Se(e,t,n=void 0,s=void 0){return new Promise(i=>{if(e.token===""&&D(e),t!==void 0&&t!==""&&t!==null){const c=`${e.space}/resources/v1/modeler/dslc/maturity/getNextStates`;N(e.space,"ESPACE COMMUN",["VPLMProjectLeader","VPLMCreator"],void 0,a=>e.ctx=a,a=>{console.log("onError =>",a)});let o={method:"POST",headers:{SecurityContext:"ctx::"+e.ctx,ENO_CSRF_TOKEN:e.token,Accept:"application/json","Content-Type":"application/json"},data:JSON.stringify({data:[{id:t}]}),type:"json",onComplete(a){n&&n(a)},onFailure(a){s&&s(a)}};m(c,o)}})}function he(e,t,n,s=void 0,i=void 0){return new Promise(c=>{if(e.token===""&&D(e),t!==void 0&&t!==""&&t!==null){const o=`${e.space}/resources/v1/modeler/dslc/maturity/changeState`;N(e.space,"ESPACE COMMUN",["VPLMProjectLeader","VPLMCreator"],void 0,r=>e.ctx=r,r=>{console.log("onError =>",r)});let a={method:"POST",headers:{SecurityContext:"ctx::"+e.ctx,ENO_CSRF_TOKEN:e.token,Accept:"application/json","Content-Type":"application/json"},data:JSON.stringify({data:[{id:t,nextState:n}]}),type:"json",onComplete(r){s&&s(r)},onFailure(r){i&&i(r)}};m(o,a)}})}function ye(e,t,n=void 0,s=void 0){return new Promise(i=>{if(e.token===""&&D(e),t!==void 0&&t!==""&&t!==null){const c=`${e.space}/resources/v1/dslc/versiongraph?withThumbnail=0&withIsLastVersion=0&withAttributes=0&withCopyFrom=0&tenant=${e.tenant}`;N(e.space,"ESPACE COMMUN",["VPLMProjectLeader","VPLMCreator"],void 0,a=>e.ctx=a,a=>{console.log("onError =>",a)});let o={method:"POST",headers:{securitycontext:"ctx::"+e.ctx,ENO_CSRF_TOKEN:e.token,Accept:"application/json","Content-Type":"application/json"},data:JSON.stringify({graphRequests:[{id:t}]}),type:"json",onComplete(a){n&&n(a)},onFailure(a){s&&s(a)}};m(c,o)}})}function we(e,t,n=void 0,s=void 0){return new Promise(i=>{if(e.token===""&&D(e),t!==void 0&&t!==""&&t!==null){const c=`${e.space}/resources/lifecycle/revise/prepare_revise_maskattributes?tenant=${e.tenant}`;N(e.space,"ESPACE COMMUN",["VPLMProjectLeader","VPLMCreator"],void 0,a=>e.ctx=a,a=>{console.log("onError =>",a)});let o={method:"POST",headers:{SecurityContext:"ctx::"+e.ctx,ENO_CSRF_TOKEN:e.token,Accept:"application/json","Content-Type":"application/json"},data:JSON.stringify({data:[{"attribute[PLMReference.V_versionComment]":null,physicalid:t,type:"Document",tenant:e.tenant,objectId:t,policy:"Document Release",availableSemantic:["E","LAST","NEW","DUP"]}]}),type:"json",onComplete(a){n&&n(a)},onFailure(a){s&&s(a)}};m(c,o)}})}function Te(e,t,n,s=void 0,i=void 0){return new Promise(c=>{if(e.token===""&&D(e),t!==void 0&&t!==""&&t!==null){const o=`${e.space}/resources/lifecycle/revise/major?tenant=${e.tenant}`;N(e.space,"ESPACE COMMUN",["VPLMProjectLeader","VPLMCreator"],void 0,r=>e.ctx=r,r=>{console.log("onError =>",r)});let a={method:"POST",headers:{securitycontext:"ctx::"+e.ctx,ENO_CSRF_TOKEN:e.token,Accept:"application/json","Content-Type":"application/json"},data:JSON.stringify({data:[{physicalid:t,proposedRevision:n,modifiedAttributes:{revision:n}}],folderid:null,notificationTimeout:600}),type:"json",onComplete(r){s&&s(r)},onFailure(r){i&&i(r)}};m(o,a)}})}//!SECTION
3
3
  async function Ce(e,t,n){const s=`${e.space}/resources/v1/application/CSRF`;m(s,{onComplete(i){i=JSON.parse(i),t&&t(i.csrf)},onFailure(i,c,o){n&&n({error:i,headers:c,xhr:o})}})}function De(e,t=void 0,n=void 0){const s={base:`${e.space}`,uri:"/resources/bps/cspaces",optTenant:`tenant=${e.tenant}`},i=`${s.base}${s.uri}?${s.optTenant}`;m(i,{method:"GET",headers:{Accept:"application/json,text/javascript,*/*","Content-Type":"application/ds-json"},onComplete(c,o){const a=JSON.parse(c);t&&t(a,o)},onFailure(c,o,a){n&&n({response:c,headers:o,xhr:a})}})}function Oe(e,t,n,s){k(e.space,t,i=>{m(i,{header:{ENO_CSRF_TOKEN:e.token},onComplete:c=>{n&&n(c)},onFailure:c=>{console.log("error http",c),s&&s(c)}})},i=>{console.log("error file URL",i),s&&s(i)})}async function Ne(e,t,n=void 0,s=void 0){return new Promise(i=>{k(e.space,t,c=>{m(c,{onComplete:(o,a,r)=>(i(JSON.parse(o)),n&&n(JSON.parse(o),a,r),i),onFailure:(o,a,r)=>{s&&s(o,a,r),console.log(o,a?.errormsg)}})})})}function be(e,t,n,s=void 0,i=void 0){const c=new Blob([JSON.stringify(t)],{type:"text/plain"});F(e,n,o=>{const a=o.data[0].relateddata.files[0].id,r=o.data[0].dataelements.secondaryTitle!==""?o.data[0].dataelements.secondaryTitle:o.data[0].dataelements.title;L(e,n,a,c,r,d=>{s&&s(d)},d=>{i&&i(d)})})}let x,K;const W=[];async function Fe(e,t=void 0,n=void 0){e.objID&&e.objID!==""?F(e,s=>{t&&t(s)},s=>{n&&n(s)}):e.objID===null&&D(e,s=>{t&&t({rep:s,msg:"Pas d'objID, ou invalide"})},s=>{n&&n({msg:"Pas d'objID et erreur sur le Space",err:s})})}async function Ue(e,t=void 0,n=void 0){console.log("getDatasByTenant",e),await j(e,s=>{const i={};i.obj=s,X(e,c=>{i.datas=c,t&&t(i)},c=>{n&&n(c)})},s=>{n&&n(s)})}function X(e,t=void 0,n=void 0){const s=[];e.objIds.forEach((i,c)=>{j(e,i.objId,o=>{s.push({[i.name]:o}),i.name==="dbProjets"&&(x=o.affaires.map(a=>a.objectID),V(e,K)),c===e.objIds.length-1&&t&&t(s)},o=>{n&&n(o)})})}function V(e,t,n=void 0,s=void 0){E(e,x,i=>{const c=[...t];c.find(o=>o.objectID===i.objectId).data=i.data,K=c,W.push(i.data),n&&n(W)},i=>{s&&(s(i),console.log(i))})}const ke="FA35FB9B177A280065800EA0000F599C",Ae=["swym","3dspace","drive","usersgroup","3dplan","dashboard"],Y={how:"ds6w:how",what:"ds6w:what",when:"ds6w:when",where:"ds6w:where",who:"ds6w:who",why:"ds6w:why"},Ie={objId:ke,pred:"who",order_by:"desc",tag:"testTag"};function je(e,t,n=void 0,s=void 0){const{space:i,tenant:c}=e,{objId:o,pred:a,tag:r}=t,d={uri:"/resources/6w/tags",otpCTX:"SecurityContext=preferred",optTenant:`tenant=${c}`},l=`${i}${d.uri}?${d.otpCTX}&${d.optTenant}`,p={tag:[{subject:[{uri:`pid://${o}`}],predicate:Y[a],object:{literal:r}}]};m(l,{method:"PUT",headers:{"Content-Type":"application/json",Accept:"application/json"},data:JSON.stringify(p),onComplete(f){JSON.parse(f);const g={};setTimeout(()=>{P(e,o,_=>{const S=_.data[0].dataelements.title,h=_.data[0].dataelements.fileExtension!==void 0?_.data[0].dataelements.fileExtension:"",y=_.data[0].relateddata.ownerInfo[0].dataelements.name;g.name=S,g.ext=h,g.createBy=y,t.info={...g},Re(e,t,T=>{n&&n(T)},T=>{s&&s(T)})},(_,S)=>{const h=_;h.msg=S.errormsg,h.errCode=S.errorcode,console.log("❌ sendDirectMessage => ",h),s&&s(h)})},2e3)},onFailure(f,g){const _=f;_.msg=g.errormsg,_.errCode=g.errorcode,console.log("❌ sendDirectMessage => ",_),s&&s(_)}})}function Re(e,t,n=void 0,s=void 0){console.log("obj ",t);const i=t.info.name,c={baseUrl:`https://${e.tenant.toLowerCase()}-eu1-fedsearch.3dexperience.3ds.com`,uri:"/federated/search"},o=`${c.baseUrl}${c.uri}`,a={"Content-Type":"application/json",Accept:"application/json,text/javascript,*/*"},r=A(),d={with_indexing_date:!0,with_synthesis:!0,with_nls:!1,label:`3DSearch-${e.currentUser.username}-AjoutDeTagBeam-${r}`,locale:"fr",select_predicate:["ds6w:label","ds6w:type","ds6w:description","ds6w:identifier","ds6w:modified","ds6w:created","ds6wg:revision","ds6w:status","ds6w:responsible","owner","ds6w:responsibleUid","ds6wg:filesize","ds6w:project","ds6w:dataSource","ds6w:community","ds6w:originator","dsgeo:referential","ds6w:lastModifiedBy","ds6w:repository","dcterms:title","dcterms:description","ds6w:containerUid"],with_synthesis_hierarchical:!0,select_file:["icon","thumbnail_2d"],query:i,specific_source_parameter:{"3dspace":{additional_query:' AND NOT (owner:"ENOVIA_CLOUD" OR owner:"Service Creator" OR owner:"Corporate" OR owner:"User Agent" OR owner:"SLMInstallerAdmin" OR owner:"Creator" OR owner:"VPLMAdminUser") AND (ds6w_58_islastrevisionperstate:true OR NOT listoffields:ds6w_58_islastrevisionperstate)'},drive:{additional_query:' AND NOT ([flattenedtaxonomies]:"types/DriveNode" AND ( [current]:"Trashed" OR [policy]:"Drive File Iteration") )'}},select_exclude_synthesis:["ds6w:what/ds6w:topic"],order_by:Ie.order_by,order_field:"relevance",select_snippets:["ds6w:snippet","ds6w:label:snippet","ds6w:responsible:snippet","ds6w:community:snippet","swym:message_text:snippet"],nresults:40,start:"0",source:Ae,tenant:e.tenant,login:{"3dspace":{SecurityContext:e.ctx}}};console.log("dataPattern => ",d),m(o,{method:"POST",headers:a,data:JSON.stringify(d),onComplete(l){const p=JSON.parse(l);n(p)},onFailure(l,p){const f=l;f.msg=p.errormsg,f.errCode=p.errorcode,console.log("❌ sendDirectMessage => ",f),s&&s(f),console.log("Erreur de recuperation d'id du doc et des tags",l)}})}function $e(e,t,n=void 0,s=void 0){const{objId:i,pred:c,tag:o}=t,a={uri:"/resources/6w/tags",otpCTX:"SecurityContext=preferred",optTenant:`tenant=${e.tenant}`},r=`${e.space}${a.uri}?${a.otpCTX}&${a.optTenant}`,d={tag:[{subject:[{uri:`pid://${i}`}],predicate:Y[c],object:{literal:o}}]};m(r,{method:"DELETE",data:JSON.stringify(d),headers:{"Content-Type":"application/json",Accept:"application/json,text/javascript,*/*"},onComplete(l){n&&n(l)},onFailure(l,p){const f=l;f.msg=p.errormsg,f.errCode=p.errorcode,console.log("❌ sendDirectMessage => ",f),s&&s(f)}})}function ve(e,t="",n=void 0,s=void 0){const{space:i}=e;if(t==="")return;const c={uri:"/enovia/resources/v1/modeler/documents"},o={"Content-Type":"application/x-www-form-urlencoded; charset=UTF-8",Accept:"application/json,text/javascript,*/*"},a=`${i}${c.uri}`,r=`$include=none,lockerInfo,ownerInfo,originatorInfo,files,ownerInfo,originatorInfo&$fields=none,title,name,typeNLS,collabSpaceTitle,revision,isLatestRevision,files,lockStatus,lockerInfo.name,lockerInfo.firstname,lockerInfo.lastname,owner,ownerInfo.name,ownerInfo.firstname,ownerInfo.lastname,stateNLS,modified,policy,state,organizationTitle,originator,originatorInfo.name,originatorInfo.firstname,originatorInfo.lastname,hasModifyAccess,fileExtension,files.name,files.title,files.revision,files.locker,ownerInfo,ownerInfo.name,ownerInfo.firstname,ownerInfo.lastname,originatorInfo,originatorInfo.name,originatorInfo.firstname,originatorInfo.lastname&$ids=${t}`;m(a,{method:"POST",headers:o,data:r,onComplete(d){n&&n(JSON.parse(d))},onFailure(d,l){const p=d;p.msg=l.error,s&&s(p)}})}async function w(e,t=void 0,n=void 0){const s=e.space+"/api/index/tk";return m(s,{onComplete(i,c,o){const a=JSON.parse(i);if(t)return t(a),e.token=a?.result?.ServerToken},onFailure(i){n&&n(i)}})}function Me(e,t=void 0,n=void 0){const s=`${e.space}/api/exalead/whatsnew`,i={params:{community_id:null,hash_key:null,legacyFormat:!1,nresults:1,query:"#all",start:0}};w(e,c=>{m(s,{method:"POST",headers:{"X-DS-SWYM-CSRFTOKEN":c.result.ServerToken,"Content-type":"application/json;charset=UTF-8",Accept:"application/json"},data:JSON.stringify(i),type:"json",onComplete(o,a){t&&t(o,a)},onFailure(o,a){n&&n(o,a)}})})}function Pe(e,t=void 0,n=void 0){const s=`${e.space}/api/Recommendation/getpeoplefamiliartocurrentuser`,i={params:{idsToFilterArr:[],mode:"offline",limit:30,itemType:"User",maxNbOfCommonElements:"5"}};w(e,c=>{m(s,{method:"POST",headers:{"X-DS-SWYM-CSRFTOKEN":c.result.ServerToken,"Content-type":"application/json;charset=UTF-8",Accept:"application/json"},data:JSON.stringify(i),type:"json",onComplete(o,a){const r=o.result.hits.map(d=>({login:d.login,fullName:d.name}));t&&t(r,o)},onFailure(o,a){n&&n(o,a)}})})}function Le(e,t=void 0,n=void 0){const s={base:e.space,uri:"/api/community/listmycommunities",limit:`/limit/${e.limit?e.limit:128}`,page:`/page/${e.page?e.page:"1"}`},i=`${s.base}${s.uri}${s.limit}${s.page}`,c=[];w(e,o=>{m(i,{method:"GET",headers:{"X-DS-SWYM-CSRFTOKEN":o.result.ServerToken},onComplete(a,r,d){const p=JSON.parse(a).result;let f=0;p.forEach(g=>{const _={description:g.description,id:g.id,title:g.title,owner:g.owner,role:g.role,access:g.access};B(e,g.id,S=>{f++,_.members=S,c.push(_),f===p.length&&t&&t(c)},S=>n(S))})},onFailure(a,r){const d=a;d.status=r.status,d.response=r.errormsg,n&&n(d)}})})}function B(e,t,n,s){const i=`${e.space}/api/community/listmembers`,c={params:{page:e.page?e.page:1,limit:e.limit?e.limit:50,community_id:t}};w(e,o=>{m(i,{method:"POST",headers:{"Content-type":"application/json;charset=UTF-8",Accept:"application/json","X-DS-SWYM-CSRFTOKEN":o.result.ServerToken},data:JSON.stringify(c),type:"json",onComplete(a,r,d){n&&n(a)},onFailure(a,r){const d=a;d.status=r.status,d.response=r.errormsg,s&&s(d)}})})}function Je(e,t=void 0,n=void 0){const s="YXdA5x4DSUKtlAi2wmnyTA";e.commu_id||(e.commu_id=s);const i=`${e.space}/api/v2/communities/${e.commu_id}/ideas/statuses`;w(e,c=>{m(i,{method:"GET",headers:{"Content-type":"application/json;charset=UTF-8",Accept:"application/json","X-DS-SWYM-CSRFTOKEN":c.result.ServerToken},onComplete(o){const a=JSON.parse(o);t&&t(a)},onFailure(o,a){const r=o;r.status=a.status,r.response=a.errormsg,n&&n(r)}})})}function Ee(e,t,n=void 0,s=void 0){const{listAllContacts:i,currentUser:c}=e;console.log("__listAllContacts",i.hits);const o=`${e.space}/api/directmessages`,a={users:[c.login].concat(t.receipt)},r={id_msg:"",senderId:e.currentUser.login,senderName:`${e.currentUser.first_name} ${e.currentUser.last_name}`,msg:Ge(t.msg)};let d=!1;q(a.users,l=>{l!==void 0&&(r.id_msg=l.id,d=!0,R(e,r))},l=>{d=!1,console.log("_3dSwym_findCommunityToInstantMSG callback",l),s&&s(l),r.id_msg=""}),d===!1&&setTimeout(()=>{d===!1&&w(e,l=>{m(o,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json","X-DS-SWYM-CSRFTOKEN":l.result.ServerToken},data:JSON.stringify(a),type:"json",onComplete(p,f,g){const _=p;_.reponse=JSON.parse(g.response),_.status=g.status,n&&n(_),r.id_msg=_.result.id,R(e,r)},onFailure(p,f,g){const _=p;_.msg=f.errormsg,_.status=f.status,s&&s(_)}})})},500)}function q(e,t,n,s){const i=`${e.space}/api/directmessages/lite?with_favorites=false`;w(e,c=>{m(i,{method:"GET",headers:{Accept:"application/json,text/javascript,*/*","X-DS-SWYM-CSRFTOKEN":c.result.ServerToken},onComplete(o){const a=JSON.parse(o),r=[];a.result.forEach(p=>{p.users=p.users.sort((f,g)=>f.login.localeCompare(g.login)),p.users.length===t.length&&r.push(p)});const d=t.sort(),l=r.find(p=>{const f=[];return p.users.forEach(g=>{f.push(g.login)}),JSON.stringify(f)===JSON.stringify(d)});n&&l!==void 0?n(l):(s||l===void 0)&&s(l)},onFailure(o){const a=o;a.msg=headers.errormsg,a.errCode=headers.errorcode,console.log("❌ sendDirectMessageLite => ",a),s&&s(a)}})})}function R(e,t,n=void 0,s=void 0){const i={base:e.space,uri:"/api/community",id_msg:`${t.id_msg}`,endUri:"/instantmessages"},c=`${i.base}${i.uri}/${i.id_msg}${i.endUri}`,o={author:{login:t.senderId,displayName:t.senderName},accessState:null,commentUri:null,comments:null,endorsements:null,moderationState:null,parentCommentUri:null,richMessage:t.msg};console.log("_3dSwym_sendDirectMessageData url ",c),w(e,a=>{m(c,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json","X-DS-SWYM-CSRFTOKEN":a.result.ServerToken},data:JSON.stringify(o),type:"json",onComplete(r,d,l){const p=r;p.status=l.status,p.response=JSON.parse(l.response),console.log("✅ _3dSwym_sendDirectMessageData => ",p),n&&n(p)},onFailure(r,d){const l=r;l.msg=d.errormsg,l.errCode=d.errorcode,console.log("❌ sendDirectMessage => ",l),s&&s(l)}})})}function Ge(e){const t=new Date().toLocaleDateString(),n=new Date().toLocaleTimeString();return`<p>${e} </p>
4
4
  <br/>
5
5
  <hr/>
@@ -76,4 +76,4 @@ async function Ce(e,t,n){const s=`${e.space}/resources/v1/application/CSRF`;m(s,
76
76
  </tbody></table>
77
77
  <p>
78
78
  </p>`:e}function Be(e,t=void 0,n=void 0){const s=e.space+"/api/user/getcurrent/";w(e,i=>{m(s,{method:"GET",headers:{"X-DS-SWYM-CSRFTOKEN":i.result.ServerToken},onComplete(c,o,a){const r=JSON.parse(c);t&&t(r.result)},onFailure(c,o,a){n&&n({response:c,headers:o,xhr:a})}})},n)}function qe(e,t,n=void 0,s=void 0){const i=e.space+"/api/user/find/login/"+t;w(e,c=>{m(i,{method:"GET",headers:{"X-DS-SWYM-CSRFTOKEN":c.result.ServerToken},onComplete(o,a,r){const d=JSON.parse(o);n&&n(d)},onFailure(o){s&&s(o)}})},s)}function He(e){const t="Hello "+e;return console.log(t),t}u.UUID=A,u._3DSpace_Create_Doc=_e,u._3DSpace_csrf=D,u._3DSpace_download_doc=j,u._3DSpace_download_multidoc=E,u._3DSpace_file_update=L,u._3DSpace_file_update_csr=J,u._3DSpace_file_url=k,u._3DSpace_file_url_csr=ge,u._3DSpace_get_csrf=F,u._3DSpace_get_docInfo=P,u._3DSpace_get_downloadTicket_multidoc=G,u._3DSpace_get_securityContexts=N,u._3DSpace_lifecycle_changeRevision=Te,u._3DSpace_lifecycle_changeState=he,u._3DSpace_lifecycle_getGraph=ye,u._3DSpace_lifecycle_getNextRevision=we,u._3DSpace_lifecycle_getNextStates=Se,u._3DSwim_getAllCommunities=Le,u._3DSwim_getMembersCommunity=B,u._3DSwym_buildDirectMessage=Ee,u._3DSwym_deleteIdea=We,u._3DSwym_findCommunityToInstantMSG=q,u._3DSwym_getAllNews=Me,u._3DSwym_getFamiliarPeople=Pe,u._3DSwym_getIdeaStatusMaturity=Je,u._3DSwym_getSWYMIdea=Xe,u._3DSwym_get_AllSWYMIdeas=Ve,u._3DSwym_get_currentUser=Be,u._3DSwym_get_findUser=qe,u._3DSwym_get_version=w,u._3DSwym_postIdea=Ke,u._3DSwym_sendMessageData=R,u._AppMngt_get_info_user=re,u._AppMngt_get_users=oe,u._getPlateformInfos=ae,u._getPlatformServices=se,u._httpCallAuthenticated=m,u._setDraggable=ee,u._setDroppable=ne,u._setupTagger=te,u.addTagToDoc=je,u.compass_getListAdditionalApps=ie,u.couleurs=v,u.createUserGroups=ce,u.dataMixing=V,u.deleteUserGroups=ue,u.findAdresse=z,u.getAllContextSecurity=De,u.getCSRFToken=Ce,u.getCommunes=H,u.getComplementUG=de,u.getDataFrom3DSpace=Oe,u.getDataFromGouvFr=Q,u.getDatasByTenant=Ue,u.getDatasFrom3DSpace=X,u.getDownloadDocument=Ne,u.getInfoDocTags=ve,u.getUserGroupsList=le,u.getUsersGroupRules=M,u.get_3DSpace_csrf=Fe,u.patchUserGroups=pe,u.patchUserGroupsControl=fe,u.pushDataIn3DSpace=be,u.readUserGroupControl=me,u.removeTagToDoc=$e,u.sayHello=He,u.updateEvent=Z,Object.defineProperty(u,Symbol.toStringTag,{value:"Module"})});
79
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2IzQXBpLnVtZC5janMiLCJzb3VyY2VzIjpbIi4uL3NyYy9saWIvYXBpL2luZGV4LmpzIiwiLi4vc3JjL2xpYi9nb3V2L2NvbG9ycy5qcyIsIi4uL3NyYy9saWIvZ291di9nb3V2X2FwaS5qcyIsIi4uL3NyYy9saWIvdXRpbHMvdXBkYXRlRXZlbnQuanMiLCIuLi9zcmMvbGliL3BsYXRlZm9ybS9tYWluLzNkZXhwZXJpZW5jZV9hcGkuanMiLCIuLi9zcmMvbGliL3BsYXRlZm9ybS9Db21wYXNzL2luZGV4LmpzIiwiLi4vc3JjL2xpYi9wbGF0ZWZvcm0vbWFpbi8zZGNvbXBhc3NfYXBpLmpzIiwiLi4vc3JjL2xpYi9wbGF0ZWZvcm0vVXNlcnNncm91cC9pbmRleC5qcyIsIi4uL3NyYy9saWIvcGxhdGVmb3JtL21haW4vM2RzcGFjZV9hcGkuanMiLCIuLi9zcmMvbGliL3BsYXRlZm9ybS9tYWluL2dldENTUkZUb2tlbi5qcyIsIi4uL3NyYy9saWIvcGxhdGVmb3JtL21haW4vZ2V0Q1RYLmpzIiwiLi4vc3JjL2xpYi9wbGF0ZWZvcm0vbWFpbi9nZXREYXRhRnJvbTNEU3BhY2UuanMiLCIuLi9zcmMvbGliL3BsYXRlZm9ybS9tYWluL2dldERvd25sb2FkRG9jdW1lbnQuanMiLCIuLi9zcmMvbGliL3BsYXRlZm9ybS9tYWluL3B1c2hEYXRhSW4zRFNwYWNlLmpzIiwiLi4vc3JjL2xpYi9wbGF0ZWZvcm0vbWFpbi9sb2FkRGF0YXMuanMiLCIuLi9zcmMvbGliL3BsYXRlZm9ybS9UYWcvaW5kZXguanMiLCIuLi9zcmMvbGliL3BsYXRlZm9ybS9Td3ltLzNkc3d5bV9hcGkuanMiLCIuLi9zcmMvbGliL3BsYXRlZm9ybS9Td3ltL2NvbW11bmF1dGUvaW5kZXguanMiLCIuLi9zcmMvbGliL3BsYXRlZm9ybS9Td3ltL2lkZWEvaW5kZXguanMiLCIuLi9zcmMvbGliL3BsYXRlZm9ybS9Td3ltL3VzZXIvaW5kZXguanMiLCIuLi9zcmMvbGliL2FkZC9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB2NCBhcyB1dWlkIH0gZnJvbSBcInV1aWRcIjtcclxuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBMYSBmb25jdGlvbiBVVUlEIGfDqW7DqHJlIHVuIFVVSUQgKFVuaXZlcnNhbGx5IFVuaXF1ZSBJZGVudGlmaWVyKSBhbMOpYXRvaXJlLlxyXG4gKiBAcmV0dXJucyBMYSBmb25jdGlvbiBVVUlEIHJlbnZvaWUgdW4gVVVJRCAoVW5pdmVyc2FsbHkgVW5pcXVlIElkZW50aWZpZXIpIGfDqW7DqXLDqSBhbMOpYXRvaXJlbWVudCDDoCBsJ2FpZGUgZGUgbGEgZm9uY3Rpb24gdXVpZC5cclxuICpcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBVVUlEKCkge1xyXG4gIHJldHVybiB1dWlkKCk7XHJcbn1cclxuIiwiLy8gcG91ciBsZXMgY2hhcnRzIFBpdmV0ZWF1XHJcbmV4cG9ydCBjb25zdCBjb3VsZXVycyA9IHtcclxuICBiM00zWWVsbG93OiBcIiNGRkIzMDBcIixcclxuICBiM0Fib3V0YWdlQmx1ZTogXCIjNDJBNUY1XCIsXHJcbiAgYjNVc2luYWdlR3JlZW46IFwiIzY4OUYzOFwiLFxyXG4gIGIzUGFubmVhdU9yYW5nZTogXCIjZmY4MDAwXCIsXHJcbiAgYjNNMzUwcGVyY2VudDogXCIjZmFmYTZlXCIsXHJcbiAgYjNNMzgwcGVyY2VudDogXCIjYWFlNDc5XCIsXHJcbiAgYjNNMzkwcGVyY2VudDogXCIjNjRjOTg3XCIsXHJcbiAgYjNNMzEwMHBlcmNlbnQ6IFwiIzIzYWE4ZlwiLFxyXG4gIGIzTTMxMDVwZXJjZW50OiBcIiMwMDg5OGFcIixcclxuICBiM00zMTEwcGVyY2VudDogXCIjMTc2ODc3XCIsXHJcbiAgYjNNMzEyMHBlcmNlbnQ6IFwiIzJhNDg1OFwiLFxyXG4gIGIzQWJvdXRhZ2U1MHBlcmNlbnQ6IFwiI2ZhZmE2ZVwiLFxyXG4gIGIzQWJvdXRhZ2U4MHBlcmNlbnQ6IFwiI2FhZTQ3OVwiLFxyXG4gIGIzQWJvdXRhZ2U5MHBlcmNlbnQ6IFwiIzY0Yzk4N1wiLFxyXG4gIGIzQWJvdXRhZ2UxMDBwZXJjZW50OiBcIiMyM2FhOGZcIixcclxuICBiM0Fib3V0YWdlMTA1cGVyY2VudDogXCIjMDA4OThhXCIsXHJcbiAgYjNBYm91dGFnZTExMHBlcmNlbnQ6IFwiIzE3Njg3N1wiLFxyXG4gIGIzQWJvdXRhZ2UxMjBwZXJjZW50OiBcIiMyYTQ4NThcIixcclxuICBiM1dhcm5pbmc6IFwiI0ZGMDAwMFwiLFxyXG4gIGIzRWRpdDE6IFwiI0FEMTQ1N1wiLFxyXG4gIGIzRWRpdDI6IFwiI0Y0NTExRVwiLFxyXG4gIGIzRWRpdDM6IFwiIzAwOTY4OFwiLFxyXG4gIGIzRWRpdDQ6IFwiI0Q1MDAwMFwiLFxyXG4gIGIzRWRpdDU6IFwiIzAzOUJFNVwiLFxyXG4gIGIzRWRpdDY6IFwiIzlFNjlBRlwiLFxyXG4gIGIzRWRpdDc6IFwiI0E3OUI4RVwiLFxyXG4gIGIzRWRpdDg6IFwiIzYxNjE2MVwiLFxyXG4gIGIzRWRpdDk6IFwiIzc5NTU0OFwiLFxyXG59O1xyXG4iLCJpbXBvcnQgeyBEYXRlVGltZSB9IGZyb20gXCJsdXhvblwiO1xyXG5pbXBvcnQgeyBjb3VsZXVycyB9IGZyb20gXCIuL2NvbG9yc1wiO1xyXG4vKipcclxuICogQ2V0dGUgZm9uY3Rpb24gcsOpY3Vww6hyZSB1bmUgbGlzdGUgZGUgY29tbXVuZXMgZW4gZm9uY3Rpb24gZCd1biBjb2RlIHBvc3RhbCBkb25uw6kgw6AgbCdhaWRlIGQndW5lIEFQSVxyXG4gKiBkJ0lHTiBGcmFuY2UuXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjcCAtIExlIHBhcmFtw6h0cmUgYGNwYCBlc3QgdW5lIGNoYcOubmUgcmVwcsOpc2VudGFudCB1biBjb2RlIHBvc3RhbCBmcmFuw6dhaXMuIElsIGVzdCBjb252ZXJ0aVxyXG4gKiBlbiBlbnRpZXIgw6AgbCdhaWRlIGRlIGBwYXJzZUludCgpYCBhdmFudCBkJ8OqdHJlIHV0aWxpc8OpIGRhbnMgbGEgcmVxdcOqdGUgQVBJLlxyXG4gKiBAcGFyYW0geyBGdW5jdGlvbiB9IC0gb25Eb25lIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGV4w6ljdXTDqWUgbG9yc3F1ZSBsJ2FwcGVsIEFQSSByw6l1c3NpdCBldFxyXG4gKiByZW52b2llIHVuZSByw6lwb25zZS4gSWwgcHJlbmQgbGVzIGRvbm7DqWVzIGRlIHLDqXBvbnNlIGNvbW1lIGFyZ3VtZW50IGV0IHBldXQgw6p0cmUgdXRpbGlzw6kgcG91ciBnw6lyZXJcclxuICogbGVzIGRvbm7DqWVzIGRhbnMgbGEgZm9uY3Rpb24gYXBwZWxhbnRlLlxyXG4gKiBAcGFyYW0geyBGdW5jdGlvbiB9IC0gTGUgcGFyYW3DqHRyZSBgb25FcnJvcmAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgZXjDqWN1dMOpZSBzJ2lsIHkgYSB1bmVcclxuICogZXJyZXVyIGxvcnMgZGUgbGEgcmVxdcOqdGUgZGUgcsOpY3Vww6lyYXRpb24uIElsIHBlcm1ldCB1bmUgZ2VzdGlvbiBwZXJzb25uYWxpc8OpZSBkZXMgZXJyZXVycyBldCBwZXV0XHJcbiAqIMOqdHJlIHV0aWxpc8OpIHBvdXIgYWZmaWNoZXIgZGVzIG1lc3NhZ2VzIGQnZXJyZXVyIG91IGVmZmVjdHVlciBkJ2F1dHJlcyBhY3Rpb25zIGVuIHLDqXBvbnNlIMOgIHVuZVxyXG4gKiBlcnJldXIuXHJcbiAqL1xyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Q29tbXVuZXMoY3AsIG9uRG9uZSA9IHVuZGVmaW5lZCwgb25FcnJvciA9IHVuZGVmaW5lZCkge1xyXG4gIGNvbnN0IGNvZGVQb3N0YWwgPSBwYXJzZUludChjcCk7XHJcbiAgYXdhaXQgZmV0Y2goXHJcbiAgICBcImh0dHBzOi8vYXBpY2FydG8uaWduLmZyL2FwaS9jb2Rlcy1wb3N0YXV4L2NvbW11bmVzL1wiICsgY29kZVBvc3RhbCxcclxuICAgIHtcclxuICAgICAgbWV0aG9kOiBcIkdFVFwiLFxyXG4gICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgQWNjZXB0OiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgfSxcclxuICAgIH0sXHJcbiAgKVxyXG4gICAgLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5qc29uKCkpXHJcbiAgICAudGhlbigoanNvbikgPT4ge1xyXG4gICAgICBpZiAob25Eb25lKSBvbkRvbmUoanNvbik7XHJcbiAgICB9KVxyXG4gICAgLmNhdGNoKChlcnJvcikgPT4ge1xyXG4gICAgICBpZiAob25FcnJvcikgb25FcnJvcihlcnJvcik7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJldXIgOiBcIiArIGVycm9yKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogSWwgcydhZ2l0IGQndW5lIGZvbmN0aW9uIEphdmFTY3JpcHQgcXVpIHV0aWxpc2UgbCdBUEktYWRyZXNzZS5kYXRhLmdvdXYuZnIgcG91ciByZWNoZXJjaGVyIGRlc1xyXG4gKiBhZHJlc3NlcyDDoCBwYXJ0aXIgZCd1bmUgcmVxdcOqdGUgZXQgcmVudm9pZSBsZXMgcsOpc3VsdGF0cyBhdSBmb3JtYXQgSlNPTi5cclxuICogQHBhcmFtIHsgU3RyaW5nIH0gcXVlcnkgLSBMJ2FkcmVzc2Ugb3UgbGEgcmVxdcOqdGUgZCdlbXBsYWNlbWVudCDDoCByZWNoZXJjaGVyIGRhbnMgbCdBUEkuXHJcbiAqIEBwYXJhbSB7IEZ1bmN0aW9uIH0gLSBvbkRvbmUgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgZXjDqWN1dMOpZSBsb3JzcXVlIGwnYXBwZWwgQVBJIHLDqXVzc2l0IGV0XHJcbiAqIHJlbnZvaWUgdW5lIHLDqXBvbnNlLiBJbCBwcmVuZCBsYSByw6lwb25zZSBKU09OIGNvbW1lIHBhcmFtw6h0cmUuXHJcbiAqIEBwYXJhbSB7IEZ1bmN0aW9uIH0gLSBMZSBwYXJhbcOodHJlIGBvbkVycm9yYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBleMOpY3V0w6llIHMnaWwgeSBhIHVuZVxyXG4gKiBlcnJldXIgbG9ycyBkZSBsJ2FwcGVsIGRlIGwnQVBJLiBDJ2VzdCB1biBwYXJhbcOodHJlIG9wdGlvbm5lbCBxdWkgcGV1dCDDqnRyZSBwYXNzw6kgw6AgbGEgZm9uY3Rpb25cclxuICogYGZpbmRBZHJlc3NlYC4gUydpbCBlc3QgZm91cm5pLCBpbCByZWNldnJhIGwnb2JqZXQgZCdlcnJldXIgY29tbWUgYXJndW1lbnQuXHJcbiAqL1xyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluZEFkcmVzc2UoXHJcbiAgcXVlcnksXHJcbiAgb25Eb25lID0gdW5kZWZpbmVkLFxyXG4gIG9uRXJyb3IgPSB1bmRlZmluZWQsXHJcbikge1xyXG4gIC8vIGh0dHBzOi8vYXBpLWFkcmVzc2UuZGF0YS5nb3V2LmZyL3NlYXJjaC8/cT1cclxuICBxdWVyeSA9IGVuY29kZVVSSUNvbXBvbmVudChxdWVyeSk7XHJcbiAgYXdhaXQgZmV0Y2goXHJcbiAgICBcImh0dHBzOi8vYXBpLWFkcmVzc2UuZGF0YS5nb3V2LmZyL3NlYXJjaC8/cT1cIiArIHF1ZXJ5ICsgXCImbGltaXQ9MTVcIixcclxuICAgIHtcclxuICAgICAgbWV0aG9kOiBcIkdFVFwiLFxyXG4gICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgQWNjZXB0OiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgfSxcclxuICAgIH0sXHJcbiAgKVxyXG4gICAgLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5qc29uKCkpXHJcbiAgICAudGhlbigoanNvbikgPT4ge1xyXG4gICAgICBpZiAob25Eb25lKSBvbkRvbmUoanNvbik7XHJcbiAgICB9KVxyXG4gICAgLmNhdGNoKChlcnJvcikgPT4ge1xyXG4gICAgICBpZiAob25FcnJvcikgb25FcnJvcihlcnJvcik7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJldXIgOiBcIiArIGVycm9yKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIExhIGZvbmN0aW9uIGBnZXREYXRhRnJvbUdvdXZGcmAgcsOpY3Vww6hyZSBsZXMgZG9ubsOpZXMgZGUgbCdBUEkgZHUgZ291dmVybmVtZW50IGZyYW7Dp2FpcyBwb3VyIGxlc1xyXG4gKiBqb3VycyBmw6lyacOpcyBldCBsZXMgZm9ybWF0ZSBkYW5zIHVuZSBzdHJ1Y3R1cmUgZGUgZG9ubsOpZXMgc3DDqWNpZmlxdWUuXHJcbiAqIEBwYXJhbSBldmVudHMgLSBMZSBwYXJhbcOodHJlIGBldmVudHNgIGVzdCB1biB0YWJsZWF1IGQnb2JqZXRzIHJlcHLDqXNlbnRhbnQgZGVzIMOpdsOpbmVtZW50cy4gKHN0b3JlLmxvYWRlZEV2ZW50cylcclxuICogQHBhcmFtIGNvbG9ycyAtIExlIHBhcmFtw6h0cmUgYGNvbG9yc2AgZXN0IHVuIG9iamV0cyByZXByw6lzZW50YW50IGRlcyBjb3VsZXVycy4gKFBpdmV0ZWF1KVxyXG4gKiBAcmV0dXJucyBsZXMgZG9ubsOpZXMgZm9ybWF0w6llcywgcXVpIGluY2x1ZW50IGxlcyDDqXbDqW5lbWVudHMgcsOpY3Vww6lyw6lzIGRlcHVpcyBsZSBwb2ludCBkZSB0ZXJtaW5haXNvblxyXG4gKiBBUEkgXCJodHRwczovL2NhbGVuZHJpZXIuYXBpLmdvdXYuZnIvam91cnMtZmVyaWVzL21ldHJvcG9sZS9cIi4gTGVzIMOpdsOpbmVtZW50cyBzb250IGZvcm1hdMOpcyBkYW5zIHVuZVxyXG4gKiBzdHJ1Y3R1cmUgc3DDqWNpZmlxdWUgZXQgcmVudm95w6lzIHNvdXMgZm9ybWUgZCdvYmpldC5cclxuICovXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXREYXRhRnJvbUdvdXZGcihldmVudHMsIGNvbG9ycyA9IGNvdWxldXJzKSB7XHJcbiAgbGV0IHllYXIgPSBEYXRlVGltZS5ub3coKS55ZWFyO1xyXG4gIGNvbnN0IGxvYWRlZEV2ZW50cyA9IGV2ZW50cztcclxuICBjb25zdCBzb3J0ZWREYXRhID0gW107XHJcblxyXG4gIGNvbnN0IGZvcm1hdERhdGEgPSAoanNvbikgPT4ge1xyXG4gICAgZm9yIChsZXQgZGF0ZSBpbiBqc29uKSBzb3J0ZWREYXRhLnB1c2goeyBkYXRlLCBjb21tZW50OiBqc29uW2RhdGVdIH0pO1xyXG4gIH07XHJcblxyXG4gIGZvciAobGV0IGkgPSB5ZWFyOyBpIDw9IHllYXIgKyAxOyBpKyspIHtcclxuICAgIGF3YWl0IGZldGNoKFxyXG4gICAgICBcImh0dHBzOi8vY2FsZW5kcmllci5hcGkuZ291di5mci9qb3Vycy1mZXJpZXMvbWV0cm9wb2xlL1wiICsgaSArIFwiLmpzb25cIixcclxuICAgICAge1xyXG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcclxuICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICBBY2NlcHQ6IFwiYXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICApXHJcbiAgICAgIC50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuanNvbigpKVxyXG4gICAgICAudGhlbigoanNvbikgPT4ge1xyXG4gICAgICAgIGZvcm1hdERhdGEoanNvbik7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaCgoZXJyb3IpID0+IGNvbnNvbGUuZXJyb3IoXCJFcnJldXIgOiBcIiArIGVycm9yKSk7XHJcbiAgfVxyXG5cclxuICBjb25zdCBmb3JtYXRlZERhdGEgPSAoKSA9PiB7XHJcbiAgICBjb25zdCBkYXRhID1cclxuICAgICAgbG9hZGVkRXZlbnRzLmxlbmd0aCA9PT0gMFxyXG4gICAgICAgID8ge1xyXG4gICAgICAgICAgICBldmVudHM6IFtdLFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIDogbG9hZGVkRXZlbnRzO1xyXG4gICAgZm9yIChsZXQgZWFjaCBvZiBzb3J0ZWREYXRhKSB7XHJcbiAgICAgIGNvbnN0IGluZGV4ID0gZGF0YS5ldmVudHMuZmluZEluZGV4KFxyXG4gICAgICAgIChldmVudCkgPT5cclxuICAgICAgICAgIGV2ZW50LnN0YXJ0ID09PSBEYXRlVGltZS5mcm9tSVNPKGVhY2guZGF0ZSkudG9JU09EYXRlKCkgJiZcclxuICAgICAgICAgIGV2ZW50Lm5hbWUgPT09IFwiRsOpcmnDqSA6IFwiICsgZWFjaC5jb21tZW50LFxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKGluZGV4ID09PSAtMSlcclxuICAgICAgICBkYXRhLmV2ZW50cy5wdXNoKHtcclxuICAgICAgICAgIG5hbWU6IFwiRsOpcmnDqSA6IFwiICsgZWFjaC5jb21tZW50LFxyXG4gICAgICAgICAgc3RhcnQ6IERhdGVUaW1lLmZyb21JU08oZWFjaC5kYXRlKS50b0lTT0RhdGUoKSxcclxuICAgICAgICAgIGVuZDogRGF0ZVRpbWUuZnJvbUlTTyhlYWNoLmRhdGUpLnRvSVNPRGF0ZSgpLFxyXG4gICAgICAgICAgY29sb3I6IGNvbG9ycy5iM0J1c2lubmVzc0RheXMsXHJcbiAgICAgICAgICB0aW1lZDogZmFsc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGF0YTtcclxuICB9O1xyXG5cclxuICByZXR1cm4gZm9ybWF0ZWREYXRhKCk7XHJcbn1cclxuIiwiLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBMYSBmb25jdGlvbiBgdXBkYXRlRXZlbnRgIG1ldCDDoCBqb3VyIHVuIHRhYmxlYXUgZCfDqXbDqW5lbWVudHMgZW4gYWpvdXRhbnQgb3UgZW4gc3VwcHJpbWFudCB1blxyXG4gKiDDqXbDqW5lbWVudCBlbiBmb25jdGlvbiBkJ3VuZSBjb25kaXRpb24gZG9ubsOpZS5cclxuICogQHBhcmFtIHtBcnJheX0gZXZlbnRzIC0gKHN0b3JlLmxvYWRlZEV2ZW50cylVbmUgcGFub3BsaWUgZCfDqXbDqW5lbWVudHMuIENoYXF1ZSDDqXbDqW5lbWVudCBlc3QgdW4gb2JqZXQgYXZlYyBkZXMgcHJvcHJpw6l0w6lzIHRlbGxlcyBxdWUgdXVpZCwgc3RhcnQsIGVuZCwgZXRjLlxyXG4gKlxyXG4gKiBAcGFyYW0ge09iamVjdH0gZGF0YSAtIExlIHBhcmFtw6h0cmUgYGRhdGFgIGVzdCB1biBvYmpldCBxdWkgcmVwcsOpc2VudGUgbCfDqXbDqW5lbWVudCDDoCBtZXR0cmUgw6Agam91ci5cclxuICogQHBhcmFtIHtTdHJpbmd9W2RhdGEudXVpZF0gLSBMJ2lkZW50aWZpYW50IHVuaXF1ZSBkZSBsJ8OpdsOpbmVtZW50LlxyXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFthZGQ9dHJ1ZV0gLSBMZSBwYXJhbcOodHJlIFwiYWRkXCIgZXN0IHVuZSB2YWxldXIgYm9vbMOpZW5uZSBxdWkgZMOpdGVybWluZSBzJ2lsIGZhdXQgYWpvdXRlciBvdVxyXG4gKiBtZXR0cmUgw6Agam91ciB1biDDqXbDqW5lbWVudCBkYW5zIGxlIHRhYmxlYXUgZGVzIMOpdsOpbmVtZW50cy4gU2kgYWRkIGVzdCB2cmFpLCBsYSBmb25jdGlvbiBham91dGVyYVxyXG4gKiBsJ8OpdsOpbmVtZW50IGF1IHRhYmxlYXUgcydpbCBuJ2V4aXN0ZSBwYXMgZMOpasOgLiBTaSBhZGQgZXN0IGZhdXgsIGxhIGZvbmN0aW9uIG1ldHRyYSDDoCBqb3VyXHJcbiAqIGwnw6l2w6luZW1lbnQgZXhpc3RhbnQgZGFucyBsZSB0YWJsZWF1XHJcbiAqIEByZXR1cm5zIGxlIHRhYmxlYXUgYGRiYCAoc3RvcmUubG9hZGVkRXZlbnRzKSBtaXMgw6Agam91ci5cclxuICovXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVFdmVudChldmVudHMsIGRhdGEsIGFkZCA9IHRydWUpIHtcclxuICBjb25zdCBpbmRleCA9IGV2ZW50cy5ldmVudHMuZmluZEluZGV4KCh2YWwpID0+IHZhbC51dWlkID09PSBkYXRhLnV1aWQpO1xyXG5cclxuICBpZiAoaW5kZXggPT09IC0xKSB7XHJcbiAgICBldmVudHMuZXZlbnRzLnB1c2goZGF0YSk7XHJcbiAgfSBlbHNlIHtcclxuICAgIGlmIChhZGQpIGV2ZW50cy5ldmVudHNbaW5kZXhdID0gZGF0YTtcclxuICAgIGVsc2UgZXZlbnRzLmV2ZW50cy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gIH1cclxuXHJcbiAgaWYgKGV2ZW50cy5sZW5ndGggPiAwKSBldmVudHMuc29ydCgoYSwgYikgPT4gYS5zdGFydCAtIGIuc3RhcnQpO1xyXG5cclxuICByZXR1cm4gZXZlbnRzO1xyXG59XHJcbiIsImltcG9ydCB7IHdpZGdldCwgcmVxdWlyZWpzIH0gZnJvbSBcIkB3aWRnZXQtbGFiLzNkZGFzaGJvYXJkLXV0aWxzXCI7XHJcblxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIENldHRlIGZvbmN0aW9uIGVmZmVjdHVlIHVuIGFwcGVsIEhUVFAgYXV0aGVudGlmacOpIMOgIGwnYWlkZSBkZSBsYSBiaWJsaW90aMOocXVlIFdBRkRhdGEgZW4gZGUgbGEgcGxhdGVmb3JtZS5cclxuICogQHBhcmFtIHtTdHJpbmd9IHVybCAtIEwnVVJMIGR1IHBvaW50IGRlIHRlcm1pbmFpc29uIGRlIGwnQVBJIHF1ZSBsYSBmb25jdGlvbiBhcHBlbGxlcmEuXHJcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIC0gTGUgcGFyYW3DqHRyZSBgb3B0aW9uc2AgZXN0IHVuIG9iamV0IHF1aSBjb250aWVudCBkaXZlcnNlcyBvcHRpb25zIHBvdXIgbGEgcmVxdcOqdGVcclxuICogSFRUUCwgdGVsbGVzIHF1ZSBsYSBtw6l0aG9kZSBkZSByZXF1w6p0ZSAoR0VULCBQT1NULCBldGMuKSwgbGVzIGVuLXTDqnRlcywgbGUgY29ycHMsIGV0Yy4gQ2VzIG9wdGlvbnNcclxuICogc29udCBnw6luw6lyYWxlbWVudCB0cmFuc21pc2VzIMOgIGwnQVBJIGBmZXRjaGAgb3UgYFhNTEh0dHBSZXF1ZXN0YCBwb3VyIGVmZmVjdHVlciBsYSByZXF1w6p0ZSBIVFRQXHJcbiAqIHLDqWVsbGUuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX2h0dHBDYWxsQXV0aGVudGljYXRlZCh1cmwsIG9wdGlvbnMpIHtcclxuICByZXF1aXJlanMoW1wiRFMvV0FGRGF0YS9XQUZEYXRhXCJdLCAoV0FGRGF0YSkgPT4ge1xyXG4gICAgV0FGRGF0YS5hdXRoZW50aWNhdGVkUmVxdWVzdCh1cmwsIG9wdGlvbnMpO1xyXG4gIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIENldHRlIGZvbmN0aW9uIGTDqWZpbml0IHVuIMOpbMOpbWVudCBjb21tZSDDqXRhbnQgZMOpcGxhw6dhYmxlIGV0IHRyYW5zbWV0IGRlcyBkb25uw6llcyBldCB1bmUgZm9uY3Rpb24gZGVcclxuICogcmFwcGVsIMOgIGV4w6ljdXRlciBsb3JzcXVlIGxlIGdsaXNzZW1lbnQgY29tbWVuY2UgKGRyYWcgYW5kIGRyb3ApLlxyXG4gKiBAcGFyYW0gZWxlbSAtIEwnw6lsw6ltZW50IEhUTUwgcXVpIGRvaXQgw6p0cmUgcmVuZHUgZMOpcGxhw6dhYmxlLlxyXG4gKiBAcGFyYW0gc3RyRGF0YSAtIHN0ckRhdGEgZXN0IHVuZSBjaGHDrm5lIHF1aSByZXByw6lzZW50ZSBsZXMgZG9ubsOpZXMgYXNzb2Npw6llcyDDoCBsJ8OpbMOpbWVudCBkw6lwbGHDp2FibGUuXHJcbiAqIENlcyBkb25uw6llcyBzb250IGFjY2Vzc2libGVzIGxvcnMgZGVzIG9ww6lyYXRpb25zIGRlIGdsaXNzZXItZMOpcG9zZXIgcG91ciBmb3VybmlyIGRlcyBpbmZvcm1hdGlvbnNcclxuICogc3VwcGzDqW1lbnRhaXJlcyBzdXIgbCfDqWzDqW1lbnQgZMOpcGxhY8OpLlxyXG4gKiBAcGFyYW0gb25EcmFnIC0gb25EcmFnIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGV4w6ljdXTDqWUgYXUgZMOpYnV0IGRlIGwnb3DDqXJhdGlvbiBkZVxyXG4gKiBnbGlzc2VtZW50LiBJbCBwZXV0IMOqdHJlIHV0aWxpc8OpIHBvdXIgZWZmZWN0dWVyIHRvdXRlcyBsZXMgYWN0aW9ucyBuw6ljZXNzYWlyZXMgYXZhbnQgbGUgZMOpYnV0IGRlXHJcbiAqIGwnb3DDqXJhdGlvbiBkZSBnbGlzc2VtZW50LCB0ZWxsZXMgcXVlIGxhIGNvbmZpZ3VyYXRpb24gZGVzIGRvbm7DqWVzIMOgIHRyYW5zZsOpcmVyIG91IGxhIG1pc2Ugw6Agam91ciBkZVxyXG4gKiBsJ2FwcGFyZW5jZSBkZSBsJ8OpbMOpbWVudCBkw6lwbGHDp2FibGUuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX3NldERyYWdnYWJsZShlbGVtLCBzdHJEYXRhLCBvbkRyYWcpIHtcclxuICByZXF1aXJlanMoW1wiRFMvRGF0YURyYWdBbmREcm9wL0RhdGFEcmFnQW5kRHJvcFwiXSwgKERhdGFEcmFnQW5kRHJvcCkgPT4ge1xyXG4gICAgRGF0YURyYWdBbmREcm9wLmRyYWdnYWJsZShlbGVtLCB7IGRhdGE6IHN0ckRhdGEsIHN0YXJ0OiBvbkRyYWcgfSk7XHJcbiAgfSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gQ2V0dGUgZm9uY3Rpb24gY29uZmlndXJlIHVuIHByb3h5IGRlIG5hdmlnYXRldXIgZGUgYmFsaXNlcyBhdmVjIGRlcyBiYWxpc2VzIHNww6ljaWZpw6llcyBldCB1biDDqXbDqW5lbWVudCBkZSBmaWx0cmUgZmFjdWx0YXRpZi5cclxuICpcclxuICogQHBhcmFtIHRhZ3MgLSBMZSBwYXJhbcOodHJlIHRhZ3MgZXN0IHVuIHRhYmxlYXUgZGUgY2hhw65uZXMgcmVwcsOpc2VudGFudCBsZXMgYmFsaXNlcyBxdWkgc2Vyb250XHJcbiAqIHV0aWxpc8OpZXMgcG91ciBmaWx0cmVyIGxlcyBzdWpldHMgZGFucyBsZSB3aWRnZXQgVGFnTmF2aWdhdG9yUHJveHkuXHJcbiAqIEBwYXJhbSBbb25UYWdnZXJGaWx0ZXJdIC0gTGUgcGFyYW3DqHRyZSBvblRhZ2dlckZpbHRlciBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBleMOpY3V0w6llXHJcbiAqIGxvcnNxdWUgbCd1dGlsaXNhdGV1ciBmaWx0cmVyYSBsZXMgc3VqZXRzIGRhbnMgbGUgdGFnZ2VyLiBJbCByZWNldnJhIGxlcyBzdWpldHMgZmlsdHLDqXMgZW4gYXJndW1lbnQuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX3NldHVwVGFnZ2VyKHRhZ3MsIG9uVGFnZ2VyRmlsdGVyID0gdW5kZWZpbmVkKSB7XHJcbiAgcmVxdWlyZWpzKFtcIkRTL1RhZ05hdmlnYXRvclByb3h5L1RhZ05hdmlnYXRvclByb3h5XCJdLCAoVGFnTmF2aWdhdG9yUHJveHkpID0+IHtcclxuICAgIGxldCB0YWdnZXJQcm94eTtcclxuICAgIGlmICh0YWdnZXJQcm94eSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRhZ2dlclByb3h5ID0gVGFnTmF2aWdhdG9yUHJveHkuY3JlYXRlUHJveHkoe1xyXG4gICAgICAgIHdpZGdldElkOiB3aWRnZXQuaWQsXHJcbiAgICAgICAgZmlsdGVyaW5nTW9kZTogXCJXaXRoRmlsdGVyaW5nU2VydmljZXNcIixcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBpZiAob25UYWdnZXJGaWx0ZXIgIT09IHVuZGVmaW5lZClcclxuICAgICAgICB0YWdnZXJQcm94eS5hZGRFdmVudChcIm9uRmlsdGVyU3ViamVjdHNDaGFuZ2VcIiwgb25UYWdnZXJGaWx0ZXIpO1xyXG4gICAgfVxyXG4gICAgdGFnZ2VyUHJveHkuc2V0U3ViamVjdHNUYWdzKHRhZ3MpO1xyXG4gIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogQ2V0dGUgZm9uY3Rpb24gZMOpZmluaXQgdW4gw6lsw6ltZW50IGNvbW1lIHBvdXZhbnQgw6p0cmUgZMOpcG9zw6kgw6AgbCdhaWRlIGRlIGxhIGJpYmxpb3Row6hxdWVcclxuICogRGF0YURyYWdBbmREcm9wLlxyXG4gKiBAcGFyYW0gZWxlbSAtIEwnw6lsw6ltZW50IEhUTUwgcXVpIGRvaXQgw6p0cmUgcmVuZHUgZMOpcG9zYWJsZS5cclxuICogQHBhcmFtIGRyb3AgLSBMZSBwYXJhbcOodHJlIGBkcm9wYCBlc3QgdW5lIGZvbmN0aW9uIHF1aSBzZXJhIGFwcGVsw6llIGxvcnNxdSd1biDDqWzDqW1lbnQgZMOpcGxhw6dhYmxlIGVzdFxyXG4gKiBkw6lwb3PDqSBzdXIgbCfDqWzDqW1lbnQgZMOpcGxhw6dhYmxlLiBJbCBwcmVuZCBnw6luw6lyYWxlbWVudCBsJ8OpbMOpbWVudCBzdXBwcmltw6kgY29tbWUgYXJndW1lbnQgZXQgZXjDqWN1dGVcclxuICogdW5lIGFjdGlvbiBiYXPDqWUgc3VyIGNlbHVpLWNpLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9zZXREcm9wcGFibGUoZWxlbSwgZHJvcCkge1xyXG4gIHJlcXVpcmVqcyhbXCJEUy9EYXRhRHJhZ0FuZERyb3AvRGF0YURyYWdBbmREcm9wXCJdLCAoRGF0YURyYWdBbmREcm9wKSA9PiB7XHJcbiAgICBEYXRhRHJhZ0FuZERyb3AuZHJvcHBhYmxlKGVsZW0sIHsgZHJvcCB9KTtcclxuICB9KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBDZXR0ZSBmb25jdGlvbiBhc3luY2hyb25lIG9idGllbnQgbGVzIHNlcnZpY2VzIGRlIGxhIHBsYXRlZm9ybWUgw6AgbCdhaWRlIGRlIGxhIGJpYmxpb3Row6hxdWUgaTNEWENvbXBhc3NTZXJ2aWNlcyBldCBhcHBlbGxlIGxlcyBmb25jdGlvbnMgb25Db21wbGV0ZSBvdSBvbkZhaWx1cmUgZW4gZm9uY3Rpb24gZHUgcsOpc3VsdGF0LlxyXG4gKlxyXG4gKiBAcGFyYW0gcGxhdGZvcm1JZCAtIElEIGRlIGxhIHBsYXRlLWZvcm1lIHBvdXIgbGFxdWVsbGUgbGVzIHNlcnZpY2VzIHNvbnQgZGVtYW5kw6lzLiBTaSBhdWN1biBJRCBkZVxyXG4gKiBwbGF0ZS1mb3JtZSBuJ2VzdCBmb3VybmksIGxhIGZvbmN0aW9uIHRlbnRlcmEgZGUgcsOpY3Vww6lyZXIgbCdJRCDDoCBwYXJ0aXIgZCd1bmUgdmFsZXVyIGRlIHdpZGdldC4gU2lcclxuICogYXVjdW4gSUQgbidlc3QgdHJvdXbDqSwgaWwgc2VyYSBkw6lmaW5pIHN1ciBgdW5kZWZpbmVkYC5cclxuICogQHBhcmFtIG9uQ29tcGxldGUgLSBVbmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGV4w6ljdXTDqWUgbG9yc3F1ZSBsZXMgc2VydmljZXMgZGUgbGEgcGxhdGVmb3JtZVxyXG4gKiBzZXJvbnQgcsOpY3Vww6lyw6lzIGF2ZWMgc3VjY8Oocy4gSWwgcHJlbmQgbGVzIHNlcnZpY2VzIGRlIHBsYXRlZm9ybWUgcsOpY3Vww6lyw6lzIGNvbW1lIGFyZ3VtZW50LlxyXG4gKiBAcGFyYW0gb25GYWlsdXJlIC0gTGUgcGFyYW3DqHRyZSBvbkZhaWx1cmUgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgZXjDqWN1dMOpZSBlbiBjYXNcclxuICogZCdlcnJldXIgb3UgZCfDqWNoZWMgZGFucyBsJ2V4w6ljdXRpb24gZGUgbGEgZm9uY3Rpb24gZ2V0UGxhdGZvcm1TZXJ2aWNlcy4gSWwgcGVybWV0IGRlIGfDqXJlciBsZXNcclxuICogZXJyZXVycyBldCBkZSBmb3VybmlyIHVuIHJldG91ciBkJ2luZm9ybWF0aW9uIGFwcHJvcHJpw6kgw6AgbCd1dGlsaXNhdGV1ci5cclxuICovXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBfZ2V0UGxhdGZvcm1TZXJ2aWNlcyhcclxuICBwbGF0Zm9ybUlkLFxyXG4gIG9uQ29tcGxldGUgPSB1bmRlZmluZWQsXHJcbiAgb25GYWlsdXJlID0gdW5kZWZpbmVkLFxyXG4pIHtcclxuICByZXF1aXJlanMoXHJcbiAgICBbXCJEUy9pM0RYQ29tcGFzc1NlcnZpY2VzL2kzRFhDb21wYXNzU2VydmljZXNcIl0sXHJcbiAgICAoaTNEWENvbXBhc3NTZXJ2aWNlcykgPT4ge1xyXG4gICAgICBpZiAoIXBsYXRmb3JtSWQgfHwgcGxhdGZvcm1JZCA9PT0gXCJcIikge1xyXG4gICAgICAgIHBsYXRmb3JtSWQgPSB3aWRnZXQuZ2V0VmFsdWUoXCJQbGF0Rm9ybUluc3RhbmNlSWRcIik7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFwbGF0Zm9ybUlkIHx8IHBsYXRmb3JtSWQgPT09IFwiXCIpIHtcclxuICAgICAgICBwbGF0Zm9ybUlkID0gdW5kZWZpbmVkO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChvbkNvbXBsZXRlKSB7XHJcbiAgICAgICAgb25Db21wbGV0ZShcclxuICAgICAgICAgIGkzRFhDb21wYXNzU2VydmljZXMuZ2V0UGxhdGZvcm1TZXJ2aWNlcyh7XHJcbiAgICAgICAgICAgIHBsYXRmb3JtSWQsXHJcbiAgICAgICAgICAgIG9uQ29tcGxldGUsXHJcbiAgICAgICAgICAgIG9uRmFpbHVyZSxcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEBkZXNjcmlwdGlvblxyXG4gKiAgTGEgZm9uY3Rpb24gYF9nZXRQbGF0ZWZvcm1JbmZvc2AgcsOpY3Vww6hyZSBsZXMgaW5mb3JtYXRpb25zIHN1ciBsYSBwbGF0ZWZvcm1lIMOgIGwnYWlkZSBkdSBtb2R1bGVcclxuICogUGxhdGZvcm1BUEkgZXQgcmVudm9pZSBsZXMgaW5mb3JtYXRpb25zIGRhbnMgdW4gb2JqZXQuXHJcbiAqIEByZXR1cm5zIHVuIG9iamV0IGFwcGVsw6kgXCJyZXRvdXJBUElcIiBxdWkgY29udGllbnQgbGVzIHByb3ByacOpdMOpcyBzdWl2YW50ZXMgOlxyXG4gKiAtIHtTdHJpbmd9IHRlbmFudCwgTGUgdGVuYW50IGRlIGxhIHBsYXRlZm9ybWUgc3VyIGxlcXVlbCBvbiB0cmF2YWlsbGUuXHJcbiAqIC0ge09iamVjdH0gdXNlciwgTCd1dGlsaXNhdGV1ciBjb25uZWN0w6kgw6AgbGEgcGxhdGVmb3JtZS4uLlxyXG4gKiAtIHtBcnJheU9mT2JqZWN0fSBhcHBzQ29uZmlndXJhdGlvbiwgbGlzdGUgZCdhcHAgYXVxdWVsIG9uIGFjY8Oocy5cclxuICogLSB7U3RyaW5nfSBhcHBDb25mXHJcbiAqXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX2dldFBsYXRlZm9ybUluZm9zKCkge1xyXG4gIGxldCByZXRvdXJBUEkgPSB7fTtcclxuXHJcbiAgcmVxdWlyZWpzKFtcIkRTL1BsYXRmb3JtQVBJL1BsYXRmb3JtQVBJXCJdLCAocGxBUEkpID0+IHtcclxuICAgIGNvbnN0IHRlbmFudCA9IHBsQVBJLmdldFRlbmFudCgpO1xyXG4gICAgY29uc3QgdXNlciA9IHBsQVBJLmdldFVzZXIoKTtcclxuICAgIGNvbnN0IGFwcHNDb25maWd1cmF0aW9uID0gcGxBUEkuZ2V0QWxsQXBwbGljYXRpb25Db25maWd1cmF0aW9ucygpO1xyXG4gICAgY29uc3QgYXBwQ29uZiA9IHBsQVBJLmdldEFwcGxpY2F0aW9uQ29uZmlndXJhdGlvbihcclxuICAgICAgXCJjb20uM2RzLndwLnBhc3Nwb3J0LmNvcnNcIixcclxuICAgICk7XHJcbiAgICByZXRvdXJBUEkgPSB7XHJcbiAgICAgIHRlbmFudCxcclxuICAgICAgdXNlcixcclxuICAgICAgYXBwc0NvbmZpZ3VyYXRpb24sXHJcbiAgICAgIGFwcENvbmYsXHJcbiAgICB9O1xyXG4gIH0pO1xyXG4gIGNvbnNvbGUubG9nKFwiJWNSRVRPVVIgQVBJIDpcIiwgXCJjb2xvcjpibHVlXCIsIHJldG91ckFQSSk7XHJcbiAgcmV0dXJuIHJldG91ckFQSTtcclxufVxyXG4iLCJpbXBvcnQgeyBfaHR0cENhbGxBdXRoZW50aWNhdGVkIH0gZnJvbSBcIi4uL21haW4vM2RleHBlcmllbmNlX2FwaVwiO1xyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIExhIGZvbmN0aW9uIGBjb21wYXNzX2dldExpc3RBZGRpdGlvbmFsQXBwc2AgZWZmZWN0dWUgdW5lIHJlcXXDqnRlIEhUVFAgR0VUIGF1dGhlbnRpZmnDqWUgcG91clxyXG4gKiByw6ljdXDDqXJlciB1bmUgbGlzdGUgZCdhcHBsaWNhdGlvbnMgc3VwcGzDqW1lbnRhaXJlcyBlbiBmb25jdGlvbiBkZXMgaW5mb3JtYXRpb25zIGQnaWRlbnRpZmljYXRpb25cclxuICogZm91cm5pZXMuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBjcmVkZW50aWFscyBVbiBvYmpldCBjb250ZW5hbnQgbGVzIGluZm9ybWF0aW9ucyBkJ2lkZW50aWZpY2F0aW9uIG7DqWNlc3NhaXJlcyDDoFxyXG4gKiBsJ2F1dGhlbnRpZmljYXRpb24uIElsIGRvaXQgYXZvaXIgbGVzIHByb3ByacOpdMOpcyBzdWl2YW50ZXPCoDogc3BhY2UsIHRva2VuXHJcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBbc3BhY2VdIC0gTCdVUkwgZHUgc2VydmV1ciBzdXIgbGVxdWVsIGwnQVBJIGVzdCBkw6lwbG95w6llLihleDogM0RTcGFjZSwgM0RTd3ltLCAzRENvbXBhc3MuLi4pXHJcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBbdGVuYW50XSAtIGxlIHRlbmFudCBjb3VyYW50IChleDogUjExMzIxMDA5Njg0NDcpXHJcbiAqIEBwYXJhbSBvbkRvbmUgLSBMZSBwYXJhbcOodHJlIGBvbkRvbmVgIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIGxvcnNxdWUgbCdhcHBlbFxyXG4gKiBkJ0FQSSByw6l1c3NpdCBldCBxdWUgbGVzIGRvbm7DqWVzIGRlIHLDqXBvbnNlIHNvbnQgZm9ybWF0w6llcy4gSWwgcHJlbmQgZGV1eCBhcmd1bWVudHMgOlxyXG4gKiBgZm9ybWF0ZWRJbmZvc2AgZXQgYGluZm9gLiBgZm9ybWF0ZWRJbmZvc2AgZXN0IHVuIHRhYmxlYXUgZCdvYmpldHMgY29udGVuYW50IGxlIG5vbSBldCBsJ2lkZW50aWZpYW50XHJcbiAqIGRlIGNoYXF1ZSBhcHBsaWNhdGlvbixcclxuICogQHBhcmFtIG9uRXJyb3IgLSBMZSBwYXJhbcOodHJlIGBvbkVycm9yYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBzJ2lsIHkgYSB1bmVcclxuICogZXJyZXVyIGxvcnMgZGUgbGEgcmVxdcOqdGUgSFRUUC4gSWwgcHJlbmQgdW4gcGFyYW3DqHRyZSwgwqsgaW5mbyDCuywgcXVpIGVzdCB1biBvYmpldCBjb250ZW5hbnQgZGVzXHJcbiAqIGluZm9ybWF0aW9ucyBzdXIgbCdlcnJldXIuXHJcbiAqL1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBhc3NfZ2V0TGlzdEFkZGl0aW9uYWxBcHBzKGNyZWRlbnRpYWxzLCBvbkRvbmUsIG9uRXJyb3IpIHtcclxuICBjb25zdCBVUkwgPSB7XHJcbiAgICBiYXNlOiBgJHtjcmVkZW50aWFscy5zcGFjZX1gLFxyXG4gICAgdXJpOiBcIi9yZXNvdXJjZXMvQXBwc01uZ3QvYXBpL2N1c3RvbS9hcHBsaWNhdGlvbnNcIixcclxuICAgIG9wdGlvbjogYD9maWx0ZXI9JHtjcmVkZW50aWFscy50ZW5hbnR9YCwgLy8gZmFjdWx0YXRpZlxyXG4gIH07XHJcbiAgY29uc3QgdXJsID0gYCR7VVJMLmJhc2V9JHtVUkwudXJpfSR7VVJMLm9wdGlvbn1gO1xyXG5cclxuICBfaHR0cENhbGxBdXRoZW50aWNhdGVkKHVybCwge1xyXG4gICAgbWV0aG9kOiBcIkdFVFwiLFxyXG4gICAgaGVhZGVyczoge1xyXG4gICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgQWNjZXB0OiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgIH0sXHJcbiAgICBvbkNvbXBsZXRlKHJlc3BvbnNlLCBoZWFkZXJzLCB4aHIpIHtcclxuICAgICAgY29uc3QgaW5mbyA9IEpTT04ucGFyc2UocmVzcG9uc2UpO1xyXG4gICAgICBjb25zdCBmb3JtYXRlZEluZm9zID0gaW5mby5kYXRhLm1hcCgoYXBwKSA9PiB7XHJcbiAgICAgICAgY29uc3QgbmFtZSA9IGFwcC5hdHRyaWJ1dGVzLm5hbWU7XHJcbiAgICAgICAgY29uc3QgaWQgPSBhcHAuaWQ7XHJcbiAgICAgICAgcmV0dXJuIHsgbmFtZSwgaWQgfTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBpZiAob25Eb25lKSBvbkRvbmUoZm9ybWF0ZWRJbmZvcywgaW5mbyk7XHJcbiAgICB9LFxyXG4gICAgb25GYWlsdXJlKHJlc3BvbnNlLCBoZWFkZXJzKSB7XHJcbiAgICAgIGNvbnN0IGluZm8gPSByZXNwb25zZTtcclxuICAgICAgaW5mb1tcIm1zZ1wiXSA9IGhlYWRlcnMuZXJyb3Jtc2c7XHJcbiAgICAgIGluZm9bXCJlcnJDb2RlXCJdID0gaGVhZGVycy5lcnJvcmNvZGU7XHJcblxyXG4gICAgICBpZiAob25FcnJvcikgb25FcnJvcihpbmZvKTtcclxuICAgIH0sXHJcbiAgfSk7XHJcbn1cclxuIiwiaW1wb3J0IHsgX2h0dHBDYWxsQXV0aGVudGljYXRlZCB9IGZyb20gXCIuLzNkZXhwZXJpZW5jZV9hcGkuanNcIjtcclxuXHJcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gTGEgZm9uY3Rpb24gYF9BcHBNbmd0X2dldF91c2Vyc2AgZWZmZWN0dWUgdW4gYXBwZWwgSFRUUCBhdXRoZW50aWZpw6kgcG91ciByw6ljdXDDqXJlciB1bmUgbGlzdGVcclxuICogZCd1dGlsaXNhdGV1cnMgZCd1bmUgcGxhdGVmb3JtZSBzcMOpY2lmacOpZS5cclxuICogQHBhcmFtIHtPYmplY3R9IGNyZWRlbnRpYWxzIC0gVW4gb2JqZXQgY29udGVuYW50IGxlcyBpbmZvcm1hdGlvbnMgZCdpZGVudGlmaWNhdGlvbiByZXF1aXNlcyBwb3VyIGF1dGhlbnRpZmllclxyXG4gKiBsYSBkZW1hbmRlLiBJbCBpbmNsdXQgZ8OpbsOpcmFsZW1lbnQgZGVzIHByb3ByacOpdMOpcyB0ZWxsZXMgcXVlIMKrIHRva2VuIMK7LCDCqyBzcGFjZSDCuywgwqsgdGVuYW50IMK7IGV0IMKrIGN0eCDCuy5cclxuICogQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLnNwYWNlIC0gTCdVUkwgZHUgc2VydmV1ciBzdXIgbGVxdWVsIGwnQVBJIGVzdCBkw6lwbG95w6llLihleDogM0RTcGFjZSA9PihodHRwczovL3IxMTMyMTAwOTY4NDQ3LWV1MS1zcGFjZS4zZGV4cGVyaWVuY2UuM2RzLmNvbS9lbm92aWEpLCAzRFN3eW0sIHVzZXJzZ3JvdXAsIDNEQ29tcGFzcy4uLilcclxuICogQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLnRlbmFudCAtIEwnaWRlbnRpZmlhbnQgZHUgdGVuYW50IHN1ciBsZXF1ZWwgbCdBUEkgZXN0IGTDqXBsb3nDqWUuKGV4OjExMzIxMDA5Njg0NDcpXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkRvbmVdIC0gTGUgcGFyYW3DqHRyZSBgb25Eb25lYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBsb3JzcXVlIGwnYXBwZWxcclxuICogQVBJIHNlcmEgdGVybWluw6kgYXZlYyBzdWNjw6hzLiBJbCBwcmVuZCB1biBhcmd1bWVudCwgwqsgaW5mbyDCuywgcXVpIGNvcnJlc3BvbmQgYXV4IGRvbm7DqWVzIGRlIHLDqXBvbnNlXHJcbiAqIGRlIGwnQVBJLlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25FcnJvcl0gLSBMZSBwYXJhbcOodHJlIGBvbkVycm9yYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBzJ2lsIHkgYSB1bmVcclxuICogZXJyZXVyIGxvcnMgZGUgbGEgcmVxdcOqdGUgSFRUUC4gSWwgZXN0IGZhY3VsdGF0aWYgZXQgcGV1dCDDqnRyZSBpbmTDqWZpbmkuIFMnaWwgZXN0IGZvdXJuaSwgaWwgc2VyYVxyXG4gKiBhcHBlbMOpIGF2ZWMgbCdvYmpldCBkZSByw6lwb25zZSBjb21tZSBhcmd1bWVudC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfQXBwTW5ndF9nZXRfdXNlcnMoXHJcbiAgY3JlZGVudGlhbHMsXHJcbiAgb25Eb25lID0gdW5kZWZpbmVkLFxyXG4gIG9uRXJyb3IgPSB1bmRlZmluZWQsXHJcbikge1xyXG4gIGxldCB1cmwgPSBgJHtjcmVkZW50aWFscy5zcGFjZX0vcmVzb3VyY2VzL0FwcHNNbmd0L3VzZXI/cGxhdGZvcm09JHtjcmVkZW50aWFscy50ZW5hbnR9JmxpbWl0PS0xYDtcclxuXHJcbiAgX2h0dHBDYWxsQXV0aGVudGljYXRlZCh1cmwsIHtcclxuICAgIG9uQ29tcGxldGUocmVzcG9uc2UsIGhlYWRlcnMsIHhocikge1xyXG4gICAgICBjb25zdCBpbmZvID0gSlNPTi5wYXJzZShyZXNwb25zZSk7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiX0FwcE1uZ3RfZ2V0X3VzZXJzID0+IFwiLCBpbmZvKTtcclxuICAgICAgaWYgKG9uRG9uZSkgb25Eb25lKGluZm8pO1xyXG4gICAgfSxcclxuICAgIG9uRmFpbHVyZShyZXNwb25zZSwgaGVhZGVycykge1xyXG4gICAgICBjb25zdCBpbmZvID0gcmVzcG9uc2U7XHJcbiAgICAgIGluZm9bXCJtc2dcIl0gPSBoZWFkZXJzLmVycm9ybXNnO1xyXG4gICAgICBpbmZvW1wiZXJyQ29kZVwiXSA9IGhlYWRlcnMuZXJyb3Jjb2RlO1xyXG5cclxuICAgICAgaWYgKG9uRXJyb3IpIG9uRXJyb3IoaW5mbyk7XHJcbiAgICB9LFxyXG4gIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIExhIGZvbmN0aW9uIGBfQXBwTW5ndF9nZXRfaW5mb191c2VyYCBlZmZlY3R1ZSB1biBhcHBlbCBIVFRQIGF1dGhlbnRpZmnDqSBwb3VyIHLDqWN1cMOpcmVyIGRlc1xyXG4gKiBpbmZvcm1hdGlvbnMgc3VyIHVuIHV0aWxpc2F0ZXVyIMOgIHBhcnRpciBkJ3VuZSBwbGF0ZWZvcm1lIHNww6ljaWZpcXVlLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gY3JlZGVudGlhbHMgLSBVbiBvYmpldCBjb250ZW5hbnQgbGVzIGluZm9ybWF0aW9ucyBkJ2lkZW50aWZpY2F0aW9uIHJlcXVpc2VzIHBvdXIgYXV0aGVudGlmaWVyXHJcbiAqIGxhIGRlbWFuZGUuIElsIGluY2x1dCBnw6luw6lyYWxlbWVudCBkZXMgcHJvcHJpw6l0w6lzIHRlbGxlcyBxdWUgwqsgdG9rZW4gwrssIMKrIHNwYWNlIMK7LCDCqyB0ZW5hbnQgwrsgZXQgwqsgY3R4IMK7LlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMuc3BhY2UgLSBMJ1VSTCBkdSBzZXJ2ZXVyIHN1ciBsZXF1ZWwgbCdBUEkgZXN0IGTDqXBsb3nDqWUuKGV4OiAzRFNwYWNlID0+KGh0dHBzOi8vcjExMzIxMDA5Njg0NDctZXUxLXNwYWNlLjNkZXhwZXJpZW5jZS4zZHMuY29tL2Vub3ZpYSksIDNEU3d5bSwgdXNlcnNncm91cCwgM0RDb21wYXNzLi4uKVxyXG4gKiBAcGFyYW0ge1N0cmluZ30gaWQgLSBMZSBwYXJhbcOodHJlIGBpZGAgZXN0IGwnaWRlbnRpZmlhbnQgdW5pcXVlIGRlIGwndXRpbGlzYXRldXIgcG91ciBsZXF1ZWwgdm91cyBzb3VoYWl0ZXpcclxuICogcsOpY3Vww6lyZXIgZGVzIGluZm9ybWF0aW9ucy5cclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRG9uZV0gLSBMZSBwYXJhbcOodHJlIGBvbkRvbmVgIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIGxvcnNxdWUgbGFcclxuICogcmVxdcOqdGUgc2VyYSB0ZXJtaW7DqWUgYXZlYyBzdWNjw6hzLiBJbCBwcmVuZCB1biBhcmd1bWVudCwgwqtpbmZvwrssIHF1aSBjb3JyZXNwb25kIGF1eCBkb25uw6llcyBkZSByw6lwb25zZSBkdSBzZXJ2ZXVyLlxyXG4gKlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25FcnJvcl0gLSBMZSBwYXJhbcOodHJlIGBvbkVycm9yYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBzJ2lsIHkgYSB1bmVcclxuICogZXJyZXVyIGxvcnMgZGUgbGEgcmVxdcOqdGUgSFRUUC4gSWwgZXN0IGZhY3VsdGF0aWYgZXQgcGV1dCDDqnRyZSBpbmTDqWZpbmkuIFMnaWwgZXN0IGZvdXJuaSwgaWwgc2VyYVxyXG4gKiBhcHBlbMOpIGF2ZWMgbGUgcGFyYW3DqHRyZSBgcmVzcG9uc2VgLCBxdWkgY29udGllbnQgbGEgcsOpcG9uc2UgZCdlcnJldXIgZHUgc2VydmV1ci5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfQXBwTW5ndF9nZXRfaW5mb191c2VyKFxyXG4gIGNyZWRlbnRpYWxzLFxyXG4gIGlkLFxyXG4gIG9uRG9uZSA9IHVuZGVmaW5lZCxcclxuICBvbkVycm9yID0gdW5kZWZpbmVkLFxyXG4pIHtcclxuICBsZXQgdXJsID0gYCR7Y3JlZGVudGlhbHMuc3BhY2V9L3Jlc291cmNlcy9BcHBzTW5ndC91c2VyP3BsYXRmb3JtPSR7Y3JlZGVudGlhbHMudGVuYW50fSZpZD0ke2lkfWA7XHJcblxyXG4gIF9odHRwQ2FsbEF1dGhlbnRpY2F0ZWQodXJsLCB7XHJcbiAgICBvbkNvbXBsZXRlKHJlc3BvbnNlLCBoZWFkZXJzLCB4aHIpIHtcclxuICAgICAgY29uc3QgaW5mbyA9IEpTT04ucGFyc2UocmVzcG9uc2UpO1xyXG4gICAgICAvL2NvbnNvbGUubG9nKFwiX0FwcE1uZ3RfZ2V0X2luZm9fdXNlciA9PiBcIiwgaW5mbyk7XHJcbiAgICAgIGlmIChvbkRvbmUpIG9uRG9uZShpbmZvKTtcclxuICAgIH0sXHJcblxyXG4gICAgb25GYWlsdXJlKHJlc3BvbnNlLCBoZWFkZXJzKSB7XHJcbiAgICAgIGNvbnN0IGluZm8gPSByZXNwb25zZTtcclxuICAgICAgaW5mb1tcIm1zZ1wiXSA9IGhlYWRlcnMuZXJyb3Jtc2c7XHJcbiAgICAgIGluZm9bXCJlcnJDb2RlXCJdID0gaGVhZGVycy5lcnJvcmNvZGU7XHJcblxyXG4gICAgICBpZiAob25FcnJvcikgb25FcnJvcihpbmZvKTtcclxuICAgIH0sXHJcbiAgfSk7XHJcbn1cclxuIiwiaW1wb3J0IHsgX2h0dHBDYWxsQXV0aGVudGljYXRlZCB9IGZyb20gXCIuLi9tYWluLzNkZXhwZXJpZW5jZV9hcGlcIjtcclxuXHJcbi8vTElOSyAtIGh0dHBzOi8vbWVkaWEuM2RzLmNvbS9zdXBwb3J0L2RvY3VtZW50YXRpb24vZGV2ZWxvcGVyL0Nsb3VkL2VuL0VuZ2xpc2gvQ0FBaTNEWFVHUkVTVC9Vc2Vyc0dyb3VwX3YxLmh0bSNcclxuLy8hU0VDVElPTiwgUG91ciBmYWlyZSBkZXMgbW9kaWZpY2F0aW9uIGRlIFVHIGlsIGZhdXQgw6p0cmUgT1dORVJcclxuXHJcbi8vIFVSSSBkZSB0ZXN0IHN1ciBsZSB0ZW5hbnQgUElWRVRFQVVfVEVTVDpcclxuY29uc3QgX3VyaSA9IFwidXVpZDozZmNiNjFmMi02NDE3LTQ3NmQtOGE5Yy1hMTZmYjg4ODc3MWVcIjtcclxuXHJcbmNvbnN0IHRvcEhlYWRlciA9IHtcclxuICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICBBY2NlcHQ6IFwiYXBwbGljYXRpb24vanNvbix0ZXh0L2phdmFzY3JpcHQsKi8qXCIsXHJcbn07XHJcblxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIExhIGZvbmN0aW9uIGBjcmVhdGVVc2VyR3JvdXBzYCBjcsOpZSB1biBub3V2ZWF1IGdyb3VwZSBkJ3V0aWxpc2F0ZXVycyBhdmVjIGxlcyBkw6l0YWlscyBldCBsZXMgbWVtYnJlc1xyXG4gKiBzcMOpY2lmacOpcy4gQXR0ZW50aW9uLCBsJ2luZGV4YXRpb24gZHUgVXNlckdyb3VwIG1ldCBkdSB0ZW1wcy5cclxuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBjcmVkZW50aWFscyAtIFVuIG9iamV0IGNvbnRlbmFudCBsZXMgaW5mb3JtYXRpb25zIGQnaWRlbnRpZmljYXRpb24gcmVxdWlzZXMgcG91ciBhdXRoZW50aWZpZXJcclxuICogbGEgZGVtYW5kZS4gSWwgaW5jbHV0IGfDqW7DqXJhbGVtZW50IGRlcyBwcm9wcmnDqXTDqXMgdGVsbGVzIHF1ZSDCqyB0b2tlbiDCuywgwqsgc3BhY2UgwrssIMKrIHRlbmFudCDCuyBldCDCqyBjdHggwrsuXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjcmVkZW50aWFscy5zcGFjZSAtIEwnVVJMIGR1IHNlcnZldXIgc3VyIGxlcXVlbCBsJ0FQSSBlc3QgZMOpcGxvecOpZS4oZXg6IDNEU3BhY2UgPT4oaHR0cHM6Ly9yMTEzMjEwMDk2ODQ0Ny1ldTEtc3BhY2UuM2RleHBlcmllbmNlLjNkcy5jb20vZW5vdmlhKSwgM0RTd3ltLCB1c2Vyc2dyb3VwLCAzRENvbXBhc3MuLi4pXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBjcmVkZW50aWFscy5jdXJyZW50VXNlci5lbWFpbCAtIExlIHBhcmFtw6h0cmUgYGN1cnJlbnRVc2VyYCBlc3QgdW4gcXVpIGNvbnRpZW50IGxlcyBpbmZvcm1hdGlvbnMgZGUgbCd1dGlsaXNhdGV1ciBxdWkgZW52b2llIGxlIG1lc3NhZ2UoYXBwZWxlciBkZXB1aXMgbGEgZm9uY3Rpb24gYF8zRFN3eW1fZ2V0X2N1cnJlbnR1c2VyYCkuXHJcbiAqIFxyXG4gKiBAcGFyYW0ge09iamVjdH0gZGF0YXMgLSBMZXMgaW5mb3JtYXRpb25zIGR1IGdyb3VwZSBkJ3V0aWxpc2F0ZXVycy5cclxuICogQHBhcmFtIHtTdHJpbmd9IGRhdGFzLnRpdGxlIC0gTGUgdGl0cmUgZHUgZ3JvdXBlIGQndXRpbGlzYXRldXJzLiBFbnRyZSAzIGV0IDEyOCBjYXJhY3RlzIByZXMsIG9ibGlnYXRvaXJlLlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gZGF0YXMuZGVzY3JpcHRpb24gLSBMYSBkZXNjcmlwdGlvbiBkdSBncm91cGUgZCd1dGlsaXNhdGV1cnMuIDUxMiBjYXJhY3RlzIByZXMgbWF4LlxyXG4gKiBAcGFyYW0ge0FycmF5fSBkYXRhcy5tZW1iZXJzIC0gVW4gdGFibGVhdSBkJ2VtYWlscyBkZXMgbWVtYnJlcyBkdSBncm91cGUgZCd1dGlsaXNhdGV1cnMuIDEwMCBtYXggZW1haWwgcGFyIGdyb3VwZS5cclxuICogQHBhcmFtIHtTdHJpbmd9IGRhdGFzLnNoYXJpbmcgLSBMZSBkcm9pdCBkZSBwYXJ0YWdlIGR1IGdyb3VwZSBkJ3V0aWxpc2F0ZXVycy4gb3duZXIvbWFuYWdlci92aWV3ZXJcclxuICogQHBhcmFtIHtTdHJpbmd9IGRhdGFzLnZpc2liaWxpdHkgLSBMYSB2aXNpYmlsaXTDqSBkdSBncm91cGUgZCd1dGlsaXNhdGV1cnMuIHB1YmxpYy9wcml2YXRlXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkRvbmVdIC0gVW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBsb3JzcXVlIGwnYXBwZWwgZCdBUEkgcsOpdXNzaXQgZXQgcXVlIGxlc1xyXG4gKiBncm91cGVzIGQndXRpbGlzYXRldXJzIHNvbnQgY3LDqcOpcy4gSWwgcmVjZXZyYSBsZXMgZG9ubsOpZXMgZGUgcsOpcG9uc2UgY29tbWUgYXJndW1lbnQuXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkVycm9yXSAtIExlIHBhcmFtw6h0cmUgYG9uRXJyb3JgIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIHMnaWwgeSBhIHVuZVxyXG4gKiBlcnJldXIgbG9ycyBkZSBsJ2V4w6ljdXRpb24gZGUgbGEgZm9uY3Rpb24gYGNyZWF0ZVVzZXJHcm91cHNgLiBJbCB2b3VzIHBlcm1ldCBkZSBnw6lyZXIgZXQgZGUgdHJhaXRlclxyXG4gKiBsJ2VycmV1ciBkZSBtYW5pw6hyZSBwZXJzb25uYWxpc8OpZS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVVc2VyR3JvdXBzKFxyXG4gIGNyZWRlbnRpYWxzLFxyXG4gIGRhdGFzLFxyXG4gIG9uRG9uZSA9IHVuZGVmaW5lZCxcclxuICBvbkVycm9yID0gdW5kZWZpbmVkLFxyXG4pIHtcclxuICBjb25zdCB7IHNwYWNlLCBjdXJyZW50VXNlciB9ID0gY3JlZGVudGlhbHM7XHJcbiAgY29uc3QgVVJMID0ge1xyXG4gICAgVVJJVUdyOiBcIi8zZHJkZnBlcnNpc3QvcmVzb3VyY2VzL3YxL3VzZXJzZ3JvdXBcIixcclxuICB9O1xyXG4gIGNvbnN0IHVybCA9IGAke3NwYWNlfSR7VVJMLlVSSVVHcn1gO1xyXG5cclxuICBjb25zdCB0ZW1wbGF0ZURhdGEgPSB7XHJcbiAgICBncm91cHM6IFtcclxuICAgICAge1xyXG4gICAgICAgIHRpdGxlOiBkYXRhcy50aXRsZSxcclxuICAgICAgICBkZXNjcmlwdGlvbjogZGF0YXMuZGVzY3JpcHRpb24sXHJcbiAgICAgICAgbWVtYmVyczogZGF0YXMubWVtYmVycyB8fCBbY3VycmVudFVzZXIuZW1haWwsIFwic2FtdWVsLm11cmVhdUBiZWFtMy5mclwiXSxcclxuICAgICAgICBwZW5kaW5nX21lbWJlcnM6IFtdLFxyXG4gICAgICAgIHNoYXJpbmc6IGRhdGFzLnNoYXJpbmcsXHJcbiAgICAgICAgdmlzaWJpbGl0eTogZGF0YXMudmlzaWJpbGl0eSxcclxuICAgICAgfSxcclxuICAgIF0sXHJcbiAgfTtcclxuXHJcbiAgX2h0dHBDYWxsQXV0aGVudGljYXRlZCh1cmwsIHtcclxuICAgIG1ldGhvZDogXCJQT1NUXCIsXHJcbiAgICBoZWFkZXJzOiB0b3BIZWFkZXIsXHJcbiAgICBkYXRhOiBKU09OLnN0cmluZ2lmeSh0ZW1wbGF0ZURhdGEpLFxyXG4gICAgb25Db21wbGV0ZShyZXNwb25zZSkge1xyXG4gICAgICBpZiAob25Eb25lKSBvbkRvbmUoSlNPTi5wYXJzZShyZXNwb25zZSkpO1xyXG4gICAgfSxcclxuICAgIG9uRmFpbHVyZShlcnIsIGhlYWRlcnMpIHtcclxuICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgY29uc3QgaW5mbyA9IGVycjtcclxuICAgICAgaW5mb1tcIm1zZ1wiXSA9IGhlYWRlcnMuZXJyb3Jtc2c7XHJcbiAgICAgIGluZm9bXCJlcnJDb2RlXCJdID0gaGVhZGVycy5lcnJvcmNvZGU7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwi4p2MIHNlbmREaXJlY3RNZXNzYWdlID0+IFwiLCBpbmZvKTtcclxuICAgICAgaWYgKG9uRXJyb3IpIG9uRXJyb3IoaW5mbyk7XHJcbiAgICB9LFxyXG4gIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIExhIGZvbmN0aW9uIGBnZXRDb21wbGVtZW50VUdgIGVmZmVjdHVlIHVuZSByZXF1w6p0ZSBHRVQgdmVycyB1biBVUkkgc3DDqWNpZmnDqSBhdmVjIGxlcyBpbmZvcm1hdGlvbnNcclxuICogZCdhdXRoZW50aWZpY2F0aW9uIGV0IHJlbnZvaWUgbGEgcsOpcG9uc2UuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBjcmVkZW50aWFscyAtIFVuIG9iamV0IGNvbnRlbmFudCBsZXMgaW5mb3JtYXRpb25zIGQnaWRlbnRpZmljYXRpb24gcmVxdWlzZXMgcG91ciBhdXRoZW50aWZpZXJcclxuICogbGEgZGVtYW5kZS4gSWwgaW5jbHV0IGfDqW7DqXJhbGVtZW50IGRlcyBwcm9wcmnDqXTDqXMgdGVsbGVzIHF1ZSDCqyB0b2tlbiDCuywgwqsgc3BhY2UgwrssIMKrIHRlbmFudCDCuyBldCDCqyBjdHggwrsuXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjcmVkZW50aWFscy5zcGFjZSAtIEwnVVJMIGR1IHNlcnZldXIgc3VyIGxlcXVlbCBsJ0FQSSBlc3QgZMOpcGxvecOpZS4oZXg6IDNEU3BhY2UgPT4oaHR0cHM6Ly9yMTEzMjEwMDk2ODQ0Ny1ldTEtc3BhY2UuM2RleHBlcmllbmNlLjNkcy5jb20vZW5vdmlhKSwgM0RTd3ltLCB1c2Vyc2dyb3VwLCAzRENvbXBhc3MuLi4pXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjcmVkZW50aWFscy50ZW5hbnQgLSBMJ2lkZW50aWZpYW50IGR1IHRlbmFudCBzdXIgbGVxdWVsIGwnQVBJIGVzdCBkw6lwbG95w6llLihleDogUjExMzIxMDA5Njg0NDcpXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBbdXJpXSAtIExlIHBhcmFtw6h0cmUgYHVyaWAgZXN0IGwnaWRlbnRpZmlhbnQgZGUgbGEgcmVzc291cmNlIGRvbnQgdm91cyBzb3VoYWl0ZXogcsOpY3Vww6lyZXIgbGVcclxuICogY29tcGzDqW1lbnQuIChleDogdXVpZDpkY2FkMTRjYy01YmNkLTQ1ZmQtYTU0ZC0yNDZiOTUwNDdkNDUpXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkRvbmVdIC0gTGUgcGFyYW3DqHRyZSBgb25Eb25lYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBsb3JzcXVlIGxhXHJcbiAqIHJlcXXDqnRlIEhUVFAgc2VyYSB0ZXJtaW7DqWUgYXZlYyBzdWNjw6hzLiBJbCBwcmVuZCB1biBhcmd1bWVudCwgcXVpIGNvcnJlc3BvbmQgYXV4IGRvbm7DqWVzIGRlIHLDqXBvbnNlXHJcbiAqIGRlIGxhIHJlcXXDqnRlLlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25FcnJvcl0gLSBMZSBwYXJhbcOodHJlIGBvbkVycm9yYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBzJ2lsIHkgYSB1bmVcclxuICogZXJyZXVyIGxvcnMgZGUgbCdleMOpY3V0aW9uIGRlIGxhIGZvbmN0aW9uIGBnZXRDb21wbGVtZW50VUdgLiBJbCB2b3VzIHBlcm1ldCBkZSBnw6lyZXIgZXQgZGUgdHJhaXRlclxyXG4gKiBsZXMgaW5mb3JtYXRpb25zIGQnZXJyZXVyLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbXBsZW1lbnRVRyhcclxuICBjcmVkZW50aWFscyxcclxuICB1cmksXHJcbiAgb25Eb25lID0gdW5kZWZpbmVkLFxyXG4gIG9uRXJyb3IgPSB1bmRlZmluZWQsXHJcbikge1xyXG4gIGNvbnN0IHsgc3BhY2UsIHRlbmFudCB9ID0gY3JlZGVudGlhbHM7XHJcbiAgY29uc3QgYmFzZVVSTCA9IHNwYWNlO1xyXG4gIGNvbnN0IFVSSSA9IGAvM2RyZGZwZXJzaXN0L3YxL3Jlc291cmNlcy8ke3VyaX1gO1xyXG4gIGNvbnN0IE9QVHMgPSBgPyRtYXNrPWRzYWNjZXNzOk1hc2suR3JvdXBVSS5Qcm9wZXJ0aWVzJnRlbmFudD1kc3RlbmFudDoke3RlbmFudH1gO1xyXG4gIGNvbnN0IFVSTCA9IGAke2Jhc2VVUkx9JHtVUkl9JHtPUFRzfWA7XHJcblxyXG4gIGNvbnN0IGhlYWRlcnMgPSB7XHJcbiAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgIEFjY2VwdDogXCJhcHBsaWNhdGlvbi9qc29uLHRleHQvamF2YXNjcmlwdCwqLypcIixcclxuICB9O1xyXG4gIGNvbnN0IG9wdHMgPSB7XHJcbiAgICBtZXRob2Q6IFwiR0VUXCIsXHJcbiAgICBoZWFkZXJzOiBoZWFkZXJzLFxyXG4gIH07XHJcblxyXG4gIF9odHRwQ2FsbEF1dGhlbnRpY2F0ZWQoVVJMLCB7XHJcbiAgICBvcHRzLFxyXG4gICAgb25Db21wbGV0ZShyZXNwb25zZSkge1xyXG4gICAgICBpZiAob25Eb25lKSBvbkRvbmUoSlNPTi5wYXJzZShyZXNwb25zZSkpO1xyXG4gICAgfSxcclxuICAgIG9uRmFpbHVyZShlcnIsIGhlYWRlcnMpIHtcclxuICAgICAgY29uc3QgaW5mbyA9IGVycjtcclxuICAgICAgaW5mb1tcIm1zZ1wiXSA9IGhlYWRlcnMuZXJyb3Jtc2c7XHJcbiAgICAgIGluZm9bXCJlcnJDb2RlXCJdID0gaGVhZGVycy5lcnJvcmNvZGU7XHJcblxyXG4gICAgICBpZiAob25FcnJvcikgb25FcnJvcihpbmZvKTtcclxuICAgIH0sXHJcbiAgfSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gTGEgZm9uY3Rpb24gYGdldFVzZXJzR3JvdXBSdWxlc2AgZWZmZWN0dWUgdW5lIHJlcXXDqnRlIEhUVFAgR0VUIHBvdXIgcsOpY3Vww6lyZXIgdW5lIGxpc3RlIGRlXHJcbiAqIHJlc3BvbnNhYmlsaXTDqXMgZGUgZ3JvdXBlIHBvdXIgdW4gZ3JvdXBlIGQndXRpbGlzYXRldXJzLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gY3JlZGVudGlhbHMgLSBVbiBvYmpldCBjb250ZW5hbnQgbGVzIGluZm9ybWF0aW9ucyBkJ2lkZW50aWZpY2F0aW9uIHJlcXVpc2VzIHBvdXIgYXV0aGVudGlmaWVyXHJcbiAqIGxhIGRlbWFuZGUuIElsIGluY2x1dCBnw6luw6lyYWxlbWVudCBkZXMgcHJvcHJpw6l0w6lzIHRlbGxlcyBxdWUgwqsgdG9rZW4gwrssIMKrIHNwYWNlIMK7LCDCqyB0ZW5hbnQgwrsgZXQgwqsgY3R4IMK7LlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMuc3BhY2UgLSBMJ1VSTCBkdSBzZXJ2ZXVyIHN1ciBsZXF1ZWwgbCdBUEkgZXN0IGTDqXBsb3nDqWUuKGV4OiAzRFNwYWNlID0+KGh0dHBzOi8vcjExMzIxMDA5Njg0NDctZXUxLXNwYWNlLjNkZXhwZXJpZW5jZS4zZHMuY29tL2Vub3ZpYSksIDNEU3d5bSwgdXNlcnNncm91cCwgM0RDb21wYXNzLi4uKVxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMudGVuYW50IC0gTCdpZGVudGlmaWFudCBkdSB0ZW5hbnQgc3VyIGxlcXVlbCBsJ0FQSSBlc3QgZMOpcGxvecOpZS4oZXg6IFIxMTMyMTAwOTY4NDQ3KVxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25Eb25lXSAtIExlIHBhcmFtw6h0cmUgYG9uRG9uZWAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgbG9yc3F1ZSBsYVxyXG4gKiByZXF1w6p0ZSBIVFRQIHNlcmEgdGVybWluw6llIGF2ZWMgc3VjY8Oocy4gSWwgZmF1dCB1biBhcmd1bWVudCwgcXVpIGNvcnJlc3BvbmQgYXV4IGRvbm7DqWVzIGRlIHLDqXBvbnNlXHJcbiAqIGFuYWx5c8OpZXMgYXUgZm9ybWF0IEpTT04uXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkVycm9yXSAtIExlIHBhcmFtw6h0cmUgYG9uRXJyb3JgIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIHMnaWwgeSBhIHVuZVxyXG4gKiBlcnJldXIgbG9ycyBkZSBsJ2V4w6ljdXRpb24gZGUgbGEgZm9uY3Rpb24gYGdldFVzZXJzR3JvdXBSdWxlc2AuIEMnZXN0IHVuIHBhcmFtw6h0cmUgZmFjdWx0YXRpZiwgZG9uY1xyXG4gKiBzJ2lsIG4nZXN0IHBhcyBmb3VybmksIGxhIGZvbmN0aW9uIG5lIGZlcmEgcmllbiBlbiBjYXMgZCdlcnJldXIuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0VXNlcnNHcm91cFJ1bGVzKFxyXG4gIGNyZWRlbnRpYWxzLFxyXG4gIG9uRG9uZSA9IHVuZGVmaW5lZCxcclxuICBvbkVycm9yID0gdW5kZWZpbmVkLFxyXG4pIHtcclxuICBjb25zdCB7IHNwYWNlLCB0ZW5hbnQgfSA9IGNyZWRlbnRpYWxzO1xyXG4gIGNvbnN0IGJhc2VVUkwgPSBzcGFjZTtcclxuICBjb25zdCBVUkkgPVxyXG4gICAgXCIvM2RyZGZwZXJzaXN0L3Jlc291cmNlcy92MS9vcHRpb24tc2V0cy9kc3VzZXJncm91cDpMaXN0T2ZHcm91cFJlc3BvbnNpYmlsaXRpZXMvb3B0aW9uc1wiO1xyXG4gIGNvbnN0IE9QVFMgPSBgP3RlbmFudD1kc3RlbmFudDoke3RlbmFudH1gO1xyXG4gIGNvbnN0IE9QVHNIID0ge1xyXG4gICAgbWV0aG9kOiBcIkdFVFwiLFxyXG4gICAgQWNjZXB0OiBcImFwcGxpY2F0aW9uL2pzb24sKi8qLHRlc3QvamF2YXNjcmlwdFwiLFxyXG4gIH07XHJcbiAgY29uc3QgVVJMID0gYCR7YmFzZVVSTH0ke1VSSX0ke09QVFN9YDtcclxuXHJcbiAgX2h0dHBDYWxsQXV0aGVudGljYXRlZChVUkwsIHtcclxuICAgIE9QVHNILFxyXG4gICAgb25Db21wbGV0ZShyZXNwb25zZSkge1xyXG4gICAgICBpZiAob25Eb25lKSBvbkRvbmUoSlNPTi5wYXJzZShyZXNwb25zZSkpO1xyXG4gICAgfSxcclxuICAgIG9uRmFpbHVyZShlcnIsIGhlYWRlcnMpIHtcclxuICAgICAgY29uc3QgaW5mbyA9IGVycjtcclxuICAgICAgaW5mb1tcIm1zZ1wiXSA9IGhlYWRlcnMuZXJyb3Jtc2c7XHJcbiAgICAgIGluZm9bXCJlcnJDb2RlXCJdID0gaGVhZGVycy5lcnJvcmNvZGU7XHJcblxyXG4gICAgICBpZiAob25FcnJvcikgb25FcnJvcihpbmZvKTtcclxuICAgIH0sXHJcbiAgfSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gTGEgZm9uY3Rpb24gwqsgZ2V0VXNlckdyb3Vwc0xpc3QgwrsgcsOpY3Vww6hyZSB1bmUgbGlzdGUgZGUgZ3JvdXBlcyBkJ3V0aWxpc2F0ZXVycyBkJ3VuIHNlcnZldXIgZW5cclxuICogdXRpbGlzYW50IGxlcyBpbmZvcm1hdGlvbnMgZCdpZGVudGlmaWNhdGlvbiBmb3VybmllcyBldCBhcHBlbGxlIGxhIGZvbmN0aW9uIGRlIHJhcHBlbCDCqyBvbkRvbmUgwrtcclxuICogYXZlYyBsYSByw6lwb25zZS5cclxuICogQHBhcmFtIHtPYmplY3R9IGNyZWRlbnRpYWxzIC0gVW4gb2JqZXQgY29udGVuYW50IGxlcyBpbmZvcm1hdGlvbnMgZCdpZGVudGlmaWNhdGlvbiByZXF1aXNlcyBwb3VyIGF1dGhlbnRpZmllclxyXG4gKiBsYSBkZW1hbmRlLiBJbCBpbmNsdXQgZ8OpbsOpcmFsZW1lbnQgZGVzIHByb3ByacOpdMOpcyB0ZWxsZXMgcXVlIMKrIHRva2VuIMK7LCDCqyBzcGFjZSDCuywgwqsgdGVuYW50IMK7IGV0IMKrIGN0eCDCuy5cclxuICogQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLnNwYWNlIC0gTCdVUkwgZHUgc2VydmV1ciBzdXIgbGVxdWVsIGwnQVBJIGVzdCBkw6lwbG95w6llLihleDogM0RTcGFjZSA9PihodHRwczovL3IxMTMyMTAwOTY4NDQ3LWV1MS1zcGFjZS4zZGV4cGVyaWVuY2UuM2RzLmNvbS9lbm92aWEpLCAzRFN3eW0sIHVzZXJzZ3JvdXAsIDNEQ29tcGFzcy4uLilcclxuICogQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLnRlbmFudCAtIEwnaWRlbnRpZmlhbnQgZHUgdGVuYW50IHN1ciBsZXF1ZWwgbCdBUEkgZXN0IGTDqXBsb3nDqWUuKGV4OiBSMTEzMjEwMDk2ODQ0NylcclxuICogQHBhcmFtIHtPYmplY3R9IGNyZWRlbnRpYWxzLmN1cnJlbnRVc2VyLmVtYWlsIC0gTGUgcGFyYW3DqHRyZSBgY3VycmVudFVzZXJgIGVzdCB1biBxdWkgY29udGllbnQgbGVzIGluZm9ybWF0aW9ucyBkZSBsJ3V0aWxpc2F0ZXVyIHF1aSBlbnZvaWUgbGUgbWVzc2FnZShhcHBlbGVyIGRlcHVpcyBsYSBmb25jdGlvbiBgXzNEU3d5bV9nZXRfY3VycmVudHVzZXJgKVxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25Eb25lXSAtIFVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgbG9yc3F1ZSBsJ29ww6lyYXRpb24gc2VyYSB0ZXJtaW7DqWUgYXZlY1xyXG4gKiBzdWNjw6hzLiBJbCByZWNldnJhIGxhIHLDqXBvbnNlIGVuIHBhcmFtw6h0cmUuXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkVycm9yXSAtIExlIHBhcmFtw6h0cmUgYG9uRXJyb3JgIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIHMnaWwgeSBhIHVuZVxyXG4gKiBlcnJldXIgbG9ycyBkZSBsJ2V4w6ljdXRpb24gZGUgbGEgZm9uY3Rpb24gYGdldFVzZXJHcm91cHNMaXN0YC4gSWwgdm91cyBwZXJtZXQgZGUgZ8OpcmVyIGV0IGRlXHJcbiAqIHLDqXBvbmRyZSDDoCB0b3V0ZSBlcnJldXIgcXVpIHNlIHByb2R1aXQuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0VXNlckdyb3Vwc0xpc3QoXHJcbiAgY3JlZGVudGlhbHMsXHJcbiAgb25Eb25lID0gdW5kZWZpbmVkLFxyXG4gIG9uRXJyb3IgPSB1bmRlZmluZWQsXHJcbikge1xyXG4gIGNvbnN0IHsgc3BhY2UsIGN1cnJlbnRVc2VyIH0gPSBjcmVkZW50aWFscztcclxuICBjb25zdCBVUkkgPSBcIi8zZHJkZnBlcnNpc3QvcmVzb3VyY2VzL3YxL3VzZXJzZ3JvdXBcIjtcclxuICBjb25zdCBvcHQgPVxyXG4gICAgXCI/c2VsZWN0PXVyaSx0aXRsZSxkZXNjcmlwdGlvbixvd25lcixtZW1iZXJzLHBlbmRpbmdfbWVtYmVycyxjcmVhdGlvbl9kYXRlLG1vZGlmaWNhdGlvbl9kYXRlLHZpc2liaWxpdHlcIjtcclxuICBjb25zdCB1cmwgPSBgJHtzcGFjZX0ke1VSSX0ke29wdH1gO1xyXG4gIGNvbnN0IGhlYWRlciA9IHtcclxuICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgQWNjZXB0OiBcImFwcGxpY2F0aW9uL2pzb24sdGV4dC9qYXZhc2NyaXB0LCovKlwiLFxyXG4gIH07XHJcbiAgY29uc3Qgb3B0cyA9IHsgbWV0aG9kOiBcIkdFVFwiLCBoZWFkZXJzOiBoZWFkZXIgfTtcclxuICB0cnkge1xyXG4gICAgX2h0dHBDYWxsQXV0aGVudGljYXRlZCh1cmwsIHtcclxuICAgICAgb3B0cyxcclxuICAgICAgb25Db21wbGV0ZShyZXNwb25zZSkge1xyXG4gICAgICAgIGNvbnN0IHJlcFVHID0gSlNPTi5wYXJzZShyZXNwb25zZSk7XHJcbiAgICAgICAgY29uc3QgcmVwb25zZSA9IHt9O1xyXG4gICAgICAgIGNvbnN0IFVHID0gcmVwVUcuZ3JvdXBzLmZpbHRlcigoZWxlbWVudCkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIGVsZW1lbnQudXJpLnN0YXJ0c1dpdGgoXCJ1dWlkOlwiKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKGN1cnJlbnRVc2VyICYmIE9iamVjdC5rZXlzKGN1cnJlbnRVc2VyKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBjb25zdCBpYW1Pd25lciA9IFVHLmZpbHRlcigoZWxlbWVudCkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5vd25lciA9PT0gY3VycmVudFVzZXIuZW1haWw7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIGNvbnN0IGlhbU1lbWJlciA9IFVHLmZpbHRlcigoZWxlbWVudCkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5tZW1iZXJzLmluY2x1ZGVzKGN1cnJlbnRVc2VyLmVtYWlsKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgY29uc3QgaWFtID0gaWFtT3duZXIuY29uY2F0KGlhbU1lbWJlcik7XHJcbiAgICAgICAgICByZXBvbnNlW1wiaWFtXCJdID0gaWFtO1xyXG4gICAgICAgICAgcmVwb25zZVtcIlVHXCJdID0gVUc7XHJcbiAgICAgICAgICByZXBvbnNlW1wiaWFtTWVtYmVyXCJdID0gaWFtTWVtYmVyO1xyXG5cclxuICAgICAgICAgIGdldFVzZXJzR3JvdXBSdWxlcyhcclxuICAgICAgICAgICAgY3JlZGVudGlhbHMsXHJcbiAgICAgICAgICAgIChydWxlcykgPT4ge1xyXG4gICAgICAgICAgICAgIHJlcG9uc2VbXCJydWxlc1wiXSA9IHJ1bGVzO1xyXG4gICAgICAgICAgICAgIGlmIChvbkRvbmUpIG9uRG9uZShyZXBvbnNlKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgKGVycikgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChvbkVycm9yKSBvbkVycm9yKGVycik7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgb25GYWlsdXJlKGVycikge1xyXG4gICAgICAgIGlmIChvbkVycm9yKSBvbkVycm9yKGVycik7XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBMYSBmb25jdGlvbiBkZWxldGVVc2VyR3JvdXBzIGVzdCB1dGlsaXPDqWUgcG91ciBzdXBwcmltZXIgZGVzIGdyb3VwZXMgZCd1dGlsaXNhdGV1cnMgw6AgbCdhaWRlIGRlc1xyXG4gKiBpbmZvcm1hdGlvbnMgZCdpZGVudGlmaWNhdGlvbiBldCBkZSBsJ1VSSSBmb3VybmlzLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gY3JlZGVudGlhbHMgLSBVbiBvYmpldCBjb250ZW5hbnQgbGVzIGluZm9ybWF0aW9ucyBkJ2lkZW50aWZpY2F0aW9uIHJlcXVpc2VzIHBvdXIgYXV0aGVudGlmaWVyXHJcbiAqIGxhIGRlbWFuZGUuIElsIGluY2x1dCBnw6luw6lyYWxlbWVudCBkZXMgcHJvcHJpw6l0w6lzIHRlbGxlcyBxdWUgwqsgdG9rZW4gwrssIMKrIHNwYWNlIMK7LCDCqyB0ZW5hbnQgwrsgZXQgwqsgY3R4IMK7LlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMuc3BhY2UgLSBMJ1VSTCBkdSBzZXJ2ZXVyIHN1ciBsZXF1ZWwgbCdBUEkgZXN0IGTDqXBsb3nDqWUuKGV4OiAzRFNwYWNlID0+KGh0dHBzOi8vcjExMzIxMDA5Njg0NDctZXUxLXNwYWNlLjNkZXhwZXJpZW5jZS4zZHMuY29tL2Vub3ZpYSksIDNEU3d5bSwgdXNlcnNncm91cCwgM0RDb21wYXNzLi4uKVxyXG4gKiBAcGFyYW0ge1N0cmluZ30gW3VyaV0gLSBMZSBwYXJhbcOodHJlIGB1cmlgIGVzdCBsJ2lkZW50aWZpYW50IGR1IGdyb3VwZSBkJ3V0aWxpc2F0ZXVycyBxdWUgdm91cyBzb3VoYWl0ZXpcclxuICogc3VwcHJpbWVyLiBJbCBlc3QgdXRpbGlzw6kgcG91ciBjb25zdHJ1aXJlIGwnVVJMIGRlIGxhIHJlcXXDqnRlIERFTEVURS4oZXg6IHV1aWQ6ZGNhZDE0Y2MtNWJjZC00NWZkLWE1NGQtMjQ2Yjk1MDQ3ZDQ1KVxyXG4gKi9cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBkZWxldGVVc2VyR3JvdXBzKGNyZWRlbnRpYWxzLCB1cmkpIHtcclxuICBjb25zdCB7IHNwYWNlIH0gPSBjcmVkZW50aWFscztcclxuICBjb25zdCBVUkkgPSBcIi8zZHJkZnBlcnNpc3QvcmVzb3VyY2VzL3YxL3VzZXJzZ3JvdXBcIjtcclxuICBjb25zdCB1cmwgPSBgJHtzcGFjZX0ke1VSSX0vJHt1cml9YDtcclxuXHJcbiAgY29uc3Qgb3B0cyA9IHtcclxuICAgIG1ldGhvZDogXCJERUxFVEVcIixcclxuICB9O1xyXG4gIF9odHRwQ2FsbEF1dGhlbnRpY2F0ZWQodXJsLCBvcHRzKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBMYSBmb25jdGlvbiBgcGF0Y2hVc2VyR3JvdXBzYCBlc3QgdXRpbGlzw6llIHBvdXIgbWV0dHJlIMOgIGpvdXIgbGVzIGdyb3VwZXMgZCd1dGlsaXNhdGV1cnMgZW4gZW52b3lhbnRcclxuICogdW5lIHJlcXXDqnRlIFBBVENIIMOgIHVuIFVSSSBzcMOpY2lmacOpIGF2ZWMgbGVzIGRvbm7DqWVzIGZvdXJuaWVzLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gY3JlZGVudGlhbHMgLSBVbiBvYmpldCBjb250ZW5hbnQgbGVzIGluZm9ybWF0aW9ucyBkJ2lkZW50aWZpY2F0aW9uIHJlcXVpc2VzIHBvdXIgYXV0aGVudGlmaWVyXHJcbiAqIGxhIGRlbWFuZGUuIElsIGluY2x1dCBnw6luw6lyYWxlbWVudCBkZXMgcHJvcHJpw6l0w6lzIHRlbGxlcyBxdWUgwqsgdG9rZW4gwrssIMKrIHNwYWNlIMK7LCDCqyB0ZW5hbnQgwrsgZXQgwqsgY3R4IMK7LlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMuc3BhY2UgLSBMJ1VSTCBkdSBzZXJ2ZXVyIHN1ciBsZXF1ZWwgbCdBUEkgZXN0IGTDqXBsb3nDqWUuKGV4OiAzRFNwYWNlID0+KGh0dHBzOi8vcjExMzIxMDA5Njg0NDctZXUxLXNwYWNlLjNkZXhwZXJpZW5jZS4zZHMuY29tL2Vub3ZpYSksIDNEU3d5bSwgdXNlcnNncm91cCwgM0RDb21wYXNzLi4uKVxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMudGVuYW50IC0gTCdpZGVudGlmaWFudCBkdSB0ZW5hbnQgc3VyIGxlcXVlbCBsJ0FQSSBlc3QgZMOpcGxvecOpZS4oZXg6IFIxMTMyMTAwOTY4NDQ3KVxyXG4gKiBAcGFyYW0gdXJpIC0gTGUgcGFyYW3DqHRyZSBgdXJpYCBlc3QgdW5lIGNoYcOubmUgcXVpIHJlcHLDqXNlbnRlIGwnaWRlbnRpZmlhbnQgZHUgZ3JvdXBlIGQndXRpbGlzYXRldXJzXHJcbiAqIHF1ZSB2b3VzIHNvdWhhaXRleiBjb3JyaWdlci4gSWwgZXN0IHV0aWxpc8OpIHBvdXIgY29uc3RydWlyZSBsJ1VSTCBkZSBsYSByZXF1w6p0ZSBQQVRDSC4oZXg6IHV1aWQ6ZGNhZDE0Y2MtNWJjZC00NWZkLWE1NGQtMjQ2Yjk1MDQ3ZDQ1KVxyXG4gKiBAcGFyYW0ge0FycmF5T2ZPYmplY3RzfSBkYXRhcyAtIExlIHBhcmFtw6h0cmUgYGRhdGFzYCBlc3QgdW4gdGFibGVhdSBkJ29iamV0cyBxdWkgc3DDqWNpZmllbnQgbGVzIG1vZGlmaWNhdGlvbnMgw6BcclxuICogYXBwb3J0ZXIgYXV4IGdyb3VwZXMgZCd1dGlsaXNhdGV1cnMuKGV4OiBkYXRhc1swXS5vcCwgZGF0YXNbMF0uZmllbGQsIGRhdGFzWzBdLnZhbHVlKVxyXG4gKiBAcGFyYW0ge1N0cmluZ30gZGF0YXNbMF0ub3AgLSBsJ29ww6lyYXRpb24gw6AgcsOpYWxpc2VyLiAoZXg6IFwiYWRkXCIsIFwicmVtb3ZlXCIsIFwicmVwbGFjZVwiKVxyXG4gKiBAcGFyYW0ge1N0cmluZ30gZGF0YXNbMF0uZmllbGQgLSBDZSBzdXIgcXVvaSBhZ2lyIChleDogbWVtYmVyc1tdLCB0aXRsZSwgZGVzY3JpcHRpb24sIG93bmVyLCB2aXNpYmlsaXR5KVxyXG4gKiBAcGFyYW0ge1N0cmluZ09yQXJyYXl9IGRhdGFzWzBdLnZhbHVlIC0gTGEgbm91dmVsbGUgdmFsZXVyIGltcGFjdMOpZS4gU2kgY2Ugc29udCBkZXMgbWVtYnJlcyB2YWx1ZSBzZXJhIHVuIFRhYmxlYXUgZGUgU3RyaW5nLlxyXG4gXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkRvbmVdIC0gVW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBsb3JzcXVlIGxhIHJlcXXDqnRlIFBBVENIIHNlcmEgdGVybWluw6llXHJcbiAqIGF2ZWMgc3VjY8Oocy4gSWwgcmVjZXZyYSBsYSByw6lwb25zZSBlbiBwYXJhbcOodHJlLlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25FcnJvcl0gLSBMZSBwYXJhbcOodHJlIGBvbkVycm9yYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBzJ2lsIHkgYSB1bmVcclxuICogZXJyZXVyIGxvcnMgZGUgbCdleMOpY3V0aW9uIGRlIGxhIGZvbmN0aW9uIGBwYXRjaFVzZXJHcm91cHNgLiBJbCB2b3VzIHBlcm1ldCBkZSBnw6lyZXIgdG91dGVzIGxlc1xyXG4gKiBlcnJldXJzIHF1aSBzZSBwcm9kdWlzZW50IGV0IGTigJllZmZlY3R1ZXIgdG91dGUgZ2VzdGlvbiBvdSBqb3VybmFsaXNhdGlvbiBkZXMgZXJyZXVycyBuw6ljZXNzYWlyZS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBwYXRjaFVzZXJHcm91cHMoXHJcbiAgY3JlZGVudGlhbHMsXHJcbiAgdXJpLFxyXG4gIGRhdGFzLFxyXG4gIG9uRG9uZSA9IHVuZGVmaW5lZCxcclxuICBvbkVycm9yID0gdW5kZWZpbmVkLFxyXG4pIHtcclxuICBjb25zdCB7IHNwYWNlLCB0ZW5hbnQgfSA9IGNyZWRlbnRpYWxzO1xyXG4gIGNvbnN0IFVSTCA9IHtcclxuICAgIFVSSVRJOiBcIi8zZHJkZnBlcnNpc3QvcmVzb3VyY2VzL3YxL3RlbXBsYXRlLWluc3RhbmNlc1wiLFxyXG4gICAgVVJJVUdyOiBcIi8zZHJkZnBlcnNpc3QvcmVzb3VyY2VzL3YxL3VzZXJzZ3JvdXBcIixcclxuICAgIG5leHRVUklDaDogXCIvY2hhcmFjdGVyaXN0aWNzXCIsXHJcbiAgICBuZXh0VVJJR3I6IFwiL2dyb3VwXCIsXHJcbiAgICBuZXhVUkltZW06IFwiL21lbWJlcnNcIixcclxuICAgIE9QVHNUSTogYD8kbWFzaz1kc2FjY2VzczpNYXNrLkdyb3VwVUkuUHJvcGVydGllc2AsXHJcbiAgICBPUFRzVGVuYW50OiBgdGVuYW50PWRzdGVuYW50OiR7dGVuYW50fWAsXHJcbiAgfTtcclxuXHJcbiAgLy8gTGUgZm9ybWF0IGRlcyBkYXRhcyBlc3Qgb2JsaWdhdG9pcmUgOiBbe31dXHJcbiAgLy8gb3AgOiBhZGQsIHJlcGxhY2UsIHJlbW92ZVxyXG4gIC8vIGZpZWxkIDogbWVtYmVyc1tdLCBwZW5kaW5nX21lbWJlcnNbXSwgdGl0bGUsIGRlc2NyaXB0aW9uLCBvd25lciwgdmlzaWJpbGl0eVxyXG4gIC8vIHZhbHVlIDogc3RyaW5nIG91IGFycmF5XHJcblxyXG4gIGNvbnN0IGRhdGFNZW1iZXJzID0gZGF0YXM7XHJcbiAgLy8gIFtcclxuICAvLyAgIHtcclxuICAvLyAgICAgb3A6IFwiYWRkXCIsXHJcbiAgLy8gICAgIGZpZWxkOiBcIm1lbWJlcnNcIixcclxuICAvLyAgICAgdmFsdWU6IFtcInNhbXVlbC5tdXJlYXVAYmVhbTMuZnJcIl0sXHJcbiAgLy8gICB9LFxyXG4gIC8vICAge1xyXG4gIC8vICAgICBvcDogXCJyZXBsYWNlXCIsXHJcbiAgLy8gICAgIGZpZWxkOiBcInRpdGxlXCIsXHJcbiAgLy8gICAgIHZhbHVlOiBcIkJFQU3CsyBSJkQgLSBERVZcIixcclxuICAvLyAgIH0sXHJcbiAgLy8gXTtcclxuXHJcbiAgY29uc3QgYmFzZVVSTCA9IGAke3NwYWNlfSR7VVJMLlVSSVVHcn0vJHt1cml9YDsgLy8gcm91dGUgZGUgYmFzZSBwb3VyIGxlIFBBVENIIChET0MpXHJcblxyXG4gIGNvbnN0IGRhdGFNZW1iZXJzU1RSID0gSlNPTi5zdHJpbmdpZnkoZGF0YU1lbWJlcnMpO1xyXG5cclxuICBfaHR0cENhbGxBdXRoZW50aWNhdGVkKGJhc2VVUkwsIHtcclxuICAgIGhlYWRlcnM6IHRvcEhlYWRlcixcclxuICAgIG1ldGhvZDogXCJQQVRDSFwiLFxyXG4gICAgZGF0YTogZGF0YU1lbWJlcnNTVFIsXHJcbiAgICB0eXBlOiBcImpzb25cIixcclxuICAgIG9uQ29tcGxldGUocmVzcG9uc2UpIHtcclxuICAgICAgaWYgKG9uRG9uZSkgb25Eb25lKHJlc3BvbnNlKTtcclxuICAgIH0sXHJcbiAgICBvbkZhaWx1cmUoZXJyKSB7XHJcbiAgICAgIGlmIChvbkVycm9yKSBvbkVycm9yKGVycik7XHJcbiAgICB9LFxyXG4gIH0pO1xyXG59XHJcblxyXG4vL0FOQ0hPUiAtICBDT05UUk9MIChHZXN0aW9uIGRlcyBwcm9wcmnDqXRhaXJlcyBkdSBncm91cGUpXHJcblxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIExhIGZvbmN0aW9uIGBwYXRjaFVzZXJHcm91cHNDb250cm9sYCBlc3QgdXRpbGlzw6llIHBvdXIgbWV0dHJlIMOgIGpvdXIgbGUgY29udHLDtGxlIGRlcyBncm91cGVzXHJcbiAqIGQndXRpbGlzYXRldXJzIGVuIGVudm95YW50IHVuZSByZXF1w6p0ZSBQQVRDSCDDoCB1biBVUkkgc3DDqWNpZmnDqSBhdmVjIGxlcyBpbmZvcm1hdGlvbnNcclxuICogZCdpZGVudGlmaWNhdGlvbiBldCBsZXMgZG9ubsOpZXMgZm91cm5pZXMuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBjcmVkZW50aWFscyAtIFVuIG9iamV0IGNvbnRlbmFudCBsZXMgaW5mb3JtYXRpb25zIGQnaWRlbnRpZmljYXRpb24gcmVxdWlzZXMgcG91ciBhdXRoZW50aWZpZXJcclxuICogbGEgZGVtYW5kZS4gSWwgaW5jbHV0IGfDqW7DqXJhbGVtZW50IGRlcyBwcm9wcmnDqXTDqXMgdGVsbGVzIHF1ZSDCqyB0b2tlbiDCuywgwqsgc3BhY2UgwrssIMKrIHRlbmFudCDCuyBldCDCqyBjdHggwrsuXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjcmVkZW50aWFscy5zcGFjZSAtIEwnVVJMIGR1IHNlcnZldXIgc3VyIGxlcXVlbCBsJ0FQSSBlc3QgZMOpcGxvecOpZS4oZXg6IDNEU3BhY2UgPT4oaHR0cHM6Ly9yMTEzMjEwMDk2ODQ0Ny1ldTEtc3BhY2UuM2RleHBlcmllbmNlLjNkcy5jb20vZW5vdmlhKSwgM0RTd3ltLCB1c2Vyc2dyb3VwLCAzRENvbXBhc3MuLi4pXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSB1cmkgLSBMZSBwYXJhbcOodHJlIGB1cmlgIGVzdCB1bmUgY2hhw65uZSBxdWkgcmVwcsOpc2VudGUgbCdpZGVudGlmaWFudCBkdSBncm91cGUgZCd1dGlsaXNhdGV1cnNcclxuICogcXVlIHZvdXMgc291aGFpdGV6IGNvcnJpZ2VyLiBJbCBlc3QgdXRpbGlzw6kgcG91ciBjb25zdHJ1aXJlIGwnVVJMIGRlIGxhIHJlcXXDqnRlIFBBVENILihleDogdXVpZDpkY2FkMTRjYy01YmNkLTQ1ZmQtYTU0ZC0yNDZiOTUwNDdkNDUpXHJcbiAqIEBwYXJhbSB7QXJyYXlPZk9iamVjdH0gX2RhdGFzIC0gTGUgcGFyYW3DqHRyZSBgZGF0YXNgIGVzdCB1biB0YWJsZWF1IGQnb2JqZXRzIHF1aSBjb250aWVudCBsZXMgaW5mb3JtYXRpb25zXHJcbiAqIG7DqWNlc3NhaXJlcyBwb3VyIHBhdGNoZXIgbGUgY29udHLDtGxlIGRlcyBncm91cGVzIGQndXRpbGlzYXRldXJzLiAoZXggOiBkYXRhc1swXS5vcCwgIGRhdGFzWzBdLnZhbHVlKVxyXG4gKiBAcGFyYW0ge1N0cmluZ30gICBvcCAtIEwnb3DDqXJhdGlvbiBkZSBjb3JyZWN0aWYuIElsIHBldXQgw6p0cmUgJ2FkZCcsICdyZXBsYWNlJywgJ3JlbW92ZScuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSAgIHZhbHVlIC1cclxuICogQHBhcmFtIHtBcnJheX0gICB2YWx1ZS5hZ2VudHMgLSBVbiB0YWJsZWF1IGTigJl1dGlsaXNhdGV1cnMuIExlIDFlciBpbmRleCBkb2l0IMOqdHJlIMOgIHZpZGUuIChleCA6IFtcIlwiLFwiQm9iLkR5bGFuQGJlYW0zLmZyXCJdKS4gMTAwIHV0aWxpc2F0ZXVycyBtYXhpbXVtcy5cclxuICogQHBhcmFtIHtBcnJheX0gdmFsdWUucmVzcG9uc2liaWxpdGllcyAtIFVuIHRhYmxlYXUgZGUgcmVzcG9uc2liaWxpdMOpcy4gKGV4OiBbXCJkc2FjY2VzczpSZXNwb25zaWJpbGl0eS5Hcm91cC5NYWluT3duZXJcIiwgXCJkc2FjY2VzczpSZXNwb25zaWJpbGl0eS5Hcm91cC5Pd25lclwiLCBcImRzYWNjZXNzOlJlc3BvbnNpYmlsaXR5Lkdyb3VwLlZpZXdlclwiLCBcImRzYWNjZXNzOlJlc3BvbnNpYmlsaXR5Lkdyb3VwLkF1dGhvclwiLCBcImRzYWNjZXNzOlJlc3BvbnNpYmlsaXR5Lkdyb3VwU2VydmljZS5BZG1pbmlzdHJhdG9yXCJdKVxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25Eb25lXSAtIExlIHBhcmFtw6h0cmUgYG9uRG9uZWAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgbG9yc3F1ZVxyXG4gKiBsJ29ww6lyYXRpb24gZGUgcGF0Y2ggc2VyYSB0ZXJtaW7DqWUgYXZlYyBzdWNjw6hzLiBJbCBmYXV0IHVuIGFyZ3VtZW50LCBxdWkgZXN0IGxhIHLDqXBvbnNlIGR1IHNlcnZldXIuXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkVycm9yXSAtIExlIHBhcmFtw6h0cmUgYG9uRXJyb3JgIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIHMnaWwgeSBhIHVuZVxyXG4gKiBlcnJldXIgbG9ycyBkZSBsJ2V4w6ljdXRpb24gZGUgbGEgZm9uY3Rpb24gYHBhdGNoVXNlckdyb3Vwc0NvbnRyb2xgLiBJbCB2b3VzIHBlcm1ldCBkZSBnw6lyZXIgdG91dGVzXHJcbiAqIGxlcyBlcnJldXJzIHF1aSBzZSBwcm9kdWlzZW50IGV0IGTigJllZmZlY3R1ZXIgdG91dGUgZ2VzdGlvbiBvdSBqb3VybmFsaXNhdGlvbiBkZXMgZXJyZXVycyBuw6ljZXNzYWlyZS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBwYXRjaFVzZXJHcm91cHNDb250cm9sKFxyXG4gIGNyZWRlbnRpYWxzLFxyXG4gIHVyaSxcclxuICBfZGF0YXMsXHJcbiAgb25Eb25lID0gdW5kZWZpbmVkLFxyXG4gIG9uRXJyb3IgPSB1bmRlZmluZWQsXHJcbikge1xyXG4gIGNvbnN0IHsgc3BhY2UgfSA9IGNyZWRlbnRpYWxzO1xyXG4gIGNvbnN0IFVSSSA9IFwiLzNkcmRmcGVyc2lzdC9yZXNvdXJjZXMvdjEvdXNlcnNncm91cFwiO1xyXG5cclxuICBjb25zdCB1cmwgPSBgJHtzcGFjZX0ke1VSSX0vJHt1cml9L3NoYXJpbmdgO1xyXG4gIC8vbGlzdGUgZGVzIHJlc3BvbnNhYmlsaXTDqXMgOiBbXCJkc2FjY2VzczpSZXNwb25zaWJpbGl0eS5Hcm91cC5NYWluT3duZXJcIiwgXCJkc2FjY2VzczpSZXNwb25zaWJpbGl0eS5Hcm91cC5Pd25lclwiLCBcImRzYWNjZXNzOlJlc3BvbnNpYmlsaXR5Lkdyb3VwLlZpZXdlclwiLCBcImRzYWNjZXNzOlJlc3BvbnNpYmlsaXR5Lkdyb3VwLkF1dGhvclwiLCBcImRzYWNjZXNzOlJlc3BvbnNpYmlsaXR5Lkdyb3VwU2VydmljZS5BZG1pbmlzdHJhdG9yXCJdXHJcbiAgY29uc3QgZGF0YXMgPSBfZGF0YXM7XHJcbiAgLy8gW1xyXG4gIC8vICAge1xyXG4gIC8vICAgICBvcDogXCJhZGRcIiwgLy8gYWRkLCByZXBsYWNlLCByZW1vdmVcclxuICAvLyAgICAgcGF0aDogXCIvc2hhcmluZ1wiLFxyXG4gIC8vICAgICB2YWx1ZToge1xyXG4gIC8vICAgICAgIGFnZW50czogW1wiXCIsIFwic2FtdWVsLm11cmVhdUBiZWFtMy5mclwiLCBcInlhbi5jb3F1b3pAYmVhbTMuZnJcIl0sXHJcbiAgLy8gICAgICAgcmVzcG9uc2liaWxpdGllczogW1wiZHNhY2Nlc3M6UmVzcG9uc2liaWxpdHkuR3JvdXAuT3duZXJcIl0sXHJcbiAgLy8gICAgIH0sXHJcbiAgLy8gICB9LFxyXG4gIC8vIF07XHJcblxyXG4gIF9odHRwQ2FsbEF1dGhlbnRpY2F0ZWQodXJsLCB7XHJcbiAgICBtZXRob2Q6IFwiUEFUQ0hcIixcclxuICAgIGhlYWRlcnM6IHRvcEhlYWRlcixcclxuICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KGRhdGFzKSxcclxuICAgIHR5cGU6IFwianNvblwiLFxyXG4gICAgb25Db21wbGV0ZShyZXNwb25zZSkge1xyXG4gICAgICBpZiAob25Eb25lKSBvbkRvbmUocmVzcG9uc2UpO1xyXG4gICAgfSxcclxuICAgIG9uRmFpbHVyZShlcnIpIHtcclxuICAgICAgaWYgKG9uRXJyb3IpIG9uRXJyb3IoZXJyKTtcclxuICAgIH0sXHJcbiAgfSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gTGEgZm9uY3Rpb24gwqsgcmVhZFVzZXJHcm91cENvbnRyb2wgwrsgZXN0IHV0aWxpc8OpZSBwb3VyIHLDqWN1cMOpcmVyIGxlcyBpbmZvcm1hdGlvbnMgZGUgY29udHLDtGxlIGRlXHJcbiAqIGdyb3VwZSBkJ3V0aWxpc2F0ZXVycyDDoCBwYXJ0aXIgZCd1biBVUkkgc3DDqWNpZmnDqSDDoCBsJ2FpZGUgZCd1bmUgcmVxdcOqdGUgSFRUUCBHRVQuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBjcmVkZW50aWFscyAtIFVuIG9iamV0IGNvbnRlbmFudCBsZXMgaW5mb3JtYXRpb25zIGQnaWRlbnRpZmljYXRpb24gcmVxdWlzZXMgcG91ciBhdXRoZW50aWZpZXJcclxuICogbGEgZGVtYW5kZS4gSWwgaW5jbHV0IGfDqW7DqXJhbGVtZW50IGRlcyBwcm9wcmnDqXTDqXMgdGVsbGVzIHF1ZSDCqyB0b2tlbiDCuywgwqsgc3BhY2UgwrssIMKrIHRlbmFudCDCuyBldCDCqyBjdHggwrsuXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjcmVkZW50aWFscy5zcGFjZSAtIEwnVVJMIGR1IHNlcnZldXIgc3VyIGxlcXVlbCBsJ0FQSSBlc3QgZMOpcGxvecOpZS4oZXg6IDNEU3BhY2UgPT4oaHR0cHM6Ly9yMTEzMjEwMDk2ODQ0Ny1ldTEtc3BhY2UuM2RleHBlcmllbmNlLjNkcy5jb20vZW5vdmlhKSwgM0RTd3ltLCB1c2Vyc2dyb3VwLCAzRENvbXBhc3MuLi4pXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSB1cmkgLSBMZSBwYXJhbcOodHJlIGB1cmlgIGVzdCB1bmUgY2hhw65uZSBxdWkgcmVwcsOpc2VudGUgbCdpZGVudGlmaWFudCBkdSBncm91cGUgZCd1dGlsaXNhdGV1cnNcclxuICogcG91ciBsZXF1ZWwgdm91cyBzb3VoYWl0ZXogcsOpY3Vww6lyZXIgbGVzIGluZm9ybWF0aW9ucyBkZSBjb250csO0bGUuIChleDogdXVpZDpkY2FkMTRjYy01YmNkLTQ1ZmQtYTU0ZC0yNDZiOTUwNDdkNDUpXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkRvbmVdIC0gTGUgcGFyYW3DqHRyZSBgb25Eb25lYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBsb3JzcXVlIGxhXHJcbiAqIHJlcXXDqnRlIEhUVFAgc2VyYSB0ZXJtaW7DqWUgYXZlYyBzdWNjw6hzLiBJbCBwcmVuZCB1biBhcmd1bWVudCwgcXVpIGNvcnJlc3BvbmQgYXV4IGRvbm7DqWVzIGRlIHLDqXBvbnNlXHJcbiAqIGRlIGxhIHJlcXXDqnRlLlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25FcnJvcl0gLSBMZSBwYXJhbcOodHJlIGBvbkVycm9yYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBzJ2lsIHkgYSB1bmVcclxuICogZXJyZXVyIGxvcnMgZGUgbCdleMOpY3V0aW9uIGRlIGxhIGZvbmN0aW9uIGByZWFkVXNlckdyb3VwQ29udHJvbGAuIElsIHZvdXMgcGVybWV0IGRlIGfDqXJlciBldCBkZVxyXG4gKiByw6lwb25kcmUgw6AgdG91dGUgZXJyZXVyIHF1aSBzZSBwcm9kdWl0LlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRVc2VyR3JvdXBDb250cm9sKFxyXG4gIGNyZWRlbnRpYWxzLFxyXG4gIHVyaSxcclxuICBvbkRvbmUgPSB1bmRlZmluZWQsXHJcbiAgb25FcnJvciA9IHVuZGVmaW5lZCxcclxuKSB7XHJcbiAgY29uc3QgeyBzcGFjZSB9ID0gY3JlZGVudGlhbHM7XHJcbiAgY29uc3QgVVJJID0gXCIvM2RyZGZwZXJzaXN0L3Jlc291cmNlcy92MS91c2Vyc2dyb3VwXCI7XHJcblxyXG4gIGNvbnN0IHVybCA9IGAke3NwYWNlfSR7VVJJfS8ke3VyaX0vc2hhcmluZ2A7XHJcblxyXG4gIGNvbnN0IGhlYWRlciA9IHtcclxuICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgQWNjZXB0OiBcImFwcGxpY2F0aW9uL2pzb24sdGV4dC9qYXZhc2NyaXB0LCovKlwiLFxyXG4gIH07XHJcbiAgY29uc3Qgb3B0cyA9IHtcclxuICAgIG1ldGhvZDogXCJHRVRcIixcclxuICAgIGhlYWRlcnM6IGhlYWRlcixcclxuICB9O1xyXG4gIF9odHRwQ2FsbEF1dGhlbnRpY2F0ZWQodXJsLCB7XHJcbiAgICBvcHRzLFxyXG4gICAgb25Db21wbGV0ZShfcmVwKSB7XHJcbiAgICAgIGlmIChvbkRvbmUpIG9uRG9uZShKU09OLnBhcnNlKF9yZXApKTtcclxuICAgIH0sXHJcbiAgICBvbkZhaWx1cmUoZXJyKSB7XHJcbiAgICAgIGlmIChvbkVycm9yKSBvbkVycm9yKGVycik7XHJcbiAgICB9LFxyXG4gIH0pO1xyXG59XHJcbiIsImltcG9ydCB7XHJcbiAgX2h0dHBDYWxsQXV0aGVudGljYXRlZCxcclxuICBfZ2V0UGxhdGZvcm1TZXJ2aWNlcyxcclxufSBmcm9tIFwiLi8zZGV4cGVyaWVuY2VfYXBpXCI7XHJcbmltcG9ydCB7IFVVSUQgfSBmcm9tIFwiLi4vLi4vYXBpL2luZGV4XCI7XHJcblxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIExhIGZvbmN0aW9uIGBfM2RTcGFjZV9nZXRfZG9jSW5mb2AgcsOpY3Vww6hyZSBkZXMgaW5mb3JtYXRpb25zIHN1ciB1biBkb2N1bWVudCBkYW5zIHVuIGVzcGFjZSAzRC5cclxuICogQHBhcmFtIHtPYmplY3R9IGNyZWRlbnRpYWxzIC0gVW4gb2JqZXQgY29udGVuYW50IGxlcyBpbmZvcm1hdGlvbnMgZCdpZGVudGlmaWNhdGlvbiByZXF1aXNlcyBwb3VyIGF1dGhlbnRpZmllclxyXG4gKiBsYSBkZW1hbmRlLiBJbCBpbmNsdXQgZ8OpbsOpcmFsZW1lbnQgZGVzIHByb3ByacOpdMOpcyB0ZWxsZXMgcXUnaWNpIMKrIHRva2VuIMK7IGV0IMKrIHNwYWNlIMK7LihleDogY3JlZGVudGlhbHMuc3BhY2UsIGNyZWRlbnRpYWxzLnRlbmFudCwgY3JlZGVudGlhbHMudG9rZW4uLi4pLlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMuc3BhY2UgLSAoM0RTYXBjZSkgTCdVUkwgZHUgc2VydmV1ciBzdXIgbGVxdWVsIGwnQVBJIGVzdCBkw6lwbG95w6llLigzRFNwYWNlLCAzRFN3eW0sIDNEQ29tcGFzcywuLi5ldGMpXHJcbiAqIEBleGFtcGxlIHBvdXIgbGUgM0RTcGFjZSB7c3BhY2U6XCJodHRwczovL3IxMTMyMTAwOTY4NDQ3LWV1MS1zcGFjZS4zZGV4cGVyaWVuY2UuM2RzLmNvbS9lbm92aWFcIn1cclxuXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBbZG9jaWRdIC0gTGUgcGFyYW3DqHRyZSBgZG9jaWRgIGVzdCBsJ0lEIGR1IGRvY3VtZW50IHBvdXIgbGVxdWVsIHZvdXMgc291aGFpdGV6IHLDqWN1cMOpcmVyIGRlc1xyXG4gKiBpbmZvcm1hdGlvbnMuIEMnZXN0IHVuIHBhcmFtw6h0cmUgb2JsaWdhdG9pcmUgZXQgZG9pdCDDqnRyZSBmb3VybmkuXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkRvbmVdIC0gTGUgcGFyYW3DqHRyZSBgb25Eb25lYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBsb3JzcXVlIGxlc1xyXG4gKiBpbmZvcm1hdGlvbnMgZHUgZG9jdW1lbnQgc2Vyb250IHLDqWN1cMOpcsOpZXMgYXZlYyBzdWNjw6hzLiBJbCBwcmVuZCB1biBhcmd1bWVudCwgcXVpIGVzdCBsJ29iamV0XHJcbiAqIGQnaW5mb3JtYXRpb25zIGR1IGRvY3VtZW50LlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25FcnJvcl0gLSBMZSBwYXJhbcOodHJlIGBvbkVycm9yYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBzJ2lsIHkgYSB1bmVcclxuICogZXJyZXVyIGxvcnMgZGUgbCdhcHBlbCBIVFRQLiBJbCBwcmVuZCB1biBwYXJhbcOodHJlLCBxdWkgZXN0IGxhIHLDqXBvbnNlIGQnZXJyZXVyLlxyXG4gKiBAcmV0dXJucyBMYSBmb25jdGlvbiBuZSByZW52b2llIGV4cGxpY2l0ZW1lbnQgcmllbi5cclxuICovXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBfM0RTcGFjZV9nZXRfZG9jSW5mbyhcclxuICBjcmVkZW50aWFscyxcclxuICBkb2NpZCA9IHVuZGVmaW5lZCxcclxuICBvbkRvbmUgPSB1bmRlZmluZWQsXHJcbiAgb25FcnJvciA9IHVuZGVmaW5lZCxcclxuKSB7XHJcbiAgY29uc3QgXzNEU3BhY2UgPSBjcmVkZW50aWFscy5zcGFjZTtcclxuICBpZiAoZG9jaWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgY29uc29sZS5sb2coXCJMZSBwYXJhbcOodHJlIGRvY2lkIGVzdCBvYmxpZ2F0b2lyZVwiKTtcclxuICAgIHJldHVybjtcclxuICB9XHJcbiAgY29uc3QgdXJsID0gXzNEU3BhY2UgKyBgL3Jlc291cmNlcy92MS9tb2RlbGVyL2RvY3VtZW50cy8ke2RvY2lkfWA7XHJcbiAgX2h0dHBDYWxsQXV0aGVudGljYXRlZCh1cmwsIHtcclxuICAgIG9uQ29tcGxldGUocmVzcG9uc2UsIGhlYWRlcnMsIHhocikge1xyXG4gICAgICBjb25zdCBpbmZvID0gSlNPTi5wYXJzZShyZXNwb25zZSk7XHJcbiAgICAgIGlmIChvbkRvbmUpIG9uRG9uZShpbmZvKTtcclxuICAgIH0sXHJcblxyXG4gICAgb25GYWlsdXJlKHJlc3BvbnNlKSB7XHJcbiAgICAgIGlmIChvbkVycm9yKSBvbkVycm9yKHJlc3BvbnNlKTtcclxuICAgIH0sXHJcbiAgfSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gQ2V0dGUgZm9uY3Rpb24gZWZmZWN0dWUgdW4gYXBwZWwgSFRUUCBhdXRoZW50aWZpw6kgcG91ciByw6ljdXDDqXJlciBsZSBqZXRvbiBDU1JGIHBvdXIgdW4gZG9jdW1lbnQgZGVcclxuICogbW9kw6lsaXNhdGlvbiAzRC5cclxuICogQHBhcmFtIHtPYmplY3R9IGNyZWRlbnRpYWxzIC0gVW4gb2JqZXQgY29udGVuYW50IGxlcyBpbmZvcm1hdGlvbnMgZCdpZGVudGlmaWNhdGlvbiByZXF1aXNlcyBwb3VyIGF1dGhlbnRpZmllclxyXG4gKiBsYSBkZW1hbmRlLiBJbCBpbmNsdXQgZ8OpbsOpcmFsZW1lbnQgZGVzIHByb3ByacOpdMOpcyB0ZWxsZXMgcXUnaWNpIMKrIHRva2VuIMK7IGV0IMKrIHNwYWNlIMK7LihleDogY3JlZGVudGlhbHMuc3BhY2UsIGNyZWRlbnRpYWxzLnRlbmFudCwgY3JlZGVudGlhbHMudG9rZW4uLi4pLlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMuc3BhY2UgLSAoM0RTcGFjZSkgTCdVUkwgZHUgc2VydmV1ciBzdXIgbGVxdWVsIGwnQVBJIGVzdCBkw6lwbG95w6llLigzRFNwYWNlLCAzRFN3eW0sIDNEQ29tcGFzcywuLi5ldGMpXHJcbiAqIEBleGFtcGxlIHBvdXIgbGUgM0RTcGFjZSB7c3BhY2U6XCJodHRwczovL3IxMTMyMTAwOTY4NDQ3LWV1MS1zcGFjZS4zZGV4cGVyaWVuY2UuM2RzLmNvbS9lbm92aWFcIn1cclxuICogQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLm9iaklEIC0gSUQgZHUgZG9jdW1lbnQgcG91ciBsZXF1ZWwgbGUgamV0b24gQ1NSRiBlc3QgZGVtYW5kw6kuXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkRvbmVdIC0gTGUgcGFyYW3DqHRyZSBvbkRvbmUgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgZXjDqWN1dMOpZSBsb3JzcXVlIGxhXHJcbiAqIHJlcXXDqnRlIEhUVFAgc2VyYSB0ZXJtaW7DqWUgYXZlYyBzdWNjw6hzLiBJbCBwcmVuZCB1biBhcmd1bWVudCwgcXVpIGNvcnJlc3BvbmQgYXV4IGRvbm7DqWVzIGRlIHLDqXBvbnNlXHJcbiAqIHJlbnZvecOpZXMgcGFyIGxlIHNlcnZldXIuXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkVycm9yXSAtIExlIHBhcmFtw6h0cmUgYG9uRXJyb3JgIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGV4w6ljdXTDqWUgc2kgbGEgcmVxdcOqdGVcclxuICogSFRUUCDDqWNob3VlIG91IHJlbmNvbnRyZSB1bmUgZXJyZXVyLiBJbCBwcmVuZCB1biBhcmd1bWVudCwgcXVpIGVzdCBsYSByw6lwb25zZSBkJ2VycmV1ci5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfM0RTcGFjZV9nZXRfY3NyZihcclxuICBjcmVkZW50aWFscyxcclxuICBvbkRvbmUgPSB1bmRlZmluZWQsXHJcbiAgb25FcnJvciA9IHVuZGVmaW5lZCxcclxuKSB7XHJcbiAgaWYgKGNyZWRlbnRpYWxzLm9iaklEICYmIGNyZWRlbnRpYWxzLm9iaklEICE9PSBcIlwiKSB7XHJcbiAgICBsZXQgdXJsID0gYCR7Y3JlZGVudGlhbHMuc3BhY2V9L3Jlc291cmNlcy92MS9tb2RlbGVyL2RvY3VtZW50cy8ke2NyZWRlbnRpYWxzLm9iaklEfWA7XHJcblxyXG4gICAgX2h0dHBDYWxsQXV0aGVudGljYXRlZCh1cmwsIHtcclxuICAgICAgb25Db21wbGV0ZShyZXNwb25zZSwgaGVhZGVycywgeGhyKSB7XHJcbiAgICAgICAgY29uc3QgaW5mbyA9IEpTT04ucGFyc2UocmVzcG9uc2UpO1xyXG4gICAgICAgIGNyZWRlbnRpYWxzW1widG9rZW5cIl0gPSBpbmZvPy5jc3JmPy52YWx1ZTtcclxuICAgICAgICBjcmVkZW50aWFsc1tcImRhdGFzXCJdID0gaW5mbz8uZGF0YVswXTtcclxuICAgICAgICBpZiAob25Eb25lKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcImluZm8gPT4gXCIsIGluZm8pO1xyXG4gICAgICAgICAgb25Eb25lKGNyZWRlbnRpYWxzKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcblxyXG4gICAgICBvbkZhaWx1cmUocmVzcG9uc2UpIHtcclxuICAgICAgICBpZiAob25FcnJvcikgb25FcnJvcihyZXNwb25zZSk7XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9IGVsc2Uge1xyXG4gICAgXzNEU3BhY2VfY3NyZihjcmVkZW50aWFscyk7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIENldHRlIGZvbmN0aW9uIEphdmFTY3JpcHQgcsOpY3Vww6hyZSBsZSBUT0tFTiBDU1JGIGQndW5lIGFwcGxpY2F0aW9uIDNEU3BhY2UuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBjcmVkZW50aWFscyAtIFVuIG9iamV0IGNvbnRlbmFudCBsZXMgaW5mb3JtYXRpb25zIGQnaWRlbnRpZmljYXRpb24gcmVxdWlzZXMgcG91ciBhdXRoZW50aWZpZXJcclxuICogbGEgZGVtYW5kZS4gSWwgaW5jbHV0IGfDqW7DqXJhbGVtZW50IGRlcyBwcm9wcmnDqXTDqXMgdGVsbGVzIHF1J2ljaSDCqyB0b2tlbiDCuyBldCDCqyBzcGFjZSDCuy4oZXg6IGNyZWRlbnRpYWxzLnNwYWNlLCBjcmVkZW50aWFscy50ZW5hbnQsIGNyZWRlbnRpYWxzLnRva2VuLi4uKS5cclxuICogQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLnNwYWNlIC0gKDNEU2FwY2UpIEwnVVJMIGR1IHNlcnZldXIgc3VyIGxlcXVlbCBsJ0FQSSBlc3QgZMOpcGxvecOpZS4oM0RTcGFjZSwgM0RTd3ltLCAzRENvbXBhc3MsLi4uZXRjKVxyXG4gKiBAZXhhbXBsZSBwb3VyIGxlIDNEU3BhY2Uge3NwYWNlOlwiaHR0cHM6Ly9yMTEzMjEwMDk2ODQ0Ny1ldTEtc3BhY2UuM2RleHBlcmllbmNlLjNkcy5jb20vZW5vdmlhXCJ9XHJcbiAqIEBwYXJhbSB7Q2FsbGJhY2t9IFtvbkRvbmVdIC0gTGUgcGFyYW3DqHRyZSBgb25Eb25lYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBsb3JzcXVlIGxlIGpldG9uXHJcbiAqIENTUkYgc2VyYSByw6ljdXDDqXLDqSBhdmVjIHN1Y2PDqHMuIElsIGZhdXQgdW4gYXJndW1lbnQsIHF1aSBlc3QgbGEgdmFsZXVyIGR1IGpldG9uIENTUkYuXHJcbiAqIEBwYXJhbSB7Q2FsbGJhY2t9IFtvbkVycm9yXSAtIExlIHBhcmFtw6h0cmUgYG9uRXJyb3JgIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIHNpIHVuZSBlcnJldXJcclxuICogc3VydmllbnQgbG9ycyBkZSBsJ2V4w6ljdXRpb24gZGUgbGEgZm9uY3Rpb24gYF8zRFNwYWNlX2NzcmZgLiBJbCBlc3QgdXRpbGlzw6kgcG91ciBnw6lyZXIgZXQgYWZmaWNoZXJcclxuICogbGVzIG1lc3NhZ2VzIGTigJllcnJldXIgb3UgZXjDqWN1dGVyIHRvdXRlIGxvZ2lxdWUgZGUgZ2VzdGlvbiBkZXMgZXJyZXVycyBuw6ljZXNzYWlyZS5cclxuICogQHJldHVybnMgbGEgdmFsZXVyIGR1IGpldG9uIENTUkYsIHF1aSBlc3Qgb2J0ZW51ZSDDoCBwYXJ0aXIgZGUgbGEgcsOpcG9uc2UgZGUgbCdhcHBlbCBIVFRQLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF8zRFNwYWNlX2NzcmYoXHJcbiAgY3JlZGVudGlhbHMsXHJcbiAgb25Eb25lID0gdW5kZWZpbmVkLFxyXG4gIG9uRXJyb3IgPSB1bmRlZmluZWQsXHJcbikge1xyXG4gIGlmIChjcmVkZW50aWFscy5zcGFjZSkge1xyXG4gICAgY29uc3QgdXJsID0gY3JlZGVudGlhbHMuc3BhY2UgKyBcIi9yZXNvdXJjZXMvdjEvYXBwbGljYXRpb24vQ1NSRlwiO1xyXG4gICAgX2h0dHBDYWxsQXV0aGVudGljYXRlZCh1cmwsIHtcclxuICAgICAgb25Db21wbGV0ZShyZXNwb25zZSwgaGVhZGVycywgeGhyKSB7XHJcbiAgICAgICAgY29uc3QgaW5mbyA9IEpTT04ucGFyc2UocmVzcG9uc2UpO1xyXG5cclxuICAgICAgICBpZiAob25Eb25lKSBvbkRvbmUoaW5mby5jc3JmLnZhbHVlKTtcclxuICAgICAgfSxcclxuICAgICAgb25GYWlsdXJlKHJlc3BvbnNlLCBoZWFkZXJzLCB4aHIpIHtcclxuICAgICAgICBjb25zdCBpbmZvcyA9IHsgcmVzcG9uc2UsIGhlYWRlcnMsIHhociB9O1xyXG4gICAgICAgIGlmIChvbkVycm9yKSBvbkVycm9yKGluZm9zKTtcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBpZiAob25FcnJvcikgb25FcnJvcihcIkVSUk9SIDogdXJsIGR1IDNEU3BhY2Ugbm9uIGTDqWZpbmkuXCIpO1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBDZXR0ZSBmb25jdGlvbiBnw6luw6hyZSB1bmUgVVJMIHBvdXIgdMOpbMOpY2hhcmdlciB1biBmaWNoaWVyIMOgIHBhcnRpciBkJ3VuZSBwbGF0ZWZvcm1lIGRlIG1vZMOpbGlzYXRpb25cclxuICogM0QsIGVuIHV0aWxpc2FudCBsJ2F1dGhlbnRpZmljYXRpb24gZXQgbGEgZ2VzdGlvbiBkZXMgZXJyZXVycy5cclxuICogQHBhcmFtIHtPYmplY3R9IGNyZWRlbnRpYWxzIC0gVW4gb2JqZXQgY29udGVuYW50IGxlcyBpbmZvcm1hdGlvbnMgZCdpZGVudGlmaWNhdGlvbiByZXF1aXNlcyBwb3VyIGF1dGhlbnRpZmllclxyXG4gKiBsYSBkZW1hbmRlLiBJbCBpbmNsdXQgZ8OpbsOpcmFsZW1lbnQgZGVzIHByb3ByacOpdMOpcyB0ZWxsZXMgcXUnaWNpIMKrIHRva2VuIMK7IGV0IMKrIHNwYWNlIMK7LihleDogY3JlZGVudGlhbHMuc3BhY2UsIGNyZWRlbnRpYWxzLnRlbmFudCwgY3JlZGVudGlhbHMudG9rZW4uLi4pLlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMuc3BhY2UgLSAoM0RTcGFjZSkgTCdVUkwgZHUgc2VydmV1ciBzdXIgbGVxdWVsIGwnQVBJIGVzdCBkw6lwbG95w6llLigzRFNwYWNlLCAzRFN3eW0sIDNEQ29tcGFzcywuLi5ldGMpXHJcbiAqIEBleGFtcGxlIHBvdXIgbGUgM0RTcGFjZSB7c3BhY2U6XCJodHRwczovL3IxMTMyMTAwOTY4NDQ3LWV1MS1zcGFjZS4zZGV4cGVyaWVuY2UuM2RzLmNvbS9lbm92aWFcIn1cclxuXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBkb2NpZCAtIElEIGR1IGRvY3VtZW50IHBvdXIgbGVxdWVsIGwnVVJMIGR1IGZpY2hpZXIgZXN0IGRlbWFuZMOpZS5cclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRG9uZV0gLSBVbmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIGxvcnNxdWUgbCdVUkwgZHUgZmljaGllciBzZXJhIHLDqWN1cMOpcsOpZVxyXG4gKiBhdmVjIHN1Y2PDqHMuIElsIHByZW5kIHVuIHBhcmFtw6h0cmUsIHF1aSBlc3QgbCdVUkwgZHUgZmljaGllci5cclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRXJyb3JdIC0gTGUgcGFyYW3DqHRyZSBvbkVycm9yIGVzdCB1bmUgZm9uY3Rpb24gcXVpIHNlcmEgYXBwZWzDqWUgcydpbCB5IGEgdW5lIGVycmV1ciBsb3JzXHJcbiAqIGRlIGwnZXjDqWN1dGlvbiBkZSBsYSBmb25jdGlvbi4gSWwgcydhZ2l0IGQndW4gcGFyYW3DqHRyZSBmYWN1bHRhdGlmIGV0IHBldXQgw6p0cmUgbGFpc3PDqSBpbmTDqWZpbmkgcydpbFxyXG4gKiBuJ2VzdCBwYXMgbsOpY2Vzc2FpcmUuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gXzNEU3BhY2VfZmlsZV91cmwoXHJcbiAgY3JlZGVudGlhbHMsXHJcbiAgZG9jaWQsXHJcbiAgb25Eb25lID0gdW5kZWZpbmVkLFxyXG4gIG9uRXJyb3IgPSB1bmRlZmluZWQsXHJcbikge1xyXG4gIGxldCB1cmwgPVxyXG4gICAgY3JlZGVudGlhbHMuc3BhY2UgK1xyXG4gICAgYC9yZXNvdXJjZXMvdjEvbW9kZWxlci9kb2N1bWVudHMvJHtkb2NpZH0vZmlsZXMvRG93bmxvYWRUaWNrZXRgO1xyXG4gIF8zRFNwYWNlX2dldF9jc3JmKFxyXG4gICAgY3JlZGVudGlhbHMsXHJcblxyXG4gICAgKGluZm8pID0+IHtcclxuICAgICAgX2h0dHBDYWxsQXV0aGVudGljYXRlZCh1cmwsIHtcclxuICAgICAgICBtZXRob2Q6IFwiUFVUXCIsXHJcbiAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgRU5PX0NTUkZfVE9LRU46IGNyZWRlbnRpYWxzLnRva2VuLFxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIG9uQ29tcGxldGUocmVzcG9uc2UpIHtcclxuICAgICAgICAgIGxldCBpbmZvID0gSlNPTi5wYXJzZShyZXNwb25zZSk7XHJcblxyXG4gICAgICAgICAgaWYgKGluZm8uc3VjY2VzcyA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGZpbGVfdXJsID0gaW5mby5kYXRhWzBdLmRhdGFlbGVtZW50cy50aWNrZXRVUkw7XHJcbiAgICAgICAgICAgICAgaWYgKG9uRG9uZSkgb25Eb25lKGZpbGVfdXJsKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgaWYgKG9uRXJyb3IpIG9uRXJyb3IoZXJyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIG9uRmFpbHVyZShyZXNwb25zZSwgaGVhZCkge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coXCLimKDvuI8gZXJyb3IgPT4gXCIsIHJlc3BvbnNlLCBoZWFkKTtcclxuICAgICAgICAgIGlmIChvbkVycm9yKSBvbkVycm9yKHJlc3BvbnNlLCBoZWFkKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICAgIH0sXHJcbiAgICBvbkVycm9yLFxyXG4gICk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gQ2V0dGUgZm9uY3Rpb24gZW52b2llIHVuZSByZXF1w6p0ZSBQVVQgw6AgdW5lIFVSTCBzcMOpY2lmacOpZSBhdmVjIGRlcyBlbi10w6p0ZXMgZCdhdXRoZW50aWZpY2F0aW9uIGV0XHJcbiAqIHJlbnZvaWUgdW5lIFVSTCBkZSBmaWNoaWVyIGVuIGNhcyBkZSBzdWNjw6hzLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gY3JlZGVudGlhbHMgLSBVbiBvYmpldCBjb250ZW5hbnQgbGVzIGluZm9ybWF0aW9ucyBkJ2lkZW50aWZpY2F0aW9uIHJlcXVpc2VzIHBvdXIgYXV0aGVudGlmaWVyXHJcbiAqIGxhIGRlbWFuZGUuIElsIGluY2x1dCBnw6luw6lyYWxlbWVudCBkZXMgcHJvcHJpw6l0w6lzIHRlbGxlcyBxdSdpY2kgwqsgdG9rZW4gwrsgZXQgwqsgc3BhY2UgwrsuKGV4OiBjcmVkZW50aWFscy5zcGFjZSwgY3JlZGVudGlhbHMudGVuYW50LCBjcmVkZW50aWFscy50b2tlbi4uLikuXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjcmVkZW50aWFscy5zcGFjZSAtICgzRFNwYWNlKSBMJ1VSTCBkdSBzZXJ2ZXVyIHN1ciBsZXF1ZWwgbCdBUEkgZXN0IGTDqXBsb3nDqWUuKDNEU3BhY2UsIDNEU3d5bSwgM0RDb21wYXNzLC4uLmV0YylcclxuICogQGV4YW1wbGUgcG91ciBsZSAzRFNwYWNlIHtzcGFjZTpcImh0dHBzOi8vcjExMzIxMDA5Njg0NDctZXUxLXNwYWNlLjNkZXhwZXJpZW5jZS4zZHMuY29tL2Vub3ZpYVwifVxyXG4gKiBAcGFyYW0ge1N0cmluZ30gW2RvY2lkXSAtIEwnSUQgZHUgZG9jdW1lbnQgcG91ciBsZXF1ZWwgbGUgdGlja2V0IGRlIHTDqWzDqWNoYXJnZW1lbnQgZGUgZmljaGllciBlc3QgZGVtYW5kw6kuXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBbY3NyXSAtIExlIHBhcmFtw6h0cmUgXCJjc3JcIiBlc3QgdW4gamV0b24gQ1NSRiB1dGlsaXPDqSDDoCBkZXMgZmlucyBkJ2F1dGhlbnRpZmljYXRpb24gZXQgZGVcclxuICogc8OpY3VyaXTDqS4gSWwgZXN0IHRyYW5zbWlzIGVuIHRhbnQgcXUnZW4tdMOqdGUgZGFucyBsYSByZXF1w6p0ZSBIVFRQIMOgIGwnVVJMIHNww6ljaWZpw6llLlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25Eb25lXSAtIExlIHBhcmFtw6h0cmUgb25Eb25lIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGV4w6ljdXTDqWUgbG9yc3F1ZSBsYVxyXG4gKiByZXF1w6p0ZSBIVFRQIGFib3V0aXJhIGV0IHF1ZSBsJ1VSTCBkdSBmaWNoaWVyIHNlcmEgb2J0ZW51ZS4gSWwgcHJlbmQgdW4gYXJndW1lbnQsIHF1aSBlc3QgbCdVUkwgZHVcclxuICogZmljaGllci5cclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRXJyb3JdIC0gTGUgcGFyYW3DqHRyZSBvbkVycm9yIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGV4w6ljdXTDqWUgcydpbCB5IGEgdW5lXHJcbiAqIGVycmV1ciBsb3JzIGRlIGxhIHJlcXXDqnRlIEhUVFAuIElsIGVzdCBmYWN1bHRhdGlmIGV0IHBldXQgw6p0cmUgbGFpc3PDqSBpbmTDqWZpbmkgcydpbCBuJ2VzdCBwYXNcclxuICogbsOpY2Vzc2FpcmUuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gXzNEU3BhY2VfZmlsZV91cmxfY3NyKFxyXG4gIGNyZWRlbnRpYWxzLFxyXG4gIGRvY2lkLFxyXG4gIGNzcixcclxuICBvbkRvbmUgPSB1bmRlZmluZWQsXHJcbiAgb25FcnJvciA9IHVuZGVmaW5lZCxcclxuKSB7XHJcbiAgY29uc3QgdXJsID0gYCR7Y3JlZGVudGlhbHMuc3BhY2V9L3Jlc291cmNlcy92MS9tb2RlbGVyL2RvY3VtZW50cy8ke2RvY2lkfS9maWxlcy9Eb3dubG9hZFRpY2tldGA7XHJcbiAgX2h0dHBDYWxsQXV0aGVudGljYXRlZCh1cmwsIHtcclxuICAgIG1ldGhvZDogXCJQVVRcIixcclxuICAgIGhlYWRlcnM6IHtcclxuICAgICAgRU5PX0NTUkZfVE9LRU46IGNzcixcclxuICAgIH0sXHJcblxyXG4gICAgb25Db21wbGV0ZShyZXNwb25zZSkge1xyXG4gICAgICBsZXQgaW5mbyA9IEpTT04ucGFyc2UocmVzcG9uc2UpO1xyXG4gICAgICBpZiAoaW5mby5zdWNjZXNzID09PSB0cnVlKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGNvbnN0IGZpbGVfdXJsID0gaW5mby5kYXRhWzBdLmRhdGFlbGVtZW50cy50aWNrZXRVUkw7XHJcbiAgICAgICAgICBpZiAob25Eb25lKSBvbkRvbmUoZmlsZV91cmwpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgaWYgKG9uRXJyb3IpIG9uRXJyb3IoZXJyKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgb25GYWlsdXJlKHJlc3BvbnNlKSB7XHJcbiAgICAgIGlmIChvbkVycm9yKSBvbkVycm9yKHJlc3BvbnNlKTtcclxuICAgIH0sXHJcbiAgfSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gQ2V0dGUgZm9uY3Rpb24gbWV0IMOgIGpvdXIgdW4gZmljaGllciBkYW5zIHVuIGVzcGFjZSAzRCBhdmVjIGxlcyBkb25uw6llcyBldCBsZSBub20gZGUgZmljaGllciBkb25uw6lzLFxyXG4gKiBlbiB1dGlsaXNhbnQgbGEgcHJvdGVjdGlvbiBDU1JGLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gY3JlZGVudGlhbHMgLSBVbiBvYmpldCBjb250ZW5hbnQgbGVzIGluZm9ybWF0aW9ucyBkJ2lkZW50aWZpY2F0aW9uIHJlcXVpc2VzIHBvdXIgYXV0aGVudGlmaWVyXHJcbiAqIGxhIGRlbWFuZGUuIElsIGluY2x1dCBnw6luw6lyYWxlbWVudCBkZXMgcHJvcHJpw6l0w6lzIHRlbGxlcyBxdSdpY2kgwqsgdG9rZW4gwrsgZXQgwqsgc3BhY2UgwrsuKGV4OiBjcmVkZW50aWFscy5zcGFjZSwgY3JlZGVudGlhbHMudGVuYW50LCBjcmVkZW50aWFscy50b2tlbi4uLikuXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjcmVkZW50aWFscy5zcGFjZSAtICgzRFNwYWNlKSBMJ1VSTCBkdSBzZXJ2ZXVyIHN1ciBsZXF1ZWwgbCdBUEkgZXN0IGTDqXBsb3nDqWUuKDNEU3BhY2UsIDNEU3d5bSwgM0RDb21wYXNzLC4uLmV0YylcclxuICogQGV4YW1wbGUgcG91ciBsZSAzRFNwYWNlIHtzcGFjZTpcImh0dHBzOi8vcjExMzIxMDA5Njg0NDctZXUxLXNwYWNlLjNkZXhwZXJpZW5jZS4zZHMuY29tL2Vub3ZpYVwifVxyXG4gKiBAcGFyYW0ge1N0cmluZ30gW2RvY0lkXSAtIElEIGRlIGRvY3VtZW50IGR1IGZpY2hpZXIgZCdlc3BhY2UgM0QgZW4gY291cnMgZGUgbWlzZSDDoCBqb3VyLlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gW2ZpbGVJZF0gLSBMZSBwYXJhbcOodHJlIGZpbGVpZCBlc3QgbCdpZGVudGlmaWFudCB1bmlxdWUgZHUgZmljaGllciBxdWkgZG9pdCDDqnRyZSBtaXMgw6Agam91ci5cclxuICogQHBhcmFtIHtTdHJpbmd9IFtkYXRhXSAtIENlIHBhcmFtw6h0cmUgcmVwcsOpc2VudGUgbGVzIGRvbm7DqWVzIGR1IGZpY2hpZXIgcXVpIGRvaXZlbnQgw6p0cmUgbWlzZXMgw6Agam91ci4gSWwgcGV1dFxyXG4gKiBzZSBwcsOpc2VudGVyIHNvdXMgbGEgZm9ybWUgZCd1biBmb3JtYXQgYmluYWlyZSBvdSB0ZXh0ZS5cclxuICogQHBhcmFtIHtTdHJpbmd9IFtmaWxlbmFtZV0gLSBOb20gZHUgZmljaGllciBtaXMgw6Agam91ci5cclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRG9uZV0gLSBMZSBwYXJhbcOodHJlIG9uRG9uZSBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBleMOpY3V0w6llIGxvcnNxdWVcclxuICogbCdvcMOpcmF0aW9uIGRlIG1pc2Ugw6Agam91ciBkdSBmaWNoaWVyIHNlcmEgdGVybWluw6llIGF2ZWMgc3VjY8Oocy5cclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRXJyb3JdIC0gTGUgcGFyYW3DqHRyZSBgb25FcnJvcmAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgZXjDqWN1dMOpZSBzaSB1bmUgZXJyZXVyXHJcbiAqIHN1cnZpZW50IGxvcnMgZGUgbCdleMOpY3V0aW9uIGRlIGxhIGZvbmN0aW9uIGBfM2RzcGFjZV9maWxlX3VwZGF0ZWAuIElsIHBlcm1ldCBkZSBnw6lyZXIgbGVzIGVycmV1cnNcclxuICogZGUgbWFuacOocmUgcGVyc29ubmFsaXPDqWUsIHBsdXTDtHQgcXVlIGRlIHMnYXBwdXllciBzdXIgbGUgY29tcG9ydGVtZW50IGRlIGdlc3Rpb24gZGVzIGVycmV1cnMgcGFyXHJcbiAqIGTDqWZhdXQuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gXzNEU3BhY2VfZmlsZV91cGRhdGUoXHJcbiAgY3JlZGVudGlhbHMsXHJcbiAgZG9jSWQsXHJcbiAgZmlsZUlkLFxyXG4gIGRhdGEsXHJcbiAgZmlsZW5hbWUsXHJcbiAgb25Eb25lID0gdW5kZWZpbmVkLFxyXG4gIG9uRXJyb3IgPSB1bmRlZmluZWQsXHJcbikge1xyXG4gIF8zRFNwYWNlX2dldF9jc3JmKFxyXG4gICAgY3JlZGVudGlhbHMsXHJcbiAgICBkb2NJZCxcclxuICAgIChpbmZvKSA9PiB7XHJcbiAgICAgIF8zRFNwYWNlX2ZpbGVfdXBkYXRlX2NzcihcclxuICAgICAgICBjcmVkZW50aWFscyxcclxuICAgICAgICBkb2NJZCxcclxuICAgICAgICBmaWxlSWQsXHJcbiAgICAgICAgZGF0YSxcclxuICAgICAgICBmaWxlbmFtZSxcclxuICAgICAgICBpbmZvLmNzcmYudmFsdWUsXHJcbiAgICAgICAgb25Eb25lLFxyXG4gICAgICAgIG9uRXJyb3IsXHJcbiAgICAgICk7XHJcbiAgICB9LFxyXG4gICAgb25FcnJvcixcclxuICApO1xyXG59XHJcblxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIENldHRlIGZvbmN0aW9uIG1ldCDDoCBqb3VyIHVuIGZpY2hpZXIgZGFucyBsZSBkb2N1bWVudCBkdSAzRFNwYWNlIMOgIGwnYWlkZSBkJ3VuIGpldG9uIENoZWNraW5UaWNrZXQgZXQgQ1NSRi5cclxuICpcclxuICogQHBhcmFtIHtPYmplY3R9IGNyZWRlbnRpYWxzIC0gVW4gb2JqZXQgY29udGVuYW50IGxlcyBpbmZvcm1hdGlvbnMgZCdpZGVudGlmaWNhdGlvbiByZXF1aXNlcyBwb3VyIGF1dGhlbnRpZmllclxyXG4gKiBsYSBkZW1hbmRlLiBJbCBpbmNsdXQgZ8OpbsOpcmFsZW1lbnQgZGVzIHByb3ByacOpdMOpcyB0ZWxsZXMgcXUnaWNpIMKrIHRva2VuIMK7IGV0IMKrIHNwYWNlIMK7LihleDogY3JlZGVudGlhbHMuc3BhY2UsIGNyZWRlbnRpYWxzLnRlbmFudCwgY3JlZGVudGlhbHMudG9rZW4uLi4pLlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMuc3BhY2UgLSAoM0RTcGFjZSkgTCdVUkwgZHUgc2VydmV1ciBzdXIgbGVxdWVsIGwnQVBJIGVzdCBkw6lwbG95w6llLigzRFNwYWNlLCAzRFN3eW0sIDNEQ29tcGFzcywuLi5ldGMpXHJcbiAqIEBleGFtcGxlIHBvdXIgbGUgM0RTcGFjZSB7c3BhY2U6XCJodHRwczovL3IxMTMyMTAwOTY4NDQ3LWV1MS1zcGFjZS4zZGV4cGVyaWVuY2UuM2RzLmNvbS9lbm92aWFcIn1cclxuICogQHBhcmFtIHtTdHJpbmd9IGRvY0lkIC0gSUQgZHUgZG9jdW1lbnQgZW4gY291cnMgZGUgbWlzZSDDoCBqb3VyLlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gZmlsZUlkIC0gSUQgZHUgZmljaGllciBtaXMgw6Agam91ciBkYW5zIGxlIGRvY3VtZW50LlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gZGF0YSAtIExlcyBkb25uw6llcyBiaW5haXJlcyBkdSBmaWNoaWVyIGVuIGNvdXJzIGRlIG1pc2Ugw6Agam91ci5cclxuICogQHBhcmFtIHtTdHJpbmd9IGZpbGVuYW1lIC0gTm9tIGR1IGZpY2hpZXIgbWlzIMOgIGpvdXIuXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjc3IgLSBjc3Igc2lnbmlmaWUgQ3Jvc3MtU2l0ZSBSZXF1ZXN0IEZvcmdlcnkgdG9rZW4sIHF1aSBlc3QgdW5lIG1lc3VyZSBkZSBzw6ljdXJpdMOpIHV0aWxpc8OpZVxyXG4gKiBwb3VyIGVtcMOqY2hlciBsJ2FjY8OocyBub24gYXV0b3Jpc8OpIGF1eCBhcHBsaWNhdGlvbnMgV2ViLiBJbCBzJ2FnaXQgZCd1biBqZXRvbiB1bmlxdWUgZ8OpbsOpcsOpIHBhciBsZVxyXG4gKiBzZXJ2ZXVyIGV0IGVudm95w6kgYXUgY2xpZW50LCBxdWkgZXN0IGVuc3VpdGUgaW5jbHVzIGRhbnMgbGVzIHJlcXXDqnRlcyB1bHTDqXJpZXVyZXMgcG91ciB2w6lyaWZpZXJcclxuICogbCdhdXRoZW50aWNpdMOpIGRlIGxhIHJlcXXDqnRlLiBEYW5zIGNldHRlIGZvbmN0aW9uLCBsZVxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25Eb25lXSAtIExlIHBhcmFtw6h0cmUgb25Eb25lIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGV4w6ljdXTDqWUgbG9yc3F1ZSBsYVxyXG4gKiBmb25jdGlvbiBzZSB0ZXJtaW5lcmEgYXZlYyBzdWNjw6hzLiBJbCBwcmVuZCBsYSByw6lwb25zZSBjb21tZSBhcmd1bWVudC5cclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRXJyb3JdIC0gTGUgcGFyYW3DqHRyZSBgb25FcnJvcmAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgcydpbCB5IGEgdW5lXHJcbiAqIGVycmV1ciBsb3JzIGRlIGxhIHJlcXXDqnRlIEhUVFAuIElsIGVzdCBmYWN1bHRhdGlmIGV0IHMnaWwgbidlc3QgcGFzIGZvdXJuaSwgbCdlcnJldXIgc2VyYSB0cmFpdMOpZSBlblxyXG4gKiBpbnRlcm5lLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF8zRFNwYWNlX2ZpbGVfdXBkYXRlX2NzcihcclxuICBjcmVkZW50aWFscyxcclxuICBkb2NJZCxcclxuICBmaWxlSWQsXHJcbiAgZGF0YSxcclxuICBmaWxlbmFtZSxcclxuICBjc3IsXHJcbiAgb25Eb25lID0gdW5kZWZpbmVkLFxyXG4gIG9uRXJyb3IgPSB1bmRlZmluZWQsXHJcbikge1xyXG4gIGNvbnN0IHVybCA9XHJcbiAgICBjcmVkZW50aWFscy5zcGFjZSArXHJcbiAgICBgL3Jlc291cmNlcy92MS9tb2RlbGVyL2RvY3VtZW50cy8ke2RvY0lkfS9maWxlcy9DaGVja2luVGlja2V0YDtcclxuICBfaHR0cENhbGxBdXRoZW50aWNhdGVkKHVybCwge1xyXG4gICAgbWV0aG9kOiBcIlBVVFwiLFxyXG4gICAgaGVhZGVyczoge1xyXG4gICAgICBFTk9fQ1NSRl9UT0tFTjogY3NyLFxyXG4gICAgfSxcclxuXHJcbiAgICBvbkNvbXBsZXRlKHJlc3BvbnNlLCBoZWFkZXJzLCB4aHIpIHtcclxuICAgICAgY29uc3QgaW5mbyA9IEpTT04ucGFyc2UocmVzcG9uc2UpLmRhdGFbMF0uZGF0YWVsZW1lbnRzO1xyXG5cclxuICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcclxuXHJcbiAgICAgIGZvcm1EYXRhLmFwcGVuZChcIl9fZmNzX19qb2JUaWNrZXRcIiwgaW5mby50aWNrZXQpO1xyXG4gICAgICBmb3JtRGF0YS5hcHBlbmQoXCJmaWxlXzBcIiwgZGF0YSwgZmlsZW5hbWUpO1xyXG5cclxuICAgICAgY29uc3Qgb3B0cyA9IHt9O1xyXG4gICAgICBvcHRzLm1ldGhvZCA9IFwiUE9TVFwiO1xyXG4gICAgICBvcHRzLmRhdGEgPSBmb3JtRGF0YTtcclxuXHJcbiAgICAgIG9wdHMub25Db21wbGV0ZSA9IGZ1bmN0aW9uIChyZXNwb25zZSkge1xyXG4gICAgICAgIC8vVXBkYXRlIHRoZSBGQ1MgZmlsZSByZWNlaXB0XHJcbiAgICAgICAgbGV0IHRlbXBJZCA9IFwidGVtcF9cIiArIERhdGUubm93KCk7XHJcbiAgICAgICAgbGV0IG9wdGlvbnMgPSB7XHJcbiAgICAgICAgICBtZXRob2Q6IFwiUFVUXCIsXHJcbiAgICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICAgIEVOT19DU1JGX1RPS0VOOiBjc3IsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoe1xyXG4gICAgICAgICAgICBkYXRhOiBbXHJcbiAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWQ6IGRvY0lkLFxyXG4gICAgICAgICAgICAgICAgcmVsYXRlZGRhdGE6IHtcclxuICAgICAgICAgICAgICAgICAgZmlsZXM6IFtcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZDogZmlsZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgZGF0YWVsZW1lbnRzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBmaWxlbmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWlwdDogcmVzcG9uc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQWN0aW9uOiBcIlJFVklTRVwiLFxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgdGVtcElkLFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICB9KSxcclxuXHJcbiAgICAgICAgICB0eXBlOiBcImpzb25cIixcclxuXHJcbiAgICAgICAgICBvbkNvbXBsZXRlKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgIGlmIChvbkRvbmUpIG9uRG9uZShyZXNwb25zZSk7XHJcbiAgICAgICAgICB9LFxyXG5cclxuICAgICAgICAgIG9uRmFpbHVyZShyZXNwb25zZSkge1xyXG4gICAgICAgICAgICBpZiAob25FcnJvcikgb25FcnJvcihyZXNwb25zZSk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIF9odHRwQ2FsbEF1dGhlbnRpY2F0ZWQoXHJcbiAgICAgICAgICBjcmVkZW50aWFscy5zcGFjZSArIFwiL3Jlc291cmNlcy92MS9tb2RlbGVyL2RvY3VtZW50c1wiLFxyXG4gICAgICAgICAgb3B0aW9ucyxcclxuICAgICAgICApO1xyXG4gICAgICB9O1xyXG5cclxuICAgICAgb3B0cy5vbkZhaWx1cmUgPSBmdW5jdGlvbiAoZXJyKSB7XHJcbiAgICAgICAgaWYgKG9uRXJyb3IpIG9uRXJyb3IoZXJyKTtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIG9wdHMudGltZW91dCA9IDA7XHJcblxyXG4gICAgICBfaHR0cENhbGxBdXRoZW50aWNhdGVkKGluZm8udGlja2V0VVJMLCBvcHRzKTtcclxuICAgIH0sXHJcbiAgfSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gQ2V0dGUgZm9uY3Rpb24gY3LDqWUgdW4gZG9jdW1lbnQgZGFucyBsZSAzRHNwYWNlIMOgIHBhcnRpciBkZXMgZG9ubsOpZXMgZm91cm5pZXMgYXUgZm9ybWF0IEpTT04uXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBjcmVkZW50aWFscyAtIFVuIG9iamV0IGNvbnRlbmFudCBsZXMgaW5mb3JtYXRpb25zIGQnaWRlbnRpZmljYXRpb24gcmVxdWlzZXMgcG91ciBhdXRoZW50aWZpZXJcclxuICogbGEgZGVtYW5kZS4gSWwgaW5jbHV0IGfDqW7DqXJhbGVtZW50IGRlcyBwcm9wcmnDqXTDqXMgdGVsbGVzIHF1J2ljaSDCqyB0b2tlbiDCuywgwqsgc3BhY2UgwrsgZXQgwqsgY3R4IMK7LihleDogY3JlZGVudGlhbHMuc3BhY2UsIGNyZWRlbnRpYWxzLnRlbmFudCwgY3JlZGVudGlhbHMudG9rZW4pXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjcmVkZW50aWFscy5zcGFjZSAtICgzRFNwYWNlKSBMJ1VSTCBkdSBzZXJ2ZXVyIHN1ciBsZXF1ZWwgbCdBUEkgZXN0IGTDqXBsb3nDqWUuKDNEU3BhY2UsIDNEU3d5bSwgM0RDb21wYXNzLC4uLmV0YylcclxuICogQGV4YW1wbGUgcG91ciBsZSAzRFNwYWNlIHtzcGFjZTpcImh0dHBzOi8vcjExMzIxMDA5Njg0NDctZXUxLXNwYWNlLjNkZXhwZXJpZW5jZS4zZHMuY29tL2Vub3ZpYVwifVxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMudG9rZW4gLSBMZSBwYXJhbcOodHJlIHRva2VuIGVzdCBsZSBqZXRvbiBDU1JGLiAoaGVhZGVycyBleDogRU5PX0NTUkZfVE9LRU46dG9rZW4pXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjcmVkZW50aWFscy5jdHggLSBMJ0lEIGR1IGNvbnRleHRlIGRlIHRyYXZhaWwuXHJcbiAqIEBwYXJhbSB7U3RyaW5nfVtkYXRhXSAtIExlIHBhcmFtw6h0cmUgZGF0YSBjb3JyZXNwb25kIGF1eCBkb25uw6llcyBKU09OIHF1aSBkb2l2ZW50IMOqdHJlIGNoYXJnw6llcyBkYW5zIGxlIDNEc3BhY2UuXHJcbiAqXHJcbiAqIEBwYXJhbSB7U3RyaW5nfVtmaWxlbmFtZV0gLSBMZSBub20gZHUgZmljaGllciDDoCBjcsOpZXIuXHJcbiAqIEBwYXJhbSB7U3RyaW5nfVtkZXNjXSAtIGRlc2MgZXN0IHVuIHBhcmFtw6h0cmUgZGUgY2hhw65uZSBxdWkgcmVwcsOpc2VudGUgbGEgZGVzY3JpcHRpb24gZHUgZG9jdW1lbnQgZW4gY291cnMgZGUgY3LDqWF0aW9uIGRhbnMgbGUgM0RzcGFjZS5cclxuICpcclxuICogQHBhcmFtIHtGdW5jdGlvbn1bb25Eb25lXSAtIExlIHBhcmFtw6h0cmUgb25Eb25lIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIGxvcnNxdWUgbGEgcmVxdcOqdGUgSFRUUCBzZXJhIHRlcm1pbsOpZSBhdmVjIHN1Y2PDqHMuIElsIHByZW5kIGxhIHLDqXBvbnNlIGNvbW1lIGFyZ3VtZW50LlxyXG4gKlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufVtvbkVycm9yXSAtIExlIHBhcmFtw6h0cmUgb25FcnJvciBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBzJ2lsIHkgYSB1bmUgZXJyZXVyIGxvcnMgZGUgbCdleMOpY3V0aW9uIGRlIGxhIGZvbmN0aW9uIF8zZFNwYWNlX0NyZWF0ZV9Eb2MuIElsIHByZW5kIGwnb2JqZXQgZGUgcsOpcG9uc2UgY29tbWUgYXJndW1lbnQuXHJcbiAqXHJcbiAqL1xyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gXzNEU3BhY2VfQ3JlYXRlX0RvYyhcclxuICBjcmVkZW50aWFscyxcclxuICBkYXRhLCAvLyBkYXRhXHJcbiAgZmlsZW5hbWUsIC8vcmVmIGNvY2xpY29cclxuICBkZXNjLCAvLyByZWYgbmFtZVxyXG4gIG9uRG9uZSA9IHVuZGVmaW5lZCxcclxuICBvbkVycm9yID0gdW5kZWZpbmVkLFxyXG4pIHtcclxuICBjb25zdCBfc3BhY2UgPSBjcmVkZW50aWFscy5zcGFjZTtcclxuICBjb25zdCBjc3IgPSBjcmVkZW50aWFscy50b2tlbjtcclxuICBjb25zdCBjdHggPSBjcmVkZW50aWFscy5jdHg7XHJcblxyXG4gIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XHJcbiAgY29uc3QganNvbkZpbGUgPSBuZXcgQmxvYihbSlNPTi5zdHJpbmdpZnkoZGF0YSldLCB7XHJcbiAgICB0eXBlOiBcInRleHQvcGxhaW5cIixcclxuICB9KTtcclxuXHJcbiAgY29uc3QgdXJscyA9IHtcclxuICAgIHVybF9UaWNrZXQ6IGAke19zcGFjZX0vcmVzb3VyY2VzL3YxL21vZGVsZXIvZG9jdW1lbnRzL2ZpbGVzL0NoZWNraW5UaWNrZXRgLFxyXG4gICAgdXJsX1Bvc3Q6IGAke19zcGFjZX0vcmVzb3VyY2VzL3YxL21vZGVsZXIvZG9jdW1lbnRzLz9TZWN1cml0eUNvbnRleHQ9Y3R4Ojoke2N0eH1gLFxyXG4gIH07XHJcblxyXG4gIGlmICghX3NwYWNlICYmIF9zcGFjZSAhPT0gXCJcIikge1xyXG4gICAgY29uc29sZS5sb2coXCJsZSBzdG9yZS5fM0RTcGFjZSBlc3QgdmlkZVwiKTtcclxuICAgIHJldHVybjtcclxuICB9XHJcbiAgLy8gMVxyXG4gIF9odHRwQ2FsbEF1dGhlbnRpY2F0ZWQodXJscy51cmxfVGlja2V0LCB7XHJcbiAgICBtZXRob2Q6IFwiUFVUXCIsXHJcbiAgICBoZWFkZXJzOiB7XHJcbiAgICAgIEVOT19DU1JGX1RPS0VOOiBjc3IudmFsdWUsXHJcbiAgICB9LFxyXG5cclxuICAgIG9uQ29tcGxldGUocmVzcG9uc2UsIGhlYWRlcnMsIHhocikge1xyXG4gICAgICBjb25zdCBpbmZvID0gSlNPTi5wYXJzZShyZXNwb25zZSkuZGF0YVswXS5kYXRhZWxlbWVudHM7XHJcblxyXG4gICAgICBmb3JtRGF0YS5hcHBlbmQoXCJfX2Zjc19fam9iVGlja2V0XCIsIGluZm8udGlja2V0KTtcclxuICAgICAgZm9ybURhdGEuYXBwZW5kKFwiZmlsZW5hbWVcIiwganNvbkZpbGUsIGZpbGVuYW1lKTtcclxuXHJcbiAgICAgIGNvbnN0IG9wdHMgPSB7XHJcbiAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcclxuICAgICAgICBkYXRhOiBmb3JtRGF0YSxcclxuXHJcbiAgICAgICAgb25Db21wbGV0ZSh0aWNrZXQpIHtcclxuICAgICAgICAgIGlmIChjdHggIT09IFwiXCIgJiYgY3NyICE9PSBcIlwiKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcclxuICAgICAgICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICAgICAgICBFTk9fQ1NSRl9UT0tFTjogY3NyLFxyXG4gICAgICAgICAgICAgICAgQWNjZXB0OiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoe1xyXG4gICAgICAgICAgICAgICAgZGF0YTogW1xyXG4gICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJEb2N1bWVudFwiLFxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGFlbGVtZW50czoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGBUaXRsZV8ke2ZpbGVuYW1lXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC50b0xvd2VyQ2FzZSgpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zcGxpdChcIiBcIilcclxuICAgICAgICAgICAgICAgICAgICAgICAgLmpvaW4oXCJfXCIpfWAsXHJcbiAgICAgICAgICAgICAgICAgICAgICBwb2xpY3k6IFwiRG9jdW1lbnQgUmVsZWFzZVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGRlc2MsXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICByZWxhdGVkZGF0YToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgZmlsZXM6IFtcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFlbGVtZW50czoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGAke2ZpbGVuYW1lfS5qc29uYCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpcHQ6IHRpY2tldCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHRlbXBJZDogVVVJRCgpLFxyXG4gICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICB0eXBlOiBcImpzb25cIixcclxuICAgICAgICAgICAgICB0aW1lb3V0OiAwLFxyXG5cclxuICAgICAgICAgICAgICBvbkNvbXBsZXRlOiBoYW5kbGVTdWNjZXNzLFxyXG4gICAgICAgICAgICAgIG9uRmFpbHVyZTogaGFuZGxlRXJyb3IsXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBpZiAoY3R4ICE9PSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgLy8gM1xyXG4gICAgICAgICAgICAgIF9odHRwQ2FsbEF1dGhlbnRpY2F0ZWQodXJscy51cmxfUG9zdCwgb3B0aW9ucyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcImxlIHN0b3JlIGVzdCB2aWRlXCIpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIG9uRmFpbHVyZTogaGFuZGxlRXJyb3IsXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBmdW5jdGlvbiBoYW5kbGVTdWNjZXNzKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJTdWNjZXNzIC0tIHJlc3BvbnNlIFwiLCByZXNwb25zZS5kYXRhWzBdKTtcclxuXHJcbiAgICAgICAgaWYgKG9uRG9uZSkge1xyXG4gICAgICAgICAgb25Eb25lKHJlc3BvbnNlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZ1bmN0aW9uIGhhbmRsZUVycm9yKHJlc3BvbnNlLCBoZWFkZXJzKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJFcnJldXIgLS0gcmVzcG9uc2UgXCIsIHJlc3BvbnNlLCBcIlxcbiBoZWFkZXJzIFwiLCBoZWFkZXJzKTtcclxuICAgICAgICBpZiAob25FcnJvcikge1xyXG4gICAgICAgICAgb25FcnJvcihyZXNwb25zZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBfaHR0cENhbGxBdXRoZW50aWNhdGVkKGluZm8udGlja2V0VVJMLCBvcHRzKTtcclxuICAgIH0sXHJcbiAgfSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gQ2V0dGUgZm9uY3Rpb24gcsOpY3Vww6hyZSBsZXMgY29udGV4dGVzIGRlIHPDqWN1cml0w6kgYmFzw6lzIHN1ciBkZXMgcGFyYW3DqHRyZXMgc3DDqWNpZmnDqXMgw6AgcGFydGlyIGQndW5cclxuICogaMO0dGUgZG9ubsOpLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gY3JlZGVudGlhbHMgLSBVbiBvYmpldCBjb250ZW5hbnQgbGVzIGluZm9ybWF0aW9ucyBkJ2lkZW50aWZpY2F0aW9uIHJlcXVpc2VzIHBvdXIgYXV0aGVudGlmaWVyXHJcbiAqIGxhIGRlbWFuZGUuIElsIGluY2x1dCBnw6luw6lyYWxlbWVudCBkZXMgcHJvcHJpw6l0w6lzIHRlbGxlcyBxdSdpY2kgwqsgc3BhY2UgwrsuKGV4OiBjcmVkZW50aWFscy5zcGFjZSwgY3JlZGVudGlhbHMudGVuYW50LCBjcmVkZW50aWFscy50b2tlbi4uLikuXHJcbiAqQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLnNwYWNlIC0gKDNEU3BhY2UpIEwnVVJMIGR1IHNlcnZldXIgc3VyIGxlcXVlbCBsJ0FQSSBlc3QgZMOpcGxvecOpZS4oM0RTcGFjZSwgM0RTd3ltLCAzRENvbXBhc3MsLi4uZXRjKVxyXG4gKiBAZXhhbXBsZSBwb3VyIGxlIDNEU3BhY2Uge3NwYWNlOlwiaHR0cHM6Ly9yMTEzMjEwMDk2ODQ0Ny1ldTEtc3BhY2UuM2RleHBlcmllbmNlLjNkcy5jb20vZW5vdmlhXCJ9XHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBbY3NdIC0gTGUgdGl0cmUgZCd1biBlc3BhY2UgZGUgY29sbGFib3JhdGlvbi5cclxuICogQHBhcmFtIHtTdHJpbmd9IFtyb2xlXSAtIExlIHBhcmFtw6h0cmUgZGUgcsO0bGUgZXN0IHVuIHBhcmFtw6h0cmUgZmFjdWx0YXRpZiBxdWkgc3DDqWNpZmllIGxlIHLDtGxlIGRlXHJcbiAqIGwndXRpbGlzYXRldXIgZGFucyBsJ2VzcGFjZSBkZSBjb2xsYWJvcmF0aW9uLiBTaSBmb3VybmksIGxhIGZvbmN0aW9uIGZpbHRyZXJhIGxlcyBlc3BhY2VzIGRlXHJcbiAqIGNvbGxhYm9yYXRpb24gcG91ciB0cm91dmVyIGNlbHVpIG/DuSBsJ3V0aWxpc2F0ZXVyIGEgbGUgcsO0bGUgc3DDqWNpZmnDqS4gUydpbCBuJ2VzdCBwYXMgZm91cm5pLCBsYVxyXG4gKiBmb25jdGlvbiB1dGlsaXNlcmEgbGUgcHJlbWllciBlc3BhY2UgZGUgY29sbGFib3JhdGlvbiB0cm91dsOpLlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gW29yZ2FuaXphdGlvbl0gLSBOb20gZGUgbCdvcmdhbmlzYXRpb24gcG91ciBsYXF1ZWxsZSBsZSBjb250ZXh0ZSBkZSBzw6ljdXJpdMOpIGVzdCByw6ljdXDDqXLDqS5cclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRG9uZV0gLSBMYSBmb25jdGlvbiDDoCBhcHBlbGVyIGxvcnNxdWUgbGUgY29udGV4dGUgZGUgc8OpY3VyaXTDqSBhIMOpdMOpIHLDqWN1cMOpcsOpIGF2ZWMgc3VjY8Oocy5cclxuICogSWwgcHJlbmQgbGUgY29udGV4dGUgY29tbWUgcGFyYW3DqHRyZS5cclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRXJyb3JdIC0gTGUgcGFyYW3DqHRyZSBvbkVycm9yIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBlc3QgYXBwZWzDqWUgc2kgdW5lIGVycmV1ciBzZVxyXG4gKiBwcm9kdWl0IGxvcnMgZGUgbCdleMOpY3V0aW9uIGRlIGxhIGZvbmN0aW9uLiBJbCBwcmVuZCB1biBhcmd1bWVudCwgcXVpIGVzdCBsZSBtZXNzYWdlIGQnZXJyZXVyIG91XHJcbiAqIGwnb2JqZXQuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gXzNEU3BhY2VfZ2V0X3NlY3VyaXR5Q29udGV4dHMoXHJcbiAgY3JlZGVudGlhbHMsXHJcbiAgY3MgPSB1bmRlZmluZWQsXHJcbiAgcm9sZSA9IHVuZGVmaW5lZCxcclxuICBvcmdhbml6YXRpb24gPSB1bmRlZmluZWQsXHJcbiAgb25Eb25lID0gdW5kZWZpbmVkLFxyXG4gIG9uRXJyb3IgPSB1bmRlZmluZWQsXHJcbikge1xyXG4gIGNvbnN0IHVybCA9XHJcbiAgICBgJHtjcmVkZW50aWFscy5zcGFjZX0vcmVzb3VyY2VzL21vZGVsZXIvcG5vL3BlcnNvbj9gICtcclxuICAgIFwiY3VycmVudD10cnVlXCIgK1xyXG4gICAgXCImc2VsZWN0PXByZWZlcnJlZGNyZWRlbnRpYWxzXCIgK1xyXG4gICAgXCImc2VsZWN0PWNvbGxhYnNwYWNlc1wiO1xyXG5cclxuICBfaHR0cENhbGxBdXRoZW50aWNhdGVkKHVybCwge1xyXG4gICAgbWV0aG9kOiBcIkdFVFwiLFxyXG4gICAgb25Db21wbGV0ZShyZXNwb25zZSkge1xyXG4gICAgICAvLyByb2xlLmNvbXBhbnkuY3NcclxuICAgICAgY29uc3QgY29udGV4dHMgPSBKU09OLnBhcnNlKHJlc3BvbnNlKTtcclxuICAgICAgbGV0IGNvbnRleHQgPSBcIlwiO1xyXG4gICAgICBsZXQgZmluYWxDcyxcclxuICAgICAgICBmaW5hbE9yZyxcclxuICAgICAgICBmaW5hbFJvbGUgPSB1bmRlZmluZWQ7XHJcbiAgICAgIGlmIChjcykge1xyXG4gICAgICAgIGxldCBvQ1MgPSBjb250ZXh0cy5jb2xsYWJzcGFjZXMuZmluZCgoZSkgPT4gZS50aXRsZSA9PT0gY3MpO1xyXG4gICAgICAgIGlmIChvQ1MpIHtcclxuICAgICAgICAgIGZpbmFsQ3MgPSBjcztcclxuICAgICAgICAgIGxldCBjb3VwbGVzID0gb0NTLmNvdXBsZXM7XHJcbiAgICAgICAgICBjb3VwbGVzID0gY291cGxlcy5maWx0ZXIoXHJcbiAgICAgICAgICAgICh2YWx1ZSwgaW5kZXgsIHNlbGYpID0+XHJcbiAgICAgICAgICAgICAgaW5kZXggPT09XHJcbiAgICAgICAgICAgICAgc2VsZi5maW5kSW5kZXgoXHJcbiAgICAgICAgICAgICAgICAodCkgPT5cclxuICAgICAgICAgICAgICAgICAgdC5vcmdhbml6YXRpb24ucGlkID09PSB2YWx1ZS5vcmdhbml6YXRpb24ucGlkICYmXHJcbiAgICAgICAgICAgICAgICAgIHQucm9sZS5waWQgPT09IHZhbHVlLnJvbGUucGlkLFxyXG4gICAgICAgICAgICAgICksXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgaWYgKHJvbGUpIHtcclxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocm9sZSkpIHtcclxuICAgICAgICAgICAgICByb2xlLmZvckVhY2goKHIpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICghZmluYWxSb2xlKVxyXG4gICAgICAgICAgICAgICAgICBjb3VwbGVzLmZvckVhY2goKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICByID09PSBlLnJvbGUubmFtZSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgb3JnYW5pemF0aW9uID09PSBlLm9yZ2FuaXphdGlvbi50aXRsZVxyXG4gICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgZmluYWxSb2xlID0gcjtcclxuICAgICAgICAgICAgICAgICAgICAgIGZpbmFsT3JnID0gb3JnYW5pemF0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAociA9PT0gZS5yb2xlLm5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGxldCBkZWZpbmVTaW5nbGVJdGVtID0gY291cGxlcy5maWx0ZXIoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjb3VwbGUpID0+IGNvdXBsZS5yb2xlLm5hbWUgPT09IHIsXHJcbiAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGRlZmluZVNpbmdsZUl0ZW0ubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsUm9sZSA9IGRlZmluZVNpbmdsZUl0ZW1bMF0ucm9sZS5uYW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbE9yZyA9IGRlZmluZVNpbmdsZUl0ZW1bMF0ub3JnYW5pemF0aW9uLnRpdGxlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb25FcnJvcihkZWZpbmVTaW5nbGVJdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGNvdXBsZXMuZm9yRWFjaCgoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICByb2xlID09PSBlLnJvbGUubmFtZSAmJlxyXG4gICAgICAgICAgICAgICAgICBvcmdhbml6YXRpb24gPT09IGUub3JnYW5pemF0aW9uLnRpdGxlXHJcbiAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgZmluYWxSb2xlID0gcm9sZTtcclxuICAgICAgICAgICAgICAgICAgZmluYWxPcmcgPSBvcmdhbml6YXRpb247XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJvbGUgPT09IGUucm9sZS5uYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBkZWZpbmVTaW5nbGVJdGVtID0gY291cGxlcy5maWx0ZXIoXHJcbiAgICAgICAgICAgICAgICAgICAgKGNvdXBsZSkgPT4gY291cGxlLnJvbGUubmFtZSA9PT0gcm9sZSxcclxuICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgaWYgKGRlZmluZVNpbmdsZUl0ZW0ubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmluYWxSb2xlID0gZGVmaW5lU2luZ2xlSXRlbVswXS5yb2xlLm5hbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgZmluYWxPcmcgPSBkZWZpbmVTaW5nbGVJdGVtWzBdLm9yZ2FuaXphdGlvbi50aXRsZTtcclxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKGRlZmluZVNpbmdsZUl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGZpbmFsQ3MgJiYgZmluYWxPcmcgJiYgZmluYWxSb2xlKSB7XHJcbiAgICAgICAgY29udGV4dCA9IGZpbmFsUm9sZSArIFwiLlwiICsgZmluYWxPcmcgKyBcIi5cIiArIGZpbmFsQ3M7XHJcbiAgICAgICAgb25Eb25lKGNvbnRleHQpO1xyXG4gICAgICAgIC8vIG9uRG9uZShlbmNvZGVVUkkoY29udGV4dCkpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmIChjb250ZXh0cy5wcmVmZXJyZWRjcmVkZW50aWFscykge1xyXG4gICAgICAgICAgY29udGV4dCA9XHJcbiAgICAgICAgICAgIGNvbnRleHRzLnByZWZlcnJlZGNyZWRlbnRpYWxzLnJvbGUubmFtZSArXHJcbiAgICAgICAgICAgIFwiLlwiICtcclxuICAgICAgICAgICAgY29udGV4dHMucHJlZmVycmVkY3JlZGVudGlhbHMub3JnYW5pemF0aW9uLnRpdGxlICtcclxuICAgICAgICAgICAgXCIuXCIgK1xyXG4gICAgICAgICAgICBjb250ZXh0cy5wcmVmZXJyZWRjcmVkZW50aWFscy5jb2xsYWJzcGFjZS50aXRsZTtcclxuICAgICAgICAgIG9uRG9uZShjb250ZXh0KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaWYgKG9uRXJyb3IpIHtcclxuICAgICAgICAgICAgY29udGV4dCA9IGZpbmFsUm9sZSArIFwiLlwiICsgZmluYWxPcmcgKyBcIi5cIiArIGZpbmFsQ3M7XHJcbiAgICAgICAgICAgIG9uRXJyb3IoY29udGV4dCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgb25GYWlsdXJlKGVycikge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkVycmV1ciBkZSByw6ljdXDDqXJhdGlvbiBkdSBjb250ZXh0ZSBkZSBzw6ljdXJpdMOpLiA9PiBcIiwgZXJyKTtcclxuICAgIH0sXHJcbiAgfSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gTGEgZm9uY3Rpb24gYF8zZHNwYWNlX2Rvd25sb2FkX2RvY2AgZXN0IHVuZSBmb25jdGlvbiBhc3luY2hyb25lIHF1aSB0w6lsw6ljaGFyZ2UgdW4gZG9jdW1lbnQgw6AgcGFydGlyIGQndW4gZXNwYWNlIDNELCBhdmVjIGRlcyByYXBwZWxzIGZhY3VsdGF0aWZzIHBvdXIgbGUgc3VjY8OocyBldCBsYSBnZXN0aW9uIGRlcyBlcnJldXJzLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gY3JlZGVudGlhbHMgVW4gb2JqZXQgY29udGVuYW50IGxlcyBpbmZvcm1hdGlvbnMgZCdpZGVudGlmaWNhdGlvbiBuw6ljZXNzYWlyZXMgw6BcclxuICogbCdhdXRoZW50aWZpY2F0aW9uLiBJbCBkb2l0IGF2b2lyIGxlcyBwcm9wcmnDqXTDqXMgc3VpdmFudGVzOiBzcGFjZSwgdG9rZW5cclxuICogQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLnNwYWNlIC0gKDNEU3BhY2UpIEwnVVJMIGR1IHNlcnZldXIgc3VyIGxlcXVlbCBsJ0FQSSBlc3QgZMOpcGxvecOpZS4oM0RTcGFjZSwgM0RTd3ltLCAzRENvbXBhc3MsLi4uZXRjKVxyXG4gKiBAZXhhbXBsZSBwb3VyIGxlIDNEU3BhY2Uge3NwYWNlOlwiaHR0cHM6Ly9yMTEzMjEwMDk2ODQ0Ny1ldTEtc3BhY2UuM2RleHBlcmllbmNlLjNkcy5jb20vZW5vdmlhXCJ9XHJcblxyXG4gKiBAcGFyYW0gIHtTdHJpbmd9IFtjcmVkZW50aWFscy50b2tlbl0gLSBMZSBwYXJhbcOodHJlIHRva2VuIGVzdCBsZSBqZXRvbiBDU1JGLiAoaGVhZGVycyBleDogRU5PX0NTUkZfVE9LRU46dG9rZW4pXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBbb2JqZWN0SWRdIC0gTGUgcGFyYW3DqHRyZSBvYmplY3RJZCBlc3QgbCdpZGVudGlmaWFudCB1bmlxdWUgZHUgZG9jdW1lbnQgcXVlIHZvdXMgc291aGFpdGV6XHJcbiAqIHTDqWzDqWNoYXJnZXIgZGVwdWlzIGxlIDNEU3BhY2UuXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkRvbmVdIC0gTGUgcGFyYW3DqHRyZSBgb25Eb25lYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBsb3JzcXVlIGxlXHJcbiAqIHTDqWzDqWNoYXJnZW1lbnQgc2VyYSB0ZXJtaW7DqSBhdmVjIHN1Y2PDqHMuIElsIHByZW5kIHVuIGFyZ3VtZW50LCBxdWkgZXN0IGxlcyBkb25uw6llcyBkZSByw6lwb25zZSBkdVxyXG4gKiB0w6lsw6ljaGFyZ2VtZW50LlxyXG4gKiBAcGFyYW0ge0NhbGxiYWNrfSBbb25FcnJvcl0gLSBMZSBwYXJhbcOodHJlIGBvbkVycm9yYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBzJ2lsIHkgYSB1bmVcclxuICogZXJyZXVyIGxvcnMgZGUgbCdleMOpY3V0aW9uIGRlIGxhIGZvbmN0aW9uIGBfM2RzcGFjZV9kb3dubG9hZF9kb2NgLiBJbCB2b3VzIHBlcm1ldCBkZSBnw6lyZXIgZXQgZGVcclxuICogcsOpcG9uZHJlIMOgIHRvdXRlcyBsZXMgZXJyZXVycyBxdWkgc2UgcHJvZHVpc2VudC5cclxuIFxyXG4gKiBAcmV0dXJucyB1bmUgcHJvbWVzc2UuXHJcbiAqL1xyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gXzNEU3BhY2VfZG93bmxvYWRfZG9jKFxyXG4gIGNyZWRlbnRpYWxzLFxyXG4gIG9uRG9uZSA9IHVuZGVmaW5lZCxcclxuICBvbkVycm9yID0gdW5kZWZpbmVkLFxyXG4gIG1lc3NhZ2UgPSB1bmRlZmluZWQsXHJcbikge1xyXG4gIGNvbnN0IG9iamVjdElkID0gY3JlZGVudGlhbHMub2JqSUQ7XHJcbiAgaWYgKG9iamVjdElkID09PSB1bmRlZmluZWQgfHwgb2JqZWN0SWQgPT09IFwiXCIpIHtcclxuICAgIGNvbnNvbGUud2FybihcclxuICAgICAgXCJfM0RTcGFjZV9kb3dubG9hZF9kb2MoKSAvIExlIHBhcmFtw6h0cmUgb2JqZWN0SWQgZXN0IG9ibGlnYXRvaXJlXCIsXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgaWYgKGNyZWRlbnRpYWxzLnNwYWNlID09PSBcIlwiIHx8ICFjcmVkZW50aWFscy5zcGFjZSkge1xyXG4gICAgY29uc29sZS53YXJuKFxyXG4gICAgICBcIl8zRFNwYWNlX2Rvd25sb2FkX2RvYygpIC8gTGUgcGFyYW3DqHRyZSBzcGFjZSBlc3Qgb2JsaWdhdG9pcmVcIixcclxuICAgICk7XHJcbiAgfVxyXG4gIHRyeSB7XHJcbiAgICBfM0RTcGFjZV9maWxlX3VybChcclxuICAgICAgY3JlZGVudGlhbHMsXHJcbiAgICAgIG9iamVjdElkLFxyXG4gICAgICAocmVzcG9uc2UpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcclxuICAgICAgICAgIFwiXzNkc3BhY2VfZG93bmxvYWRfZG9jIC8gXzNEU3BhY2VfZmlsZV91cmwgLyByZXNwb25zZSBcIixcclxuICAgICAgICAgIHJlc3BvbnNlLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgX2h0dHBDYWxsQXV0aGVudGljYXRlZChyZXNwb25zZSwge1xyXG4gICAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICBFTk9fQ1NSRl9UT0tFTjogY3JlZGVudGlhbHMudG9rZW4sXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgb25Db21wbGV0ZShyZXNwb25zZSkge1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBKU09OLnBhcnNlKHJlc3BvbnNlKTtcclxuICAgICAgICAgICAgaWYgKG9uRG9uZSkgb25Eb25lKHJlc3VsdCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgb25GYWlsdXJlKGVycm9yLCBoZWFkZXJzLCB4aHIpIHtcclxuICAgICAgICAgICAgaWYgKG9uRXJyb3IpIHtcclxuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImVycm9yIGh0dHBcIiwgZXJyb3IpO1xyXG4gICAgICAgICAgICAgIG9uRXJyb3IoeyBlcnJvciwgaGVhZGVycywgeGhyIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9LFxyXG4gICAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICBpZiAob25FcnJvcikgb25FcnJvcihlcnJvcik7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCIqXzNkc3BhY2VfZG93bmxvYWRfZG9jIC8gZXJyb3IgZmlsZSBVUkwgKlwiLCBlcnJvcik7XHJcbiAgICAgIH0sXHJcbiAgICApO1xyXG4gIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICBjb25zb2xlLmxvZyhcIipfM2RzcGFjZV9kb3dubG9hZF9kb2MgLyBlcnJvciBmaWxlIFVSTCAqXCIsIGVycm9yKTtcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gTGEgZm9uY3Rpb24gYF8zZHNwYWNlX2Rvd25sb2FkX211bHRpZG9jYCB0w6lsw6ljaGFyZ2UgcGx1c2lldXJzIGRvY3VtZW50cyDDoCBwYXJ0aXIgZCd1biBlc3BhY2UgM0QgZW5cclxuICogdXRpbGlzYW50IHVuIHRva2VuIGV0IGRlcyBvYmplY3RJRCBkb25uw6lzLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gY3JlZGVudGlhbHMgLSBVbiBvYmpldCBjb250ZW5hbnQgbGVzIGluZm9ybWF0aW9ucyBkJ2lkZW50aWZpY2F0aW9uIG7DqWNlc3NhaXJlcyDDoFxyXG4gKiBsJ2F1dGhlbnRpZmljYXRpb24gZGFucyB1bmUgZm9uY3Rpb24gaW50ZXJuZShfM0RTcGFjZV9nZXRfZG93bmxvYWRUaWNrZXRfbXVsdGlkb2MpLiBJbCBkb2l0IGF2b2lyIGxlcyBwcm9wcmnDqXTDqXMgc3VpdmFudGVzOiBzcGFjZSwgdG9rZW4sIHRlbmFudFxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMuc3BhY2UgLSAoM0RTcGFjZSkgTCdVUkwgZHUgc2VydmV1ciBzdXIgbGVxdWVsIGwnQVBJIGVzdCBkw6lwbG95w6llLigzRFNwYWNlLCAzRFN3eW0sIDNEQ29tcGFzcywuLi5ldGMpXHJcbiAqIEBleGFtcGxlIHBvdXIgbGUgM0RTcGFjZSB7c3BhY2U6XCJodHRwczovL3IxMTMyMTAwOTY4NDQ3LWV1MS1zcGFjZS4zZGV4cGVyaWVuY2UuM2RzLmNvbS9lbm92aWFcIn1cclxuICogQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLnRlbmFudCAtIGxlIHRlbmFudCBjb3VyYW50IFxyXG4gKiBAZXhhbXBsZSB7dGVuYW50OlwiUjExMzIxMDA5Njg0NDdcIn1cclxuICogQHBhcmFtIHtTdHJpbmd9IFtjcmVkZW50aWFscy50b2tlbl0gLSBMZSBwYXJhbcOodHJlIHRva2VuIGVzdCBsZSBqZXRvbiBDU1JGLiAoaGVhZGVycyBleDogRU5PX0NTUkZfVE9LRU46dG9rZW4pXHJcblxyXG4gKiBAcGFyYW0ge1N0cmluZ30gW29iamVjdElkc10gLSBVbiB0YWJsZWF1IGQnSUQgZCdvYmpldCBxdWkgZG9pdmVudCDDqnRyZSB0w6lsw6ljaGFyZ8OpcyDDoCBwYXJ0aXIgZHUgM0RTcGFjZS5cclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRG9uZV0gLSBMZSBwYXJhbcOodHJlIGBvbkRvbmVgIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIGxvcnNxdWUgbGVcclxuICogcHJvY2Vzc3VzIGRlIHTDqWzDqWNoYXJnZW1lbnQgc2VyYSB0ZXJtaW7DqSBhdmVjIHN1Y2PDqHMuIElsIGZhdXQgdW4gYXJndW1lbnQsIHF1aSBlc3QgbGUgcsOpc3VsdGF0IGR1XHJcbiAqIHByb2Nlc3N1cyBkZSB0w6lsw6ljaGFyZ2VtZW50LlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25FcnJvcl0gLSBMZSBwYXJhbcOodHJlIGBvbkVycm9yYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBzJ2lsIHkgYSB1bmVcclxuICogZXJyZXVyIHBlbmRhbnQgbGUgcHJvY2Vzc3VzIGRlIHTDqWzDqWNoYXJnZW1lbnQuIElsIHZvdXMgcGVybWV0IGRlIGfDqXJlciBsZXMgZXJyZXVycyBxdWkgc3Vydmllbm5lbnRcclxuICogbG9ycyBkdSB0w6lsw6ljaGFyZ2VtZW50LlxyXG5cclxuICovXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBfM0RTcGFjZV9kb3dubG9hZF9tdWx0aWRvYyhcclxuICBjcmVkZW50aWFscyxcclxuICBvYmplY3RJZHMsXHJcbiAgb25Eb25lID0gdW5kZWZpbmVkLFxyXG4gIG9uRXJyb3IgPSB1bmRlZmluZWQsXHJcbikge1xyXG4gIGxldCBsaXN0RGl2ID0gW107XHJcbiAgY29uc3QgY2h1bmtTaXplID0gODA7XHJcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYmplY3RJZHMubGVuZ3RoOyBpICs9IGNodW5rU2l6ZSkge1xyXG4gICAgY29uc3QgY2h1bmsgPSBvYmplY3RJZHMuc2xpY2UoaSwgaSArIGNodW5rU2l6ZSk7XHJcbiAgICBsaXN0RGl2LnB1c2goY2h1bmspO1xyXG4gIH1cclxuICBjb25zdCBsb29wID0gKGkpID0+IHtcclxuICAgIF8zRFNwYWNlX2dldF9kb3dubG9hZFRpY2tldF9tdWx0aWRvYyhcclxuICAgICAgY3JlZGVudGlhbHMsXHJcbiAgICAgIGxpc3REaXZbaV0sXHJcbiAgICAgICgpID0+IHtcclxuICAgICAgICBpKys7XHJcbiAgICAgICAgaWYgKGkgPCBsaXN0RGl2Lmxlbmd0aCkge1xyXG4gICAgICAgICAgbG9vcChpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIChkb25lKSA9PiB7XHJcbiAgICAgICAgaWYgKG9uRG9uZSkgb25Eb25lKGRvbmUpO1xyXG4gICAgICB9LFxyXG4gICAgKTtcclxuICB9O1xyXG5cclxuICBsb29wKDApO1xyXG59XHJcblxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIExhIGZvbmN0aW9uIGBfM2RzcGFjZV9nZXRfZG93bmxvYWRUaWNrZXRfbXVsdGlkb2NgIHBlcm1ldCBkZSByw6ljdXDDqXJlciB1biB0aWNrZXQgZGUgdMOpbMOpY2hhcmdlbWVudFxyXG4gKiBkZSBwbHVzaWV1cnMgZG9jdW1lbnRzIGRhbnMgdW4gZXNwYWNlIDNELlxyXG4gKiBAcGFyYW0ge09iamVjdH0gW2NyZWRlbnRpYWxzXSAtIFVuIG9iamV0IGNvbnRlbmFudCBsZXMgaW5mb3JtYXRpb25zIGQnaWRlbnRpZmljYXRpb24gbsOpY2Vzc2FpcmVzIMOgXHJcbiAqIGwnYXV0aGVudGlmaWNhdGlvbi4gSWwgZG9pdCBhdm9pciBsZXMgcHJvcHJpw6l0w6lzIHN1aXZhbnRlczogc3BhY2UsIHRva2VuLCB0ZW5hbnRcclxuICogQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLnNwYWNlIC0gKDNEU3BhY2UpIEwnVVJMIGR1IHNlcnZldXIgc3VyIGxlcXVlbCBsJ0FQSSBlc3QgZMOpcGxvecOpZS4oM0RTcGFjZSwgM0RTd3ltLCAzRENvbXBhc3MsLi4uZXRjKVxyXG4gKiBAZXhhbXBsZSBwb3VyIGxlIDNEU3BhY2Uge3NwYWNlOlwiaHR0cHM6Ly9yMTEzMjEwMDk2ODQ0Ny1ldTEtc3BhY2UuM2RleHBlcmllbmNlLjNkcy5jb20vZW5vdmlhXCJ9XHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjcmVkZW50aWFscy50ZW5hbnQgLSBsZSB0ZW5hbnQgY291cmFudFxyXG4gKiBAZXhhbXBsZSB7dGVuYW50OlwiUjExMzIxMDA5Njg0NDdcIn1cclxuICogQHBhcmFtIHtTdHJpbmd9IFtjcmVkZW50aWFscy50b2tlbl0gLSBMZSBwYXJhbcOodHJlIHRva2VuIGVzdCBsZSBqZXRvbiBDU1JGLiAoaGVhZGVycyBleDogRU5PX0NTUkZfVE9LRU46dG9rZW4pXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBbb2JqZWN0SWRzXSAtIFRhYmxlYXUgZCdJRCBkJ29iamV0IHBvdXIgbGVzcXVlbHMgbGUgdGlja2V0IGRlIHTDqWzDqWNoYXJnZW1lbnQgZG9pdCDDqnRyZSBnw6luw6lyw6kuXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbk5leHRdIC0gVW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBhcHLDqHMgY2hhcXVlIGRlbWFuZGUgZGUgdGlja2V0IGRlXHJcbiAqIHTDqWzDqWNoYXJnZW1lbnQgcsOpdXNzaWUgcG91ciBjaGFxdWUgb2JqZWN0SWQuXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkRvbmVdIC0gTGUgcGFyYW3DqHRyZSBgb25Eb25lYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBsb3JzcXVlIGxlXHJcbiAqIHByb2Nlc3N1cyBkZSB0w6lsw6ljaGFyZ2VtZW50IGRlIGNoYXF1ZSBvYmpldCBzZXJhIHRlcm1pbsOpIGF2ZWMgc3VjY8Oocy4gSWwgbHVpIHNlcmEgdHJhbnNtaXMgdW4gb2JqZXRcclxuICogY29udGVuYW50IMKrIG9iamVjdElkIMK7LCDCqyBmaWxlTmFtZSDCuyBldCDCqyBkYXRhIMK7IGR1IGZpY2hpZXIgdMOpbMOpY2hhcmfDqS5cclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRXJyb3JdIC0gTGUgcGFyYW3DqHRyZSBgb25FcnJvcmAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgcydpbCB5IGEgdW5lXHJcbiAqIGVycmV1ciBsb3JzIGRlIGwnZXjDqWN1dGlvbiBkZSBsYSBmb25jdGlvbi4gSWwgZXN0IGZhY3VsdGF0aWYgZXQgcGV1dCDDqnRyZSB1dGlsaXPDqSBwb3VyIGfDqXJlciBsZXNcclxuICogZXJyZXVycyBxdWkgc3Vydmllbm5lbnQuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gXzNEU3BhY2VfZ2V0X2Rvd25sb2FkVGlja2V0X211bHRpZG9jKFxyXG4gIGNyZWRlbnRpYWxzLFxyXG4gIG9iamVjdElkcyxcclxuICBvbk5leHQgPSB1bmRlZmluZWQsXHJcbiAgb25Eb25lID0gdW5kZWZpbmVkLFxyXG4gIG9uRXJyb3IgPSB1bmRlZmluZWQsXHJcbikge1xyXG4gIGNvbnN0IGNvbXBpbERhdGEgPSBbXTtcclxuICBvYmplY3RJZHMuZm9yRWFjaCgob2JqZWN0SWQpID0+IHtcclxuICAgIGNvbXBpbERhdGEucHVzaCh7XHJcbiAgICAgIGlkOiBvYmplY3RJZCxcclxuICAgIH0pO1xyXG4gIH0pO1xyXG4gIGxldCBkYXRhID0gSlNPTi5zdHJpbmdpZnkoe1xyXG4gICAgY3NyZjoge1xyXG4gICAgICBuYW1lOiBcIkVOT19DU1JGX1RPS0VOXCIsXHJcbiAgICAgIHZhbHVlOiBjcmVkZW50aWFscy50b2tlbixcclxuICAgIH0sXHJcbiAgICBkYXRhOiBjb21waWxEYXRhLFxyXG4gIH0pO1xyXG5cclxuICBjb25zdCB1cmwgPSBgJHtjcmVkZW50aWFscy5zcGFjZX0vcmVzb3VyY2VzL3YxL21vZGVsZXIvZG9jdW1lbnRzL0Rvd25sb2FkVGlja2V0P3RlbmFudD0ke2NyZWRlbnRpYWxzLnRlbmFudH0mZTZ3LWxhbmc9ZnImZTZ3LXRpbWV6b25lPS0xMjBgO1xyXG4gIF9odHRwQ2FsbEF1dGhlbnRpY2F0ZWQodXJsLCB7XHJcbiAgICBtZXRob2Q6IFwiUFVUXCIsXHJcbiAgICBkYXRhLFxyXG4gICAgdHlwZTogXCJqc29uXCIsXHJcbiAgICBvbkNvbXBsZXRlKHJlc3BvbnNlKSB7XHJcbiAgICAgIGNvbnN0IGRhdGFzID0gcmVzcG9uc2UuZGF0YTtcclxuICAgICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MgPT09IHRydWUpIHtcclxuICAgICAgICBpZiAob25OZXh0KSBvbk5leHQoKTtcclxuICAgICAgICBkYXRhcy5mb3JFYWNoKChkYXRhKSA9PiB7XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCBmaWxlTmFtZSA9IGRhdGEuZGF0YWVsZW1lbnRzLmZpbGVOYW1lO1xyXG4gICAgICAgICAgICBjb25zdCBmaWxlVXJsID0gZGF0YS5kYXRhZWxlbWVudHMudGlja2V0VVJMO1xyXG4gICAgICAgICAgICBfaHR0cENhbGxBdXRoZW50aWNhdGVkKGZpbGVVcmwsIHtcclxuICAgICAgICAgICAgICBvbkNvbXBsZXRlOiAocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChvbkRvbmUpXHJcbiAgICAgICAgICAgICAgICAgIG9uRG9uZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0SWQ6IGRhdGEuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogSlNPTi5wYXJzZShyZXNwb25zZSksXHJcbiAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgb25GYWlsdXJlOiAoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiZXJyb3IgaHR0cFwiLCBlcnJvcik7XHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgICAgICAgaWYgKG9uRXJyb3IpIG9uRXJyb3IoZXJyKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIG9uRmFpbHVyZShyZXNwb25zZSkge1xyXG4gICAgICBjb25zb2xlLmxvZyhyZXNwb25zZSk7XHJcbiAgICAgIGlmIChvbkVycm9yKSBvbkVycm9yKHJlc3BvbnNlKTtcclxuICAgIH0sXHJcbiAgfSk7XHJcbn1cclxuXHJcbi8vIE1BVFVSSVRZXHJcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gQ2V0dGUgZm9uY3Rpb24gSmF2YVNjcmlwdCByw6ljdXDDqHJlIGxlcyBwcm9jaGFpbnMgw6l0YXRzIHBvc3NpYmxlcyBwb3VyIHVuIG9iamV0IGRvbm7DqSBkYW5zIHVuIGVzcGFjZVxyXG4gKiAzRC5cclxuICogQHBhcmFtIHtPYmplY3R9IGNyZWRlbnRpYWxzIC0gVW4gb2JqZXQgY29udGVuYW50IGxlcyBpbmZvcm1hdGlvbnMgZCdpZGVudGlmaWNhdGlvbiByZXF1aXNlcyBwb3VyIGF1dGhlbnRpZmllclxyXG4gKiBsYSBkZW1hbmRlLiBJbCBpbmNsdXQgZ8OpbsOpcmFsZW1lbnQgZGVzIHByb3ByacOpdMOpcyB0ZWxsZXMgcXVlIMKrIHRva2VuIMK7LCDCqyBzcGFjZSDCuyBldCDCqyBjdHggwrsuXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjcmVkZW50aWFscy5zcGFjZSAtICgzRFNwYWNlKSBMJ1VSTCBkdSBzZXJ2ZXVyIHN1ciBsZXF1ZWwgbCdBUEkgZXN0IGTDqXBsb3nDqWUuKDNEU3BhY2UsIDNEU3d5bSwgM0RDb21wYXNzLC4uLmV0YylcclxuICogQGV4YW1wbGUgcG91ciBsZSAzRFNwYWNlIHtzcGFjZTpcImh0dHBzOi8vcjExMzIxMDA5Njg0NDctZXUxLXNwYWNlLjNkZXhwZXJpZW5jZS4zZHMuY29tL2Vub3ZpYVwifVxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMudG9rZW4gLSBMZSBwYXJhbcOodHJlIHRva2VuIGVzdCBsZSBqZXRvbiBDU1JGLiAoaGVhZGVycyBleDogRU5PX0NTUkZfVE9LRU46dG9rZW4pXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjcmVkZW50aWFscy5jdHggLSBMJ0lEIGR1IGNvbnRleHRlIGRlIHRyYXZhaWwuXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBvYmplY3RJZCAtIExlIHBhcmFtw6h0cmUgYG9iamVjdElkYCBlc3QgbCdpZGVudGlmaWFudCBkZSBsJ29iamV0IGRvbnQgdm91cyBzb3VoYWl0ZXogcsOpY3Vww6lyZXJcclxuICogbGVzIHByb2NoYWlucyDDqXRhdHMuIElsIGVzdCB1dGlsaXPDqSBwb3VyIHNww6ljaWZpZXIgbCdvYmpldCBwb3VyIGxlcXVlbCB2b3VzIHNvdWhhaXRleiBvYnRlbmlyIGxlc1xyXG4gKiDDqXRhdHMgc3VpdmFudHMgZGFucyBsJ2VzcGFjZSAzRC5cclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRG9uZV0gLSBVbmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIGxvcnNxdWUgbGEgZGVtYW5kZSBzZXJhIHRlcm1pbsOpZSBhdmVjXHJcbiAqIHN1Y2PDqHMuIElsIHJlY2V2cmEgbGEgcsOpcG9uc2UgZW4gcGFyYW3DqHRyZS5cclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRXJyb3JdIC0gTGUgcGFyYW3DqHRyZSBgb25FcnJvcmAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgcydpbCB5IGEgdW5lXHJcbiAqIGVycmV1ciBsb3JzIGRlIGwnZXjDqWN1dGlvbiBkZSBsYSBmb25jdGlvbi4gSWwgcydhZ2l0IGQndW4gcGFyYW3DqHRyZSBmYWN1bHRhdGlmLCBkb25jIHMnaWwgbidlc3QgcGFzXHJcbiAqIGZvdXJuaSwgaWwgc2VyYSBwYXIgZMOpZmF1dCDCq25vbiBkw6lmaW5pwrsuXHJcbiAqIEByZXR1cm4ge1Byb21pc2V9XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gXzNEU3BhY2VfbGlmZWN5Y2xlX2dldE5leHRTdGF0ZXMoXHJcbiAgY3JlZGVudGlhbHMsXHJcbiAgb2JqZWN0SWQsXHJcbiAgb25Eb25lID0gdW5kZWZpbmVkLFxyXG4gIG9uRXJyb3IgPSB1bmRlZmluZWQsXHJcbikge1xyXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzdWx0KSA9PiB7XHJcbiAgICBpZiAoY3JlZGVudGlhbHMudG9rZW4gPT09IFwiXCIpIHtcclxuICAgICAgXzNEU3BhY2VfY3NyZihjcmVkZW50aWFscyk7XHJcbiAgICB9XHJcbiAgICBpZiAob2JqZWN0SWQgIT09IHVuZGVmaW5lZCAmJiBvYmplY3RJZCAhPT0gXCJcIiAmJiBvYmplY3RJZCAhPT0gbnVsbCkge1xyXG4gICAgICBjb25zdCB1cmwgPSBgJHtjcmVkZW50aWFscy5zcGFjZX0vcmVzb3VyY2VzL3YxL21vZGVsZXIvZHNsYy9tYXR1cml0eS9nZXROZXh0U3RhdGVzYDtcclxuXHJcbiAgICAgIF8zRFNwYWNlX2dldF9zZWN1cml0eUNvbnRleHRzKFxyXG4gICAgICAgIGNyZWRlbnRpYWxzLnNwYWNlLFxyXG4gICAgICAgIFwiRVNQQUNFIENPTU1VTlwiLFxyXG4gICAgICAgIFtcIlZQTE1Qcm9qZWN0TGVhZGVyXCIsIFwiVlBMTUNyZWF0b3JcIl0sXHJcbiAgICAgICAgdW5kZWZpbmVkLFxyXG4gICAgICAgIChjdHgpID0+IChjcmVkZW50aWFsc1tcImN0eFwiXSA9IGN0eCksXHJcbiAgICAgICAgKGVycikgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coXCJvbkVycm9yID0+XCIsIGVycik7XHJcbiAgICAgICAgfSxcclxuICAgICAgKTtcclxuICAgICAgbGV0IG9wdGlvbnMgPSB7XHJcbiAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcclxuICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICBTZWN1cml0eUNvbnRleHQ6IFwiY3R4OjpcIiArIGNyZWRlbnRpYWxzLmN0eCxcclxuICAgICAgICAgIEVOT19DU1JGX1RPS0VOOiBjcmVkZW50aWFscy50b2tlbixcclxuICAgICAgICAgIEFjY2VwdDogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgICB9LFxyXG4gICAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KHtcclxuICAgICAgICAgIGRhdGE6IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGlkOiBvYmplY3RJZCxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIF0sXHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgdHlwZTogXCJqc29uXCIsXHJcbiAgICAgICAgb25Db21wbGV0ZShyZXNwb25zZSkge1xyXG4gICAgICAgICAgaWYgKG9uRG9uZSkgb25Eb25lKHJlc3BvbnNlKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uRmFpbHVyZShyZXNwb25zZSkge1xyXG4gICAgICAgICAgaWYgKG9uRXJyb3IpIG9uRXJyb3IocmVzcG9uc2UpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH07XHJcbiAgICAgIF9odHRwQ2FsbEF1dGhlbnRpY2F0ZWQodXJsLCBvcHRpb25zKTtcclxuICAgIH1cclxuICB9KTtcclxufVxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIENldHRlIGZvbmN0aW9uIHBlcm1ldCBkZSBjaGFuZ2VyIGwnw6l0YXQgZCd1biBvYmpldCBkYW5zIHVuIGVzcGFjZSAzRC5cclxuICogQHBhcmFtIHtPYmplY3R9IGNyZWRlbnRpYWxzIC0gVW4gb2JqZXQgY29udGVuYW50IGxlcyBpbmZvcm1hdGlvbnMgZCdpZGVudGlmaWNhdGlvbiByZXF1aXNlcyBwb3VyIGF1dGhlbnRpZmllclxyXG4gKiBsYSBkZW1hbmRlLiBJbCBpbmNsdXQgZ8OpbsOpcmFsZW1lbnQgZGVzIHByb3ByacOpdMOpcyB0ZWxsZXMgcXVlIMKrIHRva2VuIMK7LCDCqyBzcGFjZSDCuyBldCDCqyBjdHggwrsuXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjcmVkZW50aWFscy5zcGFjZSAtICgzRFNwYWNlKSBMJ1VSTCBkdSBzZXJ2ZXVyIHN1ciBsZXF1ZWwgbCdBUEkgZXN0IGTDqXBsb3nDqWUuKDNEU3BhY2UsIDNEU3d5bSwgM0RDb21wYXNzLC4uLmV0YylcclxuICogQGV4YW1wbGUgcG91ciBsZSAzRFNwYWNlIHtzcGFjZTpcImh0dHBzOi8vcjExMzIxMDA5Njg0NDctZXUxLXNwYWNlLjNkZXhwZXJpZW5jZS4zZHMuY29tL2Vub3ZpYVwifVxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMudG9rZW4gLSBMZSBwYXJhbcOodHJlIHRva2VuIGVzdCBsZSBqZXRvbiBDU1JGLiAoaGVhZGVycyBleDogRU5PX0NTUkZfVE9LRU46dG9rZW4pXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjcmVkZW50aWFscy5jdHggLSBMJ0lEIGR1IGNvbnRleHRlIGRlIHRyYXZhaWwuXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBvYmplY3RJZCAtIExlIHBhcmFtw6h0cmUgb2JqZWN0SWQgZXN0IGwnaWRlbnRpZmlhbnQgZGUgbCdvYmpldCBkb250IGwnw6l0YXQgZG9pdCDDqnRyZSBtb2RpZmnDqS5cclxuICogSWwgcydhZ2l0IGQndW4gaWRlbnRpZmlhbnQgdW5pcXVlIHF1aSByZXByw6lzZW50ZSB1biBvYmpldCBzcMOpY2lmaXF1ZSBkYW5zIGxlIHN5c3TDqG1lLlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbbmV4dFN0YXRlXSAtIExlIHBhcmFtw6h0cmUgYG5leHRTdGF0ZWAgZXN0IGwnw6l0YXQgc291aGFpdMOpIHZlcnMgbGVxdWVsIHZvdXMgc291aGFpdGV6IG1vZGlmaWVyXHJcbiAqIGwnb2JqZXQuIElsIHJlcHLDqXNlbnRlIGwnw6l0YXQgc3VpdmFudCBkdSBjeWNsZSBkZSB2aWUgZGUgbCdvYmpldC5cclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRG9uZV0gLSBVbmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIGxvcnNxdWUgbCdvcMOpcmF0aW9uIGRlIGNoYW5nZW1lbnQgZCfDqXRhdFxyXG4gKiBzZXJhIHRlcm1pbsOpZSBhdmVjIHN1Y2PDqHMuIElsIHByZW5kIGxhIHLDqXBvbnNlIGNvbW1lIGFyZ3VtZW50LlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25FcnJvcl0gLSBMZSBwYXJhbcOodHJlIGBvbkVycm9yYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBzJ2lsIHkgYSB1bmVcclxuICogZXJyZXVyIGxvcnMgZGUgbCdleMOpY3V0aW9uIGRlIGxhIGZvbmN0aW9uIGBfM2RzcGFjZV9saWZlY3lsZV9jaGFuZ2VTdGF0ZWAuIEMnZXN0IHVuIHBhcmFtw6h0cmVcclxuICogZmFjdWx0YXRpZiwgZG9uYyBzJ2lsIG4nZXN0IHBhcyBmb3VybmksIGxhIGZvbmN0aW9uIG5lIGZlcmEgcmllbiBlbiBjYXMgZGUgcHJvYmzDqG1lLlxyXG4gKiBAcmV0dXJucyB1bmUgcHJvbWVzc2UuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gXzNEU3BhY2VfbGlmZWN5Y2xlX2NoYW5nZVN0YXRlKFxyXG4gIGNyZWRlbnRpYWxzLFxyXG4gIG9iamVjdElkLFxyXG4gIG5leHRTdGF0ZSxcclxuICBvbkRvbmUgPSB1bmRlZmluZWQsXHJcbiAgb25FcnJvciA9IHVuZGVmaW5lZCxcclxuKSB7XHJcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXN1bHQpID0+IHtcclxuICAgIGlmIChjcmVkZW50aWFscy50b2tlbiA9PT0gXCJcIikge1xyXG4gICAgICBfM0RTcGFjZV9jc3JmKGNyZWRlbnRpYWxzKTtcclxuICAgIH1cclxuICAgIGlmIChvYmplY3RJZCAhPT0gdW5kZWZpbmVkICYmIG9iamVjdElkICE9PSBcIlwiICYmIG9iamVjdElkICE9PSBudWxsKSB7XHJcbiAgICAgIGNvbnN0IHVybCA9IGAke2NyZWRlbnRpYWxzLnNwYWNlfS9yZXNvdXJjZXMvdjEvbW9kZWxlci9kc2xjL21hdHVyaXR5L2NoYW5nZVN0YXRlYDtcclxuXHJcbiAgICAgIF8zRFNwYWNlX2dldF9zZWN1cml0eUNvbnRleHRzKFxyXG4gICAgICAgIGNyZWRlbnRpYWxzLnNwYWNlLFxyXG4gICAgICAgIFwiRVNQQUNFIENPTU1VTlwiLFxyXG4gICAgICAgIFtcIlZQTE1Qcm9qZWN0TGVhZGVyXCIsIFwiVlBMTUNyZWF0b3JcIl0sXHJcbiAgICAgICAgdW5kZWZpbmVkLFxyXG4gICAgICAgIChjdHgpID0+IChjcmVkZW50aWFsc1tcImN0eFwiXSA9IGN0eCksXHJcbiAgICAgICAgKGVycikgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coXCJvbkVycm9yID0+XCIsIGVycik7XHJcbiAgICAgICAgfSxcclxuICAgICAgKTtcclxuICAgICAgbGV0IG9wdGlvbnMgPSB7XHJcbiAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcclxuICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICBTZWN1cml0eUNvbnRleHQ6IFwiY3R4OjpcIiArIGNyZWRlbnRpYWxzLmN0eCxcclxuICAgICAgICAgIEVOT19DU1JGX1RPS0VOOiBjcmVkZW50aWFscy50b2tlbixcclxuICAgICAgICAgIEFjY2VwdDogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgICB9LFxyXG4gICAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KHtcclxuICAgICAgICAgIGRhdGE6IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGlkOiBvYmplY3RJZCxcclxuICAgICAgICAgICAgICBuZXh0U3RhdGUsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICBdLFxyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHR5cGU6IFwianNvblwiLFxyXG4gICAgICAgIG9uQ29tcGxldGUocmVzcG9uc2UpIHtcclxuICAgICAgICAgIGlmIChvbkRvbmUpIG9uRG9uZShyZXNwb25zZSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBvbkZhaWx1cmUocmVzcG9uc2UpIHtcclxuICAgICAgICAgIGlmIChvbkVycm9yKSBvbkVycm9yKHJlc3BvbnNlKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9O1xyXG4gICAgICBfaHR0cENhbGxBdXRoZW50aWNhdGVkKHVybCwgb3B0aW9ucyk7XHJcbiAgICB9XHJcbiAgfSk7XHJcbn1cclxuLy8gUkVTRVJWQVRJT05cclxuLy9UT0RPIC1cclxuZnVuY3Rpb24gXzNEU3BhY2VfbGlmZWN5bGVfcmVzZXJ2ZShcclxuICBob3N0LFxyXG4gIG9iamVjdElkLFxyXG4gIG9uRG9uZSA9IHVuZGVmaW5lZCxcclxuICBvbkVycm9yID0gdW5kZWZpbmVkLFxyXG4pIHtcclxuICAvLyAuLi5cclxufVxyXG4vL1RPRE8gLVxyXG5mdW5jdGlvbiBfM0RTcGFjZV9saWZlY3lsZV91bnJlc2VydmUoXHJcbiAgaG9zdCxcclxuICBvYmplY3RJZCxcclxuICBvbkRvbmUgPSB1bmRlZmluZWQsXHJcbiAgb25FcnJvciA9IHVuZGVmaW5lZCxcclxuKSB7XHJcbiAgLy8gLi4uXHJcbn1cclxuLy8gU0hBUklOR1xyXG4vL1RPRE8gLVxyXG5mdW5jdGlvbiBfM0RTcGFjZV9saWZlY3lsZV9nZXRTaGFyaW5nKFxyXG4gIGhvc3QsXHJcbiAgb2JqZWN0SWQsXHJcbiAgb25Eb25lID0gdW5kZWZpbmVkLFxyXG4gIG9uRXJyb3IgPSB1bmRlZmluZWQsXHJcbikge1xyXG4gIC8vIC4uLlxyXG59XHJcbi8vVE9ETyAtXHJcbmZ1bmN0aW9uIF8zRFNwYWNlX2xpZmVjeWxlX3NldFNoYXJpbmcoXHJcbiAgaG9zdCxcclxuICBvYmplY3RJZCxcclxuICBvbkRvbmUgPSB1bmRlZmluZWQsXHJcbiAgb25FcnJvciA9IHVuZGVmaW5lZCxcclxuKSB7XHJcbiAgLy8gLi4uXHJcbn1cclxuLy8gVkVSU0lPTklOR1xyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIExhIGZvbmN0aW9uIGBfM0RTcGFjZV9saWZlY3ljbGVfZ2V0R3JhcGhgIHLDqWN1cMOocmUgdW4gZ3JhcGhpcXVlIGR1IGN5Y2xlIGRlIHZpZSBkJ3VuIG9iamV0IHNwYXRpYWxcclxuICogM0Qgw6AgbCdhaWRlIGRlcyBpbmZvcm1hdGlvbnMgZCdpZGVudGlmaWNhdGlvbiBldCBkZSBsJ0lEIGQnb2JqZXQgZm91cm5pcy5cclxuICogQHBhcmFtIHtPYmplY3R9IGNyZWRlbnRpYWxzIC0gVW4gb2JqZXQgY29udGVuYW50IGxlcyBpbmZvcm1hdGlvbnMgZCdpZGVudGlmaWNhdGlvbiByZXF1aXNlcyBwb3VyIGF1dGhlbnRpZmllciBsYSBkZW1hbmRlLlxyXG4gKiAgSWwgaW5jbHV0IGfDqW7DqXJhbGVtZW50IGRlcyBwcm9wcmnDqXTDqXMgdGVsbGVzIHF1ZSDCqyB0b2tlbiDCuywgwqsgc3BhY2UgwrssIMKrIHRlbmFudCDCuyBldCDCqyBjdHggwrsuKGV4OiBjcmVkZW50aWFscy5zcGFjZSwgY3JlZGVudGlhbHMudGVuYW50LCBjcmVkZW50aWFscy50b2tlbi4uLikuXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjcmVkZW50aWFscy5zcGFjZSAtICgzRFNwYWNlKSBMJ1VSTCBkdSBzZXJ2ZXVyIHN1ciBsZXF1ZWwgbCdBUEkgZXN0IGTDqXBsb3nDqWUuKDNEU3BhY2UsIDNEU3d5bSwgM0RDb21wYXNzLC4uLmV0YylcclxuICogQGV4YW1wbGUgcG91ciBsZSAzRFNwYWNlIHtzcGFjZTpcImh0dHBzOi8vcjExMzIxMDA5Njg0NDctZXUxLXNwYWNlLjNkZXhwZXJpZW5jZS4zZHMuY29tL2Vub3ZpYVwifVxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMudGVuYW50IC0gbGUgdGVuYW50IGNvdXJhbnRcclxuICogQGV4YW1wbGUge3RlbmFudDpcIlIxMTMyMTAwOTY4NDQ3XCJ9XHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjcmVkZW50aWFscy50b2tlbiAtIExlIHBhcmFtw6h0cmUgdG9rZW4gZXN0IGxlIGpldG9uIENTUkYuIChoZWFkZXJzIGV4OiBFTk9fQ1NSRl9UT0tFTjp0b2tlbilcclxuICogQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLmN0eCAtIEwnSUQgZHUgY29udGV4dGUgZGUgdHJhdmFpbC5cclxuICogQHBhcmFtIHtTdHJpbmd9IG9iamVjdElkIC0gTGUgcGFyYW3DqHRyZSBvYmplY3RJZCBlc3QgbCdpZGVudGlmaWFudCBkZSBsJ29iamV0IHBvdXIgbGVxdWVsIHZvdXMgc291aGFpdGV6XHJcbiAqIHLDqWN1cMOpcmVyIGxlIGdyYXBoaXF1ZS4gSWwgZXN0IHV0aWxpc8OpIHBvdXIgc3DDqWNpZmllciBsJ29iamV0IHBvdXIgbGVxdWVsIHZvdXMgc291aGFpdGV6IG9idGVuaXIgbGVcclxuICogZ3JhcGhpcXVlIGRlIHZlcnNpb24uXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkRvbmVdIC0gVW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBsb3JzcXVlIGxhIHLDqWN1cMOpcmF0aW9uIGR1IGdyYXBoaXF1ZSBzZXJhXHJcbiAqIHLDqXVzc2llLiBJbCBwcmVuZCBsYSByw6lwb25zZSBjb21tZSBhcmd1bWVudC5cclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRXJyb3JdIC0gTGUgcGFyYW3DqHRyZSBgb25FcnJvcmAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgcydpbCB5IGEgdW5lXHJcbiAqIGVycmV1ciBsb3JzIGRlIGwnZXjDqWN1dGlvbiBkZSBsYSBmb25jdGlvbiBgXzNEU3BhY2VfbGlmZWN5Y2xlX2dldEdyYXBoYC4gQydlc3QgdW4gcGFyYW3DqHRyZVxyXG4gKiBmYWN1bHRhdGlmLCBkb25jIHMnaWwgbidlc3QgcGFzIGZvdXJuaSwgbGEgZm9uY3Rpb24gbmUgZmVyYSByaWVuIGVuIGNhcyBkJ2VycmV1ci5cclxuICogQHJldHVybnMgdW5lIHByb21lc3NlLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF8zRFNwYWNlX2xpZmVjeWNsZV9nZXRHcmFwaChcclxuICBjcmVkZW50aWFscyxcclxuICBvYmplY3RJZCxcclxuICBvbkRvbmUgPSB1bmRlZmluZWQsXHJcbiAgb25FcnJvciA9IHVuZGVmaW5lZCxcclxuKSB7XHJcbiAgLy8gQSBWQUxJREVSXHJcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXN1bHQpID0+IHtcclxuICAgIGlmIChjcmVkZW50aWFscy50b2tlbiA9PT0gXCJcIikge1xyXG4gICAgICBfM0RTcGFjZV9jc3JmKGNyZWRlbnRpYWxzKTtcclxuICAgIH1cclxuICAgIGlmIChvYmplY3RJZCAhPT0gdW5kZWZpbmVkICYmIG9iamVjdElkICE9PSBcIlwiICYmIG9iamVjdElkICE9PSBudWxsKSB7XHJcbiAgICAgIGNvbnN0IHVybCA9IGAke2NyZWRlbnRpYWxzLnNwYWNlfS9yZXNvdXJjZXMvdjEvZHNsYy92ZXJzaW9uZ3JhcGg/d2l0aFRodW1ibmFpbD0wJndpdGhJc0xhc3RWZXJzaW9uPTAmd2l0aEF0dHJpYnV0ZXM9MCZ3aXRoQ29weUZyb209MCZ0ZW5hbnQ9JHtjcmVkZW50aWFscy50ZW5hbnR9YDtcclxuXHJcbiAgICAgIF8zRFNwYWNlX2dldF9zZWN1cml0eUNvbnRleHRzKFxyXG4gICAgICAgIGNyZWRlbnRpYWxzLnNwYWNlLFxyXG4gICAgICAgIFwiRVNQQUNFIENPTU1VTlwiLFxyXG4gICAgICAgIFtcIlZQTE1Qcm9qZWN0TGVhZGVyXCIsIFwiVlBMTUNyZWF0b3JcIl0sXHJcbiAgICAgICAgdW5kZWZpbmVkLFxyXG4gICAgICAgIChjdHgpID0+IChjcmVkZW50aWFsc1tcImN0eFwiXSA9IGN0eCksXHJcbiAgICAgICAgKGVycikgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coXCJvbkVycm9yID0+XCIsIGVycik7XHJcbiAgICAgICAgfSxcclxuICAgICAgKTtcclxuICAgICAgbGV0IG9wdGlvbnMgPSB7XHJcbiAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcclxuICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICBzZWN1cml0eWNvbnRleHQ6IFwiY3R4OjpcIiArIGNyZWRlbnRpYWxzLmN0eCxcclxuICAgICAgICAgIEVOT19DU1JGX1RPS0VOOiBjcmVkZW50aWFscy50b2tlbixcclxuICAgICAgICAgIEFjY2VwdDogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgICB9LFxyXG4gICAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KHtcclxuICAgICAgICAgIGdyYXBoUmVxdWVzdHM6IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGlkOiBvYmplY3RJZCxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIF0sXHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgdHlwZTogXCJqc29uXCIsXHJcbiAgICAgICAgb25Db21wbGV0ZShyZXNwb25zZSkge1xyXG4gICAgICAgICAgaWYgKG9uRG9uZSkgb25Eb25lKHJlc3BvbnNlKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uRmFpbHVyZShyZXNwb25zZSkge1xyXG4gICAgICAgICAgaWYgKG9uRXJyb3IpIG9uRXJyb3IocmVzcG9uc2UpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH07XHJcbiAgICAgIF9odHRwQ2FsbEF1dGhlbnRpY2F0ZWQodXJsLCBvcHRpb25zKTtcclxuICAgIH1cclxuICB9KTtcclxufVxyXG4vLyBSRVZJU0lPTlxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIExhIGZvbmN0aW9uIGBfM0RTcGFjZV9saWZlY3ljbGVfZ2V0TmV4dFJldmlzaW9uYCBwZXJtZXQgZGUgcsOpY3Vww6lyZXIgbGEgcHJvY2hhaW5lIHLDqXZpc2lvbiBkJ3VuXHJcbiAqIGRvY3VtZW50IGRhbnMgdW4gZXNwYWNlIDNELlxyXG4gKiBAcGFyYW0ge09iamVjdH0gY3JlZGVudGlhbHMgLSBVbiBvYmpldCBjb250ZW5hbnQgbGVzIGluZm9ybWF0aW9ucyBkJ2lkZW50aWZpY2F0aW9uIHJlcXVpc2VzIHBvdXIgYXV0aGVudGlmaWVyXHJcbiAqIGxhIGRlbWFuZGUuIElsIGluY2x1dCBnw6luw6lyYWxlbWVudCBkZXMgcHJvcHJpw6l0w6lzIHRlbGxlcyBxdWUgwqsgdG9rZW4gwrssIMKrIHNwYWNlIMK7LCDCqyB0ZW5hbnQgwrsgZXQgwqsgY3R4IMK7LlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMuc3BhY2UgLSAoM0RTcGFjZSkgTCdVUkwgZHUgc2VydmV1ciBzdXIgbGVxdWVsIGwnQVBJIGVzdCBkw6lwbG95w6llLigzRFNwYWNlLCAzRFN3eW0sIDNEQ29tcGFzcywuLi5ldGMpXHJcbiAqIEBleGFtcGxlIHBvdXIgbGUgM0RTcGFjZSB7c3BhY2U6XCJodHRwczovL3IxMTMyMTAwOTY4NDQ3LWV1MS1zcGFjZS4zZGV4cGVyaWVuY2UuM2RzLmNvbS9lbm92aWFcIn1cclxuICogQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLnRlbmFudCAtIGxlIHRlbmFudCBjb3VyYW50XHJcbiAqIEBleGFtcGxlIHt0ZW5hbnQ6XCJSMTEzMjEwMDk2ODQ0N1wifVxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMudG9rZW4gLSBMZSBwYXJhbcOodHJlIHRva2VuIGVzdCBsZSBqZXRvbiBDU1JGLiAoaGVhZGVycyBleDogRU5PX0NTUkZfVE9LRU46dG9rZW4pXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjcmVkZW50aWFscy5jdHggLSBMJ0lEIGR1IGNvbnRleHRlIGRlIHRyYXZhaWwuXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBvYmplY3RJZCAtIExlIHBhcmFtw6h0cmUgYG9iamVjdElkYCBlc3QgbCdpZGVudGlmaWFudCB1bmlxdWUgZGUgbCdvYmpldCBwb3VyIGxlcXVlbCB2b3VzXHJcbiAqIHNvdWhhaXRleiBvYnRlbmlyIGxhIHByb2NoYWluZSByw6l2aXNpb24uIElsIGVzdCB1dGlsaXPDqSBwb3VyIHNww6ljaWZpZXIgbCdvYmpldCBxdWkgZG9pdCDDqnRyZSByw6l2aXPDqS5cclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRG9uZV0gLSBVbmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIGxvcnNxdWUgbCdvcMOpcmF0aW9uIHNlcmEgdGVybWluw6llIGF2ZWNcclxuICogc3VjY8Oocy4gSWwgcHJlbmQgbGEgcsOpcG9uc2UgY29tbWUgYXJndW1lbnQuXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkVycm9yXSAtIExlIHBhcmFtw6h0cmUgYG9uRXJyb3JgIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIHMnaWwgeSBhIHVuZVxyXG4gKiBlcnJldXIgbG9ycyBkZSBsJ2V4w6ljdXRpb24gZGUgbGEgZm9uY3Rpb24gYF8zRFNwYWNlX2xpZmVjeWNsZV9nZXROZXh0UmV2aXNpb25gLiBJbCBzJ2FnaXQgZCd1blxyXG4gKiBwYXJhbcOodHJlIGZhY3VsdGF0aWYsIGRvbmMgcydpbCBuJ2VzdCBwYXMgZm91cm5pLCBpbCBzZXJhIHBhciBkw6lmYXV0IMKrbm9uIGTDqWZpbmnCuy5cclxuICogQHJldHVybnMgVW5lIHByb21lc3NlIGVzdCByZW52b3nDqWUuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gXzNEU3BhY2VfbGlmZWN5Y2xlX2dldE5leHRSZXZpc2lvbihcclxuICBjcmVkZW50aWFscyxcclxuICBvYmplY3RJZCxcclxuICBvbkRvbmUgPSB1bmRlZmluZWQsXHJcbiAgb25FcnJvciA9IHVuZGVmaW5lZCxcclxuKSB7XHJcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXN1bHQpID0+IHtcclxuICAgIGlmIChjcmVkZW50aWFscy50b2tlbiA9PT0gXCJcIikge1xyXG4gICAgICBfM0RTcGFjZV9jc3JmKGNyZWRlbnRpYWxzKTtcclxuICAgIH1cclxuICAgIGlmIChvYmplY3RJZCAhPT0gdW5kZWZpbmVkICYmIG9iamVjdElkICE9PSBcIlwiICYmIG9iamVjdElkICE9PSBudWxsKSB7XHJcbiAgICAgIGNvbnN0IHVybCA9IGAke2NyZWRlbnRpYWxzLnNwYWNlfS9yZXNvdXJjZXMvbGlmZWN5Y2xlL3JldmlzZS9wcmVwYXJlX3JldmlzZV9tYXNrYXR0cmlidXRlcz90ZW5hbnQ9JHtjcmVkZW50aWFscy50ZW5hbnR9YDtcclxuXHJcbiAgICAgIF8zRFNwYWNlX2dldF9zZWN1cml0eUNvbnRleHRzKFxyXG4gICAgICAgIGNyZWRlbnRpYWxzLnNwYWNlLFxyXG4gICAgICAgIFwiRVNQQUNFIENPTU1VTlwiLFxyXG4gICAgICAgIFtcIlZQTE1Qcm9qZWN0TGVhZGVyXCIsIFwiVlBMTUNyZWF0b3JcIl0sXHJcbiAgICAgICAgdW5kZWZpbmVkLFxyXG4gICAgICAgIChjdHgpID0+IChjcmVkZW50aWFsc1tcImN0eFwiXSA9IGN0eCksXHJcbiAgICAgICAgKGVycikgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coXCJvbkVycm9yID0+XCIsIGVycik7XHJcbiAgICAgICAgfSxcclxuICAgICAgKTtcclxuICAgICAgbGV0IG9wdGlvbnMgPSB7XHJcbiAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcclxuICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICBTZWN1cml0eUNvbnRleHQ6IFwiY3R4OjpcIiArIGNyZWRlbnRpYWxzLmN0eCxcclxuICAgICAgICAgIEVOT19DU1JGX1RPS0VOOiBjcmVkZW50aWFscy50b2tlbixcclxuICAgICAgICAgIEFjY2VwdDogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgICB9LFxyXG4gICAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KHtcclxuICAgICAgICAgIGRhdGE6IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIFwiYXR0cmlidXRlW1BMTVJlZmVyZW5jZS5WX3ZlcnNpb25Db21tZW50XVwiOiBudWxsLFxyXG4gICAgICAgICAgICAgIHBoeXNpY2FsaWQ6IG9iamVjdElkLFxyXG4gICAgICAgICAgICAgIHR5cGU6IFwiRG9jdW1lbnRcIixcclxuICAgICAgICAgICAgICB0ZW5hbnQ6IGNyZWRlbnRpYWxzLnRlbmFudCxcclxuICAgICAgICAgICAgICBvYmplY3RJZCxcclxuICAgICAgICAgICAgICBwb2xpY3k6IFwiRG9jdW1lbnQgUmVsZWFzZVwiLFxyXG4gICAgICAgICAgICAgIGF2YWlsYWJsZVNlbWFudGljOiBbXCJFXCIsIFwiTEFTVFwiLCBcIk5FV1wiLCBcIkRVUFwiXSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIF0sXHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgdHlwZTogXCJqc29uXCIsXHJcbiAgICAgICAgb25Db21wbGV0ZShyZXNwb25zZSkge1xyXG4gICAgICAgICAgaWYgKG9uRG9uZSkgb25Eb25lKHJlc3BvbnNlKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uRmFpbHVyZShyZXNwb25zZSkge1xyXG4gICAgICAgICAgaWYgKG9uRXJyb3IpIG9uRXJyb3IocmVzcG9uc2UpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH07XHJcbiAgICAgIF9odHRwQ2FsbEF1dGhlbnRpY2F0ZWQodXJsLCBvcHRpb25zKTtcclxuICAgIH1cclxuICB9KTtcclxufVxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIExhIGZvbmN0aW9uIGBfM0RTcGFjZV9saWZlY3ljbGVfY2hhbmdlUmV2aXNpb25gIGVzdCB1dGlsaXPDqWUgcG91ciBjaGFuZ2VyIGxhIHLDqXZpc2lvbiBkJ3VuIG9iamV0XHJcbiAqIGRhbnMgdW4gZXNwYWNlIDNELlxyXG4gKiBAcGFyYW0ge09iamVjdH0gY3JlZGVudGlhbHMgLSBVbiBvYmpldCBjb250ZW5hbnQgbGVzIGluZm9ybWF0aW9ucyBkJ2lkZW50aWZpY2F0aW9uIHJlcXVpc2VzIHBvdXIgYXV0aGVudGlmaWVyXHJcbiAqIGxhIGRlbWFuZGUuIElsIGluY2x1dCBnw6luw6lyYWxlbWVudCBkZXMgcHJvcHJpw6l0w6lzIHRlbGxlcyBxdWUgwqsgdG9rZW4gwrssIMKrIHNwYWNlIMK7LCDCqyB0ZW5hbnQgwrsgZXQgwqsgY3R4IMK7LlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMuc3BhY2UgLSAoM0RTcGFjZSkgTCdVUkwgZHUgc2VydmV1ciBzdXIgbGVxdWVsIGwnQVBJIGVzdCBkw6lwbG95w6llLigzRFNwYWNlLCAzRFN3eW0sIDNEQ29tcGFzcywuLi5ldGMpXHJcbiAqIEBleGFtcGxlIHBvdXIgbGUgM0RTcGFjZSB7c3BhY2U6XCJodHRwczovL3IxMTMyMTAwOTY4NDQ3LWV1MS1zcGFjZS4zZGV4cGVyaWVuY2UuM2RzLmNvbS9lbm92aWFcIn1cclxuICogQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLnRlbmFudCAtIGxlIHRlbmFudCBjb3VyYW50XHJcbiAqIEBleGFtcGxlIHt0ZW5hbnQ6XCJSMTEzMjEwMDk2ODQ0N1wifVxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMudG9rZW4gLSBMZSBwYXJhbcOodHJlIHRva2VuIGVzdCBsZSBqZXRvbiBDU1JGLiAoaGVhZGVycyBleDogRU5PX0NTUkZfVE9LRU46dG9rZW4pXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjcmVkZW50aWFscy5jdHggLSBMJ0lEIGR1IGNvbnRleHRlIGRlIHRyYXZhaWwuXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBvYmplY3RJZCAtIExlIHBhcmFtw6h0cmUgb2JqZWN0SWQgcmVwcsOpc2VudGUgbCdpZGVudGlmaWFudCB1bmlxdWUgZGUgbCdvYmpldCBkYW5zIGwnZXNwYWNlIDNELlxyXG4gKiBJbCBlc3QgdXRpbGlzw6kgcG91ciBzcMOpY2lmaWVyIHF1ZWxsZSByw6l2aXNpb24gZGUgbCdvYmpldCBkb2l0IMOqdHJlIG1vZGlmacOpZS5cclxuICogQHBhcmFtIHtGdW5jdGlvbn0gbmV4dFJldmlzaW9uIC0gTGUgcGFyYW3DqHRyZSBgbmV4dFJldmlzaW9uYCBlc3QgbGUgbnVtw6lybyBkZSByw6l2aXNpb24gcXVpIHNlcmEgYXR0cmlidcOpIMOgXHJcbiAqIGwnb2JqZXQgYXByw6hzIGxlIGNoYW5nZW1lbnQgZGUgcsOpdmlzaW9uLlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25Eb25lXSAtIFVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgbG9yc3F1ZSBsJ29ww6lyYXRpb24gc2VyYSB0ZXJtaW7DqWUgYXZlY1xyXG4gKiBzdWNjw6hzLiBJbCBwcmVuZCBsYSByw6lwb25zZSBjb21tZSBhcmd1bWVudC5cclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRXJyb3JdIC0gTGUgcGFyYW3DqHRyZSBgb25FcnJvcmAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgcydpbCB5IGEgdW5lXHJcbiAqIGVycmV1ciBsb3JzIGRlIGwnZXjDqWN1dGlvbiBkZSBsYSBmb25jdGlvbiBgXzNEU3BhY2VfbGlmZWN5Y2xlX2NoYW5nZVJldmlzaW9uYC4gSWwgdm91cyBwZXJtZXQgZGVcclxuICogZ8OpcmVyIHRvdXRlcyBsZXMgZXJyZXVycyBxdWkgc2UgcHJvZHVpc2VudCBldCBk4oCZZWZmZWN0dWVyIHRvdXRlIGdlc3Rpb24gb3Ugam91cm5hbGlzYXRpb24gZGVzXHJcbiAqIGVycmV1cnMgbsOpY2Vzc2FpcmUuXHJcbiAqIEByZXR1cm5zIHVuZSBwcm9tZXNzZS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfM0RTcGFjZV9saWZlY3ljbGVfY2hhbmdlUmV2aXNpb24oXHJcbiAgY3JlZGVudGlhbHMsXHJcbiAgb2JqZWN0SWQsXHJcbiAgbmV4dFJldmlzaW9uLFxyXG4gIG9uRG9uZSA9IHVuZGVmaW5lZCxcclxuICBvbkVycm9yID0gdW5kZWZpbmVkLFxyXG4pIHtcclxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc3VsdCkgPT4ge1xyXG4gICAgaWYgKGNyZWRlbnRpYWxzLnRva2VuID09PSBcIlwiKSB7XHJcbiAgICAgIF8zRFNwYWNlX2NzcmYoY3JlZGVudGlhbHMpO1xyXG4gICAgfVxyXG4gICAgaWYgKG9iamVjdElkICE9PSB1bmRlZmluZWQgJiYgb2JqZWN0SWQgIT09IFwiXCIgJiYgb2JqZWN0SWQgIT09IG51bGwpIHtcclxuICAgICAgY29uc3QgdXJsID0gYCR7Y3JlZGVudGlhbHMuc3BhY2V9L3Jlc291cmNlcy9saWZlY3ljbGUvcmV2aXNlL21ham9yP3RlbmFudD0ke2NyZWRlbnRpYWxzLnRlbmFudH1gO1xyXG5cclxuICAgICAgXzNEU3BhY2VfZ2V0X3NlY3VyaXR5Q29udGV4dHMoXHJcbiAgICAgICAgY3JlZGVudGlhbHMuc3BhY2UsXHJcbiAgICAgICAgXCJFU1BBQ0UgQ09NTVVOXCIsXHJcbiAgICAgICAgW1wiVlBMTVByb2plY3RMZWFkZXJcIiwgXCJWUExNQ3JlYXRvclwiXSxcclxuICAgICAgICB1bmRlZmluZWQsXHJcbiAgICAgICAgKGN0eCkgPT4gKGNyZWRlbnRpYWxzW1wiY3R4XCJdID0gY3R4KSxcclxuICAgICAgICAoZXJyKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIm9uRXJyb3IgPT5cIiwgZXJyKTtcclxuICAgICAgICB9LFxyXG4gICAgICApO1xyXG4gICAgICBsZXQgb3B0aW9ucyA9IHtcclxuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxyXG4gICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgIHNlY3VyaXR5Y29udGV4dDogXCJjdHg6OlwiICsgY3JlZGVudGlhbHMuY3R4LFxyXG4gICAgICAgICAgRU5PX0NTUkZfVE9LRU46IGNyZWRlbnRpYWxzLnRva2VuLFxyXG4gICAgICAgICAgQWNjZXB0OiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoe1xyXG4gICAgICAgICAgZGF0YTogW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgcGh5c2ljYWxpZDogb2JqZWN0SWQsXHJcbiAgICAgICAgICAgICAgcHJvcG9zZWRSZXZpc2lvbjogbmV4dFJldmlzaW9uLFxyXG4gICAgICAgICAgICAgIG1vZGlmaWVkQXR0cmlidXRlczoge1xyXG4gICAgICAgICAgICAgICAgcmV2aXNpb246IG5leHRSZXZpc2lvbixcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgXSxcclxuICAgICAgICAgIGZvbGRlcmlkOiBudWxsLFxyXG4gICAgICAgICAgbm90aWZpY2F0aW9uVGltZW91dDogNjAwLFxyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHR5cGU6IFwianNvblwiLFxyXG4gICAgICAgIG9uQ29tcGxldGUocmVzcG9uc2UpIHtcclxuICAgICAgICAgIGlmIChvbkRvbmUpIG9uRG9uZShyZXNwb25zZSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBvbkZhaWx1cmUocmVzcG9uc2UpIHtcclxuICAgICAgICAgIGlmIChvbkVycm9yKSBvbkVycm9yKHJlc3BvbnNlKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9O1xyXG4gICAgICBfaHR0cENhbGxBdXRoZW50aWNhdGVkKHVybCwgb3B0aW9ucyk7XHJcbiAgICB9XHJcbiAgfSk7XHJcbn1cclxuLy8gU0VDVElPTjogQk9PS01BUktTXHJcbi8vIEFOQ0hPUjogXzNkc3BhY2VfYm9va21hcmtfZ2V0Q2hpbGRyZW5cclxuLy8gVE9ETyA6IEEgZmluaXIgLCBtYW5xdWUgbGEgRk4gXzNkc3BhY2VfZ2V0X211bHRpRG9jSW5mbygpXHJcbi8vIGZ1bmN0aW9uIF8zRFNwYWNlX2Jvb2ttYXJrX2dldENoaWxkcmVuKFxyXG4vLyAgIGNyZWRlbnRpYWxzLFxyXG4vLyAgIG9iaklkQm9va21hcmssXHJcbi8vICAgb25Eb25lID0gdW5kZWZpbmVkLFxyXG4vLyAgIG9uRXJyb3IgPSB1bmRlZmluZWQsXHJcbi8vICkge1xyXG4vLyAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbi8vICAgICAvLyBjb25zdCBzdG9yZSA9IG1haW5TdG9yZSgpO1xyXG5cclxuLy8gICAgIGNvbnN0IHVybCA9IGAke2NyZWRlbnRpYWxzLnNwYWNlfS9yZXNvdXJjZXMvdjEvbW9kZWxlci9kc2Jrcy9kc2JrczpCb29rbWFyay8ke29iaklkQm9va21hcmt9PyRtYXNrPWRzYmtzOkJrc01hc2suSXRlbXNgO1xyXG4vLyAgICAgX2h0dHBDYWxsQXV0aGVudGljYXRlZCh1cmwsIHtcclxuLy8gICAgICAgaGVhZGVyczoge1xyXG4vLyAgICAgICAgIFNlY3VyaXR5Q29udGV4dDogYGN0eDo6JHtjcmVkZW50aWFscy5jdHh9YCxcclxuLy8gICAgICAgfSxcclxuLy8gICAgICAgb25Db21wbGV0ZTogKHJlc3BvbnNlKSA9PiB7XHJcbi8vICAgICAgICAgbGV0IHRyeVBhcnNlO1xyXG4vLyAgICAgICAgIHRyeSB7XHJcbi8vICAgICAgICAgICB0cnlQYXJzZSA9IEpTT04ucGFyc2UocmVzcG9uc2UpO1xyXG4vLyAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbi8vICAgICAgICAgICB0cnlQYXJzZSA9IHJlc3BvbnNlO1xyXG4vLyAgICAgICAgIH1cclxuLy8gICAgICAgICBpZiAodHlwZW9mIHRyeVBhcnNlID09PSBcIm9iamVjdFwiKSB7XHJcbi8vICAgICAgICAgICBsZXQgaXRlbXMgPSB0cnlQYXJzZT8ubWVtYmVyWzBdPy5pdGVtcz8ubWVtYmVyO1xyXG4vLyAgICAgICAgICAgaWYgKGl0ZW1zKSB7XHJcbi8vICAgICAgICAgICAgIGNvbnN0IGxpc3RPYmpJZHMgPSBpdGVtcy5tYXAoKGUpID0+IHtcclxuLy8gICAgICAgICAgICAgICBpZiAoZT8ucmVmZXJlbmNlZE9iamVjdD8uaWRlbnRpZmllcikge1xyXG4vLyAgICAgICAgICAgICAgICAgcmV0dXJuIGUucmVmZXJlbmNlZE9iamVjdC5pZGVudGlmaWVyO1xyXG4vLyAgICAgICAgICAgICAgIH1cclxuLy8gICAgICAgICAgICAgfSk7XHJcbi8vICAgICAgICAgICAgIGlmIChsaXN0T2JqSWRzLmxlbmd0aCkge1xyXG4vLyAgICAgICAgICAgICAgIF8zRFNwYWNlX2dldF9tdWx0aURvY0luZm8oaG9zdCwgbGlzdE9iaklkcywgKHJlcykgPT4ge1xyXG4vLyAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJfM2RzcGFjZV9nZXRfbXVsdGlEb2NJbmZvIFJlc3BvbnNlIDogXCIsIHtcclxuLy8gICAgICAgICAgICAgICAgICAgLi4ucmVzLFxyXG4vLyAgICAgICAgICAgICAgICAgfSk7XHJcbi8vICAgICAgICAgICAgICAgICBpZiAocmVzPy5kYXRhLmxlbmd0aCkge1xyXG4vLyAgICAgICAgICAgICAgICAgICBjb25zdCBsaXN0UmVzcG9uc2VzID0gcmVzLmRhdGE7XHJcbi8vICAgICAgICAgICAgICAgICAgIGxpc3RSZXNwb25zZXMuZm9yRWFjaCgocikgPT4ge1xyXG4vLyAgICAgICAgICAgICAgICAgICAgIGxldCBjdXJyZW50T2JqZWN0ID0gaXRlbXMuZmluZChcclxuLy8gICAgICAgICAgICAgICAgICAgICAgIChvKSA9PiBvLnJlZmVyZW5jZWRPYmplY3QuaWRlbnRpZmllciA9PT0gci5pZGVudGlmaWVyLFxyXG4vLyAgICAgICAgICAgICAgICAgICAgICk7XHJcbi8vICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRPYmplY3QpIHtcclxuLy8gICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRPYmplY3QucmVmZXJlbmNlZE9iamVjdFtcImRhdGFlbGVtZW50c1wiXSA9XHJcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIHIuZGF0YWVsZW1lbnRzO1xyXG4vLyAgICAgICAgICAgICAgICAgICAgIH1cclxuLy8gICAgICAgICAgICAgICAgICAgfSk7XHJcbi8vICAgICAgICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICAgICAgfSk7XHJcbi8vICAgICAgICAgICAgIH1cclxuLy8gICAgICAgICAgIH1cclxuLy8gICAgICAgICB9XHJcblxyXG4vLyAgICAgICAgIGlmIChvbkRvbmUpIG9uRG9uZSh0cnlQYXJzZSk7XHJcbi8vICAgICAgICAgcmVzb2x2ZSA9IHRyeVBhcnNlO1xyXG4vLyAgICAgICAgIHJldHVybiByZXNvbHZlO1xyXG4vLyAgICAgICB9LFxyXG4vLyAgICAgICBvbkZhaWx1cmUocmVzcG9uc2UpIHtcclxuLy8gICAgICAgICBpZiAob25FcnJvcikgb25FcnJvcihyZXNwb25zZSk7XHJcbi8vICAgICAgICAgcmVqZWN0ID0gcmVzcG9uc2U7XHJcbi8vICAgICAgICAgcmV0dXJuIHJlamVjdDtcclxuLy8gICAgICAgfSxcclxuLy8gICAgIH0pO1xyXG4vLyAgIH0pO1xyXG4vLyB9XHJcbi8vIVNFQ1RJT05cclxuXHJcbi8vIG1vZHVsZS5leHBvcnRzID0ge1xyXG5cclxuLy8gICBfM0RTcGFjZV9ib29rbWFya19nZXRDaGlsZHJlbixcclxuLy8gfTtcclxuIiwiaW1wb3J0IHsgX2h0dHBDYWxsQXV0aGVudGljYXRlZCB9IGZyb20gXCIuLzNkZXhwZXJpZW5jZV9hcGlcIjtcclxuXHJcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gTGEgZm9uY3Rpb24gYGdldENTUkZUb2tlbmAgZXN0IHVuZSBmb25jdGlvbiBhc3luY2hyb25lIHF1aSByw6ljdXDDqHJlIHVuIGpldG9uIENTUkYgw6AgcGFydGlyIGQndW5lIFVSTFxyXG4gKiBzcMOpY2lmacOpZSBldCBhcHBlbGxlIGxlIHJhcHBlbCBgb25Eb25lYCBhdmVjIGxlIGpldG9uIGVuIGNhcyBkZSBzdWNjw6hzLCBvdSBsZSByYXBwZWwgYG9uRXJyb3JgIGF2ZWNcclxuICogdW5lIGVycmV1ciBlbiBjYXMgZCfDqWNoZWMuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBjcmVkZW50aWFscyAtIFVuIG9iamV0IGNvbnRlbmFudCBsZXMgaW5mb3JtYXRpb25zIGQnaWRlbnRpZmljYXRpb24gcmVxdWlzZXMgcG91ciBhdXRoZW50aWZpZXJcclxuICogbGEgZGVtYW5kZS4gSWwgaW5jbHV0IGfDqW7DqXJhbGVtZW50IGRlcyBwcm9wcmnDqXTDqXMgdGVsbGVzIHF1ZSDCqyB0b2tlbiDCuywgwqsgc3BhY2UgwrsgZXQgwqsgY3R4IMK7LlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMuc3BhY2UgLSAoM0RTcGFjZSkgTCdVUkwgZHUgc2VydmV1ciBzdXIgbGVxdWVsIGwnQVBJIGVzdCBkw6lwbG95w6llLigzRFNwYWNlLCAzRFN3eW0sIDNEQ29tcGFzcywuLi5ldGMpXHJcbiAqIEBleGFtcGxlIHBvdXIgbGUgM0RTcGFjZSB7c3BhY2U6XCJodHRwczovL3IxMTMyMTAwOTY4NDQ3LWV1MS1zcGFjZS4zZGV4cGVyaWVuY2UuM2RzLmNvbS9lbm92aWFcIn1cclxuICpcclxuICogQHBhcmFtIHtGdW5jdGlvbn0gb25Eb25lIC0gTGUgcGFyYW3DqHRyZSBgb25Eb25lYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBsb3JzcXVlIGxlIGpldG9uXHJcbiAqIENTUkYgc2VyYSByw6ljdXDDqXLDqSBhdmVjIHN1Y2PDqHMuIElsIGZhdXQgdW4gYXJndW1lbnQsIHF1aSBlc3QgbGEgdmFsZXVyIGR1IGpldG9uIENTUkYuXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRXJyb3IgLSBMZSBwYXJhbcOodHJlIGBvbkVycm9yYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBzJ2lsIHkgYSB1bmUgZXJyZXVyIGxvcnMgZGUgbGEgcmVxdcOqdGUgSFRUUC4gSWwgZXN0IGZhY3VsdGF0aWYgZXQgcGV1dCDDqnRyZSB1dGlsaXPDqSBwb3VyIGfDqXJlciBsZXMgZXJyZXVycyBxdWkgc2UgcHJvZHVpc2VudCBsb3JzIGRlIGxhIGRlbWFuZGUuXHJcbiAqXHJcbiAqXHJcbiAqL1xyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Q1NSRlRva2VuKGNyZWRlbnRpYWxzLCBvbkRvbmUsIG9uRXJyb3IpIHtcclxuICBjb25zdCB1cmwgPSBgJHtjcmVkZW50aWFscy5zcGFjZX0vcmVzb3VyY2VzL3YxL2FwcGxpY2F0aW9uL0NTUkZgO1xyXG4gIF9odHRwQ2FsbEF1dGhlbnRpY2F0ZWQodXJsLCB7XHJcbiAgICBvbkNvbXBsZXRlKHJlc3BvbnNlKSB7XHJcbiAgICAgIHJlc3BvbnNlID0gSlNPTi5wYXJzZShyZXNwb25zZSk7XHJcbiAgICAgIGlmIChvbkRvbmUpIG9uRG9uZShyZXNwb25zZS5jc3JmKTtcclxuICAgIH0sXHJcbiAgICBvbkZhaWx1cmUoZXJyb3IsIGhlYWRlcnMsIHhocikge1xyXG4gICAgICBjb25zdCBpbmZvcyA9IHsgZXJyb3IsIGhlYWRlcnMsIHhociB9O1xyXG4gICAgICBpZiAob25FcnJvcikgb25FcnJvcihpbmZvcyk7XHJcbiAgICB9LFxyXG4gIH0pO1xyXG59XHJcbiIsImltcG9ydCB7IF9odHRwQ2FsbEF1dGhlbnRpY2F0ZWQgfSBmcm9tIFwiLi8zZGV4cGVyaWVuY2VfYXBpXCI7XHJcblxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIExhIGZvbmN0aW9uIGBnZXRBbGxDb250ZXh0U2VjdXJpdHlgIGVmZmVjdHVlIHVuZSByZXF1w6p0ZSBIVFRQIEdFVCBhdXRoZW50aWZpw6llIHBvdXIgcsOpY3Vww6lyZXIgdG91dGVzXHJcbiAqIGxlcyByZXNzb3VyY2VzIGRlIHPDqWN1cml0w6kgZHUgY29udGV4dGUuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBjcmVkZW50aWFscyAtIFVuIG9iamV0IGNvbnRlbmFudCBsZXMgaW5mb3JtYXRpb25zIGQnaWRlbnRpZmljYXRpb24gcmVxdWlzZXMgcG91ciBhdXRoZW50aWZpZXIgbGEgZGVtYW5kZS5cclxuICogIElsIGluY2x1dCBnw6luw6lyYWxlbWVudCBkZXMgcHJvcHJpw6l0w6lzIHRlbGxlcyBxdSdpY2kgwqsgc3BhY2UgwrsgZXQgwqsgdGVuYW50IMK7LihleDogY3JlZGVudGlhbHMuc3BhY2UsIGNyZWRlbnRpYWxzLnRlbmFudCkuXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjcmVkZW50aWFscy5zcGFjZSAtICgzRFNwYWNlKSBMJ1VSTCBkdSBzZXJ2ZXVyIHN1ciBsZXF1ZWwgbCdBUEkgZXN0IGTDqXBsb3nDqWUuKDNEU3BhY2UsIDNEU3d5bSwgM0RDb21wYXNzLC4uLmV0YylcclxuICogQGV4YW1wbGUgcG91ciBsZSAzRFNwYWNlIHtzcGFjZTpcImh0dHBzOi8vcjExMzIxMDA5Njg0NDctZXUxLXNwYWNlLjNkZXhwZXJpZW5jZS4zZHMuY29tL2Vub3ZpYVwifVxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMudGVuYW50IC0gbGUgdGVuYW50IGNvdXJhbnRcclxuICogQGV4YW1wbGUge3RlbmFudDpcIlIxMTMyMTAwOTY4NDQ3XCJ9XHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkRvbmVdIC0gVW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBsb3JzcXVlIGxhIHJlcXXDqnRlIEhUVFAgc2VyYSB0ZXJtaW7DqWUgYXZlY1xyXG4gKiBzdWNjw6hzLiBJbCBwcmVuZCBkZXV4IHBhcmFtw6h0cmVzOiBcInJlcFwiIChsYSByw6lwb25zZSBKU09OIGFuYWx5c8OpZSkgZXQgXCJoZWFkZXJzXCIgKGxlcyBlbi10w6p0ZXMgZGVcclxuICogcsOpcG9uc2UpLlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25FcnJvcl0gLSBMZSBwYXJhbcOodHJlIGBvbkVycm9yYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBzJ2lsIHkgYSB1bmVcclxuICogZXJyZXVyIGxvcnMgZGUgbGEgcmVxdcOqdGUgSFRUUC4gSWwgZmF1dCB0cm9pcyBhcmd1bWVudHMgOiDCqyByw6lwb25zZSDCuywgwqsgZW4tdMOqdGVzIMK7IGV0IMKrIHhociDCuy5cclxuICogTCdhcmd1bWVudCBgcmVzcG9uc2VgIGNvbnRpZW50IGxlIGNvcnBzIGRlIGxhIHLDqXBvbnNlIGQnZXJyZXVyLCBsJ2FyZ3VtZW50IGBoZWFkZXJzYCBjb250aWVudCBsZXMgZW4tdMOqdGVzIGRlIHLDqXBvbnNlLFxyXG4gKlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEFsbENvbnRleHRTZWN1cml0eShcclxuICBjcmVkZW50aWFscyxcclxuICBvbkRvbmUgPSB1bmRlZmluZWQsXHJcbiAgb25FcnJvciA9IHVuZGVmaW5lZCxcclxuKSB7XHJcbiAgY29uc3QgVVJMID0ge1xyXG4gICAgYmFzZTogYCR7Y3JlZGVudGlhbHMuc3BhY2V9YCxcclxuICAgIHVyaTogXCIvcmVzb3VyY2VzL2Jwcy9jc3BhY2VzXCIsXHJcbiAgICBvcHRUZW5hbnQ6IGB0ZW5hbnQ9JHtjcmVkZW50aWFscy50ZW5hbnR9YCxcclxuICB9O1xyXG5cclxuICBjb25zdCB1cmwgPSBgJHtVUkwuYmFzZX0ke1VSTC51cml9PyR7VVJMLm9wdFRlbmFudH1gO1xyXG5cclxuICBfaHR0cENhbGxBdXRoZW50aWNhdGVkKHVybCwge1xyXG4gICAgbWV0aG9kOiBcIkdFVFwiLFxyXG4gICAgaGVhZGVyczoge1xyXG4gICAgICBBY2NlcHQ6IFwiYXBwbGljYXRpb24vanNvbix0ZXh0L2phdmFzY3JpcHQsKi8qXCIsXHJcbiAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vZHMtanNvblwiLFxyXG4gICAgfSxcclxuICAgIG9uQ29tcGxldGUocmVzcG9uc2UsIGhlYWRlcnMpIHtcclxuICAgICAgY29uc3QgcmVwID0gSlNPTi5wYXJzZShyZXNwb25zZSk7XHJcblxyXG4gICAgICBpZiAob25Eb25lKSBvbkRvbmUocmVwLCBoZWFkZXJzKTtcclxuICAgIH0sXHJcbiAgICBvbkZhaWx1cmUocmVzcG9uc2UsIGhlYWRlcnMsIHhocikge1xyXG4gICAgICBpZiAob25FcnJvcikgb25FcnJvcih7IHJlc3BvbnNlLCBoZWFkZXJzLCB4aHIgfSk7XHJcbiAgICB9LFxyXG4gIH0pO1xyXG59XHJcbiIsImltcG9ydCB7IF9odHRwQ2FsbEF1dGhlbnRpY2F0ZWQgfSBmcm9tIFwiLi8zZGV4cGVyaWVuY2VfYXBpXCI7XHJcbmltcG9ydCB7IF8zRFNwYWNlX2ZpbGVfdXJsIH0gZnJvbSBcIi4vM2RzcGFjZV9hcGlcIjtcclxuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBMYSBmb25jdGlvbiBgZ2V0RGF0YUZyb20zRFNwYWNlYCByw6ljdXDDqHJlIGxlcyBkb25uw6llcyBkJ3VuIGVzcGFjZSAzRCBlbiB1dGlsaXNhbnQgbGVzIGluZm9ybWF0aW9uc1xyXG4gKiBkJ2lkZW50aWZpY2F0aW9uIGZvdXJuaWVzIGV0IGxlcyBwcsOpZsOpcmVuY2VzIGR1IHdpZGdldCwgZXQgYXBwZWxsZSBsZSByYXBwZWwgYG9uRG9uZWAgYXZlYyBsYVxyXG4gKiByw6lwb25zZSBvdSBsZSByYXBwZWwgYG9uRXJyb3JgIGF2ZWMgdG91dGVzIGxlcyBlcnJldXJzIHJlbmNvbnRyw6llcy5cclxuICogQHBhcmFtIHtPYmplY3R9IGNyZWRlbnRpYWxzIC0gVW4gb2JqZXQgY29udGVuYW50IGxlcyBpbmZvcm1hdGlvbnMgZCdpZGVudGlmaWNhdGlvbiByZXF1aXNlcyBwb3VyIGF1dGhlbnRpZmllclxyXG4gKiBsYSBkZW1hbmRlLiBJbCBpbmNsdXQgZ8OpbsOpcmFsZW1lbnQgZGVzIHByb3ByacOpdMOpcyB0ZWxsZXMgcXVlIMKrIHRva2VuIMK7IGV0IMKrIHNwYWNlIMK7LihleDogY3JlZGVudGlhbHMudG9rZW4sIGNyZWRlbnRpYWxzLnNwYWNlLCBjcmVkZW50aWFscy50ZW5hbnQsIGNyZWRlbnRpYWxzLmN0eClcclxuICogQHByb3BlcnR5IHNwYWNlIC0gTCdVUkwgZHUgc2VydmV1ciBzdXIgbGVxdWVsIGwnQVBJIGVzdCBkw6lwbG95w6llLihleDogM0RTcGFjZSwgM0RTd3ltLCAzRENvbXBhc3MuLi4pXHJcbiAqIEBwcm9wZXJ0eSB0b2tlbiAtIExlIHBhcmFtw6h0cmUgdG9rZW4gZXN0IGxlIGpldG9uIENTUkYuIChoZWFkZXJzIGV4OiBFTk9fQ1NSRl9UT0tFTjp0b2tlbilcclxuICpcclxuICogQHBhcmFtIHdpZGdldFByZWZlcmVuY2UgLSBMZSBwYXJhbcOodHJlIGB3aWRnZXRQcmVmZXJlbmNlYCBlc3QgdW4gb2JqZXQgcXVpIGNvbnRpZW50IGxlcyBwcsOpZsOpcmVuY2VzXHJcbiAqIGR1IHdpZGdldC4gSWwgcGV1dCBpbmNsdXJlIGRlcyBwcm9wcmnDqXTDqXMgdGVsbGVzIHF1ZSBsYSB0YWlsbGUsIGxhIGNvdWxldXIsIGxhIHBvc2l0aW9uIGR1IHdpZGdldCBvdVxyXG4gKiB0b3V0ZSBhdXRyZSBwZXJzb25uYWxpc2F0aW9uIHNww6ljaWZpcXVlIGF1IHdpZGdldC5cclxuICogQHBhcmFtIG9uRG9uZSAtIFVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgbG9yc3F1ZSBsYSByw6ljdXDDqXJhdGlvbiBkZXMgZG9ubsOpZXMgc2VyYVxyXG4gKiByw6l1c3NpZS4gSWwgcHJlbmQgbGEgcsOpcG9uc2UgY29tbWUgcGFyYW3DqHRyZS5cclxuICogQHBhcmFtIG9uRXJyb3IgLSBMZSBwYXJhbcOodHJlIGBvbkVycm9yYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBzJ2lsIHkgYSB1bmVcclxuICogZXJyZXVyIGxvcnMgZGUgbCdleMOpY3V0aW9uIGRlIGxhIGZvbmN0aW9uIGBnZXREYXRhRnJvbTNEU3BhY2VgLiBJbCBlc3QgdXRpbGlzw6kgcG91ciBnw6lyZXIgZXQgdHJhaXRlclxyXG4gKiBsZXMgZXJyZXVycyBxdWkgc3Vydmllbm5lbnQuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGF0YUZyb20zRFNwYWNlKFxyXG4gIGNyZWRlbnRpYWxzLFxyXG4gIHdpZGdldFByZWZlcmVuY2UsXHJcbiAgb25Eb25lLFxyXG4gIG9uRXJyb3IsXHJcbikge1xyXG4gIF8zRFNwYWNlX2ZpbGVfdXJsKFxyXG4gICAgY3JlZGVudGlhbHMuc3BhY2UsXHJcbiAgICB3aWRnZXRQcmVmZXJlbmNlLFxyXG4gICAgKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgIF9odHRwQ2FsbEF1dGhlbnRpY2F0ZWQocmVzcG9uc2UsIHtcclxuICAgICAgICBoZWFkZXI6IHsgRU5PX0NTUkZfVE9LRU46IGNyZWRlbnRpYWxzLnRva2VuIH0sXHJcbiAgICAgICAgb25Db21wbGV0ZTogKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICBpZiAob25Eb25lKSBvbkRvbmUocmVzcG9uc2UpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb25GYWlsdXJlOiAoZXJyb3IpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiZXJyb3IgaHR0cFwiLCBlcnJvcik7XHJcbiAgICAgICAgICBpZiAob25FcnJvcikgb25FcnJvcihlcnJvcik7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgICB9LFxyXG4gICAgKGVycm9yKSA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiZXJyb3IgZmlsZSBVUkxcIiwgZXJyb3IpO1xyXG4gICAgICBpZiAob25FcnJvcikgb25FcnJvcihlcnJvcik7XHJcbiAgICB9LFxyXG4gICk7XHJcbn1cclxuIiwiaW1wb3J0IHsgXzNEU3BhY2VfZmlsZV91cmwgfSBmcm9tIFwiLi8zZHNwYWNlX2FwaVwiO1xyXG5pbXBvcnQgeyBfaHR0cENhbGxBdXRoZW50aWNhdGVkIH0gZnJvbSBcIi4vM2RleHBlcmllbmNlX2FwaVwiO1xyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIExhIGZvbmN0aW9uIGBnZXREb3dubG9hZERvY3VtZW50YCBlc3QgdW5lIGZvbmN0aW9uIGFzeW5jaHJvbmUgcXVpIHLDqWN1cMOocmUgdW4gZG9jdW1lbnQgw6AgdMOpbMOpY2hhcmdlclxyXG4gKiDDoCBwYXJ0aXIgZCd1biBlc3BhY2UgZXQgZCd1biBJRCBkZSBkb2N1bWVudCBzcMOpY2lmacOpcy5cclxuICogQHBhcmFtIHtPYmplY3R9IGNyZWRlbnRpYWxzIC0gVW4gb2JqZXQgY29udGVuYW50IGxlcyBpbmZvcm1hdGlvbnMgZCdpZGVudGlmaWNhdGlvbiByZXF1aXNlcyBwb3VyIGF1dGhlbnRpZmllclxyXG4gKiBsYSBkZW1hbmRlLiBJbCBpbmNsdXQgZ8OpbsOpcmFsZW1lbnQgZGVzIHByb3ByacOpdMOpcyB0ZWxsZXMgcXVlIMKrIHRva2VuIMK7LCDCqyBzcGFjZSDCuyBldCDCqyBjdHggwrsuXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjcmVkZW50aWFscy5zcGFjZSAtIEwnVVJMIGR1IHNlcnZldXIgc3VyIGxlcXVlbCBsJ0FQSSBlc3QgZMOpcGxvecOpZS4oZXg6IDNEU3BhY2UsIDNEU3d5bSwgM0RDb21wYXNzLi4uKVxyXG4gKiBAcGFyYW0ge1N0cmluZ30gZG9jSWQgLSBMJ0lEIGR1IGRvY3VtZW50IGR1IGZpY2hpZXIgcXVlIHZvdXMgc291aGFpdGV6IHTDqWzDqWNoYXJnZXIuXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkRvbmVdIC0gTGUgcGFyYW3DqHRyZSBgb25Eb25lYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSB1bmUgZm9pcyBsZVxyXG4gKiB0w6lsw6ljaGFyZ2VtZW50IHRlcm1pbsOpIGV0IHLDqXVzc2kuIExlcyBkb25uw6llcyBkZSByw6lwb25zZSBzZXJvbnQgdHJhbnNtaXNlcyBjb21tZSBhcmd1bWVudC4gSWwgcHJlbmQgdHJvaXMgYXJndW1lbnRzIDogwqsgcmVwb25zZSDCuywgwqsgaGVhZGVycyDCuyBldCDCqyB4aHIgwrsuXHJcbiAqXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkVycm9yXSAtIExlIHBhcmFtw6h0cmUgYG9uRXJyb3JgIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIHMnaWwgeSBhIHVuZVxyXG4gKiBlcnJldXIgcGVuZGFudCBsZSBwcm9jZXNzdXMgZGUgdMOpbMOpY2hhcmdlbWVudC4gSWwgcHJlbmQgdHJvaXMgYXJndW1lbnRzIDogwqsgZXJyb3IgwrssIMKrIGhlYWRlcnMgwrsgZXQgwqsgeGhyIMK7LlxyXG4gKlxyXG4gKiBAcmV0dXJucyB1biBvYmpldCBQcm9tZXNzZS5cclxuICovXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXREb3dubG9hZERvY3VtZW50KFxyXG4gIGNyZWRlbnRpYWxzLFxyXG4gIGRvY0lkLFxyXG4gIG9uRG9uZSA9IHVuZGVmaW5lZCxcclxuICBvbkVycm9yID0gdW5kZWZpbmVkLFxyXG4pIHtcclxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc3VsdCkgPT4ge1xyXG4gICAgLy9UT0RPIC0gYSB0ZXN0ID8gbWFucXVlIGwnVVJMXHJcbiAgICBfM0RTcGFjZV9maWxlX3VybChjcmVkZW50aWFscy5zcGFjZSwgZG9jSWQsIChyZXBvbnNlKSA9PiB7XHJcbiAgICAgIF9odHRwQ2FsbEF1dGhlbnRpY2F0ZWQocmVwb25zZSwge1xyXG4gICAgICAgIG9uQ29tcGxldGU6IChyZXBvbnNlLCBoZWFkZXJzLCB4aHIpID0+IHtcclxuICAgICAgICAgIHJlc3VsdChKU09OLnBhcnNlKHJlcG9uc2UpKTtcclxuICAgICAgICAgIGlmIChvbkRvbmUpIG9uRG9uZShKU09OLnBhcnNlKHJlcG9uc2UpLCBoZWFkZXJzLCB4aHIpO1xyXG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uRmFpbHVyZTogKGVycm9yLCBoZWFkZXJzLCB4aHIpID0+IHtcclxuICAgICAgICAgIGlmIChvbkVycm9yKSBvbkVycm9yKGVycm9yLCBoZWFkZXJzLCB4aHIpO1xyXG4gICAgICAgICAgY29uc29sZS5sb2coZXJyb3IsIGhlYWRlcnM/LmVycm9ybXNnKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH0pO1xyXG59XHJcbiIsImltcG9ydCB7IF8zRFNwYWNlX2dldF9jc3JmLCBfM0RTcGFjZV9maWxlX3VwZGF0ZSB9IGZyb20gXCIuLzNkc3BhY2VfYXBpXCI7XHJcblxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIExhIGZvbmN0aW9uIMKrIHB1c2hEYXRhSW4zRFNwYWNlIMK7IGVzdCB1dGlsaXPDqWUgcG91ciBwb3Vzc2VyIGxlcyBkb25uw6llcyBkYW5zIGxlIDNEU3BhY2Ugw6AgbCdhaWRlXHJcbiAqIGRlcyBpbmZvcm1hdGlvbnMgZCdpZGVudGlmaWNhdGlvbiBldCBkZSBsJ0lEIGQnb2JqZXQgZm91cm5pcy5cclxuICogQHBhcmFtIHtPYmplY3R9IGNyZWRlbnRpYWxzIC0gVW4gb2JqZXQgY29udGVuYW50IGxlcyBpbmZvcm1hdGlvbnMgZCdpZGVudGlmaWNhdGlvbiBuw6ljZXNzYWlyZXMgw6BcclxuICogbCdhdXRoZW50aWZpY2F0aW9uIGRhbnMgdW5lIGZvbmN0aW9uIGludGVybmUoXzNEU3BhY2VfZ2V0X2Rvd25sb2FkVGlja2V0X211bHRpZG9jKS4gSWwgZG9pdCBhdm9pciBsZXMgcHJvcHJpw6l0w6lzIHN1aXZhbnRlczogc3BhY2UsIHRva2VuLCB0ZW5hbnRcclxuICogQHBhcmFtIHtTdHJpbmd9IFtjcmVkZW50aWFscy5zcGFjZV0gLSBMJ1VSTCBkdSBzZXJ2ZXVyIHN1ciBsZXF1ZWwgbCdBUEkgZXN0IGTDqXBsb3nDqWUuKGV4OiAzRFNwYWNlIDooaHR0cHM6Ly9yMTEzMjEwMDk2ODQ0Ny1ldTEtc3BhY2UuM2RleHBlcmllbmNlLjNkcy5jb20vZW5vdmlhKSAsIDNEU3d5bSwgM0RDb21wYXNzLi4uKVxyXG4gXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhQmFzZSAtIExlIHBhcmFtw6h0cmUgYGRhdGFCYXNlYCBlc3QgdW4gb2JqZXQgcXVpIGNvbnRpZW50IGxlcyBkb25uw6llcyBxdWUgdm91cyBzb3VoYWl0ZXpcclxuICogdHJhbnNmw6lyZXIgZGFucyBsJ2VzcGFjZSAzRC4gSWwgc2VyYSBjb252ZXJ0aSBhdSBmb3JtYXQgSlNPTiBldCBlbnJlZ2lzdHLDqSBzb3VzIGZvcm1lIGRlIGZpY2hpZXJcclxuICogZGFucyBsJ2VzcGFjZSAzRC5cclxuICogQHBhcmFtIHtTdHJpbmd9IG9iamVjdElkIC0gTGUgcGFyYW3DqHRyZSBvYmplY3RJZCBlc3QgbCdpZGVudGlmaWFudCB1bmlxdWUgZGUgbCdvYmpldCBkYW5zIGwnZXNwYWNlIDNEIG/DuSBsZXNcclxuICogZG9ubsOpZXMgc2Vyb250IHBvdXNzw6llcy5cclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRG9uZV0gLSBMZSBwYXJhbcOodHJlIG9uRG9uZSBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBsb3JzcXVlIGxlc1xyXG4gKiBkb25uw6llcyBzZXJvbnQgY29ycmVjdGVtZW50IHBvdXNzw6llcyB2ZXJzIGwnZXNwYWNlIDNELiBJbCBmYXV0IHVuIGFyZ3VtZW50LCBxdWkgZXN0IGxlIHLDqXN1bHRhdCBkZVxyXG4gKiBsJ29ww6lyYXRpb24uXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkVycm9yXSAtIExlIHBhcmFtw6h0cmUgYG9uRXJyb3JgIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIHNpIHVuZSBlcnJldXJcclxuICogc3VydmllbnQgbG9ycyBkZSBsJ2V4w6ljdXRpb24gZGUgbGEgZm9uY3Rpb24gYHB1c2hEYXRhSW4zRFNwYWNlYC4gSWwgdm91cyBwZXJtZXQgZGUgZ8OpcmVyIGV0IGRlXHJcbiAqIHLDqXBvbmRyZSDDoCB0b3V0ZSBlcnJldXIgcG91dmFudCBzdXJ2ZW5pci5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBwdXNoRGF0YUluM0RTcGFjZShcclxuICBjcmVkZW50aWFscyxcclxuICBkYXRhQmFzZSxcclxuICBvYmplY3RJZCxcclxuICBvbkRvbmUgPSB1bmRlZmluZWQsXHJcbiAgb25FcnJvciA9IHVuZGVmaW5lZCxcclxuKSB7XHJcbiAgY29uc3QganNvbkZpbGUgPSBuZXcgQmxvYihbSlNPTi5zdHJpbmdpZnkoZGF0YUJhc2UpXSwgeyB0eXBlOiBcInRleHQvcGxhaW5cIiB9KTtcclxuXHJcbiAgXzNEU3BhY2VfZ2V0X2NzcmYoXHJcbiAgICBjcmVkZW50aWFscyxcclxuICAgIG9iamVjdElkLFxyXG4gICAgKGRhdGEpID0+IHtcclxuICAgICAgY29uc3QgZmlsZUlkID0gZGF0YS5kYXRhWzBdLnJlbGF0ZWRkYXRhLmZpbGVzWzBdLmlkO1xyXG4gICAgICBjb25zdCBmaWxlTmFtZSA9XHJcbiAgICAgICAgZGF0YS5kYXRhWzBdLmRhdGFlbGVtZW50cy5zZWNvbmRhcnlUaXRsZSAhPT0gXCJcIlxyXG4gICAgICAgICAgPyBkYXRhLmRhdGFbMF0uZGF0YWVsZW1lbnRzLnNlY29uZGFyeVRpdGxlXHJcbiAgICAgICAgICA6IGRhdGEuZGF0YVswXS5kYXRhZWxlbWVudHMudGl0bGU7XHJcblxyXG4gICAgICBfM0RTcGFjZV9maWxlX3VwZGF0ZShcclxuICAgICAgICBjcmVkZW50aWFscyxcclxuICAgICAgICBvYmplY3RJZCxcclxuICAgICAgICBmaWxlSWQsXHJcbiAgICAgICAganNvbkZpbGUsXHJcbiAgICAgICAgZmlsZU5hbWUsXHJcbiAgICAgICAgKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgaWYgKG9uRG9uZSkgb25Eb25lKHJlc3VsdCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAoZXJyKSA9PiB7XHJcbiAgICAgICAgICBpZiAob25FcnJvcikgb25FcnJvcihlcnIpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICk7XHJcbiAgICB9LFxyXG4gICAgKGVycm9yKSA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiRW4gY2FzIGQnZXJyZXVyIG5vdXMgYXZvbnMgOlwiLCBlcnJvcik7XHJcbiAgICAgIGFsZXJ0KFwiRXJyZXVyIGxvcnMgZGUgbGEgc2F1dmVnYXJkZSwgVmV1aWxsZXogcsOpZXNzYXllelwiKTtcclxuICAgICAgaWYgKG9uRXJyb3IpIG9uRXJyb3IoZXJyb3IpO1xyXG4gICAgfSxcclxuICApO1xyXG59XHJcbiIsImltcG9ydCB7XHJcbiAgXzNEU3BhY2VfZG93bmxvYWRfZG9jLFxyXG4gIF8zRFNwYWNlX2Rvd25sb2FkX211bHRpZG9jLFxyXG4gIF8zRFNwYWNlX2dldF9jc3JmLFxyXG4gIF8zRFNwYWNlX2NzcmYsXHJcbn0gZnJvbSBcIi4vM2RzcGFjZV9hcGlcIjtcclxuXHJcbmxldCBsaXN0T2JqZWN0SWQsIGRhdGFzO1xyXG5cclxuY29uc3QgbWl4ZWREYXRhcyA9IFtdO1xyXG5cclxuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBMYSBmb25jdGlvbiBgZ2V0XzNEU3BhY2VfY3NyZmAgcsOpY3Vww6hyZSB1biBqZXRvbiBDU1JGIGR1IDNEU3BhY2UgZW4gdXRpbGlzYW50IGxlcyAgaW5mb3JtYXRpb25zIGQnaWRlbnRpZmljYXRpb24gZm91cm5pZXMuKEFuY2llbm5lbWVudCBsb2FkRGF0YXMoKSlcclxuICpcclxuICogQHBhcmFtIHtPYmplY3R9IGNyZWRlbnRpYWxzIC0gVW4gb2JqZXQgY29udGVuYW50IGxlcyBpbmZvcm1hdGlvbnMgZCdpZGVudGlmaWNhdGlvbiByZXF1aXNlcyBwb3VyIGF1dGhlbnRpZmllclxyXG4gKiBsYSBkZW1hbmRlLiBJbCBpbmNsdXQgZ8OpbsOpcmFsZW1lbnQgZGVzIHByb3ByacOpdMOpcyB0ZWxsZXMgcXUnaWNpJyDCqyBvYmpJRCDCuywgwqsgc3BhY2UgwrsuXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjcmVkZW50aWFscy5zcGFjZSAtICgzRFNwYWNlKSBMJ1VSTCBkdSBzZXJ2ZXVyIHN1ciBsZXF1ZWwgbCdBUEkgZXN0IGTDqXBsb3nDqWUuKDNEU3BhY2UsIDNEU3d5bSwgM0RDb21wYXNzLC4uLmV0YylcclxuICogQGV4YW1wbGUgcG91ciBsZSAzRFNwYWNlIHtzcGFjZTpcImh0dHBzOi8vcjExMzIxMDA5Njg0NDctZXUxLXNwYWNlLjNkZXhwZXJpZW5jZS4zZHMuY29tL2Vub3ZpYVwifVxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMub2JqSUQgLSBMZSBwYXJhbcOodHJlIG9iaklEIGNvcnJlc3BvbmQgw6AgdW4gb2JqZWN0IElEIGNvbnRhbnQgbGVzIG9iamV0cyBJZCBkZXMgYmFzZXMgZGUgZG9ubsOpZXMpKHNlIGJhc2Ugc3VyIHVuIHRlbmFudCkuXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkRvbmVdIC0gTGUgcGFyYW3DqHRyZSBgb25Eb25lYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBsb3JzcXVlIGxlIGpldG9uXHJcbiAqIENTUkYgc2VyYSByw6ljdXDDqXLDqSBhdmVjIHN1Y2PDqHMuIElsIGZhdXQgdW4gYXJndW1lbnQsIHF1aSBlc3QgbGEgdmFsZXVyIGR1IGpldG9uIENTUkYuXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkVycm9yXSAtIExlIHBhcmFtw6h0cmUgYG9uRXJyb3JgIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIHNpIHVuZSBlcnJldXJcclxuICogc3VydmllbnQgbG9ycyBkZSBsJ2V4w6ljdXRpb24gZGUgbGEgZm9uY3Rpb24gYGdldF8zRFNwYWNlX2NzcmZgLiBDJ2VzdCB1biBwYXJhbcOodHJlIGZhY3VsdGF0aWYsIGRvbmNcclxuICogcydpbCBuJ2VzdCBwYXMgZm91cm5pLCBsYSBmb25jdGlvbiBuZSBmZXJhIHJpZW4gZW4gY2FzIGQnZXJyZXVyLlxyXG4gKi9cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldF8zRFNwYWNlX2NzcmYoXHJcbiAgY3JlZGVudGlhbHMsXHJcbiAgb25Eb25lID0gdW5kZWZpbmVkLFxyXG4gIG9uRXJyb3IgPSB1bmRlZmluZWQsXHJcbikge1xyXG4gIGlmIChjcmVkZW50aWFscy5vYmpJRCAmJiBjcmVkZW50aWFscy5vYmpJRCAhPT0gXCJcIikge1xyXG4gICAgXzNEU3BhY2VfZ2V0X2NzcmYoXHJcbiAgICAgIGNyZWRlbnRpYWxzLFxyXG5cclxuICAgICAgKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgaWYgKG9uRG9uZSkgb25Eb25lKHJlc3BvbnNlKTtcclxuICAgICAgfSxcclxuICAgICAgKGVycikgPT4ge1xyXG4gICAgICAgIGlmIChvbkVycm9yKSBvbkVycm9yKGVycik7XHJcbiAgICAgIH0sXHJcbiAgICApO1xyXG4gIH0gZWxzZSBpZiAoY3JlZGVudGlhbHMub2JqSUQgPT09IG51bGwpIHtcclxuICAgIF8zRFNwYWNlX2NzcmYoXHJcbiAgICAgIGNyZWRlbnRpYWxzLFxyXG4gICAgICAocmVwKSA9PiB7XHJcbiAgICAgICAgY29uc3QgbXNnID0gXCJQYXMgZCdvYmpJRCwgb3UgaW52YWxpZGVcIjtcclxuICAgICAgICBjb25zdCBpbmZvID0geyByZXAsIG1zZyB9O1xyXG4gICAgICAgIGlmIChvbkRvbmUpIG9uRG9uZShpbmZvKTtcclxuICAgICAgfSxcclxuICAgICAgKGVycikgPT4ge1xyXG4gICAgICAgIGNvbnN0IG1zZyA9IFwiUGFzIGQnb2JqSUQgZXQgZXJyZXVyIHN1ciBsZSBTcGFjZVwiO1xyXG4gICAgICAgIGNvbnN0IGluZm9zID0geyBtc2csIGVyciB9O1xyXG4gICAgICAgIGlmIChvbkVycm9yKSBvbkVycm9yKGluZm9zKTtcclxuICAgICAgfSxcclxuICAgICk7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIExhIGZvbmN0aW9uIGBnZXREYXRhc0J5VGVuYW50YCBlc3QgdW5lIGZvbmN0aW9uIGFzeW5jaHJvbmUgcXVpIHTDqWzDqWNoYXJnZSBkZXMgZG9jdW1lbnRzIMOgIHBhcnRpciBkJ3VuIGVzcGFjZSAzRCDDoCBsJ2FpZGUgZGVzIGluZm9ybWF0aW9ucyBkJ2lkZW50aWZpY2F0aW9uIGZvdXJuaWVzIGV0IGFwcGVsbGUgbGUgcmFwcGVsIGBvbkRvbmVgXHJcbiAqIGF2ZWMgbGVzIGRvbm7DqWVzIHTDqWzDqWNoYXJnw6llcyBvdSBsZSByYXBwZWwgYG9uRXJyb3JgIGF2ZWMgdW5lIGVycmV1ciBsZSBjYXMgw6ljaMOpYW50LiAoYW5jaWVubmVtZW50IGdldERvY3VtZW50cygpKVxyXG5cclxuICogQHBhcmFtIHtPYmplY3R9IGNyZWRlbnRpYWxzIC0gVW4gb2JqZXQgY29udGVuYW50IGxlcyBpbmZvcm1hdGlvbnMgZCdpZGVudGlmaWNhdGlvbiByZXF1aXNlcyBwb3VyIGF1dGhlbnRpZmllclxyXG4gKiBsYSBkZW1hbmRlLiBJbCBpbmNsdXQgZ8OpbsOpcmFsZW1lbnQgZGVzIHByb3ByacOpdMOpcyB0ZWxsZXMgcXUnaWNpIMKrIHRva2VuIMK7IGV0IMKrIHNwYWNlIMK7LihleDogY3JlZGVudGlhbHMuc3BhY2UsIGNyZWRlbnRpYWxzLnRlbmFudCwgY3JlZGVudGlhbHMudG9rZW4uLi4pLlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMuc3BhY2UgLSAoM0RTcGFjZSkgTCdVUkwgZHUgc2VydmV1ciBzdXIgbGVxdWVsIGwnQVBJIGVzdCBkw6lwbG95w6llLigzRFNwYWNlLCAzRFN3eW0sIDNEQ29tcGFzcywuLi5ldGMpXHJcbiAqIEBleGFtcGxlIHBvdXIgbGUgM0RTcGFjZSB7c3BhY2U6XCJodHRwczovL3IxMTMyMTAwOTY4NDQ3LWV1MS1zcGFjZS4zZGV4cGVyaWVuY2UuM2RzLmNvbS9lbm92aWFcIn1cclxuICogQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLnRlbmFudCAtIGxlIHRlbmFudCBjb3VyYW50IFxyXG4gKiBAZXhhbXBsZSB7dGVuYW50OlwiUjExMzIxMDA5Njg0NDdcIn1cclxuICogQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLnRva2VuIC0gTGUgcGFyYW3DqHRyZSB0b2tlbiBlc3QgbGUgamV0b24gQ1NSRi4gKGhlYWRlcnMgZXg6IEVOT19DU1JGX1RPS0VOOnRva2VuKVxyXG4gKiBAcGFyYW0ge0FycmF5T2ZPYmplY3R9IGNyZWRlbnRpYWxzLm9iaklkcyAtIFRhYmxlYXUgZCdvYmpldHMgZGVzIG9iamV0cyBJZCBkZXMgYmFzZXMgZGUgZG9ubsOpZXMgZXQgbGV1ciBub20uKGV4OiBjcmVkZW50aWFscy5vYmpJZHM9W3tvYmpJZDpcInh4eFwiLG5hbWU6XCJ4eHhcIn0se29iaklkOlwieHh4XCIsbmFtZTpcInh4eFwifV0gKSAobmFtZSBkaXNwb25pYmxlIGRhbnMgbGUgbW9kdWxlIDogXHJcbiAqIC0gZGJDbGllbnRzLCBcclxuICogLSBkYkNhdGFsb2dzLCBcclxuICogLSBkYlByb2pldHMgKVxyXG5cclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRG9uZV0gLSBMZSBwYXJhbcOodHJlIG9uRG9uZSBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBsb3JzcXVlIGxlc1xyXG4gKiBkb25uw6llcyBzZXJvbnQgdMOpbMOpY2hhcmfDqWVzIGF2ZWMgc3VjY8Oocy4gSWwgZmF1dCB1biBhcmd1bWVudCwgcXVpIGNvcnJlc3BvbmQgYXV4IGRvbm7DqWVzXHJcbiAqIHTDqWzDqWNoYXJnw6llcy5cclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRXJyb3JdIC0gTGUgcGFyYW3DqHRyZSBgb25FcnJvcmAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgc2kgdW5lIGVycmV1clxyXG4gKiBzdXJ2aWVudCBsb3JzIGRlIGwnZXjDqWN1dGlvbiBkZSBsYSBmb25jdGlvbiBgXzNEU3BhY2VfZG93bmxvYWRfZG9jYC4gSWwgdm91cyBwZXJtZXQgZGUgZ8OpcmVyIGV0IGRlXHJcbiAqIHLDqXBvbmRyZSDDoCB0b3V0ZSBlcnJldXIgcG91dmFudCBzdXJ2ZW5pci5cclxuICovXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXREYXRhc0J5VGVuYW50KFxyXG4gIGNyZWRlbnRpYWxzLFxyXG4gIG9uRG9uZSA9IHVuZGVmaW5lZCxcclxuICBvbkVycm9yID0gdW5kZWZpbmVkLFxyXG4pIHtcclxuICBjb25zb2xlLmxvZyhcImdldERhdGFzQnlUZW5hbnRcIiwgY3JlZGVudGlhbHMpO1xyXG4gIGF3YWl0IF8zRFNwYWNlX2Rvd25sb2FkX2RvYyhcclxuICAgIGNyZWRlbnRpYWxzLFxyXG4gICAgKGRhdGEpID0+IHtcclxuICAgICAgY29uc3QgX2RhdGFzID0ge307XHJcbiAgICAgIF9kYXRhc1tcIm9ialwiXSA9IGRhdGE7XHJcbiAgICAgIGdldERhdGFzRnJvbTNEU3BhY2UoXHJcbiAgICAgICAgY3JlZGVudGlhbHMsXHJcbiAgICAgICAgKHJlcG9uc2UpID0+IHtcclxuICAgICAgICAgIF9kYXRhc1tcImRhdGFzXCJdID0gcmVwb25zZTtcclxuICAgICAgICAgIGlmIChvbkRvbmUpIG9uRG9uZShfZGF0YXMpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgKGVycikgPT4ge1xyXG4gICAgICAgICAgaWYgKG9uRXJyb3IpIG9uRXJyb3IoZXJyKTtcclxuICAgICAgICB9LFxyXG4gICAgICApO1xyXG4gICAgfSxcclxuICAgIChlcnIpID0+IHtcclxuICAgICAgaWYgKG9uRXJyb3IpIG9uRXJyb3IoZXJyKTtcclxuICAgIH0sXHJcbiAgKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBMYSBmb25jdGlvbiBgZ2V0RGF0YXNGcm9tM0RTcGFjZWAgcsOpY3Vww6hyZSBsZXMgZG9ubsOpZXMgZCd1biBlc3BhY2UgM0QgZW4gdXRpbGlzYW50IGxlcyBpbmZvcm1hdGlvbnNcclxuICogZCdpZGVudGlmaWNhdGlvbiBmb3VybmllcyBldCBhcHBlbGxlIGxlIHJhcHBlbCBgb25Eb25lYCBhdmVjIGxlcyBkb25uw6llcyByw6ljdXDDqXLDqWVzIG91IGxlIHJhcHBlbFxyXG4gKiBgb25FcnJvcmAgYXZlYyB1bmUgZXJyZXVyIGxlIGNhcyDDqWNow6lhbnQuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBjcmVkZW50aWFscyAtIFVuIG9iamV0IGNvbnRlbmFudCBsZXMgaW5mb3JtYXRpb25zIGQnaWRlbnRpZmljYXRpb24gcmVxdWlzZXMgcG91ciBhdXRoZW50aWZpZXJcclxuICogbGEgZGVtYW5kZS4gSWwgaW5jbHV0IGfDqW7DqXJhbGVtZW50IGRlcyBwcm9wcmnDqXTDqXMgdGVsbGVzIHF1J2ljaSDCqyB0b2tlbiDCuyBldCDCqyBzcGFjZSDCuy4oZXg6IGNyZWRlbnRpYWxzLnNwYWNlLCBjcmVkZW50aWFscy50ZW5hbnQsIGNyZWRlbnRpYWxzLnRva2VuLi4uKS5cclxuICogQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLnNwYWNlIC0gKDNEU3BhY2UpIEwnVVJMIGR1IHNlcnZldXIgc3VyIGxlcXVlbCBsJ0FQSSBlc3QgZMOpcGxvecOpZS4oM0RTcGFjZSwgM0RTd3ltLCAzRENvbXBhc3MsLi4uZXRjKVxyXG4gKiBAZXhhbXBsZSBwb3VyIGxlIDNEU3BhY2Uge3NwYWNlOlwiaHR0cHM6Ly9yMTEzMjEwMDk2ODQ0Ny1ldTEtc3BhY2UuM2RleHBlcmllbmNlLjNkcy5jb20vZW5vdmlhXCJ9XHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjcmVkZW50aWFscy50ZW5hbnQgLSBsZSB0ZW5hbnQgY291cmFudFxyXG4gKiBAZXhhbXBsZSB7dGVuYW50OlwiUjExMzIxMDA5Njg0NDdcIn1cclxuICogQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLnRva2VuIC0gTGUgcGFyYW3DqHRyZSB0b2tlbiBlc3QgbGUgamV0b24gQ1NSRi4gKGhlYWRlcnMgZXg6IEVOT19DU1JGX1RPS0VOOnRva2VuKVxyXG4gKiBAcGFyYW0ge0FycmF5T2ZPYmplY3R9IGNyZWRlbnRpYWxzLm9iaklkcyAtIFRhYmxlYXUgZCdvYmpldHMgZGVzIG9iamV0cyBJZCBkZXMgYmFzZXMgZGUgZG9ubsOpZXMgZXQgbGV1ciBub20uKGV4OiBjcmVkZW50aWFscy5vYmpJZHM9W3tvYmpJZDpcInh4eFwiLG5hbWU6XCJ4eHhcIn0se29iaklkOlwieHh4XCIsbmFtZTpcInh4eFwifV0gKSAobmFtZSBkaXNwb25pYmxlIGRhbnMgbGUgbW9kdWxlIDpcclxuICogLSBkYkNsaWVudHMsXHJcbiAqIC0gZGJDYXRhbG9ncyxcclxuICogLSBkYlByb2pldHMgKVxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25Eb25lXSAtIExlIHBhcmFtw6h0cmUgYG9uRG9uZWAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgbG9yc3F1ZSB0b3V0ZXNcclxuICogbGVzIGRvbm7DqWVzIGF1cm9udCDDqXTDqSB0w6lsw6ljaGFyZ8OpZXMgYXZlYyBzdWNjw6hzIGRlcHVpcyBsJ2VzcGFjZSAzRC4gSWwgZmF1dCB1biBhcmd1bWVudCwgcXVpIGVzdCB1blxyXG4gKiB0YWJsZWF1IGTigJlvYmpldHMuIENoYXF1ZSBvYmpldCBkdSB0YWJsZWF1IHJlcHLDqXNlbnRlIHVuIGRvY3VtZW50IHTDqWzDqWNoYXJnw6kgZXQgcG9zc8OoZGUgZGV1eFxyXG4gKiBwcm9wcmnDqXTDqXM6IGxlIG5vbSBkdSBkb2N1bWVudFxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25FcnJvcl0gLSBMZSBwYXJhbcOodHJlIGBvbkVycm9yYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBzJ2lsIHkgYSB1bmVcclxuICogZXJyZXVyIGxvcnMgZGUgbCdleMOpY3V0aW9uIGRlIGxhIGZvbmN0aW9uIGBfM0RTcGFjZV9kb3dubG9hZF9kb2NgLiBJbCB2b3VzIHBlcm1ldCBkZSBnw6lyZXIgZXQgZGVcclxuICogcsOpcG9uZHJlIMOgIHRvdXRlIGVycmV1ciBxdWkgc2UgcHJvZHVpdC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXREYXRhc0Zyb20zRFNwYWNlKFxyXG4gIGNyZWRlbnRpYWxzLFxyXG4gIG9uRG9uZSA9IHVuZGVmaW5lZCxcclxuICBvbkVycm9yID0gdW5kZWZpbmVkLFxyXG4pIHtcclxuICBjb25zdCBiYmRzID0gW107XHJcbiAgY3JlZGVudGlhbHMub2JqSWRzLmZvckVhY2goKG9iaiwgaSkgPT4ge1xyXG4gICAgXzNEU3BhY2VfZG93bmxvYWRfZG9jKFxyXG4gICAgICBjcmVkZW50aWFscyxcclxuICAgICAgb2JqLm9iaklkLFxyXG4gICAgICAoZGF0YSkgPT4ge1xyXG4gICAgICAgIGJiZHMucHVzaCh7IFtvYmoubmFtZV06IGRhdGEgfSk7XHJcbiAgICAgICAgaWYgKG9iai5uYW1lID09PSBcImRiUHJvamV0c1wiKSB7XHJcbiAgICAgICAgICBsaXN0T2JqZWN0SWQgPSBkYXRhLmFmZmFpcmVzLm1hcCgoYWZmKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBhZmYub2JqZWN0SUQ7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIGRhdGFNaXhpbmcoY3JlZGVudGlhbHMsIGRhdGFzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGkgPT09IGNyZWRlbnRpYWxzLm9iaklkcy5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgICBpZiAob25Eb25lKSBvbkRvbmUoYmJkcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICAoZXJyKSA9PiB7XHJcbiAgICAgICAgaWYgKG9uRXJyb3IpIG9uRXJyb3IoZXJyKTtcclxuICAgICAgfSxcclxuICAgICk7XHJcbiAgfSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gTGEgZm9uY3Rpb24gYGRhdGFNaXhpbmdgIHByZW5kIGVuIGNvbXB0ZSBsZXMgaW5mb3JtYXRpb25zIGQnaWRlbnRpZmljYXRpb24sIGxlcyBkb25uw6llcyBldCBsZXNcclxuICogcmFwcGVscyBmYWN1bHRhdGlmcywgdMOpbMOpY2hhcmdlIGxlcyBkb25uw6llcyDDoCBwYXJ0aXIgZCd1biBlc3BhY2UgM0QsIGxlcyBtw6lsYW5nZSBhdmVjIGxlcyBkb25uw6llc1xyXG4gKiBkJ2VudHLDqWUgZXQgcmVudm9pZSBsZXMgZG9ubsOpZXMgbcOpbGFuZ8OpZXMuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBjcmVkZW50aWFscyAtIFVuIG9iamV0IGNvbnRlbmFudCBsZXMgaW5mb3JtYXRpb25zIGQnaWRlbnRpZmljYXRpb24gcmVxdWlzZXMgcG91ciBhdXRoZW50aWZpZXJcclxuICogbGEgZGVtYW5kZS4gSWwgaW5jbHV0IGfDqW7DqXJhbGVtZW50IGRlcyBwcm9wcmnDqXTDqXMgdGVsbGVzIHF1J2ljaSDCqyB0b2tlbiDCuyBldCDCqyBzcGFjZSDCuy4oZXg6IGNyZWRlbnRpYWxzLnNwYWNlLCBjcmVkZW50aWFscy50ZW5hbnQsIGNyZWRlbnRpYWxzLnRva2VuLi4uKS5cclxuQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLnNwYWNlIC0gKDNEU3BhY2UpIEwnVVJMIGR1IHNlcnZldXIgc3VyIGxlcXVlbCBsJ0FQSSBlc3QgZMOpcGxvecOpZS4oM0RTcGFjZSwgM0RTd3ltLCAzRENvbXBhc3MsLi4uZXRjKVxyXG4gKiBAZXhhbXBsZSBwb3VyIGxlIDNEU3BhY2Uge3NwYWNlOlwiaHR0cHM6Ly9yMTEzMjEwMDk2ODQ0Ny1ldTEtc3BhY2UuM2RleHBlcmllbmNlLjNkcy5jb20vZW5vdmlhXCJ9XHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjcmVkZW50aWFscy50ZW5hbnQgLSBsZSB0ZW5hbnQgY291cmFudCBcclxuICogQGV4YW1wbGUge3RlbmFudDpcIlIxMTMyMTAwOTY4NDQ3XCJ9XHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjcmVkZW50aWFscy50b2tlbiAtIExlIHBhcmFtw6h0cmUgdG9rZW4gZXN0IGxlIGpldG9uIENTUkYuIChoZWFkZXJzIGV4OiBFTk9fQ1NSRl9UT0tFTjp0b2tlbilcclxuICogQHBhcmFtIF9kYXRhcyAtIExlIHBhcmFtw6h0cmUgYF9kYXRhc2AgZXN0IHVuIHRhYmxlYXUgZCdvYmpldHMgSUQgZCdBZmZhaXJlc1xyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25Eb25lXSAtIExlIHBhcmFtw6h0cmUgYG9uRG9uZWAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgbG9yc3F1ZSBsZVxyXG4gKiBwcm9jZXNzdXMgZGUgbcOpbGFuZ2UgZGVzIGRvbm7DqWVzIHNlcmEgdGVybWluw6kgYXZlYyBzdWNjw6hzLiBJbCBwcmVuZCB1biBhcmd1bWVudCwgYG1peGVkRGF0YXNgLCBxdWlcclxuICogZXN0IHVuIHRhYmxlYXUgY29udGVuYW50IGxlcyBkb25uw6llcyBtaXh0ZXMuXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkVycm9yXSAtIExlIHBhcmFtw6h0cmUgYG9uRXJyb3JgIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIGVuIGNhc1xyXG4gKiBkJ2VycmV1ciBsb3JzIGR1IHByb2Nlc3N1cyBkZSBtw6lsYW5nZSBkZXMgZG9ubsOpZXMuIElsIGZhdXQgdW4gYXJndW1lbnQsIHF1aSBlc3QgbCdvYmpldCBkJ2VycmV1ci5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBkYXRhTWl4aW5nKFxyXG4gIGNyZWRlbnRpYWxzLFxyXG4gIF9kYXRhcyxcclxuICBvbkRvbmUgPSB1bmRlZmluZWQsXHJcbiAgb25FcnJvciA9IHVuZGVmaW5lZCxcclxuKSB7XHJcbiAgXzNEU3BhY2VfZG93bmxvYWRfbXVsdGlkb2MoXHJcbiAgICBjcmVkZW50aWFscyxcclxuICAgIGxpc3RPYmplY3RJZCxcclxuICAgIChyZXN1bHQpID0+IHtcclxuICAgICAgY29uc3QgY29weURhdGEgPSBbLi4uX2RhdGFzXTtcclxuICAgICAgY29weURhdGEuZmluZCgoZSkgPT4gZS5vYmplY3RJRCA9PT0gcmVzdWx0Lm9iamVjdElkKVtcImRhdGFcIl0gPVxyXG4gICAgICAgIHJlc3VsdC5kYXRhO1xyXG4gICAgICBkYXRhcyA9IGNvcHlEYXRhO1xyXG5cclxuICAgICAgbWl4ZWREYXRhcy5wdXNoKHJlc3VsdC5kYXRhKTtcclxuICAgICAgaWYgKG9uRG9uZSkgb25Eb25lKG1peGVkRGF0YXMpO1xyXG4gICAgfSxcclxuICAgIChlcnIpID0+IHtcclxuICAgICAgaWYgKG9uRXJyb3IpIG9uRXJyb3IoZXJyKSwgY29uc29sZS5sb2coZXJyKTtcclxuICAgIH0sXHJcbiAgKTtcclxufVxyXG4iLCJpbXBvcnQgeyBfaHR0cENhbGxBdXRoZW50aWNhdGVkIH0gZnJvbSBcIi4uL21haW4vM2RleHBlcmllbmNlX2FwaVwiO1xyXG5pbXBvcnQgeyBfM0RTcGFjZV9nZXRfZG9jSW5mbyB9IGZyb20gXCIuLi9tYWluLzNkc3BhY2VfYXBpXCI7XHJcbmltcG9ydCB7IFVVSUQgfSBmcm9tIFwiLi4vLi4vYXBpL2luZGV4XCI7XHJcblxyXG4vLyBMSU5LIC0gaHR0cHM6Ly9tZWRpYS4zZHMuY29tL3N1cHBvcnQvZG9jdW1lbnRhdGlvbi9kZXZlbG9wZXIvQ2xvdWQvZW4vRW5nbGlzaC9DQUEzRFNwYWNlUkVTVC9DQUE2V1Jlc3RTZXJ2aWNlUHJpbmNpcGxlcy5odG1cclxuLy8gRG9jIGRlIHRlc3Qgc3VyIHRlbmFudCBCRUFNMyBQUk9EXHJcbmNvbnN0IG9iaklEVEVTVCA9IFwiQjcwQzEyQ0RBRTA0MTUwMDY1NzlBOTMyMDAwNjFBMTRcIjtcclxuLy8gRG9jIGRlIHRlc3Qgc3VyIHRlbmFudCBQaXZldGF1IFRFU1RcclxuY29uc3Qgb2JqSURURVNUMiA9IFwiRkEzNUZCOUIxNzdBMjgwMDY1ODAxOTA0MDAxOTNDMjBcIjtcclxuY29uc3Qgb2JqSURURVNUMyA9IFwiRkEzNUZCOUIxNzdBMjgwMDY1ODAwRUEwMDAwRjU5OUNcIjtcclxuXHJcbmNvbnN0IHNvdXJjZXNTZWFyY2hpbmcgPSBbXHJcbiAgXCJzd3ltXCIsXHJcbiAgXCIzZHNwYWNlXCIsXHJcbiAgXCJkcml2ZVwiLFxyXG4gIFwidXNlcnNncm91cFwiLFxyXG4gIFwiM2RwbGFuXCIsXHJcbiAgXCJkYXNoYm9hcmRcIixcclxuXTtcclxuXHJcbmNvbnN0IGxpc3RQcmVkaWNhdGVzID0ge1xyXG4gIGhvdzogXCJkczZ3Omhvd1wiLFxyXG4gIHdoYXQ6IFwiZHM2dzp3aGF0XCIsXHJcbiAgd2hlbjogXCJkczZ3OndoZW5cIixcclxuICB3aGVyZTogXCJkczZ3OndoZXJlXCIsXHJcbiAgd2hvOiBcImRzNnc6d2hvXCIsXHJcbiAgd2h5OiBcImRzNnc6d2h5XCIsXHJcbn07XHJcbmNvbnN0IG9ialRvVGFnID0ge1xyXG4gIG9iaklkOiBvYmpJRFRFU1QzLFxyXG4gIHByZWQ6IFwid2hvXCIsXHJcbiAgb3JkZXJfYnk6IFwiZGVzY1wiLFxyXG4gIHRhZzogXCJ0ZXN0VGFnXCIsXHJcbn07XHJcblxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIExhIGZvbmN0aW9uIGBhZGRUYWdUb0RvY2AgZXN0IHV0aWxpc8OpZSBwb3VyIGFqb3V0ZXIgdW5lIGJhbGlzZSDDoCB1biBkb2N1bWVudCBkYW5zIHVuIGVzcGFjZSAzRCBlblxyXG4gKiB1dGlsaXNhbnQgbGVzIGluZm9ybWF0aW9ucyBkJ2lkZW50aWZpY2F0aW9uIGV0IGxlcyBpbmZvcm1hdGlvbnMgc3VyIGwnb2JqZXQgZm91cm5pZXMuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBjcmVkZW50aWFscyAtIFVuIG9iamV0IGNvbnRlbmFudCBsZXMgaW5mb3JtYXRpb25zIGQnaWRlbnRpZmljYXRpb24gcmVxdWlzZXMgcG91ciBhdXRoZW50aWZpZXJcclxuICogbGEgZGVtYW5kZS4gSWwgaW5jbHV0IGfDqW7DqXJhbGVtZW50IGRlcyBwcm9wcmnDqXTDqXMgdGVsbGVzIHF1ZSDCqyB0b2tlbiDCuywgwqsgc3BhY2UgwrssIMKrIHRlbmFudCDCuyBldCDCqyBjdHggwrsuXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjcmVkZW50aWFscy5zcGFjZSAtIEwnVVJMIGR1IHNlcnZldXIgc3VyIGxlcXVlbCBsJ0FQSSBlc3QgZMOpcGxvecOpZS4oZXg6IDNEU3BhY2UgPT4oaHR0cHM6Ly9yMTEzMjEwMDk2ODQ0Ny1ldTEtc3BhY2UuM2RleHBlcmllbmNlLjNkcy5jb20vZW5vdmlhKSwgM0RTd3ltLCAzRENvbXBhc3MuLi4pXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBjcmVkZW50aWFscy5jdXJyZW50VXNlci51c2VybmFtZSAtIExlIHBhcmFtw6h0cmUgYGN1cnJlbnRVc2VyYCBlc3QgdW4gcXVpIGNvbnRpZW50IGxlcyBpbmZvcm1hdGlvbnMgZGUgbCd1dGlsaXNhdGV1ciBxdWkgZW52b2llIGxlIG1lc3NhZ2UoYXBwZWxlciBkZXB1aXMgbGEgZm9uY3Rpb24gYF8zRFN3eW1fZ2V0X2N1cnJlbnR1c2VyYCksIHVuZSBjaGHDrm5lIGRlIGNhcmFjdMOocmUgY29udGVuYW50IGxlIG5vbSBkJ3V0aWxpc2F0ZXVyLlxyXG4gKlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMudGVuYW50IC0gTCdpZGVudGlmaWFudCBkdSB0ZW5hbnQgc3VyIGxlcXVlbCBsJ0FQSSBlc3QgZMOpcGxvecOpZS4oZXg6IFIxMTMyMTAwOTY4NDQ3KVxyXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIC0gTGUgcGFyYW3DqHRyZSBgb2JqYCBlc3QgdW4gb2JqZXQgcXVpIGNvbnRpZW50IGxlcyBwcm9wcmnDqXTDqXMgc3VpdmFudGVzwqA6XHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBvYmouaW5mby5uYW1lIC0gTCdpZGVudGlmaWFudCBkZSBsJ29iamV0IHF1ZSB2b3VzIHNvdWhhaXRleiBtYXJxdWVyLiAoZXg6IEI3MEMxMkNEQUUwNDE1MDA2NTc5QTkzMjAwMDYxQTE0KVxyXG4gKiBAcGFyYW0ge1N0cmluZ30gb2JqLnByZWQgLSBMYSBwcm9wcmnDqXTDqSBkZSBsJ29iamV0IHF1ZSB2b3VzIHNvdWhhaXRleiBtYXJxdWVyLiAoZXg6IGhvdywgd2hhdCwgd2hlbiwgd2hlcmUsIHdobywgd2h5KVxyXG4gKiBAcGFyYW0ge1N0cmluZ30gb2JqLnRhZyAtIExlIHRhZyBxdWUgdm91cyBzb3VoYWl0ZXogYWpvdXRlciDDoCBsJ29iamV0LlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gb2JqLm9yZGVyX2J5IC0gTCdvcmRyZSBkZSBsYSBiYWxpc2UgcXVlIHZvdXMgc291aGFpdGV6IGFqb3V0ZXIgw6AgbCdvYmpldC4gKGV4OiBhc2MsIGRlc2MpXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkRvbmVdIC0gTGUgcGFyYW3DqHRyZSBgb25Eb25lYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBsb3JzcXVlXHJcbiAqIGwnb3DDqXJhdGlvbiBkZSBtYXJxdWFnZSBzZXJhIHRlcm1pbsOpZSBhdmVjIHN1Y2PDqHMuIExhIHLDqXBvbnNlIGR1IHNlcnZldXIgbHVpIHNlcmEgdHJhbnNtaXNlIGVuXHJcbiAqIGFyZ3VtZW50LlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25FcnJvcl0gLSBMZSBwYXJhbcOodHJlIGBvbkVycm9yYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBzJ2lsIHkgYSB1bmVcclxuICogZXJyZXVyIGxvcnMgZGUgbCdleMOpY3V0aW9uIGRlIGxhIGZvbmN0aW9uIGBhZGRUYWdUb0RvY2AuIElsIHZvdXMgcGVybWV0IGRlIGfDqXJlciBldCBkZSB0cmFpdGVyXHJcbiAqIGwnZXJyZXVyIGRlIG1hbmnDqHJlIHBlcnNvbm5hbGlzw6llLlxyXG4gKiBAZXhhbXBsZSBjcmVkZW50aWFscz17c3BhY2U6IFwiaHR0cHM6Ly9yMTEzMjEwMDk2ODQ0Ny1ldTEtc3BhY2UuM2RleHBlcmllbmNlLjNkcy5jb20vZW5vdmlhXCIsIGN1cnJlbnRVc2VyOiB7IHVzZXJuYW1lOiBcIllhblwiIH0sIHRlbmFudDogXCJSMTEzMjEwMDk2ODQ0N1wifVxyXG4gKiBAZXhhbXBsZSBvYmo9e29iaklkOiBcIkI3MEMxMkNEQUUwNDE1MDA2NTc5QTkzMjAwMDYxQTE0XCIsIHByZWQ6IFwid2hhdFwiLCB0YWc6IFwidGVzdFRhZ1wifVxyXG4gKlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZFRhZ1RvRG9jKFxyXG4gIGNyZWRlbnRpYWxzLFxyXG4gIG9iaixcclxuICBvbkRvbmUgPSB1bmRlZmluZWQsXHJcbiAgb25FcnJvciA9IHVuZGVmaW5lZCxcclxuKSB7XHJcbiAgY29uc3QgeyBzcGFjZSwgdGVuYW50IH0gPSBjcmVkZW50aWFscztcclxuICBjb25zdCB7IG9iaklkLCBwcmVkLCB0YWcgfSA9IG9iajtcclxuXHJcbiAgY29uc3QgVVJMID0ge1xyXG4gICAgdXJpOiBcIi9yZXNvdXJjZXMvNncvdGFnc1wiLFxyXG4gICAgb3RwQ1RYOiBcIlNlY3VyaXR5Q29udGV4dD1wcmVmZXJyZWRcIixcclxuICAgIG9wdFRlbmFudDogYHRlbmFudD0ke3RlbmFudH1gLFxyXG4gIH07XHJcbiAgY29uc3QgdXJsID0gYCR7c3BhY2V9JHtVUkwudXJpfT8ke1VSTC5vdHBDVFh9JiR7VVJMLm9wdFRlbmFudH1gO1xyXG4gIGNvbnN0IGRhdGFUZXN0ID0ge1xyXG4gICAgdGFnOiBbXHJcbiAgICAgIHtcclxuICAgICAgICBzdWJqZWN0OiBbXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHVyaTogYHBpZDovLyR7b2JqSWR9YCxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBwcmVkaWNhdGU6IGxpc3RQcmVkaWNhdGVzW3ByZWRdLFxyXG4gICAgICAgIG9iamVjdDoge1xyXG4gICAgICAgICAgbGl0ZXJhbDogdGFnLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICBdLFxyXG4gIH07XHJcblxyXG4gIF9odHRwQ2FsbEF1dGhlbnRpY2F0ZWQodXJsLCB7XHJcbiAgICBtZXRob2Q6IFwiUFVUXCIsXHJcbiAgICBoZWFkZXJzOiB7XHJcbiAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgICBBY2NlcHQ6IFwiYXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgfSxcclxuICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KGRhdGFUZXN0KSxcclxuICAgIG9uQ29tcGxldGUocmVzcG9uc2UpIHtcclxuICAgICAgY29uc3QgcmVzcCA9IEpTT04ucGFyc2UocmVzcG9uc2UpO1xyXG4gICAgICBjb25zdCBpbmZvID0ge307XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIF8zRFNwYWNlX2dldF9kb2NJbmZvKFxyXG4gICAgICAgICAgY3JlZGVudGlhbHMsXHJcbiAgICAgICAgICBvYmpJZCxcclxuICAgICAgICAgIChyZXApID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZG9jTmFtZSA9IHJlcC5kYXRhWzBdLmRhdGFlbGVtZW50cy50aXRsZTtcclxuICAgICAgICAgICAgY29uc3QgZG9jRXh0ID1cclxuICAgICAgICAgICAgICByZXAuZGF0YVswXS5kYXRhZWxlbWVudHMuZmlsZUV4dGVuc2lvbiAhPT0gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgICAgICA/IHJlcC5kYXRhWzBdLmRhdGFlbGVtZW50cy5maWxlRXh0ZW5zaW9uXHJcbiAgICAgICAgICAgICAgICA6IFwiXCI7XHJcbiAgICAgICAgICAgIGNvbnN0IGNyZWF0ZUJ5ID1cclxuICAgICAgICAgICAgICByZXAuZGF0YVswXS5yZWxhdGVkZGF0YS5vd25lckluZm9bMF0uZGF0YWVsZW1lbnRzLm5hbWU7XHJcbiAgICAgICAgICAgIGluZm9bXCJuYW1lXCJdID0gZG9jTmFtZTtcclxuICAgICAgICAgICAgaW5mb1tcImV4dFwiXSA9IGRvY0V4dDtcclxuICAgICAgICAgICAgaW5mb1tcImNyZWF0ZUJ5XCJdID0gY3JlYXRlQnk7XHJcbiAgICAgICAgICAgIG9iai5pbmZvID0geyAuLi5pbmZvIH07XHJcbiAgICAgICAgICAgIGdldEFjdHVhbFRhZ3NPbkRvYyhcclxuICAgICAgICAgICAgICBjcmVkZW50aWFscyxcclxuICAgICAgICAgICAgICBvYmosXHJcbiAgICAgICAgICAgICAgKHJlcCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKG9uRG9uZSkgb25Eb25lKHJlcCk7XHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAob25FcnJvcikgb25FcnJvcihlcnIpO1xyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgKHJlc3BvbnNlLCBoZWFkZXJzKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGluZm8gPSByZXNwb25zZTtcclxuICAgICAgICAgICAgaW5mb1tcIm1zZ1wiXSA9IGhlYWRlcnMuZXJyb3Jtc2c7XHJcbiAgICAgICAgICAgIGluZm9bXCJlcnJDb2RlXCJdID0gaGVhZGVycy5lcnJvcmNvZGU7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi4p2MIHNlbmREaXJlY3RNZXNzYWdlID0+IFwiLCBpbmZvKTtcclxuICAgICAgICAgICAgaWYgKG9uRXJyb3IpIG9uRXJyb3IoaW5mbyk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICk7XHJcbiAgICAgIH0sIDIwMDApO1xyXG4gICAgfSxcclxuICAgIG9uRmFpbHVyZShyZXNwb25zZSwgaGVhZGVycykge1xyXG4gICAgICBjb25zdCBpbmZvID0gcmVzcG9uc2U7XHJcbiAgICAgIGluZm9bXCJtc2dcIl0gPSBoZWFkZXJzLmVycm9ybXNnO1xyXG4gICAgICBpbmZvW1wiZXJyQ29kZVwiXSA9IGhlYWRlcnMuZXJyb3Jjb2RlO1xyXG4gICAgICBjb25zb2xlLmxvZyhcIuKdjCBzZW5kRGlyZWN0TWVzc2FnZSA9PiBcIiwgaW5mbyk7XHJcbiAgICAgIGlmIChvbkVycm9yKSBvbkVycm9yKGluZm8pO1xyXG4gICAgfSxcclxuICB9KTtcclxufVxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIExhIGZvbmN0aW9uIGBnZXRBY3R1YWxUYWdzT25Eb2NgIHLDqWN1cMOocmUgbGVzIGJhbGlzZXMgcsOpZWxsZXMgZCd1biBkb2N1bWVudCBlbiB1dGlsaXNhbnQgbGVzXHJcbiAqIGluZm9ybWF0aW9ucyBkJ2lkZW50aWZpY2F0aW9uIGV0IGxlcyBpbmZvcm1hdGlvbnMgc3VyIGwnb2JqZXQgZm91cm5pZXMuIEFwcGVsZXIgZGVwdWlzIGBhZGRUYWdUb0RvYygpYFxyXG4gKiBAcGFyYW0ge09iamVjdH0gY3JlZGVudGlhbHMgLSBVbiBvYmpldCBjb250ZW5hbnQgbGVzIGluZm9ybWF0aW9ucyBkJ2lkZW50aWZpY2F0aW9uIHJlcXVpc2VzIHBvdXIgYXV0aGVudGlmaWVyXHJcbiAqIGxhIGRlbWFuZGUuIElsIGluY2x1dCBnw6luw6lyYWxlbWVudCBkZXMgcHJvcHJpw6l0w6lzIHRlbGxlcyBxdWUgwqsgdG9rZW4gwrssIMKrIHNwYWNlIMK7LCDCqyB0ZW5hbnQgwrsgZXQgwqsgY3R4IMK7LlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMuc3BhY2UgLSBMJ1VSTCBkdSBzZXJ2ZXVyIHN1ciBsZXF1ZWwgbCdBUEkgZXN0IGTDqXBsb3nDqWUuKGV4OiAzRFNwYWNlID0+KGh0dHBzOi8vcjExMzIxMDA5Njg0NDctZXUxLXNwYWNlLjNkZXhwZXJpZW5jZS4zZHMuY29tL2Vub3ZpYSksIDNEU3d5bSwgM0RDb21wYXNzLi4uKVxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMudGVuYW50IC0gTCdpZGVudGlmaWFudCBkdSB0ZW5hbnQgc3VyIGxlcXVlbCBsJ0FQSSBlc3QgZMOpcGxvecOpZS4oZXg6IFIxMTMyMTAwOTY4NDQ3KVxyXG4gKiBAcGFyYW0ge09iamVjdH0gY3JlZGVudGlhbHMuY3VycmVudFVzZXIudXNlcm5hbWUgLSBMZSBwYXJhbcOodHJlIGBjdXJyZW50VXNlcmAgZXN0IHVuIHF1aSBjb250aWVudCBsZXMgaW5mb3JtYXRpb25zIGRlIGwndXRpbGlzYXRldXIgcXVpIGVudm9pZSBsZSBtZXNzYWdlKGFwcGVsZXIgZGVwdWlzIGxhIGZvbmN0aW9uIGBfM0RTd3ltX2dldF9jdXJyZW50dXNlcmApLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gY3JlZGVudGlhbHMuY3R4ICAtIEwnSUQgZHUgY29udGV4dGUgZGUgdHJhdmFpbC5cclxuICogQHBhcmFtIG9iaiAtIExlIHBhcmFtw6h0cmUgYG9iamAgZXN0IHVuIG9iamV0IHF1aSBjb250aWVudCBkZXMgaW5mb3JtYXRpb25zIHN1ciBsZSBkb2N1bWVudC4gSWxcclxuICogcG9zc8OoZGUgbGVzIHByb3ByacOpdMOpcyBzdWl2YW50ZXMgOlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gb2JqLmluZm8ubmFtZSAtIExlIG5vbSBkdSBkb2N1bWVudC5cclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRG9uZV0gLSBMZSBwYXJhbcOodHJlIGBvbkRvbmVgIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIGxvcnNxdWVcclxuICogbCdvcMOpcmF0aW9uIGRlIG1hcnF1YWdlIHNlcmEgdGVybWluw6llIGF2ZWMgc3VjY8Oocy4gTGEgcsOpcG9uc2UgZHUgc2VydmV1ciBsdWkgc2VyYSB0cmFuc21pc2UgZW5cclxuICogYXJndW1lbnQuXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkVycm9yXSAtIExlIHBhcmFtw6h0cmUgYG9uRXJyb3JgIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIHMnaWwgeSBhIHVuZVxyXG4gKiBlcnJldXIgbG9ycyBkZSBsJ2V4w6ljdXRpb24gZGUgbGEgZm9uY3Rpb24gYGFkZFRhZ1RvRG9jYC4gSWwgdm91cyBwZXJtZXQgZGUgZ8OpcmVyIGV0IGRlIHRyYWl0ZXJcclxuICogbCdlcnJldXIgZGUgbWFuacOocmUgcGVyc29ubmFsaXPDqWUuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWN0dWFsVGFnc09uRG9jKFxyXG4gIGNyZWRlbnRpYWxzLFxyXG4gIG9iaixcclxuICBvbkRvbmUgPSB1bmRlZmluZWQsXHJcbiAgb25FcnJvciA9IHVuZGVmaW5lZCxcclxuKSB7XHJcbiAgLy8gY29uc3Qgbm9tRmljaGllciA9IFwiYmVhbV9jdWJlX1RFU1RfQkREXCI7XHJcbiAgY29uc29sZS5sb2coXCJvYmogXCIsIG9iaik7XHJcbiAgY29uc3Qgbm9tRmljaGllciA9IG9iai5pbmZvLm5hbWU7XHJcbiAgY29uc3QgVVJMID0ge1xyXG4gICAgYmFzZVVybDogYGh0dHBzOi8vJHtjcmVkZW50aWFscy50ZW5hbnQudG9Mb3dlckNhc2UoKX0tZXUxLWZlZHNlYXJjaC4zZGV4cGVyaWVuY2UuM2RzLmNvbWAsXHJcbiAgICB1cmk6IFwiL2ZlZGVyYXRlZC9zZWFyY2hcIixcclxuICB9O1xyXG4gIGNvbnN0IHVybCA9IGAke1VSTC5iYXNlVXJsfSR7VVJMLnVyaX1gO1xyXG4gIGNvbnN0IGhlYWRlcnMgPSB7XHJcbiAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgIEFjY2VwdDogXCJhcHBsaWNhdGlvbi9qc29uLHRleHQvamF2YXNjcmlwdCwqLypcIixcclxuICB9O1xyXG4gIGNvbnN0IHV1aWQgPSBVVUlEKCk7XHJcbiAgY29uc3QgZGF0YVBhdHRlcm4gPSB7XHJcbiAgICB3aXRoX2luZGV4aW5nX2RhdGU6IHRydWUsXHJcbiAgICB3aXRoX3N5bnRoZXNpczogdHJ1ZSxcclxuICAgIHdpdGhfbmxzOiBmYWxzZSxcclxuICAgIGxhYmVsOiBgM0RTZWFyY2gtJHtjcmVkZW50aWFscy5jdXJyZW50VXNlci51c2VybmFtZX0tQWpvdXREZVRhZ0JlYW0tJHt1dWlkfWAsXHJcbiAgICBsb2NhbGU6IFwiZnJcIixcclxuICAgIHNlbGVjdF9wcmVkaWNhdGU6IFtcclxuICAgICAgXCJkczZ3OmxhYmVsXCIsXHJcbiAgICAgIFwiZHM2dzp0eXBlXCIsXHJcbiAgICAgIFwiZHM2dzpkZXNjcmlwdGlvblwiLFxyXG4gICAgICBcImRzNnc6aWRlbnRpZmllclwiLFxyXG4gICAgICBcImRzNnc6bW9kaWZpZWRcIixcclxuICAgICAgXCJkczZ3OmNyZWF0ZWRcIixcclxuICAgICAgXCJkczZ3ZzpyZXZpc2lvblwiLFxyXG4gICAgICBcImRzNnc6c3RhdHVzXCIsXHJcbiAgICAgIFwiZHM2dzpyZXNwb25zaWJsZVwiLFxyXG4gICAgICBcIm93bmVyXCIsXHJcbiAgICAgIFwiZHM2dzpyZXNwb25zaWJsZVVpZFwiLFxyXG4gICAgICBcImRzNndnOmZpbGVzaXplXCIsXHJcbiAgICAgIFwiZHM2dzpwcm9qZWN0XCIsXHJcbiAgICAgIFwiZHM2dzpkYXRhU291cmNlXCIsXHJcbiAgICAgIFwiZHM2dzpjb21tdW5pdHlcIixcclxuICAgICAgXCJkczZ3Om9yaWdpbmF0b3JcIixcclxuICAgICAgXCJkc2dlbzpyZWZlcmVudGlhbFwiLFxyXG4gICAgICBcImRzNnc6bGFzdE1vZGlmaWVkQnlcIixcclxuICAgICAgXCJkczZ3OnJlcG9zaXRvcnlcIixcclxuICAgICAgXCJkY3Rlcm1zOnRpdGxlXCIsXHJcbiAgICAgIFwiZGN0ZXJtczpkZXNjcmlwdGlvblwiLFxyXG4gICAgICBcImRzNnc6Y29udGFpbmVyVWlkXCIsXHJcbiAgICBdLFxyXG4gICAgd2l0aF9zeW50aGVzaXNfaGllcmFyY2hpY2FsOiB0cnVlLFxyXG4gICAgc2VsZWN0X2ZpbGU6IFtcImljb25cIiwgXCJ0aHVtYm5haWxfMmRcIl0sXHJcbiAgICBxdWVyeTogbm9tRmljaGllcixcclxuICAgIHNwZWNpZmljX3NvdXJjZV9wYXJhbWV0ZXI6IHtcclxuICAgICAgXCIzZHNwYWNlXCI6IHtcclxuICAgICAgICBhZGRpdGlvbmFsX3F1ZXJ5OlxyXG4gICAgICAgICAgJyBBTkQgTk9UIChvd25lcjpcIkVOT1ZJQV9DTE9VRFwiIE9SIG93bmVyOlwiU2VydmljZSBDcmVhdG9yXCIgT1Igb3duZXI6XCJDb3Jwb3JhdGVcIiBPUiBvd25lcjpcIlVzZXIgQWdlbnRcIiBPUiBvd25lcjpcIlNMTUluc3RhbGxlckFkbWluXCIgT1Igb3duZXI6XCJDcmVhdG9yXCIgT1Igb3duZXI6XCJWUExNQWRtaW5Vc2VyXCIpIEFORCAoZHM2d181OF9pc2xhc3RyZXZpc2lvbnBlcnN0YXRlOnRydWUgT1IgTk9UIGxpc3RvZmZpZWxkczpkczZ3XzU4X2lzbGFzdHJldmlzaW9ucGVyc3RhdGUpJyxcclxuICAgICAgfSxcclxuICAgICAgZHJpdmU6IHtcclxuICAgICAgICBhZGRpdGlvbmFsX3F1ZXJ5OlxyXG4gICAgICAgICAgJyBBTkQgTk9UIChbZmxhdHRlbmVkdGF4b25vbWllc106XCJ0eXBlcy9Ecml2ZU5vZGVcIiBBTkQgKCBbY3VycmVudF06XCJUcmFzaGVkXCIgT1IgW3BvbGljeV06XCJEcml2ZSBGaWxlIEl0ZXJhdGlvblwiKSApJyxcclxuICAgICAgfSxcclxuICAgIH0sXHJcbiAgICBzZWxlY3RfZXhjbHVkZV9zeW50aGVzaXM6IFtcImRzNnc6d2hhdC9kczZ3OnRvcGljXCJdLFxyXG4gICAgb3JkZXJfYnk6IG9ialRvVGFnLm9yZGVyX2J5LFxyXG4gICAgb3JkZXJfZmllbGQ6IFwicmVsZXZhbmNlXCIsXHJcbiAgICBzZWxlY3Rfc25pcHBldHM6IFtcclxuICAgICAgXCJkczZ3OnNuaXBwZXRcIixcclxuICAgICAgXCJkczZ3OmxhYmVsOnNuaXBwZXRcIixcclxuICAgICAgXCJkczZ3OnJlc3BvbnNpYmxlOnNuaXBwZXRcIixcclxuICAgICAgXCJkczZ3OmNvbW11bml0eTpzbmlwcGV0XCIsXHJcbiAgICAgIFwic3d5bTptZXNzYWdlX3RleHQ6c25pcHBldFwiLFxyXG4gICAgXSxcclxuICAgIG5yZXN1bHRzOiA0MCxcclxuICAgIHN0YXJ0OiBcIjBcIixcclxuICAgIHNvdXJjZTogc291cmNlc1NlYXJjaGluZyxcclxuICAgIHRlbmFudDogY3JlZGVudGlhbHMudGVuYW50LFxyXG4gICAgbG9naW46IHtcclxuICAgICAgXCIzZHNwYWNlXCI6IHtcclxuICAgICAgICBTZWN1cml0eUNvbnRleHQ6IGNyZWRlbnRpYWxzLmN0eCxcclxuICAgICAgfSxcclxuICAgIH0sXHJcbiAgfTtcclxuICBjb25zb2xlLmxvZyhcImRhdGFQYXR0ZXJuID0+IFwiLCBkYXRhUGF0dGVybik7XHJcbiAgX2h0dHBDYWxsQXV0aGVudGljYXRlZCh1cmwsIHtcclxuICAgIG1ldGhvZDogXCJQT1NUXCIsXHJcbiAgICBoZWFkZXJzOiBoZWFkZXJzLFxyXG4gICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoZGF0YVBhdHRlcm4pLFxyXG4gICAgb25Db21wbGV0ZShyZXNwb25zZSkge1xyXG4gICAgICBjb25zdCBpbmZvID0gSlNPTi5wYXJzZShyZXNwb25zZSk7XHJcbiAgICAgIG9uRG9uZShpbmZvKTtcclxuICAgIH0sXHJcbiAgICBvbkZhaWx1cmUoZXJyLCBoZWFkZXJzKSB7XHJcbiAgICAgIGNvbnN0IGluZm8gPSBlcnI7XHJcbiAgICAgIGluZm9bXCJtc2dcIl0gPSBoZWFkZXJzLmVycm9ybXNnO1xyXG4gICAgICBpbmZvW1wiZXJyQ29kZVwiXSA9IGhlYWRlcnMuZXJyb3Jjb2RlO1xyXG4gICAgICBjb25zb2xlLmxvZyhcIuKdjCBzZW5kRGlyZWN0TWVzc2FnZSA9PiBcIiwgaW5mbyk7XHJcbiAgICAgIGlmIChvbkVycm9yKSBvbkVycm9yKGluZm8pO1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkVycmV1ciBkZSByZWN1cGVyYXRpb24gZCdpZCBkdSBkb2MgZXQgZGVzIHRhZ3NcIiwgZXJyKTtcclxuICAgIH0sXHJcbiAgfSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gTGEgZm9uY3Rpb24gYHJlbW92ZVRhZ1RvRG9jYCBlc3QgdXRpbGlzw6llIHBvdXIgc3VwcHJpbWVyIHVuZSBiYWxpc2Ugc3DDqWNpZmlxdWUgZCd1biBkb2N1bWVudCBlblxyXG4gKiB1dGlsaXNhbnQgbGVzIGluZm9ybWF0aW9ucyBkJ2lkZW50aWZpY2F0aW9uIGV0IGxlcyBpbmZvcm1hdGlvbnMgc3VyIGwnb2JqZXQgZm91cm5pZXMuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBjcmVkZW50aWFscyAtIFVuIG9iamV0IGNvbnRlbmFudCBsZXMgaW5mb3JtYXRpb25zIGQnaWRlbnRpZmljYXRpb24gcmVxdWlzZXMgcG91ciBhdXRoZW50aWZpZXJcclxuICogbGEgZGVtYW5kZS4gSWwgaW5jbHV0IGfDqW7DqXJhbGVtZW50IGRlcyBwcm9wcmnDqXTDqXMgdGVsbGVzIHF1ZSDCqyB0b2tlbiDCuywgwqsgc3BhY2UgwrssIMKrIHRlbmFudCDCuyBldCDCqyBjdHggwrsuXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjcmVkZW50aWFscy5zcGFjZSAtIEwnVVJMIGR1IHNlcnZldXIgc3VyIGxlcXVlbCBsJ0FQSSBlc3QgZMOpcGxvecOpZS4oZXg6IDNEU3BhY2UgPT4oaHR0cHM6Ly9yMTEzMjEwMDk2ODQ0Ny1ldTEtc3BhY2UuM2RleHBlcmllbmNlLjNkcy5jb20vZW5vdmlhKSwgM0RTd3ltLCAzRENvbXBhc3MuLi4pXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjcmVkZW50aWFscy50ZW5hbnQgLSBMJ2lkZW50aWZpYW50IGR1IHRlbmFudCBzdXIgbGVxdWVsIGwnQVBJIGVzdCBkw6lwbG95w6llLihleDogUjExMzIxMDA5Njg0NDcpXHJcbiAqXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogLSBMZSBwYXJhbcOodHJlIGBvYmpgIGVzdCB1biBvYmpldCBxdWkgY29udGllbnQgbGVzIHByb3ByacOpdMOpcyBzdWl2YW50ZXPCoDpcclxuICogQHBhcmFtIHtTdHJpbmd9IG9iai5vYmpJZCAtIEwnaWRlbnRpZmlhbnQgdW5pcXVlIGRlIGwnb2JqZXQgcG91ciBsZXF1ZWwgdm91cyBzb3VoYWl0ZXogc3VwcHJpbWVyIGxhIGJhbGlzZS5cclxuICogQHBhcmFtIHtTdHJpbmd9IG9iai5wcmVkIC0gTCdpZGVudGlmaWFudCBkZSBsYSByZWxhdGlvbiBlbnRyZSBsJ29iamV0IGV0IGxhIGJhbGlzZS4gKGV4OiBob3csIHdoYXQsIHdoZW4sIHdoZXJlLCB3aG8sIHdoeSkuXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBvYmoudGFnIC0gTGUgbm9tIGR1IHRhZyDDoCBzdXBwcmltZXIuXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkRvbmVdIC0gTGUgcGFyYW3DqHRyZSBgb25Eb25lYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBsb3JzcXVlIGxhXHJcbiAqIHN1cHByZXNzaW9uIGRlIGxhIGJhbGlzZSBkdSBkb2N1bWVudCBzZXJhIHRlcm1pbsOpZSBhdmVjIHN1Y2PDqHMuIElsIGZhdXQgdW4gYXJndW1lbnQsIHF1aSBlc3QgbGFcclxuICogcsOpcG9uc2UgZHUgc2VydmV1ci5cclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRXJyb3JdIC0gTGUgcGFyYW3DqHRyZSBgb25FcnJvcmAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgcydpbCB5IGEgdW5lXHJcbiAqIGVycmV1ciBsb3JzIGRlIGwnZXjDqWN1dGlvbiBkZSBsYSBmb25jdGlvbiBgcmVtb3ZlVGFnVG9Eb2NgLiBJbCB2b3VzIHBlcm1ldCBkZSBnw6lyZXIgZXQgZGUgdHJhaXRlclxyXG4gKiBsJ2VycmV1ciBkZSBtYW5pw6hyZSBwZXJzb25uYWxpc8OpZS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVUYWdUb0RvYyhcclxuICBjcmVkZW50aWFscyxcclxuICBvYmosXHJcbiAgb25Eb25lID0gdW5kZWZpbmVkLFxyXG4gIG9uRXJyb3IgPSB1bmRlZmluZWQsXHJcbikge1xyXG4gIGNvbnN0IHsgb2JqSWQsIHByZWQsIHRhZyB9ID0gb2JqO1xyXG5cclxuICBjb25zdCBVUkwgPSB7XHJcbiAgICB1cmk6IFwiL3Jlc291cmNlcy82dy90YWdzXCIsXHJcbiAgICBvdHBDVFg6IFwiU2VjdXJpdHlDb250ZXh0PXByZWZlcnJlZFwiLFxyXG4gICAgb3B0VGVuYW50OiBgdGVuYW50PSR7Y3JlZGVudGlhbHMudGVuYW50fWAsXHJcbiAgfTtcclxuICBjb25zdCB1cmwgPSBgJHtjcmVkZW50aWFscy5zcGFjZX0ke1VSTC51cml9PyR7VVJMLm90cENUWH0mJHtVUkwub3B0VGVuYW50fWA7XHJcbiAgY29uc3QgZGF0YVRlc3QgPSB7XHJcbiAgICB0YWc6IFtcclxuICAgICAge1xyXG4gICAgICAgIHN1YmplY3Q6IFtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgdXJpOiBgcGlkOi8vJHtvYmpJZH1gLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIHByZWRpY2F0ZTogbGlzdFByZWRpY2F0ZXNbcHJlZF0sXHJcbiAgICAgICAgb2JqZWN0OiB7XHJcbiAgICAgICAgICBsaXRlcmFsOiB0YWcsXHJcbiAgICAgICAgfSxcclxuICAgICAgfSxcclxuICAgIF0sXHJcbiAgfTtcclxuICBfaHR0cENhbGxBdXRoZW50aWNhdGVkKHVybCwge1xyXG4gICAgbWV0aG9kOiBcIkRFTEVURVwiLFxyXG4gICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoZGF0YVRlc3QpLFxyXG4gICAgaGVhZGVyczoge1xyXG4gICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgQWNjZXB0OiBcImFwcGxpY2F0aW9uL2pzb24sdGV4dC9qYXZhc2NyaXB0LCovKlwiLFxyXG4gICAgfSxcclxuICAgIG9uQ29tcGxldGUocmVzcG9uc2UpIHtcclxuICAgICAgaWYgKG9uRG9uZSkgb25Eb25lKHJlc3BvbnNlKTtcclxuICAgIH0sXHJcbiAgICBvbkZhaWx1cmUoZXJyLCBoZWFkZXJzKSB7XHJcbiAgICAgIGNvbnN0IGluZm8gPSBlcnI7XHJcbiAgICAgIGluZm9bXCJtc2dcIl0gPSBoZWFkZXJzLmVycm9ybXNnO1xyXG4gICAgICBpbmZvW1wiZXJyQ29kZVwiXSA9IGhlYWRlcnMuZXJyb3Jjb2RlO1xyXG4gICAgICBjb25zb2xlLmxvZyhcIuKdjCBzZW5kRGlyZWN0TWVzc2FnZSA9PiBcIiwgaW5mbyk7XHJcbiAgICAgIGlmIChvbkVycm9yKSBvbkVycm9yKGluZm8pO1xyXG4gICAgfSxcclxuICB9KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBMYSBmb25jdGlvbiDCqyBnZXRJbmZvRG9jVGFncyDCuyBlZmZlY3R1ZSB1biBhcHBlbCBIVFRQIHBvdXIgcsOpY3Vww6lyZXIgZGVzIGluZm9ybWF0aW9ucyBzdXIgbGVzXHJcbiAqIGRvY3VtZW50cyBlbiBmb25jdGlvbiBkZXMgaW5mb3JtYXRpb25zIGQnaWRlbnRpZmljYXRpb24gZXQgZGVzIGlkZW50aWZpYW50cyBkZSBkb2N1bWVudCBmb3VybmlzLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gY3JlZGVudGlhbHMgLSBVbiBvYmpldCBjb250ZW5hbnQgbGVzIGluZm9ybWF0aW9ucyBkJ2lkZW50aWZpY2F0aW9uIHJlcXVpc2VzIHBvdXIgYXV0aGVudGlmaWVyXHJcbiAqIGxhIGRlbWFuZGUuIElsIGluY2x1dCBnw6luw6lyYWxlbWVudCBkZXMgcHJvcHJpw6l0w6lzIHRlbGxlcyBxdWUgwqsgdG9rZW4gwrssIMKrIHNwYWNlIMK7LCDCqyB0ZW5hbnQgwrsgZXQgwqsgY3R4IMK7LlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMuc3BhY2UgLSBMJ1VSTCBkdSBzZXJ2ZXVyIHN1ciBsZXF1ZWwgbCdBUEkgZXN0IGTDqXBsb3nDqWUuKGV4OiAzRFNwYWNlID0+KGh0dHBzOi8vcjExMzIxMDA5Njg0NDctZXUxLXNwYWNlLjNkZXhwZXJpZW5jZS4zZHMuY29tL2Vub3ZpYSksIDNEU3d5bSwgM0RDb21wYXNzLi4uKVxyXG4gKiBAcGFyYW0ge1N0cmluZ30gW3N0cl0gLSBMZSBwYXJhbcOodHJlIGBzdHJgIGVzdCB1bmUgY2hhw65uZSBxdWkgcmVwcsOpc2VudGUgbCdJRCBkdSBkb2N1bWVudHMgcG91ciBsZXNxdWVsc1xyXG4gKiB2b3VzIHNvdWhhaXRleiByw6ljdXDDqXJlciBkZXMgaW5mb3JtYXRpb25zLlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25Eb25lXSAtIExlIHBhcmFtw6h0cmUgYG9uRG9uZWAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgbG9yc3F1ZSBsYVxyXG4gKiByZXF1w6p0ZSBIVFRQIHNlcmEgdGVybWluw6llIGF2ZWMgc3VjY8Oocy4gSWwgcHJlbmQgdW4gYXJndW1lbnQsIHF1aSBjb3JyZXNwb25kIGF1eCBkb25uw6llcyBkZSByw6lwb25zZVxyXG4gKiBkZSBsYSByZXF1w6p0ZS5cclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRXJyb3JdIC0gTGUgcGFyYW3DqHRyZSBgb25FcnJvcmAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgcydpbCB5IGEgdW5lXHJcbiAqIGVycmV1ciBsb3JzIGRlIGwnZXjDqWN1dGlvbiBkZSBsYSBmb25jdGlvbiBgZ2V0SW5mb0RvY1RhZ3NgLiBJbCB2b3VzIHBlcm1ldCBkZSBnw6lyZXIgZXQgZGUgdHJhaXRlclxyXG4gKiBsZXMgaW5mb3JtYXRpb25zIGQnZXJyZXVyLlxyXG4gKiBAcmV0dXJucyBMYSBmb25jdGlvbiBuZSByZW52b2llIGV4cGxpY2l0ZW1lbnQgcmllbi5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRJbmZvRG9jVGFncyhcclxuICBjcmVkZW50aWFscyxcclxuICBzdHIgPSBcIlwiLFxyXG4gIG9uRG9uZSA9IHVuZGVmaW5lZCxcclxuICBvbkVycm9yID0gdW5kZWZpbmVkLFxyXG4pIHtcclxuICBjb25zdCB7IHNwYWNlIH0gPSBjcmVkZW50aWFscztcclxuICBpZiAoc3RyID09PSBcIlwiKSByZXR1cm47XHJcblxyXG4gIGNvbnN0IFVSTCA9IHtcclxuICAgIHVyaTogXCIvZW5vdmlhL3Jlc291cmNlcy92MS9tb2RlbGVyL2RvY3VtZW50c1wiLFxyXG4gIH07XHJcblxyXG4gIGNvbnN0IGhlYWRlcnMgPSB7XHJcbiAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOFwiLFxyXG4gICAgQWNjZXB0OiBcImFwcGxpY2F0aW9uL2pzb24sdGV4dC9qYXZhc2NyaXB0LCovKlwiLFxyXG4gIH07XHJcbiAgY29uc3QgdXJsID0gYCR7c3BhY2V9JHtVUkwudXJpfWA7XHJcblxyXG4gIGNvbnN0IGRhdGFUZXN0ID0gYCRpbmNsdWRlPW5vbmUsbG9ja2VySW5mbyxvd25lckluZm8sb3JpZ2luYXRvckluZm8sZmlsZXMsb3duZXJJbmZvLG9yaWdpbmF0b3JJbmZvJiRmaWVsZHM9bm9uZSx0aXRsZSxuYW1lLHR5cGVOTFMsY29sbGFiU3BhY2VUaXRsZSxyZXZpc2lvbixpc0xhdGVzdFJldmlzaW9uLGZpbGVzLGxvY2tTdGF0dXMsbG9ja2VySW5mby5uYW1lLGxvY2tlckluZm8uZmlyc3RuYW1lLGxvY2tlckluZm8ubGFzdG5hbWUsb3duZXIsb3duZXJJbmZvLm5hbWUsb3duZXJJbmZvLmZpcnN0bmFtZSxvd25lckluZm8ubGFzdG5hbWUsc3RhdGVOTFMsbW9kaWZpZWQscG9saWN5LHN0YXRlLG9yZ2FuaXphdGlvblRpdGxlLG9yaWdpbmF0b3Isb3JpZ2luYXRvckluZm8ubmFtZSxvcmlnaW5hdG9ySW5mby5maXJzdG5hbWUsb3JpZ2luYXRvckluZm8ubGFzdG5hbWUsaGFzTW9kaWZ5QWNjZXNzLGZpbGVFeHRlbnNpb24sZmlsZXMubmFtZSxmaWxlcy50aXRsZSxmaWxlcy5yZXZpc2lvbixmaWxlcy5sb2NrZXIsb3duZXJJbmZvLG93bmVySW5mby5uYW1lLG93bmVySW5mby5maXJzdG5hbWUsb3duZXJJbmZvLmxhc3RuYW1lLG9yaWdpbmF0b3JJbmZvLG9yaWdpbmF0b3JJbmZvLm5hbWUsb3JpZ2luYXRvckluZm8uZmlyc3RuYW1lLG9yaWdpbmF0b3JJbmZvLmxhc3RuYW1lJiRpZHM9JHtzdHJ9YDtcclxuXHJcbiAgX2h0dHBDYWxsQXV0aGVudGljYXRlZCh1cmwsIHtcclxuICAgIG1ldGhvZDogXCJQT1NUXCIsXHJcbiAgICBoZWFkZXJzOiBoZWFkZXJzLFxyXG4gICAgZGF0YTogZGF0YVRlc3QsXHJcbiAgICBvbkNvbXBsZXRlKHJlc3BvbnNlKSB7XHJcbiAgICAgIGlmIChvbkRvbmUpIG9uRG9uZShKU09OLnBhcnNlKHJlc3BvbnNlKSk7XHJcbiAgICB9LFxyXG4gICAgb25GYWlsdXJlKGVyciwgaGVhZGVyKSB7XHJcbiAgICAgIGNvbnN0IGluZm8gPSBlcnI7XHJcbiAgICAgIGluZm9bXCJtc2dcIl0gPSBoZWFkZXIuZXJyb3I7XHJcbiAgICAgIGlmIChvbkVycm9yKSBvbkVycm9yKGluZm8pO1xyXG4gICAgfSxcclxuICB9KTtcclxufVxyXG4iLCJpbXBvcnQgeyBfaHR0cENhbGxBdXRoZW50aWNhdGVkIH0gZnJvbSBcIi4uL21haW4vM2RleHBlcmllbmNlX2FwaVwiO1xyXG5cclxuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBMYSBmb25jdGlvbiBgXzNEU3d5bV9nZXRfdmVyc2lvbmAgcsOpY3Vww6hyZSBsZSB0b2tlbiBkdSAzRFN3eW0gZXQgZWZmZWN0dWUgZGVzIGFjdGlvbnMgc3VwcGzDqW1lbnRhaXJlcyBzaSBuw6ljZXNzYWlyZS4gT2JsaWdhdG9pcmUgcG91ciBjaGFxdWUgYXBwZWwgZCdBUEkgZHUgU3d5bS5cclxuICogQHBhcmFtIHtPYmplY3R9IGNyZWRlbnRpYWxzIC0gVW4gb2JqZXQgY29udGVuYW50IGxlcyBpbmZvcm1hdGlvbnMgZCdpZGVudGlmaWNhdGlvbiByZXF1aXNlcyBwb3VyIGF1dGhlbnRpZmllclxyXG4gKiBsYSBkZW1hbmRlLiBJbCBpbmNsdXQgZ8OpbsOpcmFsZW1lbnQgZGVzIHByb3ByacOpdMOpcyB0ZWxsZXMgcXVlIMKrIHRva2VuIMK7LCDCqyBzcGFjZSDCuywgwqsgdGVuYW50IMK7IGV0IMKrIGN0eCDCuy5cclxuICogQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLnNwYWNlIC0gKDNEU3d5bSkgTCdVUkwgZHUgc2VydmV1ciBzdXIgbGVxdWVsIGwnQVBJIGVzdCBkw6lwbG95w6llLihleDogM0RTcGFjZSA9PihodHRwczovL3IxMTMyMTAwOTY4NDQ3LWV1MS1zcGFjZS4zZGV4cGVyaWVuY2UuM2RzLmNvbS9lbm92aWEpLCAzRFN3eW0sIDNEQ29tcGFzcy4uLilcclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRG9uZV0gLSBMZSBwYXJhbcOodHJlIGBvbkRvbmVgIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIGxvcnNxdWUgbGVzXHJcbiAqIGluZm9ybWF0aW9ucyBkZSB2ZXJzaW9uIHNlcm9udCByw6ljdXDDqXLDqWVzIGF2ZWMgc3VjY8Oocy4gSWwgcHJlbmQgdW4gYXJndW1lbnQsIGB0b2tlbkluZm9gLCBxdWkgZXN0IGxhXHJcbiAqIHLDqXBvbnNlIGNvbnRlbmFudCBsZXMgaW5mb3JtYXRpb25zIGRlIHZlcnNpb24uIExlIHRva2VuIGVzdCBhdXNzaSBlbnZvecOpIGRhbnMgdW5lIG5vdXZlbGxlIHByb3ByacOpdMOpIDogYGNyZWRlbnRpYWxzLnRva2VuYFxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25FcnJvcl0gLSBMZSBwYXJhbcOodHJlIGBvbkVycm9yYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBzJ2lsIHkgYSB1bmVcclxuICogZXJyZXVyIGxvcnMgZGUgbGEgcmVxdcOqdGUgSFRUUC4gSWwgZXN0IGZhY3VsdGF0aWYgZXQgcGV1dCDDqnRyZSBpbmTDqWZpbmkuXHJcbiAqL1xyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gXzNEU3d5bV9nZXRfdmVyc2lvbihcclxuICBjcmVkZW50aWFscyxcclxuICBvbkRvbmUgPSB1bmRlZmluZWQsXHJcbiAgb25FcnJvciA9IHVuZGVmaW5lZCxcclxuKSB7XHJcbiAgY29uc3QgdXJsID0gY3JlZGVudGlhbHMuc3BhY2UgKyBcIi9hcGkvaW5kZXgvdGtcIjtcclxuXHJcbiAgcmV0dXJuIF9odHRwQ2FsbEF1dGhlbnRpY2F0ZWQodXJsLCB7XHJcbiAgICBvbkNvbXBsZXRlKHJlc3BvbnNlLCBoZWFkZXJzLCB4aHIpIHtcclxuICAgICAgY29uc3QgdG9rZW5JbmZvID0gSlNPTi5wYXJzZShyZXNwb25zZSk7XHJcblxyXG4gICAgICBpZiAob25Eb25lKSB7XHJcbiAgICAgICAgb25Eb25lKHRva2VuSW5mbyk7XHJcbiAgICAgICAgcmV0dXJuIChjcmVkZW50aWFsc1tcInRva2VuXCJdID0gdG9rZW5JbmZvPy5yZXN1bHQ/LlNlcnZlclRva2VuKTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICBvbkZhaWx1cmUocmVzcG9uc2UpIHtcclxuICAgICAgaWYgKG9uRXJyb3IpIG9uRXJyb3IocmVzcG9uc2UpO1xyXG4gICAgfSxcclxuICB9KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIExhIGZvbmN0aW9uIGBfM0RTd3ltX2dldEFsbE5ld3NgIHLDqWN1cMOocmUgdG91dGVzIGxlcyBhY3R1YWxpdMOpcyBkJ3VuZSBwbGF0ZWZvcm1lIDNERXhwZXJpZW5jZSBlblxyXG4gKiB1dGlsaXNhbnQgbGVzIGluZm9ybWF0aW9ucyBkJ2lkZW50aWZpY2F0aW9uIGZvdXJuaWVzLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gY3JlZGVudGlhbHMgLSBVbiBvYmpldCBjb250ZW5hbnQgbGVzIGluZm9ybWF0aW9ucyBkJ2lkZW50aWZpY2F0aW9uIHJlcXVpc2VzIHBvdXIgYXV0aGVudGlmaWVyXHJcbiAqIGxhIGRlbWFuZGUuIElsIGluY2x1dCBnw6luw6lyYWxlbWVudCBkZXMgcHJvcHJpw6l0w6lzIHRlbGxlcyBxdWUgwqsgdG9rZW4gwrssIMKrIHNwYWNlIMK7LCDCqyB0ZW5hbnQgwrsgZXQgwqsgY3R4IMK7LlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMuc3BhY2UgLSAoM0RTd3ltKSBMJ1VSTCBkdSBzZXJ2ZXVyIHN1ciBsZXF1ZWwgbCdBUEkgZXN0IGTDqXBsb3nDqWUuKGV4OiAzRFNwYWNlID0+KGh0dHBzOi8vcjExMzIxMDA5Njg0NDctZXUxLXNwYWNlLjNkZXhwZXJpZW5jZS4zZHMuY29tL2Vub3ZpYSksIDNEU3d5bSwgM0RDb21wYXNzLi4uKVxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25Eb25lXSAtIExlIHBhcmFtw6h0cmUgYG9uRG9uZWAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgbG9yc3F1ZSBsYVxyXG4gKiByZXF1w6p0ZSBzZXJhIHRlcm1pbsOpZSBhdmVjIHN1Y2PDqHMuIElsIHByZW5kIGRldXggYXJndW1lbnRzIDogwqsgcsOpcG9uc2UgwrsgZXQgwqsgZW4tdMOqdGVzIMK7LiBMJ2FyZ3VtZW50XHJcbiAqIGByZXNwb25zZWAgY29udGllbnQgbGVzIGRvbm7DqWVzIGRlIHLDqXBvbnNlIGR1IHNlcnZldXIgZXQgbCdhcmd1bWVudCBgaGVhZGVyc2AgY29udGllbnQgbGVzIGVuLXTDqnRlc1xyXG4gKiBkZSByw6lwb25zZS5cclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRXJyb3JdIC0gTGUgcGFyYW3DqHRyZSBgb25FcnJvcmAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgcydpbCB5IGEgdW5lXHJcbiAqIGVycmV1ciBsb3JzIGRlIGwnZXjDqWN1dGlvbiBkZSBsYSBmb25jdGlvbiBgXzNEU3d5bV9nZXRBbGxOZXdzYC4gSWwgcHJlbmQgZGV1eCBwYXJhbcOodHJlcyA6IMKrIHLDqXBvbnNlXHJcbiAqIMK7IGV0IMKrIGVuLXTDqnRlcyDCuy4gTGUgcGFyYW3DqHRyZSBgcmVzcG9uc2VgIGNvbnRpZW50IGxlcyBkb25uw6llcyBkZSByw6lwb25zZSDDoCBsJ2VycmV1ciBldCBsZVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF8zRFN3eW1fZ2V0QWxsTmV3cyhcclxuICBjcmVkZW50aWFscyxcclxuICBvbkRvbmUgPSB1bmRlZmluZWQsXHJcbiAgb25FcnJvciA9IHVuZGVmaW5lZCxcclxuKSB7XHJcbiAgLy8gISBBdHRlbnRpb24gYmVhdWNvdXAgZCdpbmZvcyDDoCB0cmllciBldCBjaGVja2VyXHJcbiAgLy8gdm9pciBhdXNzaSBsZXMgcG9zc2liaWxpdMOpcyBkZXMgcGFyYW1zXHJcblxyXG4gIGNvbnN0IHVybCA9IGAke2NyZWRlbnRpYWxzLnNwYWNlfS9hcGkvZXhhbGVhZC93aGF0c25ld2A7XHJcbiAgY29uc3QgZGF0YSA9IHtcclxuICAgIHBhcmFtczoge1xyXG4gICAgICBjb21tdW5pdHlfaWQ6IG51bGwsXHJcbiAgICAgIGhhc2hfa2V5OiBudWxsLFxyXG4gICAgICBsZWdhY3lGb3JtYXQ6IGZhbHNlLFxyXG4gICAgICBucmVzdWx0czogMSxcclxuICAgICAgcXVlcnk6IFwiI2FsbFwiLFxyXG4gICAgICBzdGFydDogMCxcclxuICAgIH0sXHJcbiAgfTtcclxuICBfM0RTd3ltX2dldF92ZXJzaW9uKGNyZWRlbnRpYWxzLCAodG9rZW4pID0+IHtcclxuICAgIF9odHRwQ2FsbEF1dGhlbnRpY2F0ZWQodXJsLCB7XHJcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXHJcbiAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICBcIlgtRFMtU1dZTS1DU1JGVE9LRU5cIjogdG9rZW4ucmVzdWx0LlNlcnZlclRva2VuLFxyXG4gICAgICAgIFwiQ29udGVudC10eXBlXCI6IFwiYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04XCIsXHJcbiAgICAgICAgQWNjZXB0OiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgfSxcclxuICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoZGF0YSksXHJcbiAgICAgIHR5cGU6IFwianNvblwiLFxyXG4gICAgICBvbkNvbXBsZXRlKHJlc3BvbnNlLCBoZWFkZXJzKSB7XHJcbiAgICAgICAgaWYgKG9uRG9uZSkgb25Eb25lKHJlc3BvbnNlLCBoZWFkZXJzKTtcclxuICAgICAgfSxcclxuICAgICAgb25GYWlsdXJlKHJlc3BvbnNlLCBoZWFkZXJzKSB7XHJcbiAgICAgICAgaWYgKG9uRXJyb3IpIG9uRXJyb3IocmVzcG9uc2UsIGhlYWRlcnMpO1xyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBMYSBmb25jdGlvbiBgXzNEU3d5bV9nZXRGYW1pbGlhclBlb3BsZWAgcsOpY3Vww6hyZSB1bmUgbGlzdGUgZGUgcGVyc29ubmVzIGZhbWlsacOocmVzIGVuIGZvbmN0aW9uIGR1XHJcbiAqIHByb2ZpbCBkZSBsJ3V0aWxpc2F0ZXVyIGFjdHVlbC5cclxuICogQHBhcmFtIHtPYmplY3R9IGNyZWRlbnRpYWxzIC0gVW4gb2JqZXQgY29udGVuYW50IGxlcyBpbmZvcm1hdGlvbnMgZCdpZGVudGlmaWNhdGlvbiByZXF1aXNlcyBwb3VyIGF1dGhlbnRpZmllclxyXG4gKiBsYSBkZW1hbmRlLiBJbCBpbmNsdXQgZ8OpbsOpcmFsZW1lbnQgZGVzIHByb3ByacOpdMOpcyB0ZWxsZXMgcXVlIMKrIHRva2VuIMK7LCDCqyBzcGFjZSDCuywgwqsgdGVuYW50IMK7IGV0IMKrIGN0eCDCuy5cclxuICogQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLnNwYWNlIC0gKDNEU3d5bSkgTCdVUkwgZHUgc2VydmV1ciBzdXIgbGVxdWVsIGwnQVBJIGVzdCBkw6lwbG95w6llLihleDogM0RTcGFjZSA9PihodHRwczovL3IxMTMyMTAwOTY4NDQ3LWV1MS1zcGFjZS4zZGV4cGVyaWVuY2UuM2RzLmNvbS9lbm92aWEpLCAzRFN3eW0sIDNEQ29tcGFzcy4uLilcclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRG9uZV0gLSBMZSBwYXJhbcOodHJlIGBvbkRvbmVgIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIGxvcnNxdWUgbCdhcHBlbFxyXG4gKiBkJ0FQSSByw6l1c3NpdCBldCBxdWUgbGVzIGRvbm7DqWVzIHNvbnQgcsOpY3Vww6lyw6llcy4gSWwgZmF1dCBkZXV4IGFyZ3VtZW50cyA6IGBteUNvbnRhY3RzYCBldFxyXG4gKiBgcmVzcG9uc2VgLiBgbXlDb250YWN0c2AgZXN0IHVuIHRhYmxlYXUgZCdvYmpldHMgY29udGVuYW50IGxlIGxvZ2luIGV0IGxlIG5vbSBjb21wbGV0IGRlcyBwZXJzb25uZXNcclxuICogZmFtaWxpw6hyZXMuIGByw6lwb25zZVxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25FcnJvcl0gLSBMZSBwYXJhbcOodHJlIGBvbkVycm9yYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBzJ2lsIHkgYSB1bmVcclxuICogZXJyZXVyIGxvcnMgZGUgbCdleMOpY3V0aW9uIGRlIGxhIGZvbmN0aW9uIGBfM0RTd3ltX2dldEZhbWlsaWFyUGVvcGxlYC4gSWwgcHJlbmQgZGV1eCBwYXJhbcOodHJlcyA6IMKrXHJcbiAqIHLDqXBvbnNlIMK7IGV0IMKrIGVuLXTDqnRlcyDCuy4gTGUgcGFyYW3DqHRyZSBgcmVzcG9uc2VgIGNvbnRpZW50IGxhIHLDqXBvbnNlIGQnZXJyZXVyIGR1IHNlcnZldXJcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfM0RTd3ltX2dldEZhbWlsaWFyUGVvcGxlKFxyXG4gIGNyZWRlbnRpYWxzLFxyXG4gIG9uRG9uZSA9IHVuZGVmaW5lZCxcclxuICBvbkVycm9yID0gdW5kZWZpbmVkLFxyXG4pIHtcclxuICBjb25zdCB1cmwgPSBgJHtjcmVkZW50aWFscy5zcGFjZX0vYXBpL1JlY29tbWVuZGF0aW9uL2dldHBlb3BsZWZhbWlsaWFydG9jdXJyZW50dXNlcmA7XHJcbiAgY29uc3QgX2RhdGEgPSB7XHJcbiAgICBwYXJhbXM6IHtcclxuICAgICAgaWRzVG9GaWx0ZXJBcnI6IFtdLFxyXG4gICAgICBtb2RlOiBcIm9mZmxpbmVcIixcclxuICAgICAgbGltaXQ6IDMwLFxyXG4gICAgICBpdGVtVHlwZTogXCJVc2VyXCIsXHJcbiAgICAgIG1heE5iT2ZDb21tb25FbGVtZW50czogXCI1XCIsXHJcbiAgICB9LFxyXG4gIH07XHJcbiAgXzNEU3d5bV9nZXRfdmVyc2lvbihjcmVkZW50aWFscywgKHRva2VuKSA9PiB7XHJcbiAgICBfaHR0cENhbGxBdXRoZW50aWNhdGVkKHVybCwge1xyXG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxyXG4gICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgXCJYLURTLVNXWU0tQ1NSRlRPS0VOXCI6IHRva2VuLnJlc3VsdC5TZXJ2ZXJUb2tlbixcclxuICAgICAgICBcIkNvbnRlbnQtdHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOFwiLFxyXG4gICAgICAgIEFjY2VwdDogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICAgIH0sXHJcbiAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KF9kYXRhKSxcclxuICAgICAgdHlwZTogXCJqc29uXCIsXHJcbiAgICAgIG9uQ29tcGxldGUocmVzcG9uc2UsIGhlYWRlcnMpIHtcclxuICAgICAgICBjb25zdCBteUNvbnRhY3RzID0gcmVzcG9uc2UucmVzdWx0LmhpdHMubWFwKChjb250YWN0KSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4geyBsb2dpbjogY29udGFjdC5sb2dpbiwgZnVsbE5hbWU6IGNvbnRhY3QubmFtZSB9O1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAob25Eb25lKSBvbkRvbmUobXlDb250YWN0cywgcmVzcG9uc2UpO1xyXG4gICAgICB9LFxyXG4gICAgICBvbkZhaWx1cmUocmVzcG9uc2UsIGhlYWRlcnMpIHtcclxuICAgICAgICBpZiAob25FcnJvcikgb25FcnJvcihyZXNwb25zZSwgaGVhZGVycyk7XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9KTtcclxufVxyXG4iLCJpbXBvcnQgeyBfaHR0cENhbGxBdXRoZW50aWNhdGVkIH0gZnJvbSBcIi4uLy4uL21haW4vM2RleHBlcmllbmNlX2FwaVwiO1xyXG5pbXBvcnQgeyBfM0RTd3ltX2dldF92ZXJzaW9uIH0gZnJvbSBcIi4uLzNkc3d5bV9hcGlcIjtcclxuXHJcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gTGEgZm9uY3Rpb24gYF8zZFN3aW1fZ2V0QWxsQ29tbXVuaXRpZXNgIHLDqWN1cMOocmUgdW5lIGxpc3RlIGRlIGNvbW11bmF1dMOpcyDDoCBwYXJ0aXIgZCd1bmUgcGxhdGVmb3JtZVxyXG4gKiAzRCBTd2ltIGVuIHV0aWxpc2FudCBsZXMgaW5mb3JtYXRpb25zIGQnaWRlbnRpZmljYXRpb24gZm91cm5pZXMuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBjcmVkZW50aWFscyAtIFVuIG9iamV0IGNvbnRlbmFudCBsZXMgaW5mb3JtYXRpb25zIGQnaWRlbnRpZmljYXRpb24gcmVxdWlzZXMgcG91ciBhdXRoZW50aWZpZXJcclxuICogbGEgZGVtYW5kZS4gSWwgaW5jbHV0IGfDqW7DqXJhbGVtZW50IGRlcyBwcm9wcmnDqXTDqXMgdGVsbGVzIHF1ZSDCqyB0b2tlbiDCuywgwqsgc3BhY2UgwrssIMKrIHRlbmFudCDCuyBldCDCqyBjdHggwrsuXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjcmVkZW50aWFscy5zcGFjZSAtICgzRFN3eW0pIEwnVVJMIGR1IHNlcnZldXIgc3VyIGxlcXVlbCBsJ0FQSSBlc3QgZMOpcGxvecOpZS4oZXg6IDNEU3BhY2UgPT4oaHR0cHM6Ly9yMTEzMjEwMDk2ODQ0Ny1ldTEtc3BhY2UuM2RleHBlcmllbmNlLjNkcy5jb20vZW5vdmlhKSwgM0RTd3ltLCAzRENvbXBhc3MuLi4pXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBjcmVkZW50aWFscy5saW1pdCAtIExlIHBhcmFtw6h0cmUgYGxpbWl0YCBlc3QgdW4gbm9tYnJlIGVudGllciBxdWkgaW5kaXF1ZSBsZSBub21icmUgbWF4aW11bSBkZSBjb21tdW5hdXTDqXMgw6AgcmVjZXZvaXIuIFBhciBkw6lmYXV0LCBpbCBlc3QgZGUgMTAsIG1haXMgdm91cyBwb3V2ZXogbGUgY2hhbmdlciBqdXNxdSfDoCAxMjgsIGF1IGRlbMOgIG9uIGNoYW5nZSBkZSBwYWdlLlxyXG4gKiBAcGFyYW0ge051bWJlcn0gY3JlZGVudGlhbHMucGFnZSAtIExlIHBhcmFtw6h0cmUgYHBhZ2VgIGVzdCB1biBub21icmUgZW50aWVyIHF1aSBpbmRpcXVlIGxhIHBhZ2UgY291cmFudGUuIFBhciBkw6lmYXV0LCBpbCBlc3Qgw6AgMS5cclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRG9uZV0gLSBVbmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIHVuZSBmb2lzIGwnb3DDqXJhdGlvbiB0ZXJtaW7DqWUuIElsIHByZW5kIGxhXHJcbiAqIGxpc3RlIGRlcyBjb21tdW5hdXTDqXMgY29tbWUgcGFyYW3DqHRyZS5cclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRXJyb3JdIC0gTGUgcGFyYW3DqHRyZSBgb25FcnJvcmAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgcydpbCB5IGEgdW5lXHJcbiAqIGVycmV1ciBsb3JzIGRlIGwnZXjDqWN1dGlvbiBkZSBsYSBmb25jdGlvbiBgXzNkU3dpbV9nZXRBbGxDb21tdW5pdGllc2AuIElsIHZvdXMgcGVybWV0IGRlIGfDqXJlciBldCBkZVxyXG4gKiByw6lwb25kcmUgw6AgdG91dGUgZXJyZXVyIHF1aSBzZSBwcm9kdWl0LlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF8zRFN3aW1fZ2V0QWxsQ29tbXVuaXRpZXMoXHJcbiAgY3JlZGVudGlhbHMsXHJcbiAgb25Eb25lID0gdW5kZWZpbmVkLFxyXG4gIG9uRXJyb3IgPSB1bmRlZmluZWQsXHJcbikge1xyXG4gIGNvbnN0IFVSTCA9IHtcclxuICAgIGJhc2U6IGNyZWRlbnRpYWxzLnNwYWNlLFxyXG4gICAgdXJpOiBcIi9hcGkvY29tbXVuaXR5L2xpc3RteWNvbW11bml0aWVzXCIsXHJcbiAgICBsaW1pdDogYC9saW1pdC8ke2NyZWRlbnRpYWxzLmxpbWl0ID8gY3JlZGVudGlhbHMubGltaXQgOiAxMjh9YCxcclxuICAgIHBhZ2U6IGAvcGFnZS8ke2NyZWRlbnRpYWxzLnBhZ2UgPyBjcmVkZW50aWFscy5wYWdlIDogXCIxXCJ9YCxcclxuICB9O1xyXG5cclxuICBjb25zdCB1cmwgPSBgJHtVUkwuYmFzZX0ke1VSTC51cml9JHtVUkwubGltaXR9JHtVUkwucGFnZX1gO1xyXG4gIGNvbnN0IGNvbW11bmF1dGVzID0gW107XHJcbiAgXzNEU3d5bV9nZXRfdmVyc2lvbihjcmVkZW50aWFscywgKHRva2VuKSA9PiB7XHJcbiAgICBfaHR0cENhbGxBdXRoZW50aWNhdGVkKHVybCwge1xyXG4gICAgICBtZXRob2Q6IFwiR0VUXCIsXHJcbiAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICBcIlgtRFMtU1dZTS1DU1JGVE9LRU5cIjogdG9rZW4ucmVzdWx0LlNlcnZlclRva2VuLFxyXG4gICAgICB9LFxyXG4gICAgICBvbkNvbXBsZXRlKHJlc3BvbnNlLCBoZWFkZXJzLCB4aHIpIHtcclxuICAgICAgICBjb25zdCBpbmZvID0gSlNPTi5wYXJzZShyZXNwb25zZSk7XHJcbiAgICAgICAgY29uc3QgX2NvbW11bml0aWVzSW5mbyA9IGluZm8ucmVzdWx0O1xyXG4gICAgICAgIGxldCBjb3VudCA9IDA7XHJcblxyXG4gICAgICAgIF9jb21tdW5pdGllc0luZm8uZm9yRWFjaCgoY29tbXUpID0+IHtcclxuICAgICAgICAgIGNvbnN0IF9jb21tdW5hdXRlID0ge1xyXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogY29tbXUuZGVzY3JpcHRpb24sXHJcbiAgICAgICAgICAgIGlkOiBjb21tdS5pZCxcclxuICAgICAgICAgICAgdGl0bGU6IGNvbW11LnRpdGxlLFxyXG4gICAgICAgICAgICBvd25lcjogY29tbXUub3duZXIsXHJcbiAgICAgICAgICAgIHJvbGU6IGNvbW11LnJvbGUsXHJcbiAgICAgICAgICAgIGFjY2VzczogY29tbXUuYWNjZXNzLFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICAgIF8zRFN3aW1fZ2V0TWVtYmVyc0NvbW11bml0eShcclxuICAgICAgICAgICAgY3JlZGVudGlhbHMsXHJcbiAgICAgICAgICAgIGNvbW11LmlkLFxyXG4gICAgICAgICAgICAoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgIGNvdW50Kys7XHJcbiAgICAgICAgICAgICAgX2NvbW11bmF1dGVbXCJtZW1iZXJzXCJdID0gZGF0YTtcclxuICAgICAgICAgICAgICBjb21tdW5hdXRlcy5wdXNoKF9jb21tdW5hdXRlKTtcclxuICAgICAgICAgICAgICBpZiAoY291bnQgPT09IF9jb21tdW5pdGllc0luZm8ubGVuZ3RoICYmIG9uRG9uZSkge1xyXG4gICAgICAgICAgICAgICAgb25Eb25lKGNvbW11bmF1dGVzKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIChlcnIpID0+IG9uRXJyb3IoZXJyKSxcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uRmFpbHVyZShyZXNwb25zZSwgaGVhZGVycykge1xyXG4gICAgICAgIGNvbnN0IGluZm8gPSByZXNwb25zZTtcclxuICAgICAgICBpbmZvW1wic3RhdHVzXCJdID0gaGVhZGVycy5zdGF0dXM7XHJcbiAgICAgICAgaW5mb1tcInJlc3BvbnNlXCJdID0gaGVhZGVycy5lcnJvcm1zZztcclxuICAgICAgICBpZiAob25FcnJvcikgb25FcnJvcihpbmZvKTtcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIExhIGZvbmN0aW9uIGBfM0RTd2ltX2dldE1lbWJlcnNDb21tdW5pdHlgIHLDqWN1cMOocmUgdW5lIGxpc3RlIGRlcyBtZW1icmVzIGQndW5lIGNvbW11bmF1dMOpIGVuIHV0aWxpc2FudCBsZXMgaW5mb3JtYXRpb25zIGQnaWRlbnRpZmljYXRpb24gZXQgbCdJRCBkZSBjb21tdW5hdXTDqSBmb3VybmlzLlxyXG4gKlxyXG4gKiBAcGFyYW0ge09iamVjdH0gY3JlZGVudGlhbHMgLSBVbiBvYmpldCBjb250ZW5hbnQgbGVzIGluZm9ybWF0aW9ucyBkJ2lkZW50aWZpY2F0aW9uIHJlcXVpc2VzIHBvdXIgYXV0aGVudGlmaWVyXHJcbiAqIGxhIGRlbWFuZGUuIElsIGluY2x1dCBnw6luw6lyYWxlbWVudCBkZXMgcHJvcHJpw6l0w6lzIHRlbGxlcyBxdWUgwqsgdG9rZW4gwrssIMKrIHNwYWNlIMK7LCDCqyB0ZW5hbnQgwrsgZXQgwqsgY3R4IMK7LlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMuc3BhY2UgLSAoM0RTd3ltKSBMJ1VSTCBkdSBzZXJ2ZXVyIHN1ciBsZXF1ZWwgbCdBUEkgZXN0IGTDqXBsb3nDqWUuKGV4OiAzRFNwYWNlID0+KGh0dHBzOi8vcjExMzIxMDA5Njg0NDctZXUxLXNwYWNlLjNkZXhwZXJpZW5jZS4zZHMuY29tL2Vub3ZpYSksIDNEU3d5bSwgM0RDb21wYXNzLi4uKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gY3JlZGVudGlhbHMubGltaXQgLSBMZSBwYXJhbcOodHJlIGBsaW1pdGAgZXN0IHVuIG5vbWJyZSBlbnRpZXIgcXVpIGluZGlxdWUgbGUgbm9tYnJlIG1heGltdW0gZGUgY29tbXVuYXV0w6lzIMOgIHJlY2V2b2lyLiBQYXIgZMOpZmF1dCwgaWwgZXN0IGRlIDUwLCBtYWlzIHZvdXMgcG91dmV6IGxlIGNoYW5nZXIganVzcXUnw6AgMTI4LCBhdSBkZWzDoCBvbiBjaGFuZ2UgZGUgcGFnZS5cclxuICogQHBhcmFtIHtOdW1iZXJ9IGNyZWRlbnRpYWxzLnBhZ2UgLSBMZSBwYXJhbcOodHJlIGBwYWdlYCBlc3QgdW4gbm9tYnJlIGVudGllciBxdWkgaW5kaXF1ZSBsYSBwYWdlIGNvdXJhbnRlLiBQYXIgZMOpZmF1dCwgaWwgZXN0IMOgIDEuXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBpZENvbW11IC0gTCdpZGVudGlmaWFudCBkZSBsYSBjb21tdW5hdXTDqSBkb250IHZvdXMgc291aGFpdGV6IHLDqWN1cMOpcmVyIGxlcyBtZW1icmVzLiAoZXg6IFwiWVhkQTV4NERTVUt0bEFpMndtbnlUQVwiKVxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkRvbmUgLSBVbmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIGxvcnNxdWUgbCdhcHBlbCBkJ0FQSSByw6l1c3NpdCBldCByZW52b2llIGxlc1xyXG4gKiBkb25uw6llcyBkZSByw6lwb25zZS4gTGVzIGRvbm7DqWVzIGRlIHLDqXBvbnNlIHNlcm9udCB0cmFuc21pc2VzIGVuIGFyZ3VtZW50IMOgIGNldHRlIGZvbmN0aW9uLlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIC0gTGUgcGFyYW3DqHRyZSBgb25FcnJvcmAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgcydpbCB5IGEgdW5lXHJcbiAqIGVycmV1ciBsb3JzIGRlIGwnZXjDqWN1dGlvbiBkZSBsYSBmb25jdGlvbiBgXzNEU3dpbV9nZXRNZW1iZXJzQ29tbXVuaXR5YC4gSWwgZXN0IHV0aWxpc8OpIHBvdXIgZ8OpcmVyXHJcbiAqIHRvdXRlcyBsZXMgZXJyZXVycyBxdWkgc2UgcHJvZHVpc2VudCBldCBmb3VybmlyIHVuZSBnZXN0aW9uIGRlcyBlcnJldXJzIG91IGRlcyBtZXNzYWdlcyBkJ2VycmV1clxyXG4gKiBhcHByb3ByacOpcyDDoCBsJ2FwcGVsYW50IGRlIGxhIGZvbmN0aW9uLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF8zRFN3aW1fZ2V0TWVtYmVyc0NvbW11bml0eShcclxuICBjcmVkZW50aWFscyxcclxuICBpZENvbW11LFxyXG4gIG9uRG9uZSxcclxuICBvbkVycm9yLFxyXG4pIHtcclxuICBjb25zdCBVUkwgPSBgJHtjcmVkZW50aWFscy5zcGFjZX0vYXBpL2NvbW11bml0eS9saXN0bWVtYmVyc2A7XHJcblxyXG4gIGNvbnN0IGRhdGFzID0ge1xyXG4gICAgcGFyYW1zOiB7XHJcbiAgICAgIHBhZ2U6IGNyZWRlbnRpYWxzLnBhZ2UgPyBjcmVkZW50aWFscy5wYWdlIDogMSxcclxuICAgICAgbGltaXQ6IGNyZWRlbnRpYWxzLmxpbWl0ID8gY3JlZGVudGlhbHMubGltaXQgOiA1MCxcclxuICAgICAgY29tbXVuaXR5X2lkOiBpZENvbW11LFxyXG4gICAgfSxcclxuICB9O1xyXG4gIF8zRFN3eW1fZ2V0X3ZlcnNpb24oY3JlZGVudGlhbHMsICh0b2tlbikgPT4ge1xyXG4gICAgX2h0dHBDYWxsQXV0aGVudGljYXRlZChVUkwsIHtcclxuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcclxuICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgIFwiQ29udGVudC10eXBlXCI6IFwiYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04XCIsXHJcbiAgICAgICAgQWNjZXB0OiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgICBcIlgtRFMtU1dZTS1DU1JGVE9LRU5cIjogdG9rZW4ucmVzdWx0LlNlcnZlclRva2VuLFxyXG4gICAgICB9LFxyXG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShkYXRhcyksXHJcbiAgICAgIHR5cGU6IFwianNvblwiLFxyXG4gICAgICBvbkNvbXBsZXRlKHJlc3BvbnNlLCBoZWFkZXJzLCB4aHIpIHtcclxuICAgICAgICBjb25zdCBpbmZvID0gcmVzcG9uc2U7XHJcbiAgICAgICAgaWYgKG9uRG9uZSkgb25Eb25lKGluZm8pO1xyXG4gICAgICB9LFxyXG4gICAgICBvbkZhaWx1cmUocmVzcG9uc2UsIGhlYWRlcnMpIHtcclxuICAgICAgICBjb25zdCBpbmZvID0gcmVzcG9uc2U7XHJcbiAgICAgICAgaW5mb1tcInN0YXR1c1wiXSA9IGhlYWRlcnMuc3RhdHVzO1xyXG4gICAgICAgIGluZm9bXCJyZXNwb25zZVwiXSA9IGhlYWRlcnMuZXJyb3Jtc2c7XHJcbiAgICAgICAgaWYgKG9uRXJyb3IpIG9uRXJyb3IoaW5mbyk7XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBMYSBmb25jdGlvbiBgXzNEU3d5bV9nZXRJZGVhU3RhdHVzTWF0dXJpdHlgIHLDqWN1cMOocmUgbGUgc3RhdHV0IGV0IGxhIG1hdHVyaXTDqSBkJ3VuZSBpZMOpZSBkJ3VuZVxyXG4gKiBjb21tdW5hdXTDqSAzREV4cGVyaWVuY2Ugw6AgbCdhaWRlIGRlcyBpbmZvcm1hdGlvbnMgZCdpZGVudGlmaWNhdGlvbiBmb3Vybmllcy5cclxuICogQHBhcmFtIHtPYmplY3R9IGNyZWRlbnRpYWxzIC0gVW4gb2JqZXQgY29udGVuYW50IGxlcyBpbmZvcm1hdGlvbnMgZCdpZGVudGlmaWNhdGlvbiByZXF1aXNlcyBwb3VyIGF1dGhlbnRpZmllclxyXG4gKiBsYSBkZW1hbmRlLiBJbCBpbmNsdXQgZ8OpbsOpcmFsZW1lbnQgZGVzIHByb3ByacOpdMOpcyB0ZWxsZXMgcXVlIMKrIHRva2VuIMK7LCDCqyBzcGFjZSDCuywgwqsgdGVuYW50IMK7IGV0IMKrIGN0eCDCuy5cclxuICogQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLnNwYWNlIC0gKDNEU3d5bSkgTCdVUkwgZHUgc2VydmV1ciBzdXIgbGVxdWVsIGwnQVBJIGVzdCBkw6lwbG95w6llLihleDogM0RTcGFjZSA9PihodHRwczovL3IxMTMyMTAwOTY4NDQ3LWV1MS1zcGFjZS4zZGV4cGVyaWVuY2UuM2RzLmNvbS9lbm92aWEpLCAzRFN3eW0sIDNEQ29tcGFzcy4uLilcclxuICogQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLmNvbW11X2lkIC0gTCdJRCBkZSBjb21tdW5hdXTDqSAzREV4cGVyaWVuY2UgKGV4OlwiWVhkQTV4NERTVUt0bEFpMndtbnlUQVwiKVxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25Eb25lXSAtIExlIHBhcmFtw6h0cmUgYG9uRG9uZWAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgbG9yc3F1ZSBsYVxyXG4gKiByZXF1w6p0ZSBBUEkgc2VyYSB0ZXJtaW7DqWUgYXZlYyBzdWNjw6hzLiBJbCBwcmVuZCB1biBhcmd1bWVudCwgwqsgaW5mbyDCuywgcXVpIGNvcnJlc3BvbmQgYXV4IGRvbm7DqWVzIGRlXHJcbiAqIHLDqXBvbnNlIGRlIGwnQVBJLlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25FcnJvcl0gLSBMZSBwYXJhbcOodHJlIGBvbkVycm9yYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBzJ2lsIHkgYSB1bmVcclxuICogZXJyZXVyIGxvcnMgZGUgbCdleMOpY3V0aW9uIGRlIGxhIGZvbmN0aW9uIGBfM0RTd3ltX2dldElkZWFTdGF0dXNNYXR1cml0eWAuIElsIHZvdXMgcGVybWV0IGRlIGfDqXJlclxyXG4gKiBldCBkZSB0cmFpdGVyIGwnZXJyZXVyIGRlIG1hbmnDqHJlIHBlcnNvbm5hbGlzw6llLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF8zRFN3eW1fZ2V0SWRlYVN0YXR1c01hdHVyaXR5KFxyXG4gIGNyZWRlbnRpYWxzLFxyXG4gIG9uRG9uZSA9IHVuZGVmaW5lZCxcclxuICBvbkVycm9yID0gdW5kZWZpbmVkLFxyXG4pIHtcclxuICBjb25zdCBjb21tdUlEID0gXCJZWGRBNXg0RFNVS3RsQWkyd21ueVRBXCI7XHJcbiAgaWYgKCFjcmVkZW50aWFscy5jb21tdV9pZCkgY3JlZGVudGlhbHMuY29tbXVfaWQgPSBjb21tdUlEO1xyXG4gIGNvbnN0IFVSTCA9IGAke2NyZWRlbnRpYWxzLnNwYWNlfS9hcGkvdjIvY29tbXVuaXRpZXMvJHtjcmVkZW50aWFscy5jb21tdV9pZH0vaWRlYXMvc3RhdHVzZXNgO1xyXG4gIF8zRFN3eW1fZ2V0X3ZlcnNpb24oY3JlZGVudGlhbHMsICh0b2tlbikgPT4ge1xyXG4gICAgX2h0dHBDYWxsQXV0aGVudGljYXRlZChVUkwsIHtcclxuICAgICAgbWV0aG9kOiBcIkdFVFwiLFxyXG4gICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgXCJDb250ZW50LXR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLThcIixcclxuICAgICAgICBBY2NlcHQ6IFwiYXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgICAgIFwiWC1EUy1TV1lNLUNTUkZUT0tFTlwiOiB0b2tlbi5yZXN1bHQuU2VydmVyVG9rZW4sXHJcbiAgICAgIH0sXHJcblxyXG4gICAgICBvbkNvbXBsZXRlKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgY29uc3QgaW5mbyA9IEpTT04ucGFyc2UocmVzcG9uc2UpO1xyXG5cclxuICAgICAgICBpZiAob25Eb25lKSBvbkRvbmUoaW5mbyk7XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uRmFpbHVyZShyZXNwb25zZSwgaGVhZGVycykge1xyXG4gICAgICAgIGNvbnN0IGluZm8gPSByZXNwb25zZTtcclxuICAgICAgICBpbmZvW1wic3RhdHVzXCJdID0gaGVhZGVycy5zdGF0dXM7XHJcbiAgICAgICAgaW5mb1tcInJlc3BvbnNlXCJdID0gaGVhZGVycy5lcnJvcm1zZztcclxuICAgICAgICBpZiAob25FcnJvcikgb25FcnJvcihpbmZvKTtcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH0pO1xyXG59XHJcblxyXG4vLyBURVNUXHJcbmNvbnN0IGNvbnRlbnRNU0cgPSB7XHJcbiAgcmVjZWlwdDogW1wiYzAwMDA1NzAxNjM3XCJdLCAvLyBMaXN0ZSBkZXMgcGVyc29ubmVzIMOgIHF1aSBlbnZveWVyIGxlIG1lc3NhZ2VcclxuICBtc2c6IFwiVEVTVFMgQmVhbSDCsyBERVYsIEhhcHB5IG5ldyB5ZWFyICEg44O+KOKMkOKWoF/ilqAp44OO4pmqXCIsIC8vIE1lc3NhZ2Ugw6AgZW52b3llclxyXG59O1xyXG5cclxuLy8gQ1JFQVRJT04gREUgTUVTU0FHRVMgRElSRUNUIE9VIElOU1RBTlRBTsOJXHJcblxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIExhIGZvbmN0aW9uIGBfM0RTd3ltX2J1aWxkRGlyZWN0TWVzc2FnZWAgcGVybWV0IGQnZW52b3llciB1biBtZXNzYWdlIGRpcmVjdCDDoCB1biBvdSBwbHVzaWV1cnMgdXRpbGlzYXRldXJzIGRhbnMgdW4gZXNwYWNlIHBsYXRlZm9ybWUgM0RFeHBlcmllbmNlLlxyXG4gKlxyXG4gKiBAcGFyYW0ge09iamVjdH0gY3JlZGVudGlhbHMgLSBVbiBvYmpldCBjb250ZW5hbnQgbGVzIGluZm9ybWF0aW9ucyBkJ2lkZW50aWZpY2F0aW9uIHJlcXVpc2VzIHBvdXIgYXV0aGVudGlmaWVyXHJcbiAqIGxhIGRlbWFuZGUuIElsIGluY2x1dCBnw6luw6lyYWxlbWVudCBkZXMgcHJvcHJpw6l0w6lzIHRlbGxlcyBxdWUgwqsgdG9rZW4gwrssIMKrIHNwYWNlIMK7LCDCqyB0ZW5hbnQgwrsgZXQgwqsgY3R4IMK7LlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMuc3BhY2UgLSAoM0RTd3ltKSBMJ1VSTCBkdSBzZXJ2ZXVyIHN1ciBsZXF1ZWwgbCdBUEkgZXN0IGTDqXBsb3nDqWUuKGV4OiAzRFNwYWNlID0+KGh0dHBzOi8vcjExMzIxMDA5Njg0NDctZXUxLXNwYWNlLjNkZXhwZXJpZW5jZS4zZHMuY29tL2Vub3ZpYSksIDNEU3d5bSwgM0RDb21wYXNzLi4uKVxyXG4gKiBAcGFyYW0ge09iamVjdH0gW2NyZWRlbnRpYWxzLmN1cnJlbnRVc2VyXSAtIExlIHBhcmFtw6h0cmUgYGN1cnJlbnRVc2VyYCBlc3QgdW4gcXVpIGNvbnRpZW50IGxlcyBpbmZvcm1hdGlvbnMgZGUgbCd1dGlsaXNhdGV1ciBxdWkgZW52b2llIGxlIG1lc3NhZ2UoYXBwZWxlciBkZXB1aXMgbGEgZm9uY3Rpb24gYF8zRFN3eW1fZ2V0X2N1cnJlbnR1c2VyYCkuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbY3JlZGVudGlhbHMuY3VycmVudFVzZXIubG9naW5dIC0gTGUgcGFyYW3DqHRyZSBgbG9naW5gIGVzdCBsJ2lkZW50aWZpYW50IGQnZW52b2lzIGR1IG1lc3NhZ2VcclxuICogQHBhcmFtIHtzdHJpbmd9IFtjcmVkZW50aWFscy5jdXJyZW50VXNlci5maXJzdF9uYW1lXSAtIExlIHBhcmFtw6h0cmUgYGZpcnN0X25hbWVgIGVzdCBsJ2lkZW50aWZpYW50IGQnZW52b2lzIGR1IG1lc3NhZ2VcclxuICogQHBhcmFtIHtzdHJpbmd9IFtjcmVkZW50aWFscy5jdXJyZW50VXNlci5sYXN0X25hbWVdIC0gTGUgcGFyYW3DqHRyZSBgbGFzdF9uYW1lYCBlc3QgbCdpZGVudGlmaWFudCBkJ2Vudm9pcyBkdSBtZXNzYWdlLlxyXG4gKlxyXG4gKiBAcGFyYW0ge09iamVjdH0gW2RhdGFzXSAtIExlIHBhcmFtw6h0cmUgYGRhdGFzYCBlc3QgdW4gb2JqZXQgcXVpIGNvbnRpZW50IGxlcyBkb25uw6llcyBkdSBtZXNzYWdlcy5cclxuICogQHBhcmFtIHtTdHJpbmd9IFtkYXRhcy5tc2ddIC0gTGUgcGFyYW3DqHRyZSBgbXNnYCBlc3QgdW5lIGNoYcOubmUgZGUgY2FyYWN0w6hyZXMgcXVpIGNvbnRpZW50IGxlIG1lc3NhZ2Ugw6AgZW52b3llci5cclxuICpcclxuICogQHBhcmFtIHtBcnJheX0gW2RhdGFzLnJlY2VpcHRdIC0gTGEgbGlzdGUgZGVzIHV0aWxpc2F0ZXVycyDDoCBxdWkgZW52b3llciBsZSBtZXNzYWdlIChsb2dpbikuIExhIGxpc3RlIGRlcyBwZXJzb25uZXMgYWNjZXNzaWJsZSBlc3QgZ8OpbsOpcmVyIHBhciBsYSBmb25jdGlvbiBfM0RTd3ltX2dldEZhbWlsaWFyUGVvcGxlLiAoZXg6IFtcImJlbTNfeWFuLmNvcXVvelwiLFwiYmVtX2JvYl9EeWxhblwiXSlcclxuICpcclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRG9uZV0gLSBVbmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIGxvcnNxdWUgbGUgbWVzc2FnZSBkaXJlY3Qgc2VyYSBlbnZvecOpIGF2ZWNcclxuICogc3VjY8Oocy4gSWwgcHJlbmQgdW4gYXJndW1lbnQsIHF1aSBlc3QgdW4gb2JqZXQgY29udGVuYW50IGRlcyBpbmZvcm1hdGlvbnMgc3VyIGxhIHLDqXBvbnNlIGR1IHNlcnZldXIuXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkVycm9yXSAtIExlIHBhcmFtw6h0cmUgYG9uRXJyb3JgIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIHMnaWwgeSBhIHVuZVxyXG4gKiBlcnJldXIgbG9ycyBkZSBsJ2V4w6ljdXRpb24gZGUgbGEgZm9uY3Rpb24gYF8zRFN3eW1fYnVpbGREaXJlY3RNZXNzYWdlYC4gSWwgZXN0IGZhY3VsdGF0aWYgZXQgcGV1dFxyXG4gKiDDqnRyZSBpbmTDqWZpbmkuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gXzNEU3d5bV9idWlsZERpcmVjdE1lc3NhZ2UoXHJcbiAgY3JlZGVudGlhbHMsXHJcbiAgZGF0YXMsXHJcbiAgb25Eb25lID0gdW5kZWZpbmVkLFxyXG4gIG9uRXJyb3IgPSB1bmRlZmluZWQsXHJcbikge1xyXG4gIGNvbnN0IHsgbGlzdEFsbENvbnRhY3RzLCBjdXJyZW50VXNlciB9ID0gY3JlZGVudGlhbHM7XHJcbiAgY29uc29sZS5sb2coXCJfX2xpc3RBbGxDb250YWN0c1wiLCBsaXN0QWxsQ29udGFjdHMuaGl0cyk7XHJcbiAgY29uc3QgX1VSTCA9IGAke2NyZWRlbnRpYWxzLnNwYWNlfS9hcGkvZGlyZWN0bWVzc2FnZXNgO1xyXG5cclxuICBjb25zdCBfZGF0YSA9IHtcclxuICAgIHVzZXJzOiBbY3VycmVudFVzZXIubG9naW5dLmNvbmNhdChkYXRhcy5yZWNlaXB0KSxcclxuICB9O1xyXG5cclxuICBjb25zdCBNU0dEYXRhID0ge1xyXG4gICAgaWRfbXNnOiBcIlwiLFxyXG4gICAgc2VuZGVySWQ6IGNyZWRlbnRpYWxzLmN1cnJlbnRVc2VyLmxvZ2luLFxyXG4gICAgc2VuZGVyTmFtZTogYCR7Y3JlZGVudGlhbHMuY3VycmVudFVzZXIuZmlyc3RfbmFtZX0gJHtjcmVkZW50aWFscy5jdXJyZW50VXNlci5sYXN0X25hbWV9YCxcclxuICAgIG1zZzogZm9ybWF0ZWRNZXNzYWdlKGRhdGFzLm1zZyksXHJcbiAgfTtcclxuICBsZXQgb3RoZXJDb21tdW5pdHkgPSBmYWxzZTtcclxuICBfM0RTd3ltX2ZpbmRDb21tdW5pdHlUb0luc3RhbnRNU0coXHJcbiAgICBfZGF0YS51c2VycyxcclxuICAgIChyZXApID0+IHtcclxuICAgICAgaWYgKHJlcCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgTVNHRGF0YVtcImlkX21zZ1wiXSA9IHJlcC5pZDtcclxuICAgICAgICBvdGhlckNvbW11bml0eSA9IHRydWU7XHJcbiAgICAgICAgXzNEU3d5bV9zZW5kTWVzc2FnZURhdGEoY3JlZGVudGlhbHMsIE1TR0RhdGEpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgKGVycikgPT4ge1xyXG4gICAgICBvdGhlckNvbW11bml0eSA9IGZhbHNlO1xyXG4gICAgICBjb25zb2xlLmxvZyhcIl8zZFN3eW1fZmluZENvbW11bml0eVRvSW5zdGFudE1TRyBjYWxsYmFja1wiLCBlcnIpO1xyXG4gICAgICBpZiAob25FcnJvcikgb25FcnJvcihlcnIpO1xyXG4gICAgICBNU0dEYXRhW1wiaWRfbXNnXCJdID0gXCJcIjtcclxuICAgIH0sXHJcbiAgKTtcclxuXHJcbiAgaWYgKG90aGVyQ29tbXVuaXR5ID09PSBmYWxzZSkge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGlmIChvdGhlckNvbW11bml0eSA9PT0gZmFsc2UpIHtcclxuICAgICAgICBfM0RTd3ltX2dldF92ZXJzaW9uKGNyZWRlbnRpYWxzLCAodG9rZW4pID0+IHtcclxuICAgICAgICAgIF9odHRwQ2FsbEF1dGhlbnRpY2F0ZWQoX1VSTCwge1xyXG4gICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxyXG4gICAgICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICAgICAgICAgICAgQWNjZXB0OiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgICAgICAgICBcIlgtRFMtU1dZTS1DU1JGVE9LRU5cIjogdG9rZW4ucmVzdWx0LlNlcnZlclRva2VuLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShfZGF0YSksXHJcbiAgICAgICAgICAgIHR5cGU6IFwianNvblwiLFxyXG4gICAgICAgICAgICBvbkNvbXBsZXRlKHJlc3BvbnNlLCBoZWFkZXJzLCB4aHIpIHtcclxuICAgICAgICAgICAgICBjb25zdCBpbmZvID0gcmVzcG9uc2U7XHJcbiAgICAgICAgICAgICAgaW5mb1tcInJlcG9uc2VcIl0gPSBKU09OLnBhcnNlKHhoci5yZXNwb25zZSk7XHJcbiAgICAgICAgICAgICAgaW5mb1tcInN0YXR1c1wiXSA9IHhoci5zdGF0dXM7XHJcbiAgICAgICAgICAgICAgaWYgKG9uRG9uZSkgb25Eb25lKGluZm8pO1xyXG4gICAgICAgICAgICAgIE1TR0RhdGFbXCJpZF9tc2dcIl0gPSBpbmZvLnJlc3VsdC5pZDtcclxuICAgICAgICAgICAgICBfM0RTd3ltX3NlbmRNZXNzYWdlRGF0YShjcmVkZW50aWFscywgTVNHRGF0YSk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIG9uRmFpbHVyZShyZXNwb25zZSwgaGVhZGVycywgeGhyKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgaW5mbyA9IHJlc3BvbnNlO1xyXG4gICAgICAgICAgICAgIGluZm9bXCJtc2dcIl0gPSBoZWFkZXJzLmVycm9ybXNnO1xyXG4gICAgICAgICAgICAgIGluZm9bXCJzdGF0dXNcIl0gPSBoZWFkZXJzLnN0YXR1cztcclxuXHJcbiAgICAgICAgICAgICAgaWYgKG9uRXJyb3IpIG9uRXJyb3IoaW5mbyk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSwgNTAwKTtcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gTGEgZm9uY3Rpb24gYF8zRFN3eW1fZmluZENvbW11bml0eVRvSW5zdGFudE1TR2AgZXN0IHV0aWxpc8OpZSBwb3VyIHJlY2hlcmNoZXIgdW5lIGNvbW11bmF1dMOpIGRhbnMgdW5lXHJcbiAqIHBsYXRlZm9ybWUgM0RFeHBlcmllbmNlIHBvdXIgbGEgbWVzc2FnZXJpZSBpbnN0YW50YW7DqWUgZW4gZm9uY3Rpb24gZGVzIGluZm9ybWF0aW9ucyBkJ2lkZW50aWZpY2F0aW9uXHJcbiAqIGV0IGRlcyBkb25uw6llcyBmb3Vybmllcy5cclxuICogQHBhcmFtIHtPYmplY3R9IGNyZWRlbnRpYWxzIC0gVW4gb2JqZXQgY29udGVuYW50IGxlcyBpbmZvcm1hdGlvbnMgZCdpZGVudGlmaWNhdGlvbiByZXF1aXNlcyBwb3VyIGF1dGhlbnRpZmllclxyXG4gKiBsYSBkZW1hbmRlLiBJbCBpbmNsdXQgZ8OpbsOpcmFsZW1lbnQgZGVzIHByb3ByacOpdMOpcyB0ZWxsZXMgcXVlIMKrIHRva2VuIMK7LCDCqyBzcGFjZSDCuywgwqsgdGVuYW50IMK7IGV0IMKrIGN0eCDCuy5cclxuICogQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLnNwYWNlIC0gKDNEU3d5bSkgTCdVUkwgZHUgc2VydmV1ciBzdXIgbGVxdWVsIGwnQVBJIGVzdCBkw6lwbG95w6llLihleDogM0RTcGFjZSA9PihodHRwczovL3IxMTMyMTAwOTY4NDQ3LWV1MS1zcGFjZS4zZGV4cGVyaWVuY2UuM2RzLmNvbS9lbm92aWEpLCAzRFN3eW0sIDNEQ29tcGFzcy4uLilcclxuICogQHBhcmFtIHtBcnJheX0gZGF0YXMgLSBMZSBwYXJhbcOodHJlIGBkYXRhc2AgZXN0IHVuIHRhYmxlYXUgcXVpIGNvbnRpZW50IGxlcyBkb25uw6llcyDDoCB1dGlsaXNlciBwb3VyIHRyb3V2ZXIgdW5lIGNvbW11bmF1dMOpIHBvdXIgZW52b3llciB1biBtZXNzYWdlIGluc3RhbnRhbsOpLlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkRvbmUgLSBMZSBwYXJhbcOodHJlIGBvbkRvbmVgIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIGxvcnNxdWVcclxuICogbCdvcMOpcmF0aW9uIHNlcmEgdGVybWluw6llIGF2ZWMgc3VjY8Oocy4gSWwgZmF1dCB1biBhcmd1bWVudCwgcXVpIGVzdCBsZSByw6lzdWx0YXQgZGUgbCdvcMOpcmF0aW9uLlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIC0gTGUgcGFyYW3DqHRyZSBgb25FcnJvcmAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgcydpbCB5IGEgdW5lXHJcbiAqIGVycmV1ciBsb3JzIGRlIGwnZXjDqWN1dGlvbiBkZSBsYSBmb25jdGlvbiBgXzNEU3d5bV9maW5kQ29tbXVuaXR5VG9JbnN0YW50TVNHYC4gSWwgZXN0IGZhY3VsdGF0aWYgZXRcclxuICogcGV1dCDDqnRyZSBvbWlzIHPigJlpbCBu4oCZZXN0IHBhcyBuw6ljZXNzYWlyZS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfM0RTd3ltX2ZpbmRDb21tdW5pdHlUb0luc3RhbnRNU0coXHJcbiAgY3JlZGVudGlhbHMsXHJcbiAgZGF0YXMsXHJcbiAgb25Eb25lLFxyXG4gIG9uRXJyb3IsXHJcbikge1xyXG4gIGNvbnN0IFVSTCA9IGAke2NyZWRlbnRpYWxzLnNwYWNlfS9hcGkvZGlyZWN0bWVzc2FnZXMvbGl0ZT93aXRoX2Zhdm9yaXRlcz1mYWxzZWA7XHJcbiAgXzNEU3d5bV9nZXRfdmVyc2lvbihjcmVkZW50aWFscywgKHRva2VuKSA9PiB7XHJcbiAgICBfaHR0cENhbGxBdXRoZW50aWNhdGVkKFVSTCwge1xyXG4gICAgICBtZXRob2Q6IFwiR0VUXCIsXHJcbiAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICBBY2NlcHQ6IFwiYXBwbGljYXRpb24vanNvbix0ZXh0L2phdmFzY3JpcHQsKi8qXCIsXHJcbiAgICAgICAgXCJYLURTLVNXWU0tQ1NSRlRPS0VOXCI6IHRva2VuLnJlc3VsdC5TZXJ2ZXJUb2tlbixcclxuICAgICAgfSxcclxuICAgICAgb25Db21wbGV0ZShyZXNwb25zZSkge1xyXG4gICAgICAgIGNvbnN0IGluZm8gPSBKU09OLnBhcnNlKHJlc3BvbnNlKTtcclxuICAgICAgICBjb25zdCBpbmZvU29ydGVkQnlMZW5ndGhzID0gW107XHJcbiAgICAgICAgaW5mby5yZXN1bHQuZm9yRWFjaCgoY29tKSA9PiB7XHJcbiAgICAgICAgICBjb20udXNlcnMgPSBjb20udXNlcnMuc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gYS5sb2dpbi5sb2NhbGVDb21wYXJlKGIubG9naW4pO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBpZiAoY29tLnVzZXJzLmxlbmd0aCA9PT0gZGF0YXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGluZm9Tb3J0ZWRCeUxlbmd0aHMucHVzaChjb20pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnN0IHNvcnRlZERhdGFzID0gZGF0YXMuc29ydCgpO1xyXG5cclxuICAgICAgICBjb25zdCBfZGF0YXMgPSBpbmZvU29ydGVkQnlMZW5ndGhzLmZpbmQoKGNvbSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgbG9naW5zID0gW107XHJcbiAgICAgICAgICBjb20udXNlcnMuZm9yRWFjaCgodXNlcikgPT4ge1xyXG4gICAgICAgICAgICBsb2dpbnMucHVzaCh1c2VyLmxvZ2luKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGxvZ2lucykgPT09IEpTT04uc3RyaW5naWZ5KHNvcnRlZERhdGFzKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKG9uRG9uZSAmJiBfZGF0YXMgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgb25Eb25lKF9kYXRhcyk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChvbkVycm9yIHx8IF9kYXRhcyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICBvbkVycm9yKF9kYXRhcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBvbkZhaWx1cmUocmVzcG9uc2UpIHtcclxuICAgICAgICBjb25zdCBpbmZvID0gcmVzcG9uc2U7XHJcbiAgICAgICAgaW5mb1tcIm1zZ1wiXSA9IGhlYWRlcnMuZXJyb3Jtc2c7XHJcbiAgICAgICAgaW5mb1tcImVyckNvZGVcIl0gPSBoZWFkZXJzLmVycm9yY29kZTtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIuKdjCBzZW5kRGlyZWN0TWVzc2FnZUxpdGUgPT4gXCIsIGluZm8pO1xyXG4gICAgICAgIGlmIChvbkVycm9yKSBvbkVycm9yKGluZm8pO1xyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gTGEgZm9uY3Rpb24gYF8zRFN3eW1fc2VuZE1lc3NhZ2VEYXRhYCBlbnZvaWUgdW4gbWVzc2FnZSBkaXJlY3QgYXZlYyBsZXMgaW5mb3JtYXRpb25zXHJcbiAqIGQnaWRlbnRpZmljYXRpb24gZXQgbGUgY29udGVudSBkb25uw6lzLCBldCBhcHBlbGxlIGxlcyByYXBwZWxzIGBvbkRvbmVgIG91IGBvbkVycm9yYCBlbiBmb25jdGlvbiBkdVxyXG4gKiBzdWNjw6hzIG91IGRlIGwnw6ljaGVjIGRlIGxhIHJlcXXDqnRlLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gY3JlZGVudGlhbHMgLSBVbiBvYmpldCBjb250ZW5hbnQgbGVzIGluZm9ybWF0aW9ucyBkJ2lkZW50aWZpY2F0aW9uIHJlcXVpc2VzIHBvdXIgYXV0aGVudGlmaWVyXHJcbiAqIGxhIGRlbWFuZGUuIElsIGluY2x1dCBnw6luw6lyYWxlbWVudCBkZXMgcHJvcHJpw6l0w6lzIHRlbGxlcyBxdWUgwqsgdG9rZW4gwrssIMKrIHNwYWNlIMK7LCDCqyB0ZW5hbnQgwrsgZXQgwqsgY3R4IMK7LlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMuc3BhY2UgLSAoM0RTd3ltKSBMJ1VSTCBkdSBzZXJ2ZXVyIHN1ciBsZXF1ZWwgbCdBUEkgZXN0IGTDqXBsb3nDqWUuKGV4OiAzRFNwYWNlID0+KGh0dHBzOi8vcjExMzIxMDA5Njg0NDctZXUxLXNwYWNlLjNkZXhwZXJpZW5jZS4zZHMuY29tL2Vub3ZpYSksIDNEU3d5bSwgM0RDb21wYXNzLi4uKVxyXG4gKiBAcGFyYW0gY29udGVudCAtIExlIHBhcmFtw6h0cmUgYGNvbnRlbnRgIGVzdCB1biBvYmpldCBxdWkgY29udGllbnQgbGVzIHByb3ByacOpdMOpcyBzdWl2YW50ZXPCoDpcclxuICogQHBhcmFtIHtTdHJpbmd9IGNvbnRlbnQuaWRfbXNnIC0gTCdpZGVudGlmaWFudCBkdSBtZXNzYWdlIMOgIGVudm95ZXIuXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjb250ZW50LnNlbmRlcklkIC0gTCdpZGVudGlmaWFudCBkZSBsJ3V0aWxpc2F0ZXVyIHF1aSBlbnZvaWUgbGUgbWVzc2FnZS5cclxuICogQHBhcmFtIHtTdHJpbmd9IGNvbnRlbnQuc2VuZGVyTmFtZSAtIExlIG5vbSBkZSBsJ3V0aWxpc2F0ZXVyIHF1aSBlbnZvaWUgbGUgbWVzc2FnZS5cclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRG9uZV0gLSBMZSBwYXJhbcOodHJlIGBvbkRvbmVgIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIGxvcnNxdWUgbCdlbnZvaVxyXG4gKiBkdSBtZXNzYWdlIHNlcmEgdGVybWluw6kgYXZlYyBzdWNjw6hzLiBJbCBwcmVuZCB1biBhcmd1bWVudCwgcXVpIGVzdCB1biBvYmpldCBjb250ZW5hbnQgZGVzXHJcbiAqIGluZm9ybWF0aW9ucyBzdXIgbGEgcsOpcG9uc2UgZHUgc2VydmV1ci5cclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRXJyb3JdIC0gTGUgcGFyYW3DqHRyZSBgb25FcnJvcmAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgcydpbCB5IGEgdW5lXHJcbiAqIGVycmV1ciBsb3JzIGRlIGwnZXjDqWN1dGlvbiBkZSBsYSBmb25jdGlvbiBgXzNEU3d5bV9zZW5kTWVzc2FnZURhdGFgLiBJbCB2b3VzIHBlcm1ldCBkZSBnw6lyZXIgZXQgZGVcclxuICogdHJhaXRlciBsZXMgaW5mb3JtYXRpb25zIGQnZXJyZXVyLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF8zRFN3eW1fc2VuZE1lc3NhZ2VEYXRhKFxyXG4gIGNyZWRlbnRpYWxzLFxyXG4gIGNvbnRlbnQsXHJcbiAgb25Eb25lID0gdW5kZWZpbmVkLFxyXG4gIG9uRXJyb3IgPSB1bmRlZmluZWQsXHJcbikge1xyXG4gIGNvbnN0IFVSTCA9IHtcclxuICAgIGJhc2U6IGNyZWRlbnRpYWxzLnNwYWNlLFxyXG4gICAgdXJpOiBcIi9hcGkvY29tbXVuaXR5XCIsXHJcbiAgICBpZF9tc2c6IGAke2NvbnRlbnQuaWRfbXNnfWAsXHJcbiAgICBlbmRVcmk6IFwiL2luc3RhbnRtZXNzYWdlc1wiLFxyXG4gIH07XHJcblxyXG4gIGNvbnN0IHVybCA9IGAke1VSTC5iYXNlfSR7VVJMLnVyaX0vJHtVUkwuaWRfbXNnfSR7VVJMLmVuZFVyaX1gO1xyXG5cclxuICBjb25zdCBkYXRhcyA9IHtcclxuICAgIGF1dGhvcjogeyBsb2dpbjogY29udGVudC5zZW5kZXJJZCwgZGlzcGxheU5hbWU6IGNvbnRlbnQuc2VuZGVyTmFtZSB9LFxyXG4gICAgYWNjZXNzU3RhdGU6IG51bGwsXHJcbiAgICBjb21tZW50VXJpOiBudWxsLFxyXG4gICAgY29tbWVudHM6IG51bGwsXHJcbiAgICBlbmRvcnNlbWVudHM6IG51bGwsXHJcbiAgICBtb2RlcmF0aW9uU3RhdGU6IG51bGwsXHJcbiAgICBwYXJlbnRDb21tZW50VXJpOiBudWxsLFxyXG4gICAgcmljaE1lc3NhZ2U6IGNvbnRlbnQubXNnLFxyXG4gIH07XHJcbiAgY29uc29sZS5sb2coXCJfM2RTd3ltX3NlbmREaXJlY3RNZXNzYWdlRGF0YSB1cmwgXCIsIHVybCk7XHJcbiAgXzNEU3d5bV9nZXRfdmVyc2lvbihjcmVkZW50aWFscywgKHRva2VuKSA9PiB7XHJcbiAgICBfaHR0cENhbGxBdXRoZW50aWNhdGVkKHVybCwge1xyXG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxyXG4gICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICAgICAgQWNjZXB0OiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgICBcIlgtRFMtU1dZTS1DU1JGVE9LRU5cIjogdG9rZW4ucmVzdWx0LlNlcnZlclRva2VuLFxyXG4gICAgICB9LFxyXG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShkYXRhcyksXHJcbiAgICAgIHR5cGU6IFwianNvblwiLFxyXG4gICAgICBvbkNvbXBsZXRlKHJlc3BvbnNlLCBoZWFkZXJzLCB4aHIpIHtcclxuICAgICAgICBjb25zdCBpbmZvID0gcmVzcG9uc2U7XHJcbiAgICAgICAgaW5mb1tcInN0YXR1c1wiXSA9IHhoci5zdGF0dXM7XHJcbiAgICAgICAgaW5mb1tcInJlc3BvbnNlXCJdID0gSlNPTi5wYXJzZSh4aHIucmVzcG9uc2UpO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwi4pyFIF8zZFN3eW1fc2VuZERpcmVjdE1lc3NhZ2VEYXRhID0+IFwiLCBpbmZvKTtcclxuICAgICAgICBpZiAob25Eb25lKSBvbkRvbmUoaW5mbyk7XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uRmFpbHVyZShyZXNwb25zZSwgaGVhZGVycykge1xyXG4gICAgICAgIGNvbnN0IGluZm8gPSByZXNwb25zZTtcclxuICAgICAgICBpbmZvW1wibXNnXCJdID0gaGVhZGVycy5lcnJvcm1zZztcclxuICAgICAgICBpbmZvW1wiZXJyQ29kZVwiXSA9IGhlYWRlcnMuZXJyb3Jjb2RlO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwi4p2MIHNlbmREaXJlY3RNZXNzYWdlID0+IFwiLCBpbmZvKTtcclxuICAgICAgICBpZiAob25FcnJvcikgb25FcnJvcihpbmZvKTtcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIExhIGZvbmN0aW9uIGBmb3JtYXRlZE1lc3NhZ2VgIHJlbnZvaWUgdW4gbWVzc2FnZSBmb3JtYXTDqSBhdmVjIGxhIGRhdGUgZXQgbCdoZXVyZSBhY3R1ZWxsZXMuXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIC0gTGUgcGFyYW3DqHRyZSBgbWVzc2FnZWAgZXN0IHVuZSBjaGHDrm5lIHF1aSByZXByw6lzZW50ZSBsZSBjb250ZW51IGR1IG1lc3NhZ2UgcXVlIHZvdXMgc291aGFpdGV6IGVudm95ZXIuXHJcbiAqXHJcbiAqIEByZXR1cm5zIHVuIG1lc3NhZ2UgZm9ybWF0w6kgYXZlYyBsYSBkYXRlIGV0IGwnaGV1cmUgYWN0dWVsbGVzLiBMZSBtZXNzYWdlIGVzdCBlbnZlbG9wcMOpIGRhbnMgdW5lIGJhbGlzZSBkZSBwYXJhZ3JhcGhlLCBzdWl2aWUgZCd1biBzYXV0IGRlIGxpZ25lIGV0IGQndW5lIHLDqGdsZSBob3Jpem9udGFsZS5cclxuICogICBFbiBkZXNzb3VzLCBpbCBjb21wcmVuZCB1bmUgcGhyYXNlIGluZGlxdWFudCBxdWFuZCBsZSBtZXNzYWdlIGEgw6l0w6kgZW52b3nDqSwgeSBjb21wcmlzIGxhIGRhdGUgZXQgbCdoZXVyZS5cclxuICpcclxuICovXHJcbmZ1bmN0aW9uIGZvcm1hdGVkTWVzc2FnZShtZXNzYWdlKSB7XHJcbiAgY29uc3QgX2RhdGVzID0gbmV3IERhdGUoKS50b0xvY2FsZURhdGVTdHJpbmcoKTtcclxuICBjb25zdCB0aW1lID0gbmV3IERhdGUoKS50b0xvY2FsZVRpbWVTdHJpbmcoKTtcclxuICByZXR1cm4gYDxwPiR7bWVzc2FnZX0gPC9wPlxyXG4gIDxici8+XHJcbiAgPGhyLz5cclxuICA8cD48dT5lbnZveWVyIDo8L3U+TGUgPGI+JHtfZGF0ZXN9IMOgICR7dGltZX08L2I+PC9wPmA7XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IHtcclxuICBfM0RTd2ltX2dldEFsbENvbW11bml0aWVzLFxyXG4gIF8zRFN3aW1fZ2V0TWVtYmVyc0NvbW11bml0eSxcclxuICBfM0RTd3ltX2dldElkZWFTdGF0dXNNYXR1cml0eSxcclxuICBfM0RTd3ltX2J1aWxkRGlyZWN0TWVzc2FnZSxcclxuICBfM0RTd3ltX2ZpbmRDb21tdW5pdHlUb0luc3RhbnRNU0csXHJcbiAgXzNEU3d5bV9zZW5kTWVzc2FnZURhdGEsXHJcbn07XHJcbiIsImltcG9ydCB7IF9odHRwQ2FsbEF1dGhlbnRpY2F0ZWQgfSBmcm9tIFwiLi4vLi4vbWFpbi8zZGV4cGVyaWVuY2VfYXBpXCI7XHJcbmltcG9ydCB7IF8zRFN3eW1fZ2V0X3ZlcnNpb24gfSBmcm9tIFwiLi4vM2Rzd3ltX2FwaVwiO1xyXG4vKlxyXG4gKiBAZXhlbXBsZSBkYXRhVGVzdFxyXG4gKi9cclxuY29uc3QgZGF0YVRlc3QgPSB7XHJcbiAgdGl0bGU6IFwiVEVTVCBERVYgQ09NTVVOSVRZIElERUFcIiwgLy8gdGl0cmUgZHUgcG9zdFxyXG4gIGNvbW11bml0eV9pZDogXCJZWGRBNXg0RFNVS3RsQWkyd21ueVRBXCIsIC8vIFNUQVRVVCBQUk9KRVRTIC0gUGhhc2UgY29tbWVyY2lhbGUsICB0ZW5hbnQgUElWRVRFQVUgVEVTVFxyXG4gIGNvbW11bml0eV90aXRsZTogXCJURVNUIERFViBDT01NVU5JVFlcIiwgLy8gUG9zc2liaWxpdMOpIGRlIHJlY2hlcmNoZSBwYXIgdGl0cmUgZGUgbGEgY29tbXVuYXV0w6kgKG9wdGlvbilcclxuICBpZGVlX2lkOiBcIlRIaFJJOHJsUU5XS1J4cHYzWHFxdWdcIiwgLy8gaWQgZGUgbCdpZGVlIHF1aSBlc3QgY3LDqWVyIGF1IHBvc3QgKF8zZFN3eW1fcG9zdElkZWEpXHJcbn07XHJcblxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIExhIGZvbmN0aW9uIGBfM0RTd3ltX3Bvc3RJZGVhYCBlc3QgdXRpbGlzw6llIHBvdXIgcHVibGllciB1bmUgaWTDqWUgc3VyIHVuZSBjb21tdW5hdXTDqSAzRFN3eW0gZW4gdXRpbGlzYW50IGxlcyBpbmZvcm1hdGlvbnMgZCdpZGVudGlmaWNhdGlvbiBldCBsZXMgZG9ubsOpZXMgZm91cm5pZXMuXHJcbiAqXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBjcmVkZW50aWFscyAtIFVuIG9iamV0IGNvbnRlbmFudCBsZXMgaW5mb3JtYXRpb25zIGQnaWRlbnRpZmljYXRpb24gcmVxdWlzZXMgcG91ciBhdXRoZW50aWZpZXJcclxuICogbGEgZGVtYW5kZS4gSWwgaW5jbHV0IGfDqW7DqXJhbGVtZW50IGRlcyBwcm9wcmnDqXTDqXMgdGVsbGVzIHF1ZSDCqyB0b2tlbiDCuywgwqsgc3BhY2UgwrssIMKrIHRlbmFudCDCuyBldCDCqyBjdHggwrsuXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjcmVkZW50aWFscy5zcGFjZSAtICgzRFN3eW0pIEwnVVJMIGR1IHNlcnZldXIgc3VyIGxlcXVlbCBsJ0FQSSBlc3QgZMOpcGxvecOpZS4oM0RTcGFjZSwgM0RTd3ltLCAzRENvbXBhc3MsLi4uZXRjKVxyXG4gKiBAZXhhbXBsZSBwb3VyIGxlIDNEU3BhY2Uge3NwYWNlOlwiaHR0cHM6Ly9yMTEzMjEwMDk2ODQ0Ny1ldTEtc3BhY2UuM2RleHBlcmllbmNlLjNkcy5jb20vZW5vdmlhXCJ9XHJcblxyXG4gKiBAcGFyYW0ge0FycmF5fSBjcmVkZW50aWFscy5zd3ltQ29tbXVuaXRpZXMgdGFibGVhdSBkZXMgY29tbXVuYXV0w6lzIGlzc3VlIGRlIGxhIGZvbmN0aW9uIGBfM0RTd2ltX2dldEFsbENvbW11bml0aWVzYFxyXG4gKiBAcGFyYW0ge09iamVjdH0gZGF0YSAtIExlIHBhcmFtw6h0cmUgYGRhdGFgIGVzdCB1biBvYmpldCBxdWkgY29udGllbnQgbGVzIHByb3ByacOpdMOpcyBzdWl2YW50ZXM6IGB0aXRsZWAsIGBjb21tdW5pdHlfaWRgIGV0IGBjb21tdW5pdHlfdGl0bGVgIENlIGRlcm5pZXIgZXN0IG9wdGlvbm5lbC5cclxuICogQHBhcmFtIHtTdHJpbmd9IGRhdGEudGl0bGUgLSBMZSB0aXRyZSBkZSBsJ2lkw6llLlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gZGF0YS5jb21tdW5pdHlfaWQgLSBMJ0lEIGRlIGxhIGNvbW11bmF1dMOpIHN1ciBsYXF1ZWxsZSBsJ2lkw6llIGRvaXQgw6p0cmUgcHVibGllZS4oZXg6IFwiWVhkQTV4NERTVUt0bEFpMndtbnlUQVwiKVxyXG4gKiBAcGFyYW0ge1N0cmluZ30gZGF0YS5jb21tdW5pdHlfdGl0bGUgLSBMZSB0aXRyZSBkZSBsYSBjb21tdW5hdXTDqSBzdXIgbGFxdWVsbGUgbCdpZMOpZSBkb2l0IMOqdHJlIHB1YmxpZWUuKG9wdGlvbm5lbCwgZXg6IFRFU1QgREVWIENPTU1VTklUWSlcclxuICogQHBhcmFtIHtTdHJpbmd9IGRhdGEudGV4dF9odG1sIC0gTGUgbWVzc2FnZSBIVE1MIGRlIGwnaWTDqWUgKE9wdGlvbm5lbCBzdXIgbGVzIHRlbmFudHMgUGl2ZXRlYXUgUHJvZCBldCB0ZXN0KVxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25Eb25lXSAtIExlIHBhcmFtw6h0cmUgYG9uRG9uZWAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgbG9yc3F1ZSBsYSBmb25jdGlvbiBgXzNEU3d5bV9wb3N0SWRlYWAgdGVybWluZXJhIGF2ZWMgc3VjY8OocyBzb24gZXjDqWN1dGlvbi4gSWwgcHJlbmQgdW4gYXJndW1lbnQsIMKrIGluZm8gwrssIHF1aSBjb250aWVudCBsZXMgZG9ubsOpZXMgZGUgcsOpcG9uc2UgZGUgbCdhcHBlbCBBUEkuXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkVycm9yXSAtIExlIHBhcmFtw6h0cmUgYG9uRXJyb3JgIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIHMnaWwgeSBhIHVuZSBlcnJldXIgbG9ycyBkZSBsJ2V4w6ljdXRpb24gZGUgbGEgZm9uY3Rpb24gYF8zRFN3eW1fcG9zdElkZWFgLiBJbCBzJ2FnaXQgZCd1biBwYXJhbcOodHJlIGZhY3VsdGF0aWYsIGRvbmMgcydpbCBuJ2VzdCBwYXMgZm91cm5pLCBpbCBzZXJhIHBhciBkw6lmYXV0IMKrwqBub24gZMOpZmluacKgwrsuXHJcbiAqXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gXzNEU3d5bV9wb3N0SWRlYShcclxuICBjcmVkZW50aWFscyxcclxuICBkYXRhLFxyXG4gIG9uRG9uZSA9IHVuZGVmaW5lZCxcclxuICBvbkVycm9yID0gdW5kZWZpbmVkLFxyXG4pIHtcclxuICBjb25zdCBVUkwgPSBgJHtjcmVkZW50aWFscy5zcGFjZX0vYXBpL2lkZWEvYWRkYDtcclxuXHJcbiAgY29uc3QgZmluZEJ5SUQgPSBjcmVkZW50aWFscy5zd3ltQ29tbXVuaXRpZXMuZmluZChcclxuICAgIChjb21tdSkgPT4gY29tbXUuaWQgPT09IGRhdGEuY29tbXVuaXR5X2lkLFxyXG4gICk7XHJcbiAgY29uc3QgZmluZEJ5VGl0bGUgPSBjcmVkZW50aWFscy5zd3ltQ29tbXVuaXRpZXMuZmluZChcclxuICAgIChjb21tdSkgPT4gY29tbXUudGl0bGUudG9Mb3dlckNhc2UoKSA9PT0gZGF0YS5jb21tdW5pdHlfdGl0bGUudG9Mb3dlckNhc2UoKSxcclxuICApO1xyXG5cclxuICBjb25zdCBmb3JtYXRlZERhdGEgPSB7XHJcbiAgICBwYXJhbXM6IHtcclxuICAgICAgdGl0bGU6IGRhdGEudGl0bGUsIC8vIFN0cmluZywgbGUgbm9tIGRlIGwnYWZmYWlyZVxyXG4gICAgICBjb21tdW5pdHlfaWQ6IGZpbmRCeUlEPy5pZCAhPT0gdW5kZWZpbmVkID8gZmluZEJ5SUQuaWQgOiBmaW5kQnlUaXRsZS5pZCwgLy8gU3RyaW5nLCBsJ2lkIGRlIGxhIGNvbW11bmF1dMOpXHJcbiAgICAgIG1lc3NhZ2U6IHRlbXBsYXRlQWZmYWlyZU1lc3NhZ2UoZGF0YS50ZXh0X2h0bWwpLCAvLyBTVFJJTkcgPT4gIGxlIGNvbnRlbnVlIGR1IG1lc3NhZ2UgZG9pdCDDqnRyZSBhdSBmb3JtYXQgSFRNTFxyXG4gICAgICBwdWJsaXNoZWQ6IDEsIC8vIDEgcHVibGllciwgMCBub24gcHVibGllclxyXG4gICAgfSxcclxuICB9O1xyXG5cclxuICBfM0RTd3ltX2dldF92ZXJzaW9uKGNyZWRlbnRpYWxzLCAodG9rZW4pID0+IHtcclxuICAgIGNvbnN0IGhlYWRlcnMgPSB7XHJcbiAgICAgIFwiQ29udGVudC10eXBlXCI6IFwiYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04XCIsXHJcbiAgICAgIEFjY2VwdDogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICAgIFwiWC1EUy1TV1lNLUNTUkZUT0tFTlwiOiB0b2tlbi5yZXN1bHQuU2VydmVyVG9rZW4sXHJcbiAgICB9O1xyXG5cclxuICAgIF9odHRwQ2FsbEF1dGhlbnRpY2F0ZWQoVVJMLCB7XHJcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXHJcbiAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXHJcbiAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KGZvcm1hdGVkRGF0YSksXHJcbiAgICAgIHR5cGU6IFwianNvblwiLFxyXG4gICAgICBvbkNvbXBsZXRlKHJlc3BvbnNlLCBoZWFkZXJzLCB4aHIpIHtcclxuICAgICAgICBjb25zdCBpbmZvID0gSlNPTi5wYXJzZShyZXNwb25zZSk7XHJcbiAgICAgICAgaW5mb1tcInN0YXR1c1wiXSA9IHhoci5zdGF0dXM7XHJcbiAgICAgICAgaW5mb1tcInJlc3BvbnNlXCJdID0geGhyLnJlc3BvbnNlO1xyXG4gICAgICAgIGlmIChvbkRvbmUpIG9uRG9uZShpbmZvKTtcclxuICAgICAgfSxcclxuICAgICAgb25GYWlsdXJlKHJlc3BvbnNlLCBoZWFkZXJzLCB4aHIpIHtcclxuICAgICAgICBjb25zdCBpbmZvID0gcmVzcG9uc2U7XHJcbiAgICAgICAgaW5mb1tcInN0YXR1c1wiXSA9IGhlYWRlcnMuc3RhdHVzO1xyXG4gICAgICAgIGluZm9bXCJyZXNwb25zZVwiXSA9IGhlYWRlcnMuZXJyb3Jtc2c7XHJcbiAgICAgICAgaWYgKG9uRXJyb3IpIG9uRXJyb3IoaW5mbyk7XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBMYSBmb25jdGlvbiBgXzNEU3d5bV9kZWxldGVJZGVhYCBlc3QgdXRpbGlzw6llIHBvdXIgc3VwcHJpbWVyIHVuZSBpZMOpZSBkYW5zIHVuZSBjb21tdW5hdXTDqSAzREV4cGVyaWVuY2UgZW4gdXRpbGlzYW50IGxlcyBpbmZvcm1hdGlvbnMgZCdpZGVudGlmaWNhdGlvbiBldCBsZXMgZG9ubsOpZXMgZm91cm5pZXMuXHJcbiAqXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBjcmVkZW50aWFscyAtIFVuIG9iamV0IGNvbnRlbmFudCBsZXMgaW5mb3JtYXRpb25zIGQnaWRlbnRpZmljYXRpb24gcmVxdWlzZXMgcG91ciBhdXRoZW50aWZpZXJcclxuICogbGEgZGVtYW5kZS4gSWwgaW5jbHV0IGfDqW7DqXJhbGVtZW50IGRlcyBwcm9wcmnDqXTDqXMgdGVsbGVzIHF1ZSDCqyB0b2tlbiDCuywgwqsgc3BhY2UgwrssIMKrIHRlbmFudCDCuyBldCDCqyBjdHggwrsuXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjcmVkZW50aWFscy5zcGFjZSAtICgzRFN3eW0pIEwnVVJMIGR1IHNlcnZldXIgc3VyIGxlcXVlbCBsJ0FQSSBlc3QgZMOpcGxvecOpZS4oM0RTcGFjZSwgM0RTd3ltLCAzRENvbXBhc3MsLi4uZXRjKVxyXG4gKiBAZXhhbXBsZSBwb3VyIGxlIDNEU3BhY2Uge3NwYWNlOlwiaHR0cHM6Ly9yMTEzMjEwMDk2ODQ0Ny1ldTEtc3BhY2UuM2RleHBlcmllbmNlLjNkcy5jb20vZW5vdmlhXCJ9XHJcbiBcclxuICogQHBhcmFtIGRhdGEgLSBMZSBwYXJhbcOodHJlIGBkYXRhYCBlc3QgdW4gb2JqZXQgcXVpIGNvbnRpZW50IGxlcyBwcm9wcmnDqXTDqXMgc3VpdmFudGVzOlxyXG4gKiBgY29tbXVuaXR5X2lkYCBldCAnaWRlZV9pZCdcclxuICogQHBhcmFtIHtTdHJpbmd9IGRhdGEuY29tbXVuaXR5X2lkIC0gTCdJRCBkZSBsYSBjb21tdW5hdXTDqSBzdXIgbGFxdWVsbGUgbCdpZMOpZSBkb2l0IMOqdHJlIHN1cHByaW3DqWUuKGV4OiBcIllYZEE1eDREU1VLdGxBaTJ3bW55VEFcIilcclxuICogQHBhcmFtIHtTdHJpbmd9IGRhdGEuaWRlZV9pZCAtIEwnSUQgZGUgbCdpZMOpZSBxdWUgdm91cyBzb3VoYWl0ZXogc3VwcHJpbWVyIChleDogXCJUSGhSSThybFFOV0tSeHB2M1hxcXVnXCIpXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkRvbmVdIC0gTGUgcGFyYW3DqHRyZSBgb25Eb25lYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBsb3JzcXVlIGxhXHJcbiAqIHN1cHByZXNzaW9uIGRlIGwnaWTDqWUgc2VyYSB0ZXJtaW7DqWUgYXZlYyBzdWNjw6hzLiBJbCBwcmVuZCB1biBhcmd1bWVudCwgwqtpbmZvwrssIHF1aSBjb250aWVudCBkZXNcclxuICogaW5mb3JtYXRpb25zIHN1ciBsYSByw6lwb25zZSBkdSBzZXJ2ZXVyLlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25FcnJvcl0gLSBMZSBwYXJhbcOodHJlIGBvbkVycm9yYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBzJ2lsIHkgYSB1bmVcclxuICogZXJyZXVyIGxvcnMgZGUgbCdleMOpY3V0aW9uIGRlIGxhIGZvbmN0aW9uIGBfM0RTd3ltX2RlbGV0ZUlkZWFgLiBJbCB2b3VzIHBlcm1ldCBkZSBnw6lyZXIgZXQgZGVcclxuICogdHJhaXRlciBsZXMgaW5mb3JtYXRpb25zIGQnZXJyZXVyLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF8zRFN3eW1fZGVsZXRlSWRlYShcclxuICBjcmVkZW50aWFscyxcclxuICBkYXRhLFxyXG4gIG9uRG9uZSA9IHVuZGVmaW5lZCxcclxuICBvbkVycm9yID0gdW5kZWZpbmVkLFxyXG4pIHtcclxuICBjb25zdCBVUkwgPSBgJHtjcmVkZW50aWFscy5zcGFjZX0vYXBpL2lkZWEvZGVsZXRlYDtcclxuICBjb25zdCBmb3JtYXRlZERhdGEgPSB7XHJcbiAgICBwYXJhbXM6IHtcclxuICAgICAgY29tbXVuaXR5X2lkOiBkYXRhLmNvbW11bml0eV9pZCxcclxuICAgICAgaWRlYXRpb25JZHM6IFtkYXRhLmlkZWVfaWRdLFxyXG4gICAgfSxcclxuICB9O1xyXG4gIF8zRFN3eW1fZ2V0X3ZlcnNpb24oY3JlZGVudGlhbHMsICh0b2tlbikgPT4ge1xyXG4gICAgX2h0dHBDYWxsQXV0aGVudGljYXRlZChVUkwsIHtcclxuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcclxuICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgIFwiQ29udGVudC10eXBlXCI6IFwiYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04XCIsXHJcbiAgICAgICAgQWNjZXB0OiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgICBcIlgtRFMtU1dZTS1DU1JGVE9LRU5cIjogdG9rZW4ucmVzdWx0LlNlcnZlclRva2VuLFxyXG4gICAgICB9LFxyXG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShmb3JtYXRlZERhdGEpLFxyXG4gICAgICB0eXBlOiBcImpzb25cIixcclxuICAgICAgb25Db21wbGV0ZShyZXNwb25zZSwgaGVhZGVycywgeGhyKSB7XHJcbiAgICAgICAgY29uc3QgaW5mbyA9IHJlc3BvbnNlO1xyXG4gICAgICAgIGlmIChvbkRvbmUpIG9uRG9uZShpbmZvKTtcclxuICAgICAgfSxcclxuICAgICAgb25GYWlsdXJlKHJlc3BvbnNlLCBoZWFkZXJzLCB4aHIpIHtcclxuICAgICAgICBjb25zdCBpbmZvID0gcmVzcG9uc2U7XHJcbiAgICAgICAgaW5mb1tcInN0YXR1c1wiXSA9IGhlYWRlcnMuc3RhdHVzO1xyXG4gICAgICAgIGluZm9bXCJyZXNwb25zZVwiXSA9IGhlYWRlcnMuZXJyb3Jtc2c7XHJcbiAgICAgICAgaWYgKG9uRXJyb3IpIG9uRXJyb3IoaW5mbyk7XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBDZXR0ZSBmb25jdGlvbiBKYXZhU2NyaXB0IHLDqWN1cMOocmUgdW5lIGlkw6llIFNXWU0gw6AgbCdhaWRlIGRlcyBpbmZvcm1hdGlvbnMgZCdpZGVudGlmaWNhdGlvbiBldCBkZSBsJ0lEIGRlIHB1YmxpY2F0aW9uIGZvdXJuaXMuXHJcbiAqXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBjcmVkZW50aWFscyAtIFVuIG9iamV0IGNvbnRlbmFudCBsZXMgaW5mb3JtYXRpb25zIGQnaWRlbnRpZmljYXRpb24gcmVxdWlzZXMgcG91ciBhdXRoZW50aWZpZXJcclxuICogbGEgZGVtYW5kZS4gSWwgaW5jbHV0IGfDqW7DqXJhbGVtZW50IGRlcyBwcm9wcmnDqXTDqXMgdGVsbGVzIHF1ZSDCqyB0b2tlbiDCuywgwqsgc3BhY2UgwrssIMKrIHRlbmFudCDCuyBldCDCqyBjdHggwrsuXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjcmVkZW50aWFscy5zcGFjZSAtICgzRFN3eW0pIEwnVVJMIGR1IHNlcnZldXIgc3VyIGxlcXVlbCBsJ0FQSSBlc3QgZMOpcGxvecOpZS4oM0RTcGFjZSwgM0RTd3ltLCAzRENvbXBhc3MsLi4uZXRjKVxyXG4gKiBAZXhhbXBsZSBwb3VyIGxlIDNEU3BhY2Uge3NwYWNlOlwiaHR0cHM6Ly9yMTEzMjEwMDk2ODQ0Ny1ldTEtc3BhY2UuM2RleHBlcmllbmNlLjNkcy5jb20vZW5vdmlhXCJ9XHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjcmVkZW50aWFscy50ZW5hbnQgLSBsZSB0ZW5hbnQgY291cmFudFxyXG4gKiBAZXhhbXBsZSB7dGVuYW50OlwiUjExMzIxMDA5Njg0NDdcIn1cclxuICogQHBhcmFtIHtTdHJpbmd9IFtpZFBvc3RdIC0gTCdpZGVudGlmaWFudCBkZSBsYSBwdWJsaWNhdGlvbiBvdSBkZSBsJ2lkw6llIHF1ZSB2b3VzIHNvdWhhaXRleiByw6ljdXDDqXJlci4gU2kgYXVjdW4gaWRlbnRpZmlhbnQgbidlc3QgZm91cm5pLCBpbCBzJ2FnaXJhIHBhciBkw6lmYXV0IGRlIGwnaWRlbnRpZmlhbnQgZGUgbCdpZMOpZSBkZSBtb2TDqGxlLiAoYWN0dWVsbGVtZW50ID0+IFBpdmV0ZWF1IHByb2QgOlwidEZ0ejBHNE1SNnFOdEtnSmpOZlRvZ1wiLCBQaXZldGVhdSB0ZXN0IDpcIlFwdjNITi10VERPc1UtN19jNURuRGdcIikuXHJcbiAqXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkRvbmVdIC0gTGUgcGFyYW3DqHRyZSBgb25Eb25lYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBsb3JzcXVlIGxhIHJlcXXDqnRlIEFQSSBzZXJhIHRlcm1pbsOpZSBhdmVjIHN1Y2PDqHMuIElsIHByZW5kIHVuIGFyZ3VtZW50LCDCqyBpbmZvIMK7LCBxdWkgY29udGllbnQgbGVzIGRvbm7DqWVzIGRlIHLDqXBvbnNlIGRlIGwnYXBwZWwgQVBJLiAoaW5mby5tc2cgOiB0ZW1wbGF0ZSByw6ljdXDDqXJlciBsb3JzIGRlIGxhIGNyw6lhdGlvbiBkJ3VuZSBBZmZhaXJlIGV0IHV0aWxpc2VyIGRhbnMgbGEgZm9uY3Rpb24gYF8zRFN3eW1fcG9zdElkZWEoKWApLlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25FcnJvcl0gLSBMZSBwYXJhbcOodHJlIGBvbkVycm9yYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBzJ2lsIHkgYSB1bmVcclxuICogZXJyZXVyIGxvcnMgZGUgbCdleMOpY3V0aW9uIGRlIGxhIGZvbmN0aW9uIGBfM0RTd3ltX2dldFNXWU1JZGVhYC4gSWwgdm91cyBwZXJtZXQgZGUgZ8OpcmVyIGV0IGRlXHJcbiAqIHRyYWl0ZXIgbCdlcnJldXIgZGUgbWFuacOocmUgcGVyc29ubmFsaXPDqWUuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gXzNEU3d5bV9nZXRTV1lNSWRlYShcclxuICBjcmVkZW50aWFscyxcclxuICBpZFBvc3QgPSBcIlwiLFxyXG4gIG9uRG9uZSA9IHVuZGVmaW5lZCxcclxuICBvbkVycm9yID0gdW5kZWZpbmVkLFxyXG4pIHtcclxuICAvLyBUZW5hbnQgUElWRVRFQVUgVEVTVCB0ZW1wbGF0ZSBpZCB8fCB0ZW5hbnQgUElWRVRFQVUgUFJPRFxyXG4gIGNvbnN0IHRlbXBsYXRlSWRlYUlkID1cclxuICAgIGNyZWRlbnRpYWxzLnRlbmFudC50b0xvd2VyQ2FzZSgpID09PSBcInIxMTMyMTAxNzE2MzczXCJcclxuICAgICAgPyBcInRGdHowRzRNUjZxTnRLZ0pqTmZUb2dcIlxyXG4gICAgICA6IGNyZWRlbnRpYWxzLnRlbmFudC50b0xvd2VyQ2FzZSgpID09PSBcInIxMTMyMTAxMjg2ODU5XCJcclxuICAgICAgPyBcIlFwdjNITi10VERPc1UtN19jNURuRGdcIlxyXG4gICAgICA6IFwiVGVtcGxhdGVfZCdpZMOpZV/DoF9jcsOpZXJcIjsgLy8gdGVtcGxhdGUgY3LDqWVyIMOgIGxhIGNyZWF0aW9uIGQndW5lIEFmZmFpcmVcclxuICBpZiAoaWRQb3N0ID09PSBcIlwiKSB7XHJcbiAgICBpZFBvc3QgPSB0ZW1wbGF0ZUlkZWFJZDtcclxuICB9XHJcblxyXG4gIGNvbnN0IFVSTCA9IGAke2NyZWRlbnRpYWxzLnNwYWNlfS9hcGkvaWRlYS9nZXRgO1xyXG4gIGNvbnN0IGRhdGFzID0ge1xyXG4gICAgcGFyYW1zOiB7XHJcbiAgICAgIGlkOiBpZFBvc3QsXHJcbiAgICB9LFxyXG4gIH07XHJcbiAgXzNEU3d5bV9nZXRfdmVyc2lvbihjcmVkZW50aWFscywgKHRva2VuKSA9PiB7XHJcbiAgICBfaHR0cENhbGxBdXRoZW50aWNhdGVkKFVSTCwge1xyXG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxyXG4gICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgXCJDb250ZW50LXR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLThcIixcclxuICAgICAgICBBY2NlcHQ6IFwiYXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgICAgIFwiWC1EUy1TV1lNLUNTUkZUT0tFTlwiOiB0b2tlbi5yZXN1bHQuU2VydmVyVG9rZW4sXHJcbiAgICAgIH0sXHJcbiAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KGRhdGFzKSxcclxuICAgICAgdHlwZTogXCJqc29uXCIsXHJcbiAgICAgIG9uQ29tcGxldGUocmVzcG9uc2UpIHtcclxuICAgICAgICBjb25zdCBpbmZvID0gcmVzcG9uc2U7XHJcbiAgICAgICAgaW5mb1tcIm1zZ1wiXSA9IGluZm8ucmVzdWx0Lm1lc3NhZ2U7XHJcblxyXG4gICAgICAgIGlmIChvbkRvbmUpIG9uRG9uZShpbmZvKTtcclxuICAgICAgfSxcclxuICAgICAgb25GYWlsdXJlKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgY29uc3QgaW5mbyA9IHJlc3BvbnNlO1xyXG4gICAgICAgIGluZm9bXCJzdGF0dXNcIl0gPSBoZWFkZXJzLnN0YXR1cztcclxuICAgICAgICBpbmZvW1wicmVzcG9uc2VcIl0gPSBoZWFkZXJzLmVycm9ybXNnO1xyXG4gICAgICAgIGlmIChvbkVycm9yKSBvbkVycm9yKGluZm8pO1xyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gTGEgZm9uY3Rpb24gYF8zRFN3eW1fZ2V0X0FsbFNXWU1JZGVhc2AgcsOpY3Vww6hyZSB0b3V0ZXMgbGVzIGlkw6llcyBTV1lNIGVuIHV0aWxpc2FudCBsZXMgaW5mb3JtYXRpb25zIGQnaWRlbnRpZmljYXRpb24gZm91cm5pZXMgZXQgbGVzIHBhcmFtw6h0cmVzIGZhY3VsdGF0aWZzLlxyXG4gKlxyXG4gKiBAcGFyYW0ge09iamVjdH0gY3JlZGVudGlhbHMgLSBVbiBvYmpldCBjb250ZW5hbnQgbGVzIGluZm9ybWF0aW9ucyBkJ2lkZW50aWZpY2F0aW9uIHJlcXVpc2VzIHBvdXIgYXV0aGVudGlmaWVyXHJcbiAqIGxhIGRlbWFuZGUuIElsIGluY2x1dCBnw6luw6lyYWxlbWVudCBkZXMgcHJvcHJpw6l0w6lzIHRlbGxlcyBxdWUgwqsgdG9rZW4gwrssIMKrIHNwYWNlIMK7LCDCqyB0ZW5hbnQgwrsgZXQgwqsgY3R4IMK7LlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMuc3BhY2UgLSAoM0RTd3ltKSBMJ1VSTCBkdSBzZXJ2ZXVyIHN1ciBsZXF1ZWwgbCdBUEkgZXN0IGTDqXBsb3nDqWUuKDNEU3BhY2UsIDNEU3d5bSwgM0RDb21wYXNzLC4uLmV0YylcclxuICogQGV4YW1wbGUgcG91ciBsZSAzRFNwYWNlIHtzcGFjZTpcImh0dHBzOi8vcjExMzIxMDA5Njg0NDctZXUxLXNwYWNlLjNkZXhwZXJpZW5jZS4zZHMuY29tL2Vub3ZpYVwifVxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMudGVuYW50IC0gbGUgdGVuYW50IGNvdXJhbnRcclxuICogQGV4YW1wbGUge3RlbmFudDpcIlIxMTMyMTAwOTY4NDQ3XCJ9XHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBbZGF0YV0gLSBMZSBwYXJhbcOodHJlIGBkYXRhYCBlc3QgdW4gb2JqZXQgcXVpIGNvbnRpZW50IGRlcyBkb25uw6llcyBzdXBwbMOpbWVudGFpcmVzIHBvdXIgbGEgcmVxdcOqdGUgQVBJLiBJbCBwb3Nzw6hkZSBsZXMgcHJvcHJpw6l0w6lzIHN1aXZhbnRlcyA6XHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBkYXRhLmNvbW11bml0eV9pZCAtIEwnSUQgZGUgbGEgY29tbXVuYXV0w6kgc3VyIGxhcXVlbGxlIGwnaWTDqWUgZG9pdCDDqnRyZSByZWNoZXJjaMOpZS4oZXg6IFwiWVhkQTV4NERTVUt0bEFpMndtbnlUQVwiKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gZGF0YS5saW1pdCAtIExlIG5vbWJyZSBkJ2lkw6llcyDDoCByZW52b3llciAob3B0aW9ubmVsLCBwYXIgZMOpZmF1dCAxMCAoMTAgcHJlbWnDqHJlcyBpZMOpZXMpKVxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25Eb25lXSAtIExlIHBhcmFtw6h0cmUgYG9uRG9uZWAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgbG9yc3F1ZSBsYVxyXG4gKiByZXF1w6p0ZSBBUEkgc2VyYSB0ZXJtaW7DqWUgYXZlYyBzdWNjw6hzLiBJbCBwcmVuZCB1biBhcmd1bWVudCwgwqtpbmZvwrssIHF1aSBjb3JyZXNwb25kIGF1eCBkb25uw6llcyBkZVxyXG4gKiByw6lwb25zZSBkZSBsJ0FQSS5cclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRXJyb3JdIC0gTGUgcGFyYW3DqHRyZSBgb25FcnJvcmAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgcydpbCB5IGEgdW5lXHJcbiAqIGVycmV1ciBsb3JzIGRlIGwnZXjDqWN1dGlvbiBkZSBsYSBmb25jdGlvbiBgXzNEU3d5bV9nZXRfQWxsU1dZTUlkZWFzYC4gSWwgZXN0IGZhY3VsdGF0aWYgZXQgcGV1dCDDqnRyZVxyXG4gKiBpbmTDqWZpbmkuIFMnaWwgZXN0IGZvdXJuaSwgaWwgc2VyYSBhcHBlbMOpIGF2ZWMgbGVzIGluZm9ybWF0aW9ucyBkJ2VycmV1ciBzb3VzIGZvcm1lIGRlXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gXzNEU3d5bV9nZXRfQWxsU1dZTUlkZWFzKFxyXG4gIGNyZWRlbnRpYWxzLFxyXG4gIGRhdGEgPSBkYXRhVGVzdCxcclxuICBvbkRvbmUgPSB1bmRlZmluZWQsXHJcbiAgb25FcnJvciA9IHVuZGVmaW5lZCxcclxuKSB7XHJcbiAgY29uc3QgVVJMID0ge1xyXG4gICAgdXJpOiBcIi9hcGkvaWRlYS9saXN0XCIsXHJcbiAgICBjb21JZDogYC9jb21tdW5pdHlfaWQvJHtcclxuICAgICAgY3JlZGVudGlhbHMudGVuYW50LnRvTG93ZXJDYXNlKCkgPT09IFwicjExMzIxMDE3MTYzNzNcIlxyXG4gICAgICAgID8gZGF0YS5jb21tdW5pdHlfaWRcclxuICAgICAgICA6IFwiYmduSXNHNzRTVVdzd3lHelM2TkM2Z1wiXHJcbiAgICB9YCxcclxuICAgIGxpbWl0OiBgL2xpbWl0LyR7ZGF0YS5saW1pdCA/IGRhdGEubGltaXQgOiAxMH1gLFxyXG4gIH07XHJcbiAgY29uc3QgdXJsID0gYCR7Y3JlZGVudGlhbHMuc3BhY2V9JHtVUkwudXJpfSR7VVJMLmNvbUlkfSR7VVJMLmxpbWl0fWA7XHJcbiAgXzNEU3d5bV9nZXRfdmVyc2lvbihjcmVkZW50aWFscywgKHRva2VuKSA9PiB7XHJcbiAgICBfaHR0cENhbGxBdXRoZW50aWNhdGVkKHVybCwge1xyXG4gICAgICBtZXRob2Q6IFwiR0VUXCIsXHJcbiAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICBcIlgtRFMtU1dZTS1DU1JGVE9LRU5cIjogdG9rZW4ucmVzdWx0LlNlcnZlclRva2VuLFxyXG4gICAgICB9LFxyXG5cclxuICAgICAgb25Db21wbGV0ZShyZXNwb25zZSkge1xyXG4gICAgICAgIGNvbnN0IGluZm8gPSBKU09OLnBhcnNlKHJlc3BvbnNlKTtcclxuXHJcbiAgICAgICAgaWYgKG9uRG9uZSkgb25Eb25lKGluZm8pO1xyXG4gICAgICB9LFxyXG4gICAgICBvbkZhaWx1cmUocmVzcG9uc2UsIGhlYWRlcnMpIHtcclxuICAgICAgICBjb25zdCBpbmZvID0gcmVzcG9uc2U7XHJcbiAgICAgICAgaW5mb1tcInN0YXR1c1wiXSA9IGhlYWRlcnMuc3RhdHVzO1xyXG4gICAgICAgIGluZm9bXCJyZXNwb25zZVwiXSA9IGhlYWRlcnMuZXJyb3Jtc2c7XHJcbiAgICAgICAgaWYgKG9uRXJyb3IpIG9uRXJyb3IoaW5mbyk7XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gdGVtcGxhdGVBZmZhaXJlTWVzc2FnZSh0eHQpIHtcclxuICAvLyBURU1QTEFURSBBRkZBSVJFU1xyXG4gIGlmICghdHh0IHx8IHR4dCA9PT0gXCJcIikge1xyXG4gICAgY29uc3QgbWVzc2FnZSA9IGA8aDI+PHU+SU5GT1JNQVRJT05TIEFGRkFJUkUgOjwvdT48L2gyPlxyXG4gIDxwPjx1PnzimqDvuI88ZW0+IE1lcmNpIGRlIHJlc3BlY3RlciBsJiMzOTvDqWNyaXR1cmUgZGVzIHRhZ3MsIGVuIE1BSlVTQ1VMRVMsIG5vbSBjb21wbGV0LCBwYXMgZGUgY2FyYWN0w6hyZXM8L2VtPjwvdT48L3A+XHJcbiAgPHA+PHU+PGVtPnxzcMOpY2lhdXgsIHPDqXBhcmF0aW9uIHBhciAmIzM0O18mIzM0OyBzaSBiZXNvaW4gITwvZW0+PC91PjwvcD5cclxuICA8cD48c3Ryb25nPlLDqWbDqXJlbmNlIGNsaWVudCA8L3N0cm9uZz46ICA8ZW0+XHJcbiAgPGEgZGF0YS1wcmVkaWNhdGU9XCJkczZ3Ondob1wiIGRhdGEtdHlwZT1cImludGVybmFsXCIgY2xhc3M9XCJzNm0tdGFnLWxpbmsgczZtLWxpbmtcIj5DTElFTlQ8L2E+IFxyXG4gIDwvZW0+PC9wPlxyXG4gIDxwPjxzdHJvbmc+UsOpZsOpcmVuY2UgcHJvamV0IDwvc3Ryb25nPjogPGVtPlxyXG4gIDxhIGRhdGEtcHJlZGljYXRlPVwiZHM2dzp3aGF0XCIgZGF0YS10eXBlPVwiaW50ZXJuYWxcIiBjbGFzcz1cInM2bS10YWctbGluayBzNm0tbGlua1wiPk5PTSBBRkZBSVJFPC9hPiBcclxuICA8YSBkYXRhLXByZWRpY2F0ZT1cImRzNnc6d2hlcmVcIiBkYXRhLXR5cGU9XCJpbnRlcm5hbFwiIGNsYXNzPVwiczZtLXRhZy1saW5rIHM2bS1saW5rXCI+VklMTEU8L2E+IFxyXG4gIDxhIGRhdGEtcHJlZGljYXRlPVwiZHM2dzp3aGVyZVwiIGRhdGEtdHlwZT1cImludGVybmFsXCIgY2xhc3M9XCJzNm0tdGFnLWxpbmsgczZtLWxpbmtcIj5EUFQ8L2E+IFxyXG4gIDwvZW0+PC9wPlxyXG4gIDxwPiYjeDFmNGRkOyA8c3Ryb25nPkJhc2UgZG9jdW1lbnRhaXJlPC9zdHJvbmc+IDogTElFTiBwcm9qZXQ8L3A+XHJcbiAgPHA+JiN4MWY0ZGQ7IDxzdHJvbmc+RmljaGUgQ09DTElDTzwvc3Ryb25nPiA6IExJRU4gcHJvamV0PGVtPjxzdHJvbmc+PC9zdHJvbmc+XHJcbiAgPC9lbT48L3A+XHJcbiAgPHA+PGJyIC8+PC9wPlxyXG4gIDx0YWJsZSBib3JkZXI9XCIxXCI+XHJcbiAgPHRib2R5PlxyXG4gIDx0cj48dGQ+PHN0cm9uZz5EZXNjcmlwdGlvbiBwcm9qZXQgPC9zdHJvbmc+OlxyXG4gIDxiciAvPjxiciAvPjwvdGQ+PC90cj5cclxuICA8L3Rib2R5PlxyXG4gIDwvdGFibGU+XHJcbiAgPHA+PGJyIC8+PC9wPlxyXG4gIDxwPjxiciAvPjwvcD5cclxuICA8cD48c3Ryb25nPlByb2R1aXQgOjxlbT4gPC9lbT48L3N0cm9uZz48ZW0+XHJcbiAgPGEgZGF0YS1wcmVkaWNhdGU9XCJkczZ3OndoYXRcIiBkYXRhLXR5cGU9XCJpbnRlcm5hbFwiIGNsYXNzPVwiczZtLXRhZy1saW5rIHM2bS1saW5rXCI+SGV4YXBsaSBVc2luw6k8L2E+XHJcbiAgPGEgZGF0YS1wcmVkaWNhdGU9XCJkczZ3OndoYXRcIiBkYXRhLXR5cGU9XCJpbnRlcm5hbFwiIGNsYXNzPVwiczZtLXRhZy1saW5rIHM2bS1saW5rXCI+SGV4YXBsaSBNUDwvYT5cclxuICA8YSBkYXRhLXByZWRpY2F0ZT1cImRzNnc6d2hhdFwiIGRhdGEtdHlwZT1cImludGVybmFsXCIgY2xhc3M9XCJzNm0tdGFnLWxpbmsgczZtLWxpbmtcIj5MYW13b29kPC9hPlxyXG4gIDwvZW0+PC9wPlxyXG4gIDxwPjxzdHJvbmc+VHlwZSBkZSBCw6J0aW1lbnQgOjwvc3Ryb25nPjxlbT5cclxuICA8YSBkYXRhLXByZWRpY2F0ZT1cImRzNnc6d2hhdFwiIGRhdGEtdHlwZT1cImludGVybmFsXCIgY2xhc3M9XCJzNm0tdGFnLWxpbmsgczZtLWxpbmtcIj5Mb2dlbWVudHM8L2E+IFxyXG4gIDxhIGRhdGEtcHJlZGljYXRlPVwiZHM2dzp3aGF0XCIgZGF0YS10eXBlPVwiaW50ZXJuYWxcIiBjbGFzcz1cInM2bS10YWctbGluayBzNm0tbGlua1wiPkJVUDwvYT4gXHJcbiAgPGEgZGF0YS1wcmVkaWNhdGU9XCJkczZ3OndoYXRcIiBkYXRhLXR5cGU9XCJpbnRlcm5hbFwiIGNsYXNzPVwiczZtLXRhZy1saW5rIHM2bS1saW5rXCI+RVJQPC9hPiBcclxuICA8YSBkYXRhLXByZWRpY2F0ZT1cImRzNnc6d2hhdFwiIGRhdGEtdHlwZT1cImludGVybmFsXCIgY2xhc3M9XCJzNm0tdGFnLWxpbmsgczZtLWxpbmtcIj5QbGF0ZWZvcm1lIExvZ2lzdGlxdWU8L2E+IFxyXG4gIDwvZW0+PC9wPlxyXG4gIDxwPjxzdHJvbmc+RXNzZW5jZSA6PC9zdHJvbmc+IDxlbT5cclxuICA8YSBkYXRhLXByZWRpY2F0ZT1cImRzNnc6aG93XCIgZGF0YS10eXBlPVwiaW50ZXJuYWxcIiBjbGFzcz1cInM2bS10YWctbGluayBzNm0tbGlua1wiPkRPVUdMQVM8L2E+IFxyXG4gIDxhIGRhdGEtcHJlZGljYXRlPVwiZHM2dzpob3dcIiBkYXRhLXR5cGU9XCJpbnRlcm5hbFwiIGNsYXNzPVwiczZtLXRhZy1saW5rIHM2bS1saW5rXCI+UElOPC9hPiBcclxuICA8YSBkYXRhLXByZWRpY2F0ZT1cImRzNnc6aG93XCIgZGF0YS10eXBlPVwiaW50ZXJuYWxcIiBjbGFzcz1cInM2bS10YWctbGluayBzNm0tbGlua1wiPk1JWFRFPC9hPiBcclxuICA8YSBkYXRhLXByZWRpY2F0ZT1cImRzNnc6aG93XCIgZGF0YS10eXBlPVwiaW50ZXJuYWxcIiBjbGFzcz1cInM2bS10YWctbGluayBzNm0tbGlua1wiPkVQSUNFQTwvYT4gXHJcbiAgPC9lbT48L3A+XHJcbiAgPHA+PHN0cm9uZz5RdWFsaXTDqSA6IDwvc3Ryb25nPjxlbT5cclxuICA8YSBkYXRhLXByZWRpY2F0ZT1cImRzNnc6aG93XCIgZGF0YS10eXBlPVwiaW50ZXJuYWxcIiBjbGFzcz1cInM2bS10YWctbGluayBzNm0tbGlua1wiPk5WSTwvYT4gXHJcbiAgPGEgZGF0YS1wcmVkaWNhdGU9XCJkczZ3Omhvd1wiIGRhdGEtdHlwZT1cImludGVybmFsXCIgY2xhc3M9XCJzNm0tdGFnLWxpbmsgczZtLWxpbmtcIj5WSTFGPC9hPiBcclxuICA8YSBkYXRhLXByZWRpY2F0ZT1cImRzNnc6aG93XCIgZGF0YS10eXBlPVwiaW50ZXJuYWxcIiBjbGFzcz1cInM2bS10YWctbGluayBzNm0tbGlua1wiPlZJMkY8L2E+IFxyXG4gIDwvZW0+PHN0cm9uZz48L3N0cm9uZz48L3A+XHJcbiAgPHA+PHN0cm9uZz5UcmFpdGVtZW50IDogPC9zdHJvbmc+PGVtPlxyXG4gIDxhIGRhdGEtcHJlZGljYXRlPVwiZHM2dzpob3dcIiBkYXRhLXR5cGU9XCJpbnRlcm5hbFwiIGNsYXNzPVwiczZtLXRhZy1saW5rIHM2bS1saW5rXCI+UEFSS0E8L2E+IFxyXG4gIDxhIGRhdGEtcHJlZGljYXRlPVwiZHM2dzpob3dcIiBkYXRhLXR5cGU9XCJpbnRlcm5hbFwiIGNsYXNzPVwiczZtLXRhZy1saW5rIHM2bS1saW5rXCI+Q1QyPC9hPiBcclxuICA8L2VtPjwvcD5cclxuICA8cD48c3Ryb25nPlR5cGUgZGUgUGFyb2kgOiA8L3N0cm9uZz48ZW0+XHJcbiAgPGEgZGF0YS1wcmVkaWNhdGU9XCJkczZ3OndoYXRcIiBkYXRhLXR5cGU9XCJpbnRlcm5hbFwiIGNsYXNzPVwiczZtLXRhZy1saW5rIHM2bS1saW5rXCI+TXVycyBJbnTDqXJpZXVyczwvYT4gXHJcbiAgPGEgZGF0YS1wcmVkaWNhdGU9XCJkczZ3OndoYXRcIiBkYXRhLXR5cGU9XCJpbnRlcm5hbFwiIGNsYXNzPVwiczZtLXRhZy1saW5rIHM2bS1saW5rXCI+TXVycyBFeHTDqXJpZXVyczwvYT4gXHJcbiAgPGEgZGF0YS1wcmVkaWNhdGU9XCJkczZ3OndoYXRcIiBkYXRhLXR5cGU9XCJpbnRlcm5hbFwiIGNsYXNzPVwiczZtLXRhZy1saW5rIHM2bS1saW5rXCI+UGxhbmNoZXJzPC9hPiBcclxuICA8YSBkYXRhLXByZWRpY2F0ZT1cImRzNnc6d2hhdFwiIGRhdGEtdHlwZT1cImludGVybmFsXCIgY2xhc3M9XCJzNm0tdGFnLWxpbmsgczZtLWxpbmtcIj5Db3V2ZXJ0dXJlPC9hPiBcclxuICA8L2VtPjwvcD5cclxuICA8cD48ZW0+XHJcbiAgPGEgZGF0YS1wcmVkaWNhdGU9XCJkczZ3OndoYXRcIiBkYXRhLXR5cGU9XCJpbnRlcm5hbFwiIGNsYXNzPVwiczZtLXRhZy1saW5rIHM2bS1saW5rXCI+RXRhbmNow6lpdMOpIEFjY2Vzc2libGU8L2E+IFxyXG4gIDxhIGRhdGEtcHJlZGljYXRlPVwiZHM2dzp3aGF0XCIgZGF0YS10eXBlPVwiaW50ZXJuYWxcIiBjbGFzcz1cInM2bS10YWctbGluayBzNm0tbGlua1wiPkV0YW5jaMOpaXTDqSBOb24tQWNjZXNzaWJsZTwvYT4gXHJcbiAgPC9lbT48L3A+XHJcbiAgPHA+PHN0cm9uZz5IYXV0ZXVyIERlcm5pZXIgUGxhbmNoZXIgOjwvc3Ryb25nPjxlbT48c3Ryb25nPiA8L3N0cm9uZz4gXHJcbiAgPGEgZGF0YS1wcmVkaWNhdGU9XCJkczZ3Omhvd1wiIGRhdGEtdHlwZT1cImludGVybmFsXCIgY2xhc3M9XCJzNm0tdGFnLWxpbmsgczZtLWxpbmtcIj5IYXV0ZXVyICZsdDs4bTwvYT4gXHJcbiAgPGEgZGF0YS1wcmVkaWNhdGU9XCJkczZ3Omhvd1wiIGRhdGEtdHlwZT1cImludGVybmFsXCIgY2xhc3M9XCJzNm0tdGFnLWxpbmsgczZtLWxpbmtcIj44bSZsdDsgSGF1dGV1ciAmbHQ7MjhtPC9hPiBcclxuICA8YSBkYXRhLXByZWRpY2F0ZT1cImRzNnc6aG93XCIgZGF0YS10eXBlPVwiaW50ZXJuYWxcIiBjbGFzcz1cInM2bS10YWctbGluayBzNm0tbGlua1wiPjI4bSZsdDsgSGF1dGV1ciAmbHQ7NTBtPC9hPiBcclxuICA8L2VtPjwvcD5cclxuICA8aDI+PGJyIC8+PC9oMj5cclxuICA8aDI+PHU+RVFVSVBFIFBJVkVURUFVIDo8L3U+PC9oMj5cclxuICA8dGFibGUgYm9yZGVyPVwiMVwiPlxyXG4gIDx0Ym9keT5cclxuICA8dHI+PHRkPjxzdHJvbmc+Q2hhcmfDqSBkJiMzOTtBZmZhaXJlczwvc3Ryb25nPjwvdGQ+PHRkPjxiciAvPjwvdGQ+PC90cj5cclxuICA8dHI+PHRkPjxzdHJvbmc+U2VydmljZSDDqXR1ZGVzIGRlIHByaXg8L3N0cm9uZz48L3RkPjx0ZD48YnIgLz48L3RkPjwvdHI+XHJcbiAgPC90Ym9keT48L3RhYmxlPlxyXG4gIDxwPlxyXG4gIDwvcD5gO1xyXG4gICAgcmV0dXJuIG1lc3NhZ2U7XHJcbiAgfSBlbHNlIHtcclxuICAgIHJldHVybiB0eHQ7XHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCB7IF9odHRwQ2FsbEF1dGhlbnRpY2F0ZWQgfSBmcm9tIFwiLi4vLi4vbWFpbi8zZGV4cGVyaWVuY2VfYXBpXCI7XHJcbmltcG9ydCB7IF8zRFN3eW1fZ2V0X3ZlcnNpb24gfSBmcm9tIFwiLi4vM2Rzd3ltX2FwaS5qc1wiO1xyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIExhIGZvbmN0aW9uIGBfM0RTd3ltX2dldF9jdXJyZW50VXNlcmAgZXN0IHV0aWxpc8OpZSBwb3VyIHLDqWN1cMOpcmVyIGRlcyBpbmZvcm1hdGlvbnMgc3VyIGwndXRpbGlzYXRldXIgYWN0dWVsIGRhbnMgdW5lIHBsYXRlZm9ybWUgM0RFeHBlcmllbmNlLlxyXG4gKlxyXG4gKiBAcGFyYW0ge09iamVjdH0gY3JlZGVudGlhbHMgLSBVbiBvYmpldCBjb250ZW5hbnQgbGVzIGluZm9ybWF0aW9ucyBkJ2lkZW50aWZpY2F0aW9uIHJlcXVpc2VzIHBvdXIgYXV0aGVudGlmaWVyIGxhIGRlbWFuZGUuIElsIGluY2x1dCBnw6luw6lyYWxlbWVudCBkZXMgcHJvcHJpw6l0w6lzIHRlbGxlcyBxdWUgwqsgdG9rZW4gwrssIMKrIHNwYWNlIMK7LCDCqyB0ZW5hbnQgwrsgZXQgwqsgY3R4IMK7LlxyXG4gKlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMuc3BhY2UgLSAoM0RTd3ltKSBMJ1VSTCBkdSBzZXJ2ZXVyIHN1ciBsZXF1ZWwgbCdBUEkgZXN0IGTDqXBsb3nDqWUuKGV4OiAzRFNwYWNlID0+KGh0dHBzOi8vcjExMzIxMDA5Njg0NDctZXUxLXNwYWNlLjNkZXhwZXJpZW5jZS4zZHMuY29tL2Vub3ZpYSksIDNEU3d5bSwgM0RDb21wYXNzLi4uKSwgQXR0ZW50aW9uIGljaSBsZSBzcGFjZSBwcmVuZCBiaWVuIGxlIDNEU3d5bVxyXG4gKlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25Eb25lXSAtIExlIHBhcmFtw6h0cmUgYG9uRG9uZWAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgbG9yc3F1ZSBsJ2FwcGVsXHJcbiAqIEFQSSByw6l1c3NpdCBldCBxdWUgbGVzIGluZm9ybWF0aW9ucyB1dGlsaXNhdGV1ciBzb250IHLDqWN1cMOpcsOpZXMuIElsIHByZW5kIHVuIGFyZ3VtZW50LCBxdWkgZXN0XHJcbiAqIGwnb2JqZXQgZCdpbmZvcm1hdGlvbnMgdXRpbGlzYXRldXIuXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkVycm9yXSAtIExlIHBhcmFtw6h0cmUgYG9uRXJyb3JgIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIHMnaWwgeSBhIHVuZVxyXG4gKiBlcnJldXIgbG9ycyBkZSBsJ2FwcGVsIGRlIGwnQVBJLiBJbCBwcmVuZCB1biBwYXJhbcOodHJlLCBxdWkgZXN0IGxhIHLDqXBvbnNlIGQnZXJyZXVyIGRlIGwnQVBJLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF8zRFN3eW1fZ2V0X2N1cnJlbnRVc2VyKFxyXG4gIGNyZWRlbnRpYWxzLFxyXG4gIG9uRG9uZSA9IHVuZGVmaW5lZCxcclxuICBvbkVycm9yID0gdW5kZWZpbmVkLFxyXG4pIHtcclxuICBjb25zdCB1cmwgPSBjcmVkZW50aWFscy5zcGFjZSArIFwiL2FwaS91c2VyL2dldGN1cnJlbnQvXCI7XHJcbiAgXzNEU3d5bV9nZXRfdmVyc2lvbihcclxuICAgIGNyZWRlbnRpYWxzLFxyXG4gICAgKHRva2VuKSA9PiB7XHJcbiAgICAgIF9odHRwQ2FsbEF1dGhlbnRpY2F0ZWQodXJsLCB7XHJcbiAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxyXG4gICAgICAgIGhlYWRlcnM6IHsgXCJYLURTLVNXWU0tQ1NSRlRPS0VOXCI6IHRva2VuLnJlc3VsdC5TZXJ2ZXJUb2tlbiB9LFxyXG4gICAgICAgIG9uQ29tcGxldGUocmVzcG9uc2UsIGhlYWRlcnMsIHhocikge1xyXG4gICAgICAgICAgY29uc3QgaW5mbyA9IEpTT04ucGFyc2UocmVzcG9uc2UpO1xyXG4gICAgICAgICAgaWYgKG9uRG9uZSkgb25Eb25lKGluZm8ucmVzdWx0KTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBvbkZhaWx1cmUocmVzcG9uc2UsIGhlYWRlcnMsIHhocikge1xyXG4gICAgICAgICAgY29uc3QgaW5mb3MgPSB7IHJlc3BvbnNlLCBoZWFkZXJzLCB4aHIgfTtcclxuICAgICAgICAgIGlmIChvbkVycm9yKSBvbkVycm9yKGluZm9zKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICAgIH0sXHJcbiAgICBvbkVycm9yLFxyXG4gICk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gTGEgZm9uY3Rpb24gYF8zRFN3eW1fZ2V0X2ZpbmRVc2VyYCBlc3QgdXRpbGlzw6llIHBvdXIgcmVjaGVyY2hlciB1biB1dGlsaXNhdGV1ciBwYXIgc29uIGlkZW50aWZpYW50XHJcbiAqIGRhbnMgdW4gZXNwYWNlIDNEU3d5bSBlbiB1dGlsaXNhbnQgbGVzIGluZm9ybWF0aW9ucyBkJ2lkZW50aWZpY2F0aW9uIGZvdXJuaWVzLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gY3JlZGVudGlhbHMgLSBVbiBvYmpldCBjb250ZW5hbnQgbGVzIGluZm9ybWF0aW9ucyBkJ2lkZW50aWZpY2F0aW9uIHJlcXVpc2VzIHBvdXIgYXV0aGVudGlmaWVyIGxhIGRlbWFuZGUuIElsIGluY2x1dCBnw6luw6lyYWxlbWVudCBkZXMgcHJvcHJpw6l0w6lzIHRlbGxlcyBxdWUgwqsgdG9rZW4gwrssIMKrIHNwYWNlIMK7LCDCqyB0ZW5hbnQgwrsgZXQgwqsgY3R4IMK7LlxyXG4gKlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMuc3BhY2UgLSAoM0RTd3ltKSBMJ1VSTCBkdSBzZXJ2ZXVyIHN1ciBsZXF1ZWwgbCdBUEkgZXN0IGTDqXBsb3nDqWUuKGV4OiAzRFNwYWNlID0+KGh0dHBzOi8vcjExMzIxMDA5Njg0NDctZXUxLXNwYWNlLjNkZXhwZXJpZW5jZS4zZHMuY29tL2Vub3ZpYSksIDNEU3d5bSwgM0RDb21wYXNzLi4uKVxyXG4gKiBAcGFyYW0ge1N0cmluZ30gdXNlckxvZ2luIC0gTGUgcGFyYW3DqHRyZSB1c2VyTG9naW4gZXN0IGxlIG5vbSBkZSBsb2dpbiBkZSBsJ3V0aWxpc2F0ZXVyIHF1ZSB2b3VzIHNvdWhhaXRlelxyXG4gKiByZXRyb3V2ZXIgZGFucyBsYSBwbGF0ZWZvcm1lIDNEU3d5bS5cclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRG9uZV0gLSBMZSBwYXJhbcOodHJlIGBvbkRvbmVgIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIGxvcnNxdWUgbCdhcHBlbFxyXG4gKiBBUEkgc2VyYSB0ZXJtaW7DqSBhdmVjIHN1Y2PDqHMuIElsIHByZW5kIHVuIGFyZ3VtZW50LCDCqyBpbmZvIMK7LCBxdWkgY29ycmVzcG9uZCBhdXggZG9ubsOpZXMgZGUgcsOpcG9uc2VcclxuICogcmVudm95w6llcyBwYXIgbCdBUEkuXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkVycm9yXSAtIExlIHBhcmFtw6h0cmUgYG9uRXJyb3JgIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIHMnaWwgeSBhIHVuZVxyXG4gKiBlcnJldXIgbG9ycyBkZSBsJ2FwcGVsIGRlIGwnQVBJLiBJbCBwcmVuZCB1biBwYXJhbcOodHJlLCBxdWkgZXN0IGxhIHLDqXBvbnNlIGQnZXJyZXVyIGRlIGwnQVBJLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF8zRFN3eW1fZ2V0X2ZpbmRVc2VyKFxyXG4gIGNyZWRlbnRpYWxzLFxyXG4gIHVzZXJMb2dpbixcclxuICBvbkRvbmUgPSB1bmRlZmluZWQsXHJcbiAgb25FcnJvciA9IHVuZGVmaW5lZCxcclxuKSB7XHJcbiAgY29uc3QgdXJsID0gY3JlZGVudGlhbHMuc3BhY2UgKyBcIi9hcGkvdXNlci9maW5kL2xvZ2luL1wiICsgdXNlckxvZ2luO1xyXG4gIF8zRFN3eW1fZ2V0X3ZlcnNpb24oXHJcbiAgICBjcmVkZW50aWFscyxcclxuICAgICh0b2tlbikgPT4ge1xyXG4gICAgICBfaHR0cENhbGxBdXRoZW50aWNhdGVkKHVybCwge1xyXG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcclxuICAgICAgICBoZWFkZXJzOiB7IFwiWC1EUy1TV1lNLUNTUkZUT0tFTlwiOiB0b2tlbi5yZXN1bHQuU2VydmVyVG9rZW4gfSxcclxuICAgICAgICBvbkNvbXBsZXRlKHJlc3BvbnNlLCBoZWFkZXJzLCB4aHIpIHtcclxuICAgICAgICAgIGNvbnN0IGluZm8gPSBKU09OLnBhcnNlKHJlc3BvbnNlKTtcclxuXHJcbiAgICAgICAgICBpZiAob25Eb25lKSBvbkRvbmUoaW5mbyk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgb25GYWlsdXJlKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgICBpZiAob25FcnJvcikgb25FcnJvcihyZXNwb25zZSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgICB9LFxyXG4gICAgb25FcnJvcixcclxuICApO1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCB7XHJcbiAgXzNEU3d5bV9nZXRfY3VycmVudFVzZXIsXHJcbiAgXzNEU3d5bV9nZXRfZmluZFVzZXIsXHJcbn07XHJcbiIsIi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gRm9uY3Rpb24gVGVzdCBwZXJtZXR0YW50IGRlIHRlc3RlciBsJ2luc3RhbGxhdGlvbiBkZSBsYSBsaWJyYWlyaWVcclxuICpcclxuICogQHBhcmFtICAge1N0cmluZ30gIF9uYW1lICB1bmUgc2ltcGxlIGNoYWluZVxyXG4gKlxyXG4gKiBAcmV0dXJuICB7U3RyaW5nfVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHNheUhlbGxvKF9uYW1lKSB7XHJcbiAgY29uc3QgbmFtZSA9IFwiSGVsbG8gXCIgKyBfbmFtZTtcclxuICBjb25zb2xlLmxvZyhuYW1lKTtcclxuICByZXR1cm4gbmFtZTtcclxufVxyXG4iXSwibmFtZXMiOlsiVVVJRCIsInV1aWQiLCJjb3VsZXVycyIsImdldENvbW11bmVzIiwiY3AiLCJvbkRvbmUiLCJvbkVycm9yIiwiY29kZVBvc3RhbCIsInJlc3BvbnNlIiwianNvbiIsImVycm9yIiwiZmluZEFkcmVzc2UiLCJxdWVyeSIsImdldERhdGFGcm9tR291dkZyIiwiZXZlbnRzIiwiY29sb3JzIiwieWVhciIsIkRhdGVUaW1lIiwibG9hZGVkRXZlbnRzIiwic29ydGVkRGF0YSIsImZvcm1hdERhdGEiLCJkYXRlIiwiaSIsImRhdGEiLCJlYWNoIiwiZXZlbnQiLCJ1cGRhdGVFdmVudCIsImFkZCIsImluZGV4IiwidmFsIiwiYSIsImIiLCJfaHR0cENhbGxBdXRoZW50aWNhdGVkIiwidXJsIiwib3B0aW9ucyIsInJlcXVpcmVqcyIsIldBRkRhdGEiLCJfc2V0RHJhZ2dhYmxlIiwiZWxlbSIsInN0ckRhdGEiLCJvbkRyYWciLCJEYXRhRHJhZ0FuZERyb3AiLCJfc2V0dXBUYWdnZXIiLCJ0YWdzIiwib25UYWdnZXJGaWx0ZXIiLCJUYWdOYXZpZ2F0b3JQcm94eSIsInRhZ2dlclByb3h5Iiwid2lkZ2V0IiwiX3NldERyb3BwYWJsZSIsImRyb3AiLCJfZ2V0UGxhdGZvcm1TZXJ2aWNlcyIsInBsYXRmb3JtSWQiLCJvbkNvbXBsZXRlIiwib25GYWlsdXJlIiwiaTNEWENvbXBhc3NTZXJ2aWNlcyIsIl9nZXRQbGF0ZWZvcm1JbmZvcyIsInJldG91ckFQSSIsInBsQVBJIiwidGVuYW50IiwidXNlciIsImFwcHNDb25maWd1cmF0aW9uIiwiYXBwQ29uZiIsImNvbXBhc3NfZ2V0TGlzdEFkZGl0aW9uYWxBcHBzIiwiY3JlZGVudGlhbHMiLCJVUkwiLCJoZWFkZXJzIiwieGhyIiwiaW5mbyIsImZvcm1hdGVkSW5mb3MiLCJhcHAiLCJuYW1lIiwiaWQiLCJfQXBwTW5ndF9nZXRfdXNlcnMiLCJfQXBwTW5ndF9nZXRfaW5mb191c2VyIiwidG9wSGVhZGVyIiwiY3JlYXRlVXNlckdyb3VwcyIsImRhdGFzIiwic3BhY2UiLCJjdXJyZW50VXNlciIsInRlbXBsYXRlRGF0YSIsImVyciIsImdldENvbXBsZW1lbnRVRyIsInVyaSIsImJhc2VVUkwiLCJVUkkiLCJPUFRzIiwiZ2V0VXNlcnNHcm91cFJ1bGVzIiwiT1BUUyIsIk9QVHNIIiwiZ2V0VXNlckdyb3Vwc0xpc3QiLCJvcHRzIiwicmVwVUciLCJyZXBvbnNlIiwiVUciLCJlbGVtZW50IiwiaWFtT3duZXIiLCJpYW1NZW1iZXIiLCJpYW0iLCJydWxlcyIsImRlbGV0ZVVzZXJHcm91cHMiLCJwYXRjaFVzZXJHcm91cHMiLCJkYXRhTWVtYmVycyIsImRhdGFNZW1iZXJzU1RSIiwicGF0Y2hVc2VyR3JvdXBzQ29udHJvbCIsIl9kYXRhcyIsInJlYWRVc2VyR3JvdXBDb250cm9sIiwiX3JlcCIsIl8zRFNwYWNlX2dldF9kb2NJbmZvIiwiZG9jaWQiLCJfM0RTcGFjZSIsIl8zRFNwYWNlX2dldF9jc3JmIiwiXzNEU3BhY2VfY3NyZiIsIl8zRFNwYWNlX2ZpbGVfdXJsIiwiZmlsZV91cmwiLCJoZWFkIiwiXzNEU3BhY2VfZmlsZV91cmxfY3NyIiwiY3NyIiwiXzNEU3BhY2VfZmlsZV91cGRhdGUiLCJkb2NJZCIsImZpbGVJZCIsImZpbGVuYW1lIiwiXzNEU3BhY2VfZmlsZV91cGRhdGVfY3NyIiwiZm9ybURhdGEiLCJ0ZW1wSWQiLCJfM0RTcGFjZV9DcmVhdGVfRG9jIiwiZGVzYyIsIl9zcGFjZSIsImN0eCIsImpzb25GaWxlIiwidXJscyIsInRpY2tldCIsImhhbmRsZVN1Y2Nlc3MiLCJoYW5kbGVFcnJvciIsIl8zRFNwYWNlX2dldF9zZWN1cml0eUNvbnRleHRzIiwiY3MiLCJyb2xlIiwib3JnYW5pemF0aW9uIiwiY29udGV4dHMiLCJjb250ZXh0IiwiZmluYWxDcyIsImZpbmFsT3JnIiwiZmluYWxSb2xlIiwib0NTIiwiZSIsImNvdXBsZXMiLCJ2YWx1ZSIsInNlbGYiLCJ0IiwiciIsImRlZmluZVNpbmdsZUl0ZW0iLCJjb3VwbGUiLCJfM0RTcGFjZV9kb3dubG9hZF9kb2MiLCJtZXNzYWdlIiwib2JqZWN0SWQiLCJyZXN1bHQiLCJfM0RTcGFjZV9kb3dubG9hZF9tdWx0aWRvYyIsIm9iamVjdElkcyIsImxpc3REaXYiLCJjaHVuayIsImxvb3AiLCJfM0RTcGFjZV9nZXRfZG93bmxvYWRUaWNrZXRfbXVsdGlkb2MiLCJkb25lIiwib25OZXh0IiwiY29tcGlsRGF0YSIsImZpbGVOYW1lIiwiZmlsZVVybCIsIl8zRFNwYWNlX2xpZmVjeWNsZV9nZXROZXh0U3RhdGVzIiwiXzNEU3BhY2VfbGlmZWN5Y2xlX2NoYW5nZVN0YXRlIiwibmV4dFN0YXRlIiwiXzNEU3BhY2VfbGlmZWN5Y2xlX2dldEdyYXBoIiwiXzNEU3BhY2VfbGlmZWN5Y2xlX2dldE5leHRSZXZpc2lvbiIsIl8zRFNwYWNlX2xpZmVjeWNsZV9jaGFuZ2VSZXZpc2lvbiIsIm5leHRSZXZpc2lvbiIsImdldENTUkZUb2tlbiIsImdldEFsbENvbnRleHRTZWN1cml0eSIsInJlcCIsImdldERhdGFGcm9tM0RTcGFjZSIsIndpZGdldFByZWZlcmVuY2UiLCJnZXREb3dubG9hZERvY3VtZW50IiwicHVzaERhdGFJbjNEU3BhY2UiLCJkYXRhQmFzZSIsImxpc3RPYmplY3RJZCIsIm1peGVkRGF0YXMiLCJnZXRfM0RTcGFjZV9jc3JmIiwiZ2V0RGF0YXNCeVRlbmFudCIsImdldERhdGFzRnJvbTNEU3BhY2UiLCJiYmRzIiwib2JqIiwiYWZmIiwiZGF0YU1peGluZyIsImNvcHlEYXRhIiwib2JqSURURVNUMyIsInNvdXJjZXNTZWFyY2hpbmciLCJsaXN0UHJlZGljYXRlcyIsIm9ialRvVGFnIiwiYWRkVGFnVG9Eb2MiLCJvYmpJZCIsInByZWQiLCJ0YWciLCJkYXRhVGVzdCIsImRvY05hbWUiLCJkb2NFeHQiLCJjcmVhdGVCeSIsImdldEFjdHVhbFRhZ3NPbkRvYyIsIm5vbUZpY2hpZXIiLCJkYXRhUGF0dGVybiIsInJlbW92ZVRhZ1RvRG9jIiwiZ2V0SW5mb0RvY1RhZ3MiLCJzdHIiLCJoZWFkZXIiLCJfM0RTd3ltX2dldF92ZXJzaW9uIiwidG9rZW5JbmZvIiwiXzNEU3d5bV9nZXRBbGxOZXdzIiwidG9rZW4iLCJfM0RTd3ltX2dldEZhbWlsaWFyUGVvcGxlIiwiX2RhdGEiLCJteUNvbnRhY3RzIiwiY29udGFjdCIsIl8zRFN3aW1fZ2V0QWxsQ29tbXVuaXRpZXMiLCJjb21tdW5hdXRlcyIsIl9jb21tdW5pdGllc0luZm8iLCJjb3VudCIsImNvbW11IiwiX2NvbW11bmF1dGUiLCJfM0RTd2ltX2dldE1lbWJlcnNDb21tdW5pdHkiLCJpZENvbW11IiwiXzNEU3d5bV9nZXRJZGVhU3RhdHVzTWF0dXJpdHkiLCJjb21tdUlEIiwiXzNEU3d5bV9idWlsZERpcmVjdE1lc3NhZ2UiLCJsaXN0QWxsQ29udGFjdHMiLCJfVVJMIiwiTVNHRGF0YSIsImZvcm1hdGVkTWVzc2FnZSIsIm90aGVyQ29tbXVuaXR5IiwiXzNEU3d5bV9maW5kQ29tbXVuaXR5VG9JbnN0YW50TVNHIiwiXzNEU3d5bV9zZW5kTWVzc2FnZURhdGEiLCJpbmZvU29ydGVkQnlMZW5ndGhzIiwiY29tIiwic29ydGVkRGF0YXMiLCJsb2dpbnMiLCJjb250ZW50IiwiX2RhdGVzIiwidGltZSIsIl8zRFN3eW1fcG9zdElkZWEiLCJmaW5kQnlJRCIsImZpbmRCeVRpdGxlIiwiZm9ybWF0ZWREYXRhIiwidGVtcGxhdGVBZmZhaXJlTWVzc2FnZSIsIl8zRFN3eW1fZGVsZXRlSWRlYSIsIl8zRFN3eW1fZ2V0U1dZTUlkZWEiLCJpZFBvc3QiLCJ0ZW1wbGF0ZUlkZWFJZCIsIl8zRFN3eW1fZ2V0X0FsbFNXWU1JZGVhcyIsInR4dCIsIl8zRFN3eW1fZ2V0X2N1cnJlbnRVc2VyIiwiXzNEU3d5bV9nZXRfZmluZFVzZXIiLCJ1c2VyTG9naW4iLCJzYXlIZWxsbyIsIl9uYW1lIl0sIm1hcHBpbmdzIjoiaWFBTU8sU0FBU0EsR0FBTyxDQUNyQixPQUFPQyxFQUFJLEdBQUEsQ0FDYixDQ1BZLE1BQUNDLEVBQVcsQ0FDdEIsV0FBWSxVQUNaLGVBQWdCLFVBQ2hCLGVBQWdCLFVBQ2hCLGdCQUFpQixVQUNqQixjQUFlLFVBQ2YsY0FBZSxVQUNmLGNBQWUsVUFDZixlQUFnQixVQUNoQixlQUFnQixVQUNoQixlQUFnQixVQUNoQixlQUFnQixVQUNoQixvQkFBcUIsVUFDckIsb0JBQXFCLFVBQ3JCLG9CQUFxQixVQUNyQixxQkFBc0IsVUFDdEIscUJBQXNCLFVBQ3RCLHFCQUFzQixVQUN0QixxQkFBc0IsVUFDdEIsVUFBVyxVQUNYLFFBQVMsVUFDVCxRQUFT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
79
+ //# sourceMappingURL=wb3Api.umd.cjs.map