kwikid-camera
Version:
KwikID's Camera Component
188 lines • 21.4 kB
JavaScript
import { __awaiter, __decorate } from "tslib";
import { Injectable } from "@angular/core";
import { isNotEmptyValue, logMethod } from "kwikid-toolkit";
import * as RecordRTC from "recordrtc";
import { Subject } from "rxjs";
import { IRecordingState } from "./kwikid-camera-record.definitions";
import { getBase64FromVideoFile } from "./kwikid-camera-record.helper";
import * as i0 from "@angular/core";
export class KwikIDCameraRecordService {
constructor() {
this._mediaStream = new Subject();
this._blob = new Subject();
this.state = IRecordingState.NONE;
this._state = new Subject();
this.isFrontCamera = false;
this.videoDeviceId = null;
this.startTime = 0;
this.pauseTime = 0;
this.resumeTime = 0;
this.totalPausedTime = 0;
this.totalRecordingTime = 0;
this.minRecordingTimeInSeconds = null;
this.maxRecordingTimeInSeconds = null;
this._timerUpdate = new Subject();
}
// getObservable
getMediaStream() {
return this._mediaStream.asObservable();
}
getBlob() {
return this._blob.asObservable();
}
getTimerUpdate() {
return this._timerUpdate.asObservable();
}
getRecordingState() {
return this._state.asObservable();
}
setRecordingState(state) {
this.state = state;
this._state.next(state);
}
resetTimer() {
clearInterval(this.timerInterval);
this.startTime = 0;
this.pauseTime = 0;
this.resumeTime = 0;
this.totalPausedTime = 0;
this.totalRecordingTime = 0;
this._timerUpdate.next(0);
}
updateTimer() {
this.timerInterval = setInterval(() => {
if (this.state === IRecordingState.RECORDING) {
this.totalRecordingTime = Math.round((Date.now() - this.startTime - this.totalPausedTime) / 1000);
if (isNotEmptyValue(this.maxRecordingTimeInSeconds) &&
this.totalRecordingTime > this.maxRecordingTimeInSeconds) {
this.stopRecording();
}
else {
this._timerUpdate.next(this.totalRecordingTime);
}
}
if (this.state === IRecordingState.NONE ||
this.state === IRecordingState.RECORDED) {
this._timerUpdate.next(0);
}
}, 1000);
}
handleRecording() {
return __awaiter(this, void 0, void 0, function* () {
this.startTime = Date.now();
if (isNotEmptyValue(this.videoDeviceId)) {
this.mediaStream = yield navigator.mediaDevices.getUserMedia({
audio: true,
video: {
deviceId: {
exact: this.videoDeviceId
}
}
});
}
else {
this.mediaStream = yield navigator.mediaDevices.getUserMedia({
audio: true,
video: {
facingMode: this.isFrontCamera ? "user" : "environment"
}
});
}
this._mediaStream.next(this.mediaStream);
this.recorder = new RecordRTC(this.mediaStream, {
type: "video",
disableLogs: true,
mimeType: "video/webm;codecs=vp9",
frameInterval: 60
});
this.recorder.startRecording();
this.setRecordingState(IRecordingState.RECORDING);
});
}
startRecording({ minRecordingTimeInSeconds = null, maxRecordingTimeInSeconds = null, isFrontCamera = false, videoDeviceId = null }) {
this.isFrontCamera = isFrontCamera;
this.videoDeviceId = videoDeviceId;
this.minRecordingTimeInSeconds = minRecordingTimeInSeconds;
this.maxRecordingTimeInSeconds = maxRecordingTimeInSeconds;
this.handleRecording();
this.updateTimer();
}
pauseRecording() {
if (!this.recorder) {
return;
}
this.pauseTime = Date.now();
this.setRecordingState(IRecordingState.PAUSED);
this.recorder.pauseRecording();
}
resumeRecording() {
if (!this.recorder) {
this.handleRecording();
}
else {
this.resumeTime = Date.now();
this.totalPausedTime += this.resumeTime - this.pauseTime;
this.recorder.resumeRecording();
this.setRecordingState(IRecordingState.RECORDING);
}
}
stopRecording() {
if (!this.recorder) {
return;
}
if (this.minRecordingTimeInSeconds > this.totalRecordingTime) {
return;
}
this.recorder.stopRecording(() => __awaiter(this, void 0, void 0, function* () {
this.blob = this.recorder.getBlob();
const videoBase64 = yield getBase64FromVideoFile(this.blob);
this._blob.next(videoBase64);
this.mediaStream.stop();
this.recorder.destroy();
this.mediaStream = null;
this.recorder = null;
this.setRecordingState(IRecordingState.RECORDED);
this.resetTimer();
}));
}
downloadRecording() {
RecordRTC.invokeSaveAsDialog(this.blob, `${Date.now()}.webm`);
}
clearRecording() {
this.blob = null;
this.recorder = null;
this.mediaStream = null;
this.setRecordingState(IRecordingState.NONE);
this.resetTimer();
}
}
/** @nocollapse */ KwikIDCameraRecordService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikIDCameraRecordService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
/** @nocollapse */ KwikIDCameraRecordService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikIDCameraRecordService, providedIn: "root" });
__decorate([
logMethod
], KwikIDCameraRecordService.prototype, "handleRecording", null);
__decorate([
logMethod
], KwikIDCameraRecordService.prototype, "startRecording", null);
__decorate([
logMethod
], KwikIDCameraRecordService.prototype, "pauseRecording", null);
__decorate([
logMethod
], KwikIDCameraRecordService.prototype, "resumeRecording", null);
__decorate([
logMethod
], KwikIDCameraRecordService.prototype, "stopRecording", null);
__decorate([
logMethod
], KwikIDCameraRecordService.prototype, "downloadRecording", null);
__decorate([
logMethod
], KwikIDCameraRecordService.prototype, "clearRecording", null);
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikIDCameraRecordService, decorators: [{
type: Injectable,
args: [{
providedIn: "root"
}]
}], propDecorators: { handleRecording: [], startRecording: [], pauseRecording: [], resumeRecording: [], stopRecording: [], downloadRecording: [], clearRecording: [] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia3dpa2lkLWNhbWVyYS1yZWNvcmQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2t3aWtpZC1jYW1lcmEvc3JjL2xpYi9jb21wb25lbnRzL2t3aWtpZC1jYW1lcmEtcmVjb3JkL2t3aWtpZC1jYW1lcmEtcmVjb3JkLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1RCxPQUFPLEtBQUssU0FBUyxNQUFNLFdBQVcsQ0FBQztBQUN2QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFDTCxlQUFlLEVBRWhCLE1BQU0sb0NBQW9DLENBQUM7QUFDNUMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sK0JBQStCLENBQUM7O0FBS3ZFLE1BQU0sT0FBTyx5QkFBeUI7SUFIdEM7UUFVVSxpQkFBWSxHQUFHLElBQUksT0FBTyxFQUFPLENBQUM7UUFFbEMsVUFBSyxHQUFHLElBQUksT0FBTyxFQUFPLENBQUM7UUFFM0IsVUFBSyxHQUFvQixlQUFlLENBQUMsSUFBSSxDQUFDO1FBRTlDLFdBQU0sR0FBRyxJQUFJLE9BQU8sRUFBbUIsQ0FBQztRQUV4QyxrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUV0QixrQkFBYSxHQUFXLElBQUksQ0FBQztRQUk3QixjQUFTLEdBQUcsQ0FBQyxDQUFDO1FBRWQsY0FBUyxHQUFHLENBQUMsQ0FBQztRQUVkLGVBQVUsR0FBRyxDQUFDLENBQUM7UUFFZixvQkFBZSxHQUFHLENBQUMsQ0FBQztRQUVwQix1QkFBa0IsR0FBRyxDQUFDLENBQUM7UUFFdkIsOEJBQXlCLEdBQVcsSUFBSSxDQUFDO1FBRXpDLDhCQUF5QixHQUFXLElBQUksQ0FBQztRQUV6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QUFpQixDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNqRCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDcEIsQ0FBQyxDQUFBLENBQUMsQ0FBQztJQUNMLENBQUM7SUFHRCxpQkFBaUI7UUFDZixTQUFTLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUdELGNBQWM7UUFDWixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNyQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUV4QixJQUFJLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQixDQUFDOzswSUE5TVUseUJBQXlCOzhJQUF6Qix5QkFBeUIsY0FGeEIsTUFBTTtBQWlHbEI7SUFEQyxTQUFTO2dFQThCVDtBQUdEO0lBREMsU0FBUzsrREFjVDtBQUdEO0lBREMsU0FBUzsrREFTVDtBQUdEO0lBREMsU0FBUztnRUFXVDtBQUdEO0lBREMsU0FBUzs4REF5QlQ7QUFHRDtJQURDLFNBQVM7a0VBR1Q7QUFHRDtJQURDLFNBQVM7K0RBUVQ7NEZBOU1VLHlCQUF5QjtrQkFIckMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OEJBZ0dPLGVBQWUsTUFnQ3JCLGNBQWMsTUFnQmQsY0FBYyxNQVdkLGVBQWUsTUFhZixhQUFhLE1BMkJiLGlCQUFpQixNQUtqQixjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBpc05vdEVtcHR5VmFsdWUsIGxvZ01ldGhvZCB9IGZyb20gXCJrd2lraWQtdG9vbGtpdFwiO1xuaW1wb3J0ICogYXMgUmVjb3JkUlRDIGZyb20gXCJyZWNvcmRydGNcIjtcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHtcbiAgSVJlY29yZGluZ1N0YXRlLFxuICBUUmVjb3JkaW5nU3RhdGVcbn0gZnJvbSBcIi4va3dpa2lkLWNhbWVyYS1yZWNvcmQuZGVmaW5pdGlvbnNcIjtcbmltcG9ydCB7IGdldEJhc2U2NEZyb21WaWRlb0ZpbGUgfSBmcm9tIFwiLi9rd2lraWQtY2FtZXJhLXJlY29yZC5oZWxwZXJcIjtcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiBcInJvb3RcIlxufSlcbmV4cG9ydCBjbGFzcyBLd2lrSURDYW1lcmFSZWNvcmRTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBtZWRpYVN0cmVhbTogYW55O1xuXG4gIHByaXZhdGUgcmVjb3JkZXI6IGFueTtcblxuICBwcml2YXRlIGJsb2I6IGFueTtcblxuICBwcml2YXRlIF9tZWRpYVN0cmVhbSA9IG5ldyBTdWJqZWN0PGFueT4oKTtcblxuICBwcml2YXRlIF9ibG9iID0gbmV3IFN1YmplY3Q8YW55PigpO1xuXG4gIHByaXZhdGUgc3RhdGU6IFRSZWNvcmRpbmdTdGF0ZSA9IElSZWNvcmRpbmdTdGF0ZS5OT05FO1xuXG4gIHByaXZhdGUgX3N0YXRlID0gbmV3IFN1YmplY3Q8VFJlY29yZGluZ1N0YXRlPigpO1xuXG4gIHByaXZhdGUgaXNGcm9udENhbWVyYSA9IGZhbHNlO1xuXG4gIHByaXZhdGUgdmlkZW9EZXZpY2VJZDogc3RyaW5nID0gbnVsbDtcblxuICBwcml2YXRlIHRpbWVySW50ZXJ2YWw6IGFueTtcblxuICBwcml2YXRlIHN0YXJ0VGltZSA9IDA7XG5cbiAgcHJpdmF0ZSBwYXVzZVRpbWUgPSAwO1xuXG4gIHByaXZhdGUgcmVzdW1lVGltZSA9IDA7XG5cbiAgcHJpdmF0ZSB0b3RhbFBhdXNlZFRpbWUgPSAwO1xuXG4gIHByaXZhdGUgdG90YWxSZWNvcmRpbmdUaW1lID0gMDtcblxuICBwcml2YXRlIG1pblJlY29yZGluZ1RpbWVJblNlY29uZHM6IG51bWJlciA9IG51bGw7XG5cbiAgcHJpdmF0ZSBtYXhSZWNvcmRpbmdUaW1lSW5TZWNvbmRzOiBudW1iZXIgPSBudWxsO1xuXG4gIHByaXZhdGUgX3RpbWVyVXBkYXRlID0gbmV3IFN1YmplY3Q8bnVtYmVyPigpO1xuXG4gIC8vIGdldE9ic2VydmFibGVcbiAgZ2V0TWVkaWFTdHJlYW0oKSB7XG4gICAgcmV0dXJuIHRoaXMuX21lZGlhU3RyZWFtLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgZ2V0QmxvYigpIHtcbiAgICByZXR1cm4gdGhpcy5fYmxvYi5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGdldFRpbWVyVXBkYXRlKCkge1xuICAgIHJldHVybiB0aGlzLl90aW1lclVwZGF0ZS5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGdldFJlY29yZGluZ1N0YXRlKCkge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZS5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHNldFJlY29yZGluZ1N0YXRlKHN0YXRlOiBUUmVjb3JkaW5nU3RhdGUpIHtcbiAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgdGhpcy5fc3RhdGUubmV4dChzdGF0ZSk7XG4gIH1cblxuICBwcml2YXRlIHJlc2V0VGltZXIoKSB7XG4gICAgY2xlYXJJbnRlcnZhbCh0aGlzLnRpbWVySW50ZXJ2YWwpO1xuICAgIHRoaXMuc3RhcnRUaW1lID0gMDtcbiAgICB0aGlzLnBhdXNlVGltZSA9IDA7XG4gICAgdGhpcy5yZXN1bWVUaW1lID0gMDtcbiAgICB0aGlzLnRvdGFsUGF1c2VkVGltZSA9IDA7XG4gICAgdGhpcy50b3RhbFJlY29yZGluZ1RpbWUgPSAwO1xuICAgIHRoaXMuX3RpbWVyVXBkYXRlLm5leHQoMCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVRpbWVyKCkge1xuICAgIHRoaXMudGltZXJJbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnN0YXRlID09PSBJUmVjb3JkaW5nU3RhdGUuUkVDT1JESU5HKSB7XG4gICAgICAgIHRoaXMudG90YWxSZWNvcmRpbmdUaW1lID0gTWF0aC5yb3VuZChcbiAgICAgICAgICAoRGF0ZS5ub3coKSAtIHRoaXMuc3RhcnRUaW1lIC0gdGhpcy50b3RhbFBhdXNlZFRpbWUpIC8gMTAwMFxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBpc05vdEVtcHR5VmFsdWUodGhpcy5tYXhSZWNvcmRpbmdUaW1lSW5TZWNvbmRzKSAmJlxuICAgICAgICAgIHRoaXMudG90YWxSZWNvcmRpbmdUaW1lID4gdGhpcy5tYXhSZWNvcmRpbmdUaW1lSW5TZWNvbmRzXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMuc3RvcFJlY29yZGluZygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX3RpbWVyVXBkYXRlLm5leHQodGhpcy50b3RhbFJlY29yZGluZ1RpbWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuc3RhdGUgPT09IElSZWNvcmRpbmdTdGF0ZS5OT05FIHx8XG4gICAgICAgIHRoaXMuc3RhdGUgPT09IElSZWNvcmRpbmdTdGF0ZS5SRUNPUkRFRFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuX3RpbWVyVXBkYXRlLm5leHQoMCk7XG4gICAgICB9XG4gICAgfSwgMTAwMCk7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGFzeW5jIGhhbmRsZVJlY29yZGluZygpIHtcbiAgICB0aGlzLnN0YXJ0VGltZSA9IERhdGUubm93KCk7XG5cbiAgICBpZiAoaXNOb3RFbXB0eVZhbHVlKHRoaXMudmlkZW9EZXZpY2VJZCkpIHtcbiAgICAgIHRoaXMubWVkaWFTdHJlYW0gPSBhd2FpdCBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSh7XG4gICAgICAgIGF1ZGlvOiB0cnVlLFxuICAgICAgICB2aWRlbzoge1xuICAgICAgICAgIGRldmljZUlkOiB7XG4gICAgICAgICAgICBleGFjdDogdGhpcy52aWRlb0RldmljZUlkXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tZWRpYVN0cmVhbSA9IGF3YWl0IG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKHtcbiAgICAgICAgYXVkaW86IHRydWUsXG4gICAgICAgIHZpZGVvOiB7XG4gICAgICAgICAgZmFjaW5nTW9kZTogdGhpcy5pc0Zyb250Q2FtZXJhID8gXCJ1c2VyXCIgOiBcImVudmlyb25tZW50XCJcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuX21lZGlhU3RyZWFtLm5leHQodGhpcy5tZWRpYVN0cmVhbSk7XG4gICAgdGhpcy5yZWNvcmRlciA9IG5ldyBSZWNvcmRSVEModGhpcy5tZWRpYVN0cmVhbSwge1xuICAgICAgdHlwZTogXCJ2aWRlb1wiLFxuICAgICAgZGlzYWJsZUxvZ3M6IHRydWUsXG4gICAgICBtaW1lVHlwZTogXCJ2aWRlby93ZWJtO2NvZGVjcz12cDlcIixcbiAgICAgIGZyYW1lSW50ZXJ2YWw6IDYwXG4gICAgfSk7XG4gICAgdGhpcy5yZWNvcmRlci5zdGFydFJlY29yZGluZygpO1xuICAgIHRoaXMuc2V0UmVjb3JkaW5nU3RhdGUoSVJlY29yZGluZ1N0YXRlLlJFQ09SRElORyk7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIHN0YXJ0UmVjb3JkaW5nKHtcbiAgICBtaW5SZWNvcmRpbmdUaW1lSW5TZWNvbmRzID0gbnVsbCxcbiAgICBtYXhSZWNvcmRpbmdUaW1lSW5TZWNvbmRzID0gbnVsbCxcbiAgICBpc0Zyb250Q2FtZXJhID0gZmFsc2UsXG4gICAgdmlkZW9EZXZpY2VJZCA9IG51bGxcbiAgfSkge1xuICAgIHRoaXMuaXNGcm9udENhbWVyYSA9IGlzRnJvbnRDYW1lcmE7XG4gICAgdGhpcy52aWRlb0RldmljZUlkID0gdmlkZW9EZXZpY2VJZDtcbiAgICB0aGlzLm1pblJlY29yZGluZ1RpbWVJblNlY29uZHMgPSBtaW5SZWNvcmRpbmdUaW1lSW5TZWNvbmRzO1xuICAgIHRoaXMubWF4UmVjb3JkaW5nVGltZUluU2Vjb25kcyA9IG1heFJlY29yZGluZ1RpbWVJblNlY29uZHM7XG5cbiAgICB0aGlzLmhhbmRsZVJlY29yZGluZygpO1xuICAgIHRoaXMudXBkYXRlVGltZXIoKTtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgcGF1c2VSZWNvcmRpbmcoKSB7XG4gICAgaWYgKCF0aGlzLnJlY29yZGVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucGF1c2VUaW1lID0gRGF0ZS5ub3coKTtcblxuICAgIHRoaXMuc2V0UmVjb3JkaW5nU3RhdGUoSVJlY29yZGluZ1N0YXRlLlBBVVNFRCk7XG4gICAgdGhpcy5yZWNvcmRlci5wYXVzZVJlY29yZGluZygpO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICByZXN1bWVSZWNvcmRpbmcoKSB7XG4gICAgaWYgKCF0aGlzLnJlY29yZGVyKSB7XG4gICAgICB0aGlzLmhhbmRsZVJlY29yZGluZygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlc3VtZVRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgdGhpcy50b3RhbFBhdXNlZFRpbWUgKz0gdGhpcy5yZXN1bWVUaW1lIC0gdGhpcy5wYXVzZVRpbWU7XG5cbiAgICAgIHRoaXMucmVjb3JkZXIucmVzdW1lUmVjb3JkaW5nKCk7XG4gICAgICB0aGlzLnNldFJlY29yZGluZ1N0YXRlKElSZWNvcmRpbmdTdGF0ZS5SRUNPUkRJTkcpO1xuICAgIH1cbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgc3RvcFJlY29yZGluZygpIHtcbiAgICBpZiAoIXRoaXMucmVjb3JkZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5taW5SZWNvcmRpbmdUaW1lSW5TZWNvbmRzID4gdGhpcy50b3RhbFJlY29yZGluZ1RpbWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnJlY29yZGVyLnN0b3BSZWNvcmRpbmcoYXN5bmMgKCkgPT4ge1xuICAgICAgdGhpcy5ibG9iID0gdGhpcy5yZWNvcmRlci5nZXRCbG9iKCk7XG5cbiAgICAgIGNvbnN0IHZpZGVvQmFzZTY0ID0gYXdhaXQgZ2V0QmFzZTY0RnJvbVZpZGVvRmlsZSh0aGlzLmJsb2IpO1xuXG4gICAgICB0aGlzLl9ibG9iLm5leHQodmlkZW9CYXNlNjQpO1xuXG4gICAgICB0aGlzLm1lZGlhU3RyZWFtLnN0b3AoKTtcbiAgICAgIHRoaXMucmVjb3JkZXIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5tZWRpYVN0cmVhbSA9IG51bGw7XG4gICAgICB0aGlzLnJlY29yZGVyID0gbnVsbDtcblxuICAgICAgdGhpcy5zZXRSZWNvcmRpbmdTdGF0ZShJUmVjb3JkaW5nU3RhdGUuUkVDT1JERUQpO1xuICAgICAgdGhpcy5yZXNldFRpbWVyKCk7XG4gICAgfSk7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGRvd25sb2FkUmVjb3JkaW5nKCkge1xuICAgIFJlY29yZFJUQy5pbnZva2VTYXZlQXNEaWFsb2codGhpcy5ibG9iLCBgJHtEYXRlLm5vdygpfS53ZWJtYCk7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGNsZWFyUmVjb3JkaW5nKCkge1xuICAgIHRoaXMuYmxvYiA9IG51bGw7XG4gICAgdGhpcy5yZWNvcmRlciA9IG51bGw7XG4gICAgdGhpcy5tZWRpYVN0cmVhbSA9IG51bGw7XG5cbiAgICB0aGlzLnNldFJlY29yZGluZ1N0YXRlKElSZWNvcmRpbmdTdGF0ZS5OT05FKTtcbiAgICB0aGlzLnJlc2V0VGltZXIoKTtcbiAgfVxufVxuIl19