Socket
Socket
Sign inDemoInstall

@nodesuite/process

Package Overview
Dependencies
Maintainers
1
Versions
55
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@nodesuite/process - npm Package Compare versions

Comparing version 0.1.11 to 0.1.12

12

.rush/temp/package-deps_build_prod.json

@@ -5,7 +5,7 @@ {

"libraries/process/.eslintrc.js": "da8f1d5b00175fe9df49681a80b909d918ac6736",
"libraries/process/CHANGELOG.json": "00b6b00157301935396946ab25a3eaab16e74959",
"libraries/process/CHANGELOG.md": "3651a607c0fa85a5e23e7f8051d67dfc9bf9ae50",
"libraries/process/CHANGELOG.json": "966af5dce37c88182f4472674dbc255625feca21",
"libraries/process/CHANGELOG.md": "6628c02a97c4aa1e34a0faee49b326145fbdcabe",
"libraries/process/README.md": "7ccf2c0f3dd5c464ba236834650e60f378ba6bba",
"libraries/process/config/rig.json": "54137d20557298060eb70cf9e72e9ce1c7b7e130",
"libraries/process/package.json": "3e081baeb1e63c0b42e8a4aab80ef53fe9a3b67d",
"libraries/process/package.json": "bf8c36bfac2a26752c0ac75d3941b2ce57f0e910",
"libraries/process/src/core/exec.ts": "914b376a510f77905337efe6633aeb53c6538731",

@@ -16,3 +16,3 @@ "libraries/process/src/core/index.ts": "9e1418a405052d3046ea619c79cc271da681d310",

"libraries/process/src/core/manager.ts": "605cbe19fbe6658b15960cecdcba0f9d3c01a3c5",
"libraries/process/src/core/spawn.ts": "aeac1c2ae7796a015fe380812964703ad0f8800d",
"libraries/process/src/core/spawn.ts": "65ab576a86967970cc782f84fb91b5217baca00c",
"libraries/process/src/errors/index.ts": "50982ed061f2021d73fc30f95e626f7695aa704d",

@@ -29,5 +29,5 @@ "libraries/process/src/errors/message-timeout.error.ts": "cfd8f48f752f484aeae72aa6dd744c0b7998896e",

"libraries/process/src/promises/index.ts": "a38afa14be19a3632a7974566cfbc03696b2e192",
"libraries/process/src/promises/message.ts": "8d25675b89863fa75e501d8201933f78f8440160",
"libraries/process/src/promises/message.ts": "152e08a79f2ec39272f407cbf801c46f09d49ee3",
"libraries/process/src/promises/open.ts": "fd7c53cbee154f753e8d91f390bb5d7433703856",
"libraries/process/src/support/configure.ts": "e70aa0d741637ad9a650c97620c6283f33a8785d",
"libraries/process/src/support/configure.ts": "e8d43d25e7f9d0edb5015fdab104309dd07cbfe8",
"libraries/process/src/support/delay.ts": "aa87c9aa7e152d41bd6fe6aa79ef38f9cea4a289",

@@ -34,0 +34,0 @@ "libraries/process/src/support/index.ts": "792252b94592ab205683d321d2fdba5db95962e1",

@@ -5,7 +5,7 @@ {

"libraries/process/.eslintrc.js": "da8f1d5b00175fe9df49681a80b909d918ac6736",
"libraries/process/CHANGELOG.json": "00b6b00157301935396946ab25a3eaab16e74959",
"libraries/process/CHANGELOG.md": "3651a607c0fa85a5e23e7f8051d67dfc9bf9ae50",
"libraries/process/CHANGELOG.json": "966af5dce37c88182f4472674dbc255625feca21",
"libraries/process/CHANGELOG.md": "6628c02a97c4aa1e34a0faee49b326145fbdcabe",
"libraries/process/README.md": "7ccf2c0f3dd5c464ba236834650e60f378ba6bba",
"libraries/process/config/rig.json": "54137d20557298060eb70cf9e72e9ce1c7b7e130",
"libraries/process/package.json": "3e081baeb1e63c0b42e8a4aab80ef53fe9a3b67d",
"libraries/process/package.json": "bf8c36bfac2a26752c0ac75d3941b2ce57f0e910",
"libraries/process/src/core/exec.ts": "914b376a510f77905337efe6633aeb53c6538731",

@@ -16,3 +16,3 @@ "libraries/process/src/core/index.ts": "9e1418a405052d3046ea619c79cc271da681d310",

"libraries/process/src/core/manager.ts": "605cbe19fbe6658b15960cecdcba0f9d3c01a3c5",
"libraries/process/src/core/spawn.ts": "aeac1c2ae7796a015fe380812964703ad0f8800d",
"libraries/process/src/core/spawn.ts": "65ab576a86967970cc782f84fb91b5217baca00c",
"libraries/process/src/errors/index.ts": "50982ed061f2021d73fc30f95e626f7695aa704d",

@@ -29,5 +29,5 @@ "libraries/process/src/errors/message-timeout.error.ts": "cfd8f48f752f484aeae72aa6dd744c0b7998896e",

"libraries/process/src/promises/index.ts": "a38afa14be19a3632a7974566cfbc03696b2e192",
"libraries/process/src/promises/message.ts": "8d25675b89863fa75e501d8201933f78f8440160",
"libraries/process/src/promises/message.ts": "152e08a79f2ec39272f407cbf801c46f09d49ee3",
"libraries/process/src/promises/open.ts": "fd7c53cbee154f753e8d91f390bb5d7433703856",
"libraries/process/src/support/configure.ts": "e70aa0d741637ad9a650c97620c6283f33a8785d",
"libraries/process/src/support/configure.ts": "e8d43d25e7f9d0edb5015fdab104309dd07cbfe8",
"libraries/process/src/support/delay.ts": "aa87c9aa7e152d41bd6fe6aa79ef38f9cea4a289",

@@ -34,0 +34,0 @@ "libraries/process/src/support/index.ts": "792252b94592ab205683d321d2fdba5db95962e1",

@@ -5,2 +5,8 @@ {

{
"version": "0.1.12",
"tag": "@nodesuite/process_v0.1.12",
"date": "Sat, 17 Sep 2022 08:55:36 GMT",
"comments": {}
},
{
"version": "0.1.11",

@@ -7,0 +13,0 @@ "tag": "@nodesuite/process_v0.1.11",

# Change Log - @nodesuite/process
This log was last generated on Sat, 17 Sep 2022 08:48:05 GMT and should not be manually modified.
This log was last generated on Sat, 17 Sep 2022 08:55:36 GMT and should not be manually modified.
## 0.1.12
Sat, 17 Sep 2022 08:55:36 GMT
_Version update only_
## 0.1.11

@@ -6,0 +11,0 @@ Sat, 17 Sep 2022 08:48:05 GMT

@@ -405,3 +405,3 @@ import Node, { ForkOptions as ForkOptions$1, SpawnOptions as SpawnOptions$1, ExecOptions as ExecOptions$1, StdioOptions } from 'node:child_process';

*/
declare const spawn: (command: string, args?: string[], options?: SpawnOptions) => Promise<ChildProcess>;
declare const spawn: (command: string, args?: string[], { filters, ...options }?: SpawnOptions) => Promise<ChildProcess>;

@@ -408,0 +408,0 @@ /**

@@ -15,5 +15,5 @@ 'use strict';

var T=class extends Error{constructor(o,r){super(`Message listener on child process "${o}" timed out after ${r}ms.`);this.command=o,this.timeout=r;}};var I=class extends Error{constructor(o,r){super(`Open state listener on child process "${o}" timed out after ${r}ms.`);this.command=o,this.timeout=r;}};var P=class extends Error{constructor(o,r){super(`Encountered an error while configuring child process: ${JSON.stringify(o)}`,{cause:r});this.config=o;}};var y=class extends Error{constructor(o,r){super(`Encountered an error executing child process ${o}: ${r}`);this.command=o;}};var f=class extends Error{constructor(o="at unspecified executable path"){super(`Encountered an error spawning child process ${o}.`);this.command=o;}};var k=class extends Error{constructor(o,r){super(`Encountered an error spawning child process ${o}: ${r}`);this.command=o;}};var N=class extends Error{constructor(o,r){super(`Encountered an error killing child process ${o}: ${r.message}`,{cause:r});this.command=o,this.error=r;}};var C=e=>{try{let t=(n="",d=[])=>[...[n,...d].map(a=>a.trim()).filter(a=>!!a)],o=(n={})=>({...process.env,...n}),r=n=>({...n,stdio:n.stdio??[process.stdin,"pipe","pipe"],env:o(n.env)}),i=t(e.command,e.args),s=r(e.options);return {args:i,options:s}}catch(t){throw new P(e,t)}};var _=e=>new Promise(t=>setTimeout(t,e));var V=util.promisify(child_process.exec),D=child_process.spawn,Oo=child_process.fork;var Co=async(e,t=[],o={})=>{let r=C({command:e,args:t,options:o}),{stdout:i,stderr:s}=await V(r.args.join(" "),r.options);if(s)throw new y(e,s);return i??""};var [m,E,z,p,R,j,G,O]=["close","data","disconnect","error","exit","message","open","spawn"],Go=[m,E,z,p,R,j,G,O],_o=[m,R];var [J,b,Z,Q]=["exec","spawn","fork","kill"],ho=[J,b,Z,Q];var [q,ee,oe,re,te]=["string","object","number","boolean","bigint"],vo=[q,ee,oe,re,te];var [se,ne,ie,pe,ce,me,de,Se,Ee,ae,le,fe,ue,Oe,xe,ge,Te,Ie,Pe,ye,x,Ne,Ce,Re,Ge,_e,be,he,we,ve,Le,Ae,ke,Ve,De,Ue]=["SIGALRM","SIGBUS","SIGCHLD","SIGCONT","SIGFPE","SIGHUP","SIGILL","SIGINT","SIGIO","SIGIOT","SIGKILL","SIGPIPE","SIGPOLL","SIGPROF","SIGPWR","SIGQUIT","SIGSEGV","SIGSTKFLT","SIGSTOP","SIGSYS","SIGTERM","SIGTRAP","SIGTSTP","SIGTTIN","SIGTTOU","SIGUNUSED","SIGURG","SIGUSR1","SIGUSR2","SIGVTALRM","SIGWINCH","SIGXCPU","SIGXFSZ","SIGBREAK","SIGLOST","SIGINFO"],Ao=[se,ne,ie,pe,ce,me,de,Se,Ee,ae,le,fe,ue,Oe,xe,ge,Te,Ie,Pe,ye,x,Ne,Ce,Re,Ge,_e,be,he,we,ve,Le,Ae,ke,Ve,De,Ue];var [h,w,Fe,v]=["opening","opened","closing","closed"],Vo=[h,w,Fe,v];var [Me,$e,Be,Ke,We]=["overlapped","pipe","ignore","inherit","ipc"],Uo=[Me,$e,Be,Ke,We],[He,Xe,Ye,Fo]=["stdin","stdout","stderr","stdio"],Mo=[He],$o=[Xe,Ye];var Ko=e=>typeof e=="object"&&!!e&&Object.keys(e).includes("cmd");var ir=async(e,t={})=>{try{let{timeout:o,event:r,signal:i}={timeout:5e3,event:R,signal:x,...t};if(e.killed)return;if(e.killing)return Promise.race([e.killing,_(o)]);e.killing=Promise.race([new Promise(s=>{for(let n=0;n<100;n++)e.killed&&s();}),new Promise((s,n)=>{e.once(r,()=>{s();}),e.once(p,()=>{n();}),e.kill(i),e.killed&&s();}),_(o)]),await e.killing,e.removeAllListeners();}catch(o){throw new N(e.command,o)}};var U=e=>()=>new Promise((t,o)=>{e.killed&&t({code:void 0,signal:e.signalCode??void 0}),e.once(m,(r,i)=>{t({code:r,signal:i});}),e.once(p,r=>{o({error:r});});});var F=(e,t)=>(o,r=9e4)=>new Promise((i,s)=>{var S,g;let n=setTimeout(()=>{let l=new T(t??e.pid,r);console.warn(l.message),s(l);},r),d=(l,u)=>{s({code:l,signal:u});},a=l=>{s({error:l});},c=l=>{var L,A;let u=l.toString().trim();!o(u)||(clearTimeout(n),console.debug("Matched awaited message from child process.",u),(L=e.stdout)==null||L.off(E,c),(A=e.stderr)==null||A.off(E,c),e.off(m,d),e.off(p,a),i(u));};(S=e.stdout)==null||S.on(E,c),(g=e.stderr)==null||g.on(E,c),e.once(m,d),e.once(p,a);});var M=(e,t)=>async o=>new Promise((r,i)=>{e.pid&&r(),e.killed&&i("Cannot await open on killed process.");let s=d=>{i(d);},n=()=>{e.removeListener(p,s),r();};e.once(p,s),e.once(O,n),o&&setTimeout(()=>{let d=new I(t??e.pid,o);console.warn(d.message),i(d);},o);});var $=(e,{command:t,method:o,filters:r})=>{let i=new timer.Timer,s=Object.assign(e,{command:t,method:o,timer:i,filters:r,killing:void 0,state:h,untilOpen:M(e,t),untilClose:U(e),untilMessage:F(e,t)});s.once(O,()=>{s.state=w,console.debug(`Process "${t}" opened.`);}),s.once(m,()=>{s.state=v,console.debug(`Process "${t}" closed.`);}),s.on(p,c=>{console.debug(`Process "${t}" error: ${c.message}`),s.killed||s.kill(x);});let n=c=>{let S=c.toString().trim();return !s.filters||s.filters.every(g=>!S.includes(g))?S:void 0},d=c=>{let S=n(c);S&&process.stdout.write(`${S}
`);},a=c=>{let S=n(c);S&&process.stderr.write(`${S}
`);};return s.stdout&&s.stdout.on(E,d),s.stderr&&s.stderr.on(E,a),s};var K=class extends je__default["default"]{constructor(){super(...arguments);this.#o=defer.defer();this.#e=defer.defer();this.#r=!1;this.#t=!1;}#o;#e;#r;#t;get command(){return this._command}get pid(){return this.process().pid}process(){if(!this._process)throw new f(this.command);return this._process}untilClose(){return this.#e.untilResolved()}_setOpen(o){return this.#r?this.#o.promise:(this.once(G,()=>this.#o.resolve()),o())}_setClose(o){return this.#t?this.#e.promise:(this.once(m,()=>this.#e.resolve()),o())}_completeOpen(){if(this._process)this.emit(G),this.#o.resolve();else throw new f(this.command)}_completeClose(){if(this._process)this._process.timer.stop(),this.emit(m),this.#e.resolve(),this._process.removeAllListeners(),this.removeAllListeners();else throw new f(this.command)}};var vr=async(e,t=[],o={})=>{let r=C({args:t,options:o}),i=b,s=o.filters??[],n=$(D(e,r.args,r.options),{command:e,method:i,filters:s});return await n.untilOpen(),n};
var T=class extends Error{constructor(o,r){super(`Message listener on child process "${o}" timed out after ${r}ms.`);this.command=o,this.timeout=r;}};var I=class extends Error{constructor(o,r){super(`Open state listener on child process "${o}" timed out after ${r}ms.`);this.command=o,this.timeout=r;}};var P=class extends Error{constructor(o,r){super(`Encountered an error while configuring child process: ${JSON.stringify(o)}`,{cause:r});this.config=o;}};var y=class extends Error{constructor(o,r){super(`Encountered an error executing child process ${o}: ${r}`);this.command=o;}};var f=class extends Error{constructor(o="at unspecified executable path"){super(`Encountered an error spawning child process ${o}.`);this.command=o;}};var k=class extends Error{constructor(o,r){super(`Encountered an error spawning child process ${o}: ${r}`);this.command=o;}};var N=class extends Error{constructor(o,r){super(`Encountered an error killing child process ${o}: ${r.message}`,{cause:r});this.command=o,this.error=r;}};var C=e=>{try{let t=(n="",p=[])=>[...[n,...p].map(a=>a.trim()).filter(a=>!!a)],o=(n={})=>({...process.env,...n}),r=({stdio:n,...p})=>({...p,stdio:n??[process.stdin,"pipe","pipe"],env:o(p.env)}),i=t(e.command,e.args),s=r(e.options);return {args:i,options:s}}catch(t){throw new P(e,t)}};var _=e=>new Promise(t=>setTimeout(t,e));var V=util.promisify(child_process.exec),D=child_process.spawn,Oo=child_process.fork;var Co=async(e,t=[],o={})=>{let r=C({command:e,args:t,options:o}),{stdout:i,stderr:s}=await V(r.args.join(" "),r.options);if(s)throw new y(e,s);return i??""};var [d,E,z,c,R,j,G,O]=["close","data","disconnect","error","exit","message","open","spawn"],Go=[d,E,z,c,R,j,G,O],_o=[d,R];var [J,b,Z,Q]=["exec","spawn","fork","kill"],ho=[J,b,Z,Q];var [q,ee,oe,re,te]=["string","object","number","boolean","bigint"],vo=[q,ee,oe,re,te];var [se,ne,ie,pe,ce,me,de,Se,Ee,ae,le,fe,ue,Oe,xe,ge,Te,Ie,Pe,ye,x,Ne,Ce,Re,Ge,_e,be,he,we,ve,Le,Ae,ke,Ve,De,Ue]=["SIGALRM","SIGBUS","SIGCHLD","SIGCONT","SIGFPE","SIGHUP","SIGILL","SIGINT","SIGIO","SIGIOT","SIGKILL","SIGPIPE","SIGPOLL","SIGPROF","SIGPWR","SIGQUIT","SIGSEGV","SIGSTKFLT","SIGSTOP","SIGSYS","SIGTERM","SIGTRAP","SIGTSTP","SIGTTIN","SIGTTOU","SIGUNUSED","SIGURG","SIGUSR1","SIGUSR2","SIGVTALRM","SIGWINCH","SIGXCPU","SIGXFSZ","SIGBREAK","SIGLOST","SIGINFO"],Ao=[se,ne,ie,pe,ce,me,de,Se,Ee,ae,le,fe,ue,Oe,xe,ge,Te,Ie,Pe,ye,x,Ne,Ce,Re,Ge,_e,be,he,we,ve,Le,Ae,ke,Ve,De,Ue];var [h,w,Fe,v]=["opening","opened","closing","closed"],Vo=[h,w,Fe,v];var [Me,$e,Be,Ke,We]=["overlapped","pipe","ignore","inherit","ipc"],Uo=[Me,$e,Be,Ke,We],[He,Xe,Ye,Fo]=["stdin","stdout","stderr","stdio"],Mo=[He],$o=[Xe,Ye];var Ko=e=>typeof e=="object"&&!!e&&Object.keys(e).includes("cmd");var ir=async(e,t={})=>{try{let{timeout:o,event:r,signal:i}={timeout:5e3,event:R,signal:x,...t};if(e.killed)return;if(e.killing)return Promise.race([e.killing,_(o)]);e.killing=Promise.race([new Promise(s=>{for(let n=0;n<100;n++)e.killed&&s();}),new Promise((s,n)=>{e.once(r,()=>{s();}),e.once(c,()=>{n();}),e.kill(i),e.killed&&s();}),_(o)]),await e.killing,e.removeAllListeners();}catch(o){throw new N(e.command,o)}};var U=e=>()=>new Promise((t,o)=>{e.killed&&t({code:void 0,signal:e.signalCode??void 0}),e.once(d,(r,i)=>{t({code:r,signal:i});}),e.once(c,r=>{o({error:r});});});var F=(e,t)=>(o,r=9e4)=>new Promise((i,s)=>{var S,g;let n=setTimeout(()=>{let l=new T(t??e.pid,r);console.warn(l.message),s(l);},r),p=(l,u)=>{s({code:l,signal:u});},a=l=>{s({error:l});},m=l=>{var L,A;let u=l.toString().trim();!o(u)||(clearTimeout(n),console.debug("Matched awaited message from child process.",u),(L=e.stdout)==null||L.off(E,m),(A=e.stderr)==null||A.off(E,m),e.off(d,p),e.off(c,a),i(u));};(S=e.stdout)==null||S.on(E,m),(g=e.stderr)==null||g.on(E,m),e.once(d,p),e.once(c,a);});var M=(e,t)=>async o=>new Promise((r,i)=>{e.pid&&r(),e.killed&&i("Cannot await open on killed process.");let s=p=>{i(p);},n=()=>{e.removeListener(c,s),r();};e.once(c,s),e.once(O,n),o&&setTimeout(()=>{let p=new I(t??e.pid,o);console.warn(p.message),i(p);},o);});var $=(e,{command:t,method:o,filters:r})=>{let i=new timer.Timer,s=Object.assign(e,{command:t,method:o,timer:i,filters:r,killing:void 0,state:h,untilOpen:M(e,t),untilClose:U(e),untilMessage:F(e,t)});s.once(O,()=>{s.state=w,console.debug(`Process "${t}" opened.`);}),s.once(d,()=>{s.state=v,console.debug(`Process "${t}" closed.`);}),s.on(c,m=>{console.debug(`Process "${t}" error: ${m.message}`),s.killed||s.kill(x);});let n=m=>{let S=m.toString().trim();return !s.filters||s.filters.every(g=>!S.includes(g))?S:void 0},p=m=>{let S=n(m);S&&process.stdout.write(`${S}
`);},a=m=>{let S=n(m);S&&process.stderr.write(`${S}
`);};return s.stdout&&s.stdout.on(E,p),s.stderr&&s.stderr.on(E,a),s};var K=class extends je__default["default"]{constructor(){super(...arguments);this.#o=defer.defer();this.#e=defer.defer();this.#r=!1;this.#t=!1;}#o;#e;#r;#t;get command(){return this._command}get pid(){return this.process().pid}process(){if(!this._process)throw new f(this.command);return this._process}untilClose(){return this.#e.untilResolved()}_setOpen(o){return this.#r?this.#o.promise:(this.once(G,()=>this.#o.resolve()),o())}_setClose(o){return this.#t?this.#e.promise:(this.once(d,()=>this.#e.resolve()),o())}_completeOpen(){if(this._process)this.emit(G),this.#o.resolve();else throw new f(this.command)}_completeClose(){if(this._process)this._process.timer.stop(),this.emit(d),this.#e.resolve(),this._process.removeAllListeners(),this.removeAllListeners();else throw new f(this.command)}};var vr=async(e,t=[],{filters:o,...r}={})=>{let i=C({args:t,options:r}),s=b,n=$(D(e,i.args,i.options),{command:e,method:s,filters:o??[]});return await n.untilOpen(),n};

@@ -35,7 +35,7 @@ exports.BIGINT_TYPE = te;

exports.PROCESS_CLOSED_STATE = v;
exports.PROCESS_CLOSE_EVENT = m;
exports.PROCESS_CLOSE_EVENT = d;
exports.PROCESS_CLOSING_STATE = Fe;
exports.PROCESS_DATA_EVENT = E;
exports.PROCESS_DISCONNECT_EVENT = z;
exports.PROCESS_ERROR_EVENT = p;
exports.PROCESS_ERROR_EVENT = c;
exports.PROCESS_EXIT_EVENT = R;

@@ -117,2 +117,2 @@ exports.PROCESS_MESSAGE_EVENT = j;

exports.spawn = vr;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9lcnJvcnMvbWVzc2FnZS10aW1lb3V0LmVycm9yLnRzIiwiLi4vc3JjL2Vycm9ycy9vcGVuLXRpbWVvdXQuZXJyb3IudHMiLCIuLi9zcmMvZXJyb3JzL3Byb2Nlc3MtY29uZmlndXJhdGlvbi5lcnJvci50cyIsIi4uL3NyYy9lcnJvcnMvcHJvY2Vzcy1leGVjdXRpb24uZXJyb3IudHMiLCIuLi9zcmMvZXJyb3JzL3Byb2Nlc3Mtbm90LWF2YWlsYWJsZS5lcnJvci50cyIsIi4uL3NyYy9lcnJvcnMvcHJvY2Vzcy1zcGF3bi5lcnJvci50cyIsIi4uL3NyYy9lcnJvcnMvcHJvY2Vzcy10ZXJtaW5hdGlvbi5lcnJvci50cyIsIi4uL3NyYy9zdXBwb3J0L2NvbmZpZ3VyZS50cyIsIi4uL3NyYy9zdXBwb3J0L2RlbGF5LnRzIiwiLi4vc3JjL3N1cHBvcnQvdmVuZG9yLnRzIiwiLi4vc3JjL2NvcmUvZXhlYy50cyIsIi4uL3NyYy90eXBlcy9ldmVudHMudHMiLCIuLi9zcmMvdHlwZXMvbWV0aG9kcy50cyIsIi4uL3NyYy90eXBlcy9zZXJpYWxpemFibGUudHMiLCIuLi9zcmMvdHlwZXMvc2lnbmFscy50cyIsIi4uL3NyYy90eXBlcy9zdGF0ZXMudHMiLCIuLi9zcmMvdHlwZXMvc3RkaW8udHMiLCIuLi9zcmMvdHlwZXMvdmVuZG9yLnRzIiwiLi4vc3JjL2NvcmUva2lsbC50cyIsIi4uL3NyYy9jb3JlL21hbmFnZS50cyIsIi4uL3NyYy9wcm9taXNlcy9jbG9zZS50cyIsIi4uL3NyYy9wcm9taXNlcy9tZXNzYWdlLnRzIiwiLi4vc3JjL3Byb21pc2VzL29wZW4udHMiLCIuLi9zcmMvY29yZS9tYW5hZ2VyLnRzIiwiLi4vc3JjL2NvcmUvc3Bhd24udHMiXSwibmFtZXMiOlsiTWVzc2FnZVRpbWVvdXRFcnJvciIsImNvbW1hbmQiLCJ0aW1lb3V0IiwiT3BlblRpbWVvdXRFcnJvciIsIlByb2Nlc3NDb25maWd1cmF0aW9uRXJyb3IiLCJjb25maWciLCJlcnJvciIsIlByb2Nlc3NFeGVjdXRpb25FcnJvciIsInN0ZGVyciIsIlByb2Nlc3NOb3RBdmFpbGFibGVFcnJvciIsIlByb2Nlc3NTcGF3bkVycm9yIiwiUHJvY2Vzc1Rlcm1pbmF0aW9uRXJyb3IiLCJjb25maWd1cmUiLCJwYXJzZUFyZ3MiLCJhcmdzIiwidmFsdWUiLCJtZXJnZUVudiIsImVudiIsInBhcnNlT3B0aW9ucyIsIm9wdGlvbnMiLCJkZWxheSIsIm1zIiwicmVzb2x2ZSIsImV4ZWMiLCJmb3JrIiwic3Bhd24iLCJwcm9taXNpZnkiLCJub2RlRXhlYyIsIm5vZGVTcGF3biIsIm5vZGVGb3JrIiwic3Rkb3V0IiwiUFJPQ0VTU19DTE9TRV9FVkVOVCIsIlBST0NFU1NfREFUQV9FVkVOVCIsIlBST0NFU1NfRElTQ09OTkVDVF9FVkVOVCIsIlBST0NFU1NfRVJST1JfRVZFTlQiLCJQUk9DRVNTX0VYSVRfRVZFTlQiLCJQUk9DRVNTX01FU1NBR0VfRVZFTlQiLCJQUk9DRVNTX09QRU5fRVZFTlQiLCJQUk9DRVNTX1NQQVdOX0VWRU5UIiwicHJvY2Vzc0V2ZW50cyIsImNsb3NlRXZlbnRzIiwiRVhFQyIsIlNQQVdOIiwiRk9SSyIsIktJTEwiLCJleGVjdXRpb25NZXRob2RzIiwiU1RSSU5HX1RZUEUiLCJPQkpFQ1RfVFlQRSIsIk5VTUJFUl9UWVBFIiwiQk9PTEVBTl9UWVBFIiwiQklHSU5UX1RZUEUiLCJzZXJpYWxpemFibGVUeXBlcyIsIlNJR0FMUk0iLCJTSUdCVVMiLCJTSUdDSExEIiwiU0lHQ09OVCIsIlNJR0ZQRSIsIlNJR0hVUCIsIlNJR0lMTCIsIlNJR0lOVCIsIlNJR0lPIiwiU0lHSU9UIiwiU0lHS0lMTCIsIlNJR1BJUEUiLCJTSUdQT0xMIiwiU0lHUFJPRiIsIlNJR1BXUiIsIlNJR1FVSVQiLCJTSUdTRUdWIiwiU0lHU1RLRkxUIiwiU0lHU1RPUCIsIlNJR1NZUyIsIlNJR1RFUk0iLCJTSUdUUkFQIiwiU0lHVFNUUCIsIlNJR1RUSU4iLCJTSUdUVE9VIiwiU0lHVU5VU0VEIiwiU0lHVVJHIiwiU0lHVVNSMSIsIlNJR1VTUjIiLCJTSUdWVEFMUk0iLCJTSUdXSU5DSCIsIlNJR1hDUFUiLCJTSUdYRlNaIiwiU0lHQlJFQUsiLCJTSUdMT1NUIiwiU0lHSU5GTyIsInNpZ25hbHMiLCJQUk9DRVNTX09QRU5JTkdfU1RBVEUiLCJQUk9DRVNTX09QRU5FRF9TVEFURSIsIlBST0NFU1NfQ0xPU0lOR19TVEFURSIsIlBST0NFU1NfQ0xPU0VEX1NUQVRFIiwicHJvY2Vzc1N0YXRlcyIsIklPX09WRVJMQVBQRUQiLCJJT19QSVBFIiwiSU9fSUdOT1JFIiwiSU9fSU5IRVJJVCIsIklPX0lQQyIsImlvVHlwZXMiLCJTVERJTiIsIlNURE9VVCIsIlNUREVSUiIsIlNURElPIiwiaW5wdXRUeXBlcyIsIm91dHB1dFR5cGVzIiwiaXNQcm9jZXNzRXJyb3IiLCJraWxsIiwiY2hpbGRQcm9jZXNzIiwiZXZlbnQiLCJzaWduYWwiLCJpIiwicmVqZWN0IiwiVGltZXIiLCJwcm9taXNpZnlDbG9zZSIsImNvZGUiLCJwcm9taXNpZnlNZXNzYWdlIiwidmFsaWRhdGUiLCJfYSIsIl9iIiwidGltZXIiLCJvbkNsb3NlIiwib25FcnJvciIsIm9uRGF0YSIsImRhdGEiLCJtZXNzYWdlIiwicHJvbWlzaWZ5T3BlbiIsIm9uU3Bhd24iLCJtYW5hZ2UiLCJuYXRpdmVDaGlsZFByb2Nlc3MiLCJtZXRob2QiLCJmaWx0ZXJzIiwiZmlsdGVyIiwib25TdGRvdXQiLCJvblN0ZGVyciIsIkV2ZW50RW1pdHRlciIsImRlZmVyIiwiUHJvY2Vzc01hbmFnZXIiLCIjb3BlbmVyIiwiI2Nsb3NlciIsIiNpc09wZW5pbmciLCIjaXNDbG9zaW5nIiwib3BlbiIsImNsb3NlIl0sIm1hcHBpbmdzIjoiQUFLTyxJQUFNQSxFQUFOLGNBQWtDLEtBQU0sQ0FJdEMsWUFBWUMsRUFBc0NDLEVBQWlCLENBQ3hFLE1BQ0Usc0NBQXNDRCxzQkFBNEJDLE1BQ3BFLEVBQ0EsS0FBSyxRQUFVRCxFQUNmLEtBQUssUUFBVUMsQ0FDakIsQ0FDRixFQ1hPLElBQU1D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ZXMgbm90IHJldHVybiBmcm9tIGNoaWxkIHByb2Nlc3Mgd2l0aGluIGdpdmVuIHRpbWVvdXQuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgTWVzc2FnZVRpbWVvdXRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcHVibGljIHJlYWRvbmx5IGNvbW1hbmQ6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZFxuICBwdWJsaWMgcmVhZG9ubHkgdGltZW91dDogbnVtYmVyXG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKGNvbW1hbmQ6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCwgdGltZW91dDogbnVtYmVyKSB7XG4gICAgc3VwZXIoXG4gICAgICBgTWVzc2FnZSBsaXN0ZW5lciBvbiBjaGlsZCBwcm9jZXNzIFwiJHtjb21tYW5kfVwiIHRpbWVkIG91dCBhZnRlciAke3RpbWVvdXR9bXMuYFxuICAgIClcbiAgICB0aGlzLmNvbW1hbmQgPSBjb21tYW5kXG4gICAgdGhpcy50aW1lb3V0ID0gdGltZW91dFxuICB9XG59XG4iLCIvKipcbiAqIFRocm93cyB3aGVuIGEgY2hpbGQgcHJvY2VzcyBkb2VzIG5vdCBvcGVuIHdpdGhpbiBnaXZlbiB0aW1lb3V0LlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIE9wZW5UaW1lb3V0RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHB1YmxpYyByZWFkb25seSBjb21tYW5kOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWRcbiAgcHVibGljIHJlYWRvbmx5IHRpbWVvdXQ6IG51bWJlclxuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihjb21tYW5kOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQsIHRpbWVvdXQ6IG51bWJlcikge1xuICAgIHN1cGVyKFxuICAgICAgYE9wZW4gc3RhdGUgbGlzdGVuZXIgb24gY2hpbGQgcHJvY2VzcyBcIiR7Y29tbWFuZH1cIiB0aW1lZCBvdXQgYWZ0ZXIgJHt0aW1lb3V0fW1zLmBcbiAgICApXG4gICAgdGhpcy5jb21tYW5kID0gY29tbWFuZFxuICAgIHRoaXMudGltZW91dCA9IHRpbWVvdXRcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBPcHRpb25zLCBQcm9jZXNzQ29uZmlnIH0gZnJvbSBcIi4uL3R5cGVzXCJcblxuZXhwb3J0IGNsYXNzIFByb2Nlc3NDb25maWd1cmF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHB1YmxpYyByZWFkb25seSBjb25maWc6IFBhcnRpYWw8UHJvY2Vzc0NvbmZpZzxPcHRpb25zPj5cblxuICBwdWJsaWMgY29uc3RydWN0b3IoY29uZmlnOiBQYXJ0aWFsPFByb2Nlc3NDb25maWc8T3B0aW9ucz4+LCBlcnJvcjogRXJyb3IpIHtcbiAgICBzdXBlcihcbiAgICAgIGBFbmNvdW50ZXJlZCBhbiBlcnJvciB3aGlsZSBjb25maWd1cmluZyBjaGlsZCBwcm9jZXNzOiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICBjb25maWdcbiAgICAgICl9YCxcbiAgICAgIHtcbiAgICAgICAgY2F1c2U6IGVycm9yXG4gICAgICB9XG4gICAgKVxuICAgIHRoaXMuY29uZmlnID0gY29uZmlnXG4gIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBQcm9jZXNzRXhlY3V0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHB1YmxpYyByZWFkb25seSBjb21tYW5kOiBzdHJpbmdcblxuICBwdWJsaWMgY29uc3RydWN0b3IoY29tbWFuZDogc3RyaW5nLCBzdGRlcnI/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihgRW5jb3VudGVyZWQgYW4gZXJyb3IgZXhlY3V0aW5nIGNoaWxkIHByb2Nlc3MgJHtjb21tYW5kfTogJHtzdGRlcnJ9YClcbiAgICB0aGlzLmNvbW1hbmQgPSBjb21tYW5kXG4gIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBQcm9jZXNzTm90QXZhaWxhYmxlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHB1YmxpYyByZWFkb25seSBjb21tYW5kOiBzdHJpbmdcblxuICBwdWJsaWMgY29uc3RydWN0b3IoY29tbWFuZDogc3RyaW5nID0gXCJhdCB1bnNwZWNpZmllZCBleGVjdXRhYmxlIHBhdGhcIikge1xuICAgIHN1cGVyKGBFbmNvdW50ZXJlZCBhbiBlcnJvciBzcGF3bmluZyBjaGlsZCBwcm9jZXNzICR7Y29tbWFuZH0uYClcbiAgICB0aGlzLmNvbW1hbmQgPSBjb21tYW5kXG4gIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBQcm9jZXNzU3Bhd25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcHVibGljIHJlYWRvbmx5IGNvbW1hbmQ6IHN0cmluZ1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihjb21tYW5kOiBzdHJpbmcsIHN0ZGVycj86IHN0cmluZykge1xuICAgIHN1cGVyKGBFbmNvdW50ZXJlZCBhbiBlcnJvciBzcGF3bmluZyBjaGlsZCBwcm9jZXNzICR7Y29tbWFuZH06ICR7c3RkZXJyfWApXG4gICAgdGhpcy5jb21tYW5kID0gY29tbWFuZFxuICB9XG59XG4iLCJleHBvcnQgY2xhc3MgUHJvY2Vzc1Rlcm1pbmF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHB1YmxpYyByZWFkb25seSBjb21tYW5kOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgcHVibGljIHJlYWRvbmx5IGVycm9yOiBFcnJvclxuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihjb21tYW5kOiBzdHJpbmcgfCB1bmRlZmluZWQsIGVycm9yOiBFcnJvcikge1xuICAgIHN1cGVyKFxuICAgICAgYEVuY291bnRlcmVkIGFuIGVycm9yIGtpbGxpbmcgY2hpbGQgcHJvY2VzcyAke2NvbW1hbmR9OiAke2Vycm9yLm1lc3NhZ2V9YCxcbiAgICAgIHsgY2F1c2U6IGVycm9yIH1cbiAgICApXG4gICAgdGhpcy5jb21tYW5kID0gY29tbWFuZFxuICAgIHRoaXMuZXJyb3IgPSBlcnJvclxuICB9XG59XG4iLCJpbXBvcnQgeyBQcm9jZXNzQ29uZmlndXJhdGlvbkVycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiXG5pbXBvcnQgdHlwZSB7XG4gIEV4ZWNPcHRpb25zLFxuICBGb3JrT3B0aW9ucyxcbiAgUHJvY2Vzc0NvbmZpZyxcbiAgUHJvY2Vzc0VudixcbiAgU3Bhd25PcHRpb25zXG59IGZyb20gXCIuLi90eXBlc1wiXG5cbi8qKlxuICogUHJlcGFyZXMgY2hpbGQgcHJvY2VzcyBhcmd1bWVudHMgYW5kIG9wdGlvbnMgcHJpb3IgdG8gZXhlY3V0aW9uLlxuICpcbiAqIEBwYXJhbSBjb25maWcgLSBVc2VyIGlucHV0IGFzIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgY29uZmlndXJlID0gPE8gZXh0ZW5kcyBTcGF3bk9wdGlvbnMgfCBGb3JrT3B0aW9ucyB8IEV4ZWNPcHRpb25zPihcbiAgY29uZmlnOiBQcm9jZXNzQ29uZmlnPE8+XG4pOiBQcm9jZXNzQ29uZmlnPE8+ID0+IHtcbiAgdHJ5IHtcbiAgICAvLyBTdHJpcHMgZW1wdHkgZWxlbWVudHMgYW5kIHRyaW1zIGFyZ3MgYXJyYXkuXG4gICAgY29uc3QgcGFyc2VBcmdzID0gKGNvbW1hbmQ6IHN0cmluZyA9IFwiXCIsIGFyZ3M6IHN0cmluZ1tdID0gW10pOiBzdHJpbmdbXSA9PiBbXG4gICAgICAuLi5bY29tbWFuZCwgLi4uYXJnc11cbiAgICAgICAgLm1hcCgodmFsdWU6IHN0cmluZykgPT4gdmFsdWUudHJpbSgpKVxuICAgICAgICAuZmlsdGVyKCh2YWx1ZSkgPT4gISF2YWx1ZSlcbiAgICBdXG5cbiAgICAvLyBNZXJnZXMgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gY3VycmVudCBwcm9jZXNzIHdpdGggYW55IHByb3ZpZGVkIGJ5IGNoaWxkIHByb2Nlc3Mgb3B0aW9ucy5cbiAgICBjb25zdCBtZXJnZUVudiA9IChlbnY6IFByb2Nlc3NFbnYgPSB7fSk6IFByb2Nlc3NFbnYgPT4gKHtcbiAgICAgIC4uLnByb2Nlc3MuZW52LFxuICAgICAgLi4uZW52XG4gICAgfSlcblxuICAgIC8vIE1lcmdlcyBwcm9jZXNzIG9wdGlvbnMgd2l0aCBjdXJyZW50IGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAgICBjb25zdCBwYXJzZU9wdGlvbnMgPSA8TyBleHRlbmRzIFNwYXduT3B0aW9ucyB8IEZvcmtPcHRpb25zIHwgRXhlY09wdGlvbnM+KFxuICAgICAgb3B0aW9uczogT1xuICAgICk6IE8gPT4gKHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBzdGRpbzogb3B0aW9ucy5zdGRpbyA/PyBbcHJvY2Vzcy5zdGRpbiwgXCJwaXBlXCIsIFwicGlwZVwiXSxcbiAgICAgIGVudjogbWVyZ2VFbnYob3B0aW9ucy5lbnYpXG4gICAgfSlcblxuICAgIGNvbnN0IGFyZ3M6IHN0cmluZ1tdID0gcGFyc2VBcmdzKGNvbmZpZy5jb21tYW5kLCBjb25maWcuYXJncylcbiAgICBjb25zdCBvcHRpb25zOiBPID0gcGFyc2VPcHRpb25zKGNvbmZpZy5vcHRpb25zKVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFyZ3MsXG4gICAgICBvcHRpb25zXG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRocm93IG5ldyBQcm9jZXNzQ29uZmlndXJhdGlvbkVycm9yKGNvbmZpZywgZXJyb3IgYXMgRXJyb3IpXG4gIH1cbn1cbiIsIi8qKlxuICogU2ltcGxlIHRpbWVvdXQgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIG1zIC0gTnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0LlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgZGVsYXkgPSAobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4gPT5cbiAgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKVxuIiwiaW1wb3J0IHsgZXhlYywgZm9yaywgc3Bhd24gfSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCJcbmltcG9ydCB7IHByb21pc2lmeSB9IGZyb20gXCJub2RlOnV0aWxcIlxuXG5pbXBvcnQgdHlwZSB7IE5vZGVFeGVjLCBOb2RlRm9yaywgTm9kZVNwYXduIH0gZnJvbSBcIi4uL3R5cGVzXCJcblxuLyoqXG4gKiBQcm9taXNpZmllZCBOb2RlIGV4ZWMgbWV0aG9kLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3Qgbm9kZUV4ZWM6IE5vZGVFeGVjID0gcHJvbWlzaWZ5KGV4ZWMpXG5cbi8qKlxuICogT3JpZ2luYWwgbm9kZSBzcGF3biBtZXRob2QuXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBub2RlU3Bhd246IE5vZGVTcGF3biA9IHNwYXduXG5cbi8qKlxuICogT3JpZ2luYWwgbm9kZSBmb3JrIG1ldGhvZC5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IG5vZGVGb3JrOiBOb2RlRm9yayA9IGZvcmtcbiIsImltcG9ydCB7IFByb2Nlc3NFeGVjdXRpb25FcnJvciB9IGZyb20gXCIuLi9lcnJvcnNcIlxuaW1wb3J0IHsgY29uZmlndXJlLCBub2RlRXhlYyB9IGZyb20gXCIuLi9zdXBwb3J0XCJcbmltcG9ydCB0eXBlIHsgRXhlY09wdGlvbnMsIFByb2Nlc3NDb25maWcgfSBmcm9tIFwiLi4vdHlwZXNcIlxuXG4vKipcbiAqIFByb3ZpZGUgYXN5bmMgY2hpbGQgcHJvY2VzcyBleGVjdXRvci5cbiAqXG4gKiBAcmVtYXJrc1xuICogVGhyb3dzIGVycm9yIG9uIGBzdGRlcnJgIG91dHB1dCB1bmxlc3Mgc3VwcHJlc3NlZC5cbiAqIElmIHByb2Nlc3MgaXMgbG9uZy1ydW5uaW5nLCBkbyBub3QgYXdhaXQgdGhlIFByb21pc2UuXG4gKiBFbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBjdXJyZW50IHByb2Nlc3MgYXJlIGluamVjdGVkIHRocm91Z2ggdG8gY2hpbGQgcHJvY2Vzcy5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBleGVjID0gYXN5bmMgKFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIGFyZ3M6IHN0cmluZ1tdID0gW10sXG4gIG9wdGlvbnM6IEV4ZWNPcHRpb25zID0ge31cbik6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gIC8vIENvbmZpZ3VyZSBhcmdzIGFuZCBvcHRpb25zLlxuICBjb25zdCBjb25maWc6IFByb2Nlc3NDb25maWc8RXhlY09wdGlvbnM+ID0gY29uZmlndXJlKHtcbiAgICBjb21tYW5kLFxuICAgIGFyZ3MsXG4gICAgb3B0aW9uc1xuICB9KVxuXG4gIC8vIEF3YWl0IGNoaWxkIHByb2Nlc3MgZXhlY3V0aW9uLlxuICBjb25zdCB7IHN0ZG91dCwgc3RkZXJyIH0gPSBhd2FpdCBub2RlRXhlYyhcbiAgICBjb25maWcuYXJncy5qb2luKGAgYCksXG4gICAgY29uZmlnLm9wdGlvbnNcbiAgKVxuXG4gIC8vIENoZWNrIHN0ZGVyciBmb3IgYW55IGVycm9yIG1lc3NhZ2VzLlxuICBpZiAoc3RkZXJyKSB7XG4gICAgdGhyb3cgbmV3IFByb2Nlc3NFeGVjdXRpb25FcnJvcihjb21tYW5kLCBzdGRlcnIpXG4gIH1cblxuICAvLyBSZXR1cm4gc3Rkb3V0LlxuICByZXR1cm4gc3Rkb3V0ID8/IFwiXCJcbn1cbiIsIi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgW1xuICBQUk9DRVNTX0NMT1NFX0VWRU5ULFxuICBQUk9DRVNTX0RBVEFfRVZFTlQsXG4gIFBST0NFU1NfRElTQ09OTkVDVF9FVkVOVCxcbiAgUFJPQ0VTU19FUlJPUl9FVkVOVCxcbiAgUFJPQ0VTU19FWElUX0VWRU5ULFxuICBQUk9DRVNTX01FU1NBR0VfRVZFTlQsXG4gIFBST0NFU1NfT1BFTl9FVkVOVCxcbiAgUFJPQ0VTU19TUEFXTl9FVkVOVFxuXSA9IFtcbiAgXCJjbG9zZVwiLFxuICBcImRhdGFcIixcbiAgXCJkaXNjb25uZWN0XCIsXG4gIFwiZXJyb3JcIixcbiAgXCJleGl0XCIsXG4gIFwibWVzc2FnZVwiLFxuICBcIm9wZW5cIixcbiAgXCJzcGF3blwiXG5dIGFzIGNvbnN0XG5cbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgcHJvY2Vzc0V2ZW50cyA9IFtcbiAgUFJPQ0VTU19DTE9TRV9FVkVOVCxcbiAgUFJPQ0VTU19EQVRBX0VWRU5ULFxuICBQUk9DRVNTX0RJU0NPTk5FQ1RfRVZFTlQsXG4gIFBST0NFU1NfRVJST1JfRVZFTlQsXG4gIFBST0NFU1NfRVhJVF9FVkVOVCxcbiAgUFJPQ0VTU19NRVNTQUdFX0VWRU5ULFxuICBQUk9DRVNTX09QRU5fRVZFTlQsXG4gIFBST0NFU1NfU1BBV05fRVZFTlRcbl0gYXMgY29uc3RcblxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB0eXBlIFByb2Nlc3NFdmVudCA9IHR5cGVvZiBwcm9jZXNzRXZlbnRzW251bWJlcl1cblxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBjbG9zZUV2ZW50cyA9IFtQUk9DRVNTX0NMT1NFX0VWRU5ULCBQUk9DRVNTX0VYSVRfRVZFTlRdIGFzIGNvbnN0XG5cbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdHlwZSBDbG9zZUV2ZW50ID0gdHlwZW9mIGNsb3NlRXZlbnRzW251bWJlcl1cbiIsIi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgW0VYRUMsIFNQQVdOLCBGT1JLLCBLSUxMXSA9IFtcbiAgXCJleGVjXCIsXG4gIFwic3Bhd25cIixcbiAgXCJmb3JrXCIsXG4gIFwia2lsbFwiXG5dIGFzIGNvbnN0XG5cbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgZXhlY3V0aW9uTWV0aG9kcyA9IFtFWEVDLCBTUEFXTiwgRk9SSywgS0lMTF0gYXMgY29uc3RcblxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB0eXBlIEV4ZWN1dGlvbk1ldGhvZCA9IHR5cGVvZiBleGVjdXRpb25NZXRob2RzW251bWJlcl1cbiIsIi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBbXG4gIFNUUklOR19UWVBFLFxuICBPQkpFQ1RfVFlQRSxcbiAgTlVNQkVSX1RZUEUsXG4gIEJPT0xFQU5fVFlQRSxcbiAgQklHSU5UX1RZUEVcbl0gPSBbXCJzdHJpbmdcIiwgXCJvYmplY3RcIiwgXCJudW1iZXJcIiwgXCJib29sZWFuXCIsIFwiYmlnaW50XCJdIGFzIGNvbnN0XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBzZXJpYWxpemFibGVUeXBlcyA9IFtcbiAgU1RSSU5HX1RZUEUsXG4gIE9CSkVDVF9UWVBFLFxuICBOVU1CRVJfVFlQRSxcbiAgQk9PTEVBTl9UWVBFLFxuICBCSUdJTlRfVFlQRVxuXSBhcyBjb25zdFxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgdHlwZSBTZXJpYWxpemFibGVUeXBlID0gdHlwZW9mIHNlcmlhbGl6YWJsZVR5cGVzW251bWJlcl1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJpYWxpemFibGVUeXBlcyB7XG4gIHN0cmluZzogc3RyaW5nXG4gIG9iamVjdDogb2JqZWN0XG4gIG51bWJlcjogbnVtYmVyXG4gIGJvb2xlYW46IGJvb2xlYW5cbiAgYmlnaW50OiBib29sZWFuXG59XG4iLCJleHBvcnQgY29uc3QgW1xuICBTSUdBTFJNLFxuICBTSUdCVVMsXG4gIFNJR0NITEQsXG4gIFNJR0NPTlQsXG4gIFNJR0ZQRSxcbiAgU0lHSFVQLFxuICBTSUdJTEwsXG4gIFNJR0lOVCxcbiAgU0lHSU8sXG4gIFNJR0lPVCxcbiAgU0lHS0lMTCxcbiAgU0lHUElQRSxcbiAgU0lHUE9MTCxcbiAgU0lHUFJPRixcbiAgU0lHUFdSLFxuICBTSUdRVUlULFxuICBTSUdTRUdWLFxuICBTSUdTVEtGTFQsXG4gIFNJR1NUT1AsXG4gIFNJR1NZUyxcbiAgU0lHVEVSTSxcbiAgU0lHVFJBUCxcbiAgU0lHVFNUUCxcbiAgU0lHVFRJTixcbiAgU0lHVFRPVSxcbiAgU0lHVU5VU0VELFxuICBTSUdVUkcsXG4gIFNJR1VTUjEsXG4gIFNJR1VTUjIsXG4gIFNJR1ZUQUxSTSxcbiAgU0lHV0lOQ0gsXG4gIFNJR1hDUFUsXG4gIFNJR1hGU1osXG4gIFNJR0JSRUFLLFxuICBTSUdMT1NULFxuICBTSUdJTkZPXG5dID0gW1xuICBcIlNJR0FMUk1cIixcbiAgXCJTSUdCVVNcIixcbiAgXCJTSUdDSExEXCIsXG4gIFwiU0lHQ09OVFwiLFxuICBcIlNJR0ZQRVwiLFxuICBcIlNJR0hVUFwiLFxuICBcIlNJR0lMTFwiLFxuICBcIlNJR0lOVFwiLFxuICBcIlNJR0lPXCIsXG4gIFwiU0lHSU9UXCIsXG4gIFwiU0lHS0lMTFwiLFxuICBcIlNJR1BJUEVcIixcbiAgXCJTSUdQT0xMXCIsXG4gIFwiU0lHUFJPRlwiLFxuICBcIlNJR1BXUlwiLFxuICBcIlNJR1FVSVRcIixcbiAgXCJTSUdTRUdWXCIsXG4gIFwiU0lHU1RLRkxUXCIsXG4gIFwiU0lHU1RPUFwiLFxuICBcIlNJR1NZU1wiLFxuICBcIlNJR1RFUk1cIixcbiAgXCJTSUdUUkFQXCIsXG4gIFwiU0lHVFNUUFwiLFxuICBcIlNJR1RUSU5cIixcbiAgXCJTSUdUVE9VXCIsXG4gIFwiU0lHVU5VU0VEXCIsXG4gIFwiU0lHVVJHXCIsXG4gIFwiU0lHVVNSMVwiLFxuICBcIlNJR1VTUjJcIixcbiAgXCJTSUdWVEFMUk1cIixcbiAgXCJTSUdXSU5DSFwiLFxuICBcIlNJR1hDUFVcIixcbiAgXCJTSUdYRlNaXCIsXG4gIFwiU0lHQlJFQUtcIixcbiAgXCJTSUdMT1NUXCIsXG4gIFwiU0lHSU5GT1wiXG5dIGFzIGNvbnN0XG5cbmV4cG9ydCBjb25zdCBzaWduYWxzOiBSZWFkb25seTxOb2RlSlMuU2lnbmFsc1tdPiA9IFtcbiAgU0lHQUxSTSxcbiAgU0lHQlVTLFxuICBTSUdDSExELFxuICBTSUdDT05ULFxuICBTSUdGUEUsXG4gIFNJR0hVUCxcbiAgU0lHSUxMLFxuICBTSUdJTlQsXG4gIFNJR0lPLFxuICBTSUdJT1QsXG4gIFNJR0tJTEwsXG4gIFNJR1BJUEUsXG4gIFNJR1BPTEwsXG4gIFNJR1BST0YsXG4gIFNJR1BXUixcbiAgU0lHUVVJVCxcbiAgU0lHU0VHVixcbiAgU0lHU1RLRkxULFxuICBTSUdTVE9QLFxuICBTSUdTWVMsXG4gIFNJR1RFUk0sXG4gIFNJR1RSQVAsXG4gIFNJR1RTVFAsXG4gIFNJR1RUSU4sXG4gIFNJR1RUT1UsXG4gIFNJR1VOVVNFRCxcbiAgU0lHVVJHLFxuICBTSUdVU1IxLFxuICBTSUdVU1IyLFxuICBTSUdWVEFMUk0sXG4gIFNJR1dJTkNILFxuICBTSUdYQ1BVLFxuICBTSUdYRlNaLFxuICBTSUdCUkVBSyxcbiAgU0lHTE9TVCxcbiAgU0lHSU5GT1xuXSBhcyBjb25zdFxuXG5leHBvcnQgdHlwZSBTaWduYWwgPSB0eXBlb2Ygc2lnbmFsc1tudW1iZXJdXG4iLCJleHBvcnQgY29uc3QgW1xuICBQUk9DRVNTX09QRU5JTkdfU1RBVEUsXG4gIFBST0NFU1NfT1BFTkVEX1NUQVRFLFxuICBQUk9DRVNTX0NMT1NJTkdfU1RBVEUsXG4gIFBST0NFU1NfQ0xPU0VEX1NUQVRFXG5dID0gW1wib3BlbmluZ1wiLCBcIm9wZW5lZFwiLCBcImNsb3NpbmdcIiwgXCJjbG9zZWRcIl0gYXMgY29uc3RcblxuZXhwb3J0IGNvbnN0IHByb2Nlc3NTdGF0ZXMgPSBbXG4gIFBST0NFU1NfT1BFTklOR19TVEFURSxcbiAgUFJPQ0VTU19PUEVORURfU1RBVEUsXG4gIFBST0NFU1NfQ0xPU0lOR19TVEFURSxcbiAgUFJPQ0VTU19DTE9TRURfU1RBVEVcbl0gYXMgY29uc3RcblxuZXhwb3J0IHR5cGUgUHJvY2Vzc1N0YXRlID0gdHlwZW9mIHByb2Nlc3NTdGF0ZXNbbnVtYmVyXVxuIiwiLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBbSU9fT1ZFUkxBUFBFRCwgSU9fUElQRSwgSU9fSUdOT1JFLCBJT19JTkhFUklULCBJT19JUENdID0gW1xuICBcIm92ZXJsYXBwZWRcIixcbiAgXCJwaXBlXCIsXG4gIFwiaWdub3JlXCIsXG4gIFwiaW5oZXJpdFwiLFxuICBcImlwY1wiXG5dIGFzIGNvbnN0XG5cbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgaW9UeXBlcyA9IFtcbiAgSU9fT1ZFUkxBUFBFRCxcbiAgSU9fUElQRSxcbiAgSU9fSUdOT1JFLFxuICBJT19JTkhFUklULFxuICBJT19JUENcbl0gYXMgY29uc3RcblxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB0eXBlIElPVHlwZSA9IHR5cGVvZiBpb1R5cGVzW251bWJlcl1cblxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBbU1RESU4sIFNURE9VVCwgU1RERVJSLCBTVERJT10gPSBbXG4gIFwic3RkaW5cIixcbiAgXCJzdGRvdXRcIixcbiAgXCJzdGRlcnJcIixcbiAgXCJzdGRpb1wiXG5dIGFzIGNvbnN0XG5cbi8qKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgaW5wdXRUeXBlcyA9IFtTVERJTl1cblxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBvdXRwdXRUeXBlcyA9IFtTVERPVVQsIFNUREVSUl1cblxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB0eXBlIElucHV0VHlwZSA9IHR5cGVvZiBpbnB1dFR5cGVzW251bWJlcl1cblxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB0eXBlIE91dHB1dFR5cGUgPSB0eXBlb2Ygb3V0cHV0VHlwZXNbbnVtYmVyXVxuIiwiaW1wb3J0IHR5cGUgTm9kZSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCJcblxuaW1wb3J0IHR5cGUgeyBTVERFUlIsIFNURE9VVCB9IGZyb20gXCIuL3N0ZGlvXCJcblxuZXhwb3J0IHR5cGUgTm9kZUNoaWxkUHJvY2VzcyA9IE5vZGUuQ2hpbGRQcm9jZXNzXG5cbmV4cG9ydCB0eXBlIE5vZGVFeGVjT3B0aW9ucyA9IE5vZGUuRXhlY09wdGlvbnNcbmV4cG9ydCB0eXBlIE5vZGVTcGF3bk9wdGlvbnMgPSBOb2RlLlNwYXduT3B0aW9uc1xuZXhwb3J0IHR5cGUgTm9kZUZvcmtPcHRpb25zID0gTm9kZS5Gb3JrT3B0aW9uc1xuZXhwb3J0IHR5cGUgTm9kZVN0ZGlvT3B0aW9ucyA9IE5vZGUuU3RkaW9PcHRpb25zXG5cbmV4cG9ydCB0eXBlIFNlcmlhbGl6YWJsZSA9IHN0cmluZyB8IG9iamVjdCB8IG51bWJlciB8IGJvb2xlYW4gfCBiaWdpbnRcblxuLyoqXG4gKiBTdHJpbmcgb3V0cHV0IGZyb20gY2hpbGQgcHJvY2VzcyBleGVjdXRpb24uXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NSZXN1bHQge1xuICBbU1RET1VUXT86IHN0cmluZ1xuICBbU1RERVJSXT86IHN0cmluZ1xufVxuXG4vKipcbiAqIENvbW1vbiBwcm9jZXNzLmVudiB2YWx1ZXMuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NFbnYge1xuICBUWj86IHN0cmluZ1xuICBOT0RFX0VOVj86IFwiZGV2ZWxvcG1lbnRcIiB8IFwidGVzdFwiIHwgXCJwcm9kdWN0aW9uXCJcblxuICBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCB1bmRlZmluZWRcbn1cblxuLyoqXG4gKiBOb2RlSlMgXCJleGVjXCIgY29tbWFuZC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB0eXBlIE5vZGVFeGVjID0gKFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIG9wdGlvbnM6IE5vZGVFeGVjT3B0aW9uc1xuKSA9PiBQcm9taXNlPFByb2Nlc3NSZXN1bHQ+XG5cbi8qKlxuICogTm9kZUpTIFwic3Bhd25cIiBjb21tYW5kLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHR5cGUgTm9kZVNwYXduID0gKFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIGFyZ3M6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPixcbiAgb3B0aW9uczogTm9kZVNwYXduT3B0aW9uc1xuKSA9PiBOb2RlQ2hpbGRQcm9jZXNzXG5cbi8qKlxuICogTm9kZUpTIFwiZm9ya1wiIGNvbW1hbmQuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdHlwZSBOb2RlRm9yayA9IChcbiAgY29tbWFuZDogc3RyaW5nLFxuICBhcmdzOiBSZWFkb25seUFycmF5PHN0cmluZz4sXG4gIG9wdGlvbnM6IE5vZGVGb3JrT3B0aW9uc1xuKSA9PiBOb2RlQ2hpbGRQcm9jZXNzXG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBkZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIHZhbGlkIHByb2Nlc3MgZXJyb3IuXG4gKlxuICogQHBhcmFtIGVycm9yIC0gUG9zc2libGUgZXJyb3IgdmFsdWUgdG8gdGVzdC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBpc1Byb2Nlc3NFcnJvciA9IChlcnJvcjogdW5rbm93bik6IGVycm9yIGlzIE5vZGUuRXhlY0V4Y2VwdGlvbiA9PlxuICB0eXBlb2YgZXJyb3IgPT09IFwib2JqZWN0XCIgJiYgISFlcnJvciAmJiBPYmplY3Qua2V5cyhlcnJvcikuaW5jbHVkZXMoXCJjbWRcIilcbiIsImltcG9ydCB7IFByb2Nlc3NUZXJtaW5hdGlvbkVycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiXG5pbXBvcnQgeyBkZWxheSB9IGZyb20gXCIuLi9zdXBwb3J0XCJcbmltcG9ydCB7IFBST0NFU1NfRVJST1JfRVZFTlQsIFBST0NFU1NfRVhJVF9FVkVOVCwgU0lHVEVSTSB9IGZyb20gXCIuLi90eXBlc1wiXG5pbXBvcnQgdHlwZSB7IENoaWxkUHJvY2VzcywgS2lsbE9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIlxuXG4vKipcbiAqIFRlcm1pbmF0ZXMgYSBjaGlsZCBjaGlsZFByb2Nlc3MgYW5kIGF3YWl0cyBmb3IgYSBjbG9zZWQgc3RhdGUuXG4gKlxuICogQHJlbWFya3NcbiAqIFJlbW92ZXMgYW55IGxpc3RlbmVycyBhdHRhY2hlZCB0byB0aGUgY2hpbGRQcm9jZXNzLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGtpbGwgPSBhc3luYyAoXG4gIGNoaWxkUHJvY2VzczogQ2hpbGRQcm9jZXNzLFxuICBvcHRpb25zOiBQYXJ0aWFsPEtpbGxPcHRpb25zPiA9IHt9XG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCB7IHRpbWVvdXQsIGV2ZW50LCBzaWduYWwgfTogS2lsbE9wdGlvbnMgPSB7XG4gICAgICB0aW1lb3V0OiA1MDAwLFxuICAgICAgZXZlbnQ6IFBST0NFU1NfRVhJVF9FVkVOVCxcbiAgICAgIHNpZ25hbDogU0lHVEVSTSxcbiAgICAgIC4uLm9wdGlvbnNcbiAgICB9XG5cbiAgICAvLyBJZiBwcm9jZXNzIGFscmVhZHkga2lsbGVkLCB0ZXJtaW5hdGUgaW1tZWRpYXRlbHkuXG4gICAgaWYgKGNoaWxkUHJvY2Vzcy5raWxsZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIElmIGFscmVhZHkgYXdhaXRpbmcgYSBraWxsIGV2ZW50LCByZXR1cm4gcHJldmlvdXMgcHJvbWlzZSByYWNlLlxuICAgIGlmIChjaGlsZFByb2Nlc3Mua2lsbGluZykge1xuICAgICAgcmV0dXJuIFByb21pc2UucmFjZShbY2hpbGRQcm9jZXNzLmtpbGxpbmcsIGRlbGF5KHRpbWVvdXQpXSlcbiAgICB9XG5cbiAgICAvLyBBdHRhY2ggdGhlIGZpcnN0IGtpbGwgcmFjZS5cbiAgICBjaGlsZFByb2Nlc3Mua2lsbGluZyA9IFByb21pc2UucmFjZShbXG4gICAgICBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAvLyBQb2xsIGZvciBhIGtpbGxlZCBpbiBjYXNlIGV2ZW50IGlzIGFscmVhZHkgdHJpZ2dlcmVkLlxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgMTAwOyBpKyspIHtcbiAgICAgICAgICBpZiAoY2hpbGRQcm9jZXNzLmtpbGxlZCkge1xuICAgICAgICAgICAgcmVzb2x2ZSgpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgLy8gQXdhaXQgY2xvc2Ugb3IgZXhpdCBldmVudCBiZWZvcmUgcmVzb2x2aW5nLlxuICAgICAgICBjaGlsZFByb2Nlc3Mub25jZShldmVudCwgKCkgPT4ge1xuICAgICAgICAgIHJlc29sdmUoKVxuICAgICAgICB9KVxuXG4gICAgICAgIC8vIEFib3J0IGVhcmx5IGlmIGFuIGVycm9yIG9jY3Vycy5cbiAgICAgICAgY2hpbGRQcm9jZXNzLm9uY2UoUFJPQ0VTU19FUlJPUl9FVkVOVCwgKCkgPT4ge1xuICAgICAgICAgIHJlamVjdCgpXG4gICAgICAgIH0pXG5cbiAgICAgICAgLy8gU2VuZCB0ZXJtaW5hdGlvbiBzaWduYWwuXG4gICAgICAgIGNoaWxkUHJvY2Vzcy5raWxsKHNpZ25hbClcblxuICAgICAgICAvLyBSZXNvbHZlIGlmIHByb2Nlc3MgaXMgYWxyZWFkeSB0ZXJtaW5hdGVkIGJ5IHRoZSB0aW1lIGxpc3RlbmVycyBhcmUgYXR0YWNoZWQuXG4gICAgICAgIGlmIChjaGlsZFByb2Nlc3Mua2lsbGVkKSB7XG4gICAgICAgICAgcmVzb2x2ZSgpXG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgZGVsYXkodGltZW91dClcbiAgICBdKVxuXG4gICAgYXdhaXQgY2hpbGRQcm9jZXNzLmtpbGxpbmdcblxuICAgIC8vIFJlbW92ZXMgYWxsIGxpc3RlbmVycyBhZnRlciB0ZXJtaW5hdGlvbi5cbiAgICBjaGlsZFByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzKClcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgUHJvY2Vzc1Rlcm1pbmF0aW9uRXJyb3IoY2hpbGRQcm9jZXNzLmNvbW1hbmQsIGVycm9yIGFzIEVycm9yKVxuICB9XG59XG4iLCJpbXBvcnQgeyBUaW1lciB9IGZyb20gXCJAbm9kZXN1aXRlL3RpbWVyXCJcbmltcG9ydCB0eXBlIHsgUGVyZm9ybWFuY2VUaW1lciB9IGZyb20gXCJAbm9kZXN1aXRlL3RpbWVyXCJcblxuaW1wb3J0IHsgcHJvbWlzaWZ5Q2xvc2UsIHByb21pc2lmeU1lc3NhZ2UsIHByb21pc2lmeU9wZW4gfSBmcm9tIFwiLi4vcHJvbWlzZXNcIlxuaW1wb3J0IHtcbiAgUFJPQ0VTU19DTE9TRV9FVkVOVCxcbiAgUFJPQ0VTU19DTE9TRURfU1RBVEUsXG4gIFBST0NFU1NfREFUQV9FVkVOVCxcbiAgUFJPQ0VTU19FUlJPUl9FVkVOVCxcbiAgUFJPQ0VTU19PUEVORURfU1RBVEUsXG4gIFBST0NFU1NfT1BFTklOR19TVEFURSxcbiAgUFJPQ0VTU19TUEFXTl9FVkVOVCxcbiAgU0lHVEVSTVxufSBmcm9tIFwiLi4vdHlwZXNcIlxuaW1wb3J0IHR5cGUgeyBDaGlsZFByb2Nlc3MsIE5vZGVDaGlsZFByb2Nlc3MgfSBmcm9tIFwiLi4vdHlwZXNcIlxuXG4vKipcbiAqIFV0aWxpdHkgZnVuY3Rpb24gdG8gYXBwZW5kIHNldmVyYWwgbWFuYWdlbWVudCB0b29scyB0byBhIHNwYXduZWQgb3IgZm9ya2VkIHByb2Nlc3MuXG4gKlxuICogQHJlbWFya3NcbiAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHksIG9ubHkgaW5kaXJlY3RseSB2aWEgYHNwYXduYCBvciBgZm9ya2AuXG4gKlxuICogQHBhcmFtIG5hdGl2ZUNoaWxkUHJvY2VzcyAtIE5hdGl2ZSBjaGlsZCBwcm9jZXNzIHRvIGF1Z21lbnQuXG4gKiBAcGFyYW0gY29tbWFuZCAtIENvbW1hbmQgbmFtZSBvciBleGVjdXRhYmxlIHBhdGggY2FsbGVkIGJ5IGBzcGF3bmAgb3IgYGZvcmtgLlxuICogQHBhcmFtIG1ldGhvZCAtIEV4ZWN1dGlvbiBtZXRob2QgKGBzcGF3bmAsIGBmb3JrYCkgdXNlZCB0byBzcGF3biB0aGUgcHJvY2Vzcy5cbiAqIEBwYXJhbSBmaWx0ZXJzIC0gU3RyaW5nIGZpbHRlcnMgdXNlZCB0byByZWR1Y2Ugc3Rkb3V0IGFuZCBzdGRlcnIgbm9pc2UuXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBtYW5hZ2UgPSAoXG4gIG5hdGl2ZUNoaWxkUHJvY2VzczogTm9kZUNoaWxkUHJvY2VzcyxcbiAge1xuICAgIGNvbW1hbmQsXG4gICAgbWV0aG9kLFxuICAgIGZpbHRlcnNcbiAgfTogUGljazxDaGlsZFByb2Nlc3MsIFwiY29tbWFuZFwiIHwgXCJtZXRob2RcIiB8IFwiZmlsdGVyc1wiPlxuKTogQ2hpbGRQcm9jZXNzID0+IHtcbiAgLy8gSW5pdGlhbGl6ZSBhIHRpbWVyIHRvIHRyYWNrIGR1cmF0aW9uLlxuICBjb25zdCB0aW1lcjogUGVyZm9ybWFuY2VUaW1lciA9IG5ldyBUaW1lcigpXG5cbiAgLy8gQXR0YWNoIHRoZSBhZGRpdGlvbmFsIFwibWFuYWdlbWVudFwiIHByb3BlcnRpZXMgdG8gdGhlIGJhc2UgY2hpbGQgcHJvY2Vzcy5cbiAgY29uc3QgY2hpbGRQcm9jZXNzOiBDaGlsZFByb2Nlc3MgPSBPYmplY3QuYXNzaWduKG5hdGl2ZUNoaWxkUHJvY2Vzcywge1xuICAgIGNvbW1hbmQsXG4gICAgbWV0aG9kLFxuICAgIHRpbWVyLFxuICAgIGZpbHRlcnMsXG4gICAga2lsbGluZzogdW5kZWZpbmVkLFxuICAgIHN0YXRlOiBQUk9DRVNTX09QRU5JTkdfU1RBVEUsXG4gICAgdW50aWxPcGVuOiBwcm9taXNpZnlPcGVuKG5hdGl2ZUNoaWxkUHJvY2VzcywgY29tbWFuZCksXG4gICAgdW50aWxDbG9zZTogcHJvbWlzaWZ5Q2xvc2UobmF0aXZlQ2hpbGRQcm9jZXNzKSxcbiAgICB1bnRpbE1lc3NhZ2U6IHByb21pc2lmeU1lc3NhZ2UobmF0aXZlQ2hpbGRQcm9jZXNzLCBjb21tYW5kKVxuICB9KVxuXG4gIC8vIENoYW5nZSBzdGF0ZSBhbmQgbm90aWZ5IGRlYnVnZ2VyIG9uIHN0YXRlIGNoYW5nZXMuXG5cbiAgY2hpbGRQcm9jZXNzLm9uY2UoUFJPQ0VTU19TUEFXTl9FVkVOVCwgKCkgPT4ge1xuICAgIGNoaWxkUHJvY2Vzcy5zdGF0ZSA9IFBST0NFU1NfT1BFTkVEX1NUQVRFXG4gICAgY29uc29sZS5kZWJ1ZyhgUHJvY2VzcyBcIiR7Y29tbWFuZH1cIiBvcGVuZWQuYClcbiAgfSlcblxuICBjaGlsZFByb2Nlc3Mub25jZShQUk9DRVNTX0NMT1NFX0VWRU5ULCAoKSA9PiB7XG4gICAgY2hpbGRQcm9jZXNzLnN0YXRlID0gUFJPQ0VTU19DTE9TRURfU1RBVEVcbiAgICBjb25zb2xlLmRlYnVnKGBQcm9jZXNzIFwiJHtjb21tYW5kfVwiIGNsb3NlZC5gKVxuICB9KVxuXG4gIGNoaWxkUHJvY2Vzcy5vbihQUk9DRVNTX0VSUk9SX0VWRU5ULCAoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgY29uc29sZS5kZWJ1ZyhgUHJvY2VzcyBcIiR7Y29tbWFuZH1cIiBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWApXG4gICAgaWYgKCFjaGlsZFByb2Nlc3Mua2lsbGVkKSB7XG4gICAgICBjaGlsZFByb2Nlc3Mua2lsbChTSUdURVJNKVxuICAgIH1cbiAgfSlcblxuICBjb25zdCBmaWx0ZXIgPSAoZGF0YTogQnVmZmVyKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgICBjb25zdCBtZXNzYWdlOiBzdHJpbmcgPSBkYXRhLnRvU3RyaW5nKCkudHJpbSgpXG4gICAgcmV0dXJuICFjaGlsZFByb2Nlc3MuZmlsdGVycyB8fFxuICAgICAgY2hpbGRQcm9jZXNzLmZpbHRlcnMuZXZlcnkoKGZpbHRlcikgPT4gIW1lc3NhZ2UuaW5jbHVkZXMoZmlsdGVyKSlcbiAgICAgID8gbWVzc2FnZVxuICAgICAgOiB1bmRlZmluZWRcbiAgfVxuXG4gIGNvbnN0IG9uU3Rkb3V0ID0gKGRhdGE6IEJ1ZmZlcik6IHZvaWQgPT4ge1xuICAgIGNvbnN0IG1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCA9IGZpbHRlcihkYXRhKVxuICAgIGlmIChtZXNzYWdlKSB7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShgJHttZXNzYWdlfVxcbmApXG4gICAgfVxuICB9XG5cbiAgY29uc3Qgb25TdGRlcnIgPSAoZGF0YTogQnVmZmVyKTogdm9pZCA9PiB7XG4gICAgY29uc3QgbWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkID0gZmlsdGVyKGRhdGEpXG4gICAgaWYgKG1lc3NhZ2UpIHtcbiAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKGAke21lc3NhZ2V9XFxuYClcbiAgICB9XG4gIH1cblxuICBpZiAoY2hpbGRQcm9jZXNzLnN0ZG91dCkge1xuICAgIGNoaWxkUHJvY2Vzcy5zdGRvdXQub24oUFJPQ0VTU19EQVRBX0VWRU5ULCBvblN0ZG91dClcbiAgfVxuXG4gIGlmIChjaGlsZFByb2Nlc3Muc3RkZXJyKSB7XG4gICAgY2hpbGRQcm9jZXNzLnN0ZGVyci5vbihQUk9DRVNTX0RBVEFfRVZFTlQsIG9uU3RkZXJyKVxuICB9XG5cbiAgcmV0dXJuIGNoaWxkUHJvY2Vzc1xufVxuIiwiaW1wb3J0IHsgUFJPQ0VTU19DTE9TRV9FVkVOVCwgUFJPQ0VTU19FUlJPUl9FVkVOVCB9IGZyb20gXCIuLi90eXBlc1wiXG5pbXBvcnQgdHlwZSB7IENsb3NlUmVhc29uLCBOb2RlQ2hpbGRQcm9jZXNzLCBTaWduYWwgfSBmcm9tIFwiLi4vdHlwZXNcIlxuXG4vKipcbiAqIEF3YWl0cyBhIGNsb3NlIGV2ZW50IGZyb20gYSBzcGVjaWZpZWQgY2hpbGQgcHJvY2Vzcy5cbiAqXG4gKiBAcGFyYW0gY2hpbGRQcm9jZXNzIC0gU3Bhd25lZCBjaGlsZCBwcm9jZXNzIHRvIG1vbml0b3IuXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBwcm9taXNpZnlDbG9zZSA9XG4gIChjaGlsZFByb2Nlc3M6IE5vZGVDaGlsZFByb2Nlc3MpID0+ICgpOiBQcm9taXNlPENsb3NlUmVhc29uPiA9PlxuICAgIG5ldyBQcm9taXNlPENsb3NlUmVhc29uPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAvLyBJZiBwcm9jZXNzIGFscmVhZHkga2lsbGVkLCByZXNvbHZlIGltbWVkaWF0ZWx5LlxuICAgICAgaWYgKGNoaWxkUHJvY2Vzcy5raWxsZWQpIHtcbiAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgY29kZTogdW5kZWZpbmVkLFxuICAgICAgICAgIHNpZ25hbDogY2hpbGRQcm9jZXNzLnNpZ25hbENvZGUgPz8gdW5kZWZpbmVkXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgY2xvc2UgZXZlbnQgYW5kIHJlc29sdmUgd2l0aCBwYXlsb2FkLlxuICAgICAgY2hpbGRQcm9jZXNzLm9uY2UoXG4gICAgICAgIFBST0NFU1NfQ0xPU0VfRVZFTlQsXG4gICAgICAgIChjb2RlOiBudW1iZXIgfCB1bmRlZmluZWQsIHNpZ25hbDogU2lnbmFsIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICBjb2RlLFxuICAgICAgICAgICAgc2lnbmFsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgKVxuXG4gICAgICAvLyBBYm9ydCBvbiBlcnJvcnMuXG4gICAgICBjaGlsZFByb2Nlc3Mub25jZShQUk9DRVNTX0VSUk9SX0VWRU5ULCAoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgIHJlamVjdCh7XG4gICAgICAgICAgZXJyb3JcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSlcbiIsImltcG9ydCB7IE1lc3NhZ2VUaW1lb3V0RXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzXCJcbmltcG9ydCB7XG4gIFBST0NFU1NfQ0xPU0VfRVZFTlQsXG4gIFBST0NFU1NfREFUQV9FVkVOVCxcbiAgUFJPQ0VTU19FUlJPUl9FVkVOVFxufSBmcm9tIFwiLi4vdHlwZXNcIlxuaW1wb3J0IHR5cGUgeyBOb2RlQ2hpbGRQcm9jZXNzLCBTaWduYWwsIFZhbGlkYXRlIH0gZnJvbSBcIi4uL3R5cGVzXCJcblxuLyoqXG4gKiBBd2FpdHMgYSBzcGVjaWZpYyBtZXNzYWdlIGV2ZW50IGZyb20gYSBzcGVjaWZpZWQgY2hpbGQgcHJvY2Vzcy5cbiAqXG4gKiBAcmVtYXJrc1xuICogSGFzIGEgZGVmYXVsdCB0aW1lb3V0IG9mIDkwcy5cbiAqXG4gKiBAcGFyYW0gY2hpbGRQcm9jZXNzIC0gU3Bhd25lZCBjaGlsZCBwcm9jZXNzIHRvIG1vbml0b3IuXG4gKiBAcGFyYW0gY29tbWFuZCAtIE9wdGlvbmFsIG5hbWUgb2YgY29tbWFuZCBmb3IgZGVidWdnaW5nLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgcHJvbWlzaWZ5TWVzc2FnZSA9XG4gIChjaGlsZFByb2Nlc3M6IE5vZGVDaGlsZFByb2Nlc3MsIGNvbW1hbmQ/OiBzdHJpbmcpID0+XG4gICh2YWxpZGF0ZTogVmFsaWRhdGUsIHRpbWVvdXQ6IG51bWJlciA9IDkwMDAwKTogUHJvbWlzZTxzdHJpbmc+ID0+XG4gICAgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgLy8gSWYgYSB0aW1lb3V0IHdhcyByZXF1ZXN0ZWQsIHN0YXJ0IGEgdGltZXIgdG8gcmVqZWN0IHByb21pc2UgaWYgcmVhY2hlZC5cbiAgICAgIGNvbnN0IHRpbWVyOiBOb2RlSlMuVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgY29uc3QgZXJyb3I6IEVycm9yID0gbmV3IE1lc3NhZ2VUaW1lb3V0RXJyb3IoXG4gICAgICAgICAgY29tbWFuZCA/PyBjaGlsZFByb2Nlc3MucGlkLFxuICAgICAgICAgIHRpbWVvdXRcbiAgICAgICAgKVxuICAgICAgICBjb25zb2xlLndhcm4oZXJyb3IubWVzc2FnZSlcbiAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgfSwgdGltZW91dClcblxuICAgICAgLy8gQWJvcnQgb2JzZXJ2ZXIgaWYgcHJvY2VzcyBjbG9zZXMgYmVmb3JlIGEgbWF0Y2ggaXMgZm91bmQuXG4gICAgICBjb25zdCBvbkNsb3NlID0gKFxuICAgICAgICBjb2RlOiBudW1iZXIgfCB1bmRlZmluZWQsXG4gICAgICAgIHNpZ25hbDogU2lnbmFsIHwgdW5kZWZpbmVkXG4gICAgICApOiB2b2lkID0+IHtcbiAgICAgICAgcmVqZWN0KHsgY29kZSwgc2lnbmFsIH0pXG4gICAgICB9XG5cbiAgICAgIC8vIEFib3J0IG9ic2VydmVyIGlmIHByb2Nlc3MgZXJyb3JzIGJlZm9yZSBhIG1hdGNoIGlzIGZvdW5kLlxuICAgICAgY29uc3Qgb25FcnJvciA9IChlcnJvcjogRXJyb3IpOiB2b2lkID0+IHtcbiAgICAgICAgcmVqZWN0KHtcbiAgICAgICAgICBlcnJvclxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICAvLyBNYXRjaGluZyBsb2dpYywgZ2VuZXJhbGx5IGEgWm9kIHNjaGVtYSBvciBmdW5jdGlvbiB0aGF0IHRocm93cyBpZiBpbnZhbGlkLlxuICAgICAgLy8gV2UgbXVzdCByZW1vdmUgdGhpcyBsaXN0ZW5lciB1cG9uIHJlc29sdXRpb24gdG8gYXZvaWQgbWVtb3J5IGxlYWtzLlxuICAgICAgY29uc3Qgb25EYXRhID0gKGRhdGE6IEJ1ZmZlcik6IHZvaWQgPT4ge1xuICAgICAgICBjb25zdCBtZXNzYWdlOiBzdHJpbmcgPSBkYXRhLnRvU3RyaW5nKCkudHJpbSgpXG5cbiAgICAgICAgaWYgKCF2YWxpZGF0ZShtZXNzYWdlKSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xlYXIgdGhlIHJlamVjdGlvbiB0aW1lb3V0LlxuICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpXG5cbiAgICAgICAgY29uc29sZS5kZWJ1ZyhgTWF0Y2hlZCBhd2FpdGVkIG1lc3NhZ2UgZnJvbSBjaGlsZCBwcm9jZXNzLmAsIG1lc3NhZ2UpXG5cbiAgICAgICAgY2hpbGRQcm9jZXNzLnN0ZG91dD8ub2ZmKFBST0NFU1NfREFUQV9FVkVOVCwgb25EYXRhKVxuICAgICAgICBjaGlsZFByb2Nlc3Muc3RkZXJyPy5vZmYoUFJPQ0VTU19EQVRBX0VWRU5ULCBvbkRhdGEpXG5cbiAgICAgICAgY2hpbGRQcm9jZXNzLm9mZihQUk9DRVNTX0NMT1NFX0VWRU5ULCBvbkNsb3NlKVxuICAgICAgICBjaGlsZFByb2Nlc3Mub2ZmKFBST0NFU1NfRVJST1JfRVZFTlQsIG9uRXJyb3IpXG5cbiAgICAgICAgcmVzb2x2ZShtZXNzYWdlKVxuICAgICAgfVxuXG4gICAgICBjaGlsZFByb2Nlc3Muc3Rkb3V0Py5vbihQUk9DRVNTX0RBVEFfRVZFTlQsIG9uRGF0YSlcbiAgICAgIGNoaWxkUHJvY2Vzcy5zdGRlcnI/Lm9uKFBST0NFU1NfREFUQV9FVkVOVCwgb25EYXRhKVxuXG4gICAgICBjaGlsZFByb2Nlc3Mub25jZShQUk9DRVNTX0NMT1NFX0VWRU5ULCBvbkNsb3NlKVxuICAgICAgY2hpbGRQcm9jZXNzLm9uY2UoUFJPQ0VTU19FUlJPUl9FVkVOVCwgb25FcnJvcilcbiAgICB9KVxuIiwiaW1wb3J0IHsgT3BlblRpbWVvdXRFcnJvciB9IGZyb20gXCIuLi9lcnJvcnNcIlxuaW1wb3J0IHsgUFJPQ0VTU19FUlJPUl9FVkVOVCwgUFJPQ0VTU19TUEFXTl9FVkVOVCB9IGZyb20gXCIuLi90eXBlc1wiXG5pbXBvcnQgdHlwZSB7IE5vZGVDaGlsZFByb2Nlc3MgfSBmcm9tIFwiLi4vdHlwZXNcIlxuXG4vKipcbiAqIEF3YWl0cyBhIGBzcGF3bmAgZXZlbnQgZnJvbSBhIHNwZWNpZmllZCBjaGlsZCBwcm9jZXNzLlxuICpcbiAqIEBwYXJhbSBjaGlsZFByb2Nlc3MgLSBTcGF3bmVkIGNoaWxkIHByb2Nlc3MgdG8gbW9uaXRvci5cbiAqIEBwYXJhbSBjb21tYW5kIC0gT3B0aW9uYWwgbmFtZSBvZiBjb21tYW5kIGZvciBkZWJ1Z2dpbmcuXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBwcm9taXNpZnlPcGVuID1cbiAgKGNoaWxkUHJvY2VzczogTm9kZUNoaWxkUHJvY2VzcywgY29tbWFuZD86IHN0cmluZykgPT5cbiAgYXN5bmMgKHRpbWVvdXQ/OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+ID0+XG4gICAgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgLy8gSWYgcHJvY2VzcyBhbHJlYWR5IG9wZW4sIHJldHVybiBpbW1lZGlhdGVseS5cbiAgICAgIGlmIChjaGlsZFByb2Nlc3MucGlkKSB7XG4gICAgICAgIHJlc29sdmUoKVxuICAgICAgfVxuXG4gICAgICAvLyBEbyBub3QgYXdhaXQga2lsbGVkIHByb2Nlc3Nlcy5cbiAgICAgIGlmIChjaGlsZFByb2Nlc3Mua2lsbGVkKSB7XG4gICAgICAgIHJlamVjdChgQ2Fubm90IGF3YWl0IG9wZW4gb24ga2lsbGVkIHByb2Nlc3MuYClcbiAgICAgIH1cblxuICAgICAgLy8gQWJvcnQgb24gZXJyb3JzIHdoaWxlIHNwYXduaW5nLlxuICAgICAgY29uc3Qgb25FcnJvciA9IChlcnJvcj86IEVycm9yKTogdm9pZCA9PiB7XG4gICAgICAgIHJlamVjdChlcnJvcilcbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIHN1Y2Nlc3NmdWwgc3Bhd24gZXZlbnQuXG4gICAgICBjb25zdCBvblNwYXduID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICAvLyBSZW1vdmUgYWJvcnQgbGlzdGVuZXIuXG4gICAgICAgIGNoaWxkUHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcihQUk9DRVNTX0VSUk9SX0VWRU5ULCBvbkVycm9yKVxuXG4gICAgICAgIC8vIE9uY2UgcHJvY2VzcyBpcyBzcGF3bmVkLCBjb252ZXJ0IHRvIG9ic2VydmFibGUuXG4gICAgICAgIHJlc29sdmUoKVxuICAgICAgfVxuXG4gICAgICAvLyBCaW5kIGxpc3RlbmVycy5cbiAgICAgIGNoaWxkUHJvY2Vzcy5vbmNlKFBST0NFU1NfRVJST1JfRVZFTlQsIG9uRXJyb3IpXG4gICAgICBjaGlsZFByb2Nlc3Mub25jZShQUk9DRVNTX1NQQVdOX0VWRU5ULCBvblNwYXduKVxuXG4gICAgICAvLyBJZiBhIHRpbWVvdXQgd2FzIHJlcXVlc3RlZCwgYWJvcnQgaWYgcmVhY2hlZC5cbiAgICAgIGlmICh0aW1lb3V0KSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGVycm9yOiBFcnJvciA9IG5ldyBPcGVuVGltZW91dEVycm9yKFxuICAgICAgICAgICAgY29tbWFuZCA/PyBjaGlsZFByb2Nlc3MucGlkLFxuICAgICAgICAgICAgdGltZW91dFxuICAgICAgICAgIClcbiAgICAgICAgICBjb25zb2xlLndhcm4oZXJyb3IubWVzc2FnZSlcbiAgICAgICAgICByZWplY3QoZXJyb3IpXG4gICAgICAgIH0sIHRpbWVvdXQpXG4gICAgICB9XG4gICAgfSlcbiIsImltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSBcIm5vZGU6ZXZlbnRzXCJcbmltcG9ydCB7IGRlZmVyIH0gZnJvbSBcIkBub2Rlc3VpdGUvZGVmZXJcIlxuaW1wb3J0IHR5cGUgeyBEZWZlcnJhbCB9IGZyb20gXCJAbm9kZXN1aXRlL2RlZmVyXCJcblxuaW1wb3J0IHsgUHJvY2Vzc05vdEF2YWlsYWJsZUVycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiXG5pbXBvcnQgeyBQUk9DRVNTX0NMT1NFX0VWRU5ULCBQUk9DRVNTX09QRU5fRVZFTlQgfSBmcm9tIFwiLi4vdHlwZXNcIlxuaW1wb3J0IHR5cGUgeyBDaGlsZFByb2Nlc3MgfSBmcm9tIFwiLi4vdHlwZXNcIlxuXG4vKipcbiAqIEFic3RyYWN0IHV0aWxpdHkgd3JhcHBlciBmb3IgYnVpbGRpbmcgcHJvY2Vzcy1iYXNlZCBjbGFzc2VzLlxuICpcbiAqIEByZW1hcmtzXG4gKiBJbmhlcml0b3JzIHNob3VsZCBpbXBsZW1lbnQgb3duIFwib3BlblwiIGFuZCBcImNsb3NlXCIgbG9naWMgd2hpY2ggaXMgcHJvdmlkZWQgdG9cbiAqIHRoZSBcInNldE9wZW5cIiBhbmQgXCJzZXRDbG9zZVwiIGhhbmRsZXJzLlxuICpcbiAqIEltcG9ydGFudGx5LCB0byByZWxlYXNlIHRoZSBvcGVuZXIgYW5kIGNsb3NlciBwcm9taXNlcywgdGhlIFwib3BlblwiIGFuZCBcImNsb3NlXCJcbiAqIGxvZ2ljIHNob3VsZCBlbWl0IHRoZSBhcHByb3ByaWF0ZSBwcm9jZXNzIGV2ZW50IHRvIHNpZ25hbCByZWFkeSBzdGF0ZS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBQcm9jZXNzTWFuYWdlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIC8qKlxuICAgKiBTdGF0aWMgcmVmZXJlbmNlIHRvIHRoZSBpbnRlbmRlZCBleGVjdXRhYmxlIHBhdGguXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJvdGVjdGVkIF9jb21tYW5kOiBzdHJpbmcgfCB1bmRlZmluZWRcblxuICAvKipcbiAgICogSW50ZXJuYWwgY2hpbGQgcHJvY2Vzcy5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwcm90ZWN0ZWQgX3Byb2Nlc3M6IENoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZFxuXG4gIC8qKlxuICAgKiBEZWZlcnJlZCBwcm9taXNlIHRvIHByZXNlbnQgaWYgb3BlbmluZyBwcm9jZXNzIGhhcyBhbHJlYWR5IGJlZ3VuLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHJlYWRvbmx5ICNvcGVuZXI6IERlZmVycmFsID0gZGVmZXIoKVxuXG4gIC8qKlxuICAgKiBEZWZlcnJlZCBwcm9taXNlIHRvIHByZXNlbnQgaWYgY2xvc2luZyBwcm9jZXNzIGhhcyBhbHJlYWR5IGJlZ3VuLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHJlYWRvbmx5ICNjbG9zZXI6IERlZmVycmFsID0gZGVmZXIoKVxuXG4gIC8qKlxuICAgKiBGbGFnIHRvIGF2b2lkIG11bHRpcGxlIG9wZW4uXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgI2lzT3BlbmluZzogYm9vbGVhbiA9IGZhbHNlXG5cbiAgLyoqXG4gICAqIEZsYWcgdG8gYXZvaWQgbXVsdGlwbGUgY2xvc2VzLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gICNpc0Nsb3Npbmc6IGJvb2xlYW4gPSBmYWxzZVxuXG4gIC8qKlxuICAgKiBBY2Nlc3MgdGhlIGV4ZWN1dGFibGUgcGF0aCBvZiB0aGUgdW5kZXJseWluZyBjaGlsZCBwcm9jZXNzLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbW1hbmQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fY29tbWFuZFxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwcm9jZXNzIGlkIG9mIHRoZSBpbnRlcm5hbCBjaGlsZCBwcm9jZXNzLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBpZCgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnByb2Nlc3MoKS5waWRcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBvc2UgdGhlIGludGVybmFsIGNoaWxkIHByb2Nlc3MgYW5kIGFzc2VydCByZWFkeSBzdGF0ZS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKi9cbiAgcHVibGljIHByb2Nlc3MoKTogQ2hpbGRQcm9jZXNzIHtcbiAgICBpZiAoIXRoaXMuX3Byb2Nlc3MpIHtcbiAgICAgIHRocm93IG5ldyBQcm9jZXNzTm90QXZhaWxhYmxlRXJyb3IodGhpcy5jb21tYW5kKVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcHJvY2Vzc1xuICB9XG5cbiAgLyoqXG4gICAqIEF3YWl0cyB0aGUgZGVmZXJyZWQgY2xvc2UgZXZlbnQuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICovXG4gIHB1YmxpYyB1bnRpbENsb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLiNjbG9zZXIudW50aWxSZXNvbHZlZCgpXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBleGlzdGluZyBvcGVuIG9yIHNldHMgYW4gb3BlbmluZyBzdGF0ZS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogVGhpcyBpcyB1c2VkIHRvIHN0YWNrIGR1cGxpY2F0ZSBvcGVuIGNhbGxzIGludG8gdGhlIHNpbmdsZSBwcm9taXNlLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByb3RlY3RlZCBfc2V0T3BlbihvcGVuOiAoKSA9PiBQcm9taXNlPHZvaWQ+KTogUHJvbWlzZTx2b2lkPiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuI2lzT3BlbmluZykge1xuICAgICAgcmV0dXJuIHRoaXMuI29wZW5lci5wcm9taXNlXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub25jZShQUk9DRVNTX09QRU5fRVZFTlQsICgpID0+IHRoaXMuI29wZW5lci5yZXNvbHZlKCkpXG4gICAgICByZXR1cm4gb3BlbigpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gZXhpc3RpbmcgY2xvc2Ugb3Igc2V0cyBhIGNsb3Npbmcgc3RhdGUuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFRoaXMgaXMgdXNlZCB0byBzdGFjayBkdXBsaWNhdGUgY2xvc2UgY2FsbHMgaW50byB0aGUgc2luZ2xlIHByb21pc2UuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJvdGVjdGVkIF9zZXRDbG9zZShjbG9zZTogKCkgPT4gUHJvbWlzZTx2b2lkPik6IFByb21pc2U8dm9pZD4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLiNpc0Nsb3NpbmcpIHtcbiAgICAgIHJldHVybiB0aGlzLiNjbG9zZXIucHJvbWlzZVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9uY2UoUFJPQ0VTU19DTE9TRV9FVkVOVCwgKCkgPT4gdGhpcy4jY2xvc2VyLnJlc29sdmUoKSlcbiAgICAgIHJldHVybiBjbG9zZSgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbXBsZXRlcyB0aGUgb3BlbmluZyBwcm9jZXNzIGlmIHN0YXJ0ZWQuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJvdGVjdGVkIF9jb21wbGV0ZU9wZW4oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3Byb2Nlc3MpIHtcbiAgICAgIHRoaXMuZW1pdChQUk9DRVNTX09QRU5fRVZFTlQpXG4gICAgICB0aGlzLiNvcGVuZXIucmVzb2x2ZSgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBQcm9jZXNzTm90QXZhaWxhYmxlRXJyb3IodGhpcy5jb21tYW5kKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wbGV0ZXMgdGhlIGNsb3NpbmcgcHJvY2VzcyBpZiBzdGFydGVkLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByb3RlY3RlZCBfY29tcGxldGVDbG9zZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fcHJvY2Vzcykge1xuICAgICAgdGhpcy5fcHJvY2Vzcy50aW1lci5zdG9wKClcbiAgICAgIHRoaXMuZW1pdChQUk9DRVNTX0NMT1NFX0VWRU5UKVxuICAgICAgdGhpcy4jY2xvc2VyLnJlc29sdmUoKVxuICAgICAgdGhpcy5fcHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMoKVxuICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgUHJvY2Vzc05vdEF2YWlsYWJsZUVycm9yKHRoaXMuY29tbWFuZClcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IGNvbmZpZ3VyZSwgbm9kZVNwYXduIH0gZnJvbSBcIi4uL3N1cHBvcnRcIlxuaW1wb3J0IHsgU1BBV04gfSBmcm9tIFwiLi4vdHlwZXNcIlxuaW1wb3J0IHsgbWFuYWdlIH0gZnJvbSBcIi4vbWFuYWdlXCJcbmltcG9ydCB0eXBlIHtcbiAgQ2hpbGRQcm9jZXNzLFxuICBFeGVjdXRpb25NZXRob2QsXG4gIFByb2Nlc3NDb25maWcsXG4gIFNwYXduT3B0aW9uc1xufSBmcm9tIFwiLi4vdHlwZXNcIlxuXG4vKipcbiAqIFNwYXducyBhbiBvYnNlcnZhYmxlIGNoaWxkIHByb2Nlc3MgYW5kIGF3YWl0cyBhIHJlYWR5IHN0YXRlLlxuICpcbiAqIEByZW1hcmtzXG4gKiBPcHRpb25hbGx5IGF0dGFjaGVzIGhvb2tzIHRvIGFueSB2YWxpZCBjaGlsZCBwcm9jZXNzIGV2ZW50LlxuICogQXV0b21hdGljYWxseSBpbmplY3RzIHByb2Nlc3MuZW52IGludG8gZW52IG9wdGlvbnMuXG4gKiBGb3JrZWQgcHJvY2Vzc2VzIFwiaW5oZXJpdFwiIHN0ZGlvIHJhdGhlciB0aGFuIFwicGlwZVwiIGFzIGRlZmF1bHQuXG4gKiBFbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBjdXJyZW50IHByb2Nlc3MgYXJlIGluamVjdGVkIHRocm91Z2ggdG8gY2hpbGQgcHJvY2Vzcy5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBzcGF3biA9IGFzeW5jIChcbiAgY29tbWFuZDogc3RyaW5nLFxuICBhcmdzOiBzdHJpbmdbXSA9IFtdLFxuICBvcHRpb25zOiBTcGF3bk9wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTxDaGlsZFByb2Nlc3M+ID0+IHtcbiAgLy8gQ29uZmlndXJlIGFyZ3MgYW5kIG9wdGlvbnMuXG4gIGNvbnN0IGNvbmZpZzogUHJvY2Vzc0NvbmZpZzxTcGF3bk9wdGlvbnM+ID0gY29uZmlndXJlKHsgYXJncywgb3B0aW9ucyB9KVxuICBjb25zdCBtZXRob2Q6IEV4ZWN1dGlvbk1ldGhvZCA9IFNQQVdOXG4gIGNvbnN0IGZpbHRlcnM6IHN0cmluZ1tdID0gb3B0aW9ucy5maWx0ZXJzID8/IFtdXG5cbiAgLy8gU3Bhd24gYSBuZXcgY2hpbGQgcHJvY2Vzcy5cbiAgY29uc3QgY2hpbGRQcm9jZXNzOiBDaGlsZFByb2Nlc3MgPSBtYW5hZ2UoXG4gICAgbm9kZVNwYXduKGNvbW1hbmQsIGNvbmZpZy5hcmdzLCBjb25maWcub3B0aW9ucyksXG4gICAge1xuICAgICAgY29tbWFuZCxcbiAgICAgIG1ldGhvZCxcbiAgICAgIGZpbHRlcnNcbiAgICB9XG4gIClcblxuICAvLyBBd2FpdCBjb21wbGV0ZWQgc3Bhd24gZXZlbnQuXG4gIGF3YWl0IGNoaWxkUHJvY2Vzcy51bnRpbE9wZW4oKVxuXG4gIHJldHVybiBjaGlsZFByb2Nlc3Ncbn1cbiJdfQ==
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9lcnJvcnMvbWVzc2FnZS10aW1lb3V0LmVycm9yLnRzIiwiLi4vc3JjL2Vycm9ycy9vcGVuLXRpbWVvdXQuZXJyb3IudHMiLCIuLi9zcmMvZXJyb3JzL3Byb2Nlc3MtY29uZmlndXJhdGlvbi5lcnJvci50cyIsIi4uL3NyYy9lcnJvcnMvcHJvY2Vzcy1leGVjdXRpb24uZXJyb3IudHMiLCIuLi9zcmMvZXJyb3JzL3Byb2Nlc3Mtbm90LWF2YWlsYWJsZS5lcnJvci50cyIsIi4uL3NyYy9lcnJvcnMvcHJvY2Vzcy1zcGF3bi5lcnJvci50cyIsIi4uL3NyYy9lcnJvcnMvcHJvY2Vzcy10ZXJtaW5hdGlvbi5lcnJvci50cyIsIi4uL3NyYy9zdXBwb3J0L2NvbmZpZ3VyZS50cyIsIi4uL3NyYy9zdXBwb3J0L2RlbGF5LnRzIiwiLi4vc3JjL3N1cHBvcnQvdmVuZG9yLnRzIiwiLi4vc3JjL2NvcmUvZXhlYy50cyIsIi4uL3NyYy90eXBlcy9ldmVudHMudHMiLCIuLi9zcmMvdHlwZXMvbWV0aG9kcy50cyIsIi4uL3NyYy90eXBlcy9zZXJpYWxpemFibGUudHMiLCIuLi9zcmMvdHlwZXMvc2lnbmFscy50cyIsIi4uL3NyYy90eXBlcy9zdGF0ZXMudHMiLCIuLi9zcmMvdHlwZXMvc3RkaW8udHMiLCIuLi9zcmMvdHlwZXMvdmVuZG9yLnRzIiwiLi4vc3JjL2NvcmUva2lsbC50cyIsIi4uL3NyYy9jb3JlL21hbmFnZS50cyIsIi4uL3NyYy9wcm9taXNlcy9jbG9zZS50cyIsIi4uL3NyYy9wcm9taXNlcy9tZXNzYWdlLnRzIiwiLi4vc3JjL3Byb21pc2VzL29wZW4udHMiLCIuLi9zcmMvY29yZS9tYW5hZ2VyLnRzIiwiLi4vc3JjL2NvcmUvc3Bhd24udHMiXSwibmFtZXMiOlsiTWVzc2FnZVRpbWVvdXRFcnJvciIsImNvbW1hbmQiLCJ0aW1lb3V0IiwiT3BlblRpbWVvdXRFcnJvciIsIlByb2Nlc3NDb25maWd1cmF0aW9uRXJyb3IiLCJjb25maWciLCJlcnJvciIsIlByb2Nlc3NFeGVjdXRpb25FcnJvciIsInN0ZGVyciIsIlByb2Nlc3NOb3RBdmFpbGFibGVFcnJvciIsIlByb2Nlc3NTcGF3bkVycm9yIiwiUHJvY2Vzc1Rlcm1pbmF0aW9uRXJyb3IiLCJjb25maWd1cmUiLCJwYXJzZUFyZ3MiLCJhcmdzIiwidmFsdWUiLCJtZXJnZUVudiIsImVudiIsInBhcnNlT3B0aW9ucyIsInN0ZGlvIiwib3B0aW9ucyIsImRlbGF5IiwibXMiLCJyZXNvbHZlIiwiZXhlYyIsImZvcmsiLCJzcGF3biIsInByb21pc2lmeSIsIm5vZGVFeGVjIiwibm9kZVNwYXduIiwibm9kZUZvcmsiLCJzdGRvdXQiLCJQUk9DRVNTX0NMT1NFX0VWRU5UIiwiUFJPQ0VTU19EQVRBX0VWRU5UIiwiUFJPQ0VTU19ESVNDT05ORUNUX0VWRU5UIiwiUFJPQ0VTU19FUlJPUl9FVkVOVCIsIlBST0NFU1NfRVhJVF9FVkVOVCIsIlBST0NFU1NfTUVTU0FHRV9FVkVOVCIsIlBST0NFU1NfT1BFTl9FVkVOVCIsIlBST0NFU1NfU1BBV05fRVZFTlQiLCJwcm9jZXNzRXZlbnRzIiwiY2xvc2VFdmVudHMiLCJFWEVDIiwiU1BBV04iLCJGT1JLIiwiS0lMTCIsImV4ZWN1dGlvbk1ldGhvZHMiLCJTVFJJTkdfVFlQRSIsIk9CSkVDVF9UWVBFIiwiTlVNQkVSX1RZUEUiLCJCT09MRUFOX1RZUEUiLCJCSUdJTlRfVFlQRSIsInNlcmlhbGl6YWJsZVR5cGVzIiwiU0lHQUxSTSIsIlNJR0JVUyIsIlNJR0NITEQiLCJTSUdDT05UIiwiU0lHRlBFIiwiU0lHSFVQIiwiU0lHSUxMIiwiU0lHSU5UIiwiU0lHSU8iLCJTSUdJT1QiLCJTSUdLSUxMIiwiU0lHUElQRSIsIlNJR1BPTEwiLCJTSUdQUk9GIiwiU0lHUFdSIiwiU0lHUVVJVCIsIlNJR1NFR1YiLCJTSUdTVEtGTFQiLCJTSUdTVE9QIiwiU0lHU1lTIiwiU0lHVEVSTSIsIlNJR1RSQVAiLCJTSUdUU1RQIiwiU0lHVFRJTiIsIlNJR1RUT1UiLCJTSUdVTlVTRUQiLCJTSUdVUkciLCJTSUdVU1IxIiwiU0lHVVNSMiIsIlNJR1ZUQUxSTSIsIlNJR1dJTkNIIiwiU0lHWENQVSIsIlNJR1hGU1oiLCJTSUdCUkVBSyIsIlNJR0xPU1QiLCJTSUdJTkZPIiwic2lnbmFscyIsIlBST0NFU1NfT1BFTklOR19TVEFURSIsIlBST0NFU1NfT1BFTkVEX1NUQVRFIiwiUFJPQ0VTU19DTE9TSU5HX1NUQVRFIiwiUFJPQ0VTU19DTE9TRURfU1RBVEUiLCJwcm9jZXNzU3RhdGVzIiwiSU9fT1ZFUkxBUFBFRCIsIklPX1BJUEUiLCJJT19JR05PUkUiLCJJT19JTkhFUklUIiwiSU9fSVBDIiwiaW9UeXBlcyIsIlNURElOIiwiU1RET1VUIiwiU1RERVJSIiwiU1RESU8iLCJpbnB1dFR5cGVzIiwib3V0cHV0VHlwZXMiLCJpc1Byb2Nlc3NFcnJvciIsImtpbGwiLCJjaGlsZFByb2Nlc3MiLCJldmVudCIsInNpZ25hbCIsImkiLCJyZWplY3QiLCJUaW1lciIsInByb21pc2lmeUNsb3NlIiwiY29kZSIsInByb21pc2lmeU1lc3NhZ2UiLCJ2YWxpZGF0ZSIsIl9hIiwiX2IiLCJ0aW1lciIsIm9uQ2xvc2UiLCJvbkVycm9yIiwib25EYXRhIiwiZGF0YSIsIm1lc3NhZ2UiLCJwcm9taXNpZnlPcGVuIiwib25TcGF3biIsIm1hbmFnZSIsIm5hdGl2ZUNoaWxkUHJvY2VzcyIsIm1ldGhvZCIsImZpbHRlcnMiLCJmaWx0ZXIiLCJvblN0ZG91dCIsIm9uU3RkZXJyIiwiRXZlbnRFbWl0dGVyIiwiZGVmZXIiLCJQcm9jZXNzTWFuYWdlciIsIiNvcGVuZXIiLCIjY2xvc2VyIiwiI2lzT3BlbmluZyIsIiNpc0Nsb3NpbmciLCJvcGVuIiwiY2xvc2UiXSwibWFwcGluZ3MiOiJBQUtPLElBQU1BLEVBQU4sY0FBa0MsS0FBTSxDQUl0QyxZQUFZQyxFQUFzQ0MsRUFBaUIsQ0FDeEUsTUFDRSxzQ0FBc0NELHNCQUE0QkMsTUFDcEUsRUFDQSxLQUFLLFFBQVVELEVBQ2YsS0FBSyxRQUFVQyxDQUNqQixDQUNGLEVD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IFRocm93cyB3aGVuIGFuIGF3YWl0ZWQgbWVzc2FnZSBkb2VzIG5vdCByZXR1cm4gZnJvbSBjaGlsZCBwcm9jZXNzIHdpdGhpbiBnaXZlbiB0aW1lb3V0LlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIE1lc3NhZ2VUaW1lb3V0RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHB1YmxpYyByZWFkb25seSBjb21tYW5kOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWRcbiAgcHVibGljIHJlYWRvbmx5IHRpbWVvdXQ6IG51bWJlclxuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihjb21tYW5kOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQsIHRpbWVvdXQ6IG51bWJlcikge1xuICAgIHN1cGVyKFxuICAgICAgYE1lc3NhZ2UgbGlzdGVuZXIgb24gY2hpbGQgcHJvY2VzcyBcIiR7Y29tbWFuZH1cIiB0aW1lZCBvdXQgYWZ0ZXIgJHt0aW1lb3V0fW1zLmBcbiAgICApXG4gICAgdGhpcy5jb21tYW5kID0gY29tbWFuZFxuICAgIHRoaXMudGltZW91dCA9IHRpbWVvdXRcbiAgfVxufVxuIiwiLyoqXG4gKiBUaHJvd3Mgd2hlbiBhIGNoaWxkIHByb2Nlc3MgZG9lcyBub3Qgb3BlbiB3aXRoaW4gZ2l2ZW4gdGltZW91dC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBPcGVuVGltZW91dEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBwdWJsaWMgcmVhZG9ubHkgY29tbWFuZDogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkXG4gIHB1YmxpYyByZWFkb25seSB0aW1lb3V0OiBudW1iZXJcblxuICBwdWJsaWMgY29uc3RydWN0b3IoY29tbWFuZDogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkLCB0aW1lb3V0OiBudW1iZXIpIHtcbiAgICBzdXBlcihcbiAgICAgIGBPcGVuIHN0YXRlIGxpc3RlbmVyIG9uIGNoaWxkIHByb2Nlc3MgXCIke2NvbW1hbmR9XCIgdGltZWQgb3V0IGFmdGVyICR7dGltZW91dH1tcy5gXG4gICAgKVxuICAgIHRoaXMuY29tbWFuZCA9IGNvbW1hbmRcbiAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgT3B0aW9ucywgUHJvY2Vzc0NvbmZpZyB9IGZyb20gXCIuLi90eXBlc1wiXG5cbmV4cG9ydCBjbGFzcyBQcm9jZXNzQ29uZmlndXJhdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBwdWJsaWMgcmVhZG9ubHkgY29uZmlnOiBQYXJ0aWFsPFByb2Nlc3NDb25maWc8T3B0aW9ucz4+XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKGNvbmZpZzogUGFydGlhbDxQcm9jZXNzQ29uZmlnPE9wdGlvbnM+PiwgZXJyb3I6IEVycm9yKSB7XG4gICAgc3VwZXIoXG4gICAgICBgRW5jb3VudGVyZWQgYW4gZXJyb3Igd2hpbGUgY29uZmlndXJpbmcgY2hpbGQgcHJvY2VzczogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgY29uZmlnXG4gICAgICApfWAsXG4gICAgICB7XG4gICAgICAgIGNhdXNlOiBlcnJvclxuICAgICAgfVxuICAgIClcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZ1xuICB9XG59XG4iLCJleHBvcnQgY2xhc3MgUHJvY2Vzc0V4ZWN1dGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBwdWJsaWMgcmVhZG9ubHkgY29tbWFuZDogc3RyaW5nXG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKGNvbW1hbmQ6IHN0cmluZywgc3RkZXJyPzogc3RyaW5nKSB7XG4gICAgc3VwZXIoYEVuY291bnRlcmVkIGFuIGVycm9yIGV4ZWN1dGluZyBjaGlsZCBwcm9jZXNzICR7Y29tbWFuZH06ICR7c3RkZXJyfWApXG4gICAgdGhpcy5jb21tYW5kID0gY29tbWFuZFxuICB9XG59XG4iLCJleHBvcnQgY2xhc3MgUHJvY2Vzc05vdEF2YWlsYWJsZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBwdWJsaWMgcmVhZG9ubHkgY29tbWFuZDogc3RyaW5nXG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKGNvbW1hbmQ6IHN0cmluZyA9IFwiYXQgdW5zcGVjaWZpZWQgZXhlY3V0YWJsZSBwYXRoXCIpIHtcbiAgICBzdXBlcihgRW5jb3VudGVyZWQgYW4gZXJyb3Igc3Bhd25pbmcgY2hpbGQgcHJvY2VzcyAke2NvbW1hbmR9LmApXG4gICAgdGhpcy5jb21tYW5kID0gY29tbWFuZFxuICB9XG59XG4iLCJleHBvcnQgY2xhc3MgUHJvY2Vzc1NwYXduRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHB1YmxpYyByZWFkb25seSBjb21tYW5kOiBzdHJpbmdcblxuICBwdWJsaWMgY29uc3RydWN0b3IoY29tbWFuZDogc3RyaW5nLCBzdGRlcnI/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihgRW5jb3VudGVyZWQgYW4gZXJyb3Igc3Bhd25pbmcgY2hpbGQgcHJvY2VzcyAke2NvbW1hbmR9OiAke3N0ZGVycn1gKVxuICAgIHRoaXMuY29tbWFuZCA9IGNvbW1hbmRcbiAgfVxufVxuIiwiZXhwb3J0IGNsYXNzIFByb2Nlc3NUZXJtaW5hdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBwdWJsaWMgcmVhZG9ubHkgY29tbWFuZDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gIHB1YmxpYyByZWFkb25seSBlcnJvcjogRXJyb3JcblxuICBwdWJsaWMgY29uc3RydWN0b3IoY29tbWFuZDogc3RyaW5nIHwgdW5kZWZpbmVkLCBlcnJvcjogRXJyb3IpIHtcbiAgICBzdXBlcihcbiAgICAgIGBFbmNvdW50ZXJlZCBhbiBlcnJvciBraWxsaW5nIGNoaWxkIHByb2Nlc3MgJHtjb21tYW5kfTogJHtlcnJvci5tZXNzYWdlfWAsXG4gICAgICB7IGNhdXNlOiBlcnJvciB9XG4gICAgKVxuICAgIHRoaXMuY29tbWFuZCA9IGNvbW1hbmRcbiAgICB0aGlzLmVycm9yID0gZXJyb3JcbiAgfVxufVxuIiwiaW1wb3J0IHsgUHJvY2Vzc0NvbmZpZ3VyYXRpb25FcnJvciB9IGZyb20gXCIuLi9lcnJvcnNcIlxuaW1wb3J0IHR5cGUge1xuICBFeGVjT3B0aW9ucyxcbiAgRm9ya09wdGlvbnMsXG4gIFByb2Nlc3NDb25maWcsXG4gIFByb2Nlc3NFbnYsXG4gIFNwYXduT3B0aW9uc1xufSBmcm9tIFwiLi4vdHlwZXNcIlxuXG4vKipcbiAqIFByZXBhcmVzIGNoaWxkIHByb2Nlc3MgYXJndW1lbnRzIGFuZCBvcHRpb25zIHByaW9yIHRvIGV4ZWN1dGlvbi5cbiAqXG4gKiBAcGFyYW0gY29uZmlnIC0gVXNlciBpbnB1dCBhcyBjb25maWd1cmF0aW9uIG9iamVjdC5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGNvbmZpZ3VyZSA9IDxPIGV4dGVuZHMgU3Bhd25PcHRpb25zIHwgRm9ya09wdGlvbnMgfCBFeGVjT3B0aW9ucz4oXG4gIGNvbmZpZzogUHJvY2Vzc0NvbmZpZzxPPlxuKTogUHJvY2Vzc0NvbmZpZzxPPiA9PiB7XG4gIHRyeSB7XG4gICAgLy8gU3RyaXBzIGVtcHR5IGVsZW1lbnRzIGFuZCB0cmltcyBhcmdzIGFycmF5LlxuICAgIGNvbnN0IHBhcnNlQXJncyA9IChjb21tYW5kOiBzdHJpbmcgPSBcIlwiLCBhcmdzOiBzdHJpbmdbXSA9IFtdKTogc3RyaW5nW10gPT4gW1xuICAgICAgLi4uW2NvbW1hbmQsIC4uLmFyZ3NdXG4gICAgICAgIC5tYXAoKHZhbHVlOiBzdHJpbmcpID0+IHZhbHVlLnRyaW0oKSlcbiAgICAgICAgLmZpbHRlcigodmFsdWUpID0+ICEhdmFsdWUpXG4gICAgXVxuXG4gICAgLy8gTWVyZ2VzIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIGN1cnJlbnQgcHJvY2VzcyB3aXRoIGFueSBwcm92aWRlZCBieSBjaGlsZCBwcm9jZXNzIG9wdGlvbnMuXG4gICAgY29uc3QgbWVyZ2VFbnYgPSAoZW52OiBQcm9jZXNzRW52ID0ge30pOiBQcm9jZXNzRW52ID0+ICh7XG4gICAgICAuLi5wcm9jZXNzLmVudixcbiAgICAgIC4uLmVudlxuICAgIH0pXG5cbiAgICAvLyBNZXJnZXMgcHJvY2VzcyBvcHRpb25zIHdpdGggY3VycmVudCBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gICAgY29uc3QgcGFyc2VPcHRpb25zID0gPE8gZXh0ZW5kcyBTcGF3bk9wdGlvbnMgfCBGb3JrT3B0aW9ucyB8IEV4ZWNPcHRpb25zPih7XG4gICAgICBzdGRpbyxcbiAgICAgIC4uLm9wdGlvbnNcbiAgICB9OiBPKTogTyA9PlxuICAgICAgKHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgc3RkaW86IHN0ZGlvID8/IFtwcm9jZXNzLnN0ZGluLCBcInBpcGVcIiwgXCJwaXBlXCJdLFxuICAgICAgICBlbnY6IG1lcmdlRW52KG9wdGlvbnMuZW52KVxuICAgICAgfSBhcyBPKVxuXG4gICAgY29uc3QgYXJnczogc3RyaW5nW10gPSBwYXJzZUFyZ3MoY29uZmlnLmNvbW1hbmQsIGNvbmZpZy5hcmdzKVxuICAgIGNvbnN0IG9wdGlvbnM6IE8gPSBwYXJzZU9wdGlvbnMoY29uZmlnLm9wdGlvbnMpXG5cbiAgICByZXR1cm4ge1xuICAgICAgYXJncyxcbiAgICAgIG9wdGlvbnNcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhyb3cgbmV3IFByb2Nlc3NDb25maWd1cmF0aW9uRXJyb3IoY29uZmlnLCBlcnJvciBhcyBFcnJvcilcbiAgfVxufVxuIiwiLyoqXG4gKiBTaW1wbGUgdGltZW91dCBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0gbXMgLSBOdW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQuXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBkZWxheSA9IChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiA9PlxuICBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpXG4iLCJpbXBvcnQgeyBleGVjLCBmb3JrLCBzcGF3biB9IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIlxuaW1wb3J0IHsgcHJvbWlzaWZ5IH0gZnJvbSBcIm5vZGU6dXRpbFwiXG5cbmltcG9ydCB0eXBlIHsgTm9kZUV4ZWMsIE5vZGVGb3JrLCBOb2RlU3Bhd24gfSBmcm9tIFwiLi4vdHlwZXNcIlxuXG4vKipcbiAqIFByb21pc2lmaWVkIE5vZGUgZXhlYyBtZXRob2QuXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBub2RlRXhlYzogTm9kZUV4ZWMgPSBwcm9taXNpZnkoZXhlYylcblxuLyoqXG4gKiBPcmlnaW5hbCBub2RlIHNwYXduIG1ldGhvZC5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IG5vZGVTcGF3bjogTm9kZVNwYXduID0gc3Bhd25cblxuLyoqXG4gKiBPcmlnaW5hbCBub2RlIGZvcmsgbWV0aG9kLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3Qgbm9kZUZvcms6IE5vZGVGb3JrID0gZm9ya1xuIiwiaW1wb3J0IHsgUHJvY2Vzc0V4ZWN1dGlvbkVycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiXG5pbXBvcnQgeyBjb25maWd1cmUsIG5vZGVFeGVjIH0gZnJvbSBcIi4uL3N1cHBvcnRcIlxuaW1wb3J0IHR5cGUgeyBFeGVjT3B0aW9ucywgUHJvY2Vzc0NvbmZpZyB9IGZyb20gXCIuLi90eXBlc1wiXG5cbi8qKlxuICogUHJvdmlkZSBhc3luYyBjaGlsZCBwcm9jZXNzIGV4ZWN1dG9yLlxuICpcbiAqIEByZW1hcmtzXG4gKiBUaHJvd3MgZXJyb3Igb24gYHN0ZGVycmAgb3V0cHV0IHVubGVzcyBzdXBwcmVzc2VkLlxuICogSWYgcHJvY2VzcyBpcyBsb25nLXJ1bm5pbmcsIGRvIG5vdCBhd2FpdCB0aGUgUHJvbWlzZS5cbiAqIEVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIGN1cnJlbnQgcHJvY2VzcyBhcmUgaW5qZWN0ZWQgdGhyb3VnaCB0byBjaGlsZCBwcm9jZXNzLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGV4ZWMgPSBhc3luYyAoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgYXJnczogc3RyaW5nW10gPSBbXSxcbiAgb3B0aW9uczogRXhlY09wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgLy8gQ29uZmlndXJlIGFyZ3MgYW5kIG9wdGlvbnMuXG4gIGNvbnN0IGNvbmZpZzogUHJvY2Vzc0NvbmZpZzxFeGVjT3B0aW9ucz4gPSBjb25maWd1cmUoe1xuICAgIGNvbW1hbmQsXG4gICAgYXJncyxcbiAgICBvcHRpb25zXG4gIH0pXG5cbiAgLy8gQXdhaXQgY2hpbGQgcHJvY2VzcyBleGVjdXRpb24uXG4gIGNvbnN0IHsgc3Rkb3V0LCBzdGRlcnIgfSA9IGF3YWl0IG5vZGVFeGVjKFxuICAgIGNvbmZpZy5hcmdzLmpvaW4oYCBgKSxcbiAgICBjb25maWcub3B0aW9uc1xuICApXG5cbiAgLy8gQ2hlY2sgc3RkZXJyIGZvciBhbnkgZXJyb3IgbWVzc2FnZXMuXG4gIGlmIChzdGRlcnIpIHtcbiAgICB0aHJvdyBuZXcgUHJvY2Vzc0V4ZWN1dGlvbkVycm9yKGNvbW1hbmQsIHN0ZGVycilcbiAgfVxuXG4gIC8vIFJldHVybiBzdGRvdXQuXG4gIHJldHVybiBzdGRvdXQgPz8gXCJcIlxufVxuIiwiLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBbXG4gIFBST0NFU1NfQ0xPU0VfRVZFTlQsXG4gIFBST0NFU1NfREFUQV9FVkVOVCxcbiAgUFJPQ0VTU19ESVNDT05ORUNUX0VWRU5ULFxuICBQUk9DRVNTX0VSUk9SX0VWRU5ULFxuICBQUk9DRVNTX0VYSVRfRVZFTlQsXG4gIFBST0NFU1NfTUVTU0FHRV9FVkVOVCxcbiAgUFJPQ0VTU19PUEVOX0VWRU5ULFxuICBQUk9DRVNTX1NQQVdOX0VWRU5UXG5dID0gW1xuICBcImNsb3NlXCIsXG4gIFwiZGF0YVwiLFxuICBcImRpc2Nvbm5lY3RcIixcbiAgXCJlcnJvclwiLFxuICBcImV4aXRcIixcbiAgXCJtZXNzYWdlXCIsXG4gIFwib3BlblwiLFxuICBcInNwYXduXCJcbl0gYXMgY29uc3RcblxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBwcm9jZXNzRXZlbnRzID0gW1xuICBQUk9DRVNTX0NMT1NFX0VWRU5ULFxuICBQUk9DRVNTX0RBVEFfRVZFTlQsXG4gIFBST0NFU1NfRElTQ09OTkVDVF9FVkVOVCxcbiAgUFJPQ0VTU19FUlJPUl9FVkVOVCxcbiAgUFJPQ0VTU19FWElUX0VWRU5ULFxuICBQUk9DRVNTX01FU1NBR0VfRVZFTlQsXG4gIFBST0NFU1NfT1BFTl9FVkVOVCxcbiAgUFJPQ0VTU19TUEFXTl9FVkVOVFxuXSBhcyBjb25zdFxuXG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHR5cGUgUHJvY2Vzc0V2ZW50ID0gdHlwZW9mIHByb2Nlc3NFdmVudHNbbnVtYmVyXVxuXG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGNsb3NlRXZlbnRzID0gW1BST0NFU1NfQ0xPU0VfRVZFTlQsIFBST0NFU1NfRVhJVF9FVkVOVF0gYXMgY29uc3RcblxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB0eXBlIENsb3NlRXZlbnQgPSB0eXBlb2YgY2xvc2VFdmVudHNbbnVtYmVyXVxuIiwiLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBbRVhFQywgU1BBV04sIEZPUkssIEtJTExdID0gW1xuICBcImV4ZWNcIixcbiAgXCJzcGF3blwiLFxuICBcImZvcmtcIixcbiAgXCJraWxsXCJcbl0gYXMgY29uc3RcblxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBleGVjdXRpb25NZXRob2RzID0gW0VYRUMsIFNQQVdOLCBGT1JLLCBLSUxMXSBhcyBjb25zdFxuXG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHR5cGUgRXhlY3V0aW9uTWV0aG9kID0gdHlwZW9mIGV4ZWN1dGlvbk1ldGhvZHNbbnVtYmVyXVxuIiwiLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFtcbiAgU1RSSU5HX1RZUEUsXG4gIE9CSkVDVF9UWVBFLFxuICBOVU1CRVJfVFlQRSxcbiAgQk9PTEVBTl9UWVBFLFxuICBCSUdJTlRfVFlQRVxuXSA9IFtcInN0cmluZ1wiLCBcIm9iamVjdFwiLCBcIm51bWJlclwiLCBcImJvb2xlYW5cIiwgXCJiaWdpbnRcIl0gYXMgY29uc3RcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IHNlcmlhbGl6YWJsZVR5cGVzID0gW1xuICBTVFJJTkdfVFlQRSxcbiAgT0JKRUNUX1RZUEUsXG4gIE5VTUJFUl9UWVBFLFxuICBCT09MRUFOX1RZUEUsXG4gIEJJR0lOVF9UWVBFXG5dIGFzIGNvbnN0XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCB0eXBlIFNlcmlhbGl6YWJsZVR5cGUgPSB0eXBlb2Ygc2VyaWFsaXphYmxlVHlwZXNbbnVtYmVyXVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcmlhbGl6YWJsZVR5cGVzIHtcbiAgc3RyaW5nOiBzdHJpbmdcbiAgb2JqZWN0OiBvYmplY3RcbiAgbnVtYmVyOiBudW1iZXJcbiAgYm9vbGVhbjogYm9vbGVhblxuICBiaWdpbnQ6IGJvb2xlYW5cbn1cbiIsImV4cG9ydCBjb25zdCBbXG4gIFNJR0FMUk0sXG4gIFNJR0JVUyxcbiAgU0lHQ0hMRCxcbiAgU0lHQ09OVCxcbiAgU0lHRlBFLFxuICBTSUdIVVAsXG4gIFNJR0lMTCxcbiAgU0lHSU5ULFxuICBTSUdJTyxcbiAgU0lHSU9ULFxuICBTSUdLSUxMLFxuICBTSUdQSVBFLFxuICBTSUdQT0xMLFxuICBTSUdQUk9GLFxuICBTSUdQV1IsXG4gIFNJR1FVSVQsXG4gIFNJR1NFR1YsXG4gIFNJR1NUS0ZMVCxcbiAgU0lHU1RPUCxcbiAgU0lHU1lTLFxuICBTSUdURVJNLFxuICBTSUdUUkFQLFxuICBTSUdUU1RQLFxuICBTSUdUVElOLFxuICBTSUdUVE9VLFxuICBTSUdVTlVTRUQsXG4gIFNJR1VSRyxcbiAgU0lHVVNSMSxcbiAgU0lHVVNSMixcbiAgU0lHVlRBTFJNLFxuICBTSUdXSU5DSCxcbiAgU0lHWENQVSxcbiAgU0lHWEZTWixcbiAgU0lHQlJFQUssXG4gIFNJR0xPU1QsXG4gIFNJR0lORk9cbl0gPSBbXG4gIFwiU0lHQUxSTVwiLFxuICBcIlNJR0JVU1wiLFxuICBcIlNJR0NITERcIixcbiAgXCJTSUdDT05UXCIsXG4gIFwiU0lHRlBFXCIsXG4gIFwiU0lHSFVQXCIsXG4gIFwiU0lHSUxMXCIsXG4gIFwiU0lHSU5UXCIsXG4gIFwiU0lHSU9cIixcbiAgXCJTSUdJT1RcIixcbiAgXCJTSUdLSUxMXCIsXG4gIFwiU0lHUElQRVwiLFxuICBcIlNJR1BPTExcIixcbiAgXCJTSUdQUk9GXCIsXG4gIFwiU0lHUFdSXCIsXG4gIFwiU0lHUVVJVFwiLFxuICBcIlNJR1NFR1ZcIixcbiAgXCJTSUdTVEtGTFRcIixcbiAgXCJTSUdTVE9QXCIsXG4gIFwiU0lHU1lTXCIsXG4gIFwiU0lHVEVSTVwiLFxuICBcIlNJR1RSQVBcIixcbiAgXCJTSUdUU1RQXCIsXG4gIFwiU0lHVFRJTlwiLFxuICBcIlNJR1RUT1VcIixcbiAgXCJTSUdVTlVTRURcIixcbiAgXCJTSUdVUkdcIixcbiAgXCJTSUdVU1IxXCIsXG4gIFwiU0lHVVNSMlwiLFxuICBcIlNJR1ZUQUxSTVwiLFxuICBcIlNJR1dJTkNIXCIsXG4gIFwiU0lHWENQVVwiLFxuICBcIlNJR1hGU1pcIixcbiAgXCJTSUdCUkVBS1wiLFxuICBcIlNJR0xPU1RcIixcbiAgXCJTSUdJTkZPXCJcbl0gYXMgY29uc3RcblxuZXhwb3J0IGNvbnN0IHNpZ25hbHM6IFJlYWRvbmx5PE5vZGVKUy5TaWduYWxzW10+ID0gW1xuICBTSUdBTFJNLFxuICBTSUdCVVMsXG4gIFNJR0NITEQsXG4gIFNJR0NPTlQsXG4gIFNJR0ZQRSxcbiAgU0lHSFVQLFxuICBTSUdJTEwsXG4gIFNJR0lOVCxcbiAgU0lHSU8sXG4gIFNJR0lPVCxcbiAgU0lHS0lMTCxcbiAgU0lHUElQRSxcbiAgU0lHUE9MTCxcbiAgU0lHUFJPRixcbiAgU0lHUFdSLFxuICBTSUdRVUlULFxuICBTSUdTRUdWLFxuICBTSUdTVEtGTFQsXG4gIFNJR1NUT1AsXG4gIFNJR1NZUyxcbiAgU0lHVEVSTSxcbiAgU0lHVFJBUCxcbiAgU0lHVFNUUCxcbiAgU0lHVFRJTixcbiAgU0lHVFRPVSxcbiAgU0lHVU5VU0VELFxuICBTSUdVUkcsXG4gIFNJR1VTUjEsXG4gIFNJR1VTUjIsXG4gIFNJR1ZUQUxSTSxcbiAgU0lHV0lOQ0gsXG4gIFNJR1hDUFUsXG4gIFNJR1hGU1osXG4gIFNJR0JSRUFLLFxuICBTSUdMT1NULFxuICBTSUdJTkZPXG5dIGFzIGNvbnN0XG5cbmV4cG9ydCB0eXBlIFNpZ25hbCA9IHR5cGVvZiBzaWduYWxzW251bWJlcl1cbiIsImV4cG9ydCBjb25zdCBbXG4gIFBST0NFU1NfT1BFTklOR19TVEFURSxcbiAgUFJPQ0VTU19PUEVORURfU1RBVEUsXG4gIFBST0NFU1NfQ0xPU0lOR19TVEFURSxcbiAgUFJPQ0VTU19DTE9TRURfU1RBVEVcbl0gPSBbXCJvcGVuaW5nXCIsIFwib3BlbmVkXCIsIFwiY2xvc2luZ1wiLCBcImNsb3NlZFwiXSBhcyBjb25zdFxuXG5leHBvcnQgY29uc3QgcHJvY2Vzc1N0YXRlcyA9IFtcbiAgUFJPQ0VTU19PUEVOSU5HX1NUQVRFLFxuICBQUk9DRVNTX09QRU5FRF9TVEFURSxcbiAgUFJPQ0VTU19DTE9TSU5HX1NUQVRFLFxuICBQUk9DRVNTX0NMT1NFRF9TVEFURVxuXSBhcyBjb25zdFxuXG5leHBvcnQgdHlwZSBQcm9jZXNzU3RhdGUgPSB0eXBlb2YgcHJvY2Vzc1N0YXRlc1tudW1iZXJdXG4iLCIvKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IFtJT19PVkVSTEFQUEVELCBJT19QSVBFLCBJT19JR05PUkUsIElPX0lOSEVSSVQsIElPX0lQQ10gPSBbXG4gIFwib3ZlcmxhcHBlZFwiLFxuICBcInBpcGVcIixcbiAgXCJpZ25vcmVcIixcbiAgXCJpbmhlcml0XCIsXG4gIFwiaXBjXCJcbl0gYXMgY29uc3RcblxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBpb1R5cGVzID0gW1xuICBJT19PVkVSTEFQUEVELFxuICBJT19QSVBFLFxuICBJT19JR05PUkUsXG4gIElPX0lOSEVSSVQsXG4gIElPX0lQQ1xuXSBhcyBjb25zdFxuXG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHR5cGUgSU9UeXBlID0gdHlwZW9mIGlvVHlwZXNbbnVtYmVyXVxuXG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IFtTVERJTiwgU1RET1VULCBTVERFUlIsIFNURElPXSA9IFtcbiAgXCJzdGRpblwiLFxuICBcInN0ZG91dFwiLFxuICBcInN0ZGVyclwiLFxuICBcInN0ZGlvXCJcbl0gYXMgY29uc3RcblxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBpbnB1dFR5cGVzID0gW1NURElOXVxuXG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IG91dHB1dFR5cGVzID0gW1NURE9VVCwgU1RERVJSXVxuXG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHR5cGUgSW5wdXRUeXBlID0gdHlwZW9mIGlucHV0VHlwZXNbbnVtYmVyXVxuXG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHR5cGUgT3V0cHV0VHlwZSA9IHR5cGVvZiBvdXRwdXRUeXBlc1tudW1iZXJdXG4iLCJpbXBvcnQgdHlwZSBOb2RlIGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIlxuXG5pbXBvcnQgdHlwZSB7IFNUREVSUiwgU1RET1VUIH0gZnJvbSBcIi4vc3RkaW9cIlxuXG5leHBvcnQgdHlwZSBOb2RlQ2hpbGRQcm9jZXNzID0gTm9kZS5DaGlsZFByb2Nlc3NcblxuZXhwb3J0IHR5cGUgTm9kZUV4ZWNPcHRpb25zID0gTm9kZS5FeGVjT3B0aW9uc1xuZXhwb3J0IHR5cGUgTm9kZVNwYXduT3B0aW9ucyA9IE5vZGUuU3Bhd25PcHRpb25zXG5leHBvcnQgdHlwZSBOb2RlRm9ya09wdGlvbnMgPSBOb2RlLkZvcmtPcHRpb25zXG5leHBvcnQgdHlwZSBOb2RlU3RkaW9PcHRpb25zID0gTm9kZS5TdGRpb09wdGlvbnNcblxuZXhwb3J0IHR5cGUgU2VyaWFsaXphYmxlID0gc3RyaW5nIHwgb2JqZWN0IHwgbnVtYmVyIHwgYm9vbGVhbiB8IGJpZ2ludFxuXG4vKipcbiAqIFN0cmluZyBvdXRwdXQgZnJvbSBjaGlsZCBwcm9jZXNzIGV4ZWN1dGlvbi5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc1Jlc3VsdCB7XG4gIFtTVERPVVRdPzogc3RyaW5nXG4gIFtTVERFUlJdPzogc3RyaW5nXG59XG5cbi8qKlxuICogQ29tbW9uIHByb2Nlc3MuZW52IHZhbHVlcy5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc0VudiB7XG4gIFRaPzogc3RyaW5nXG4gIE5PREVfRU5WPzogXCJkZXZlbG9wbWVudFwiIHwgXCJ0ZXN0XCIgfCBcInByb2R1Y3Rpb25cIlxuXG4gIFtrZXk6IHN0cmluZ106IHN0cmluZyB8IHVuZGVmaW5lZFxufVxuXG4vKipcbiAqIE5vZGVKUyBcImV4ZWNcIiBjb21tYW5kLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHR5cGUgTm9kZUV4ZWMgPSAoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgb3B0aW9uczogTm9kZUV4ZWNPcHRpb25zXG4pID0+IFByb21pc2U8UHJvY2Vzc1Jlc3VsdD5cblxuLyoqXG4gKiBOb2RlSlMgXCJzcGF3blwiIGNvbW1hbmQuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdHlwZSBOb2RlU3Bhd24gPSAoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgYXJnczogUmVhZG9ubHlBcnJheTxzdHJpbmc+LFxuICBvcHRpb25zOiBOb2RlU3Bhd25PcHRpb25zXG4pID0+IE5vZGVDaGlsZFByb2Nlc3NcblxuLyoqXG4gKiBOb2RlSlMgXCJmb3JrXCIgY29tbWFuZC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB0eXBlIE5vZGVGb3JrID0gKFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIGFyZ3M6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPixcbiAgb3B0aW9uczogTm9kZUZvcmtPcHRpb25zXG4pID0+IE5vZGVDaGlsZFByb2Nlc3NcblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGRldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgdmFsaWQgcHJvY2VzcyBlcnJvci5cbiAqXG4gKiBAcGFyYW0gZXJyb3IgLSBQb3NzaWJsZSBlcnJvciB2YWx1ZSB0byB0ZXN0LlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGlzUHJvY2Vzc0Vycm9yID0gKGVycm9yOiB1bmtub3duKTogZXJyb3IgaXMgTm9kZS5FeGVjRXhjZXB0aW9uID0+XG4gIHR5cGVvZiBlcnJvciA9PT0gXCJvYmplY3RcIiAmJiAhIWVycm9yICYmIE9iamVjdC5rZXlzKGVycm9yKS5pbmNsdWRlcyhcImNtZFwiKVxuIiwiaW1wb3J0IHsgUHJvY2Vzc1Rlcm1pbmF0aW9uRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzXCJcbmltcG9ydCB7IGRlbGF5IH0gZnJvbSBcIi4uL3N1cHBvcnRcIlxuaW1wb3J0IHsgUFJPQ0VTU19FUlJPUl9FVkVOVCwgUFJPQ0VTU19FWElUX0VWRU5ULCBTSUdURVJNIH0gZnJvbSBcIi4uL3R5cGVzXCJcbmltcG9ydCB0eXBlIHsgQ2hpbGRQcm9jZXNzLCBLaWxsT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiXG5cbi8qKlxuICogVGVybWluYXRlcyBhIGNoaWxkIGNoaWxkUHJvY2VzcyBhbmQgYXdhaXRzIGZvciBhIGNsb3NlZCBzdGF0ZS5cbiAqXG4gKiBAcmVtYXJrc1xuICogUmVtb3ZlcyBhbnkgbGlzdGVuZXJzIGF0dGFjaGVkIHRvIHRoZSBjaGlsZFByb2Nlc3MuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3Qga2lsbCA9IGFzeW5jIChcbiAgY2hpbGRQcm9jZXNzOiBDaGlsZFByb2Nlc3MsXG4gIG9wdGlvbnM6IFBhcnRpYWw8S2lsbE9wdGlvbnM+ID0ge31cbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHsgdGltZW91dCwgZXZlbnQsIHNpZ25hbCB9OiBLaWxsT3B0aW9ucyA9IHtcbiAgICAgIHRpbWVvdXQ6IDUwMDAsXG4gICAgICBldmVudDogUFJPQ0VTU19FWElUX0VWRU5ULFxuICAgICAgc2lnbmFsOiBTSUdURVJNLFxuICAgICAgLi4ub3B0aW9uc1xuICAgIH1cblxuICAgIC8vIElmIHByb2Nlc3MgYWxyZWFkeSBraWxsZWQsIHRlcm1pbmF0ZSBpbW1lZGlhdGVseS5cbiAgICBpZiAoY2hpbGRQcm9jZXNzLmtpbGxlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gSWYgYWxyZWFkeSBhd2FpdGluZyBhIGtpbGwgZXZlbnQsIHJldHVybiBwcmV2aW91cyBwcm9taXNlIHJhY2UuXG4gICAgaWYgKGNoaWxkUHJvY2Vzcy5raWxsaW5nKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yYWNlKFtjaGlsZFByb2Nlc3Mua2lsbGluZywgZGVsYXkodGltZW91dCldKVxuICAgIH1cblxuICAgIC8vIEF0dGFjaCB0aGUgZmlyc3Qga2lsbCByYWNlLlxuICAgIGNoaWxkUHJvY2Vzcy5raWxsaW5nID0gUHJvbWlzZS5yYWNlKFtcbiAgICAgIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgIC8vIFBvbGwgZm9yIGEga2lsbGVkIGluIGNhc2UgZXZlbnQgaXMgYWxyZWFkeSB0cmlnZ2VyZWQuXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCAxMDA7IGkrKykge1xuICAgICAgICAgIGlmIChjaGlsZFByb2Nlc3Mua2lsbGVkKSB7XG4gICAgICAgICAgICByZXNvbHZlKClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAvLyBBd2FpdCBjbG9zZSBvciBleGl0IGV2ZW50IGJlZm9yZSByZXNvbHZpbmcuXG4gICAgICAgIGNoaWxkUHJvY2Vzcy5vbmNlKGV2ZW50LCAoKSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZSgpXG4gICAgICAgIH0pXG5cbiAgICAgICAgLy8gQWJvcnQgZWFybHkgaWYgYW4gZXJyb3Igb2NjdXJzLlxuICAgICAgICBjaGlsZFByb2Nlc3Mub25jZShQUk9DRVNTX0VSUk9SX0VWRU5ULCAoKSA9PiB7XG4gICAgICAgICAgcmVqZWN0KClcbiAgICAgICAgfSlcblxuICAgICAgICAvLyBTZW5kIHRlcm1pbmF0aW9uIHNpZ25hbC5cbiAgICAgICAgY2hpbGRQcm9jZXNzLmtpbGwoc2lnbmFsKVxuXG4gICAgICAgIC8vIFJlc29sdmUgaWYgcHJvY2VzcyBpcyBhbHJlYWR5IHRlcm1pbmF0ZWQgYnkgdGhlIHRpbWUgbGlzdGVuZXJzIGFyZSBhdHRhY2hlZC5cbiAgICAgICAgaWYgKGNoaWxkUHJvY2Vzcy5raWxsZWQpIHtcbiAgICAgICAgICByZXNvbHZlKClcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICBkZWxheSh0aW1lb3V0KVxuICAgIF0pXG5cbiAgICBhd2FpdCBjaGlsZFByb2Nlc3Mua2lsbGluZ1xuXG4gICAgLy8gUmVtb3ZlcyBhbGwgbGlzdGVuZXJzIGFmdGVyIHRlcm1pbmF0aW9uLlxuICAgIGNoaWxkUHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMoKVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRocm93IG5ldyBQcm9jZXNzVGVybWluYXRpb25FcnJvcihjaGlsZFByb2Nlc3MuY29tbWFuZCwgZXJyb3IgYXMgRXJyb3IpXG4gIH1cbn1cbiIsImltcG9ydCB7IFRpbWVyIH0gZnJvbSBcIkBub2Rlc3VpdGUvdGltZXJcIlxuaW1wb3J0IHR5cGUgeyBQZXJmb3JtYW5jZVRpbWVyIH0gZnJvbSBcIkBub2Rlc3VpdGUvdGltZXJcIlxuXG5pbXBvcnQgeyBwcm9taXNpZnlDbG9zZSwgcHJvbWlzaWZ5TWVzc2FnZSwgcHJvbWlzaWZ5T3BlbiB9IGZyb20gXCIuLi9wcm9taXNlc1wiXG5pbXBvcnQge1xuICBQUk9DRVNTX0NMT1NFX0VWRU5ULFxuICBQUk9DRVNTX0NMT1NFRF9TVEFURSxcbiAgUFJPQ0VTU19EQVRBX0VWRU5ULFxuICBQUk9DRVNTX0VSUk9SX0VWRU5ULFxuICBQUk9DRVNTX09QRU5FRF9TVEFURSxcbiAgUFJPQ0VTU19PUEVOSU5HX1NUQVRFLFxuICBQUk9DRVNTX1NQQVdOX0VWRU5ULFxuICBTSUdURVJNXG59IGZyb20gXCIuLi90eXBlc1wiXG5pbXBvcnQgdHlwZSB7IENoaWxkUHJvY2VzcywgTm9kZUNoaWxkUHJvY2VzcyB9IGZyb20gXCIuLi90eXBlc1wiXG5cbi8qKlxuICogVXRpbGl0eSBmdW5jdGlvbiB0byBhcHBlbmQgc2V2ZXJhbCBtYW5hZ2VtZW50IHRvb2xzIHRvIGEgc3Bhd25lZCBvciBmb3JrZWQgcHJvY2Vzcy5cbiAqXG4gKiBAcmVtYXJrc1xuICogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseSwgb25seSBpbmRpcmVjdGx5IHZpYSBgc3Bhd25gIG9yIGBmb3JrYC5cbiAqXG4gKiBAcGFyYW0gbmF0aXZlQ2hpbGRQcm9jZXNzIC0gTmF0aXZlIGNoaWxkIHByb2Nlc3MgdG8gYXVnbWVudC5cbiAqIEBwYXJhbSBjb21tYW5kIC0gQ29tbWFuZCBuYW1lIG9yIGV4ZWN1dGFibGUgcGF0aCBjYWxsZWQgYnkgYHNwYXduYCBvciBgZm9ya2AuXG4gKiBAcGFyYW0gbWV0aG9kIC0gRXhlY3V0aW9uIG1ldGhvZCAoYHNwYXduYCwgYGZvcmtgKSB1c2VkIHRvIHNwYXduIHRoZSBwcm9jZXNzLlxuICogQHBhcmFtIGZpbHRlcnMgLSBTdHJpbmcgZmlsdGVycyB1c2VkIHRvIHJlZHVjZSBzdGRvdXQgYW5kIHN0ZGVyciBub2lzZS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IG1hbmFnZSA9IChcbiAgbmF0aXZlQ2hpbGRQcm9jZXNzOiBOb2RlQ2hpbGRQcm9jZXNzLFxuICB7XG4gICAgY29tbWFuZCxcbiAgICBtZXRob2QsXG4gICAgZmlsdGVyc1xuICB9OiBQaWNrPENoaWxkUHJvY2VzcywgXCJjb21tYW5kXCIgfCBcIm1ldGhvZFwiIHwgXCJmaWx0ZXJzXCI+XG4pOiBDaGlsZFByb2Nlc3MgPT4ge1xuICAvLyBJbml0aWFsaXplIGEgdGltZXIgdG8gdHJhY2sgZHVyYXRpb24uXG4gIGNvbnN0IHRpbWVyOiBQZXJmb3JtYW5jZVRpbWVyID0gbmV3IFRpbWVyKClcblxuICAvLyBBdHRhY2ggdGhlIGFkZGl0aW9uYWwgXCJtYW5hZ2VtZW50XCIgcHJvcGVydGllcyB0byB0aGUgYmFzZSBjaGlsZCBwcm9jZXNzLlxuICBjb25zdCBjaGlsZFByb2Nlc3M6IENoaWxkUHJvY2VzcyA9IE9iamVjdC5hc3NpZ24obmF0aXZlQ2hpbGRQcm9jZXNzLCB7XG4gICAgY29tbWFuZCxcbiAgICBtZXRob2QsXG4gICAgdGltZXIsXG4gICAgZmlsdGVycyxcbiAgICBraWxsaW5nOiB1bmRlZmluZWQsXG4gICAgc3RhdGU6IFBST0NFU1NfT1BFTklOR19TVEFURSxcbiAgICB1bnRpbE9wZW46IHByb21pc2lmeU9wZW4obmF0aXZlQ2hpbGRQcm9jZXNzLCBjb21tYW5kKSxcbiAgICB1bnRpbENsb3NlOiBwcm9taXNpZnlDbG9zZShuYXRpdmVDaGlsZFByb2Nlc3MpLFxuICAgIHVudGlsTWVzc2FnZTogcHJvbWlzaWZ5TWVzc2FnZShuYXRpdmVDaGlsZFByb2Nlc3MsIGNvbW1hbmQpXG4gIH0pXG5cbiAgLy8gQ2hhbmdlIHN0YXRlIGFuZCBub3RpZnkgZGVidWdnZXIgb24gc3RhdGUgY2hhbmdlcy5cblxuICBjaGlsZFByb2Nlc3Mub25jZShQUk9DRVNTX1NQQVdOX0VWRU5ULCAoKSA9PiB7XG4gICAgY2hpbGRQcm9jZXNzLnN0YXRlID0gUFJPQ0VTU19PUEVORURfU1RBVEVcbiAgICBjb25zb2xlLmRlYnVnKGBQcm9jZXNzIFwiJHtjb21tYW5kfVwiIG9wZW5lZC5gKVxuICB9KVxuXG4gIGNoaWxkUHJvY2Vzcy5vbmNlKFBST0NFU1NfQ0xPU0VfRVZFTlQsICgpID0+IHtcbiAgICBjaGlsZFByb2Nlc3Muc3RhdGUgPSBQUk9DRVNTX0NMT1NFRF9TVEFURVxuICAgIGNvbnNvbGUuZGVidWcoYFByb2Nlc3MgXCIke2NvbW1hbmR9XCIgY2xvc2VkLmApXG4gIH0pXG5cbiAgY2hpbGRQcm9jZXNzLm9uKFBST0NFU1NfRVJST1JfRVZFTlQsIChlcnJvcjogRXJyb3IpID0+IHtcbiAgICBjb25zb2xlLmRlYnVnKGBQcm9jZXNzIFwiJHtjb21tYW5kfVwiIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YClcbiAgICBpZiAoIWNoaWxkUHJvY2Vzcy5raWxsZWQpIHtcbiAgICAgIGNoaWxkUHJvY2Vzcy5raWxsKFNJR1RFUk0pXG4gICAgfVxuICB9KVxuXG4gIGNvbnN0IGZpbHRlciA9IChkYXRhOiBCdWZmZXIpOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICAgIGNvbnN0IG1lc3NhZ2U6IHN0cmluZyA9IGRhdGEudG9TdHJpbmcoKS50cmltKClcbiAgICByZXR1cm4gIWNoaWxkUHJvY2Vzcy5maWx0ZXJzIHx8XG4gICAgICBjaGlsZFByb2Nlc3MuZmlsdGVycy5ldmVyeSgoZmlsdGVyKSA9PiAhbWVzc2FnZS5pbmNsdWRlcyhmaWx0ZXIpKVxuICAgICAgPyBtZXNzYWdlXG4gICAgICA6IHVuZGVmaW5lZFxuICB9XG5cbiAgY29uc3Qgb25TdGRvdXQgPSAoZGF0YTogQnVmZmVyKTogdm9pZCA9PiB7XG4gICAgY29uc3QgbWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkID0gZmlsdGVyKGRhdGEpXG4gICAgaWYgKG1lc3NhZ2UpIHtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGAke21lc3NhZ2V9XFxuYClcbiAgICB9XG4gIH1cblxuICBjb25zdCBvblN0ZGVyciA9IChkYXRhOiBCdWZmZXIpOiB2b2lkID0+IHtcbiAgICBjb25zdCBtZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBmaWx0ZXIoZGF0YSlcbiAgICBpZiAobWVzc2FnZSkge1xuICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoYCR7bWVzc2FnZX1cXG5gKVxuICAgIH1cbiAgfVxuXG4gIGlmIChjaGlsZFByb2Nlc3Muc3Rkb3V0KSB7XG4gICAgY2hpbGRQcm9jZXNzLnN0ZG91dC5vbihQUk9DRVNTX0RBVEFfRVZFTlQsIG9uU3Rkb3V0KVxuICB9XG5cbiAgaWYgKGNoaWxkUHJvY2Vzcy5zdGRlcnIpIHtcbiAgICBjaGlsZFByb2Nlc3Muc3RkZXJyLm9uKFBST0NFU1NfREFUQV9FVkVOVCwgb25TdGRlcnIpXG4gIH1cblxuICByZXR1cm4gY2hpbGRQcm9jZXNzXG59XG4iLCJpbXBvcnQgeyBQUk9DRVNTX0NMT1NFX0VWRU5ULCBQUk9DRVNTX0VSUk9SX0VWRU5UIH0gZnJvbSBcIi4uL3R5cGVzXCJcbmltcG9ydCB0eXBlIHsgQ2xvc2VSZWFzb24sIE5vZGVDaGlsZFByb2Nlc3MsIFNpZ25hbCB9IGZyb20gXCIuLi90eXBlc1wiXG5cbi8qKlxuICogQXdhaXRzIGEgY2xvc2UgZXZlbnQgZnJvbSBhIHNwZWNpZmllZCBjaGlsZCBwcm9jZXNzLlxuICpcbiAqIEBwYXJhbSBjaGlsZFByb2Nlc3MgLSBTcGF3bmVkIGNoaWxkIHByb2Nlc3MgdG8gbW9uaXRvci5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IHByb21pc2lmeUNsb3NlID1cbiAgKGNoaWxkUHJvY2VzczogTm9kZUNoaWxkUHJvY2VzcykgPT4gKCk6IFByb21pc2U8Q2xvc2VSZWFzb24+ID0+XG4gICAgbmV3IFByb21pc2U8Q2xvc2VSZWFzb24+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIC8vIElmIHByb2Nlc3MgYWxyZWFkeSBraWxsZWQsIHJlc29sdmUgaW1tZWRpYXRlbHkuXG4gICAgICBpZiAoY2hpbGRQcm9jZXNzLmtpbGxlZCkge1xuICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICBjb2RlOiB1bmRlZmluZWQsXG4gICAgICAgICAgc2lnbmFsOiBjaGlsZFByb2Nlc3Muc2lnbmFsQ29kZSA/PyB1bmRlZmluZWRcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgLy8gTGlzdGVuIGZvciBjbG9zZSBldmVudCBhbmQgcmVzb2x2ZSB3aXRoIHBheWxvYWQuXG4gICAgICBjaGlsZFByb2Nlc3Mub25jZShcbiAgICAgICAgUFJPQ0VTU19DTE9TRV9FVkVOVCxcbiAgICAgICAgKGNvZGU6IG51bWJlciB8IHVuZGVmaW5lZCwgc2lnbmFsOiBTaWduYWwgfCB1bmRlZmluZWQpID0+IHtcbiAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgIGNvZGUsXG4gICAgICAgICAgICBzaWduYWxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICApXG5cbiAgICAgIC8vIEFib3J0IG9uIGVycm9ycy5cbiAgICAgIGNoaWxkUHJvY2Vzcy5vbmNlKFBST0NFU1NfRVJST1JfRVZFTlQsIChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgcmVqZWN0KHtcbiAgICAgICAgICBlcnJvclxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9KVxuIiwiaW1wb3J0IHsgTWVzc2FnZVRpbWVvdXRFcnJvciB9IGZyb20gXCIuLi9lcnJvcnNcIlxuaW1wb3J0IHtcbiAgUFJPQ0VTU19DTE9TRV9FVkVOVCxcbiAgUFJPQ0VTU19EQVRBX0VWRU5ULFxuICBQUk9DRVNTX0VSUk9SX0VWRU5UXG59IGZyb20gXCIuLi90eXBlc1wiXG5pbXBvcnQgdHlwZSB7IE5vZGVDaGlsZFByb2Nlc3MsIFNpZ25hbCwgVmFsaWRhdGUgfSBmcm9tIFwiLi4vdHlwZXNcIlxuXG4vKipcbiAqIEF3YWl0cyBhIHNwZWNpZmljIG1lc3NhZ2UgZXZlbnQgZnJvbSBhIHNwZWNpZmllZCBjaGlsZCBwcm9jZXNzLlxuICpcbiAqIEByZW1hcmtzXG4gKiBIYXMgYSBkZWZhdWx0IHRpbWVvdXQgb2YgOTBzLlxuICpcbiAqIEBwYXJhbSBjaGlsZFByb2Nlc3MgLSBTcGF3bmVkIGNoaWxkIHByb2Nlc3MgdG8gbW9uaXRvci5cbiAqIEBwYXJhbSBjb21tYW5kIC0gT3B0aW9uYWwgbmFtZSBvZiBjb21tYW5kIGZvciBkZWJ1Z2dpbmcuXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBwcm9taXNpZnlNZXNzYWdlID1cbiAgKGNoaWxkUHJvY2VzczogTm9kZUNoaWxkUHJvY2VzcywgY29tbWFuZD86IHN0cmluZykgPT5cbiAgKHZhbGlkYXRlOiBWYWxpZGF0ZSwgdGltZW91dDogbnVtYmVyID0gOTAwMDApOiBQcm9taXNlPHN0cmluZz4gPT5cbiAgICBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAvLyBJZiBhIHRpbWVvdXQgd2FzIHJlcXVlc3RlZCwgc3RhcnQgYSB0aW1lciB0byByZWplY3QgcHJvbWlzZSBpZiByZWFjaGVkLlxuICAgICAgY29uc3QgdGltZXI6IE5vZGVKUy5UaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBjb25zdCBlcnJvcjogRXJyb3IgPSBuZXcgTWVzc2FnZVRpbWVvdXRFcnJvcihcbiAgICAgICAgICBjb21tYW5kID8/IGNoaWxkUHJvY2Vzcy5waWQsXG4gICAgICAgICAgdGltZW91dFxuICAgICAgICApXG4gICAgICAgIGNvbnNvbGUud2FybihlcnJvci5tZXNzYWdlKVxuICAgICAgICByZWplY3QoZXJyb3IpXG4gICAgICB9LCB0aW1lb3V0KVxuXG4gICAgICAvLyBBYm9ydCBvYnNlcnZlciBpZiBwcm9jZXNzIGNsb3NlcyBiZWZvcmUgYSBtYXRjaCBpcyBmb3VuZC5cbiAgICAgIGNvbnN0IG9uQ2xvc2UgPSAoXG4gICAgICAgIGNvZGU6IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICAgICAgc2lnbmFsOiBTaWduYWwgfCB1bmRlZmluZWRcbiAgICAgICk6IHZvaWQgPT4ge1xuICAgICAgICByZWplY3QoeyBjb2RlLCBzaWduYWwgfSlcbiAgICAgIH1cblxuICAgICAgLy8gQWJvcnQgb2JzZXJ2ZXIgaWYgcHJvY2VzcyBlcnJvcnMgYmVmb3JlIGEgbWF0Y2ggaXMgZm91bmQuXG4gICAgICBjb25zdCBvbkVycm9yID0gKGVycm9yOiBFcnJvcik6IHZvaWQgPT4ge1xuICAgICAgICByZWplY3Qoe1xuICAgICAgICAgIGVycm9yXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIC8vIFNlYXJjaCBtZXNzYWdlcyBiYXNlZCBvbiB2YWxpZGF0aW9uIGZ1bmN0aW9uLlxuICAgICAgLy8gV2UgbXVzdCByZW1vdmUgdGhpcyBsaXN0ZW5lciB1cG9uIHJlc29sdXRpb24gdG8gYXZvaWQgbWVtb3J5IGxlYWtzLlxuICAgICAgY29uc3Qgb25EYXRhID0gKGRhdGE6IEJ1ZmZlcik6IHZvaWQgPT4ge1xuICAgICAgICBjb25zdCBtZXNzYWdlOiBzdHJpbmcgPSBkYXRhLnRvU3RyaW5nKCkudHJpbSgpXG5cbiAgICAgICAgaWYgKCF2YWxpZGF0ZShtZXNzYWdlKSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xlYXIgdGhlIHJlamVjdGlvbiB0aW1lb3V0LlxuICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpXG5cbiAgICAgICAgY29uc29sZS5kZWJ1ZyhgTWF0Y2hlZCBhd2FpdGVkIG1lc3NhZ2UgZnJvbSBjaGlsZCBwcm9jZXNzLmAsIG1lc3NhZ2UpXG5cbiAgICAgICAgY2hpbGRQcm9jZXNzLnN0ZG91dD8ub2ZmKFBST0NFU1NfREFUQV9FVkVOVCwgb25EYXRhKVxuICAgICAgICBjaGlsZFByb2Nlc3Muc3RkZXJyPy5vZmYoUFJPQ0VTU19EQVRBX0VWRU5ULCBvbkRhdGEpXG5cbiAgICAgICAgY2hpbGRQcm9jZXNzLm9mZihQUk9DRVNTX0NMT1NFX0VWRU5ULCBvbkNsb3NlKVxuICAgICAgICBjaGlsZFByb2Nlc3Mub2ZmKFBST0NFU1NfRVJST1JfRVZFTlQsIG9uRXJyb3IpXG5cbiAgICAgICAgcmVzb2x2ZShtZXNzYWdlKVxuICAgICAgfVxuXG4gICAgICBjaGlsZFByb2Nlc3Muc3Rkb3V0Py5vbihQUk9DRVNTX0RBVEFfRVZFTlQsIG9uRGF0YSlcbiAgICAgIGNoaWxkUHJvY2Vzcy5zdGRlcnI/Lm9uKFBST0NFU1NfREFUQV9FVkVOVCwgb25EYXRhKVxuXG4gICAgICBjaGlsZFByb2Nlc3Mub25jZShQUk9DRVNTX0NMT1NFX0VWRU5ULCBvbkNsb3NlKVxuICAgICAgY2hpbGRQcm9jZXNzLm9uY2UoUFJPQ0VTU19FUlJPUl9FVkVOVCwgb25FcnJvcilcbiAgICB9KVxuIiwiaW1wb3J0IHsgT3BlblRpbWVvdXRFcnJvciB9IGZyb20gXCIuLi9lcnJvcnNcIlxuaW1wb3J0IHsgUFJPQ0VTU19FUlJPUl9FVkVOVCwgUFJPQ0VTU19TUEFXTl9FVkVOVCB9IGZyb20gXCIuLi90eXBlc1wiXG5pbXBvcnQgdHlwZSB7IE5vZGVDaGlsZFByb2Nlc3MgfSBmcm9tIFwiLi4vdHlwZXNcIlxuXG4vKipcbiAqIEF3YWl0cyBhIGBzcGF3bmAgZXZlbnQgZnJvbSBhIHNwZWNpZmllZCBjaGlsZCBwcm9jZXNzLlxuICpcbiAqIEBwYXJhbSBjaGlsZFByb2Nlc3MgLSBTcGF3bmVkIGNoaWxkIHByb2Nlc3MgdG8gbW9uaXRvci5cbiAqIEBwYXJhbSBjb21tYW5kIC0gT3B0aW9uYWwgbmFtZSBvZiBjb21tYW5kIGZvciBkZWJ1Z2dpbmcuXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBwcm9taXNpZnlPcGVuID1cbiAgKGNoaWxkUHJvY2VzczogTm9kZUNoaWxkUHJvY2VzcywgY29tbWFuZD86IHN0cmluZykgPT5cbiAgYXN5bmMgKHRpbWVvdXQ/OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+ID0+XG4gICAgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgLy8gSWYgcHJvY2VzcyBhbHJlYWR5IG9wZW4sIHJldHVybiBpbW1lZGlhdGVseS5cbiAgICAgIGlmIChjaGlsZFByb2Nlc3MucGlkKSB7XG4gICAgICAgIHJlc29sdmUoKVxuICAgICAgfVxuXG4gICAgICAvLyBEbyBub3QgYXdhaXQga2lsbGVkIHByb2Nlc3Nlcy5cbiAgICAgIGlmIChjaGlsZFByb2Nlc3Mua2lsbGVkKSB7XG4gICAgICAgIHJlamVjdChgQ2Fubm90IGF3YWl0IG9wZW4gb24ga2lsbGVkIHByb2Nlc3MuYClcbiAgICAgIH1cblxuICAgICAgLy8gQWJvcnQgb24gZXJyb3JzIHdoaWxlIHNwYXduaW5nLlxuICAgICAgY29uc3Qgb25FcnJvciA9IChlcnJvcj86IEVycm9yKTogdm9pZCA9PiB7XG4gICAgICAgIHJlamVjdChlcnJvcilcbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIHN1Y2Nlc3NmdWwgc3Bhd24gZXZlbnQuXG4gICAgICBjb25zdCBvblNwYXduID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICAvLyBSZW1vdmUgYWJvcnQgbGlzdGVuZXIuXG4gICAgICAgIGNoaWxkUHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcihQUk9DRVNTX0VSUk9SX0VWRU5ULCBvbkVycm9yKVxuXG4gICAgICAgIC8vIE9uY2UgcHJvY2VzcyBpcyBzcGF3bmVkLCBjb252ZXJ0IHRvIG9ic2VydmFibGUuXG4gICAgICAgIHJlc29sdmUoKVxuICAgICAgfVxuXG4gICAgICAvLyBCaW5kIGxpc3RlbmVycy5cbiAgICAgIGNoaWxkUHJvY2Vzcy5vbmNlKFBST0NFU1NfRVJST1JfRVZFTlQsIG9uRXJyb3IpXG4gICAgICBjaGlsZFByb2Nlc3Mub25jZShQUk9DRVNTX1NQQVdOX0VWRU5ULCBvblNwYXduKVxuXG4gICAgICAvLyBJZiBhIHRpbWVvdXQgd2FzIHJlcXVlc3RlZCwgYWJvcnQgaWYgcmVhY2hlZC5cbiAgICAgIGlmICh0aW1lb3V0KSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGVycm9yOiBFcnJvciA9IG5ldyBPcGVuVGltZW91dEVycm9yKFxuICAgICAgICAgICAgY29tbWFuZCA/PyBjaGlsZFByb2Nlc3MucGlkLFxuICAgICAgICAgICAgdGltZW91dFxuICAgICAgICAgIClcbiAgICAgICAgICBjb25zb2xlLndhcm4oZXJyb3IubWVzc2FnZSlcbiAgICAgICAgICByZWplY3QoZXJyb3IpXG4gICAgICAgIH0sIHRpbWVvdXQpXG4gICAgICB9XG4gICAgfSlcbiIsImltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSBcIm5vZGU6ZXZlbnRzXCJcbmltcG9ydCB7IGRlZmVyIH0gZnJvbSBcIkBub2Rlc3VpdGUvZGVmZXJcIlxuaW1wb3J0IHR5cGUgeyBEZWZlcnJhbCB9IGZyb20gXCJAbm9kZXN1aXRlL2RlZmVyXCJcblxuaW1wb3J0IHsgUHJvY2Vzc05vdEF2YWlsYWJsZUVycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiXG5pbXBvcnQgeyBQUk9DRVNTX0NMT1NFX0VWRU5ULCBQUk9DRVNTX09QRU5fRVZFTlQgfSBmcm9tIFwiLi4vdHlwZXNcIlxuaW1wb3J0IHR5cGUgeyBDaGlsZFByb2Nlc3MgfSBmcm9tIFwiLi4vdHlwZXNcIlxuXG4vKipcbiAqIEFic3RyYWN0IHV0aWxpdHkgd3JhcHBlciBmb3IgYnVpbGRpbmcgcHJvY2Vzcy1iYXNlZCBjbGFzc2VzLlxuICpcbiAqIEByZW1hcmtzXG4gKiBJbmhlcml0b3JzIHNob3VsZCBpbXBsZW1lbnQgb3duIFwib3BlblwiIGFuZCBcImNsb3NlXCIgbG9naWMgd2hpY2ggaXMgcHJvdmlkZWQgdG9cbiAqIHRoZSBcInNldE9wZW5cIiBhbmQgXCJzZXRDbG9zZVwiIGhhbmRsZXJzLlxuICpcbiAqIEltcG9ydGFudGx5LCB0byByZWxlYXNlIHRoZSBvcGVuZXIgYW5kIGNsb3NlciBwcm9taXNlcywgdGhlIFwib3BlblwiIGFuZCBcImNsb3NlXCJcbiAqIGxvZ2ljIHNob3VsZCBlbWl0IHRoZSBhcHByb3ByaWF0ZSBwcm9jZXNzIGV2ZW50IHRvIHNpZ25hbCByZWFkeSBzdGF0ZS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBQcm9jZXNzTWFuYWdlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIC8qKlxuICAgKiBTdGF0aWMgcmVmZXJlbmNlIHRvIHRoZSBpbnRlbmRlZCBleGVjdXRhYmxlIHBhdGguXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJvdGVjdGVkIF9jb21tYW5kOiBzdHJpbmcgfCB1bmRlZmluZWRcblxuICAvKipcbiAgICogSW50ZXJuYWwgY2hpbGQgcHJvY2Vzcy5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwcm90ZWN0ZWQgX3Byb2Nlc3M6IENoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZFxuXG4gIC8qKlxuICAgKiBEZWZlcnJlZCBwcm9taXNlIHRvIHByZXNlbnQgaWYgb3BlbmluZyBwcm9jZXNzIGhhcyBhbHJlYWR5IGJlZ3VuLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHJlYWRvbmx5ICNvcGVuZXI6IERlZmVycmFsID0gZGVmZXIoKVxuXG4gIC8qKlxuICAgKiBEZWZlcnJlZCBwcm9taXNlIHRvIHByZXNlbnQgaWYgY2xvc2luZyBwcm9jZXNzIGhhcyBhbHJlYWR5IGJlZ3VuLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHJlYWRvbmx5ICNjbG9zZXI6IERlZmVycmFsID0gZGVmZXIoKVxuXG4gIC8qKlxuICAgKiBGbGFnIHRvIGF2b2lkIG11bHRpcGxlIG9wZW4uXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgI2lzT3BlbmluZzogYm9vbGVhbiA9IGZhbHNlXG5cbiAgLyoqXG4gICAqIEZsYWcgdG8gYXZvaWQgbXVsdGlwbGUgY2xvc2VzLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gICNpc0Nsb3Npbmc6IGJvb2xlYW4gPSBmYWxzZVxuXG4gIC8qKlxuICAgKiBBY2Nlc3MgdGhlIGV4ZWN1dGFibGUgcGF0aCBvZiB0aGUgdW5kZXJseWluZyBjaGlsZCBwcm9jZXNzLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbW1hbmQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fY29tbWFuZFxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwcm9jZXNzIGlkIG9mIHRoZSBpbnRlcm5hbCBjaGlsZCBwcm9jZXNzLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBpZCgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnByb2Nlc3MoKS5waWRcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBvc2UgdGhlIGludGVybmFsIGNoaWxkIHByb2Nlc3MgYW5kIGFzc2VydCByZWFkeSBzdGF0ZS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKi9cbiAgcHVibGljIHByb2Nlc3MoKTogQ2hpbGRQcm9jZXNzIHtcbiAgICBpZiAoIXRoaXMuX3Byb2Nlc3MpIHtcbiAgICAgIHRocm93IG5ldyBQcm9jZXNzTm90QXZhaWxhYmxlRXJyb3IodGhpcy5jb21tYW5kKVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcHJvY2Vzc1xuICB9XG5cbiAgLyoqXG4gICAqIEF3YWl0cyB0aGUgZGVmZXJyZWQgY2xvc2UgZXZlbnQuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICovXG4gIHB1YmxpYyB1bnRpbENsb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLiNjbG9zZXIudW50aWxSZXNvbHZlZCgpXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBleGlzdGluZyBvcGVuIG9yIHNldHMgYW4gb3BlbmluZyBzdGF0ZS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogVGhpcyBpcyB1c2VkIHRvIHN0YWNrIGR1cGxpY2F0ZSBvcGVuIGNhbGxzIGludG8gdGhlIHNpbmdsZSBwcm9taXNlLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByb3RlY3RlZCBfc2V0T3BlbihvcGVuOiAoKSA9PiBQcm9taXNlPHZvaWQ+KTogUHJvbWlzZTx2b2lkPiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuI2lzT3BlbmluZykge1xuICAgICAgcmV0dXJuIHRoaXMuI29wZW5lci5wcm9taXNlXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub25jZShQUk9DRVNTX09QRU5fRVZFTlQsICgpID0+IHRoaXMuI29wZW5lci5yZXNvbHZlKCkpXG4gICAgICByZXR1cm4gb3BlbigpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gZXhpc3RpbmcgY2xvc2Ugb3Igc2V0cyBhIGNsb3Npbmcgc3RhdGUuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFRoaXMgaXMgdXNlZCB0byBzdGFjayBkdXBsaWNhdGUgY2xvc2UgY2FsbHMgaW50byB0aGUgc2luZ2xlIHByb21pc2UuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJvdGVjdGVkIF9zZXRDbG9zZShjbG9zZTogKCkgPT4gUHJvbWlzZTx2b2lkPik6IFByb21pc2U8dm9pZD4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLiNpc0Nsb3NpbmcpIHtcbiAgICAgIHJldHVybiB0aGlzLiNjbG9zZXIucHJvbWlzZVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9uY2UoUFJPQ0VTU19DTE9TRV9FVkVOVCwgKCkgPT4gdGhpcy4jY2xvc2VyLnJlc29sdmUoKSlcbiAgICAgIHJldHVybiBjbG9zZSgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbXBsZXRlcyB0aGUgb3BlbmluZyBwcm9jZXNzIGlmIHN0YXJ0ZWQuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJvdGVjdGVkIF9jb21wbGV0ZU9wZW4oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3Byb2Nlc3MpIHtcbiAgICAgIHRoaXMuZW1pdChQUk9DRVNTX09QRU5fRVZFTlQpXG4gICAgICB0aGlzLiNvcGVuZXIucmVzb2x2ZSgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBQcm9jZXNzTm90QXZhaWxhYmxlRXJyb3IodGhpcy5jb21tYW5kKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wbGV0ZXMgdGhlIGNsb3NpbmcgcHJvY2VzcyBpZiBzdGFydGVkLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByb3RlY3RlZCBfY29tcGxldGVDbG9zZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fcHJvY2Vzcykge1xuICAgICAgdGhpcy5fcHJvY2Vzcy50aW1lci5zdG9wKClcbiAgICAgIHRoaXMuZW1pdChQUk9DRVNTX0NMT1NFX0VWRU5UKVxuICAgICAgdGhpcy4jY2xvc2VyLnJlc29sdmUoKVxuICAgICAgdGhpcy5fcHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMoKVxuICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgUHJvY2Vzc05vdEF2YWlsYWJsZUVycm9yKHRoaXMuY29tbWFuZClcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IGNvbmZpZ3VyZSwgbm9kZVNwYXduIH0gZnJvbSBcIi4uL3N1cHBvcnRcIlxuaW1wb3J0IHsgU1BBV04gfSBmcm9tIFwiLi4vdHlwZXNcIlxuaW1wb3J0IHsgbWFuYWdlIH0gZnJvbSBcIi4vbWFuYWdlXCJcbmltcG9ydCB0eXBlIHtcbiAgQ2hpbGRQcm9jZXNzLFxuICBFeGVjdXRpb25NZXRob2QsXG4gIFByb2Nlc3NDb25maWcsXG4gIFNwYXduT3B0aW9uc1xufSBmcm9tIFwiLi4vdHlwZXNcIlxuXG4vKipcbiAqIFNwYXducyBhbiBvYnNlcnZhYmxlIGNoaWxkIHByb2Nlc3MgYW5kIGF3YWl0cyBhIHJlYWR5IHN0YXRlLlxuICpcbiAqIEByZW1hcmtzXG4gKiBPcHRpb25hbGx5IGF0dGFjaGVzIGhvb2tzIHRvIGFueSB2YWxpZCBjaGlsZCBwcm9jZXNzIGV2ZW50LlxuICogQXV0b21hdGljYWxseSBpbmplY3RzIHByb2Nlc3MuZW52IGludG8gZW52IG9wdGlvbnMuXG4gKiBGb3JrZWQgcHJvY2Vzc2VzIFwiaW5oZXJpdFwiIHN0ZGlvIHJhdGhlciB0aGFuIFwicGlwZVwiIGFzIGRlZmF1bHQuXG4gKiBFbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBjdXJyZW50IHByb2Nlc3MgYXJlIGluamVjdGVkIHRocm91Z2ggdG8gY2hpbGQgcHJvY2Vzcy5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBzcGF3biA9IGFzeW5jIChcbiAgY29tbWFuZDogc3RyaW5nLFxuICBhcmdzOiBzdHJpbmdbXSA9IFtdLFxuICB7IGZpbHRlcnMsIC4uLm9wdGlvbnMgfTogU3Bhd25PcHRpb25zID0ge31cbik6IFByb21pc2U8Q2hpbGRQcm9jZXNzPiA9PiB7XG4gIC8vIENvbmZpZ3VyZSBhcmdzIGFuZCBvcHRpb25zLlxuICBjb25zdCBjb25maWc6IFByb2Nlc3NDb25maWc8U3Bhd25PcHRpb25zPiA9IGNvbmZpZ3VyZSh7IGFyZ3MsIG9wdGlvbnMgfSlcbiAgY29uc3QgbWV0aG9kOiBFeGVjdXRpb25NZXRob2QgPSBTUEFXTlxuXG4gIC8vIFNwYXduIGEgbmV3IGNoaWxkIHByb2Nlc3MuXG4gIGNvbnN0IGNoaWxkUHJvY2VzczogQ2hpbGRQcm9jZXNzID0gbWFuYWdlKFxuICAgIG5vZGVTcGF3bihjb21tYW5kLCBjb25maWcuYXJncywgY29uZmlnLm9wdGlvbnMpLFxuICAgIHtcbiAgICAgIGNvbW1hbmQsXG4gICAgICBtZXRob2QsXG4gICAgICBmaWx0ZXJzOiBmaWx0ZXJzID8/IFtdXG4gICAgfVxuICApXG5cbiAgLy8gQXdhaXQgY29tcGxldGVkIHNwYXduIGV2ZW50LlxuICBhd2FpdCBjaGlsZFByb2Nlc3MudW50aWxPcGVuKClcblxuICByZXR1cm4gY2hpbGRQcm9jZXNzXG59XG4iXX0=
{
"$schema": "https://json.schemastore.org/package",
"name": "@nodesuite/process",
"version": "0.1.11",
"version": "0.1.12",
"description": "Enhanced Node child-process management.",

@@ -28,9 +28,9 @@ "keywords": [

"dependencies": {
"@nodesuite/defer": "0.1.11",
"@nodesuite/timer": "0.1.11",
"@nodesuite/defer": "0.1.12",
"@nodesuite/timer": "0.1.12",
"tslib": "^2.4.0"
},
"devDependencies": {
"@nodesuite/eslint-config": "0.1.11",
"@nodesuite/node-rig": "0.1.11",
"@nodesuite/eslint-config": "0.1.12",
"@nodesuite/node-rig": "0.1.12",
"@rushstack/eslint-config": "^3.0.1",

@@ -37,0 +37,0 @@ "@rushstack/heft": "^0.47.9",

@@ -25,3 +25,3 @@ import { configure, nodeSpawn } from "../support"

args: string[] = [],
options: SpawnOptions = {}
{ filters, ...options }: SpawnOptions = {}
): Promise<ChildProcess> => {

@@ -31,3 +31,2 @@ // Configure args and options.

const method: ExecutionMethod = SPAWN
const filters: string[] = options.filters ?? []

@@ -40,3 +39,3 @@ // Spawn a new child process.

method,
filters
filters: filters ?? []
}

@@ -43,0 +42,0 @@ )

@@ -49,3 +49,3 @@ import { MessageTimeoutError } from "../errors"

// Matching logic, generally a Zod schema or function that throws if invalid.
// Search messages based on validation function.
// We must remove this listener upon resolution to avoid memory leaks.

@@ -52,0 +52,0 @@ const onData = (data: Buffer): void => {

@@ -35,9 +35,11 @@ import { ProcessConfigurationError } from "../errors"

// Merges process options with current environment variables.
const parseOptions = <O extends SpawnOptions | ForkOptions | ExecOptions>(
options: O
): O => ({
...options,
stdio: options.stdio ?? [process.stdin, "pipe", "pipe"],
env: mergeEnv(options.env)
})
const parseOptions = <O extends SpawnOptions | ForkOptions | ExecOptions>({
stdio,
...options
}: O): O =>
({
...options,
stdio: stdio ?? [process.stdin, "pipe", "pipe"],
env: mergeEnv(options.env)
} as O)

@@ -44,0 +46,0 @@ const args: string[] = parseArgs(config.command, config.args)

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc