@lifeintelligencegroup/ngx-lig-ari
Version:
Life Intelligence Group Artificial Intelligence
243 lines • 30.2 kB
JavaScript
import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs';
import isEmpty from 'lodash-es/isEmpty';
import { v4 as uuidv4 } from 'uuid';
import { AriMobileComponent } from '../ari-mobile/ari-mobile.component';
import { ariRhymes } from '../model/ari-bot.mode';
import * as i0 from "@angular/core";
import * as i1 from "@ionic/angular";
import * as i2 from "./localstorage.service";
import * as i3 from "@ionic-native/speech-recognition/ngx";
import * as i4 from "./common.service";
import * as i5 from "./ari-speech.service";
export var AriStatus;
(function (AriStatus) {
AriStatus[AriStatus["Open"] = 0] = "Open";
AriStatus[AriStatus["Close"] = 1] = "Close";
})(AriStatus || (AriStatus = {}));
export class NgxLigAriService {
constructor(modalController, plt, localStorageService, speechRecognition, commonService,
// private ariBotService: AriBotService,
ariSpeechService) {
this.modalController = modalController;
this.plt = plt;
this.localStorageService = localStorageService;
this.speechRecognition = speechRecognition;
this.commonService = commonService;
this.ariSpeechService = ariSpeechService;
this.showAriChatBox = false;
this.status = new BehaviorSubject(AriStatus.Close);
this.ariPopUp = false;
this.activatedByVoice = false;
this.voiceActivatorOff = true;
this.status.next(AriStatus.Close);
this.initAriStatus();
setTimeout(() => {
this.commonService.setNewUser();
}, 1000);
}
async openMobileAri() {
const modal = await this.modalController.create({
component: AriMobileComponent,
cssClass: 'ari-tablet-modal-css',
backdropDismiss: false,
showBackdrop: false,
keyboardClose: false,
});
modal.present();
}
initAriStatus() {
this.status.next(AriStatus.Close);
}
setUserID(user) {
this.userUUID = user;
}
getUser() {
if (isEmpty(this.userUUID)) {
return uuidv4();
}
else {
return this.userUUID;
}
}
async ariVoiceActivator() {
// Initiate on main component to call ari by simply saying "Hey ari" or "Ok ari"
this.ariSpeechService.initWebSpeechRecognition();
this.plt.ready().then(() => {
if (this.plt.is('cordova') || this.plt.is('capacitor')) {
this.speechRecognition
.hasPermission()
.then((hasPermission) => {
if (!hasPermission) {
this.speechRecognition.requestPermission().then(() => {
this.startMobileVoiceActivation();
});
}
else {
this.startMobileVoiceActivation();
}
});
}
else {
const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
if (SpeechRecognition && !this.voiceActivatorOff) {
this.SpeechRecognition = new SpeechRecognition();
this.SpeechRecognition.start();
this.SpeechRecognition.addEventListener('result', (e) => {
const transcript = Array.from(e.results)
.map((result) => result[0])
.map((result) => result.transcript)
.join('');
if (ariRhymes.indexOf(transcript.toLowerCase()) >= 0) {
console.log(transcript);
this.ariPopUp = true;
if (this.activatedByVoice) {
this.showAriByVoice();
}
else {
this.showAri();
}
this.SpeechRecognition.stop();
}
});
this.SpeechRecognition.addEventListener('end', (e) => {
if (!this.ariPopUp && !this.voiceActivatorOff) {
this.stopCurrentSpeech();
this.ariVoiceActivator();
}
});
}
}
});
}
startMobileVoiceActivation() {
this.speechRecognition
.startListening({
language: 'en-US',
showPartial: false,
showPopup: false,
})
.subscribe((matches) => {
const foundmatches = matches.filter((item) => {
if (ariRhymes.indexOf(item.toLowerCase()) >= 0) {
return item;
}
});
if (foundmatches.length > 0) {
this.ariPopUp = true;
if (this.activatedByVoice) {
this.showAriByVoice();
}
else {
this.showAri();
}
this.speechRecognition.stopListening();
}
}, (onerror) => {
console.error('Speech Recognition error: ', onerror);
if (onerror === 'No match') {
if (!this.ariPopUp) {
this.ariVoiceActivator();
}
}
});
}
ariVoiceActivatorOn() {
this.activatedByVoice = true;
this.voiceActivatorOff = false;
this.ariVoiceActivator();
}
ariVoiceActivatorOff() {
this.voiceActivatorOff = true;
this.stopCurrentSpeech();
}
showAriByVoice() {
if (this.plt.is('mobile') && !this.plt.is('tablet')) {
setTimeout(() => {
this.status.next(AriStatus.Open);
this.openMobileAri();
}, 1000);
}
else if (this.plt.is('desktop') || this.plt.is('tablet')) {
setTimeout(() => {
this.status.next(AriStatus.Open);
}, 1000);
}
}
showAri() {
console.log("isDesktop? ", this.plt.is("desktop"));
console.log("Platform? ", this.plt.platforms());
this.activatedByVoice = false;
// this.ariBotService.initConversation();
if (this.plt.is('mobile') && !this.plt.is('tablet')) {
this.speechRecognition.stopListening();
setTimeout(() => {
this.status.next(AriStatus.Open);
this.openMobileAri();
}, 1000);
}
else if ((this.plt.is('desktop') || this.plt.is('tablet'))) {
this.stopCurrentSpeech();
setTimeout(() => {
this.status.next(AriStatus.Open);
}, 1000);
}
}
closeAri() {
this.stopCurrentSpeech();
if (this.plt.is('mobile') && !this.plt.is('tablet')) {
if (this.speechRecognition) {
this.speechRecognition.stopListening();
}
this.status.next(AriStatus.Close);
this.modalController.dismiss();
}
else if (this.plt.is('desktop') || this.plt.is('tablet')) {
if (this.SpeechRecognition) {
this.SpeechRecognition.stop();
}
this.status.next(AriStatus.Close);
}
this.ariPopUp = false;
this.localStorageService.removeItem('AriCreds');
setTimeout(() => {
if (!this.voiceActivatorOff) {
this.ariVoiceActivator(); // Onclose recall voice activator for Desktop
}
this.activatedByVoice = false;
}, 1000);
}
stopCurrentSpeech() {
// STOP VOICE ACTIVATION TO PREVENT RUNNING 2 SPEECH RECOGNITION THAT CAUSE "ABORTED" ERROR
if (this.plt.is('cordova') || this.plt.is('capacitor')) {
this.speechRecognition.stopListening();
}
else {
const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
if (SpeechRecognition) {
this.SpeechRecognition = new SpeechRecognition();
this.SpeechRecognition.stop();
}
}
}
toggleAri() {
this.showAriChatBox = !this.showAriChatBox;
const status = this.showAriChatBox ? AriStatus.Open : AriStatus.Close;
this.status.next(status);
}
onAriStatusChange() {
return this.status.asObservable();
}
getCurrentAriStatus() {
return this.status.getValue();
}
}
NgxLigAriService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.4", ngImport: i0, type: NgxLigAriService, deps: [{ token: i1.ModalController }, { token: i1.Platform }, { token: i2.LocalstorageService }, { token: i3.SpeechRecognition }, { token: i4.CommonService }, { token: i5.AriSpeechService }], target: i0.ɵɵFactoryTarget.Injectable });
NgxLigAriService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.4", ngImport: i0, type: NgxLigAriService, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.4", ngImport: i0, type: NgxLigAriService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root',
}]
}], ctorParameters: function () { return [{ type: i1.ModalController }, { type: i1.Platform }, { type: i2.LocalstorageService }, { type: i3.SpeechRecognition }, { type: i4.CommonService }, { type: i5.AriSpeechService }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWxpZy1hcmkuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1saWctYXJpL3NyYy9saWIvc2VydmljZXMvbmd4LWxpZy1hcmkuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxlQUFlLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDbkQsT0FBTyxPQUFPLE1BQU0sbUJBQW1CLENBQUM7QUFDeEMsT0FBTyxFQUFFLEVBQUUsSUFBSSxNQUFNLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFJeEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHVCQUF1QixDQUFDOzs7Ozs7O0FBS2xELE1BQU0sQ0FBTixJQUFZLFNBR1g7QUFIRCxXQUFZLFNBQVM7SUFDbkIseUNBQUksQ0FBQTtJQUNKLDJDQUFLLENBQUE7QUFDUCxDQUFDLEVBSFcsU0FBUyxLQUFULFNBQVMsUUFHcEI7QUFLRCxNQUFNLE9BQU8sZ0JBQWdCO0lBVTNCLFlBQ1UsZUFBZ0MsRUFDaEMsR0FBYSxFQUNiLG1CQUF3QyxFQUN4QyxpQkFBcUMsRUFDckMsYUFBNEI7SUFDcEMsd0NBQXdDO0lBQ2hDLGdCQUFrQztRQU5sQyxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDaEMsUUFBRyxHQUFILEdBQUcsQ0FBVTtRQUNiLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFDeEMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFvQjtRQUNyQyxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUU1QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBaEJwQyxtQkFBYyxHQUFHLEtBQUssQ0FBQztRQUN2QixXQUFNLEdBQStCLElBQUksZUFBZSxDQUM5RCxTQUFTLENB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QyxDQUFDO0lBQzNCLENBQUM7SUFFRCxpQkFBaUI7UUFDZixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVELG1CQUFtQjtRQUNqQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDaEMsQ0FBQzs7NkdBbE9VLGdCQUFnQjtpSEFBaEIsZ0JBQWdCLGNBRmYsTUFBTTsyRkFFUCxnQkFBZ0I7a0JBSDVCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTW9kYWxDb250cm9sbGVyLCBQbGF0Zm9ybSB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IGlzRW1wdHkgZnJvbSAnbG9kYXNoLWVzL2lzRW1wdHknO1xuaW1wb3J0IHsgdjQgYXMgdXVpZHY0IH0gZnJvbSAndXVpZCc7XG5pbXBvcnQgeyBBcmlNb2JpbGVDb21wb25lbnQgfSBmcm9tICcuLi9hcmktbW9iaWxlL2FyaS1tb2JpbGUuY29tcG9uZW50JztcbmltcG9ydCB7IExvY2Fsc3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuL2xvY2Fsc3RvcmFnZS5zZXJ2aWNlJztcbmltcG9ydCB7IEFyaVNwZWVjaFNlcnZpY2UgfSBmcm9tICcuL2FyaS1zcGVlY2guc2VydmljZSc7XG5pbXBvcnQgeyBTcGVlY2hSZWNvZ25pdGlvbiBhcyBUU3BlZWNoUmVjb2duaXRpb24gfSBmcm9tICdAaW9uaWMtbmF0aXZlL3NwZWVjaC1yZWNvZ25pdGlvbi9uZ3gnO1xuaW1wb3J0IHsgYXJpUmh5bWVzIH0gZnJvbSAnLi4vbW9kZWwvYXJpLWJvdC5tb2RlJztcbi8vIGltcG9ydCB7IEFyaUJvdFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9hcmktYm90LnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29tbW9uU2VydmljZSB9IGZyb20gJy4vY29tbW9uLnNlcnZpY2UnO1xuXG5kZWNsYXJlIGNvbnN0IHdpbmRvdzogYW55O1xuZXhwb3J0IGVudW0gQXJpU3RhdHVzIHtcbiAgT3BlbixcbiAgQ2xvc2UsXG59XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3hMaWdBcmlTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBzaG93QXJpQ2hhdEJveCA9IGZhbHNlO1xuICBwcml2YXRlIHN0YXR1czogQmVoYXZpb3JTdWJqZWN0PEFyaVN0YXR1cz4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KFxuICAgIEFyaVN0YXR1cy5DbG9zZVxuICApO1xuICBhcmlQb3BVcCA9IGZhbHNlO1xuICBhY3RpdmF0ZWRCeVZvaWNlID0gZmFsc2U7XG4gIHZvaWNlQWN0aXZhdG9yT2ZmID0gdHJ1ZTtcbiAgcHJpdmF0ZSB1c2VyVVVJRDogc3RyaW5nO1xuICBTcGVlY2hSZWNvZ25pdGlvbjtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBtb2RhbENvbnRyb2xsZXI6IE1vZGFsQ29udHJvbGxlcixcbiAgICBwcml2YXRlIHBsdDogUGxhdGZvcm0sXG4gICAgcHJpdmF0ZSBsb2NhbFN0b3JhZ2VTZXJ2aWNlOiBMb2NhbHN0b3JhZ2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgc3BlZWNoUmVjb2duaXRpb246IFRTcGVlY2hSZWNvZ25pdGlvbixcbiAgICBwcml2YXRlIGNvbW1vblNlcnZpY2U6IENvbW1vblNlcnZpY2UsXG4gICAgLy8gcHJpdmF0ZSBhcmlCb3RTZXJ2aWNlOiBBcmlCb3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgYXJpU3BlZWNoU2VydmljZTogQXJpU3BlZWNoU2VydmljZVxuICApIHtcbiAgICB0aGlzLnN0YXR1cy5uZXh0KEFyaVN0YXR1cy5DbG9zZSk7XG4gICAgdGhpcy5pbml0QXJpU3RhdHVzKCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmNvbW1vblNlcnZpY2Uuc2V0TmV3VXNlcigpO1xuICAgIH0sIDEwMDApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBvcGVuTW9iaWxlQXJpKCkge1xuICAgIGNvbnN0IG1vZGFsID0gYXdhaXQgdGhpcy5tb2RhbENvbnRyb2xsZXIuY3JlYXRlKHtcbiAgICAgIGNvbXBvbmVudDogQXJpTW9iaWxlQ29tcG9uZW50LFxuICAgICAgY3NzQ2xhc3M6ICdhcmktdGFibGV0LW1vZGFsLWNzcycsXG4gICAgICBiYWNrZHJvcERpc21pc3M6IGZhbHNlLFxuICAgICAgc2hvd0JhY2tkcm9wOiBmYWxzZSxcbiAgICAgIGtleWJvYXJkQ2xvc2U6IGZhbHNlLFxuICAgIH0pO1xuICAgIG1vZGFsLnByZXNlbnQoKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdEFyaVN0YXR1cygpIHtcbiAgICB0aGlzLnN0YXR1cy5uZXh0KEFyaVN0YXR1cy5DbG9zZSk7XG4gIH1cblxuICBzZXRVc2VySUQodXNlcjogc3RyaW5nKSB7XG4gICAgdGhpcy51c2VyVVVJRCA9IHVzZXI7XG4gIH1cblxuICBnZXRVc2VyKCkge1xuICAgIGlmIChpc0VtcHR5KHRoaXMudXNlclVVSUQpKSB7XG4gICAgICByZXR1cm4gdXVpZHY0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnVzZXJVVUlEO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGFyaVZvaWNlQWN0aXZhdG9yKCkge1xuICAgIC8vIEluaXRpYXRlIG9uIG1haW4gY29tcG9uZW50IHRvIGNhbGwgYXJpIGJ5IHNpbXBseSBzYXlpbmcgXCJIZXkgYXJpXCIgb3IgXCJPayBhcmlcIlxuICAgIHRoaXMuYXJpU3BlZWNoU2VydmljZS5pbml0V2ViU3BlZWNoUmVjb2duaXRpb24oKTtcbiAgICB0aGlzLnBsdC5yZWFkeSgpLnRoZW4oKCkgPT4ge1xuICAgICAgaWYgKHRoaXMucGx0LmlzKCdjb3Jkb3ZhJykgfHwgdGhpcy5wbHQuaXMoJ2NhcGFjaXRvcicpKSB7XG4gICAgICAgIHRoaXMuc3BlZWNoUmVjb2duaXRpb25cbiAgICAgICAgICAuaGFzUGVybWlzc2lvbigpXG4gICAgICAgICAgLnRoZW4oKGhhc1Blcm1pc3Npb246IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICAgIGlmICghaGFzUGVybWlzc2lvbikge1xuICAgICAgICAgICAgICB0aGlzLnNwZWVjaFJlY29nbml0aW9uLnJlcXVlc3RQZXJtaXNzaW9uKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGFydE1vYmlsZVZvaWNlQWN0aXZhdGlvbigpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuc3RhcnRNb2JpbGVWb2ljZUFjdGl2YXRpb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IFNwZWVjaFJlY29nbml0aW9uID1cbiAgICAgICAgICB3aW5kb3cuU3BlZWNoUmVjb2duaXRpb24gfHwgd2luZG93LndlYmtpdFNwZWVjaFJlY29nbml0aW9uO1xuICAgICAgICBpZiAoU3BlZWNoUmVjb2duaXRpb24gJiYgIXRoaXMudm9pY2VBY3RpdmF0b3JPZmYpIHtcbiAgICAgICAgICB0aGlzLlNwZWVjaFJlY29nbml0aW9uID0gbmV3IFNwZWVjaFJlY29nbml0aW9uKCk7XG4gICAgICAgICAgdGhpcy5TcGVlY2hSZWNvZ25pdGlvbi5zdGFydCgpO1xuICAgICAgICAgIHRoaXMuU3BlZWNoUmVjb2duaXRpb24uYWRkRXZlbnRMaXN0ZW5lcigncmVzdWx0JywgKGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zY3JpcHQgPSBBcnJheS5mcm9tKGUucmVzdWx0cylcbiAgICAgICAgICAgICAgLm1hcCgocmVzdWx0KSA9PiByZXN1bHRbMF0pXG4gICAgICAgICAgICAgIC5tYXAoKHJlc3VsdCkgPT4gcmVzdWx0LnRyYW5zY3JpcHQpXG4gICAgICAgICAgICAgIC5qb2luKCcnKTtcbiAgICAgICAgICAgIGlmIChhcmlSaHltZXMuaW5kZXhPZih0cmFuc2NyaXB0LnRvTG93ZXJDYXNlKCkpID49IDApIHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2codHJhbnNjcmlwdClcbiAgICAgICAgICAgICAgdGhpcy5hcmlQb3BVcCA9IHRydWU7XG4gICAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2YXRlZEJ5Vm9pY2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dBcmlCeVZvaWNlKCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93QXJpKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5TcGVlY2hSZWNvZ25pdGlvbi5zdG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5TcGVlY2hSZWNvZ25pdGlvbi5hZGRFdmVudExpc3RlbmVyKCdlbmQnLCAoZSkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmFyaVBvcFVwICYmICF0aGlzLnZvaWNlQWN0aXZhdG9yT2ZmKSB7XG4gICAgICAgICAgICAgIHRoaXMuc3RvcEN1cnJlbnRTcGVlY2goKTtcbiAgICAgICAgICAgICAgdGhpcy5hcmlWb2ljZUFjdGl2YXRvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgc3RhcnRNb2JpbGVWb2ljZUFjdGl2YXRpb24oKSB7XG4gICAgdGhpcy5zcGVlY2hSZWNvZ25pdGlvblxuICAgICAgLnN0YXJ0TGlzdGVuaW5nKHtcbiAgICAgICAgbGFuZ3VhZ2U6ICdlbi1VUycsXG4gICAgICAgIHNob3dQYXJ0aWFsOiBmYWxzZSxcbiAgICAgICAgc2hvd1BvcHVwOiBmYWxzZSxcbiAgICAgIH0pXG4gICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAobWF0Y2hlczogYW55KSA9PiB7XG4gICAgICAgICAgY29uc3QgZm91bmRtYXRjaGVzID0gbWF0Y2hlcy5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIGlmIChhcmlSaHltZXMuaW5kZXhPZihpdGVtLnRvTG93ZXJDYXNlKCkpID49IDApIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGZvdW5kbWF0Y2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmFyaVBvcFVwID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2YXRlZEJ5Vm9pY2UpIHtcbiAgICAgICAgICAgICAgdGhpcy5zaG93QXJpQnlWb2ljZSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5zaG93QXJpKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNwZWVjaFJlY29nbml0aW9uLnN0b3BMaXN0ZW5pbmcoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIChvbmVycm9yKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignU3BlZWNoIFJlY29nbml0aW9uIGVycm9yOiAnLCBvbmVycm9yKTtcbiAgICAgICAgICBpZiAob25lcnJvciA9PT0gJ05vIG1hdGNoJykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmFyaVBvcFVwKSB7XG4gICAgICAgICAgICAgIHRoaXMuYXJpVm9pY2VBY3RpdmF0b3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICk7XG4gIH1cbiAgYXJpVm9pY2VBY3RpdmF0b3JPbigpIHtcbiAgICB0aGlzLmFjdGl2YXRlZEJ5Vm9pY2UgPSB0cnVlO1xuICAgIHRoaXMudm9pY2VBY3RpdmF0b3JPZmYgPSBmYWxzZTtcbiAgICB0aGlzLmFyaVZvaWNlQWN0aXZhdG9yKCk7XG4gIH1cblxuICBhcmlWb2ljZUFjdGl2YXRvck9mZigpIHtcbiAgICB0aGlzLnZvaWNlQWN0aXZhdG9yT2ZmID0gdHJ1ZTtcbiAgICB0aGlzLnN0b3BDdXJyZW50U3BlZWNoKCk7XG4gIH1cblxuICBzaG93QXJpQnlWb2ljZSgpIHtcbiAgICBpZiAodGhpcy5wbHQuaXMoJ21vYmlsZScpICYmICF0aGlzLnBsdC5pcygndGFibGV0JykpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnN0YXR1cy5uZXh0KEFyaVN0YXR1cy5PcGVuKTtcbiAgICAgICAgdGhpcy5vcGVuTW9iaWxlQXJpKCk7XG4gICAgICB9LCAxMDAwKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMucGx0LmlzKCdkZXNrdG9wJykgfHwgdGhpcy5wbHQuaXMoJ3RhYmxldCcpKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5zdGF0dXMubmV4dChBcmlTdGF0dXMuT3Blbik7XG4gICAgICB9LCAxMDAwKTtcbiAgICB9XG4gIH1cblxuICBzaG93QXJpKCkge1xuICAgIGNvbnNvbGUubG9nKFwiaXNEZXNrdG9wPyBcIiwgdGhpcy5wbHQuaXMoXCJkZXNrdG9wXCIpKTtcbiAgICBjb25zb2xlLmxvZyhcIlBsYXRmb3JtPyBcIiwgdGhpcy5wbHQucGxhdGZvcm1zKCkpO1xuICAgIHRoaXMuYWN0aXZhdGVkQnlWb2ljZSA9IGZhbHNlO1xuICAgIC8vIHRoaXMuYXJpQm90U2VydmljZS5pbml0Q29udmVyc2F0aW9uKCk7XG4gICAgaWYgKHRoaXMucGx0LmlzKCdtb2JpbGUnKSAmJiAhdGhpcy5wbHQuaXMoJ3RhYmxldCcpKSB7XG4gICAgICB0aGlzLnNwZWVjaFJlY29nbml0aW9uLnN0b3BMaXN0ZW5pbmcoKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnN0YXR1cy5uZXh0KEFyaVN0YXR1cy5PcGVuKTtcbiAgICAgICAgdGhpcy5vcGVuTW9iaWxlQXJpKCk7XG4gICAgICB9LCAxMDAwKTtcbiAgICB9IGVsc2UgaWYgKCh0aGlzLnBsdC5pcygnZGVza3RvcCcpIHx8IHRoaXMucGx0LmlzKCd0YWJsZXQnKSkpIHtcbiAgICAgIHRoaXMuc3RvcEN1cnJlbnRTcGVlY2goKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnN0YXR1cy5uZXh0KEFyaVN0YXR1cy5PcGVuKTtcbiAgICAgIH0sIDEwMDApO1xuICAgIH1cbiAgfVxuXG4gIGNsb3NlQXJpKCkge1xuICAgIHRoaXMuc3RvcEN1cnJlbnRTcGVlY2goKTtcbiAgICBpZiAodGhpcy5wbHQuaXMoJ21vYmlsZScpICYmICF0aGlzLnBsdC5pcygndGFibGV0JykpIHtcbiAgICAgIGlmICh0aGlzLnNwZWVjaFJlY29nbml0aW9uKSB7XG4gICAgICAgIHRoaXMuc3BlZWNoUmVjb2duaXRpb24uc3RvcExpc3RlbmluZygpO1xuICAgICAgfVxuICAgICAgdGhpcy5zdGF0dXMubmV4dChBcmlTdGF0dXMuQ2xvc2UpO1xuICAgICAgdGhpcy5tb2RhbENvbnRyb2xsZXIuZGlzbWlzcygpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wbHQuaXMoJ2Rlc2t0b3AnKSB8fCB0aGlzLnBsdC5pcygndGFibGV0JykpIHtcbiAgICAgIGlmICh0aGlzLlNwZWVjaFJlY29nbml0aW9uKSB7XG4gICAgICAgIHRoaXMuU3BlZWNoUmVjb2duaXRpb24uc3RvcCgpO1xuICAgICAgfVxuICAgICAgdGhpcy5zdGF0dXMubmV4dChBcmlTdGF0dXMuQ2xvc2UpO1xuICAgIH1cbiAgICB0aGlzLmFyaVBvcFVwID0gZmFsc2U7XG4gICAgdGhpcy5sb2NhbFN0b3JhZ2VTZXJ2aWNlLnJlbW92ZUl0ZW0oJ0FyaUNyZWRzJyk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMudm9pY2VBY3RpdmF0b3JPZmYpIHtcbiAgICAgICAgdGhpcy5hcmlWb2ljZUFjdGl2YXRvcigpOyAvLyBPbmNsb3NlIHJlY2FsbCB2b2ljZSBhY3RpdmF0b3IgZm9yIERlc2t0b3BcbiAgICAgIH1cbiAgICAgIHRoaXMuYWN0aXZhdGVkQnlWb2ljZSA9IGZhbHNlO1xuICAgIH0sIDEwMDApO1xuICB9XG4gIHN0b3BDdXJyZW50U3BlZWNoKCkge1xuICAgIC8vIFNUT1AgVk9JQ0UgQUNUSVZBVElPTiBUTyBQUkVWRU5UIFJVTk5JTkcgMiBTUEVFQ0ggUkVDT0dOSVRJT04gVEhBVCBDQVVTRSBcIkFCT1JURURcIiBFUlJPUlxuICAgIGlmICh0aGlzLnBsdC5pcygnY29yZG92YScpIHx8IHRoaXMucGx0LmlzKCdjYXBhY2l0b3InKSkge1xuICAgICAgdGhpcy5zcGVlY2hSZWNvZ25pdGlvbi5zdG9wTGlzdGVuaW5nKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IFNwZWVjaFJlY29nbml0aW9uID1cbiAgICAgICAgd2luZG93LlNwZWVjaFJlY29nbml0aW9uIHx8IHdpbmRvdy53ZWJraXRTcGVlY2hSZWNvZ25pdGlvbjtcbiAgICAgIGlmIChTcGVlY2hSZWNvZ25pdGlvbikge1xuICAgICAgICB0aGlzLlNwZWVjaFJlY29nbml0aW9uID0gbmV3IFNwZWVjaFJlY29nbml0aW9uKCk7XG4gICAgICAgIHRoaXMuU3BlZWNoUmVjb2duaXRpb24uc3RvcCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICB0b2dnbGVBcmkoKSB7XG4gICAgdGhpcy5zaG93QXJpQ2hhdEJveCA9ICF0aGlzLnNob3dBcmlDaGF0Qm94O1xuICAgIGNvbnN0IHN0YXR1cyA9IHRoaXMuc2hvd0FyaUNoYXRCb3ggPyBBcmlTdGF0dXMuT3BlbiA6IEFyaVN0YXR1cy5DbG9zZTtcbiAgICB0aGlzLnN0YXR1cy5uZXh0KHN0YXR1cyk7XG4gIH1cblxuICBvbkFyaVN0YXR1c0NoYW5nZSgpOiBPYnNlcnZhYmxlPEFyaVN0YXR1cz4ge1xuICAgIHJldHVybiB0aGlzLnN0YXR1cy5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGdldEN1cnJlbnRBcmlTdGF0dXMoKTogQXJpU3RhdHVzIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0dXMuZ2V0VmFsdWUoKTtcbiAgfVxufVxuIl19