silence-aware-recorder
Version:
Audio control with silence detection.
7 lines (5 loc) • 22.3 kB
JavaScript
import { useState, useEffect, useCallback } from 'react';
var h=class{silenceDetectionEnabled;timeSlice;audioContext;mediaStreamSource;analyser;mediaRecorder;silenceTimeout;silenceThreshold;silenceDuration;minDecibels;onVolumeChange;onDataAvailable;isSilence;hasSoundStarted;deviceId;isRecording;stopRecorderOnSilence;animationFrameId;constructor({onVolumeChange:e,onDataAvailable:t,silenceDuration:a=2500,silentThreshold:r=-50,minDecibels:i=-100,deviceId:s="default",timeSlice:u=250,silenceDetectionEnabled:l=!0,stopRecorderOnSilence:o=!1}){this.silenceDetectionEnabled=l,this.stopRecorderOnSilence=o,this.timeSlice=u,this.audioContext=null,this.mediaStreamSource=null,this.analyser=null,this.mediaRecorder=null,this.silenceTimeout=null,this.silenceThreshold=r,this.silenceDuration=a,this.minDecibels=i,this.onVolumeChange=e,this.onDataAvailable=t,this.isSilence=!1,this.hasSoundStarted=!1,this.deviceId=s,this.isRecording=!1,this.animationFrameId=null;}async startRecording(){if(!this.isRecording)try{let e=await this.getAudioStream();this.setupAudioContext(e),this.setupMediaRecorder(e),this.isRecording=!0,this.checkForSilence();}catch(e){console.error("Error getting audio stream:",e);}}async getAudioStream(){let e={audio:this.deviceId?{deviceId:{exact:this.deviceId}}:!0,video:!1};return navigator.mediaDevices.getUserMedia(e)}setupAudioContext(e){this.audioContext=new AudioContext,this.mediaStreamSource=this.audioContext.createMediaStreamSource(e),this.analyser=this.audioContext.createAnalyser(),this.analyser.minDecibels=this.minDecibels,this.mediaStreamSource.connect(this.analyser);}setupMediaRecorder(e){this.mediaRecorder=new MediaRecorder(e),this.mediaRecorder.ondataavailable=t=>{var a;t.data.size>0&&!this.isSilence&&((a=this.onDataAvailable)==null||a.call(this,t.data));},this.mediaRecorder.start(this.timeSlice);}async getAvailableDevices(){return navigator.mediaDevices.enumerateDevices()}setDevice(e){this.deviceId!==e&&(this.deviceId=e,this.mediaRecorder&&this.mediaRecorder.state==="recording"&&this.stopRecording());}stopRecording(){this.isRecording&&(this.mediaRecorder&&this.hasSoundStarted&&this.mediaRecorder.state==="recording"?(this.mediaRecorder.requestData(),setTimeout(()=>{this.cleanUp();},100)):this.cleanUp(),this.silenceTimeout&&(clearTimeout(this.silenceTimeout),this.silenceTimeout=null));}cleanUp(){var e,t,a,r,i;((e=this.mediaRecorder)==null?void 0:e.state)==="recording"&&((t=this.mediaRecorder)==null||t.stop(),cancelAnimationFrame(this.animationFrameId)),(r=(a=this.mediaRecorder)==null?void 0:a.stream)==null||r.getTracks().forEach(s=>s.stop()),(i=this.audioContext)==null||i.close(),this.hasSoundStarted=!1,this.isRecording=!1;}checkForSilence(){var r;if(!this.mediaRecorder)throw new Error("MediaRecorder is not available");if(!this.analyser)throw new Error("Analyser is not available");let e=this.analyser.fftSize,t=new Float32Array(e||0);this.analyser.getFloatTimeDomainData(t);let a=this.computeVolume(t);(r=this.onVolumeChange)==null||r.call(this,a),this.silenceDetectionEnabled&&(a<this.silenceThreshold?this.silenceTimeout||(this.silenceTimeout=setTimeout(()=>{var i;this.stopRecorderOnSilence&&((i=this.mediaRecorder)==null||i.stop()),this.isSilence=!0,this.silenceTimeout=null;},this.silenceDuration)):(this.silenceTimeout&&(clearTimeout(this.silenceTimeout),this.silenceTimeout=null),this.isSilence&&(this.stopRecorderOnSilence&&this.mediaRecorder.start(this.timeSlice),this.isSilence=!1),this.hasSoundStarted||(this.hasSoundStarted=!0))),this.animationFrameId=requestAnimationFrame(()=>this.checkForSilence());}computeVolume(e){let t=e.reduce((i,s)=>i+s*s,0),a=Math.sqrt(t/e.length);return 20*Math.log10(a)}},v=h;var y=d=>{let{silenceDuration:e,silentThreshold:t,minDecibels:a,deviceId:r="default"}=d,[i,s]=useState(null),[u,l]=useState(!1),[o,R]=useState(r),[f,b]=useState([]);useEffect(()=>{let n=new v(d);return n.setDevice(o),s(n),()=>{n.stopRecording();}},[e,t,a,o]),useEffect(()=>{i&&i.getAvailableDevices().then(n=>{b(n);});},[i]);let g=useCallback(()=>{i==null||i.startRecording(),l(!0);},[i]),D=useCallback(()=>{i==null||i.stopRecording(),l(!1);},[i]),A=useCallback(n=>{R(n);},[]);return {availableDevices:f,startRecording:g,stopRecording:D,setDevice:A,isRecording:u,deviceId:o}},S=y;var O=S;
export { O as default };
//# sourceMappingURL=out.js.map
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZWFjdC91c2VTaWxlbmNlQXdhcmVSZWNvcmRlci50cyIsIi4uLy4uL3NyYy9saWIvU2lsZW5jZUF3YXJlUmVjb3JkZXIudHMiLCIuLi8uLi9zcmMvcmVhY3QvaW5kZXgudHMiXSwibmFtZXMiOlsidXNlU3RhdGUiLCJ1c2VFZmZlY3QiLCJ1c2VDYWxsYmFjayIsIlNpbGVuY2VBd2FyZVJlY29yZGVyIiwib25Wb2x1bWVDaGFuZ2UiLCJvbkRhdGFBdmFpbGFibGUiLCJzaWxlbmNlRHVyYXRpb24iLCJzaWxlbnRUaHJlc2hvbGQiLCJtaW5EZWNpYmVscyIsImRldmljZUlkIiwidGltZVNsaWNlIiwic2lsZW5jZURldGVjdGlvbkVuYWJsZWQiLCJzdG9wUmVjb3JkZXJPblNpbGVuY2UiLCJzdHJlYW0iLCJlcnIiLCJjb25zdHJhaW50cyIsImV2ZW50IiwiX2EiLCJfYiIsIl9jIiwiX2QiLCJfZSIsInRyYWNrIiwiYnVmZmVyTGVuZ3RoIiwiYW1wbGl0dWRlQXJyYXkiLCJ2b2x1bWUiLCJ2YWx1ZXMiLCJzdW0iLCJ2YWx1ZSIsImF2ZXJhZ2UiLCJTaWxlbmNlQXdhcmVSZWNvcmRlcl9kZWZhdWx0IiwidXNlU2lsZW5jZUF3YXJlUmVjb3JkZXIiLCJvcHRpb25zIiwiaW5pdGlhbERldmljZUlkIiwicmVjb3JkZXIiLCJzZXRSZWNvcmRlciIsImlzUmVjb3JkaW5nIiwic2V0SXNSZWNvcmRpbmciLCJzZXREZXZpY2VJZCIsImRldmljZXMiLCJzZXREZXZpY2VzIiwic2lsZW5jZUF3YXJlUmVjb3JkZXIiLCJhdmFpbGFibGVEZXZpY2VzIiwic3RhcnRSZWNvcmRpbmciLCJzdG9wUmVjb3JkaW5nIiwic2V0RGV2aWNlIiwibmV3RGV2aWNlSWQiLCJ1c2VTaWxlbmNlQXdhcmVSZWNvcmRlcl9kZWZhdWx0IiwicmVhY3RfZGVmYXVsdCJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBUyxZQUFBQSxFQUFVLGFBQUFDLEVBQVcsZUFBQUMsTUFBbUIsUUNtQmpE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QWUsRUFBSyxDQUN0QixFQUFHLENBQUNILENBQVEsQ0FBQyxFQUVQVyxFQUFZM0MsRUFBYTRDLEdBQXdCLENBQ3JEUixFQUFZUSxDQUFXLENBQ3pCLEVBQUcsQ0FBQyxDQUFDLEVBRUwsTUFBTyxDQUNMLGlCQUFrQlAsRUFDbEIsZUFBQUksRUFDQSxjQUFBQyxFQUNBLFVBQUFDLEVBQ0EsWUFBQVQsRUFDQSxTQUFBM0IsQ0FDRixDQUNGLEVBRU9zQyxFQUFRaEIsRUVsRGYsSUFBT2lCLEVBQVFEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdXNlU3RhdGUsIHVzZUVmZmVjdCwgdXNlQ2FsbGJhY2sgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgU2lsZW5jZUF3YXJlUmVjb3JkZXIsIHsgU2lsZW5jZUF3YXJlUmVjb3JkZXJPcHRpb25zIH0gZnJvbSAnLi4vbGliL1NpbGVuY2VBd2FyZVJlY29yZGVyJztcblxuY29uc3QgdXNlU2lsZW5jZUF3YXJlUmVjb3JkZXIgPSAob3B0aW9uczogU2lsZW5jZUF3YXJlUmVjb3JkZXJPcHRpb25zKSA9PiB7XG4gIGNvbnN0IHsgc2lsZW5jZUR1cmF0aW9uLCBzaWxlbnRUaHJlc2hvbGQsIG1pbkRlY2liZWxzLCBkZXZpY2VJZDogaW5pdGlhbERldmljZUlkID0gJ2RlZmF1bHQnIH0gPSBvcHRpb25zO1xuICBjb25zdCBbcmVjb3JkZXIsIHNldFJlY29yZGVyXSA9IHVzZVN0YXRlPFNpbGVuY2VBd2FyZVJlY29yZGVyIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IFtpc1JlY29yZGluZywgc2V0SXNSZWNvcmRpbmddID0gdXNlU3RhdGU8Ym9vbGVhbj4oZmFsc2UpO1xuICBjb25zdCBbZGV2aWNlSWQsIHNldERldmljZUlkXSA9IHVzZVN0YXRlPHN0cmluZz4oaW5pdGlhbERldmljZUlkKTtcbiAgY29uc3QgW2RldmljZXMsIHNldERldmljZXNdID0gdXNlU3RhdGU8TWVkaWFEZXZpY2VJbmZvW10+KFtdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IHNpbGVuY2VBd2FyZVJlY29yZGVyID0gbmV3IFNpbGVuY2VBd2FyZVJlY29yZGVyKG9wdGlvbnMpO1xuICAgIHNpbGVuY2VBd2FyZVJlY29yZGVyLnNldERldmljZShkZXZpY2VJZCk7XG4gICAgc2V0UmVjb3JkZXIoc2lsZW5jZUF3YXJlUmVjb3JkZXIpO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHNpbGVuY2VBd2FyZVJlY29yZGVyLnN0b3BSZWNvcmRpbmcoKTtcbiAgICB9O1xuICB9LCBbc2lsZW5jZUR1cmF0aW9uLCBzaWxlbnRUaHJlc2hvbGQsIG1pbkRlY2liZWxzLCBkZXZpY2VJZF0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHJlY29yZGVyKSB7XG4gICAgICByZWNvcmRlci5nZXRBdmFpbGFibGVEZXZpY2VzKCkudGhlbigoYXZhaWxhYmxlRGV2aWNlcykgPT4ge1xuICAgICAgICBzZXREZXZpY2VzKGF2YWlsYWJsZURldmljZXMpO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCBbcmVjb3JkZXJdKTtcblxuICBjb25zdCBzdGFydFJlY29yZGluZyA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICByZWNvcmRlcj8uc3RhcnRSZWNvcmRpbmcoKTtcbiAgICBzZXRJc1JlY29yZGluZyh0cnVlKTtcbiAgfSwgW3JlY29yZGVyXSk7XG5cbiAgY29uc3Qgc3RvcFJlY29yZGluZyA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICByZWNvcmRlcj8uc3RvcFJlY29yZGluZygpO1xuICAgIHNldElzUmVjb3JkaW5nKGZhbHNlKTtcbiAgfSwgW3JlY29yZGVyXSk7XG5cbiAgY29uc3Qgc2V0RGV2aWNlID0gdXNlQ2FsbGJhY2soKG5ld0RldmljZUlkOiBzdHJpbmcpID0+IHtcbiAgICBzZXREZXZpY2VJZChuZXdEZXZpY2VJZCk7XG4gIH0sIFtdKTtcblxuICByZXR1cm4ge1xuICAgIGF2YWlsYWJsZURldmljZXM6IGRldmljZXMsXG4gICAgc3RhcnRSZWNvcmRpbmcsXG4gICAgc3RvcFJlY29yZGluZyxcbiAgICBzZXREZXZpY2UsXG4gICAgaXNSZWNvcmRpbmcsXG4gICAgZGV2aWNlSWQsXG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCB1c2VTaWxlbmNlQXdhcmVSZWNvcmRlcjtcbiIsImV4cG9ydCB0eXBlIE9uVm9sdW1lQ2hhbmdlID0gKHZvbHVtZTogbnVtYmVyKSA9PiB2b2lkO1xuZXhwb3J0IHR5cGUgT25EYXRhQXZhaWxhYmxlID0gKGRhdGE6IEJsb2IpID0+IHZvaWQgfCB1bmRlZmluZWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2lsZW5jZUF3YXJlUmVjb3JkZXJPcHRpb25zIHtcbiAgZGV2aWNlSWQ/OiBzdHJpbmc7XG4gIG1pbkRlY2liZWxzPzogbnVtYmVyO1xuICBvbkRhdGFBdmFpbGFibGU/OiBPbkRhdGFBdmFpbGFibGU7XG4gIG9uVm9sdW1lQ2hhbmdlPzogT25Wb2x1bWVDaGFuZ2U7XG5cbiAgc2V0RGV2aWNlSWQ/OiAoZGV2aWNlSWQ6IHN0cmluZykgPT4gdm9pZDtcbiAgc2lsZW5jZURldGVjdGlvbkVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIHNpbGVuY2VEdXJhdGlvbj86IG51bWJlcjtcblxuICBzaWxlbnRUaHJlc2hvbGQ/OiBudW1iZXI7XG4gIHN0b3BSZWNvcmRlck9uU2lsZW5jZT86IGJvb2xlYW47XG4gIHRpbWVTbGljZT86IG51bWJlcjtcbn1cblxuY2xhc3MgU2lsZW5jZUF3YXJlUmVjb3JkZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IHNpbGVuY2VEZXRlY3Rpb25FbmFibGVkOiBib29sZWFuO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgdGltZVNsaWNlOiBudW1iZXI7XG5cbiAgcHJpdmF0ZSBhdWRpb0NvbnRleHQ6IEF1ZGlvQ29udGV4dCB8IG51bGw7XG5cbiAgcHJpdmF0ZSBtZWRpYVN0cmVhbVNvdXJjZTogTWVkaWFTdHJlYW1BdWRpb1NvdXJjZU5vZGUgfCBudWxsO1xuXG4gIHByaXZhdGUgYW5hbHlzZXI6IEFuYWx5c2VyTm9kZSB8IG51bGw7XG5cbiAgcHJpdmF0ZSBtZWRpYVJlY29yZGVyOiBNZWRpYVJlY29yZGVyIHwgbnVsbDtcblxuICBwcml2YXRlIHNpbGVuY2VUaW1lb3V0OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGw7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBzaWxlbmNlVGhyZXNob2xkOiBudW1iZXI7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBzaWxlbmNlRHVyYXRpb246IG51bWJlcjtcblxuICBwcml2YXRlIHJlYWRvbmx5IG1pbkRlY2liZWxzOiBudW1iZXI7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBvblZvbHVtZUNoYW5nZT86IE9uVm9sdW1lQ2hhbmdlO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgb25EYXRhQXZhaWxhYmxlPzogT25EYXRhQXZhaWxhYmxlO1xuXG4gIHByaXZhdGUgaXNTaWxlbmNlOiBib29sZWFuO1xuXG4gIHByaXZhdGUgaGFzU291bmRTdGFydGVkOiBib29sZWFuO1xuXG4gIHB1YmxpYyBkZXZpY2VJZDogc3RyaW5nIHwgbnVsbDtcblxuICBwdWJsaWMgaXNSZWNvcmRpbmc6IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSByZWFkb25seSBzdG9wUmVjb3JkZXJPblNpbGVuY2U6IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSBhbmltYXRpb25GcmFtZUlkOiBudW1iZXIgfCBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKHtcbiAgICBvblZvbHVtZUNoYW5nZSxcbiAgICBvbkRhdGFBdmFpbGFibGUsXG4gICAgc2lsZW5jZUR1cmF0aW9uID0gMjUwMCxcbiAgICBzaWxlbnRUaHJlc2hvbGQgPSAtNTAsXG4gICAgbWluRGVjaWJlbHMgPSAtMTAwLFxuICAgIGRldmljZUlkID0gJ2RlZmF1bHQnLFxuICAgIHRpbWVTbGljZSA9IDI1MCxcbiAgICBzaWxlbmNlRGV0ZWN0aW9uRW5hYmxlZCA9IHRydWUsXG4gICAgc3RvcFJlY29yZGVyT25TaWxlbmNlID0gZmFsc2UsXG4gIH06IFNpbGVuY2VBd2FyZVJlY29yZGVyT3B0aW9ucykge1xuICAgIHRoaXMuc2lsZW5jZURldGVjdGlvbkVuYWJsZWQgPSBzaWxlbmNlRGV0ZWN0aW9uRW5hYmxlZDtcbiAgICB0aGlzLnN0b3BSZWNvcmRlck9uU2lsZW5jZSA9IHN0b3BSZWNvcmRlck9uU2lsZW5jZTtcbiAgICB0aGlzLnRpbWVTbGljZSA9IHRpbWVTbGljZTtcbiAgICB0aGlzLmF1ZGlvQ29udGV4dCA9IG51bGw7XG4gICAgdGhpcy5tZWRpYVN0cmVhbVNvdXJjZSA9IG51bGw7XG4gICAgdGhpcy5hbmFseXNlciA9IG51bGw7XG4gICAgdGhpcy5tZWRpYVJlY29yZGVyID0gbnVsbDtcbiAgICB0aGlzLnNpbGVuY2VUaW1lb3V0ID0gbnVsbDtcbiAgICB0aGlzLnNpbGVuY2VUaHJlc2hvbGQgPSBzaWxlbnRUaHJlc2hvbGQ7XG4gICAgdGhpcy5zaWxlbmNlRHVyYXRpb24gPSBzaWxlbmNlRHVyYXRpb247XG4gICAgdGhpcy5taW5EZWNpYmVscyA9IG1pbkRlY2liZWxzO1xuICAgIHRoaXMub25Wb2x1bWVDaGFuZ2UgPSBvblZvbHVtZUNoYW5nZTtcbiAgICB0aGlzLm9uRGF0YUF2YWlsYWJsZSA9IG9uRGF0YUF2YWlsYWJsZTtcbiAgICB0aGlzLmlzU2lsZW5jZSA9IGZhbHNlO1xuICAgIHRoaXMuaGFzU291bmRTdGFydGVkID0gZmFsc2U7XG4gICAgdGhpcy5kZXZpY2VJZCA9IGRldmljZUlkO1xuICAgIHRoaXMuaXNSZWNvcmRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmFuaW1hdGlvbkZyYW1lSWQgPSBudWxsO1xuICB9XG5cbiAgYXN5bmMgc3RhcnRSZWNvcmRpbmcoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaXNSZWNvcmRpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RyZWFtID0gYXdhaXQgdGhpcy5nZXRBdWRpb1N0cmVhbSgpO1xuICAgICAgdGhpcy5zZXR1cEF1ZGlvQ29udGV4dChzdHJlYW0pO1xuICAgICAgdGhpcy5zZXR1cE1lZGlhUmVjb3JkZXIoc3RyZWFtKTtcbiAgICAgIHRoaXMuaXNSZWNvcmRpbmcgPSB0cnVlO1xuICAgICAgdGhpcy5jaGVja0ZvclNpbGVuY2UoKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGdldHRpbmcgYXVkaW8gc3RyZWFtOicsIGVycik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRBdWRpb1N0cmVhbSgpOiBQcm9taXNlPE1lZGlhU3RyZWFtPiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICAgY29uc3QgY29uc3RyYWludHM6IE1lZGlhU3RyZWFtQ29uc3RyYWludHMgPSB7XG4gICAgICBhdWRpbzogdGhpcy5kZXZpY2VJZCA/IHsgZGV2aWNlSWQ6IHsgZXhhY3Q6IHRoaXMuZGV2aWNlSWQgfSB9IDogdHJ1ZSxcbiAgICAgIHZpZGVvOiBmYWxzZSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKGNvbnN0cmFpbnRzKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBBdWRpb0NvbnRleHQoc3RyZWFtOiBNZWRpYVN0cmVhbSk6IHZvaWQge1xuICAgIHRoaXMuYXVkaW9Db250ZXh0ID0gbmV3IEF1ZGlvQ29udGV4dCgpO1xuICAgIHRoaXMubWVkaWFTdHJlYW1Tb3VyY2UgPSB0aGlzLmF1ZGlvQ29udGV4dC5jcmVhdGVNZWRpYVN0cmVhbVNvdXJjZShzdHJlYW0pO1xuICAgIHRoaXMuYW5hbHlzZXIgPSB0aGlzLmF1ZGlvQ29udGV4dC5jcmVhdGVBbmFseXNlcigpO1xuICAgIHRoaXMuYW5hbHlzZXIubWluRGVjaWJlbHMgPSB0aGlzLm1pbkRlY2liZWxzO1xuICAgIHRoaXMubWVkaWFTdHJlYW1Tb3VyY2UuY29ubmVjdCh0aGlzLmFuYWx5c2VyKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBNZWRpYVJlY29yZGVyKHN0cmVhbTogTWVkaWFTdHJlYW0pOiB2b2lkIHtcbiAgICB0aGlzLm1lZGlhUmVjb3JkZXIgPSBuZXcgTWVkaWFSZWNvcmRlcihzdHJlYW0pO1xuXG4gICAgdGhpcy5tZWRpYVJlY29yZGVyLm9uZGF0YWF2YWlsYWJsZSA9IChldmVudCkgPT4ge1xuICAgICAgaWYgKGV2ZW50LmRhdGEuc2l6ZSA+IDAgJiYgIXRoaXMuaXNTaWxlbmNlKSB7XG4gICAgICAgIHRoaXMub25EYXRhQXZhaWxhYmxlPy4oZXZlbnQuZGF0YSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMubWVkaWFSZWNvcmRlci5zdGFydCh0aGlzLnRpbWVTbGljZSk7XG4gIH1cblxuICBhc3luYyBnZXRBdmFpbGFibGVEZXZpY2VzKCk6IFByb21pc2U8TWVkaWFEZXZpY2VJbmZvW10+IHtcbiAgICByZXR1cm4gbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5lbnVtZXJhdGVEZXZpY2VzKCk7XG4gIH1cblxuICBzZXREZXZpY2UoZGV2aWNlSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRldmljZUlkICE9PSBkZXZpY2VJZCkge1xuICAgICAgdGhpcy5kZXZpY2VJZCA9IGRldmljZUlkO1xuICAgICAgaWYgKHRoaXMubWVkaWFSZWNvcmRlciAmJiB0aGlzLm1lZGlhUmVjb3JkZXIuc3RhdGUgPT09ICdyZWNvcmRpbmcnKSB7XG4gICAgICAgIC8vIElmIHRoZSByZWNvcmRpbmcgaXMgcnVubmluZywgc3RvcCBpdCBiZWZvcmUgc3dpdGNoaW5nIGRldmljZXNcbiAgICAgICAgdGhpcy5zdG9wUmVjb3JkaW5nKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc3RvcFJlY29yZGluZygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNSZWNvcmRpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5tZWRpYVJlY29yZGVyICYmIHRoaXMuaGFzU291bmRTdGFydGVkICYmIHRoaXMubWVkaWFSZWNvcmRlci5zdGF0ZSA9PT0gJ3JlY29yZGluZycpIHtcbiAgICAgIHRoaXMubWVkaWFSZWNvcmRlci5yZXF1ZXN0RGF0YSgpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuY2xlYW5VcCgpO1xuICAgICAgfSwgMTAwKTsgLy8gYWRqdXN0IHRoaXMgZGVsYXkgYXMgbmVjZXNzYXJ5XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2xlYW5VcCgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNpbGVuY2VUaW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5zaWxlbmNlVGltZW91dCk7XG4gICAgICB0aGlzLnNpbGVuY2VUaW1lb3V0ID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNsZWFuVXAoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubWVkaWFSZWNvcmRlcj8uc3RhdGUgPT09ICdyZWNvcmRpbmcnKSB7XG4gICAgICB0aGlzLm1lZGlhUmVjb3JkZXI/LnN0b3AoKTtcbiAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuYW5pbWF0aW9uRnJhbWVJZCEpO1xuICAgIH1cbiAgICB0aGlzLm1lZGlhUmVjb3JkZXI/LnN0cmVhbT8uZ2V0VHJhY2tzKCkuZm9yRWFjaCgodHJhY2spID0+IHRyYWNrLnN0b3AoKSk7XG4gICAgdGhpcy5hdWRpb0NvbnRleHQ/LmNsb3NlKCk7XG4gICAgdGhpcy5oYXNTb3VuZFN0YXJ0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLmlzUmVjb3JkaW5nID0gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrRm9yU2lsZW5jZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubWVkaWFSZWNvcmRlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZWRpYVJlY29yZGVyIGlzIG5vdCBhdmFpbGFibGUnKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuYW5hbHlzZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQW5hbHlzZXIgaXMgbm90IGF2YWlsYWJsZScpO1xuICAgIH1cblxuICAgIGNvbnN0IGJ1ZmZlckxlbmd0aCA9IHRoaXMuYW5hbHlzZXIuZmZ0U2l6ZTtcbiAgICBjb25zdCBhbXBsaXR1ZGVBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoYnVmZmVyTGVuZ3RoIHx8IDApO1xuICAgIHRoaXMuYW5hbHlzZXIuZ2V0RmxvYXRUaW1lRG9tYWluRGF0YShhbXBsaXR1ZGVBcnJheSk7XG5cbiAgICBjb25zdCB2b2x1bWUgPSB0aGlzLmNvbXB1dGVWb2x1bWUoYW1wbGl0dWRlQXJyYXkpO1xuXG4gICAgdGhpcy5vblZvbHVtZUNoYW5nZT8uKHZvbHVtZSk7XG5cbiAgICBpZiAodGhpcy5zaWxlbmNlRGV0ZWN0aW9uRW5hYmxlZCkge1xuICAgICAgaWYgKHZvbHVtZSA8IHRoaXMuc2lsZW5jZVRocmVzaG9sZCkge1xuICAgICAgICBpZiAoIXRoaXMuc2lsZW5jZVRpbWVvdXQpIHtcbiAgICAgICAgICB0aGlzLnNpbGVuY2VUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5zdG9wUmVjb3JkZXJPblNpbGVuY2UpIHtcbiAgICAgICAgICAgICAgdGhpcy5tZWRpYVJlY29yZGVyPy5zdG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmlzU2lsZW5jZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnNpbGVuY2VUaW1lb3V0ID0gbnVsbDtcbiAgICAgICAgICB9LCB0aGlzLnNpbGVuY2VEdXJhdGlvbik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLnNpbGVuY2VUaW1lb3V0KSB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuc2lsZW5jZVRpbWVvdXQpO1xuICAgICAgICAgIHRoaXMuc2lsZW5jZVRpbWVvdXQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzU2lsZW5jZSkge1xuICAgICAgICAgIGlmICh0aGlzLnN0b3BSZWNvcmRlck9uU2lsZW5jZSkge1xuICAgICAgICAgICAgdGhpcy5tZWRpYVJlY29yZGVyLnN0YXJ0KHRoaXMudGltZVNsaWNlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5pc1NpbGVuY2UgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuaGFzU291bmRTdGFydGVkKSB7XG4gICAgICAgICAgdGhpcy5oYXNTb3VuZFN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5hbmltYXRpb25GcmFtZUlkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMuY2hlY2tGb3JTaWxlbmNlKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb21wdXRlVm9sdW1lKGFtcGxpdHVkZUFycmF5OiBGbG9hdDMyQXJyYXkpOiBudW1iZXIge1xuICAgIGNvbnN0IHZhbHVlcyA9IGFtcGxpdHVkZUFycmF5LnJlZHVjZSgoc3VtLCB2YWx1ZSkgPT4gc3VtICsgdmFsdWUgKiB2YWx1ZSwgMCk7XG4gICAgY29uc3QgYXZlcmFnZSA9IE1hdGguc3FydCh2YWx1ZXMgLyBhbXBsaXR1ZGVBcnJheS5sZW5ndGgpOyAvLyBjYWxjdWxhdGUgcm1zXG4gICAgY29uc3Qgdm9sdW1lID0gMjAgKiBNYXRoLmxvZzEwKGF2ZXJhZ2UpOyAvLyBjb252ZXJ0IHRvIGRCXG4gICAgcmV0dXJuIHZvbHVtZTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBTaWxlbmNlQXdhcmVSZWNvcmRlcjtcbiIsImltcG9ydCB1c2VTaWxlbmNlQXdhcmVSZWNvcmRlciBmcm9tICcuL3VzZVNpbGVuY2VBd2FyZVJlY29yZGVyJztcblxuZXhwb3J0IGRlZmF1bHQgdXNlU2lsZW5jZUF3YXJlUmVjb3JkZXI7XG4iXX0=