pup-recorder 0.2.7 → 0.2.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build.ts +0 -3
- package/dist/_tsup-dts-rollup.d.ts +46 -10
- package/dist/app.cjs +26 -14
- package/dist/chunk-BG7244QU.js +92 -0
- package/dist/cli.js +2 -2
- package/dist/index.d.ts +1 -0
- package/dist/index.js +2 -2
- package/package.json +3 -2
- package/dist/chunk-3POZKRKH.js +0 -2
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import'source-map-support/register.js';import {a,b as b$1}from'./chunk-3POZKRKH.js';export{v as DEFAULT_DURATION,u as DEFAULT_FPS,t as DEFAULT_HEIGHT,w as DEFAULT_OUT_FILE,s as DEFAULT_WIDTH,m as Logger,p as PUP_ARGS_KEY,x as RenderSchema,y as defaultRenderOptions,r as exec,n as logger,o as noerr,q as pargs,d as parseNumber,e as parseString,c as penv,z as pup,k as pupApp,i as pupDeterministic,h as pupDisableGPU,l as pupIpcSocket,f as pupLogLevel,j as pupPkgRoot,g as pupUseInnerProxy}from'./chunk-3POZKRKH.js';import {setTimeout as setTimeout$1}from'timers/promises';import {cpus}from'os';import {FormatContext,FFmpegError,Frame,SoftwareScaleContext,Codec,CodecContext,Rational,Packet,FilterGraph,Filter,FilterInOut}from'node-av';import {AV_PIX_FMT_YUVA420P,FF_ENCODER_LIBX265,FF_ENCODER_AAC,AV_SAMPLE_FMT_FLTP,AV_PIX_FMT_BGRA,SWS_BILINEAR,FF_THREAD_SLICE,AV_CODEC_FLAG_GLOBAL_HEADER,AVERROR_EAGAIN,AVERROR_EOF,AV_CHANNEL_LAYOUT_STEREO,AV_SAMPLE_FMT_FLT}from'node-av/constants';var C=class{constructor(e){this.makeValue=e;}get value(){return this._initialized||(this._value=this.makeValue(),this._initialized=true),this._value}get initialized(){return this._initialized}_initialized=false;_value};var b=class{constructor(e){this.maxConcurrency=e;}_active=0;_queue=[];_ended=false;get active(){return this._active}get pending(){return this._queue.length}get stats(){return `active: ${this.active}, pending: ${this.pending}`}async schedule(e){if(this._ended)throw new Error("ended");return new Promise((t,r)=>{let i=()=>{this._active++,e().then(a=>{this._active--,t(a),this.next();}).catch(a=>{this._active--,r(a),this.next();});};this._queue.push(i),this.next();})}async end(){if(!this._ended)for(this._ended=true;this._active>0||this.pending>0;)await new Promise(e=>setTimeout(e,50));}next(){this._active<this.maxConcurrency&&this._queue.shift()?.();}};function k(n){return new Promise(e=>setTimeout(e,n))}function Ge(n,e){let t,r=false;async function i(a){await n(a),!r&&(t=setTimeout(()=>i(a+1),e));}return t=setTimeout(()=>i(0),e),()=>{r=true,clearTimeout(t);}}function Xe({fn:n,maxAttempts:e=3,timeout:t}){let r=new Error(`timeout over ${t}ms`);return async function(...i){let a=0;for(;;)try{let s=[n(...i)];return t&&s.push(setTimeout$1(t).then(()=>{throw r})),await Promise.race(s)}catch(s){if(a++,a>=e)throw s;await k(Math.pow(2,a)*100+Math.random()*100);}}}var Q={[AV_SAMPLE_FMT_FLT]:"flt",[AV_SAMPLE_FMT_FLTP]:"fltp"},y=class n{_ctx;_stream;_pkt;_outRate;_outFmt;_frameSize;_filterFrame;_graph;_bufSrc;_bufSink;_inRate;_pts=0n;constructor(e,t,r){this._ctx=e,this._stream=t,this._outRate=e.sampleRate,this._outFmt=r,this._frameSize=e.frameSize,this._pkt=new Packet,this._pkt.alloc(),this._filterFrame=new Frame,this._filterFrame.alloc();}static async create(e){let t=Codec.findEncoderByName(e.codecName);if(!t)throw new Error(`Audio encoder not found: ${e.codecName}`);let r=new CodecContext;r.allocContext3(t),r.codecId=t.id,r.sampleFormat=e.outSampleFmt,r.sampleRate=e.outSampleRate,r.channelLayout=AV_CHANNEL_LAYOUT_STEREO,r.timeBase=new Rational(1,e.outSampleRate),r.bitRate=BigInt(e.bitrate),e.globalHeader&&r.setFlags(AV_CODEC_FLAG_GLOBAL_HEADER),FFmpegError.throwIfError(await r.open2(t,null),"audioCtx.open2");let i=e.muxer.addStream(r);return new n(r,i,e.outSampleFmt)}setInputRate(e){this._graph?.[Symbol.dispose](),this._inRate=e;let t=new FilterGraph;t.alloc();let r=Filter.getByName("abuffer"),i=t.createFilter(r,"src",`sample_rate=${e}:sample_fmt=flt:channel_layout=stereo:time_base=1/${e}`);if(!i)throw new Error("Failed to create abuffer");let a=Filter.getByName("abuffersink"),s=t.createFilter(a,"sink");if(!s)throw new Error("Failed to create abuffersink");let d=`aformat=sample_fmts=${Q[this._outFmt]??"flt"}:sample_rates=${this._outRate}:channel_layouts=stereo,asetnsamples=n=${this._frameSize}:p=1`,u=FilterInOut.createList([{name:"in",filterCtx:i,padIdx:0}]),c=FilterInOut.createList([{name:"out",filterCtx:s,padIdx:0}]);FFmpegError.throwIfError(t.parsePtr(d,c,u),"graph.parsePtr"),FFmpegError.throwIfError(t.configSync(),"graph.config"),this._graph=t,this._bufSrc=i,this._bufSink=s;}async encode(e,t){var s=[];try{if(!this._bufSrc||!this._inRate)return;let r=new Float32Array(e.buffer,e.byteOffset,e.byteLength/4);for(let c=0;c<r.length;c++)isFinite(r[c])||(r[c]=0);let i=r.length>>1;let a$1=a(s,Frame.fromAudioBuffer(Buffer.from(r.buffer,r.byteOffset,r.byteLength),{nbSamples:i,format:AV_SAMPLE_FMT_FLT,sampleRate:this._inRate,channelLayout:AV_CHANNEL_LAYOUT_STEREO,pts:this._pts,timeBase:{num:1,den:this._inRate}}));this._pts+=BigInt(i);FFmpegError.throwIfError(await this._bufSrc.buffersrcAddFrame(a$1),"buffersrcAddFrame");await this.drain(t);}catch(m){var d=m,u=true;}finally{b$1(s,d,u);}}async flush(e){this._bufSrc&&(await this._bufSrc.buffersrcAddFrame(null),await this.drain(e)),await this._ctx.sendFrame(null),await this.drainCodec(e);}[Symbol.dispose](){this._pkt.free(),this._filterFrame.free(),this._graph?.[Symbol.dispose](),this._ctx.freeContext();}async drain(e){for(;;){let t=await this._bufSink.buffersinkGetFrame(this._filterFrame);if(t===AVERROR_EAGAIN||t===AVERROR_EOF)break;FFmpegError.throwIfError(t,"buffersinkGetFrame"),FFmpegError.throwIfError(await this._ctx.sendFrame(this._filterFrame),"audioCtx.sendFrame"),this._filterFrame.unref(),await this.drainCodec(e);}}async drainCodec(e){for(;;){let t=await this._ctx.receivePacket(this._pkt);if(t===AVERROR_EAGAIN||t===AVERROR_EOF)break;FFmpegError.throwIfError(t,"audio.receivePacket"),this._pkt.streamIndex=this._stream.index,this._pkt.rescaleTs(this._ctx.timeBase,this._stream.timeBase),await e.writePacket(this._pkt),this._pkt.unref();}}};var E=class{_ctx;_opened=false;constructor(e,t){this._ctx=new FormatContext,FFmpegError.throwIfError(this._ctx.allocOutputContext2(null,t??null,e),"allocOutputContext2");}addStream(e,t){let r=this._ctx.newStream(null);return r.timeBase=e.timeBase,FFmpegError.throwIfError(r.codecpar.fromContext(e),"codecpar.fromContext"),t&&(r.codecpar.codecTag=t),r}async open(){this._opened||(FFmpegError.throwIfError(await this._ctx.openOutput(),"openOutput"),FFmpegError.throwIfError(await this._ctx.writeHeader(null),"writeHeader"),this._opened=true);}async writePacket(e){FFmpegError.throwIfError(await this._ctx.interleavedWriteFrame(e),"interleavedWriteFrame");}async[Symbol.asyncDispose](){this._opened&&(await this._ctx.writeTrailer(),await this._ctx.closeOutput(),await this._ctx[Symbol.asyncDispose](),this._opened=false);}};var g=class n{_ctx;_pkt;_stream;_pts=0n;constructor(e,t,r){this._ctx=e,this._pkt=t,this._stream=r;}static async create(e){let{width:t,height:r,fps:i,codecName:a,codecTag:s,globalHeader:m,codecOpts:d,bitrate:u,threadCount:c,muxer:f}=e,_=Codec.findEncoderByName(a);if(!_)throw new Error(`Video encoder not found: ${a}`);let o=new CodecContext;o.allocContext3(_),o.codecId=_.id,o.width=t,o.height=r,o.pixelFormat=e.pixelFormat,o.timeBase=new Rational(1,i),o.framerate=new Rational(i,1),o.gopSize=i*2,o.bitRate=BigInt(u),c&&(o.threadCount=c,o.threadType=FF_THREAD_SLICE),m&&o.setFlags(AV_CODEC_FLAG_GLOBAL_HEADER);for(let[$,z]of Object.entries(d))o.setOption($,z);s&&(o.codecTag=s),FFmpegError.throwIfError(await o.open2(_,null),"videoCtx.open2");let P=new Packet;P.alloc();let G=f.addStream(o,s);return new n(o,P,G)}async encode(e,t){e.pts=this._pts++,e.duration=1n,FFmpegError.throwIfError(await this._ctx.sendFrame(e),"videoCtx.sendFrame"),await this.drain(t);}async flush(e){await this._ctx.sendFrame(null),await this.drain(e);}[Symbol.dispose](){this._pkt.free(),this._ctx.freeContext();}async drain(e){let t=this._pkt;for(;;){let r=await this._ctx.receivePacket(t);if(r===AVERROR_EAGAIN||r===AVERROR_EOF)break;FFmpegError.throwIfError(r,"video.receivePacket"),t.streamIndex=this._stream.index,t.duration===0n&&(t.duration=1n),t.rescaleTs(this._ctx.timeBase,this._stream.timeBase),await e.writePacket(t),t.unref();}}};var H=class n{constructor(e,t,r,i,a,s,m,d){this._video=e;this._audio=t;this._muxer=r;this._limiter=i;this._outFile=a;this._sws=s;this._srcFrame=m;this._dstFrame=d;}_disposed=false;static async create(e){let{width:t,height:r,fps:i,outFile:a,withAudio:s=false}=e,m=new E(a),d=await g.create({width:t,height:r,fps:i,codecName:FF_ENCODER_LIBX265,codecTag:"hvc1",globalHeader:true,codecOpts:{preset:"ultrafast","x265-params":"log-level=1:bframes=0"},bitrate:8e6,pixelFormat:AV_PIX_FMT_YUVA420P,threadCount:cpus().length,muxer:m}),u;s&&(u=await y.create({outSampleRate:44100,outSampleFmt:AV_SAMPLE_FMT_FLTP,codecName:FF_ENCODER_AAC,globalHeader:true,bitrate:128e3,muxer:m})),await m.open();let c=new b(1),f=new Frame;f.alloc(),f.format=AV_PIX_FMT_BGRA,f.width=t,f.height=r,FFmpegError.throwIfError(f.getBuffer(0),"srcFrame.getBuffer");let _=new SoftwareScaleContext;_.getContext(t,r,AV_PIX_FMT_BGRA,t,r,AV_PIX_FMT_YUVA420P,SWS_BILINEAR);let o=new Frame;return o.alloc(),o.format=AV_PIX_FMT_YUVA420P,o.width=t,o.height=r,FFmpegError.throwIfError(o.getBuffer(0),"dstFrame.getBuffer"),new n(d,u,m,c,a,_,f,o)}setupAudio(e){this._audio?.setInputRate(e);}async encodeFrame(e){await this._limiter.schedule(async()=>(FFmpegError.throwIfError(this._srcFrame.makeWritable(),"srcFrame.makeWritable"),FFmpegError.throwIfError(this._srcFrame.fromBuffer(e),"srcFrame.fromBuffer"),FFmpegError.throwIfError(await this._sws.scaleFrame(this._dstFrame,this._srcFrame),"sws.scaleFrame"),FFmpegError.throwIfError(this._dstFrame.makeWritable(),"dstFrame.makeWritable"),this._video.encode(this._dstFrame,this._muxer)));}async encodeAudio(e){this._audio&&await this._limiter.schedule(()=>this._audio.encode(e,this._muxer));}async finish(){try{var e=[];try{let s=a(e,this._muxer,!0);let m=a(e,this._video);let d=a(e,this._audio);await this._limiter.end();await this._audio?.flush(this._muxer);await this._video.flush(this._muxer);}catch(t){var r=t,i=!0;}finally{var a$1=b$1(e,r,i);a$1&&await a$1;}}finally{this.free();}return this._outFile}async[Symbol.asyncDispose](){this._disposed||(await this._limiter.end(),this._video[Symbol.dispose](),this._audio?.[Symbol.dispose](),await this._muxer[Symbol.asyncDispose](),this.free());}free(){this._disposed||(this._disposed=true,this._srcFrame.free(),this._dstFrame.free(),this._sws[Symbol.dispose]());}};export{b as ConcurrencyLimiter,H as EncoderPipeline,E as FormatMuxer,C as Lazy,Ge as periodical,k as sleep,Xe as useRetry};//# sourceMappingURL=index.js.map
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9iYXNlL2xhenkudHMiLCIuLi9zcmMvYmFzZS9saW1pdGVyLnRzIiwiLi4vc3JjL2Jhc2UvdGltaW5nLnRzIiwiLi4vc3JjL2Jhc2UvcmV0cnkudHMiLCIuLi9zcmMvYmFzZS9lbmNvZGVyL2F1ZGlvLnRzIiwiLi4vc3JjL2Jhc2UvZW5jb2Rlci9tdXhlci50cyIsIi4uL3NyYy9iYXNlL2VuY29kZXIvdmlkZW8udHMiLCIuLi9zcmMvYmFzZS9lbmNvZGVyL2VuY29kZXIudHMiXSwibmFtZXMiOlsiTGF6eSIsIm1ha2VWYWx1ZSIsIkNvbmN1cnJlbmN5TGltaXRlciIsIm1heENvbmN1cnJlbmN5IiwiZm4iLCJyZXNvbHZlIiwicmVqZWN0IiwicnVuIiwidiIsImUiLCJyIiwic2xlZXAiLCJtcyIsInBlcmlvZGljYWwiLCJjYWxsYmFjayIsInRva2VuIiwiY2xvc2VkIiwidGljayIsImNvdW50IiwidXNlUmV0cnkiLCJtYXhBdHRlbXB0cyIsInRpbWVvdXQiLCJ0aW1lb3V0RXJyb3IiLCJhcmdzIiwiYXR0ZW1wdCIsInByb21pc2VzIiwic2V0VGltZW91dCIsIlNBTVBMRV9GTVRfTkFNRSIsIkFWX1NBTVBMRV9GTVRfRkxUIiwiQVZfU0FNUExFX0ZNVF9GTFRQIiwiQXVkaW9FbmNvZGVyIiwiX0F1ZGlvRW5jb2RlciIsImN0eCIsInN0cmVhbSIsIm91dEZtdCIsIlBhY2tldCIsIkZyYW1lIiwib3B0cyIsImNvZGVjIiwiQ29kZWMiLCJDb2RlY0NvbnRleHQiLCJBVl9DSEFOTkVMX0xBWU9VVF9TVEVSRU8iLCJSYXRpb25hbCIsIkFWX0NPREVDX0ZMQUdfR0xPQkFMX0hFQURFUiIsIkZGbXBlZ0Vycm9yIiwiaW5TYW1wbGVSYXRlIiwiZ3JhcGgiLCJGaWx0ZXJHcmFwaCIsImFidWZmZXIiLCJGaWx0ZXIiLCJidWZTcmMiLCJhYnVmZmVyc2luayIsImJ1ZlNpbmsiLCJmaWx0ZXJEZXNjIiwib3V0cHV0cyIsIkZpbHRlckluT3V0IiwiaW5wdXRzIiwicGNtIiwibXV4ZXIiLCJfc3RhY2siLCJzcmMiLCJpIiwiblNhbXBsZXMiLCJmcmFtZSIsIl9fdXNpbmciLCJfIiwiX2Vycm9yIiwiX2hhc0Vycm9yIiwiX19jYWxsRGlzcG9zZSIsIkFWRVJST1JfRUFHQUlOIiwiQVZFUlJPUl9FT0YiLCJGb3JtYXRNdXhlciIsIm91dFBhdGgiLCJmb3JtYXROYW1lIiwiRm9ybWF0Q29udGV4dCIsImNvZGVjQ3R4IiwiY29kZWNUYWciLCJwa3QiLCJWaWRlb0VuY29kZXIiLCJfVmlkZW9FbmNvZGVyIiwid2lkdGgiLCJoZWlnaHQiLCJmcHMiLCJjb2RlY05hbWUiLCJnbG9iYWxIZWFkZXIiLCJjb2RlY09wdHMiLCJiaXRyYXRlIiwidGhyZWFkQ291bnQiLCJGRl9USFJFQURfU0xJQ0UiLCJrIiwiRW5jb2RlclBpcGVsaW5lIiwiX0VuY29kZXJQaXBlbGluZSIsIl92aWRlbyIsIl9hdWRpbyIsIl9tdXhlciIsIl9saW1pdGVyIiwiX291dEZpbGUiLCJfc3dzIiwiX3NyY0ZyYW1lIiwiX2RzdEZyYW1lIiwib3V0RmlsZSIsIndpdGhBdWRpbyIsInZpZGVvIiwiRkZfRU5DT0RFUl9MSUJYMjY1IiwiQVZfUElYX0ZNVF9ZVVZBNDIwUCIsImNwdXMiLCJhdWRpbyIsIkZGX0VOQ09ERVJfQUFDIiwibGltaXRlciIsInNyY0ZyYW1lIiwiQVZfUElYX0ZNVF9CR1JBIiwic3dzIiwiU29mdHdhcmVTY2FsZUNvbnRleHQiLCJTV1NfQklMSU5FQVIiLCJkc3RGcmFtZSIsInNhbXBsZVJhdGUiLCJpbnB1dCIsIl9tIiwiX3YiLCJfYSIsIl9wcm9taXNlIl0sIm1hcHBpbmdzIjoiczlCQUVPLElBQU1BLENBQUFBLENBQU4sS0FBYyxDQUNuQixXQUFBLENBQXFCQyxDQUFBQSxDQUFvQixDQUFwQixJQUFBLENBQUEsU0FBQSxDQUFBQSxFQUFxQixDQUUxQyxJQUFJLEtBQUEsRUFBVyxDQUNiLE9BQUssSUFBQSxDQUFLLFlBQUEsR0FDUixJQUFBLENBQUssTUFBQSxDQUFTLElBQUEsQ0FB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Q0FBSyxPQUFPLEtBQUEsQ0FBTSxJQUFBLENBQUssTUFBTSxFQUFBLENBQUEsTUFMbkNNLENBQUFBLENBQUEsQ0FBQSxJQUFBQyxFQUFBRCxDQUFBQSxDQUFBRSxDQUFBQSxDQUFBLENBQUEsRUFBQSxDQUFBLE9BQUEsQ0FBQSxJQUFBcUQsR0FBQUEsQ0FBQXBELEdBQUFBLENBQUFULENBQUFBLENBQUFPLEVBQUFDLENBQUFBLENBQUFBLENBQUFxRCxHQUFBQSxFQUFBLE1BQUFBLElBQUFBLENBTUYsQ0FBQSxPQUFFLENBQ0EsSUFBQSxDQUFLLElBQUEsR0FDUCxDQUNBLE9BQU8sSUFBQSxDQUFLLFFBQ2QsQ0FFQSxNQUFPLE1BQUEsQ0FBTyxZQUFZLENBQUEsRUFBbUIsQ0FDdkMsSUFBQSxDQUFLLFNBQUEsR0FDVCxNQUFNLElBQUEsQ0FBSyxRQUFBLENBQVMsR0FBQSxFQUFJLENBQ3hCLElBQUEsQ0FBSyxNQUFBLENBQU8sT0FBTyxPQUFPLENBQUEsRUFBRSxDQUM1QixJQUFBLENBQUssTUFBQSxHQUFTLE1BQUEsQ0FBTyxPQUFPLENBQUEsRUFBRSxDQUM5QixNQUFNLElBQUEsQ0FBSyxNQUFBLENBQU8sTUFBQSxDQUFPLFlBQVksR0FBRSxDQUN2QyxJQUFBLENBQUssSUFBQSxFQUFLLEVBQ1osQ0FFUSxJQUFBLEVBQWEsQ0FDZixJQUFBLENBQUssU0FBQSxHQUNULElBQUEsQ0FBSyxTQUFBLENBQVksSUFBQSxDQUNqQixJQUFBLENBQUssVUFBVSxJQUFBLEVBQUssQ0FDcEIsSUFBQSxDQUFLLFNBQUEsQ0FBVSxJQUFBLEVBQUssQ0FDcEIsSUFBQSxDQUFLLElBQUEsQ0FBSyxNQUFBLENBQU8sT0FBTyxDQUFBLEVBQUUsRUFDNUIsQ0FDRiIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENyZWF0ZWQgYnkgQXV0b2tha2EgKHFxMTkwOTY5ODQ5NEBnbWFpbC5jb20pIG9uIDIwMjYvMDEvMzAuXG5cbmV4cG9ydCBjbGFzcyBMYXp5PFQ+IHtcbiAgY29uc3RydWN0b3IocmVhZG9ubHkgbWFrZVZhbHVlOiAoKSA9PiBUKSB7fVxuXG4gIGdldCB2YWx1ZSgpOiBUIHtcbiAgICBpZiAoIXRoaXMuX2luaXRpYWxpemVkKSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IHRoaXMubWFrZVZhbHVlKCk7XG4gICAgICB0aGlzLl9pbml0aWFsaXplZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl92YWx1ZSE7XG4gIH1cblxuICBnZXQgaW5pdGlhbGl6ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2luaXRpYWxpemVkO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfdmFsdWU6IFQgfCB1bmRlZmluZWQ7XG59XG4iLCIvLyBDcmVhdGVkIGJ5IEF1dG9rYWthIChxcTE5MDk2OTg0OTRAZ21haWwuY29tKSBvbiAyMDI2LzAxLzMwLlxuXG5leHBvcnQgY2xhc3MgQ29uY3VycmVuY3lMaW1pdGVyIHtcbiAgcHJpdmF0ZSBfYWN0aXZlID0gMDtcbiAgcHJpdmF0ZSBfcXVldWU6IFZvaWRGdW5jdGlvbltdID0gW107XG4gIHByaXZhdGUgX2VuZGVkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IocmVhZG9ubHkgbWF4Q29uY3VycmVuY3k6IG51bWJlcikge31cblxuICBnZXQgYWN0aXZlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTtcbiAgfVxuXG4gIGdldCBwZW5kaW5nKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3F1ZXVlLmxlbmd0aDtcbiAgfVxuXG4gIGdldCBzdGF0cygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgYWN0aXZlOiAke3RoaXMuYWN0aXZlfSwgcGVuZGluZzogJHt0aGlzLnBlbmRpbmd9YDtcbiAgfVxuXG4gIGFzeW5jIHNjaGVkdWxlPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgaWYgKHRoaXMuX2VuZGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJlbmRlZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPFQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHJ1biA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5fYWN0aXZlKys7XG4gICAgICAgIGZuKClcbiAgICAgICAgICAudGhlbigodikgPT4ge1xuICAgICAgICAgICAgdGhpcy5fYWN0aXZlLS07XG4gICAgICAgICAgICByZXNvbHZlKHYpO1xuICAgICAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZS0tO1xuICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgdGhpcy5uZXh0KCk7XG4gICAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgdGhpcy5fcXVldWUucHVzaChydW4pO1xuICAgICAgdGhpcy5uZXh0KCk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBlbmQoKSB7XG4gICAgaWYgKHRoaXMuX2VuZGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2VuZGVkID0gdHJ1ZTtcbiAgICB3aGlsZSAodGhpcy5fYWN0aXZlID4gMCB8fCB0aGlzLnBlbmRpbmcgPiAwKSB7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCA1MCkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbmV4dCgpIHtcbiAgICBpZiAodGhpcy5fYWN0aXZlIDwgdGhpcy5tYXhDb25jdXJyZW5jeSkge1xuICAgICAgdGhpcy5fcXVldWUuc2hpZnQoKT8uKCk7XG4gICAgfVxuICB9XG59XG4iLCIvLyBDcmVhdGVkIGJ5IEF1dG9rYWthIChxcTE5MDk2OTg0OTRAZ21haWwuY29tKSBvbiAyMDI2LzAyLzA5LlxuXG5leHBvcnQgZnVuY3Rpb24gc2xlZXAobXM6IG51bWJlcikge1xuICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBlcmlvZGljYWwoY2FsbGJhY2s6IChjb3VudDogbnVtYmVyKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZCwgbXM6IG51bWJlcikge1xuICBsZXQgdG9rZW46IE5vZGVKUy5UaW1lb3V0O1xuICBsZXQgY2xvc2VkID0gZmFsc2U7XG4gIGFzeW5jIGZ1bmN0aW9uIHRpY2soY291bnQ6IG51bWJlcikge1xuICAgIGF3YWl0IGNhbGxiYWNrKGNvdW50KTtcbiAgICBpZiAoY2xvc2VkKSByZXR1cm47XG4gICAgdG9rZW4gPSBzZXRUaW1lb3V0KCgpID0+IHRpY2soY291bnQgKyAxKSwgbXMpO1xuICB9XG4gIHRva2VuID0gc2V0VGltZW91dCgoKSA9PiB0aWNrKDApLCBtcyk7XG4gIHJldHVybiAoKSA9PiB7XG4gICAgY2xvc2VkID0gdHJ1ZTtcbiAgICBjbGVhclRpbWVvdXQodG9rZW4pO1xuICB9O1xufVxuIiwiLy8gQ3JlYXRlZCBieSBBdXRva2FrYSAocXExOTA5Njk4NDk0QGdtYWlsLmNvbSkgb24gMjAyNi8wMi8wNS5cblxuaW1wb3J0IHsgc2V0VGltZW91dCB9IGZyb20gXCJ0aW1lcnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IHNsZWVwIH0gZnJvbSBcIi4vdGltaW5nXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmV0cnlPcHRpb25zPEFyZ3MgZXh0ZW5kcyBhbnlbXSwgUmV0PiB7XG4gIGZuOiAoLi4uYXJnczogQXJncykgPT4gUHJvbWlzZTxSZXQ+O1xuICBtYXhBdHRlbXB0cz86IG51bWJlcjtcbiAgdGltZW91dD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVJldHJ5PEFyZ3MgZXh0ZW5kcyBhbnlbXSwgUmV0Pih7IGZuLCBtYXhBdHRlbXB0cyA9IDMsIHRpbWVvdXQgfTogUmV0cnlPcHRpb25zPEFyZ3MsIFJldD4pIHtcbiAgY29uc3QgdGltZW91dEVycm9yID0gbmV3IEVycm9yKGB0aW1lb3V0IG92ZXIgJHt0aW1lb3V0fW1zYCk7XG4gIHJldHVybiBhc3luYyBmdW5jdGlvbiAoLi4uYXJnczogQXJncykge1xuICAgIGxldCBhdHRlbXB0ID0gMDtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBbZm4oLi4uYXJncyldO1xuICAgICAgICBpZiAodGltZW91dCkge1xuICAgICAgICAgIHByb21pc2VzLnB1c2goXG4gICAgICAgICAgICBzZXRUaW1lb3V0KHRpbWVvdXQpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICB0aHJvdyB0aW1lb3V0RXJyb3I7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCBQcm9taXNlLnJhY2UocHJvbWlzZXMpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBhdHRlbXB0Kys7XG4gICAgICAgIGlmIChhdHRlbXB0ID49IG1heEF0dGVtcHRzKSB7XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBzbGVlcChNYXRoLnBvdygyLCBhdHRlbXB0KSAqIDEwMCArIE1hdGgucmFuZG9tKCkgKiAxMDApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cbiIsIi8vIENyZWF0ZWQgYnkgQXV0b2tha2EgKHFxMTkwOTY5ODQ5NEBnbWFpbC5jb20pIG9uIDIwMjYvMDQvMDEuXG5cbmltcG9ydCB7IENvZGVjLCBDb2RlY0NvbnRleHQsIEZGbXBlZ0Vycm9yLCBGaWx0ZXIsIEZpbHRlckdyYXBoLCBGaWx0ZXJJbk91dCwgRnJhbWUsIFBhY2tldCwgUmF0aW9uYWwgfSBmcm9tIFwibm9kZS1hdlwiO1xuaW1wb3J0IHtcbiAgQVZfQ0hBTk5FTF9MQVlPVVRfU1RFUkVPLFxuICBBVl9DT0RFQ19GTEFHX0dMT0JBTF9IRUFERVIsXG4gIEFWX1NBTVBMRV9GTVRfRkxULFxuICBBVl9TQU1QTEVfRk1UX0ZMVFAsXG4gIEFWRVJST1JfRUFHQUlOLFxuICBBVkVSUk9SX0VPRixcbiAgdHlwZSBGRkF1ZGlvRW5jb2Rlcixcbn0gZnJvbSBcIm5vZGUtYXYvY29uc3RhbnRzXCI7XG5pbXBvcnQgdHlwZSB7IEZvcm1hdE11eGVyIH0gZnJvbSBcIi4vbXV4ZXJcIjtcblxuY29uc3QgU0FNUExFX0ZNVF9OQU1FOiBQYXJ0aWFsPFJlY29yZDxudW1iZXIsIHN0cmluZz4+ID0geyBbQVZfU0FNUExFX0ZNVF9GTFRdOiBcImZsdFwiLCBbQVZfU0FNUExFX0ZNVF9GTFRQXTogXCJmbHRwXCIgfTtcbnR5cGUgU3RyZWFtID0gUmV0dXJuVHlwZTxpbXBvcnQoXCJub2RlLWF2XCIpLkZvcm1hdENvbnRleHRbXCJuZXdTdHJlYW1cIl0+O1xuXG5leHBvcnQgaW50ZXJmYWNlIEF1ZGlvRW5jb2Rlck9wdGlvbnMge1xuICBvdXRTYW1wbGVSYXRlOiBudW1iZXI7XG4gIG91dFNhbXBsZUZtdDogdHlwZW9mIEFWX1NBTVBMRV9GTVRfRkxUIHwgdHlwZW9mIEFWX1NBTVBMRV9GTVRfRkxUUDtcbiAgY29kZWNOYW1lOiBGRkF1ZGlvRW5jb2RlcjtcbiAgZ2xvYmFsSGVhZGVyOiBib29sZWFuO1xuICBiaXRyYXRlOiBudW1iZXI7XG4gIG11eGVyOiBGb3JtYXRNdXhlcjtcbn1cblxuZXhwb3J0IGNsYXNzIEF1ZGlvRW5jb2RlciBpbXBsZW1lbnRzIERpc3Bvc2FibGUge1xuICBwcml2YXRlIF9jdHg6IENvZGVjQ29udGV4dDtcbiAgcHJpdmF0ZSBfc3RyZWFtOiBTdHJlYW07XG4gIHByaXZhdGUgX3BrdDogUGFja2V0O1xuICBwcml2YXRlIF9vdXRSYXRlOiBudW1iZXI7XG4gIHByaXZhdGUgX291dEZtdDogdHlwZW9mIEFWX1NBTVBMRV9GTVRfRkxUIHwgdHlwZW9mIEFWX1NBTVBMRV9GTVRfRkxUUDtcbiAgcHJpdmF0ZSBfZnJhbWVTaXplOiBudW1iZXI7XG4gIHByaXZhdGUgX2ZpbHRlckZyYW1lOiBGcmFtZTtcbiAgcHJpdmF0ZSBfZ3JhcGg/OiBGaWx0ZXJHcmFwaDtcbiAgcHJpdmF0ZSBfYnVmU3JjPzogYW55O1xuICBwcml2YXRlIF9idWZTaW5rPzogYW55O1xuICBwcml2YXRlIF9pblJhdGU/OiBudW1iZXI7XG4gIHByaXZhdGUgX3B0cyA9IDBuO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoY3R4OiBDb2RlY0NvbnRleHQsIHN0cmVhbTogU3RyZWFtLCBvdXRGbXQ6IHR5cGVvZiBBVl9TQU1QTEVfRk1UX0ZMVCB8IHR5cGVvZiBBVl9TQU1QTEVfRk1UX0ZMVFApIHtcbiAgICB0aGlzLl9jdHggPSBjdHg7XG4gICAgdGhpcy5fc3RyZWFtID0gc3RyZWFtO1xuICAgIHRoaXMuX291dFJhdGUgPSBjdHguc2FtcGxlUmF0ZTtcbiAgICB0aGlzLl9vdXRGbXQgPSBvdXRGbXQ7XG4gICAgdGhpcy5fZnJhbWVTaXplID0gY3R4LmZyYW1lU2l6ZTtcbiAgICB0aGlzLl9wa3QgPSBuZXcgUGFja2V0KCk7XG4gICAgdGhpcy5fcGt0LmFsbG9jKCk7XG4gICAgdGhpcy5fZmlsdGVyRnJhbWUgPSBuZXcgRnJhbWUoKTtcbiAgICB0aGlzLl9maWx0ZXJGcmFtZS5hbGxvYygpO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGNyZWF0ZShvcHRzOiBBdWRpb0VuY29kZXJPcHRpb25zKTogUHJvbWlzZTxBdWRpb0VuY29kZXI+IHtcbiAgICBjb25zdCBjb2RlYyA9IENvZGVjLmZpbmRFbmNvZGVyQnlOYW1lKG9wdHMuY29kZWNOYW1lKTtcbiAgICBpZiAoIWNvZGVjKSB0aHJvdyBuZXcgRXJyb3IoYEF1ZGlvIGVuY29kZXIgbm90IGZvdW5kOiAke29wdHMuY29kZWNOYW1lfWApO1xuICAgIGNvbnN0IGN0eCA9IG5ldyBDb2RlY0NvbnRleHQoKTtcbiAgICBjdHguYWxsb2NDb250ZXh0Myhjb2RlYyk7XG4gICAgY3R4LmNvZGVjSWQgPSBjb2RlYy5pZDtcbiAgICBjdHguc2FtcGxlRm9ybWF0ID0gb3B0cy5vdXRTYW1wbGVGbXQ7XG4gICAgY3R4LnNhbXBsZVJhdGUgPSBvcHRzLm91dFNhbXBsZVJhdGU7XG4gICAgY3R4LmNoYW5uZWxMYXlvdXQgPSBBVl9DSEFOTkVMX0xBWU9VVF9TVEVSRU87XG4gICAgY3R4LnRpbWVCYXNlID0gbmV3IFJhdGlvbmFsKDEsIG9wdHMub3V0U2FtcGxlUmF0ZSk7XG4gICAgY3R4LmJpdFJhdGUgPSBCaWdJbnQob3B0cy5iaXRyYXRlKTtcbiAgICBpZiAob3B0cy5nbG9iYWxIZWFkZXIpIGN0eC5zZXRGbGFncyhBVl9DT0RFQ19GTEFHX0dMT0JBTF9IRUFERVIpO1xuICAgIEZGbXBlZ0Vycm9yLnRocm93SWZFcnJvcihhd2FpdCBjdHgub3BlbjIoY29kZWMsIG51bGwpLCBcImF1ZGlvQ3R4Lm9wZW4yXCIpO1xuICAgIGNvbnN0IHN0cmVhbSA9IG9wdHMubXV4ZXIuYWRkU3RyZWFtKGN0eCk7XG4gICAgcmV0dXJuIG5ldyBBdWRpb0VuY29kZXIoY3R4LCBzdHJlYW0sIG9wdHMub3V0U2FtcGxlRm10KTtcbiAgfVxuXG4gIHNldElucHV0UmF0ZShpblNhbXBsZVJhdGU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX2dyYXBoPy5bU3ltYm9sLmRpc3Bvc2VdKCk7XG4gICAgdGhpcy5faW5SYXRlID0gaW5TYW1wbGVSYXRlO1xuICAgIGNvbnN0IGdyYXBoID0gbmV3IEZpbHRlckdyYXBoKCk7XG4gICAgZ3JhcGguYWxsb2MoKTtcbiAgICBjb25zdCBhYnVmZmVyID0gRmlsdGVyLmdldEJ5TmFtZShcImFidWZmZXJcIikhO1xuICAgIGNvbnN0IGJ1ZlNyYyA9IGdyYXBoLmNyZWF0ZUZpbHRlcihcbiAgICAgIGFidWZmZXIsXG4gICAgICBcInNyY1wiLFxuICAgICAgYHNhbXBsZV9yYXRlPSR7aW5TYW1wbGVSYXRlfTpzYW1wbGVfZm10PWZsdDpjaGFubmVsX2xheW91dD1zdGVyZW86dGltZV9iYXNlPTEvJHtpblNhbXBsZVJhdGV9YCxcbiAgICApO1xuICAgIGlmICghYnVmU3JjKSB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gY3JlYXRlIGFidWZmZXJcIik7XG4gICAgY29uc3QgYWJ1ZmZlcnNpbmsgPSBGaWx0ZXIuZ2V0QnlOYW1lKFwiYWJ1ZmZlcnNpbmtcIikhO1xuICAgIGNvbnN0IGJ1ZlNpbmsgPSBncmFwaC5jcmVhdGVGaWx0ZXIoYWJ1ZmZlcnNpbmssIFwic2lua1wiKTtcbiAgICBpZiAoIWJ1ZlNpbmspIHRocm93IG5ldyBFcnJvcihcIkZhaWxlZCB0byBjcmVhdGUgYWJ1ZmZlcnNpbmtcIik7XG4gICAgY29uc3QgZm10TmFtZSA9IFNBTVBMRV9GTVRfTkFNRVt0aGlzLl9vdXRGbXRdID8/IFwiZmx0XCI7XG4gICAgY29uc3QgZmlsdGVyRGVzYyA9IGBhZm9ybWF0PXNhbXBsZV9mbXRzPSR7Zm10TmFtZX06c2FtcGxlX3JhdGVzPSR7dGhpcy5fb3V0UmF0ZX06Y2hhbm5lbF9sYXlvdXRzPXN0ZXJlbyxhc2V0bnNhbXBsZXM9bj0ke3RoaXMuX2ZyYW1lU2l6ZX06cD0xYDtcbiAgICBjb25zdCBvdXRwdXRzID0gRmlsdGVySW5PdXQuY3JlYXRlTGlzdChbeyBuYW1lOiBcImluXCIsIGZpbHRlckN0eDogYnVmU3JjLCBwYWRJZHg6IDAgfV0pO1xuICAgIGNvbnN0IGlucHV0cyA9IEZpbHRlckluT3V0LmNyZWF0ZUxpc3QoW3sgbmFtZTogXCJvdXRcIiwgZmlsdGVyQ3R4OiBidWZTaW5rLCBwYWRJZHg6IDAgfV0pO1xuICAgIEZGbXBlZ0Vycm9yLnRocm93SWZFcnJvcihncmFwaC5wYXJzZVB0cihmaWx0ZXJEZXNjLCBpbnB1dHMsIG91dHB1dHMpLCBcImdyYXBoLnBhcnNlUHRyXCIpO1xuICAgIEZGbXBlZ0Vycm9yLnRocm93SWZFcnJvcihncmFwaC5jb25maWdTeW5jKCksIFwiZ3JhcGguY29uZmlnXCIpO1xuICAgIHRoaXMuX2dyYXBoID0gZ3JhcGg7XG4gICAgdGhpcy5fYnVmU3JjID0gYnVmU3JjO1xuICAgIHRoaXMuX2J1ZlNpbmsgPSBidWZTaW5rO1xuICB9XG5cbiAgYXN5bmMgZW5jb2RlKHBjbTogQnVmZmVyLCBtdXhlcjogRm9ybWF0TXV4ZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuX2J1ZlNyYyB8fCAhdGhpcy5faW5SYXRlKSByZXR1cm47XG4gICAgY29uc3Qgc3JjID0gbmV3IEZsb2F0MzJBcnJheShwY20uYnVmZmVyLCBwY20uYnl0ZU9mZnNldCwgcGNtLmJ5dGVMZW5ndGggLyA0KTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNyYy5sZW5ndGg7IGkrKykgaWYgKCFpc0Zpbml0ZShzcmNbaV0hKSkgc3JjW2ldID0gMDtcbiAgICBjb25zdCBuU2FtcGxlcyA9IHNyYy5sZW5ndGggPj4gMTtcbiAgICB1c2luZyBmcmFtZSA9IEZyYW1lLmZyb21BdWRpb0J1ZmZlcihCdWZmZXIuZnJvbShzcmMuYnVmZmVyLCBzcmMuYnl0ZU9mZnNldCwgc3JjLmJ5dGVMZW5ndGgpLCB7XG4gICAgICBuYlNhbXBsZXM6IG5TYW1wbGVzLFxuICAgICAgZm9ybWF0OiBBVl9TQU1QTEVfRk1UX0ZMVCxcbiAgICAgIHNhbXBsZVJhdGU6IHRoaXMuX2luUmF0ZSxcbiAgICAgIGNoYW5uZWxMYXlvdXQ6IEFWX0NIQU5ORUxfTEFZT1VUX1NURVJFTyxcbiAgICAgIHB0czogdGhpcy5fcHRzLFxuICAgICAgdGltZUJhc2U6IHsgbnVtOiAxLCBkZW46IHRoaXMuX2luUmF0ZSB9LFxuICAgIH0pO1xuICAgIHRoaXMuX3B0cyArPSBCaWdJbnQoblNhbXBsZXMpO1xuICAgIEZGbXBlZ0Vycm9yLnRocm93SWZFcnJvcihhd2FpdCB0aGlzLl9idWZTcmMuYnVmZmVyc3JjQWRkRnJhbWUoZnJhbWUpLCBcImJ1ZmZlcnNyY0FkZEZyYW1lXCIpO1xuICAgIGF3YWl0IHRoaXMuZHJhaW4obXV4ZXIpO1xuICB9XG5cbiAgYXN5bmMgZmx1c2gobXV4ZXI6IEZvcm1hdE11eGVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuX2J1ZlNyYykge1xuICAgICAgYXdhaXQgdGhpcy5fYnVmU3JjLmJ1ZmZlcnNyY0FkZEZyYW1lKG51bGwpO1xuICAgICAgYXdhaXQgdGhpcy5kcmFpbihtdXhlcik7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuX2N0eC5zZW5kRnJhbWUobnVsbCk7XG4gICAgYXdhaXQgdGhpcy5kcmFpbkNvZGVjKG11eGVyKTtcbiAgfVxuXG4gIFtTeW1ib2wuZGlzcG9zZV0oKTogdm9pZCB7XG4gICAgdGhpcy5fcGt0LmZyZWUoKTtcbiAgICB0aGlzLl9maWx0ZXJGcmFtZS5mcmVlKCk7XG4gICAgdGhpcy5fZ3JhcGg/LltTeW1ib2wuZGlzcG9zZV0oKTtcbiAgICB0aGlzLl9jdHguZnJlZUNvbnRleHQoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZHJhaW4obXV4ZXI6IEZvcm1hdE11eGVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IHIgPSBhd2FpdCB0aGlzLl9idWZTaW5rIS5idWZmZXJzaW5rR2V0RnJhbWUodGhpcy5fZmlsdGVyRnJhbWUpO1xuICAgICAgaWYgKHIgPT09IEFWRVJST1JfRUFHQUlOIHx8IHIgPT09IEFWRVJST1JfRU9GKSBicmVhaztcbiAgICAgIEZGbXBlZ0Vycm9yLnRocm93SWZFcnJvcihyLCBcImJ1ZmZlcnNpbmtHZXRGcmFtZVwiKTtcbiAgICAgIEZGbXBlZ0Vycm9yLnRocm93SWZFcnJvcihhd2FpdCB0aGlzLl9jdHguc2VuZEZyYW1lKHRoaXMuX2ZpbHRlckZyYW1lKSwgXCJhdWRpb0N0eC5zZW5kRnJhbWVcIik7XG4gICAgICB0aGlzLl9maWx0ZXJGcmFtZS51bnJlZigpO1xuICAgICAgYXdhaXQgdGhpcy5kcmFpbkNvZGVjKG11eGVyKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGRyYWluQ29kZWMobXV4ZXI6IEZvcm1hdE11eGVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IHIgPSBhd2FpdCB0aGlzLl9jdHgucmVjZWl2ZVBhY2tldCh0aGlzLl9wa3QpO1xuICAgICAgaWYgKHIgPT09IEFWRVJST1JfRUFHQUlOIHx8IHIgPT09IEFWRVJST1JfRU9GKSBicmVhaztcbiAgICAgIEZGbXBlZ0Vycm9yLnRocm93SWZFcnJvcihyLCBcImF1ZGlvLnJlY2VpdmVQYWNrZXRcIik7XG4gICAgICB0aGlzLl9wa3Quc3RyZWFtSW5kZXggPSB0aGlzLl9zdHJlYW0uaW5kZXg7XG4gICAgICB0aGlzLl9wa3QucmVzY2FsZVRzKHRoaXMuX2N0eC50aW1lQmFzZSwgdGhpcy5fc3RyZWFtLnRpbWVCYXNlKTtcbiAgICAgIGF3YWl0IG11eGVyLndyaXRlUGFja2V0KHRoaXMuX3BrdCk7XG4gICAgICB0aGlzLl9wa3QudW5yZWYoKTtcbiAgICB9XG4gIH1cbn1cbiIsIi8vIENyZWF0ZWQgYnkgQXV0b2tha2EgKHFxMTkwOTY5ODQ5NEBnbWFpbC5jb20pIG9uIDIwMjYvMDMvMjEuXG5cbmltcG9ydCB7IENvZGVjQ29udGV4dCwgRkZtcGVnRXJyb3IsIEZvcm1hdENvbnRleHQsIFBhY2tldCB9IGZyb20gXCJub2RlLWF2XCI7XG5cbmV4cG9ydCBjbGFzcyBGb3JtYXRNdXhlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2N0eDogRm9ybWF0Q29udGV4dDtcbiAgcHJpdmF0ZSBfb3BlbmVkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3Iob3V0UGF0aDogc3RyaW5nLCBmb3JtYXROYW1lPzogc3RyaW5nKSB7XG4gICAgdGhpcy5fY3R4ID0gbmV3IEZvcm1hdENvbnRleHQoKTtcbiAgICBGRm1wZWdFcnJvci50aHJvd0lmRXJyb3IodGhpcy5fY3R4LmFsbG9jT3V0cHV0Q29udGV4dDIobnVsbCwgZm9ybWF0TmFtZSA/PyBudWxsLCBvdXRQYXRoKSwgXCJhbGxvY091dHB1dENvbnRleHQyXCIpO1xuICB9XG5cbiAgYWRkU3RyZWFtKGNvZGVjQ3R4OiBDb2RlY0NvbnRleHQsIGNvZGVjVGFnPzogc3RyaW5nKTogUmV0dXJuVHlwZTxGb3JtYXRDb250ZXh0W1wibmV3U3RyZWFtXCJdPiB7XG4gICAgY29uc3Qgc3RyZWFtID0gdGhpcy5fY3R4Lm5ld1N0cmVhbShudWxsKTtcbiAgICBzdHJlYW0udGltZUJhc2UgPSBjb2RlY0N0eC50aW1lQmFzZTtcbiAgICBGRm1wZWdFcnJvci50aHJvd0lmRXJyb3Ioc3RyZWFtLmNvZGVjcGFyLmZyb21Db250ZXh0KGNvZGVjQ3R4KSwgXCJjb2RlY3Bhci5mcm9tQ29udGV4dFwiKTtcbiAgICBpZiAoY29kZWNUYWcpIHN0cmVhbS5jb2RlY3Bhci5jb2RlY1RhZyA9IGNvZGVjVGFnO1xuICAgIHJldHVybiBzdHJlYW07XG4gIH1cblxuICBhc3luYyBvcGVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLl9vcGVuZWQpIHJldHVybjtcbiAgICBGRm1wZWdFcnJvci50aHJvd0lmRXJyb3IoYXdhaXQgdGhpcy5fY3R4Lm9wZW5PdXRwdXQoKSwgXCJvcGVuT3V0cHV0XCIpO1xuICAgIEZGbXBlZ0Vycm9yLnRocm93SWZFcnJvcihhd2FpdCB0aGlzLl9jdHgud3JpdGVIZWFkZXIobnVsbCksIFwid3JpdGVIZWFkZXJcIik7XG4gICAgdGhpcy5fb3BlbmVkID0gdHJ1ZTtcbiAgfVxuXG4gIGFzeW5jIHdyaXRlUGFja2V0KHBrdDogUGFja2V0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgRkZtcGVnRXJyb3IudGhyb3dJZkVycm9yKGF3YWl0IHRoaXMuX2N0eC5pbnRlcmxlYXZlZFdyaXRlRnJhbWUocGt0KSwgXCJpbnRlcmxlYXZlZFdyaXRlRnJhbWVcIik7XG4gIH1cblxuICBhc3luYyBbU3ltYm9sLmFzeW5jRGlzcG9zZV0oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLl9vcGVuZWQpIHJldHVybjtcbiAgICBhd2FpdCB0aGlzLl9jdHgud3JpdGVUcmFpbGVyKCk7XG4gICAgYXdhaXQgdGhpcy5fY3R4LmNsb3NlT3V0cHV0KCk7XG4gICAgYXdhaXQgdGhpcy5fY3R4W1N5bWJvbC5hc3luY0Rpc3Bvc2VdKCk7XG4gICAgdGhpcy5fb3BlbmVkID0gZmFsc2U7XG4gIH1cbn1cbiIsIi8vIENyZWF0ZWQgYnkgQXV0b2tha2EgKHFxMTkwOTY5ODQ5NEBnbWFpbC5jb20pIG9uIDIwMjYvMDMvMjEuXG5cbmltcG9ydCB7IENvZGVjLCBDb2RlY0NvbnRleHQsIEZGbXBlZ0Vycm9yLCBGcmFtZSwgUGFja2V0LCBSYXRpb25hbCB9IGZyb20gXCJub2RlLWF2XCI7XG5pbXBvcnQge1xuICBBVl9DT0RFQ19GTEFHX0dMT0JBTF9IRUFERVIsXG4gIEFWRVJST1JfRUFHQUlOLFxuICBBVkVSUk9SX0VPRixcbiAgRkZfVEhSRUFEX1NMSUNFLFxuICB0eXBlIEFWUGl4ZWxGb3JtYXQsXG4gIHR5cGUgRkZWaWRlb0VuY29kZXIsXG59IGZyb20gXCJub2RlLWF2L2NvbnN0YW50c1wiO1xuaW1wb3J0IHR5cGUgeyBGb3JtYXRNdXhlciB9IGZyb20gXCIuL211eGVyXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmlkZW9FbmNvZGVyT3B0aW9ucyB7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xuICBmcHM6IG51bWJlcjtcbiAgY29kZWNOYW1lOiBGRlZpZGVvRW5jb2RlcjtcbiAgY29kZWNUYWc/OiBzdHJpbmc7XG4gIGdsb2JhbEhlYWRlcjogYm9vbGVhbjtcbiAgY29kZWNPcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBiaXRyYXRlOiBudW1iZXI7XG4gIHBpeGVsRm9ybWF0OiBBVlBpeGVsRm9ybWF0O1xuICB0aHJlYWRDb3VudD86IG51bWJlcjtcbiAgbXV4ZXI6IEZvcm1hdE11eGVyO1xufVxuXG50eXBlIFN0cmVhbSA9IFJldHVyblR5cGU8aW1wb3J0KFwibm9kZS1hdlwiKS5Gb3JtYXRDb250ZXh0W1wibmV3U3RyZWFtXCJdPjtcblxuZXhwb3J0IGNsYXNzIFZpZGVvRW5jb2RlciBpbXBsZW1lbnRzIERpc3Bvc2FibGUge1xuICBwcml2YXRlIHJlYWRvbmx5IF9jdHg6IENvZGVjQ29udGV4dDtcbiAgcHJpdmF0ZSByZWFkb25seSBfcGt0OiBQYWNrZXQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3N0cmVhbTogU3RyZWFtO1xuICBwcml2YXRlIF9wdHMgPSAwbjtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKGN0eDogQ29kZWNDb250ZXh0LCBwa3Q6IFBhY2tldCwgc3RyZWFtOiBTdHJlYW0pIHtcbiAgICB0aGlzLl9jdHggPSBjdHg7XG4gICAgdGhpcy5fcGt0ID0gcGt0O1xuICAgIHRoaXMuX3N0cmVhbSA9IHN0cmVhbTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBjcmVhdGUob3B0czogVmlkZW9FbmNvZGVyT3B0aW9ucyk6IFByb21pc2U8VmlkZW9FbmNvZGVyPiB7XG4gICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0LCBmcHMsIGNvZGVjTmFtZSwgY29kZWNUYWcsIGdsb2JhbEhlYWRlciwgY29kZWNPcHRzLCBiaXRyYXRlLCB0aHJlYWRDb3VudCwgbXV4ZXIgfSA9IG9wdHM7XG5cbiAgICBjb25zdCBjb2RlYyA9IENvZGVjLmZpbmRFbmNvZGVyQnlOYW1lKGNvZGVjTmFtZSk7XG4gICAgaWYgKCFjb2RlYykgdGhyb3cgbmV3IEVycm9yKGBWaWRlbyBlbmNvZGVyIG5vdCBmb3VuZDogJHtjb2RlY05hbWV9YCk7XG5cbiAgICBjb25zdCBjdHggPSBuZXcgQ29kZWNDb250ZXh0KCk7XG4gICAgY3R4LmFsbG9jQ29udGV4dDMoY29kZWMpO1xuICAgIGN0eC5jb2RlY0lkID0gY29kZWMuaWQ7XG4gICAgY3R4LndpZHRoID0gd2lkdGg7XG4gICAgY3R4LmhlaWdodCA9IGhlaWdodDtcbiAgICBjdHgucGl4ZWxGb3JtYXQgPSBvcHRzLnBpeGVsRm9ybWF0O1xuICAgIGN0eC50aW1lQmFzZSA9IG5ldyBSYXRpb25hbCgxLCBmcHMpO1xuICAgIGN0eC5mcmFtZXJhdGUgPSBuZXcgUmF0aW9uYWwoZnBzLCAxKTtcbiAgICBjdHguZ29wU2l6ZSA9IGZwcyAqIDI7XG4gICAgY3R4LmJpdFJhdGUgPSBCaWdJbnQoYml0cmF0ZSk7XG4gICAgaWYgKHRocmVhZENvdW50KSB7XG4gICAgICBjdHgudGhyZWFkQ291bnQgPSB0aHJlYWRDb3VudDtcbiAgICAgIGN0eC50aHJlYWRUeXBlID0gRkZfVEhSRUFEX1NMSUNFO1xuICAgIH1cbiAgICBpZiAoZ2xvYmFsSGVhZGVyKSBjdHguc2V0RmxhZ3MoQVZfQ09ERUNfRkxBR19HTE9CQUxfSEVBREVSKTtcbiAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhjb2RlY09wdHMpKSBjdHguc2V0T3B0aW9uKGssIHYpO1xuICAgIGlmIChjb2RlY1RhZykgY3R4LmNvZGVjVGFnID0gY29kZWNUYWc7XG4gICAgRkZtcGVnRXJyb3IudGhyb3dJZkVycm9yKGF3YWl0IGN0eC5vcGVuMihjb2RlYywgbnVsbCksIFwidmlkZW9DdHgub3BlbjJcIik7XG5cbiAgICBjb25zdCBwa3QgPSBuZXcgUGFja2V0KCk7XG4gICAgcGt0LmFsbG9jKCk7XG5cbiAgICBjb25zdCBzdHJlYW0gPSBtdXhlci5hZGRTdHJlYW0oY3R4LCBjb2RlY1RhZyk7XG4gICAgcmV0dXJuIG5ldyBWaWRlb0VuY29kZXIoY3R4LCBwa3QsIHN0cmVhbSk7XG4gIH1cblxuICBhc3luYyBlbmNvZGUoZnJhbWU6IEZyYW1lLCBtdXhlcjogRm9ybWF0TXV4ZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmcmFtZS5wdHMgPSB0aGlzLl9wdHMrKztcbiAgICBmcmFtZS5kdXJhdGlvbiA9IDFuO1xuICAgIEZGbXBlZ0Vycm9yLnRocm93SWZFcnJvcihhd2FpdCB0aGlzLl9jdHguc2VuZEZyYW1lKGZyYW1lKSwgXCJ2aWRlb0N0eC5zZW5kRnJhbWVcIik7XG4gICAgYXdhaXQgdGhpcy5kcmFpbihtdXhlcik7XG4gIH1cblxuICBhc3luYyBmbHVzaChtdXhlcjogRm9ybWF0TXV4ZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLl9jdHguc2VuZEZyYW1lKG51bGwpO1xuICAgIGF3YWl0IHRoaXMuZHJhaW4obXV4ZXIpO1xuICB9XG5cbiAgW1N5bWJvbC5kaXNwb3NlXSgpOiB2b2lkIHtcbiAgICB0aGlzLl9wa3QuZnJlZSgpO1xuICAgIHRoaXMuX2N0eC5mcmVlQ29udGV4dCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBkcmFpbihtdXhlcjogRm9ybWF0TXV4ZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwa3QgPSB0aGlzLl9wa3Q7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IHIgPSBhd2FpdCB0aGlzLl9jdHgucmVjZWl2ZVBhY2tldChwa3QpO1xuICAgICAgaWYgKHIgPT09IEFWRVJST1JfRUFHQUlOIHx8IHIgPT09IEFWRVJST1JfRU9GKSBicmVhaztcbiAgICAgIEZGbXBlZ0Vycm9yLnRocm93SWZFcnJvcihyLCBcInZpZGVvLnJlY2VpdmVQYWNrZXRcIik7XG4gICAgICBwa3Quc3RyZWFtSW5kZXggPSB0aGlzLl9zdHJlYW0uaW5kZXg7XG4gICAgICBpZiAocGt0LmR1cmF0aW9uID09PSAwbikgcGt0LmR1cmF0aW9uID0gMW47XG4gICAgICBwa3QucmVzY2FsZVRzKHRoaXMuX2N0eC50aW1lQmFzZSwgdGhpcy5fc3RyZWFtLnRpbWVCYXNlKTtcbiAgICAgIGF3YWl0IG11eGVyLndyaXRlUGFja2V0KHBrdCk7XG4gICAgICBwa3QudW5yZWYoKTtcbiAgICB9XG4gIH1cbn1cbiIsIi8vIENyZWF0ZWQgYnkgQXV0b2tha2EgKHFxMTkwOTY5ODQ5NEBnbWFpbC5jb20pIG9uIDIwMjYvMDQvMDEuXG5cbmltcG9ydCB7IGNwdXMgfSBmcm9tIFwib3NcIjtcbmltcG9ydCB7IEZGbXBlZ0Vycm9yLCBGcmFtZSwgU29mdHdhcmVTY2FsZUNvbnRleHQgfSBmcm9tIFwibm9kZS1hdlwiO1xuaW1wb3J0IHtcbiAgQVZfUElYX0ZNVF9CR1JBLFxuICBBVl9QSVhfRk1UX1lVVkE0MjBQLFxuICBBVl9TQU1QTEVfRk1UX0ZMVFAsXG4gIEZGX0VOQ09ERVJfQUFDLFxuICBGRl9FTkNPREVSX0xJQlgyNjUsXG4gIFNXU19CSUxJTkVBUixcbn0gZnJvbSBcIm5vZGUtYXYvY29uc3RhbnRzXCI7XG5cbmltcG9ydCB7IENvbmN1cnJlbmN5TGltaXRlciB9IGZyb20gXCIuLi9saW1pdGVyXCI7XG5pbXBvcnQgeyBBdWRpb0VuY29kZXIgfSBmcm9tIFwiLi9hdWRpb1wiO1xuaW1wb3J0IHsgRm9ybWF0TXV4ZXIgfSBmcm9tIFwiLi9tdXhlclwiO1xuaW1wb3J0IHsgVmlkZW9FbmNvZGVyIH0gZnJvbSBcIi4vdmlkZW9cIjtcblxuZXhwb3J0IGludGVyZmFjZSBFbmNvZGVyUGlwZWxpbmVPcHRpb25zIHtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIGZwczogbnVtYmVyO1xuICBvdXRGaWxlOiBzdHJpbmc7XG4gIHdpdGhBdWRpbz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBFbmNvZGVyUGlwZWxpbmUge1xuICBwcml2YXRlIF9kaXNwb3NlZCA9IGZhbHNlO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfdmlkZW86IFZpZGVvRW5jb2RlcixcbiAgICBwcml2YXRlIF9hdWRpbzogQXVkaW9FbmNvZGVyIHwgdW5kZWZpbmVkLFxuICAgIHByaXZhdGUgX211eGVyOiBGb3JtYXRNdXhlcixcbiAgICBwcml2YXRlIF9saW1pdGVyOiBDb25jdXJyZW5jeUxpbWl0ZXIsXG4gICAgcHJpdmF0ZSBfb3V0RmlsZTogc3RyaW5nLFxuICAgIHByaXZhdGUgX3N3czogU29mdHdhcmVTY2FsZUNvbnRleHQsXG4gICAgcHJpdmF0ZSBfc3JjRnJhbWU6IEZyYW1lLFxuICAgIHByaXZhdGUgX2RzdEZyYW1lOiBGcmFtZSxcbiAgKSB7fVxuXG4gIHN0YXRpYyBhc3luYyBjcmVhdGUob3B0czogRW5jb2RlclBpcGVsaW5lT3B0aW9ucyk6IFByb21pc2U8RW5jb2RlclBpcGVsaW5lPiB7XG4gICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0LCBmcHMsIG91dEZpbGUsIHdpdGhBdWRpbyA9IGZhbHNlIH0gPSBvcHRzO1xuICAgIGNvbnN0IG11eGVyID0gbmV3IEZvcm1hdE11eGVyKG91dEZpbGUpO1xuXG4gICAgY29uc3QgdmlkZW8gPSBhd2FpdCBWaWRlb0VuY29kZXIuY3JlYXRlKHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgZnBzLFxuICAgICAgY29kZWNOYW1lOiBGRl9FTkNPREVSX0xJQlgyNjUsXG4gICAgICBjb2RlY1RhZzogXCJodmMxXCIsXG4gICAgICBnbG9iYWxIZWFkZXI6IHRydWUsXG4gICAgICBjb2RlY09wdHM6IHsgcHJlc2V0OiBcInVsdHJhZmFzdFwiLCBcIngyNjUtcGFyYW1zXCI6IFwibG9nLWxldmVsPTE6YmZyYW1lcz0wXCIgfSxcbiAgICAgIGJpdHJhdGU6IDhfMDAwXzAwMCxcbiAgICAgIHBpeGVsRm9ybWF0OiBBVl9QSVhfRk1UX1lVVkE0MjBQLFxuICAgICAgdGhyZWFkQ291bnQ6IGNwdXMoKS5sZW5ndGgsXG4gICAgICBtdXhlcixcbiAgICB9KTtcblxuICAgIGxldCBhdWRpbzogQXVkaW9FbmNvZGVyIHwgdW5kZWZpbmVkO1xuICAgIGlmICh3aXRoQXVkaW8pIHtcbiAgICAgIGF1ZGlvID0gYXdhaXQgQXVkaW9FbmNvZGVyLmNyZWF0ZSh7XG4gICAgICAgIG91dFNhbXBsZVJhdGU6IDQ0XzEwMCxcbiAgICAgICAgb3V0U2FtcGxlRm10OiBBVl9TQU1QTEVfRk1UX0ZMVFAsXG4gICAgICAgIGNvZGVjTmFtZTogRkZfRU5DT0RFUl9BQUMsXG4gICAgICAgIGdsb2JhbEhlYWRlcjogdHJ1ZSxcbiAgICAgICAgYml0cmF0ZTogMTI4XzAwMCxcbiAgICAgICAgbXV4ZXIsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBhd2FpdCBtdXhlci5vcGVuKCk7XG4gICAgY29uc3QgbGltaXRlciA9IG5ldyBDb25jdXJyZW5jeUxpbWl0ZXIoMSk7XG5cbiAgICBjb25zdCBzcmNGcmFtZSA9IG5ldyBGcmFtZSgpO1xuICAgIHNyY0ZyYW1lLmFsbG9jKCk7XG4gICAgc3JjRnJhbWUuZm9ybWF0ID0gQVZfUElYX0ZNVF9CR1JBO1xuICAgIHNyY0ZyYW1lLndpZHRoID0gd2lkdGg7XG4gICAgc3JjRnJhbWUuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgIEZGbXBlZ0Vycm9yLnRocm93SWZFcnJvcihzcmNGcmFtZS5nZXRCdWZmZXIoMCksIFwic3JjRnJhbWUuZ2V0QnVmZmVyXCIpO1xuXG4gICAgY29uc3Qgc3dzID0gbmV3IFNvZnR3YXJlU2NhbGVDb250ZXh0KCk7XG4gICAgc3dzLmdldENvbnRleHQod2lkdGgsIGhlaWdodCwgQVZfUElYX0ZNVF9CR1JBLCB3aWR0aCwgaGVpZ2h0LCBBVl9QSVhfRk1UX1lVVkE0MjBQLCBTV1NfQklMSU5FQVIpO1xuICAgIGNvbnN0IGRzdEZyYW1lID0gbmV3IEZyYW1lKCk7XG4gICAgZHN0RnJhbWUuYWxsb2MoKTtcbiAgICBkc3RGcmFtZS5mb3JtYXQgPSBBVl9QSVhfRk1UX1lVVkE0MjBQO1xuICAgIGRzdEZyYW1lLndpZHRoID0gd2lkdGg7XG4gICAgZHN0RnJhbWUuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgIEZGbXBlZ0Vycm9yLnRocm93SWZFcnJvcihkc3RGcmFtZS5nZXRCdWZmZXIoMCksIFwiZHN0RnJhbWUuZ2V0QnVmZmVyXCIpO1xuXG4gICAgcmV0dXJuIG5ldyBFbmNvZGVyUGlwZWxpbmUodmlkZW8sIGF1ZGlvLCBtdXhlciwgbGltaXRlciwgb3V0RmlsZSwgc3dzLCBzcmNGcmFtZSwgZHN0RnJhbWUpO1xuICB9XG5cbiAgc2V0dXBBdWRpbyhzYW1wbGVSYXRlOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9hdWRpbz8uc2V0SW5wdXRSYXRlKHNhbXBsZVJhdGUpO1xuICB9XG5cbiAgYXN5bmMgZW5jb2RlRnJhbWUoaW5wdXQ6IEJ1ZmZlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuX2xpbWl0ZXIuc2NoZWR1bGUoYXN5bmMgKCkgPT4ge1xuICAgICAgRkZtcGVnRXJyb3IudGhyb3dJZkVycm9yKHRoaXMuX3NyY0ZyYW1lLm1ha2VXcml0YWJsZSgpLCBcInNyY0ZyYW1lLm1ha2VXcml0YWJsZVwiKTtcbiAgICAgIEZGbXBlZ0Vycm9yLnRocm93SWZFcnJvcih0aGlzLl9zcmNGcmFtZS5mcm9tQnVmZmVyKGlucHV0KSwgXCJzcmNGcmFtZS5mcm9tQnVmZmVyXCIpO1xuICAgICAgRkZtcGVnRXJyb3IudGhyb3dJZkVycm9yKGF3YWl0IHRoaXMuX3N3cy5zY2FsZUZyYW1lKHRoaXMuX2RzdEZyYW1lLCB0aGlzLl9zcmNGcmFtZSksIFwic3dzLnNjYWxlRnJhbWVcIik7XG4gICAgICBGRm1wZWdFcnJvci50aHJvd0lmRXJyb3IodGhpcy5fZHN0RnJhbWUubWFrZVdyaXRhYmxlKCksIFwiZHN0RnJhbWUubWFrZVdyaXRhYmxlXCIpO1xuICAgICAgcmV0dXJuIHRoaXMuX3ZpZGVvLmVuY29kZSh0aGlzLl9kc3RGcmFtZSwgdGhpcy5fbXV4ZXIpO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZW5jb2RlQXVkaW8ocGNtOiBCdWZmZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5fYXVkaW8pIGF3YWl0IHRoaXMuX2xpbWl0ZXIuc2NoZWR1bGUoKCkgPT4gdGhpcy5fYXVkaW8hLmVuY29kZShwY20sIHRoaXMuX211eGVyKSk7XG4gIH1cblxuICBhc3luYyBmaW5pc2goKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdXNpbmcgX20gPSB0aGlzLl9tdXhlcjtcbiAgICAgIHVzaW5nIF92ID0gdGhpcy5fdmlkZW87XG4gICAgICB1c2luZyBfYSA9IHRoaXMuX2F1ZGlvO1xuICAgICAgYXdhaXQgdGhpcy5fbGltaXRlci5lbmQoKTtcbiAgICAgIGF3YWl0IHRoaXMuX2F1ZGlvPy5mbHVzaCh0aGlzLl9tdXhlcik7XG4gICAgICBhd2FpdCB0aGlzLl92aWRlby5mbHVzaCh0aGlzLl9tdXhlcik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuZnJlZSgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fb3V0RmlsZTtcbiAgfVxuXG4gIGFzeW5jIFtTeW1ib2wuYXN5bmNEaXNwb3NlXSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5fZGlzcG9zZWQpIHJldHVybjtcbiAgICBhd2FpdCB0aGlzLl9saW1pdGVyLmVuZCgpO1xuICAgIHRoaXMuX3ZpZGVvW1N5bWJvbC5kaXNwb3NlXSgpO1xuICAgIHRoaXMuX2F1ZGlvPy5bU3ltYm9sLmRpc3Bvc2VdKCk7XG4gICAgYXdhaXQgdGhpcy5fbXV4ZXJbU3ltYm9sLmFzeW5jRGlzcG9zZV0oKTtcbiAgICB0aGlzLmZyZWUoKTtcbiAgfVxuXG4gIHByaXZhdGUgZnJlZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fZGlzcG9zZWQpIHJldHVybjtcbiAgICB0aGlzLl9kaXNwb3NlZCA9IHRydWU7XG4gICAgdGhpcy5fc3JjRnJhbWUuZnJlZSgpO1xuICAgIHRoaXMuX2RzdEZyYW1lLmZyZWUoKTtcbiAgICB0aGlzLl9zd3NbU3ltYm9sLmRpc3Bvc2VdKCk7XG4gIH1cbn1cbiJdfQ==
|
|
1
|
+
import'source-map-support/register.js';export{y as ConcurrencyLimiter,u as DEFAULT_DURATION,t as DEFAULT_FPS,s as DEFAULT_HEIGHT,v as DEFAULT_OUT_FILE,r as DEFAULT_WIDTH,A as EncoderPipeline,z as FormatMuxer,l as Logger,o as PUP_ARGS_KEY,w as RenderSchema,x as defaultRenderOptions,q as exec,m as logger,n as noerr,p as pargs,b as parseNumber,c as parseString,a as penv,B as pup,i as pupApp,g as pupDeterministic,f as pupDisableGPU,k as pupExperimentalPuppeteer,j as pupIpcSocket,d as pupLogLevel,h as pupPkgRoot,e as pupUseInnerProxy}from'./chunk-BG7244QU.js';import {setTimeout as setTimeout$1}from'timers/promises';var u=class{constructor(e){this.makeValue=e;}makeValue;get value(){return this._initialized||(this._value=this.makeValue(),this._initialized=true),this._value}get initialized(){return this._initialized}_initialized=false;_value};function p(r){return new Promise(e=>setTimeout(e,r))}function F(r,e){let t,i=false;async function n(o){await r(o),!i&&(t=setTimeout(()=>n(o+1),e));}return t=setTimeout(()=>n(0),e),()=>{i=true,clearTimeout(t);}}function Q({fn:r,maxAttempts:e=3,timeout:t}){let i=new Error(`timeout over ${t}ms`);return async function(...n){let o=0;for(;;)try{let m=[r(...n)];return t&&m.push(setTimeout$1(t).then(()=>{throw i})),await Promise.race(m)}catch(m){if(o++,o>=e)throw m;await p(Math.pow(2,o)*100+Math.random()*100);}}}export{u as Lazy,F as periodical,p as sleep,Q as useRetry};//# sourceMappingURL=index.js.map
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9iYXNlL2xhenkudHMiLCIuLi9zcmMvYmFzZS90aW1pbmcudHMiLCIuLi9zcmMvYmFzZS9yZXRyeS50cyJdLCJuYW1lcyI6WyJMYXp5IiwibWFrZVZhbHVlIiwic2xlZXAiLCJtcyIsInJlc29sdmUiLCJwZXJpb2RpY2FsIiwiY2FsbGJhY2siLCJ0b2tlbiIsImNsb3NlZCIsInRpY2siLCJjb3VudCIsInVzZVJldHJ5IiwiZm4iLCJtYXhBdHRlbXB0cyIsInRpbWVvdXQiLCJ0aW1lb3V0RXJyb3IiLCJhcmdzIiwiYXR0ZW1wdCIsInByb21pc2VzIiwic2V0VGltZW91dCIsImUiXSwibWFwcGluZ3MiOiIwbUJBRU8sSUFBTUEsRUFBTixLQUFjLENBQ25CLFlBQXFCQyxDQUFBQSxDQUFvQixDQUFwQixlQUFBQSxFQUFxQixDQUFyQixVQUVyQixJQUFJLEtBQUEsRUFBVyxDQUNiLE9BQUssSUFBQSxDQUFLLGVBQ1IsSUFBQSxDQUFLLE1BQUEsQ0FBUyxLQUFLLFNBQUEsRUFBVSxDQUM3QixLQUFLLFlBQUEsQ0FBZSxJQUFBLENBQUEsQ0FFZixLQUFLLE1BQ2QsQ0FFQSxJQUFJLFdBQUEsRUFBdUIsQ0FDekIsT0FBTyxJQUFBLENBQUssWUFDZCxDQUVRLFlBQUEsQ0FBZSxLQUFBLENBQ2YsTUFDVixFQ2pCTyxTQUFTQyxDQUFBQSxDQUFNQyxDQUFBQSxDQUFZLENBQ2hDLE9BQU8sSUFBSSxPQUFBLENBQWVDLENBQUFBLEVBQVksV0FBV0EsQ0FBQUEsQ0FBU0QsQ0FBRSxDQUFDLENBQy9ELENBRU8sU0FBU0UsQ0FBQUEsQ0FBV0MsQ0FBQUEsQ0FBbURILEVBQVksQ0FDeEYsSUFBSUksRUFDQUMsQ0FBQUEsQ0FBUyxLQUFBLENBQ2IsZUFBZUMsQ0FBQUEsQ0FBS0MsQ0FBQUEsQ0FBZSxDQUNqQyxNQUFNSixDQUFBQSxDQUFTSSxDQUFLLENBQUEsQ0FDaEIsQ0FBQUYsSUFDSkQsQ0FBQUEsQ0FBUSxVQUFBLENBQVcsSUFBTUUsQ0FBQUEsQ0FBS0MsQ0FBQUEsQ0FBUSxDQUFDLENBQUEsQ0FBR1AsQ0FBRSxHQUM5QyxDQUNBLE9BQUFJLEVBQVEsVUFBQSxDQUFXLElBQU1FLEVBQUssQ0FBQyxDQUFBLENBQUdOLENBQUUsQ0FBQSxDQUM3QixJQUFNLENBQ1hLLENBQUFBLENBQVMsS0FDVCxZQUFBLENBQWFELENBQUssRUFDcEIsQ0FDRixDQ1JPLFNBQVNJLENBQUFBLENBQWtDLENBQUUsR0FBQUMsQ0FBQUEsQ0FBSSxXQUFBLENBQUFDLEVBQWMsQ0FBQSxDQUFHLE9BQUEsQ0FBQUMsQ0FBUSxDQUFBLENBQTRCLENBQzNHLElBQU1DLENBQUFBLENBQWUsSUFBSSxNQUFNLENBQUEsYUFBQSxFQUFnQkQsQ0FBTyxJQUFJLENBQUEsQ0FDMUQsT0FBTyxrQkFBbUJFLENBQUFBLENBQVksQ0FDcEMsSUFBSUMsQ0FBQUEsQ0FBVSxDQUFBLENBQ2QsT0FDRSxHQUFJLENBQ0YsSUFBTUMsQ0FBQUEsQ0FBVyxDQUFDTixFQUFHLEdBQUdJLENBQUksQ0FBQyxDQUFBLENBQzdCLE9BQUlGLENBQUFBLEVBQ0ZJLENBQUFBLENBQVMsS0FDUEMsWUFBQUEsQ0FBV0wsQ0FBTyxFQUFFLElBQUEsQ0FBSyxJQUFNLENBQzdCLE1BQU1DLENBQ1IsQ0FBQyxDQUNILENBQUEsQ0FFSyxNQUFNLE9BQUEsQ0FBUSxJQUFBLENBQUtHLENBQVEsQ0FDcEMsQ0FBQSxNQUFTRSxFQUFHLENBRVYsR0FEQUgsSUFDSUEsQ0FBQUEsRUFBV0osQ0FBQUEsQ0FDYixNQUFNTyxDQUFBQSxDQUVSLE1BQU1sQixFQUFNLElBQUEsQ0FBSyxHQUFBLENBQUksRUFBR2UsQ0FBTyxDQUFBLENBQUksSUFBTSxJQUFBLENBQUssTUFBQSxHQUFXLEdBQUcsRUFDOUQsQ0FFSixDQUNGIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ3JlYXRlZCBieSBBdXRva2FrYSAocXExOTA5Njk4NDk0QGdtYWlsLmNvbSkgb24gMjAyNi8wMS8zMC5cblxuZXhwb3J0IGNsYXNzIExhenk8VD4ge1xuICBjb25zdHJ1Y3RvcihyZWFkb25seSBtYWtlVmFsdWU6ICgpID0+IFQpIHt9XG5cbiAgZ2V0IHZhbHVlKCk6IFQge1xuICAgIGlmICghdGhpcy5faW5pdGlhbGl6ZWQpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdGhpcy5tYWtlVmFsdWUoKTtcbiAgICAgIHRoaXMuX2luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlITtcbiAgfVxuXG4gIGdldCBpbml0aWFsaXplZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faW5pdGlhbGl6ZWQ7XG4gIH1cblxuICBwcml2YXRlIF9pbml0aWFsaXplZCA9IGZhbHNlO1xuICBwcml2YXRlIF92YWx1ZTogVCB8IHVuZGVmaW5lZDtcbn1cbiIsIi8vIENyZWF0ZWQgYnkgQXV0b2tha2EgKHFxMTkwOTY5ODQ5NEBnbWFpbC5jb20pIG9uIDIwMjYvMDIvMDkuXG5cbmV4cG9ydCBmdW5jdGlvbiBzbGVlcChtczogbnVtYmVyKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGVyaW9kaWNhbChjYWxsYmFjazogKGNvdW50OiBudW1iZXIpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkLCBtczogbnVtYmVyKSB7XG4gIGxldCB0b2tlbjogTm9kZUpTLlRpbWVvdXQ7XG4gIGxldCBjbG9zZWQgPSBmYWxzZTtcbiAgYXN5bmMgZnVuY3Rpb24gdGljayhjb3VudDogbnVtYmVyKSB7XG4gICAgYXdhaXQgY2FsbGJhY2soY291bnQpO1xuICAgIGlmIChjbG9zZWQpIHJldHVybjtcbiAgICB0b2tlbiA9IHNldFRpbWVvdXQoKCkgPT4gdGljayhjb3VudCArIDEpLCBtcyk7XG4gIH1cbiAgdG9rZW4gPSBzZXRUaW1lb3V0KCgpID0+IHRpY2soMCksIG1zKTtcbiAgcmV0dXJuICgpID0+IHtcbiAgICBjbG9zZWQgPSB0cnVlO1xuICAgIGNsZWFyVGltZW91dCh0b2tlbik7XG4gIH07XG59XG4iLCIvLyBDcmVhdGVkIGJ5IEF1dG9rYWthIChxcTE5MDk2OTg0OTRAZ21haWwuY29tKSBvbiAyMDI2LzAyLzA1LlxuXG5pbXBvcnQgeyBzZXRUaW1lb3V0IH0gZnJvbSBcInRpbWVycy9wcm9taXNlc1wiO1xuaW1wb3J0IHsgc2xlZXAgfSBmcm9tIFwiLi90aW1pbmdcIjtcblxuZXhwb3J0IGludGVyZmFjZSBSZXRyeU9wdGlvbnM8QXJncyBleHRlbmRzIGFueVtdLCBSZXQ+IHtcbiAgZm46ICguLi5hcmdzOiBBcmdzKSA9PiBQcm9taXNlPFJldD47XG4gIG1heEF0dGVtcHRzPzogbnVtYmVyO1xuICB0aW1lb3V0PzogbnVtYmVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlUmV0cnk8QXJncyBleHRlbmRzIGFueVtdLCBSZXQ+KHsgZm4sIG1heEF0dGVtcHRzID0gMywgdGltZW91dCB9OiBSZXRyeU9wdGlvbnM8QXJncywgUmV0Pikge1xuICBjb25zdCB0aW1lb3V0RXJyb3IgPSBuZXcgRXJyb3IoYHRpbWVvdXQgb3ZlciAke3RpbWVvdXR9bXNgKTtcbiAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uICguLi5hcmdzOiBBcmdzKSB7XG4gICAgbGV0IGF0dGVtcHQgPSAwO1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwcm9taXNlcyA9IFtmbiguLi5hcmdzKV07XG4gICAgICAgIGlmICh0aW1lb3V0KSB7XG4gICAgICAgICAgcHJvbWlzZXMucHVzaChcbiAgICAgICAgICAgIHNldFRpbWVvdXQodGltZW91dCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgIHRocm93IHRpbWVvdXRFcnJvcjtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IFByb21pc2UucmFjZShwcm9taXNlcyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGF0dGVtcHQrKztcbiAgICAgICAgaWYgKGF0dGVtcHQgPj0gbWF4QXR0ZW1wdHMpIHtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHNsZWVwKE1hdGgucG93KDIsIGF0dGVtcHQpICogMTAwICsgTWF0aC5yYW5kb20oKSAqIDEwMCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuIl19
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pup-recorder",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.8",
|
|
4
4
|
"description": "Record web pages as video",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -36,7 +36,8 @@
|
|
|
36
36
|
"tree-kill": "latest",
|
|
37
37
|
"source-map-support": "latest",
|
|
38
38
|
"systeminformation": "latest",
|
|
39
|
-
"zod": "latest"
|
|
39
|
+
"zod": "latest",
|
|
40
|
+
"puppeteer": "latest"
|
|
40
41
|
},
|
|
41
42
|
"devDependencies": {
|
|
42
43
|
"@microsoft/api-extractor": "latest",
|
package/dist/chunk-3POZKRKH.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import'source-map-support/register.js';import {createRequire}from'module';import {dirname,join}from'path';import {Log}from'node-av';import {AV_LOG_ERROR,AV_LOG_WARNING}from'node-av/constants';import {spawn}from'child_process';import w from'zod';import {ok}from'assert';import {randomUUID}from'crypto';import {rmSync}from'fs';import {readdir,mkdir,stat}from'fs/promises';import {platform,tmpdir}from'os';import ir from'tree-kill';import qe from'electron';import {fileURLToPath}from'url';import {graphics}from'systeminformation';import {EventEmitter}from'events';import {createServer}from'net';var xe=Object.create;var C=Object.defineProperty;var _e=Object.getOwnPropertyDescriptor;var O=(t,e)=>(e=Symbol[t])?e:Symbol.for("Symbol."+t),k=t=>{throw TypeError(t)};var X=(t,e,r)=>e in t?C(t,e,{enumerable:true,configurable:true,writable:true,value:r}):t[e]=r;var Z=t=>[,,,xe(null)],Q=["class","method","getter","setter","accessor","field","value","get","set"],S=t=>t!==void 0&&typeof t!="function"?k("Function expected"):t,Ee=(t,e,r,n,o)=>({kind:Q[t],name:e,metadata:n,addInitializer:s=>r._?k("Already initialized"):o.push(S(s||null))}),G=(t,e)=>X(e,O("metadata"),t[3]),ee=(t,e,r,n)=>{for(var o=0,s=t[e>>1],i=s&&s.length;o<i;o++)s[o].call(r);return n},_=(t,e,r,n,o,s)=>{var c,p,u,E,a=e&7,R=false,d=false,v=2,x=Q[a+5],ye=t[v]||(t[v]=[]),m=((o=o.prototype),_e(o,r));for(var D=n.length-1;D>=0;D--)u=Ee(a,r,p={},t[3],ye),(u.static=R,u.private=d,E=u.access={has:f=>r in f},(E.get=f=>f[r]),a>2),c=(0, n[D])(m[x],u),p._=1,S(c)&&(m[x]=c);return m&&C(o,r,m),o},re=(t,e,r)=>X(t,e+"",r);var cr=(t,e,r)=>{if(e!=null){typeof e!="object"&&typeof e!="function"&&k("Object expected");var n,o;r&&(n=e[O("asyncDispose")]),n===void 0&&(n=e[O("dispose")],r&&(o=n)),typeof n!="function"&&k("Object not disposable"),o&&(n=function(){try{o.call(this);}catch(s){return Promise.reject(s)}}),t.push([r,n,e]);}else r&&t.push([r]);return e},pr=(t,e,r)=>{var n=typeof SuppressedError=="function"?SuppressedError:function(i,c,p,u){return u=Error(p),u.name="SuppressedError",u.error=i,u.suppressed=c,u},o=i=>e=r?new n(i,e,"An error was suppressed during disposal"):(r=true,i),s=i=>{for(;i=t.pop();)try{var c=i[1]&&i[1].call(i[2]);if(i[0])return Promise.resolve(c).then(s,p=>(o(p),s()))}catch(p){o(p);}if(r)throw e};return s()};function te(t,e,r){try{return e(process.env[t])}catch{return r}}function ne(t){if(typeof t=="number")return t;let e=Number(t);if(Number.isNaN(e))throw new Error(`Value ${t} is not a valid number`);return e}function fr(t){return typeof t=="string"?t:String(t)}var Te=createRequire(import.meta.url),T=process.env,U=te("PUP_LOG_LEVEL",ne,2),oe=T.PUP_USE_INNER_PROXY==="1",se=T.PUP_DISABLE_GPU==="1",ie=T.PUP_DETERMINISTIC==="1",Ue=dirname(Te.resolve("pup-recorder/package.json")),$=join(Ue,"dist","app.cjs"),Pr=T.PUP_IPC_SOCKET;var B="<pup@debug>",W="<pup@info>",M="<pup@warn>",j="<pup@error>",V="<pup@fatal>";function I(t,e){return function(...r){let n=r.map(o=>o instanceof Error?o.stack??String(o):o);return t.call(this,...n)}}var ae,ce,pe,ue,le,y;le=[I],ue=[I],pe=[I],ce=[I],ae=[I];var b=class{constructor(e=U){this._level=e;ee(y,5,this);re(this,"_impl");this.impl=console;}get level(){return this._level}set level(e){this._level=e,this.impl=this._impl??console;}get impl(){return this._impl}set impl(e){let r=e.debug??console.debug,n=e.info??console.info,o=e.warn??console.warn,s=e.error??console.error,i=this._level;this._impl={debug:i>=3?r:void 0,info:i>=2?n:void 0,warn:i>=1?o:void 0,error:i>=0?s:void 0};}debug(...e){this.impl?.debug?.(B,...e);}info(...e){this.impl?.info?.(W,...e);}warn(...e){this.impl?.warn?.(M,...e);}error(...e){this.impl?.error?.(j,...e);}fatal(...e){this.impl?.error?.(V,...e),process.exit(1);}dispatch(e){let r=e.trimEnd();r.startsWith(B)?this.debug(r.slice(B.length+1)):r.startsWith(W)?this.info(r.slice(W.length+1)):r.startsWith(M)?this.warn(r.slice(M.length+1)):r.startsWith(j)?this.error(r.slice(j.length+1)):this.info(r);}attach(e,r){return new Promise((n,o)=>{this.debug(`${r}.attach`);let s="",i=c=>{let p=c.toString();p.startsWith(V)?s+=p.slice(V.length+1):this.dispatch(p);};e.stderr?.on("data",i),e.stdout?.on("data",i),e.on("message",i).on("error",c=>{s+=c.message,e.kill();}).once("close",(c,p)=>{c||p||s?(s||=`command failed: ${e.spawnargs.join(" ")}`,this.debug(`${r}.close`,{code:c,signal:p,fatal:s}),o(new Error(s))):(this.debug(`${r}.close`),n());}).on("unhandledRejection",c=>{this.error(`${r}.unhandled`,c);}).on("uncaughtExceptionMonitor",c=>{this.error(`${r}.unhandled`,c);});})}};y=Z(),_(y,1,"debug",le,b),_(y,1,"info",ue,b),_(y,1,"warn",pe,b),_(y,1,"error",ce,b),_(y,1,"fatal",ae,b),G(y,b);var l=new b;Log.setCallback((t,e)=>{let r=e.trimEnd();r&&(t<=AV_LOG_ERROR?l.error(r):t<=AV_LOG_WARNING&&l.warn(r));});function Ar(t,e){return (...r)=>{try{let n=t(...r);return n instanceof Promise?n.catch(()=>e):n}catch{return e}}}var H="--pup-priv-args";function Dr(){let t=process.argv,e=t.find(n=>n.startsWith(H));if(!e)return l.debug("procargv",t),process.argv;let r=["exec",...t.slice(-1)];return e=Buffer.from(e.split("=")[1],"base64").toString(),r.push(...JSON.parse(e)),l.debug("pupargs",r),r}function de(t,e){let r=t.split(" ").filter(i=>i.length),[n,...o]=r;if(!n)throw new Error("empty command");let s=spawn(n,o,{stdio:"inherit",...e});return {process:s,wait:l.attach(s,n)}}var Ge=1920,Ne=1080,$e=30,Be=5,We="output.mov",$r=w.object({duration:w.number().describe("Duration in seconds"),width:w.number().describe("Video width"),height:w.number().describe("Video height"),fps:w.number().describe("Frames per second"),withAudio:w.boolean().describe("Capture and encode audio"),outFile:w.string().describe("Output mp4 file path"),useInnerProxy:w.boolean().describe("Use bilibili inner proxy for resource access"),deterministic:w.boolean().describe("Render by frame rather than recording")}),fe={width:Ge,height:Ne,fps:$e,duration:Be,outFile:We,withAudio:false,useInnerProxy:oe,deterministic:ie};var me="[HWAccel]",He=["microsoft","vmware","virtualbox","llvmpipe","softpipe","swiftshader"];function ze(t){let e=t.toLowerCase();return He.some(r=>e.includes(r))}async function Ke(){let{controllers:t}=await graphics();if(platform()==="linux")try{return (await readdir("/dev/dri")).some(r=>r.startsWith("renderD"))}catch{return false}return l.debug(me,"GPU controllers:",t),t.some(e=>e.vendor.length>0&&!ze(e.vendor))}var he=Ke().then(t=>(l.debug(me,"gpu:",t),t));async function Xe(){let t=["no-sandbox","disable-dev-shm-usage","disable-web-security","disable-site-isolation-trials","ignore-certificate-errors","disable-blink-features=AutomationControlled","mute-audio","autoplay-policy=no-user-gesture-required","disable-extensions","headless=new","force-device-scale-factor=1","force-color-profile=srgb","ignore-gpu-blocklist","use-gl=angle","deterministic-mode","enable-begin-frame-control","disable-new-content-rendering-timeout","run-all-compositor-stages-before-draw","disable-threaded-animation","disable-threaded-scrolling","disable-checker-imaging","disable-image-animation-resync","enable-surface-synchronization","disable-background-networking"];if(U<3&&t.push("log-level=3"),!(await he&&!se))return t.push("use-angle=swiftshader","enable-unsafe-swiftshader"),t;t.push("disable-gpu-sandbox","enable-unsafe-webgpu");let r=platform();return r==="darwin"?t.push("use-angle=metal"):r==="win32"?t.push("use-angle=d3d11"):t.push("use-angle=vulkan","enable-features=Vulkan","disable-vulkan-surface"),t}var Ze="[Electron]";async function Qe(){let[t,e]=await Promise.all([stat($),stat(fileURLToPath(import.meta.url))]);ok(t.mtimeMs>=e.mtimeMs,"app.cjs is stale, run `bun run build`");}async function we(t,e,r){await Qe();let n=[],o=platform();o==="linux"&&n.push("xvfb-run","--auto-servernum",`--server-args="-screen 0 ${t.width}x${t.height}x24"`);let i=(await Xe()).map(u=>`--${u}`),c=Buffer.from(JSON.stringify(e)).toString("base64");i.push(`${H}=${c}`),n.push(qe,...i,$);let p=n.join(" ");return l.debug(Ze,p),de(p,{stdio:["ignore","pipe","pipe"],shell:o==="linux",env:{...process.env,RUST_BACKTRACE:"full",PUP_IPC_SOCKET:r}})}var L=8;var z=class extends EventEmitter{constructor(r){super();this._socket=r;this._socket.on("data",n=>this.onData(n)),this._socket.on("error",n=>this.emit("error",n)),this._socket.on("close",()=>this.emit("close"));}_chunks=[];_buffered=0;onData(r){this._chunks.push(r),this._buffered+=r.byteLength,this.flush();}flush(){for(;;){if(this._buffered<L)return;let r=this.peek(L),n=r.readUInt32LE(0),o=r.readUInt32LE(4);if(this._buffered<L+o)return;this.consume(L);let s=this.consume(o);switch(this.emit("message",n,s),n){case 1:{this.emit("progress",Number(s.toString()));break}case 2:{this.emit("done",JSON.parse(s.toString()));break}case 3:{this.emit("error",new Error(s.toString()));break}}}}peek(r){return this._chunks[0]&&this._chunks[0].byteLength>=r?this._chunks[0]:Buffer.concat(this._chunks).subarray(0,r)}consume(r){let n=Buffer.allocUnsafe(r),o=0;for(;o<r;){let s=this._chunks[0],i=Math.min(s.byteLength,r-o);s.copy(n,o,0,i),i===s.byteLength?this._chunks.shift():this._chunks[0]=s.subarray(i),o+=i;}return this._buffered-=r,n}};function ve(t){return new Promise((e,r)=>{let n=createServer();n.once("error",r),n.listen(t,()=>{e({waitForConnection(){return new Promise((o,s)=>{n.once("connection",i=>o(new z(i))),n.once("error",s);})},close(){n.close();}});});})}var A="[pup]";async function ar(t,e,r){l.debug(A,"runPupApp",t,e);let n=[t,"--width",`${e.width}`,"--height",`${e.height}`,"--fps",`${e.fps}`,"--duration",`${e.duration}`,"--out-file",`${e.outFile}`];return e.withAudio&&n.push("--with-audio"),e.useInnerProxy&&n.push("--use-inner-proxy"),e.deterministic&&n.push("--deterministic"),we(e,n,r)}var P=fe;async function kt(t,e){l.debug(A,"pup",t,e);let{signal:r}=e;if(r?.aborted)throw r.reason;let n=e.outFile??P.outFile,o={width:e.width??P.width,height:e.height??P.height,fps:e.fps??P.fps,duration:e.duration??P.duration,withAudio:e.withAudio??P.withAudio,useInnerProxy:e.useInnerProxy??P.useInnerProxy,deterministic:e.deterministic??P.deterministic,outFile:n},s=join(tmpdir(),"pup",randomUUID());await mkdir(s,{recursive:true});let i=join(s,"pup.sock"),c=performance.now(),p=await ve(i),u=await ar(t,{...o,signal:r},i),E=()=>{l.debug(A,"aborted");let a=u.process.pid;a?ir(a):u.process.kill(),rmSync(s,{recursive:true,force:true});};r?.addEventListener("abort",E,{once:true});try{let a=v=>(l.info(A,`${t} progress: ${v}%`),e.onProgress?.(v)),R=new Promise(async(v,x)=>{(await p.waitForConnection()).on("close",()=>x(new Error("IPC closed without result"))).on("message",()=>r?.aborted&&x(r.reason)).on("progress",a).on("done",v).on("error",x);}).finally(()=>p.close());a(0);let d=await Promise.race([R,u.wait]);return ok(d,"no summary received"),a(100),l.info(A,`done ${n} in ${Math.round(performance.now()-c)}ms`),{...d,options:o}}catch(a){throw r?.aborted?r.reason:a}finally{rmSync(s,{recursive:true,force:true});}}export{cr as a,pr as b,te as c,ne as d,fr as e,U as f,oe as g,se as h,ie as i,Ue as j,$ as k,Pr as l,b as m,l as n,Ar as o,H as p,Dr as q,de as r,Ge as s,Ne as t,$e as u,Be as v,We as w,$r as x,fe as y,kt as z};//# sourceMappingURL=chunk-3POZKRKH.js.map
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9iYXNlL2Vudi50cyIsIi4uL3NyYy9iYXNlL3BhcnNlci50cyIsIi4uL3NyYy9iYXNlL2NvbnN0YW50cy50cyIsIi4uL3NyYy9iYXNlL2xvZ2dpbmcudHMiLCIuLi9zcmMvYmFzZS9ub2Vyci50cyIsIi4uL3NyYy9iYXNlL3Byb2Nlc3MudHMiLCIuLi9zcmMvcmVuZGVyZXIvc2NoZW1hLnRzIiwiLi4vc3JjL2Jhc2UvaHdhY2NlbC50cyIsIi4uL3NyYy9yZW5kZXJlci9lbGVjdHJvbi50cyIsIi4uL3NyYy9yZW5kZXJlci9pcGMudHMiLCIuLi9zcmMvcHVwLnRzIl0sIm5hbWVzIjpbInBlbnYiLCJuYW1lIiwicGFyc2VyIiwiZGVmYXVsdFZhbHVlIiwicGFyc2VOdW1iZXIiLCJ4IiwibnVtIiwicGFyc2VTdHJpbmciLCJyZXF1aXJlIiwiY3JlYXRlUmVxdWlyZSIsImVudiIsInB1cExvZ0xldmVsIiwicHVwVXNlSW5uZXJQcm94eSIsInB1cERpc2FibGVHUFUiLCJwdXBEZXRlcm1pbmlzdGljIiwicHVwUGtnUm9vdCIsImRpcm5hbWUiLCJwdXBBcHAiLCJqb2luIiwicHVwSXBjU29ja2V0IiwiREVCVUciLCJJTkZPIiwiV0FSTiIsIkVSUk9SIiwiRkFUQUwiLCJzdGFja0hvb2siLCJ0YXJnZXQiLCJfY29udGV4dCIsIm1lc3NhZ2VzIiwicHJvY2Vzc2VkIiwibXNnIiwiX2ZhdGFsX2RlYyIsIl9lcnJvcl9kZWMiLCJfd2Fybl9kZWMiLCJfaW5mb19kZWMiLCJfZGVidWdfZGVjIiwiX2luaXQiLCJMb2dnZXIiLCJfbGV2ZWwiLCJfX3J1bkluaXRpYWxpemVycyIsIl9fcHVibGljRmllbGQiLCJ2YWx1ZSIsImRlYnVnIiwiaW5mbyIsIndhcm4iLCJlcnJvciIsImx2IiwibWVzc2FnZSIsInByb2MiLCJyZXNvbHZlIiwicmVqZWN0IiwiZmF0YWwiLCJkaXNwYXRjaCIsImRhdGEiLCJlcnIiLCJjb2RlIiwic2lnbmFsIiwicmVhc29uIiwiX19kZWNvcmF0b3JTdGFydCIsIl9fZGVjb3JhdGVFbGVtZW50IiwiX19kZWNvcmF0b3JNZXRhZGF0YSIsImxvZ2dlciIsIkxvZyIsImxldmVsIiwiQVZfTE9HX0VSUk9SIiwiQVZfTE9HX1dBUk5JTkciLCJub2VyciIsImZuIiwiYXJncyIsInJldCIsIlBVUF9BUkdTX0tFWSIsInBhcmdzIiwiYXJndiIsInByaXYiLCJhcmciLCJleGVjIiwiY21kIiwib3B0aW9ucyIsInBhcnRzIiwicyIsImNvbW1hbmQiLCJzcGF3biIsIkRFRkFVTFRfV0lEVEgiLCJERUZBVUxUX0hFSUdIVCIsIkRFRkFVTFRfRlBTIiwiREVGQVVMVF9EVVJBVElPTiIsIkRFRkFVTFRfT1VUX0ZJTEUiLCJSZW5kZXJTY2hlbWEiLCJ6IiwiZGVmYXVsdFJlbmRlck9wdGlvbnMiLCJUQUciLCJzb2Z0d2FyZVZlbmRvcnMiLCJpc1NvZnR3YXJlUmVuZGVyZXIiLCJ2ZW5kb3IiLCJsb3dlciIsInYiLCJkZXRlY3RHUFVEcml2ZXIiLCJjb250cm9sbGVycyIsImdyYXBoaWNzIiwicGxhdGZvcm0iLCJyZWFkZGlyIiwiZiIsImMiLCJjYW5JVXNlR1BVIiwicmVzdWx0IiwiZWxlY3Ryb25PcHRzIiwib3B0cyIsInBsYXQiLCJhc3NlcnRBcHBGcmVzaCIsImFwcFN0YXQiLCJzZWxmU3RhdCIsInN0YXQiLCJmaWxlVVJMVG9QYXRoIiwib2siLCJydW5FbGVjdHJvbkFwcCIsInNpemUiLCJpcGNTb2NrZXRQYXRoIiwiY21kUGFydHMiLCJlbGVjdHJvbkFyZ3MiLCJhIiwiYmFzZTY0QXJncyIsImVsZWN0cm9uIiwiSEVBREVSX1NJWkUiLCJJcGNSZWFkZXIiLCJFdmVudEVtaXR0ZXIiLCJfc29ja2V0IiwiaGVhZGVyIiwidHlwZSIsImxlbiIsInBheWxvYWQiLCJuIiwib3V0Iiwib2Zmc2V0IiwiY2h1bmsiLCJ0YWtlIiwiY3JlYXRlSXBjU2VydmVyIiwic29ja2V0UGF0aCIsInNlcnZlciIsImNyZWF0ZVNlcnZlciIsIm5vIiwic29ja2V0IiwicnVuUHVwQXBwIiwic291cmNlIiwiZCIsInB1cCIsIm91dEZpbGUiLCJyZW5kZXJPcHRzIiwidG1wRGlyIiwidG1wZGlyIiwicmFuZG9tVVVJRCIsIm1rZGlyIiwidDAiLCJoYW5kbGUiLCJvbkFib3J0IiwicGlkIiwidHJlZUtpbGwiLCJybVN5bmMiLCJ0aWNrIiwicCIsInN1bW1hcnkiLCJlIl0sIm1hcHBpbmdzIjoia3ZFQU1PLFNBQVNBLEVBQUFBLENBQVFDLENBQUFBLENBQWNDLENBQUFBLENBQXNCQyxDQUFBQSxDQUFpQyxDQUMzRixHQUFJLENBQ0YsT0FBT0QsQ0FBQUEsQ0FBTyxPQUFBLENBQVEsR0FBQSxDQUFJRCxDQUFJLENBQUMsQ0FDakMsQ0FBQSxLQUFRLENBQ04sT0FBT0UsQ0FDVCxDQUNGLENDVk8sU0FBU0MsRUFBQUEsQ0FBWUMsQ0FBQUEsQ0FBb0IsQ0FDOUMsR0FBSSxPQUFPQSxDQUFBQSxFQUFNLFFBQUEsQ0FDZixPQUFPQSxDQUFBQSxDQUVULElBQU1DLENBQUFBLENBQU0sTUFBQSxDQUFPRCxDQUFDLENBQUEsQ0FDcEIsR0FBSSxNQUFBLENBQU8sS0FBQSxDQUFNQyxDQUFHLENBQUEsQ0FDbEIsTUFBTSxJQUFJLEtBQUEsQ0FBTSxTQUFTRCxDQUFDLENBQUEsc0JBQUEsQ0FBd0IsQ0FBQSxDQUVwRCxPQUFPQyxDQUNULENBRU8sU0FBU0MsRUFBQUEsQ0FBWUYsQ0FBQUEsQ0FBb0IsQ0FDOUMsT0FBSSxPQUFPQSxDQUFBQSxFQUFNLFFBQUEsQ0FBaUJBLEVBQzNCLE1BQUEsQ0FBT0EsQ0FBQyxDQUNqQixLQ1RNRyxFQUFBQSxDQUFVQyxhQUFBQSxDQUFjLE1BQUEsQ0FBQSxJQUFBLENBQVksR0FBRyxDQUFBLENBQ3ZDQyxDQUFBQSxDQUFNLE9BQUEsQ0FBUSxHQUFBLENBRVBDLENBQUFBLENBQWNYLEVBQUFBLENBQUssZUFBQSxDQUFpQkksRUFBQUEsQ0FBYSxDQUFDLENBQUEsQ0FDbERRLEdBQW1CRixDQUFBQSxDQUFJLG1CQUFBLEdBQTJCLEdBQUEsQ0FDbERHLEVBQUFBLENBQWdCSCxDQUFBQSxDQUFJLGVBQUEsR0FBdUIsR0FBQSxDQUMzQ0ksRUFBQUEsQ0FBbUJKLENBQUFBLENBQUksaUJBQUEsR0FBeUIsR0FBQSxDQUVoREssRUFBQUEsQ0FBYUMsT0FBQUEsQ0FBUVIsRUFBQUEsQ0FBUSxPQUFBLENBQVEsMkJBQTJCLENBQUMsQ0FBQSxDQUNqRVMsQ0FBQUEsQ0FBU0MsSUFBQUEsQ0FBS0gsRUFBQUEsQ0FBWSxNQUFBLENBQVEsU0FBUyxDQUFBLENBQzNDSSxFQUFBQSxDQUFlVCxDQUFBQSxDQUFJLGVDQWhDLElBQU1VLENBQUFBLENBQVEsYUFBQSxDQUNSQyxDQUFBQSxDQUFPLFlBQUEsQ0FDUEMsQ0FBQUEsQ0FBTyxZQUFBLENBQ1BDLENBQUFBLENBQVEsY0FDUkMsQ0FBQUEsQ0FBUSxhQUFBLENBRWQsU0FBU0MsQ0FBQUEsQ0FBVUMsQ0FBQUEsQ0FBa0JDLENBQUFBLENBQXVDLENBQzFFLE9BQU8sU0FBQSxHQUEyQkMsQ0FBQUEsQ0FBcUIsQ0FDckQsSUFBTUMsQ0FBQUEsQ0FBWUQsQ0FBQUEsQ0FBUyxJQUFLRSxDQUFBQSxFQUN2QkEsQ0FBQUEsWUFBZSxLQUFBLENBQVNBLENBQUFBLENBQUksS0FBQSxFQUFTLE1BQUEsQ0FBT0EsQ0FBRyxDQUFBLENBQUtBLENBQzVELENBQUEsQ0FDRCxPQUFPSixDQUFBQSxDQUFPLElBQUEsQ0FBSyxJQUFBLENBQU0sR0FBR0csQ0FBUyxDQUN2QyxDQUNGLENBOUJBLElBQUFFLEVBQUFBLENBQUFDLEVBQUFBLENBQUFDLEVBQUFBLENBQUFDLEVBQUFBLENBQUFDLEVBQUFBLENBQUFDLENBQUFBLENBa0VFRCxFQUFBQSxDQUFBLENBQUNWLENBQUFBLENBQUFBLENBS0RTLEVBQUFBLENBQUEsQ0FBQ1QsQ0FBQUEsQ0FBQUEsQ0FLRFEsRUFBQUEsQ0FBQSxDQUFDUixDQUFBQSxDQUFBQSxDQUtETyxFQUFBQSxDQUFBLENBQUNQLENBQUFBLENBQUFBLENBS0RNLEVBQUFBLENBQUEsQ0FBQ04sQ0FBQUEsQ0FBQUEsQ0F0REksSUFBTVksQ0FBQUEsQ0FBTixLQUFtQyxDQThCeEMsWUFBb0JDLENBQUFBLENBQWlCM0IsQ0FBQUEsQ0FBYSxDQUE5QixJQUFBLENBQUEsTUFBQSxDQUFBMkIsQ0FBQUEsQ0E5QmZDLEVBQUFBLENBQUFILENBQUFBLENBQUEsQ0FBQSxDQUFBLElBQUEsQ0FBQSxDQUNMSSxFQUFBQSxDQUFBLElBQUEsQ0FBUSxPQUFBLENBQUEsQ0E4Qk4sSUFBQSxDQUFLLElBQUEsQ0FBTyxRQUNkLENBN0JBLElBQUksS0FBQSxFQUFnQixDQUNsQixPQUFPLElBQUEsQ0FBSyxNQUNkLENBRUEsSUFBSSxLQUFBLENBQU1DLENBQUFBLENBQWUsQ0FDdkIsSUFBQSxDQUFLLE1BQUEsQ0FBU0EsQ0FBQUEsQ0FDZCxJQUFBLENBQUssSUFBQSxDQUFPLElBQUEsQ0FBSyxLQUFBLEVBQVMsUUFDNUIsQ0FFQSxJQUFJLElBQUEsRUFBK0IsQ0FDakMsT0FBTyxJQUFBLENBQUssS0FDZCxDQUVBLElBQUksSUFBQSxDQUFLQSxDQUFBQSxDQUFtQixDQUMxQixJQUFNQyxDQUFBQSxDQUFRRCxDQUFBQSxDQUFNLEtBQUEsRUFBUyxPQUFBLENBQVEsS0FBQSxDQUMvQkUsQ0FBQUEsQ0FBT0YsQ0FBQUEsQ0FBTSxJQUFBLEVBQVEsT0FBQSxDQUFRLElBQUEsQ0FDN0JHLENBQUFBLENBQU9ILENBQUFBLENBQU0sSUFBQSxFQUFRLFFBQVEsSUFBQSxDQUM3QkksQ0FBQUEsQ0FBUUosQ0FBQUEsQ0FBTSxLQUFBLEVBQVMsT0FBQSxDQUFRLEtBQUEsQ0FDL0JLLENBQUFBLENBQUssSUFBQSxDQUFLLE1BQUEsQ0FDaEIsSUFBQSxDQUFLLEtBQUEsQ0FBUSxDQUNYLEtBQUEsQ0FBT0EsQ0FBQUEsRUFBTSxFQUFJSixDQUFBQSxDQUFRLE1BQUEsQ0FDekIsSUFBQSxDQUFNSSxDQUFBQSxFQUFNLENBQUEsQ0FBSUgsQ0FBQUEsQ0FBTyxNQUFBLENBQ3ZCLElBQUEsQ0FBTUcsQ0FBQUEsRUFBTSxDQUFBLENBQUlGLENBQUFBLENBQU8sTUFBQSxDQUN2QixLQUFBLENBQU9FLENBQUFBLEVBQU0sQ0FBQSxDQUFJRCxDQUFBQSxDQUFRLE1BQzNCLEVBQ0YsQ0FPQSxLQUFBLENBQUEsR0FBU2pCLENBQUFBLENBQTJCLENBQ2xDLElBQUEsQ0FBSyxJQUFBLEVBQU0sS0FBQSxHQUFRUixDQUFBQSxDQUFPLEdBQUdRLENBQVEsRUFDdkMsQ0FHQSxRQUFRQSxDQUFBQSxDQUEyQixDQUNqQyxJQUFBLENBQUssSUFBQSxFQUFNLElBQUEsR0FBT1AsQ0FBQUEsQ0FBTSxHQUFHTyxDQUFRLEVBQ3JDLENBR0EsSUFBQSxDQUFBLEdBQVFBLENBQUFBLENBQTJCLENBQ2pDLElBQUEsQ0FBSyxNQUFNLElBQUEsR0FBT04sQ0FBQUEsQ0FBTSxHQUFHTSxDQUFRLEVBQ3JDLENBR0EsS0FBQSxDQUFBLEdBQVNBLENBQUFBLENBQTJCLENBQ2xDLElBQUEsQ0FBSyxJQUFBLEVBQU0sS0FBQSxHQUFRTCxDQUFBQSxDQUFPLEdBQUdLLENBQVEsRUFDdkMsQ0FHQSxLQUFBLENBQUEsR0FBU0EsQ0FBQUEsQ0FBMkIsQ0FDbEMsSUFBQSxDQUFLLElBQUEsRUFBTSxLQUFBLEdBQVFKLENBQUFBLENBQU8sR0FBR0ksQ0FBUSxDQUFBLENBQ3JDLE9BQUEsQ0FBUSxJQUFBLENBQUssQ0FBQyxFQUNoQixDQUVRLFFBQUEsQ0FBU21CLENBQUFBLENBQWlCLENBQ2hDLElBQU1qQixDQUFBQSxDQUFNaUIsQ0FBQUEsQ0FBUSxPQUFBLEVBQVEsQ0FDeEJqQixDQUFBQSxDQUFJLFVBQUEsQ0FBV1YsQ0FBSyxDQUFBLENBQ3RCLElBQUEsQ0FBSyxNQUFNVSxDQUFBQSxDQUFJLEtBQUEsQ0FBTVYsQ0FBQUEsQ0FBTSxNQUFBLENBQVMsQ0FBQyxDQUFDLENBQUEsQ0FDN0JVLENBQUFBLENBQUksVUFBQSxDQUFXVCxDQUFJLENBQUEsQ0FDNUIsSUFBQSxDQUFLLElBQUEsQ0FBS1MsQ0FBQUEsQ0FBSSxNQUFNVCxDQUFBQSxDQUFLLE1BQUEsQ0FBUyxDQUFDLENBQUMsQ0FBQSxDQUMzQlMsQ0FBQUEsQ0FBSSxVQUFBLENBQVdSLENBQUksQ0FBQSxDQUM1QixJQUFBLENBQUssSUFBQSxDQUFLUSxDQUFBQSxDQUFJLEtBQUEsQ0FBTVIsQ0FBQUEsQ0FBSyxPQUFTLENBQUMsQ0FBQyxDQUFBLENBQzNCUSxDQUFBQSxDQUFJLFVBQUEsQ0FBV1AsQ0FBSyxDQUFBLENBQzdCLElBQUEsQ0FBSyxLQUFBLENBQU1PLENBQUFBLENBQUksS0FBQSxDQUFNUCxDQUFBQSxDQUFNLE1BQUEsQ0FBUyxDQUFDLENBQUMsQ0FBQSxDQUV0QyxJQUFBLENBQUssSUFBQSxDQUFLTyxDQUFHLEVBRWpCLENBRUEsTUFBQSxDQUFPa0IsQ0FBQUEsQ0FBb0IvQyxDQUFBQSxDQUFjLENBQ3ZDLE9BQU8sSUFBSSxPQUFBLENBQWMsQ0FBQ2dELENBQUFBLENBQVNDLElBQVcsQ0FDNUMsSUFBQSxDQUFLLEtBQUEsQ0FBTSxDQUFBLEVBQUdqRCxDQUFJLENBQUEsT0FBQSxDQUFTLENBQUEsQ0FDM0IsSUFBSWtELENBQUFBLENBQWdCLEVBQUEsQ0FDZEMsQ0FBQUEsQ0FBWUMsQ0FBQUEsRUFBZ0MsQ0FDaEQsSUFBTU4sRUFBVU0sQ0FBQUEsQ0FBSyxRQUFBLEVBQVMsQ0FDMUJOLENBQUFBLENBQVEsVUFBQSxDQUFXdkIsQ0FBSyxDQUFBLENBQzFCMkIsQ0FBQUEsRUFBU0osQ0FBQUEsQ0FBUSxLQUFBLENBQU12QixDQUFBQSxDQUFNLE1BQUEsQ0FBUyxDQUFDLENBQUEsQ0FFdkMsS0FBSyxRQUFBLENBQVN1QixDQUFPLEVBRXpCLENBQUEsQ0FDQUMsQ0FBQUEsQ0FBSyxNQUFBLEVBQVEsRUFBQSxDQUFHLE1BQUEsQ0FBUUksQ0FBUSxDQUFBLENBQ2hDSixDQUFBQSxDQUFLLE1BQUEsRUFBUSxFQUFBLENBQUcsTUFBQSxDQUFRSSxDQUFRLENBQUEsQ0FDaENKLENBQUFBLENBQ0csRUFBQSxDQUFHLFNBQUEsQ0FBV0ksQ0FBUSxDQUFBLENBQ3RCLEVBQUEsQ0FBRyxPQUFBLENBQVVFLENBQUFBLEVBQVEsQ0FDcEJILENBQUFBLEVBQVNHLENBQUFBLENBQUksT0FBQSxDQUNiTixDQUFBQSxDQUFLLElBQUEsR0FDUCxDQUFDLENBQUEsQ0FDQSxJQUFBLENBQUssT0FBQSxDQUFTLENBQUNPLENBQUFBLENBQU1DLENBQUFBLEdBQVcsQ0FDM0JELENBQUFBLEVBQVFDLENBQUFBLEVBQVVMLENBQUFBLEVBQ3BCQSxDQUFBQSxHQUFVLENBQUEsZ0JBQUEsRUFBbUJILENBQUFBLENBQUssVUFBVSxJQUFBLENBQUssR0FBRyxDQUFDLENBQUEsQ0FBQSxDQUNyRCxJQUFBLENBQUssS0FBQSxDQUFNLENBQUEsRUFBRy9DLENBQUksQ0FBQSxNQUFBLENBQUEsQ0FBVSxDQUFFLElBQUEsQ0FBQXNELENBQUFBLENBQU0sTUFBQSxDQUFBQyxDQUFBQSxDQUFRLE1BQUFMLENBQU0sQ0FBQyxDQUFBLENBQ25ERCxDQUFBQSxDQUFPLElBQUksS0FBQSxDQUFNQyxDQUFLLENBQUMsQ0FBQSxHQUV2QixJQUFBLENBQUssS0FBQSxDQUFNLENBQUEsRUFBR2xELENBQUksQ0FBQSxNQUFBLENBQVEsQ0FBQSxDQUMxQmdELENBQUFBLEVBQVEsRUFFWixDQUFDLENBQUEsQ0FDQSxFQUFBLENBQUcsb0JBQUEsQ0FBdUJRLENBQUFBLEVBQVcsQ0FDcEMsSUFBQSxDQUFLLEtBQUEsQ0FBTSxDQUFBLEVBQUd4RCxDQUFJLENBQUEsVUFBQSxDQUFBLENBQWN3RCxDQUFNLEVBQ3hDLENBQUMsQ0FBQSxDQUNBLEVBQUEsQ0FBRywwQkFBQSxDQUE2QkgsQ0FBQUEsRUFBUSxDQUN2QyxJQUFBLENBQUssS0FBQSxDQUFNLENBQUEsRUFBR3JELENBQUksQ0FBQSxVQUFBLENBQUEsQ0FBY3FELENBQUcsRUFDckMsQ0FBQyxFQUNMLENBQUMsQ0FDSCxDQUNGLEVBakhPbEIsQ0FBQUEsQ0FBQXNCLENBQUFBLENBQUEsQ0FBQSxDQW1DTEMsQ0FBQUEsQ0FBQXZCLENBQUFBLENBQUEsQ0FBQSxDQUFBLE9BQUEsQ0FEQUQsRUFBQUEsQ0FsQ1dFLENBQUFBLENBQUFBLENBd0NYc0IsQ0FBQUEsQ0FBQXZCLENBQUFBLENBQUEsQ0FBQSxDQUFBLE1BQUEsQ0FEQUYsR0F2Q1dHLENBQUFBLENBQUFBLENBNkNYc0IsQ0FBQUEsQ0FBQXZCLENBQUFBLENBQUEsQ0FBQSxDQUFBLE1BQUEsQ0FEQUgsRUFBQUEsQ0E1Q1dJLENBQUFBLENBQUFBLENBa0RYc0IsQ0FBQUEsQ0FBQXZCLENBQUFBLENBQUEsQ0FBQSxDQUFBLE9BQUEsQ0FEQUosRUFBQUEsQ0FqRFdLLENBQUFBLENBQUFBLENBdURYc0IsQ0FBQUEsQ0FBQXZCLENBQUFBLENBQUEsQ0FBQSxDQUFBLE9BQUEsQ0FEQUwsRUFBQUEsQ0F0RFdNLENBQUFBLENBQUFBLENBQU51QixDQUFBQSxDQUFBeEIsQ0FBQUEsQ0FBTUMsQ0FBQUEsQ0FBQUEsQ0FtSGIsSUFBTXdCLENBQUFBLENBQVMsSUFBSXhCLEVBR25CeUIsR0FBQUEsQ0FBSSxXQUFBLENBQVksQ0FBQ0MsQ0FBQUEsQ0FBT2hCLENBQUFBLEdBQVksQ0FDbEMsSUFBTWpCLEVBQU1pQixDQUFBQSxDQUFRLE9BQUEsRUFBUSxDQUN2QmpCLENBQUFBLEdBQ0RpQyxDQUFBQSxFQUFTQyxZQUFBQSxDQUFjSCxDQUFBQSxDQUFPLEtBQUEsQ0FBTS9CLENBQUcsQ0FBQSxDQUNsQ2lDLENBQUFBLEVBQVNFLGNBQUFBLEVBQWdCSixDQUFBQSxDQUFPLElBQUEsQ0FBSy9CLENBQUcsQ0FBQSxFQUNuRCxDQUFDLENBQUEsQ0N6Sk0sU0FBU29DLEVBQUFBLENBQ2RDLENBQUFBLENBQ0FoRSxDQUFBQSxDQUNpRCxDQUNqRCxPQUFPLENBQUEsR0FBSWlFLENBQUFBLEdBQVMsQ0FDbEIsR0FBSSxDQUNGLElBQU1DLENBQUFBLENBQU1GLENBQUFBLENBQUcsR0FBR0MsQ0FBSSxDQUFBLENBQ3RCLE9BQUlDLENBQUFBLFlBQWUsT0FBQSxDQUNWQSxDQUFBQSxDQUFJLEtBQUEsQ0FBTSxJQUFNbEUsQ0FBWSxDQUFBLENBRTlCa0UsQ0FDVCxDQUFBLEtBQVEsQ0FDTixPQUFPbEUsQ0FDVCxDQUNGLENBQ0YsQ0NaTyxJQUFNbUUsQ0FBQUEsQ0FBZSxrQkFFckIsU0FBU0MsRUFBQUEsRUFBUSxDQUN0QixJQUFNQyxDQUFBQSxDQUFPLE9BQUEsQ0FBUSxJQUFBLENBQ2pCQyxDQUFBQSxDQUFPRCxDQUFBQSxDQUFLLElBQUEsQ0FBTUUsQ0FBQUEsRUFBUUEsQ0FBQUEsQ0FBSSxVQUFBLENBQVdKLENBQVksQ0FBQyxDQUFBLENBQzFELEdBQUksQ0FBQ0csQ0FBQUEsQ0FDSCxPQUFBWixDQUFBQSxDQUFPLEtBQUEsQ0FBTSxVQUFBLENBQVlXLENBQUksQ0FBQSxDQUN0QixPQUFBLENBQVEsSUFBQSxDQUVqQixJQUFNSixDQUFBQSxDQUFPLENBQUMsTUFBQSxDQUFRLEdBQUdJLEVBQUssS0FBQSxDQUFNLEVBQUUsQ0FBQyxDQUFBLENBQ3ZDLE9BQUFDLENBQUFBLENBQU8sTUFBQSxDQUFPLElBQUEsQ0FBS0EsQ0FBQUEsQ0FBSyxLQUFBLENBQU0sR0FBRyxDQUFBLENBQUUsQ0FBQyxDQUFBLENBQUksUUFBUSxDQUFBLENBQUUsUUFBQSxFQUFTLENBQzNETCxDQUFBQSxDQUFLLElBQUEsQ0FBSyxHQUFHLElBQUEsQ0FBSyxLQUFBLENBQU1LLENBQUksQ0FBQyxDQUFBLENBQzdCWixDQUFBQSxDQUFPLEtBQUEsQ0FBTSxTQUFBLENBQVdPLENBQUksRUFDckJBLENBQ1QsQ0FPTyxTQUFTTyxFQUFBQSxDQUFLQyxDQUFBQSxDQUFhQyxDQUFBQSxDQUF1QyxDQUN2RSxJQUFNQyxDQUFBQSxDQUFRRixDQUFBQSxDQUFJLEtBQUEsQ0FBTSxHQUFHLENBQUEsQ0FBRSxNQUFBLENBQVFHLEdBQU1BLENBQUFBLENBQUUsTUFBTSxDQUFBLENBQzdDLENBQUNDLENBQUFBLENBQVMsR0FBR1osQ0FBSSxDQUFBLENBQUlVLENBQUFBLENBQzNCLEdBQUksQ0FBQ0UsQ0FBQUEsQ0FBUyxNQUFNLElBQUksTUFBTSxlQUFlLENBQUEsQ0FDN0MsSUFBTWhDLENBQUFBLENBQU9pQyxLQUFBQSxDQUFNRCxDQUFBQSxDQUFTWixDQUFBQSxDQUFNLENBQ2hDLEtBQUEsQ0FBTyxTQUFBLENBQ1AsR0FBR1MsQ0FDTCxDQUFDLENBQUEsQ0FDRCxPQUFPLENBQUUsT0FBQSxDQUFTN0IsQ0FBQUEsQ0FBTSxJQUFBLENBQU1hLENBQUFBLENBQU8sTUFBQSxDQUFPYixDQUFBQSxDQUFNZ0MsQ0FBTyxDQUFFLENBQzdELENDOUJPLElBQU1FLEdBQWdCLElBQUEsQ0FDaEJDLEVBQUFBLENBQWlCLElBQUEsQ0FDakJDLEVBQUFBLENBQWMsRUFBQSxDQUNkQyxFQUFBQSxDQUFtQixDQUFBLENBQ25CQyxFQUFBQSxDQUFtQixZQUFBLENBRW5CQyxFQUFBQSxDQUFlQyxDQUFBQSxDQUFFLE1BQUEsQ0FBTyxDQUNuQyxRQUFBLENBQVVBLEVBQUUsTUFBQSxFQUFPLENBQUUsUUFBQSxDQUFTLHFCQUFxQixDQUFBLENBQ25ELEtBQUEsQ0FBT0EsQ0FBQUEsQ0FBRSxNQUFBLEVBQU8sQ0FBRSxRQUFBLENBQVMsYUFBYSxDQUFBLENBQ3hDLE1BQUEsQ0FBUUEsQ0FBQUEsQ0FBRSxRQUFPLENBQUUsUUFBQSxDQUFTLGNBQWMsQ0FBQSxDQUMxQyxHQUFBLENBQUtBLENBQUFBLENBQUUsTUFBQSxFQUFPLENBQUUsUUFBQSxDQUFTLG1CQUFtQixDQUFBLENBQzVDLFNBQUEsQ0FBV0EsQ0FBQUEsQ0FBRSxPQUFBLEVBQVEsQ0FBRSxRQUFBLENBQVMsMEJBQTBCLENBQUEsQ0FDMUQsT0FBQSxDQUFTQSxDQUFBQSxDQUFFLE1BQUEsRUFBTyxDQUFFLFFBQUEsQ0FBUyxzQkFBc0IsQ0FBQSxDQUNuRCxhQUFBLENBQWVBLENBQUFBLENBQUUsT0FBQSxFQUFRLENBQUUsUUFBQSxDQUFTLDhDQUE4QyxDQUFBLENBQ2xGLGFBQUEsQ0FBZUEsQ0FBQUEsQ0FBRSxPQUFBLEVBQVEsQ0FBRSxRQUFBLENBQVMsdUNBQXVDLENBQzdFLENBQUMsQ0FBQSxDQVdZQyxFQUFBQSxDQUFzQyxDQUNqRCxLQUFBLENBQU9QLEVBQUFBLENBQ1AsT0FBUUMsRUFBQUEsQ0FDUixHQUFBLENBQUtDLEVBQUFBLENBQ0wsUUFBQSxDQUFVQyxFQUFBQSxDQUNWLE9BQUEsQ0FBU0MsRUFBQUEsQ0FDVCxTQUFBLENBQVcsS0FBQSxDQUNYLGFBQUEsQ0FBZTFFLEVBQUFBLENBQ2YsYUFBQSxDQUFlRSxFQUNqQixFQ2pDQSxJQUFNNEUsRUFBQUEsQ0FBTSxXQUFBLENBRU5DLEdBQWtCLENBQUMsV0FBQSxDQUFhLFFBQUEsQ0FBVSxZQUFBLENBQWMsVUFBQSxDQUFZLFVBQUEsQ0FBWSxhQUFhLENBQUEsQ0FFbkcsU0FBU0MsRUFBQUEsQ0FBbUJDLENBQUFBLENBQWdCLENBQzFDLElBQU1DLENBQUFBLENBQVFELENBQUFBLENBQU8sV0FBQSxFQUFZLENBQ2pDLE9BQU9GLEVBQUFBLENBQWdCLElBQUEsQ0FBTUksQ0FBQUEsRUFBTUQsQ0FBQUEsQ0FBTSxRQUFBLENBQVNDLENBQUMsQ0FBQyxDQUN0RCxDQUVBLGVBQWVDLEVBQUFBLEVBQWtCLENBQy9CLEdBQU0sQ0FBRSxXQUFBLENBQUFDLENBQVksQ0FBQSxDQUFJLE1BQU1DLFFBQUFBLEVBQVMsQ0FDdkMsR0FBSUMsUUFBQUEsRUFBUyxHQUFNLE9BQUEsQ0FDakIsR0FBSSxDQUVGLE9BQUEsQ0FEYyxNQUFNQyxPQUFBQSxDQUFRLFVBQVUsQ0FBQSxFQUN6QixJQUFBLENBQU1DLENBQUFBLEVBQU1BLENBQUFBLENBQUUsVUFBQSxDQUFXLFNBQVMsQ0FBQyxDQUNsRCxDQUFBLEtBQVEsQ0FDTixPQUFPLE1BQ1QsQ0FFRixPQUFBeEMsQ0FBQUEsQ0FBTyxLQUFBLENBQU02QixFQUFBQSxDQUFLLGtCQUFBLENBQW9CTyxDQUFXLENBQUEsQ0FDMUNBLENBQUFBLENBQVksSUFBQSxDQUFNSyxDQUFBQSxFQUFNQSxDQUFBQSxDQUFFLE1BQUEsQ0FBTyxNQUFBLENBQVMsQ0FBQSxFQUFLLENBQUNWLEVBQUFBLENBQW1CVSxDQUFBQSxDQUFFLE1BQU0sQ0FBQyxDQUNyRixDQUVPLElBQU1DLEVBQUFBLENBQWFQLEVBQUFBLEVBQWdCLENBQUUsSUFBQSxDQUFNUSxDQUFBQSxHQUNoRDNDLENBQUFBLENBQU8sS0FBQSxDQUFNNkIsRUFBQUEsQ0FBSyxPQUFRYyxDQUFNLENBQUEsQ0FDekJBLENBQUFBLENBQ1IsQ0FBQSxDQ3JCRCxlQUFzQkMsRUFBQUEsRUFBZSxDQUNuQyxJQUFNQyxDQUFBQSxDQUFPLENBRVgsWUFBQSxDQUNBLHVCQUFBLENBRUEsc0JBQUEsQ0FDQSwrQkFBQSxDQUNBLDRCQUVBLDZDQUFBLENBQ0EsWUFBQSxDQUNBLDBDQUFBLENBQ0Esb0JBQUEsQ0FFQSxjQUFBLENBQ0EsNkJBQUEsQ0FDQSwwQkFBQSxDQUNBLHNCQUFBLENBQ0EsY0FBQSxDQUNBLG9CQUFBLENBQ0EsNEJBQUEsQ0FDQSx1Q0FBQSxDQUNBLHVDQUFBLENBQ0EsNEJBQUEsQ0FDQSw2QkFDQSx5QkFBQSxDQUNBLGdDQUFBLENBQ0EsZ0NBQUEsQ0FFQSwrQkFDRixDQUFBLENBTUEsR0FMSS9GLENBQUFBLENBQWMsQ0FBQSxFQUNoQitGLENBQUFBLENBQUssSUFBQSxDQUFLLGFBQWEsQ0FBQSxDQUlyQixFQURlLE1BQU1ILEVBQUFBLEVBQWUsQ0FBQzFGLEVBQUFBLENBQUFBLENBRXZDLE9BQUE2RixDQUFBQSxDQUFLLElBQUEsQ0FBSyx1QkFBQSxDQUF5QiwyQkFBMkIsQ0FBQSxDQUN2REEsQ0FBQUEsQ0FHVEEsQ0FBQUEsQ0FBSyxJQUFBLENBQUsscUJBQUEsQ0FBdUIsc0JBQXNCLENBQUEsQ0FDdkQsSUFBTUMsRUFBT1IsUUFBQUEsRUFBUyxDQUN0QixPQUFJUSxDQUFBQSxHQUFTLFFBQUEsQ0FDWEQsQ0FBQUEsQ0FBSyxJQUFBLENBQUssaUJBQWlCLENBQUEsQ0FDbEJDLENBQUFBLEdBQVMsT0FBQSxDQUNsQkQsQ0FBQUEsQ0FBSyxJQUFBLENBQUssaUJBQWlCLEVBRTNCQSxDQUFBQSxDQUFLLElBQUEsQ0FBSyxrQkFBQSxDQUFvQix3QkFBQSxDQUEwQix3QkFBd0IsQ0FBQSxDQUUzRUEsQ0FDVCxDQUVBLElBQU1oQixFQUFBQSxDQUFNLFlBQUEsQ0FFWixlQUFla0IsRUFBQUEsRUFBaUIsQ0FDOUIsR0FBTSxDQUFDQyxDQUFBQSxDQUFTQyxDQUFRLENBQUEsQ0FBSSxNQUFNLE9BQUEsQ0FBUSxHQUFBLENBQUksQ0FBQ0MsSUFBQUEsQ0FBSzlGLENBQU0sQ0FBQSxDQUFHOEYsSUFBQUEsQ0FBS0MsYUFBQUEsQ0FBYyxNQUFBLENBQUEsSUFBQSxDQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUNsR0MsRUFBQUEsQ0FBR0osQ0FBQUEsQ0FBUSxPQUFBLEVBQVdDLENBQUFBLENBQVMsT0FBQSxDQUFTLHVDQUF5QyxFQUNuRixDQUVBLGVBQXNCSSxFQUFBQSxDQUFlQyxDQUFBQSxDQUFZL0MsRUFBaUJnRCxDQUFBQSxDQUF1QixDQUN2RixNQUFNUixFQUFBQSxFQUFlLENBQ3JCLElBQU1TLENBQUFBLENBQXNCLEVBQUMsQ0FDdkJWLENBQUFBLENBQU9SLFFBQUFBLEVBQVMsQ0FDbEJRLENBQUFBLEdBQVMsT0FBQSxFQUNYVSxFQUFTLElBQUEsQ0FBSyxVQUFBLENBQVksa0JBQUEsQ0FBb0IsQ0FBQSx5QkFBQSxFQUE0QkYsQ0FBQUEsQ0FBSyxLQUFLLENBQUEsQ0FBQSxFQUFJQSxDQUFBQSxDQUFLLE1BQU0sQ0FBQSxJQUFBLENBQU0sQ0FBQSxDQUczRyxJQUFNRyxDQUFBQSxDQUFBQSxDQURPLE1BQU1iLElBQWEsRUFDTixHQUFBLENBQUtjLENBQUFBLEVBQU0sQ0FBQSxFQUFBLEVBQUtBLENBQUMsQ0FBQSxDQUFFLENBQUEsQ0FDdkNDLENBQUFBLENBQWEsTUFBQSxDQUFPLElBQUEsQ0FBSyxJQUFBLENBQUssU0FBQSxDQUFVcEQsQ0FBSSxDQUFDLENBQUEsQ0FBRSxRQUFBLENBQVMsUUFBUSxDQUFBLENBQ3RFa0QsQ0FBQUEsQ0FBYSxJQUFBLENBQUssQ0FBQSxFQUFHaEQsQ0FBWSxDQUFBLENBQUEsRUFBSWtELENBQVUsQ0FBQSxDQUFFLENBQUEsQ0FDakRILENBQUFBLENBQVMsSUFBQSxDQUFLSSxFQUFBQSxDQUFVLEdBQUdILEVBQWNyRyxDQUFNLENBQUEsQ0FDL0MsSUFBTTJELENBQUFBLENBQU15QyxDQUFBQSxDQUFTLElBQUEsQ0FBSyxHQUFHLENBQUEsQ0FDN0IsT0FBQXhELENBQUFBLENBQU8sS0FBQSxDQUFNNkIsRUFBQUEsQ0FBS2QsQ0FBRyxDQUFBLENBQ2RELEdBQUtDLENBQUFBLENBQUssQ0FDZixLQUFBLENBQU8sQ0FBQyxRQUFBLENBQVUsTUFBQSxDQUFRLE1BQU0sQ0FBQSxDQUNoQyxLQUFBLENBQU8rQixDQUFBQSxHQUFTLE9BQUEsQ0FDaEIsR0FBQSxDQUFLLENBQUUsR0FBRyxRQUFRLEdBQUEsQ0FBSyxjQUFBLENBQWdCLE1BQUEsQ0FBUSxjQUFBLENBQWdCUyxDQUFjLENBQy9FLENBQUMsQ0FDSCxDQ3ZGQSxJQUFNTSxDQUFBQSxDQUFjLENBQUEsQ0FnRGIsSUFBTUMsQ0FBQUEsQ0FBTixjQUF3QkMsWUFNNUIsQ0FJRCxXQUFBLENBQTZCQyxDQUFBQSxDQUFpQixDQUM1QyxPQUFNLENBRHFCLElBQUEsQ0FBQSxPQUFBLENBQUFBLENBQUFBLENBRTNCLElBQUEsQ0FBSyxPQUFBLENBQVEsRUFBQSxDQUFHLE1BQUEsQ0FBU3hFLENBQUFBLEVBQVMsSUFBQSxDQUFLLE1BQUEsQ0FBT0EsQ0FBSSxDQUFDLENBQUEsQ0FDbkQsSUFBQSxDQUFLLFFBQVEsRUFBQSxDQUFHLE9BQUEsQ0FBVUMsQ0FBQUEsRUFBUSxJQUFBLENBQUssSUFBQSxDQUFLLE9BQUEsQ0FBU0EsQ0FBRyxDQUFDLENBQUEsQ0FDekQsSUFBQSxDQUFLLE9BQUEsQ0FBUSxFQUFBLENBQUcsT0FBQSxDQUFTLElBQU0sS0FBSyxJQUFBLENBQUssT0FBTyxDQUFDLEVBQ25ELENBUlEsT0FBQSxDQUFvQixFQUFDLENBQ3JCLFNBQUEsQ0FBWSxDQUFBLENBU1osTUFBQSxDQUFPRCxDQUFBQSxDQUFvQixDQUNqQyxJQUFBLENBQUssT0FBQSxDQUFRLElBQUEsQ0FBS0EsQ0FBSSxDQUFBLENBQ3RCLElBQUEsQ0FBSyxTQUFBLEVBQWFBLENBQUFBLENBQUssVUFBQSxDQUN2QixJQUFBLENBQUssS0FBQSxHQUNQLENBRVEsS0FBQSxFQUFjLENBQ3BCLE9BQVMsQ0FDUCxHQUFJLElBQUEsQ0FBSyxTQUFBLENBQVlxRSxDQUFBQSxDQUFhLE9BQ2xDLElBQU1JLENBQUFBLENBQVMsSUFBQSxDQUFLLElBQUEsQ0FBS0osQ0FBVyxDQUFBLENBQzlCSyxDQUFBQSxDQUFPRCxDQUFBQSxDQUFPLFlBQUEsQ0FBYSxDQUFDLEVBQzVCRSxDQUFBQSxDQUFNRixDQUFBQSxDQUFPLFlBQUEsQ0FBYSxDQUFDLENBQUEsQ0FDakMsR0FBSSxJQUFBLENBQUssU0FBQSxDQUFZSixDQUFBQSxDQUFjTSxDQUFBQSxDQUFLLE9BQ3hDLElBQUEsQ0FBSyxPQUFBLENBQVFOLENBQVcsRUFDeEIsSUFBTU8sQ0FBQUEsQ0FBVSxJQUFBLENBQUssT0FBQSxDQUFRRCxDQUFHLENBQUEsQ0FFaEMsT0FEQSxJQUFBLENBQUssSUFBQSxDQUFLLFNBQUEsQ0FBV0QsQ0FBQUEsQ0FBTUUsQ0FBTyxDQUFBLENBQzFCRixDQUFBQSxFQUNOLEtBQUssQ0FBQSxDQUFxQixDQUN4QixJQUFBLENBQUssSUFBQSxDQUFLLFVBQUEsQ0FBWSxNQUFBLENBQU9FLENBQUFBLENBQVEsUUFBQSxFQUFVLENBQUMsQ0FBQSxDQUNoRCxLQUNGLENBQ0EsT0FBc0IsQ0FDcEIsSUFBQSxDQUFLLElBQUEsQ0FBSyxNQUFBLENBQVEsSUFBQSxDQUFLLEtBQUEsQ0FBTUEsQ0FBQUEsQ0FBUSxRQUFBLEVBQVUsQ0FBQyxDQUFBLENBQ2hELEtBQ0YsQ0FDQSxPQUF1QixDQUNyQixJQUFBLENBQUssSUFBQSxDQUFLLE9BQUEsQ0FBUyxJQUFJLEtBQUEsQ0FBTUEsQ0FBQUEsQ0FBUSxRQUFBLEVBQVUsQ0FBQyxDQUFBLENBQ2hELEtBQ0YsQ0FDRixDQUNGLENBQ0YsQ0FFUSxJQUFBLENBQUtDLENBQUFBLENBQW1CLENBQzlCLE9BQUksSUFBQSxDQUFLLE9BQUEsQ0FBUSxDQUFDLENBQUEsRUFBSyxJQUFBLENBQUssT0FBQSxDQUFRLENBQUMsQ0FBQSxDQUFFLFVBQUEsRUFBY0EsQ0FBQUEsQ0FBVSxJQUFBLENBQUssT0FBQSxDQUFRLENBQUMsQ0FBQSxDQUN0RSxNQUFBLENBQU8sTUFBQSxDQUFPLElBQUEsQ0FBSyxPQUFPLENBQUEsQ0FBRSxRQUFBLENBQVMsQ0FBQSxDQUFHQSxDQUFDLENBQ2xELENBRVEsT0FBQSxDQUFRQSxFQUFtQixDQUNqQyxJQUFNQyxDQUFBQSxDQUFNLE1BQUEsQ0FBTyxXQUFBLENBQVlELENBQUMsQ0FBQSxDQUM1QkUsQ0FBQUEsQ0FBUyxDQUFBLENBQ2IsS0FBT0EsQ0FBQUEsQ0FBU0YsQ0FBQUEsRUFBRyxDQUNqQixJQUFNRyxFQUFRLElBQUEsQ0FBSyxPQUFBLENBQVEsQ0FBQyxDQUFBLENBQ3RCQyxDQUFBQSxDQUFPLElBQUEsQ0FBSyxHQUFBLENBQUlELENBQUFBLENBQU0sVUFBQSxDQUFZSCxDQUFBQSxDQUFJRSxDQUFNLENBQUEsQ0FDbERDLENBQUFBLENBQU0sSUFBQSxDQUFLRixFQUFLQyxDQUFBQSxDQUFRLENBQUEsQ0FBR0UsQ0FBSSxDQUFBLENBQzNCQSxDQUFBQSxHQUFTRCxDQUFBQSxDQUFNLFVBQUEsQ0FDakIsSUFBQSxDQUFLLE9BQUEsQ0FBUSxLQUFBLEVBQU0sQ0FFbkIsSUFBQSxDQUFLLE9BQUEsQ0FBUSxDQUFDLENBQUEsQ0FBSUEsQ0FBQUEsQ0FBTSxRQUFBLENBQVNDLENBQUksQ0FBQSxDQUV2Q0YsQ0FBQUEsRUFBVUUsRUFDWixDQUNBLE9BQUEsSUFBQSxDQUFLLFNBQUEsRUFBYUosQ0FBQUEsQ0FDWEMsQ0FDVCxDQUNGLENBQUEsQ0FPTyxTQUFTSSxFQUFBQSxDQUFnQkMsRUFBd0MsQ0FDdEUsT0FBTyxJQUFJLE9BQUEsQ0FBUSxDQUFDdkYsQ0FBQUEsQ0FBU0MsQ0FBQUEsR0FBVyxDQUN0QyxJQUFNdUYsQ0FBQUEsQ0FBU0MsWUFBQUEsRUFBYSxDQUM1QkQsQ0FBQUEsQ0FBTyxJQUFBLENBQUssUUFBU3ZGLENBQU0sQ0FBQSxDQUMzQnVGLENBQUFBLENBQU8sTUFBQSxDQUFPRCxDQUFBQSxDQUFZLElBQU0sQ0FDOUJ2RixDQUFBQSxDQUFRLENBQ04saUJBQUEsRUFBb0IsQ0FDbEIsT0FBTyxJQUFJLE9BQUEsQ0FBbUIsQ0FBQ2dFLENBQUFBLENBQUkwQixDQUFBQSxHQUFPLENBQ3hDRixDQUFBQSxDQUFPLElBQUEsQ0FBSyxZQUFBLENBQWVHLENBQUFBLEVBQVczQixDQUFBQSxDQUFHLElBQUlVLENBQUFBLENBQVVpQixDQUFNLENBQUMsQ0FBQyxDQUFBLENBQy9ESCxDQUFBQSxDQUFPLElBQUEsQ0FBSyxPQUFBLENBQVNFLENBQUUsRUFDekIsQ0FBQyxDQUNILENBQUEsQ0FDQSxLQUFBLEVBQVEsQ0FDTkYsQ0FBQUEsQ0FBTyxLQUFBLEdBQ1QsQ0FDRixDQUFDLEVBQ0gsQ0FBQyxFQUNILENBQUMsQ0FDSCxDQ3hJQSxJQUFNL0MsQ0FBQUEsQ0FBTSxPQUFBLENBZVosZUFBZW1ELEVBQUFBLENBQVVDLENBQUFBLENBQWdCakUsQ0FBQUEsQ0FBcUIyRCxDQUFBQSxDQUFvQixDQUNoRjNFLENBQUFBLENBQU8sTUFBTTZCLENBQUFBLENBQUssV0FBQSxDQUFhb0QsQ0FBQUEsQ0FBUWpFLENBQU8sQ0FBQSxDQUU5QyxJQUFNVCxDQUFBQSxDQUFpQixDQUNyQjBFLENBQUFBLENBQ0EsU0FBQSxDQUNBLENBQUEsRUFBR2pFLENBQUFBLENBQVEsS0FBSyxDQUFBLENBQUEsQ0FDaEIsV0FDQSxDQUFBLEVBQUdBLENBQUFBLENBQVEsTUFBTSxDQUFBLENBQUEsQ0FDakIsT0FBQSxDQUNBLENBQUEsRUFBR0EsQ0FBQUEsQ0FBUSxHQUFHLENBQUEsQ0FBQSxDQUNkLFlBQUEsQ0FDQSxDQUFBLEVBQUdBLENBQUFBLENBQVEsUUFBUSxDQUFBLENBQUEsQ0FDbkIsWUFBQSxDQUNBLENBQUEsRUFBR0EsQ0FBQUEsQ0FBUSxPQUFPLENBQUEsQ0FDcEIsQ0FBQSxDQUNBLE9BQUlBLENBQUFBLENBQVEsU0FBQSxFQUFXVCxDQUFBQSxDQUFLLElBQUEsQ0FBSyxjQUFjLENBQUEsQ0FDM0NTLENBQUFBLENBQVEsYUFBQSxFQUFlVCxDQUFBQSxDQUFLLEtBQUssbUJBQW1CLENBQUEsQ0FDcERTLENBQUFBLENBQVEsYUFBQSxFQUFlVCxDQUFBQSxDQUFLLElBQUEsQ0FBSyxpQkFBaUIsQ0FBQSxDQUUvQzhDLEVBQUFBLENBQWVyQyxDQUFBQSxDQUFTVCxDQUFBQSxDQUFNb0UsQ0FBVSxDQUNqRCxDQUVBLElBQU1PLENBQUFBLENBQUl0RCxFQUFBQSxDQUVWLGVBQXNCdUQsRUFBQUEsQ0FBSUYsQ0FBQUEsQ0FBZ0JqRSxDQUFBQSxDQUFrRCxDQUMxRmhCLENBQUFBLENBQU8sS0FBQSxDQUFNNkIsQ0FBQUEsQ0FBSyxLQUFBLENBQU9vRCxDQUFBQSxDQUFRakUsQ0FBTyxDQUFBLENBRXhDLEdBQU0sQ0FBRSxNQUFBLENBQUFyQixDQUFPLENBQUEsQ0FBSXFCLENBQUFBLENBQ25CLEdBQUlyQixDQUFBQSxFQUFRLE9BQUEsQ0FBUyxNQUFNQSxDQUFBQSxDQUFPLE1BQUEsQ0FFbEMsSUFBTXlGLENBQUFBLENBQVVwRSxDQUFBQSxDQUFRLE9BQUEsRUFBV2tFLENBQUFBLENBQUUsT0FBQSxDQUMvQkcsQ0FBQUEsQ0FBNEIsQ0FDaEMsS0FBQSxDQUFPckUsQ0FBQUEsQ0FBUSxLQUFBLEVBQVNrRSxDQUFBQSxDQUFFLEtBQUEsQ0FDMUIsTUFBQSxDQUFRbEUsQ0FBQUEsQ0FBUSxNQUFBLEVBQVVrRSxDQUFBQSxDQUFFLE1BQUEsQ0FDNUIsR0FBQSxDQUFLbEUsRUFBUSxHQUFBLEVBQU9rRSxDQUFBQSxDQUFFLEdBQUEsQ0FDdEIsUUFBQSxDQUFVbEUsQ0FBQUEsQ0FBUSxRQUFBLEVBQVlrRSxDQUFBQSxDQUFFLFFBQUEsQ0FDaEMsU0FBQSxDQUFXbEUsQ0FBQUEsQ0FBUSxTQUFBLEVBQWFrRSxDQUFBQSxDQUFFLFNBQUEsQ0FDbEMsYUFBQSxDQUFlbEUsRUFBUSxhQUFBLEVBQWlCa0UsQ0FBQUEsQ0FBRSxhQUFBLENBQzFDLGFBQUEsQ0FBZWxFLENBQUFBLENBQVEsYUFBQSxFQUFpQmtFLENBQUFBLENBQUUsYUFBQSxDQUMxQyxPQUFBLENBQUFFLENBQ0YsQ0FBQSxDQUVNRSxDQUFBQSxDQUFTakksSUFBQUEsQ0FBS2tJLE1BQUFBLEdBQVUsS0FBQSxDQUFPQyxVQUFBQSxFQUFZLENBQUEsQ0FDakQsTUFBTUMsS0FBQUEsQ0FBTUgsQ0FBQUEsQ0FBUSxDQUFFLFNBQUEsQ0FBVyxJQUFLLENBQUMsQ0FBQSxDQUN2QyxJQUFNWCxDQUFBQSxDQUFhdEgsSUFBQUEsQ0FBS2lJLENBQUFBLENBQVEsVUFBVSxDQUFBLENBRXBDSSxDQUFBQSxDQUFLLFdBQUEsQ0FBWSxHQUFBLEVBQUksQ0FDckJkLENBQUFBLENBQVMsTUFBTUYsRUFBQUEsQ0FBZ0JDLENBQVUsQ0FBQSxDQUN6Q2dCLENBQUFBLENBQVMsTUFBTVgsRUFBQUEsQ0FBVUMsRUFBUSxDQUFFLEdBQUdJLENBQUFBLENBQVksTUFBQSxDQUFBMUYsQ0FBTyxDQUFBLENBQUdnRixDQUFVLENBQUEsQ0FFdEVpQixDQUFBQSxDQUFVLElBQU0sQ0FDcEI1RixDQUFBQSxDQUFPLEtBQUEsQ0FBTTZCLENBQUFBLENBQUssU0FBUyxDQUFBLENBQzNCLElBQU1nRSxDQUFBQSxDQUFNRixDQUFBQSxDQUFPLE9BQUEsQ0FBUSxHQUFBLENBQ3ZCRSxDQUFBQSxDQUFLQyxFQUFBQSxDQUFTRCxDQUFHLENBQUEsQ0FDaEJGLENBQUFBLENBQU8sT0FBQSxDQUFRLElBQUEsRUFBSyxDQUN6QkksT0FBT1QsQ0FBQUEsQ0FBUSxDQUFFLFNBQUEsQ0FBVyxJQUFBLENBQU0sS0FBQSxDQUFPLElBQUssQ0FBQyxFQUNqRCxDQUFBLENBQ0EzRixDQUFBQSxFQUFRLGdCQUFBLENBQWlCLE9BQUEsQ0FBU2lHLENBQUFBLENBQVMsQ0FBRSxJQUFBLENBQU0sSUFBSyxDQUFDLENBQUEsQ0FFekQsR0FBSSxDQUNGLElBQU1JLENBQUFBLENBQVFDLENBQUFBLEdBQWVqRyxDQUFBQSxDQUFPLElBQUEsQ0FBSzZCLENBQUFBLENBQUssQ0FBQSxFQUFHb0QsQ0FBTSxDQUFBLFdBQUEsRUFBY2dCLENBQUMsR0FBRyxDQUFBLENBQUdqRixDQUFBQSxDQUFRLFVBQUEsR0FBYWlGLENBQUMsQ0FBQSxDQUFBLENBQzVGdEQsQ0FBQUEsQ0FBUyxJQUFJLE9BQUEsQ0FBd0IsTUFBT3ZELENBQUFBLENBQVNDLENBQUFBLEdBQVcsQ0FBQSxDQUNuRSxNQUFNdUYsQ0FBQUEsQ0FBTyxtQkFBa0IsRUFDN0IsRUFBQSxDQUFHLE9BQUEsQ0FBUyxJQUFNdkYsQ0FBQUEsQ0FBTyxJQUFJLEtBQUEsQ0FBTSwyQkFBMkIsQ0FBQyxDQUFDLENBQUEsQ0FDaEUsRUFBQSxDQUFHLFNBQUEsQ0FBVyxJQUFNTSxHQUFRLE9BQUEsRUFBV04sQ0FBQUEsQ0FBT00sQ0FBQUEsQ0FBTyxNQUFNLENBQUMsQ0FBQSxDQUM1RCxFQUFBLENBQUcsVUFBQSxDQUFZcUcsQ0FBSSxDQUFBLENBQ25CLEVBQUEsQ0FBRyxNQUFBLENBQVE1RyxDQUFPLENBQUEsQ0FDbEIsRUFBQSxDQUFHLE9BQUEsQ0FBU0MsQ0FBTSxFQUN2QixDQUFDLENBQUEsQ0FBRSxPQUFBLENBQVEsSUFBTXVGLENBQUFBLENBQU8sS0FBQSxFQUFPLENBQUEsQ0FDL0JvQixDQUFBQSxDQUFLLENBQUMsQ0FBQSxDQUNOLElBQU1FLEVBQVUsTUFBTSxPQUFBLENBQVEsSUFBQSxDQUFLLENBQUN2RCxDQUFBQSxDQUFRZ0QsQ0FBQUEsQ0FBTyxJQUFJLENBQUMsQ0FBQSxDQUN4RCxPQUFBdkMsRUFBQUEsQ0FBRzhDLENBQUFBLENBQVMscUJBQXFCLENBQUEsQ0FDakNGLEVBQUssR0FBRyxDQUFBLENBQ1JoRyxDQUFBQSxDQUFPLElBQUEsQ0FBSzZCLENBQUFBLENBQUssQ0FBQSxLQUFBLEVBQVF1RCxDQUFPLENBQUEsSUFBQSxFQUFPLElBQUEsQ0FBSyxLQUFBLENBQU0sV0FBQSxDQUFZLEdBQUEsRUFBSSxDQUFJTSxDQUFFLENBQUMsQ0FBQSxFQUFBLENBQUksQ0FBQSxDQUN0RSxDQUFFLEdBQUdRLENBQUFBLENBQVMsT0FBQSxDQUFTYixDQUFXLENBQzNDLENBQUEsTUFBU2MsQ0FBQUEsQ0FBRyxDQUNWLE1BQUl4RyxDQUFBQSxFQUFRLE9BQUEsQ0FBZUEsQ0FBQUEsQ0FBTyxNQUFBLENBQzVCd0csQ0FDUixDQUFBLE9BQUUsQ0FDQUosTUFBQUEsQ0FBT1QsQ0FBQUEsQ0FBUSxDQUFFLFNBQUEsQ0FBVyxJQUFBLENBQU0sS0FBQSxDQUFPLElBQUssQ0FBQyxFQUNqRCxDQUNGIiwiZmlsZSI6ImNodW5rLTNQT1pLUktILmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ3JlYXRlZCBieSBBdXRva2FrYSAocXExOTA5Njk4NDk0QGdtYWlsLmNvbSkgb24gMjAyNi8wMi8yNS5cblxuZXhwb3J0IHR5cGUgRW52UGFyc2VyPFQ+ID0gKHZhbHVlOiB1bmtub3duKSA9PiBUO1xuXG5leHBvcnQgZnVuY3Rpb24gcGVudjxUPihuYW1lOiBzdHJpbmcsIHBhcnNlcjogRW52UGFyc2VyPFQ+LCBkZWZhdWx0VmFsdWU6IFQpOiBUO1xuZXhwb3J0IGZ1bmN0aW9uIHBlbnY8VD4obmFtZTogc3RyaW5nLCBwYXJzZXI6IEVudlBhcnNlcjxUPiwgZGVmYXVsdFZhbHVlPzogVCk6IFQgfCB1bmRlZmluZWQ7XG5leHBvcnQgZnVuY3Rpb24gcGVudjxUPihuYW1lOiBzdHJpbmcsIHBhcnNlcjogRW52UGFyc2VyPFQ+LCBkZWZhdWx0VmFsdWU/OiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHBhcnNlcihwcm9jZXNzLmVudltuYW1lXSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gIH1cbn1cbiIsIi8vIENyZWF0ZWQgYnkgQXV0b2tha2EgKHFxMTkwOTY5ODQ5NEBnbWFpbC5jb20pIG9uIDIwMjYvMDEvMzAuXG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU51bWJlcih4OiB1bmtub3duKTogbnVtYmVyIHtcbiAgaWYgKHR5cGVvZiB4ID09PSBcIm51bWJlclwiKSB7XG4gICAgcmV0dXJuIHg7XG4gIH1cbiAgY29uc3QgbnVtID0gTnVtYmVyKHgpO1xuICBpZiAoTnVtYmVyLmlzTmFOKG51bSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFZhbHVlICR7eH0gaXMgbm90IGEgdmFsaWQgbnVtYmVyYCk7XG4gIH1cbiAgcmV0dXJuIG51bTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU3RyaW5nKHg6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIHggPT09IFwic3RyaW5nXCIpIHJldHVybiB4O1xuICByZXR1cm4gU3RyaW5nKHgpO1xufVxuIiwiLy8gQ3JlYXRlZCBieSBBdXRva2FrYSAocXExOTA5Njk4NDk0QGdtYWlsLmNvbSkgb24gMjAyNi8wMi8wOS5cblxuaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gXCJtb2R1bGVcIjtcbmltcG9ydCB7IGRpcm5hbWUsIGpvaW4gfSBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgcGVudiB9IGZyb20gXCIuL2VudlwiO1xuaW1wb3J0IHsgcGFyc2VOdW1iZXIgfSBmcm9tIFwiLi9wYXJzZXJcIjtcblxuY29uc3QgcmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKTtcbmNvbnN0IGVudiA9IHByb2Nlc3MuZW52O1xuXG5leHBvcnQgY29uc3QgcHVwTG9nTGV2ZWwgPSBwZW52KFwiUFVQX0xPR19MRVZFTFwiLCBwYXJzZU51bWJlciwgMik7XG5leHBvcnQgY29uc3QgcHVwVXNlSW5uZXJQcm94eSA9IGVudltcIlBVUF9VU0VfSU5ORVJfUFJPWFlcIl0gPT09IFwiMVwiO1xuZXhwb3J0IGNvbnN0IHB1cERpc2FibGVHUFUgPSBlbnZbXCJQVVBfRElTQUJMRV9HUFVcIl0gPT09IFwiMVwiO1xuZXhwb3J0IGNvbnN0IHB1cERldGVybWluaXN0aWMgPSBlbnZbXCJQVVBfREVURVJNSU5JU1RJQ1wiXSA9PT0gXCIxXCI7XG5cbmV4cG9ydCBjb25zdCBwdXBQa2dSb290ID0gZGlybmFtZShyZXF1aXJlLnJlc29sdmUoXCJwdXAtcmVjb3JkZXIvcGFja2FnZS5qc29uXCIpKTtcbmV4cG9ydCBjb25zdCBwdXBBcHAgPSBqb2luKHB1cFBrZ1Jvb3QsIFwiZGlzdFwiLCBcImFwcC5janNcIik7XG5leHBvcnQgY29uc3QgcHVwSXBjU29ja2V0ID0gZW52W1wiUFVQX0lQQ19TT0NLRVRcIl07XG4iLCIvLyBDcmVhdGVkIGJ5IEF1dG9rYWthIChxcTE5MDk2OTg0OTRAZ21haWwuY29tKSBvbiAyMDI2LzAyLzA2LlxuXG5pbXBvcnQgeyBDaGlsZFByb2Nlc3MsIHR5cGUgU2VyaWFsaXphYmxlIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IExvZyB9IGZyb20gXCJub2RlLWF2XCI7XG5pbXBvcnQgeyBBVl9MT0dfRVJST1IsIEFWX0xPR19XQVJOSU5HIH0gZnJvbSBcIm5vZGUtYXYvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBwdXBMb2dMZXZlbCB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIExvZ2dlckxpa2Uge1xuICBkZWJ1Zz8odGhpczogdm9pZCwgLi4ubWVzc2FnZXM6IHVua25vd25bXSk6IHZvaWQ7XG5cbiAgaW5mbz8odGhpczogdm9pZCwgLi4ubWVzc2FnZXM6IHVua25vd25bXSk6IHZvaWQ7XG5cbiAgd2Fybj8odGhpczogdm9pZCwgLi4ubWVzc2FnZXM6IHVua25vd25bXSk6IHZvaWQ7XG5cbiAgZXJyb3I/KHRoaXM6IHZvaWQsIC4uLm1lc3NhZ2VzOiB1bmtub3duW10pOiB2b2lkO1xufVxuXG5jb25zdCBERUJVRyA9IFwiPHB1cEBkZWJ1Zz5cIjtcbmNvbnN0IElORk8gPSBcIjxwdXBAaW5mbz5cIjtcbmNvbnN0IFdBUk4gPSBcIjxwdXBAd2Fybj5cIjtcbmNvbnN0IEVSUk9SID0gXCI8cHVwQGVycm9yPlwiO1xuY29uc3QgRkFUQUwgPSBcIjxwdXBAZmF0YWw+XCI7XG5cbmZ1bmN0aW9uIHN0YWNrSG9vayh0YXJnZXQ6IEZ1bmN0aW9uLCBfY29udGV4dDogQ2xhc3NNZXRob2REZWNvcmF0b3JDb250ZXh0KSB7XG4gIHJldHVybiBmdW5jdGlvbiAodGhpczogTG9nZ2VyLCAuLi5tZXNzYWdlczogdW5rbm93bltdKSB7XG4gICAgY29uc3QgcHJvY2Vzc2VkID0gbWVzc2FnZXMubWFwKChtc2cpID0+IHtcbiAgICAgIHJldHVybiBtc2cgaW5zdGFuY2VvZiBFcnJvciA/IChtc2cuc3RhY2sgPz8gU3RyaW5nKG1zZykpIDogbXNnO1xuICAgIH0pO1xuICAgIHJldHVybiB0YXJnZXQuY2FsbCh0aGlzLCAuLi5wcm9jZXNzZWQpO1xuICB9O1xufVxuXG5leHBvcnQgY2xhc3MgTG9nZ2VyIGltcGxlbWVudHMgTG9nZ2VyTGlrZSB7XG4gIHByaXZhdGUgX2ltcGw/OiBMb2dnZXJMaWtlO1xuXG4gIGdldCBsZXZlbCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9sZXZlbDtcbiAgfVxuXG4gIHNldCBsZXZlbCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbGV2ZWwgPSB2YWx1ZTtcbiAgICB0aGlzLmltcGwgPSB0aGlzLl9pbXBsID8/IGNvbnNvbGU7XG4gIH1cblxuICBnZXQgaW1wbCgpOiBMb2dnZXJMaWtlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5faW1wbDtcbiAgfVxuXG4gIHNldCBpbXBsKHZhbHVlOiBMb2dnZXJMaWtlKSB7XG4gICAgY29uc3QgZGVidWcgPSB2YWx1ZS5kZWJ1ZyA/PyBjb25zb2xlLmRlYnVnO1xuICAgIGNvbnN0IGluZm8gPSB2YWx1ZS5pbmZvID8/IGNvbnNvbGUuaW5mbztcbiAgICBjb25zdCB3YXJuID0gdmFsdWUud2FybiA/PyBjb25zb2xlLndhcm47XG4gICAgY29uc3QgZXJyb3IgPSB2YWx1ZS5lcnJvciA/PyBjb25zb2xlLmVycm9yO1xuICAgIGNvbnN0IGx2ID0gdGhpcy5fbGV2ZWw7XG4gICAgdGhpcy5faW1wbCA9IHtcbiAgICAgIGRlYnVnOiBsdiA+PSAzID8gZGVidWcgOiB1bmRlZmluZWQsXG4gICAgICBpbmZvOiBsdiA+PSAyID8gaW5mbyA6IHVuZGVmaW5lZCxcbiAgICAgIHdhcm46IGx2ID49IDEgPyB3YXJuIDogdW5kZWZpbmVkLFxuICAgICAgZXJyb3I6IGx2ID49IDAgPyBlcnJvciA6IHVuZGVmaW5lZCxcbiAgICB9O1xuICB9XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfbGV2ZWw6IG51bWJlciA9IHB1cExvZ0xldmVsKSB7XG4gICAgdGhpcy5pbXBsID0gY29uc29sZTtcbiAgfVxuXG4gIEBzdGFja0hvb2tcbiAgZGVidWcoLi4ubWVzc2FnZXM6IHVua25vd25bXSk6IHZvaWQge1xuICAgIHRoaXMuaW1wbD8uZGVidWc/LihERUJVRywgLi4ubWVzc2FnZXMpO1xuICB9XG5cbiAgQHN0YWNrSG9va1xuICBpbmZvKC4uLm1lc3NhZ2VzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICB0aGlzLmltcGw/LmluZm8/LihJTkZPLCAuLi5tZXNzYWdlcyk7XG4gIH1cblxuICBAc3RhY2tIb29rXG4gIHdhcm4oLi4ubWVzc2FnZXM6IHVua25vd25bXSk6IHZvaWQge1xuICAgIHRoaXMuaW1wbD8ud2Fybj8uKFdBUk4sIC4uLm1lc3NhZ2VzKTtcbiAgfVxuXG4gIEBzdGFja0hvb2tcbiAgZXJyb3IoLi4ubWVzc2FnZXM6IHVua25vd25bXSk6IHZvaWQge1xuICAgIHRoaXMuaW1wbD8uZXJyb3I/LihFUlJPUiwgLi4ubWVzc2FnZXMpO1xuICB9XG5cbiAgQHN0YWNrSG9va1xuICBmYXRhbCguLi5tZXNzYWdlczogdW5rbm93bltdKTogdm9pZCB7XG4gICAgdGhpcy5pbXBsPy5lcnJvcj8uKEZBVEFMLCAuLi5tZXNzYWdlcyk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgcHJpdmF0ZSBkaXNwYXRjaChtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBtc2cgPSBtZXNzYWdlLnRyaW1FbmQoKTtcbiAgICBpZiAobXNnLnN0YXJ0c1dpdGgoREVCVUcpKSB7XG4gICAgICB0aGlzLmRlYnVnKG1zZy5zbGljZShERUJVRy5sZW5ndGggKyAxKSk7XG4gICAgfSBlbHNlIGlmIChtc2cuc3RhcnRzV2l0aChJTkZPKSkge1xuICAgICAgdGhpcy5pbmZvKG1zZy5zbGljZShJTkZPLmxlbmd0aCArIDEpKTtcbiAgICB9IGVsc2UgaWYgKG1zZy5zdGFydHNXaXRoKFdBUk4pKSB7XG4gICAgICB0aGlzLndhcm4obXNnLnNsaWNlKFdBUk4ubGVuZ3RoICsgMSkpO1xuICAgIH0gZWxzZSBpZiAobXNnLnN0YXJ0c1dpdGgoRVJST1IpKSB7XG4gICAgICB0aGlzLmVycm9yKG1zZy5zbGljZShFUlJPUi5sZW5ndGggKyAxKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW5mbyhtc2cpO1xuICAgIH1cbiAgfVxuXG4gIGF0dGFjaChwcm9jOiBDaGlsZFByb2Nlc3MsIG5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmRlYnVnKGAke25hbWV9LmF0dGFjaGApO1xuICAgICAgbGV0IGZhdGFsOiBzdHJpbmcgPSBcIlwiO1xuICAgICAgY29uc3QgZGlzcGF0Y2ggPSAoZGF0YTogQnVmZmVyIHwgU2VyaWFsaXphYmxlKSA9PiB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBkYXRhLnRvU3RyaW5nKCk7XG4gICAgICAgIGlmIChtZXNzYWdlLnN0YXJ0c1dpdGgoRkFUQUwpKSB7XG4gICAgICAgICAgZmF0YWwgKz0gbWVzc2FnZS5zbGljZShGQVRBTC5sZW5ndGggKyAxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmRpc3BhdGNoKG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgcHJvYy5zdGRlcnI/Lm9uKFwiZGF0YVwiLCBkaXNwYXRjaCk7XG4gICAgICBwcm9jLnN0ZG91dD8ub24oXCJkYXRhXCIsIGRpc3BhdGNoKTtcbiAgICAgIHByb2NcbiAgICAgICAgLm9uKFwibWVzc2FnZVwiLCBkaXNwYXRjaClcbiAgICAgICAgLm9uKFwiZXJyb3JcIiwgKGVycikgPT4ge1xuICAgICAgICAgIGZhdGFsICs9IGVyci5tZXNzYWdlO1xuICAgICAgICAgIHByb2Mua2lsbCgpO1xuICAgICAgICB9KVxuICAgICAgICAub25jZShcImNsb3NlXCIsIChjb2RlLCBzaWduYWwpID0+IHtcbiAgICAgICAgICBpZiAoY29kZSB8fCBzaWduYWwgfHwgZmF0YWwpIHtcbiAgICAgICAgICAgIGZhdGFsIHx8PSBgY29tbWFuZCBmYWlsZWQ6ICR7cHJvYy5zcGF3bmFyZ3Muam9pbihcIiBcIil9YDtcbiAgICAgICAgICAgIHRoaXMuZGVidWcoYCR7bmFtZX0uY2xvc2VgLCB7IGNvZGUsIHNpZ25hbCwgZmF0YWwgfSk7XG4gICAgICAgICAgICByZWplY3QobmV3IEVycm9yKGZhdGFsKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGVidWcoYCR7bmFtZX0uY2xvc2VgKTtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5vbihcInVuaGFuZGxlZFJlamVjdGlvblwiLCAocmVhc29uKSA9PiB7XG4gICAgICAgICAgdGhpcy5lcnJvcihgJHtuYW1lfS51bmhhbmRsZWRgLCByZWFzb24pO1xuICAgICAgICB9KVxuICAgICAgICAub24oXCJ1bmNhdWdodEV4Y2VwdGlvbk1vbml0b3JcIiwgKGVycikgPT4ge1xuICAgICAgICAgIHRoaXMuZXJyb3IoYCR7bmFtZX0udW5oYW5kbGVkYCwgZXJyKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn1cblxuY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcigpO1xuXG4vLyBSb3V0ZSBmZm1wZWcgbmF0aXZlIGxvZ3MgdGhyb3VnaCBwdXAncyBsb2dnZXIuXG5Mb2cuc2V0Q2FsbGJhY2soKGxldmVsLCBtZXNzYWdlKSA9PiB7XG4gIGNvbnN0IG1zZyA9IG1lc3NhZ2UudHJpbUVuZCgpO1xuICBpZiAoIW1zZykgcmV0dXJuO1xuICBpZiAobGV2ZWwgPD0gQVZfTE9HX0VSUk9SKSBsb2dnZXIuZXJyb3IobXNnKTtcbiAgZWxzZSBpZiAobGV2ZWwgPD0gQVZfTE9HX1dBUk5JTkcpIGxvZ2dlci53YXJuKG1zZyk7XG59KTtcblxuZXhwb3J0IHsgbG9nZ2VyIH07XG4iLCIvLyBDcmVhdGVkIGJ5IEF1dG9rYWthIChxcTE5MDk2OTg0OTRAZ21haWwuY29tKSBvbiAyMDI2LzAyLzI0LlxuXG5leHBvcnQgZnVuY3Rpb24gbm9lcnI8Rm4gZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGFueSwgRD4oXG4gIGZuOiBGbixcbiAgZGVmYXVsdFZhbHVlOiBELFxuKTogKC4uLmFyZ3M6IFBhcmFtZXRlcnM8Rm4+KSA9PiBSZXR1cm5UeXBlPEZuPiB8IEQge1xuICByZXR1cm4gKC4uLmFyZ3MpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmV0ID0gZm4oLi4uYXJncyk7XG4gICAgICBpZiAocmV0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICByZXR1cm4gcmV0LmNhdGNoKCgpID0+IGRlZmF1bHRWYWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmV0O1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICB9XG4gIH07XG59XG4iLCIvLyBDcmVhdGVkIGJ5IEF1dG9rYWthIChxcTE5MDk2OTg0OTRAZ21haWwuY29tKSBvbiAyMDI2LzAxLzMwLlxuXG5pbXBvcnQgeyBzcGF3biwgdHlwZSBDaGlsZFByb2Nlc3MsIHR5cGUgU3Bhd25PcHRpb25zIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gXCIuL2xvZ2dpbmdcIjtcblxuZXhwb3J0IGNvbnN0IFBVUF9BUkdTX0tFWSA9IFwiLS1wdXAtcHJpdi1hcmdzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJncygpIHtcbiAgY29uc3QgYXJndiA9IHByb2Nlc3MuYXJndjtcbiAgbGV0IHByaXYgPSBhcmd2LmZpbmQoKGFyZykgPT4gYXJnLnN0YXJ0c1dpdGgoUFVQX0FSR1NfS0VZKSk7XG4gIGlmICghcHJpdikge1xuICAgIGxvZ2dlci5kZWJ1ZyhcInByb2Nhcmd2XCIsIGFyZ3YpO1xuICAgIHJldHVybiBwcm9jZXNzLmFyZ3Y7XG4gIH1cbiAgY29uc3QgYXJncyA9IFtcImV4ZWNcIiwgLi4uYXJndi5zbGljZSgtMSldO1xuICBwcml2ID0gQnVmZmVyLmZyb20ocHJpdi5zcGxpdChcIj1cIilbMV0hLCBcImJhc2U2NFwiKS50b1N0cmluZygpO1xuICBhcmdzLnB1c2goLi4uSlNPTi5wYXJzZShwcml2KSk7XG4gIGxvZ2dlci5kZWJ1ZyhcInB1cGFyZ3NcIiwgYXJncyk7XG4gIHJldHVybiBhcmdzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NIYW5kbGUge1xuICBwcm9jZXNzOiBDaGlsZFByb2Nlc3M7XG4gIHdhaXQ6IFByb21pc2U8dm9pZD47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleGVjKGNtZDogc3RyaW5nLCBvcHRpb25zPzogU3Bhd25PcHRpb25zKTogUHJvY2Vzc0hhbmRsZSB7XG4gIGNvbnN0IHBhcnRzID0gY21kLnNwbGl0KFwiIFwiKS5maWx0ZXIoKHMpID0+IHMubGVuZ3RoKTtcbiAgY29uc3QgW2NvbW1hbmQsIC4uLmFyZ3NdID0gcGFydHM7XG4gIGlmICghY29tbWFuZCkgdGhyb3cgbmV3IEVycm9yKFwiZW1wdHkgY29tbWFuZFwiKTtcbiAgY29uc3QgcHJvYyA9IHNwYXduKGNvbW1hbmQsIGFyZ3MsIHtcbiAgICBzdGRpbzogXCJpbmhlcml0XCIsXG4gICAgLi4ub3B0aW9ucyxcbiAgfSk7XG4gIHJldHVybiB7IHByb2Nlc3M6IHByb2MsIHdhaXQ6IGxvZ2dlci5hdHRhY2gocHJvYywgY29tbWFuZCkgfTtcbn1cbiIsIi8vIENyZWF0ZWQgYnkgQXV0b2tha2EgKHFxMTkwOTY5ODQ5NEBnbWFpbC5jb20pIG9uIDIwMjYvMDIvMDYuXG5cbmltcG9ydCB6IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB7IHB1cERldGVybWluaXN0aWMsIHB1cFVzZUlubmVyUHJveHkgfSBmcm9tIFwiLi4vYmFzZS9jb25zdGFudHNcIjtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfV0lEVEggPSAxOTIwO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfSEVJR0hUID0gMTA4MDtcbmV4cG9ydCBjb25zdCBERUZBVUxUX0ZQUyA9IDMwO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfRFVSQVRJT04gPSA1O1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfT1VUX0ZJTEUgPSBcIm91dHB1dC5tb3ZcIjtcblxuZXhwb3J0IGNvbnN0IFJlbmRlclNjaGVtYSA9IHoub2JqZWN0KHtcbiAgZHVyYXRpb246IHoubnVtYmVyKCkuZGVzY3JpYmUoXCJEdXJhdGlvbiBpbiBzZWNvbmRzXCIpLFxuICB3aWR0aDogei5udW1iZXIoKS5kZXNjcmliZShcIlZpZGVvIHdpZHRoXCIpLFxuICBoZWlnaHQ6IHoubnVtYmVyKCkuZGVzY3JpYmUoXCJWaWRlbyBoZWlnaHRcIiksXG4gIGZwczogei5udW1iZXIoKS5kZXNjcmliZShcIkZyYW1lcyBwZXIgc2Vjb25kXCIpLFxuICB3aXRoQXVkaW86IHouYm9vbGVhbigpLmRlc2NyaWJlKFwiQ2FwdHVyZSBhbmQgZW5jb2RlIGF1ZGlvXCIpLFxuICBvdXRGaWxlOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiT3V0cHV0IG1wNCBmaWxlIHBhdGhcIiksXG4gIHVzZUlubmVyUHJveHk6IHouYm9vbGVhbigpLmRlc2NyaWJlKFwiVXNlIGJpbGliaWxpIGlubmVyIHByb3h5IGZvciByZXNvdXJjZSBhY2Nlc3NcIiksXG4gIGRldGVybWluaXN0aWM6IHouYm9vbGVhbigpLmRlc2NyaWJlKFwiUmVuZGVyIGJ5IGZyYW1lIHJhdGhlciB0aGFuIHJlY29yZGluZ1wiKSxcbn0pO1xuXG5leHBvcnQgdHlwZSBSZW5kZXJPcHRpb25zID0gei5pbmZlcjx0eXBlb2YgUmVuZGVyU2NoZW1hPjtcblxuZXhwb3J0IGludGVyZmFjZSBSZW5kZXJSZXN1bHQge1xuICBvcHRpb25zOiBSZW5kZXJPcHRpb25zO1xuICB3cml0dGVuOiBudW1iZXI7XG4gIGphbms6IG51bWJlcjtcbiAgb3V0RmlsZTogc3RyaW5nO1xufVxuXG5leHBvcnQgY29uc3QgZGVmYXVsdFJlbmRlck9wdGlvbnM6IFJlbmRlck9wdGlvbnMgPSB7XG4gIHdpZHRoOiBERUZBVUxUX1dJRFRILFxuICBoZWlnaHQ6IERFRkFVTFRfSEVJR0hULFxuICBmcHM6IERFRkFVTFRfRlBTLFxuICBkdXJhdGlvbjogREVGQVVMVF9EVVJBVElPTixcbiAgb3V0RmlsZTogREVGQVVMVF9PVVRfRklMRSxcbiAgd2l0aEF1ZGlvOiBmYWxzZSxcbiAgdXNlSW5uZXJQcm94eTogcHVwVXNlSW5uZXJQcm94eSxcbiAgZGV0ZXJtaW5pc3RpYzogcHVwRGV0ZXJtaW5pc3RpYyxcbn07XG4iLCIvLyBDcmVhdGVkIGJ5IEF1dG9rYWthIChxcTE5MDk2OTg0OTRAZ21haWwuY29tKSBvbiAyMDI2LzAyLzI3LlxuXG5pbXBvcnQgeyByZWFkZGlyIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBwbGF0Zm9ybSB9IGZyb20gXCJvc1wiO1xuaW1wb3J0IHsgZ3JhcGhpY3MgfSBmcm9tIFwic3lzdGVtaW5mb3JtYXRpb25cIjtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gXCIuL2xvZ2dpbmdcIjtcblxuY29uc3QgVEFHID0gXCJbSFdBY2NlbF1cIjtcblxuY29uc3Qgc29mdHdhcmVWZW5kb3JzID0gW1wibWljcm9zb2Z0XCIsIFwidm13YXJlXCIsIFwidmlydHVhbGJveFwiLCBcImxsdm1waXBlXCIsIFwic29mdHBpcGVcIiwgXCJzd2lmdHNoYWRlclwiXTtcblxuZnVuY3Rpb24gaXNTb2Z0d2FyZVJlbmRlcmVyKHZlbmRvcjogc3RyaW5nKSB7XG4gIGNvbnN0IGxvd2VyID0gdmVuZG9yLnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiBzb2Z0d2FyZVZlbmRvcnMuc29tZSgodikgPT4gbG93ZXIuaW5jbHVkZXModikpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBkZXRlY3RHUFVEcml2ZXIoKSB7XG4gIGNvbnN0IHsgY29udHJvbGxlcnMgfSA9IGF3YWl0IGdyYXBoaWNzKCk7XG4gIGlmIChwbGF0Zm9ybSgpID09PSBcImxpbnV4XCIpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCByZWFkZGlyKFwiL2Rldi9kcmlcIik7XG4gICAgICByZXR1cm4gZmlsZXMuc29tZSgoZikgPT4gZi5zdGFydHNXaXRoKFwicmVuZGVyRFwiKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIGxvZ2dlci5kZWJ1ZyhUQUcsIFwiR1BVIGNvbnRyb2xsZXJzOlwiLCBjb250cm9sbGVycyk7XG4gIHJldHVybiBjb250cm9sbGVycy5zb21lKChjKSA9PiBjLnZlbmRvci5sZW5ndGggPiAwICYmICFpc1NvZnR3YXJlUmVuZGVyZXIoYy52ZW5kb3IpKTtcbn1cblxuZXhwb3J0IGNvbnN0IGNhbklVc2VHUFUgPSBkZXRlY3RHUFVEcml2ZXIoKS50aGVuKChyZXN1bHQpID0+IHtcbiAgbG9nZ2VyLmRlYnVnKFRBRywgXCJncHU6XCIsIHJlc3VsdCk7XG4gIHJldHVybiByZXN1bHQ7XG59KTtcbiIsIi8vIENyZWF0ZWQgYnkgQXV0b2tha2EgKHFxMTkwOTY5ODQ5NEBnbWFpbC5jb20pIG9uIDIwMjYvMDIvMjUuXG5cbmltcG9ydCB7IG9rIH0gZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IGVsZWN0cm9uLCB7IHR5cGUgU2l6ZSB9IGZyb20gXCJlbGVjdHJvblwiO1xuaW1wb3J0IHsgc3RhdCB9IGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHsgcGxhdGZvcm0gfSBmcm9tIFwib3NcIjtcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tIFwidXJsXCI7XG5pbXBvcnQgeyBwdXBBcHAsIHB1cERpc2FibGVHUFUsIHB1cExvZ0xldmVsIH0gZnJvbSBcIi4uL2Jhc2UvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBjYW5JVXNlR1BVIH0gZnJvbSBcIi4uL2Jhc2UvaHdhY2NlbFwiO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIi4uL2Jhc2UvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgZXhlYywgUFVQX0FSR1NfS0VZIH0gZnJvbSBcIi4uL2Jhc2UvcHJvY2Vzc1wiO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZWxlY3Ryb25PcHRzKCkge1xuICBjb25zdCBvcHRzID0gW1xuICAgIC8vIOWuueWZqOaymeeusVxuICAgIFwibm8tc2FuZGJveFwiLFxuICAgIFwiZGlzYWJsZS1kZXYtc2htLXVzYWdlXCIsXG4gICAgLy8g6Leo5Z+fL+WuieWFqFxuICAgIFwiZGlzYWJsZS13ZWItc2VjdXJpdHlcIixcbiAgICBcImRpc2FibGUtc2l0ZS1pc29sYXRpb24tdHJpYWxzXCIsXG4gICAgXCJpZ25vcmUtY2VydGlmaWNhdGUtZXJyb3JzXCIsXG4gICAgLy8g5b2V5Yi26KGM5Li6XG4gICAgXCJkaXNhYmxlLWJsaW5rLWZlYXR1cmVzPUF1dG9tYXRpb25Db250cm9sbGVkXCIsXG4gICAgXCJtdXRlLWF1ZGlvXCIsXG4gICAgXCJhdXRvcGxheS1wb2xpY3k9bm8tdXNlci1nZXN0dXJlLXJlcXVpcmVkXCIsXG4gICAgXCJkaXNhYmxlLWV4dGVuc2lvbnNcIixcbiAgICAvLyDmuLLmn5NcbiAgICBcImhlYWRsZXNzPW5ld1wiLFxuICAgIFwiZm9yY2UtZGV2aWNlLXNjYWxlLWZhY3Rvcj0xXCIsXG4gICAgXCJmb3JjZS1jb2xvci1wcm9maWxlPXNyZ2JcIixcbiAgICBcImlnbm9yZS1ncHUtYmxvY2tsaXN0XCIsXG4gICAgXCJ1c2UtZ2w9YW5nbGVcIixcbiAgICBcImRldGVybWluaXN0aWMtbW9kZVwiLFxuICAgIFwiZW5hYmxlLWJlZ2luLWZyYW1lLWNvbnRyb2xcIixcbiAgICBcImRpc2FibGUtbmV3LWNvbnRlbnQtcmVuZGVyaW5nLXRpbWVvdXRcIixcbiAgICBcInJ1bi1hbGwtY29tcG9zaXRvci1zdGFnZXMtYmVmb3JlLWRyYXdcIixcbiAgICBcImRpc2FibGUtdGhyZWFkZWQtYW5pbWF0aW9uXCIsXG4gICAgXCJkaXNhYmxlLXRocmVhZGVkLXNjcm9sbGluZ1wiLFxuICAgIFwiZGlzYWJsZS1jaGVja2VyLWltYWdpbmdcIixcbiAgICBcImRpc2FibGUtaW1hZ2UtYW5pbWF0aW9uLXJlc3luY1wiLFxuICAgIFwiZW5hYmxlLXN1cmZhY2Utc3luY2hyb25pemF0aW9uXCIsXG4gICAgLy8g6LWE5rqQ5o6n5Yi2XG4gICAgXCJkaXNhYmxlLWJhY2tncm91bmQtbmV0d29ya2luZ1wiLFxuICBdO1xuICBpZiAocHVwTG9nTGV2ZWwgPCAzKSB7XG4gICAgb3B0cy5wdXNoKFwibG9nLWxldmVsPTNcIik7XG4gIH1cblxuICBjb25zdCBlbmFibGVHcHUgPSAoYXdhaXQgY2FuSVVzZUdQVSkgJiYgIXB1cERpc2FibGVHUFU7XG4gIGlmICghZW5hYmxlR3B1KSB7XG4gICAgb3B0cy5wdXNoKFwidXNlLWFuZ2xlPXN3aWZ0c2hhZGVyXCIsIFwiZW5hYmxlLXVuc2FmZS1zd2lmdHNoYWRlclwiKTtcbiAgICByZXR1cm4gb3B0cztcbiAgfVxuXG4gIG9wdHMucHVzaChcImRpc2FibGUtZ3B1LXNhbmRib3hcIiwgXCJlbmFibGUtdW5zYWZlLXdlYmdwdVwiKTtcbiAgY29uc3QgcGxhdCA9IHBsYXRmb3JtKCk7XG4gIGlmIChwbGF0ID09PSBcImRhcndpblwiKSB7XG4gICAgb3B0cy5wdXNoKFwidXNlLWFuZ2xlPW1ldGFsXCIpO1xuICB9IGVsc2UgaWYgKHBsYXQgPT09IFwid2luMzJcIikge1xuICAgIG9wdHMucHVzaChcInVzZS1hbmdsZT1kM2QxMVwiKTtcbiAgfSBlbHNlIHtcbiAgICBvcHRzLnB1c2goXCJ1c2UtYW5nbGU9dnVsa2FuXCIsIFwiZW5hYmxlLWZlYXR1cmVzPVZ1bGthblwiLCBcImRpc2FibGUtdnVsa2FuLXN1cmZhY2VcIik7XG4gIH1cbiAgcmV0dXJuIG9wdHM7XG59XG5cbmNvbnN0IFRBRyA9IFwiW0VsZWN0cm9uXVwiO1xuXG5hc3luYyBmdW5jdGlvbiBhc3NlcnRBcHBGcmVzaCgpIHtcbiAgY29uc3QgW2FwcFN0YXQsIHNlbGZTdGF0XSA9IGF3YWl0IFByb21pc2UuYWxsKFtzdGF0KHB1cEFwcCksIHN0YXQoZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpKV0pO1xuICBvayhhcHBTdGF0Lm10aW1lTXMgPj0gc2VsZlN0YXQubXRpbWVNcywgYGFwcC5janMgaXMgc3RhbGUsIHJ1biBcXGBidW4gcnVuIGJ1aWxkXFxgYCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5FbGVjdHJvbkFwcChzaXplOiBTaXplLCBhcmdzOiB1bmtub3duW10sIGlwY1NvY2tldFBhdGg6IHN0cmluZykge1xuICBhd2FpdCBhc3NlcnRBcHBGcmVzaCgpO1xuICBjb25zdCBjbWRQYXJ0czogdW5rbm93bltdID0gW107XG4gIGNvbnN0IHBsYXQgPSBwbGF0Zm9ybSgpO1xuICBpZiAocGxhdCA9PT0gXCJsaW51eFwiKSB7XG4gICAgY21kUGFydHMucHVzaChgeHZmYi1ydW5gLCBgLS1hdXRvLXNlcnZlcm51bWAsIGAtLXNlcnZlci1hcmdzPVwiLXNjcmVlbiAwICR7c2l6ZS53aWR0aH14JHtzaXplLmhlaWdodH14MjRcImApO1xuICB9XG4gIGNvbnN0IG9wdHMgPSBhd2FpdCBlbGVjdHJvbk9wdHMoKTtcbiAgY29uc3QgZWxlY3Ryb25BcmdzID0gb3B0cy5tYXAoKGEpID0+IGAtLSR7YX1gKTtcbiAgY29uc3QgYmFzZTY0QXJncyA9IEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KGFyZ3MpKS50b1N0cmluZyhcImJhc2U2NFwiKTtcbiAgZWxlY3Ryb25BcmdzLnB1c2goYCR7UFVQX0FSR1NfS0VZfT0ke2Jhc2U2NEFyZ3N9YCk7XG4gIGNtZFBhcnRzLnB1c2goZWxlY3Ryb24sIC4uLmVsZWN0cm9uQXJncywgcHVwQXBwKTtcbiAgY29uc3QgY21kID0gY21kUGFydHMuam9pbihcIiBcIik7XG4gIGxvZ2dlci5kZWJ1ZyhUQUcsIGNtZCk7XG4gIHJldHVybiBleGVjKGNtZCwge1xuICAgIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJwaXBlXCIsIFwicGlwZVwiXSxcbiAgICBzaGVsbDogcGxhdCA9PT0gXCJsaW51eFwiLFxuICAgIGVudjogeyAuLi5wcm9jZXNzLmVudiwgUlVTVF9CQUNLVFJBQ0U6IFwiZnVsbFwiLCBQVVBfSVBDX1NPQ0tFVDogaXBjU29ja2V0UGF0aCB9LFxuICB9KTtcbn1cbiIsIi8vIENyZWF0ZWQgYnkgQXV0b2tha2EgKHFxMTkwOTY5ODQ5NEBnbWFpbC5jb20pIG9uIDIwMjYvMDQvMDEuXG5cbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJldmVudHNcIjtcbmltcG9ydCB7IGNyZWF0ZUNvbm5lY3Rpb24sIGNyZWF0ZVNlcnZlciwgdHlwZSBTb2NrZXQgfSBmcm9tIFwibmV0XCI7XG5cbmNvbnN0IEhFQURFUl9TSVpFID0gODtcblxuZXhwb3J0IGNvbnN0IGVudW0gSXBjTXNnVHlwZSB7XG4gIFBST0dSRVNTID0gMSxcbiAgRE9ORSA9IDIsXG4gIEVSUk9SID0gMyxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJcGNEb25lUGF5bG9hZCB7XG4gIHdyaXR0ZW46IG51bWJlcjtcbiAgamFuazogbnVtYmVyO1xuICBvdXRGaWxlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBJcGNXcml0ZXIge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IF9zb2NrZXQ6IFNvY2tldCkge31cblxuICB3cml0ZVByb2dyZXNzKHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLndyaXRlKElwY01zZ1R5cGUuUFJPR1JFU1MsIEJ1ZmZlci5mcm9tKGAke3ZhbHVlfWApKTtcbiAgfVxuXG4gIHdyaXRlRXJyb3IoZXJyb3I6IHN0cmluZykge1xuICAgIHRoaXMud3JpdGUoSXBjTXNnVHlwZS5FUlJPUiwgQnVmZmVyLmZyb20oZXJyb3IpKTtcbiAgICB0aGlzLl9zb2NrZXQuZW5kKCk7XG4gIH1cblxuICB3cml0ZURvbmUocGF5bG9hZDogSXBjRG9uZVBheWxvYWQpOiB2b2lkIHtcbiAgICB0aGlzLndyaXRlKElwY01zZ1R5cGUuRE9ORSwgQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkocGF5bG9hZCkpKTtcbiAgICB0aGlzLl9zb2NrZXQuZW5kKCk7XG4gIH1cblxuICBwcml2YXRlIHdyaXRlKHR5cGU6IElwY01zZ1R5cGUsIHBheWxvYWQ6IEJ1ZmZlcik6IHZvaWQge1xuICAgIGNvbnN0IGhlYWRlciA9IEJ1ZmZlci5hbGxvYyhIRUFERVJfU0laRSk7XG4gICAgaGVhZGVyLndyaXRlVUludDMyTEUodHlwZSwgMCk7XG4gICAgaGVhZGVyLndyaXRlVUludDMyTEUocGF5bG9hZC5ieXRlTGVuZ3RoLCA0KTtcbiAgICB0aGlzLl9zb2NrZXQud3JpdGUoaGVhZGVyKTtcbiAgICB0aGlzLl9zb2NrZXQud3JpdGUocGF5bG9hZCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbm5lY3RJcGMoc29ja2V0UGF0aDogc3RyaW5nKTogUHJvbWlzZTxJcGNXcml0ZXI+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBzb2NrZXQgPSBjcmVhdGVDb25uZWN0aW9uKHNvY2tldFBhdGgpO1xuICAgIHNvY2tldC5vbmNlKFwiY29ubmVjdFwiLCAoKSA9PiByZXNvbHZlKG5ldyBJcGNXcml0ZXIoc29ja2V0KSkpO1xuICAgIHNvY2tldC5vbmNlKFwiZXJyb3JcIiwgcmVqZWN0KTtcbiAgfSk7XG59XG5cbmV4cG9ydCBjbGFzcyBJcGNSZWFkZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXI8e1xuICBwcm9ncmVzczogW3ZhbHVlOiBudW1iZXJdO1xuICBtZXNzYWdlOiBbdHlwZTogSXBjTXNnVHlwZSwgYnVmZmVyOiBCdWZmZXJdO1xuICBkb25lOiBbcGF5bG9hZDogSXBjRG9uZVBheWxvYWRdO1xuICBlcnJvcjogW2Vycm9yOiBFcnJvcl07XG4gIGNsb3NlOiBbXTtcbn0+IHtcbiAgcHJpdmF0ZSBfY2h1bmtzOiBCdWZmZXJbXSA9IFtdO1xuICBwcml2YXRlIF9idWZmZXJlZCA9IDA7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBfc29ja2V0OiBTb2NrZXQpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX3NvY2tldC5vbihcImRhdGFcIiwgKGRhdGEpID0+IHRoaXMub25EYXRhKGRhdGEpKTtcbiAgICB0aGlzLl9zb2NrZXQub24oXCJlcnJvclwiLCAoZXJyKSA9PiB0aGlzLmVtaXQoXCJlcnJvclwiLCBlcnIpKTtcbiAgICB0aGlzLl9zb2NrZXQub24oXCJjbG9zZVwiLCAoKSA9PiB0aGlzLmVtaXQoXCJjbG9zZVwiKSk7XG4gIH1cblxuICBwcml2YXRlIG9uRGF0YShkYXRhOiBCdWZmZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9jaHVua3MucHVzaChkYXRhKTtcbiAgICB0aGlzLl9idWZmZXJlZCArPSBkYXRhLmJ5dGVMZW5ndGg7XG4gICAgdGhpcy5mbHVzaCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBmbHVzaCgpOiB2b2lkIHtcbiAgICBmb3IgKDs7KSB7XG4gICAgICBpZiAodGhpcy5fYnVmZmVyZWQgPCBIRUFERVJfU0laRSkgcmV0dXJuO1xuICAgICAgY29uc3QgaGVhZGVyID0gdGhpcy5wZWVrKEhFQURFUl9TSVpFKTtcbiAgICAgIGNvbnN0IHR5cGUgPSBoZWFkZXIucmVhZFVJbnQzMkxFKDApIGFzIElwY01zZ1R5cGU7XG4gICAgICBjb25zdCBsZW4gPSBoZWFkZXIucmVhZFVJbnQzMkxFKDQpO1xuICAgICAgaWYgKHRoaXMuX2J1ZmZlcmVkIDwgSEVBREVSX1NJWkUgKyBsZW4pIHJldHVybjtcbiAgICAgIHRoaXMuY29uc3VtZShIRUFERVJfU0laRSk7XG4gICAgICBjb25zdCBwYXlsb2FkID0gdGhpcy5jb25zdW1lKGxlbik7XG4gICAgICB0aGlzLmVtaXQoXCJtZXNzYWdlXCIsIHR5cGUsIHBheWxvYWQpO1xuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgSXBjTXNnVHlwZS5QUk9HUkVTUzoge1xuICAgICAgICAgIHRoaXMuZW1pdChcInByb2dyZXNzXCIsIE51bWJlcihwYXlsb2FkLnRvU3RyaW5nKCkpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIElwY01zZ1R5cGUuRE9ORToge1xuICAgICAgICAgIHRoaXMuZW1pdChcImRvbmVcIiwgSlNPTi5wYXJzZShwYXlsb2FkLnRvU3RyaW5nKCkpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIElwY01zZ1R5cGUuRVJST1I6IHtcbiAgICAgICAgICB0aGlzLmVtaXQoXCJlcnJvclwiLCBuZXcgRXJyb3IocGF5bG9hZC50b1N0cmluZygpKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHBlZWsobjogbnVtYmVyKTogQnVmZmVyIHtcbiAgICBpZiAodGhpcy5fY2h1bmtzWzBdICYmIHRoaXMuX2NodW5rc1swXS5ieXRlTGVuZ3RoID49IG4pIHJldHVybiB0aGlzLl9jaHVua3NbMF07XG4gICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQodGhpcy5fY2h1bmtzKS5zdWJhcnJheSgwLCBuKTtcbiAgfVxuXG4gIHByaXZhdGUgY29uc3VtZShuOiBudW1iZXIpOiBCdWZmZXIge1xuICAgIGNvbnN0IG91dCA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShuKTtcbiAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICB3aGlsZSAob2Zmc2V0IDwgbikge1xuICAgICAgY29uc3QgY2h1bmsgPSB0aGlzLl9jaHVua3NbMF0hO1xuICAgICAgY29uc3QgdGFrZSA9IE1hdGgubWluKGNodW5rLmJ5dGVMZW5ndGgsIG4gLSBvZmZzZXQpO1xuICAgICAgY2h1bmsuY29weShvdXQsIG9mZnNldCwgMCwgdGFrZSk7XG4gICAgICBpZiAodGFrZSA9PT0gY2h1bmsuYnl0ZUxlbmd0aCkge1xuICAgICAgICB0aGlzLl9jaHVua3Muc2hpZnQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2NodW5rc1swXSA9IGNodW5rLnN1YmFycmF5KHRha2UpO1xuICAgICAgfVxuICAgICAgb2Zmc2V0ICs9IHRha2U7XG4gICAgfVxuICAgIHRoaXMuX2J1ZmZlcmVkIC09IG47XG4gICAgcmV0dXJuIG91dDtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElwY1NlcnZlciB7XG4gIHdhaXRGb3JDb25uZWN0aW9uKCk6IFByb21pc2U8SXBjUmVhZGVyPjtcbiAgY2xvc2UoKTogdm9pZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUlwY1NlcnZlcihzb2NrZXRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPElwY1NlcnZlcj4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHNlcnZlciA9IGNyZWF0ZVNlcnZlcigpO1xuICAgIHNlcnZlci5vbmNlKFwiZXJyb3JcIiwgcmVqZWN0KTtcbiAgICBzZXJ2ZXIubGlzdGVuKHNvY2tldFBhdGgsICgpID0+IHtcbiAgICAgIHJlc29sdmUoe1xuICAgICAgICB3YWl0Rm9yQ29ubmVjdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8SXBjUmVhZGVyPigob2ssIG5vKSA9PiB7XG4gICAgICAgICAgICBzZXJ2ZXIub25jZShcImNvbm5lY3Rpb25cIiwgKHNvY2tldCkgPT4gb2sobmV3IElwY1JlYWRlcihzb2NrZXQpKSk7XG4gICAgICAgICAgICBzZXJ2ZXIub25jZShcImVycm9yXCIsIG5vKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgY2xvc2UoKSB7XG4gICAgICAgICAgc2VydmVyLmNsb3NlKCk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59XG4iLCIvLyBDcmVhdGVkIGJ5IEF1dG9rYWthIChxcTE5MDk2OTg0OTRAZ21haWwuY29tKSBvbiAyMDI2LzAyLzA5LlxuXG5pbXBvcnQgeyBvayB9IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCB7IHJhbmRvbVVVSUQgfSBmcm9tIFwiY3J5cHRvXCI7XG5pbXBvcnQgeyBybVN5bmMgfSBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IG1rZGlyIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyB0bXBkaXIgfSBmcm9tIFwib3NcIjtcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHRyZWVLaWxsIGZyb20gXCJ0cmVlLWtpbGxcIjtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gXCIuL2Jhc2UvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgcnVuRWxlY3Ryb25BcHAgfSBmcm9tIFwiLi9yZW5kZXJlci9lbGVjdHJvblwiO1xuaW1wb3J0IHsgY3JlYXRlSXBjU2VydmVyLCB0eXBlIElwY0RvbmVQYXlsb2FkIH0gZnJvbSBcIi4vcmVuZGVyZXIvaXBjXCI7XG5pbXBvcnQgeyBkZWZhdWx0UmVuZGVyT3B0aW9ucywgdHlwZSBSZW5kZXJPcHRpb25zLCB0eXBlIFJlbmRlclJlc3VsdCB9IGZyb20gXCIuL3JlbmRlcmVyL3NjaGVtYVwiO1xuXG5jb25zdCBUQUcgPSBcIltwdXBdXCI7XG5cbmV4cG9ydCB0eXBlIFB1cFByb2dyZXNzQ2FsbGJhY2sgPSAocHJvZ3Jlc3M6IG51bWJlcikgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHVwT3B0aW9ucyBleHRlbmRzIFBhcnRpYWw8UmVuZGVyT3B0aW9ucz4ge1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgb25Qcm9ncmVzcz86IFB1cFByb2dyZXNzQ2FsbGJhY2s7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHVwUmVzdWx0IGV4dGVuZHMgUmVuZGVyUmVzdWx0IHt9XG5cbmludGVyZmFjZSBBcHBPcHRpb25zIGV4dGVuZHMgUmVuZGVyT3B0aW9ucyB7XG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5QdXBBcHAoc291cmNlOiBzdHJpbmcsIG9wdGlvbnM6IEFwcE9wdGlvbnMsIHNvY2tldFBhdGg6IHN0cmluZykge1xuICBsb2dnZXIuZGVidWcoVEFHLCBgcnVuUHVwQXBwYCwgc291cmNlLCBvcHRpb25zKTtcblxuICBjb25zdCBhcmdzOiBzdHJpbmdbXSA9IFtcbiAgICBzb3VyY2UsXG4gICAgYC0td2lkdGhgLFxuICAgIGAke29wdGlvbnMud2lkdGh9YCxcbiAgICBgLS1oZWlnaHRgLFxuICAgIGAke29wdGlvbnMuaGVpZ2h0fWAsXG4gICAgYC0tZnBzYCxcbiAgICBgJHtvcHRpb25zLmZwc31gLFxuICAgIGAtLWR1cmF0aW9uYCxcbiAgICBgJHtvcHRpb25zLmR1cmF0aW9ufWAsXG4gICAgYC0tb3V0LWZpbGVgLFxuICAgIGAke29wdGlvbnMub3V0RmlsZX1gLFxuICBdO1xuICBpZiAob3B0aW9ucy53aXRoQXVkaW8pIGFyZ3MucHVzaChgLS13aXRoLWF1ZGlvYCk7XG4gIGlmIChvcHRpb25zLnVzZUlubmVyUHJveHkpIGFyZ3MucHVzaChgLS11c2UtaW5uZXItcHJveHlgKTtcbiAgaWYgKG9wdGlvbnMuZGV0ZXJtaW5pc3RpYykgYXJncy5wdXNoKGAtLWRldGVybWluaXN0aWNgKTtcblxuICByZXR1cm4gcnVuRWxlY3Ryb25BcHAob3B0aW9ucywgYXJncywgc29ja2V0UGF0aCk7XG59XG5cbmNvbnN0IGQgPSBkZWZhdWx0UmVuZGVyT3B0aW9ucztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHB1cChzb3VyY2U6IHN0cmluZywgb3B0aW9uczogUGFydGlhbDxQdXBPcHRpb25zPik6IFByb21pc2U8UHVwUmVzdWx0PiB7XG4gIGxvZ2dlci5kZWJ1ZyhUQUcsIGBwdXBgLCBzb3VyY2UsIG9wdGlvbnMpO1xuXG4gIGNvbnN0IHsgc2lnbmFsIH0gPSBvcHRpb25zO1xuICBpZiAoc2lnbmFsPy5hYm9ydGVkKSB0aHJvdyBzaWduYWwucmVhc29uO1xuXG4gIGNvbnN0IG91dEZpbGUgPSBvcHRpb25zLm91dEZpbGUgPz8gZC5vdXRGaWxlO1xuICBjb25zdCByZW5kZXJPcHRzOiBSZW5kZXJPcHRpb25zID0ge1xuICAgIHdpZHRoOiBvcHRpb25zLndpZHRoID8/IGQud2lkdGgsXG4gICAgaGVpZ2h0OiBvcHRpb25zLmhlaWdodCA/PyBkLmhlaWdodCxcbiAgICBmcHM6IG9wdGlvbnMuZnBzID8/IGQuZnBzLFxuICAgIGR1cmF0aW9uOiBvcHRpb25zLmR1cmF0aW9uID8/IGQuZHVyYXRpb24sXG4gICAgd2l0aEF1ZGlvOiBvcHRpb25zLndpdGhBdWRpbyA/PyBkLndpdGhBdWRpbyxcbiAgICB1c2VJbm5lclByb3h5OiBvcHRpb25zLnVzZUlubmVyUHJveHkgPz8gZC51c2VJbm5lclByb3h5LFxuICAgIGRldGVybWluaXN0aWM6IG9wdGlvbnMuZGV0ZXJtaW5pc3RpYyA/PyBkLmRldGVybWluaXN0aWMsXG4gICAgb3V0RmlsZSxcbiAgfTtcblxuICBjb25zdCB0bXBEaXIgPSBqb2luKHRtcGRpcigpLCBcInB1cFwiLCByYW5kb21VVUlEKCkpO1xuICBhd2FpdCBta2Rpcih0bXBEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBjb25zdCBzb2NrZXRQYXRoID0gam9pbih0bXBEaXIsIFwicHVwLnNvY2tcIik7XG5cbiAgY29uc3QgdDAgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgY29uc3Qgc2VydmVyID0gYXdhaXQgY3JlYXRlSXBjU2VydmVyKHNvY2tldFBhdGgpO1xuICBjb25zdCBoYW5kbGUgPSBhd2FpdCBydW5QdXBBcHAoc291cmNlLCB7IC4uLnJlbmRlck9wdHMsIHNpZ25hbCB9LCBzb2NrZXRQYXRoKTtcblxuICBjb25zdCBvbkFib3J0ID0gKCkgPT4ge1xuICAgIGxvZ2dlci5kZWJ1ZyhUQUcsIGBhYm9ydGVkYCk7XG4gICAgY29uc3QgcGlkID0gaGFuZGxlLnByb2Nlc3MucGlkO1xuICAgIGlmIChwaWQpIHRyZWVLaWxsKHBpZCk7XG4gICAgZWxzZSBoYW5kbGUucHJvY2Vzcy5raWxsKCk7XG4gICAgcm1TeW5jKHRtcERpciwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICB9O1xuICBzaWduYWw/LmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBvbkFib3J0LCB7IG9uY2U6IHRydWUgfSk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCB0aWNrID0gKHA6IG51bWJlcikgPT4gKGxvZ2dlci5pbmZvKFRBRywgYCR7c291cmNlfSBwcm9ncmVzczogJHtwfSVgKSwgb3B0aW9ucy5vblByb2dyZXNzPy4ocCkpO1xuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBQcm9taXNlPElwY0RvbmVQYXlsb2FkPihhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAoYXdhaXQgc2VydmVyLndhaXRGb3JDb25uZWN0aW9uKCkpXG4gICAgICAgIC5vbihcImNsb3NlXCIsICgpID0+IHJlamVjdChuZXcgRXJyb3IoXCJJUEMgY2xvc2VkIHdpdGhvdXQgcmVzdWx0XCIpKSlcbiAgICAgICAgLm9uKFwibWVzc2FnZVwiLCAoKSA9PiBzaWduYWw/LmFib3J0ZWQgJiYgcmVqZWN0KHNpZ25hbC5yZWFzb24pKVxuICAgICAgICAub24oXCJwcm9ncmVzc1wiLCB0aWNrKVxuICAgICAgICAub24oXCJkb25lXCIsIHJlc29sdmUpXG4gICAgICAgIC5vbihcImVycm9yXCIsIHJlamVjdCk7XG4gICAgfSkuZmluYWxseSgoKSA9PiBzZXJ2ZXIuY2xvc2UoKSk7XG4gICAgdGljaygwKTtcbiAgICBjb25zdCBzdW1tYXJ5ID0gYXdhaXQgUHJvbWlzZS5yYWNlKFtyZXN1bHQsIGhhbmRsZS53YWl0XSk7XG4gICAgb2soc3VtbWFyeSwgXCJubyBzdW1tYXJ5IHJlY2VpdmVkXCIpO1xuICAgIHRpY2soMTAwKTtcbiAgICBsb2dnZXIuaW5mbyhUQUcsIGBkb25lICR7b3V0RmlsZX0gaW4gJHtNYXRoLnJvdW5kKHBlcmZvcm1hbmNlLm5vdygpIC0gdDApfW1zYCk7XG4gICAgcmV0dXJuIHsgLi4uc3VtbWFyeSwgb3B0aW9uczogcmVuZGVyT3B0cyB9O1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKHNpZ25hbD8uYWJvcnRlZCkgdGhyb3cgc2lnbmFsLnJlYXNvbjtcbiAgICB0aHJvdyBlO1xuICB9IGZpbmFsbHkge1xuICAgIHJtU3luYyh0bXBEaXIsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgfVxufVxuIl19
|