UNPKG

ngx-dynamic-dashboard

Version:
174 lines 23.1 kB
/** * Created by jayhamilton on 2/7/17. */ import { Injectable } from '@angular/core'; import { HttpClient, HttpHeaders } from '@angular/common/http'; import { EMPTY, Observable } from 'rxjs'; import { defaultBoard } from './configuration-sample-default-board'; import { sampleBoardCollection } from './configuration-sample-boards.model'; import { environment } from '../../environments/environment'; export class ConfigurationService { constructor(_http) { this._http = _http; this.demo = true; /** * todo - fix this hard coded store * @type {string} */ this.remoteConfigurationRepository = ''; this.defaultBoard = Object.assign({}, defaultBoard); this.sampleBoardCollection = Object.assign({}, sampleBoardCollection); this.env = environment; this.seedLocalStorageWithSampleBoardCollection(); } getBoards() { if (this.demo) { return new Observable(observer => { let data = JSON.parse(localStorage.getItem('board')); if (!data) { data = { board: [] }; } observer.next(data.board); return () => { }; }); } else { /** * todo - this call is based on an internal representation (admin console) of something called a store. * That concept requires refactoring. */ return this._http.get(this.remoteConfigurationRepository); } } saveBoard(board) { this.model = board; if (Object.keys(board).length === 0 && board.constructor === Object) { return EMPTY; } if (this.demo) { return new Observable(observer => { let board_collection; // find and remove board from storage this.deleteBoardFromLocalStore(board.title); // get a collection object and add board to it if ((board_collection = JSON.parse(localStorage.getItem('board'))) == null) { board_collection = { board: [] }; } board_collection['board'].push(board); // save localStorage.setItem('board', JSON.stringify(board_collection)); observer.next({}); return () => { }; }); } else { /** * todo - a delete must happen here * */ const httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/json' }) }; return this._http.post(this.remoteConfigurationRepository + '?id=' + board.title, JSON.stringify(board), httpOptions); } } deleteBoard(boardTitle) { if (this.demo) { return new Observable(observer => { this.deleteBoardFromLocalStore(boardTitle); observer.next({}); return () => { }; }); } else { return this._http.delete(this.remoteConfigurationRepository + '/' + boardTitle); } } getDefaultBoard() { return new Observable(observer => { observer.next(this.defaultBoard); return () => { }; }); } /* when a gadget instance's property page is updated and saved, the change gets communicated to all gadgets. The gadget instance id that caused the change will update their current instance. todo - this might be able to be improved. For now the utility of this approach allows the configuration service to capture the property page change in a way that allows us to update the persisted board model. */ notifyGadgetOnPropertyChange(gadgetConfig, instanceId) { this.savePropertyPageConfigurationToStore(gadgetConfig, instanceId); } setCurrentModel(_currentModel) { this.currentModel = _currentModel; } savePropertyPageConfigurationToStore(gadgetConfig, instanceId) { this.currentModel.rows.forEach(row => { row.columns.forEach(column => { if (column.gadgets) { column.gadgets.forEach(gadget => { this.updateProperties(gadgetConfig, gadget, instanceId); }); } }); }); this.saveBoard(this.currentModel).subscribe(result => { /** * todo - create popup/toast to show configuration saved message */ console.debug('The following configuration model was saved!'); }, error => console.error('Error' + error), () => console.debug('Saving configuration to store!')); } updateProperties(updatedProperties, gadget, instanceId) { const updatedPropsObject = JSON.parse(updatedProperties); if (gadget.instanceId === instanceId) { gadget.config.propertyPages.forEach(function (propertyPage) { for (let x = 0; x < propertyPage.properties.length; x++) { for (const prop in updatedPropsObject) { if (updatedPropsObject.hasOwnProperty(prop)) { if (prop === propertyPage.properties[x].key) { propertyPage.properties[x].value = updatedPropsObject[prop]; } } } } }); } } seedLocalStorageWithSampleBoardCollection() { if (localStorage.getItem('board') === null) { if (!this.env.production) { localStorage.setItem('board', JSON.stringify(this.sampleBoardCollection)); } } } delete(board_collection) { localStorage.removeItem('board'); localStorage.setItem('board', JSON.stringify(board_collection)); } deleteBoardFromLocalStore(boardTitle) { const board_collection = JSON.parse(localStorage.getItem('board')); let index; if (board_collection && (index = board_collection['board'].findIndex(item => { return item.title === boardTitle; })) >= 0) { board_collection['board'].splice(index, 1); this.delete(board_collection); } } } ConfigurationService.decorators = [ { type: Injectable } ]; ConfigurationService.ctorParameters = () => [ { type: HttpClient } ]; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJhdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9iZW5saS93b3Jrc3BhY2VzL25neC1keW5hbWljLWRhc2hib2FyZC1mcmFtZXdvcmsvcHJvamVjdHMvbmd4LWR5bmFtaWMtZGFzaGJvYXJkL3NyYy8iLCJzb3VyY2VzIjpbImRhc2hib2FyZC9zZXJ2aWNlcy9jb25maWd1cmF0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFDSCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBQyxVQUFVLEVBQUUsV0FBVyxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDN0QsT0FBTyxFQUFDLEtBQUssRUFBRSxVQUFVLEVBQWUsTUFBTSxNQUFNLENBQUM7QUFDckQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLHNDQUFzQyxDQUFDO0FBQ2xFLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLHFDQUFxQyxDQUFDO0FBQzFFLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxnQ0FBZ0MsQ0FBQztBQUszRCxNQUFNLE9BQU8sb0JBQW9CO0lBZTdCLFlBQW9CLEtBQWlCO1FBQWpCLFVBQUssR0FBTCxLQUFLLENBQVk7UUFackMsU0FBSSxHQUFHLElBQUksQ0FBQztRQU1aOzs7V0FHRztRQUNILGtDQUE2QixHQUFHLEVBQUUsQ0FBQztRQUkvQixJQUFJLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxxQkFBcUIsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3RFLElBQUksQ0FBQyxHQUFHLEdBQUcsV0FBVyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyx5Q0FBeUMsRUFBRSxDQUFDO0lBQ3JELENBQUM7SUFFTSxTQUFTO1FBRVosSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1gsT0FBTyxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDN0IsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQ3JELElBQUksQ0FBQyxJQUFJLEVBQUU7b0JBQ1AsSUFBSSxHQUFHLEVBQUMsS0FBSyxFQUFFLEVBQUUsRUFBQyxDQUFDO2lCQUN0QjtnQkFDRCxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDMUIsT0FBTyxHQUFHLEVBQUU7Z0JBQ1osQ0FBQyxDQUFDO1lBQ04sQ0FBQyxDQUFDLENBQUM7U0FFTjthQUFNO1lBQ0g7OztlQUdHO1lBQ0gsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsNkJBQTZCLENBQUMsQ0FBQztTQUM3RDtJQUNMLENBQUM7SUFFTSxTQUFTLENBQUMsS0FBWTtRQUV6QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUVuQixJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsV0FBVyxLQUFLLE1BQU0sRUFBRTtZQUNqRSxPQUFPLEtBQUssQ0FBQztTQUNoQjtRQUVELElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtZQUNYLE9BQU8sSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBQzdCLElBQUksZ0JBQWdCLENBQUM7Z0JBRXJCLHFDQUFxQztnQkFDckMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFFNUMsOENBQThDO2dCQUM5QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUU7b0JBRXhFLGdCQUFnQixHQUFHO3dCQUNmLEtBQUssRUFBRSxFQUFFO3FCQUNaLENBQUM7aUJBQ0w7Z0JBQ0QsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUV0QyxPQUFPO2dCQUNQLFlBQVksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO2dCQUVoRSxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUVsQixPQUFPLEdBQUcsRUFBRTtnQkFDWixDQUFDLENBQUM7WUFFTixDQUFDLENBQUMsQ0FBQztTQUVOO2FBQU07WUFFSDs7O2VBR0c7WUFDSCxNQUFNLFdBQVcsR0FBRztnQkFDaEIsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDO29CQUNyQixjQUFjLEVBQUUsa0JBQWtCO2lCQUNyQyxDQUFDO2FBQ0wsQ0FBQztZQUVGLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLDZCQUE2QixHQUFHLE1BQU0sR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7U0FDekg7SUFDTCxDQUFDO0lBRU0sV0FBVyxDQUFDLFVBQWtCO1FBRWpDLElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtZQUVYLE9BQU8sSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBRTdCLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFFM0MsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDbEIsT0FBTyxHQUFHLEVBQUU7Z0JBQ1osQ0FBQyxDQUFDO1lBRU4sQ0FBQyxDQUFDLENBQUM7U0FFTjthQUFNO1lBRUgsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsNkJBQTZCLEdBQUcsR0FBRyxHQUFHLFVBQVUsQ0FBQyxDQUFDO1NBQ25GO0lBQ0wsQ0FBQztJQUVNLGVBQWU7UUFFbEIsT0FBTyxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUM3QixRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNqQyxPQUFPLEdBQUcsRUFBRTtZQUNaLENBQUMsQ0FBQztRQUNOLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsNEJBQTRCLENBQUMsWUFBb0IsRUFBRSxVQUFrQjtRQUVqRSxJQUFJLENBQUMsb0NBQW9DLENBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFRCxlQUFlLENBQUMsYUFBa0I7UUFDOUIsSUFBSSxDQUFDLFlBQVksR0FBRyxhQUFhLENBQUM7SUFDdEMsQ0FBQztJQUVELG9DQUFvQyxDQUFDLFlBQW9CLEVBQUUsVUFBa0I7UUFFekUsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBRWpDLEdBQUcsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUV6QixJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUU7b0JBQ2hCLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO3dCQUM1QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztvQkFFNUQsQ0FBQyxDQUFDLENBQUM7aUJBQ047WUFDTCxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBRTdDOztlQUVHO1lBQ0gsT0FBTyxDQUFDLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO1FBRWxFLENBQUMsRUFDRCxLQUFLLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxFQUN2QyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLGdDQUFnQyxDQUFDLENBQUMsQ0FBQztJQUcvRCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsaUJBQXNCLEVBQUUsTUFBVyxFQUFFLFVBQWtCO1FBRXBFLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBRXpELElBQUksTUFBTSxDQUFDLFVBQVUsS0FBSyxVQUFVLEVBQUU7WUFFbEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLFVBQVUsWUFBWTtnQkFFdEQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUVyRCxLQUFLLE1BQU0sSUFBSSxJQUFJLGtCQUFrQixFQUFFO3dCQUNuQyxJQUFJLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRTs0QkFDekMsSUFBSSxJQUFJLEtBQUssWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUU7Z0NBQ3pDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDOzZCQUMvRDt5QkFDSjtxQkFDSjtpQkFDSjtZQUNMLENBQUMsQ0FBQyxDQUFDO1NBQ047SUFDTCxDQUFDO0lBRU8seUNBQXlDO1FBRTdDLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFHeEMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFO2dCQUN0QixZQUFZLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUM7YUFDN0U7U0FDSjtJQUNMLENBQUM7SUFFTyxNQUFNLENBQUMsZ0JBQXFCO1FBRWhDLFlBQVksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDakMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7SUFFcEUsQ0FBQztJQUVPLHlCQUF5QixDQUFDLFVBQWtCO1FBQ2hELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFFbkUsSUFBSSxLQUFLLENBQUM7UUFDVixJQUFJLGdCQUFnQixJQUFJLENBQUMsS0FBSyxHQUFHLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN4RSxPQUFPLElBQUksQ0FBQyxLQUFLLEtBQUssVUFBVSxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBRU4sZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztZQUUzQyxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7U0FFakM7SUFDTCxDQUFDOzs7WUE5TkosVUFBVTs7O1lBUkgsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ3JlYXRlZCBieSBqYXloYW1pbHRvbiBvbiAyLzcvMTcuXG4gKi9cbmltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0h0dHBDbGllbnQsIEh0dHBIZWFkZXJzfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQge0VNUFRZLCBPYnNlcnZhYmxlLCBTdWJzY3JpYmFibGV9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtkZWZhdWx0Qm9hcmR9IGZyb20gJy4vY29uZmlndXJhdGlvbi1zYW1wbGUtZGVmYXVsdC1ib2FyZCc7XG5pbXBvcnQge3NhbXBsZUJvYXJkQ29sbGVjdGlvbn0gZnJvbSAnLi9jb25maWd1cmF0aW9uLXNhbXBsZS1ib2FyZHMubW9kZWwnO1xuaW1wb3J0IHtlbnZpcm9ubWVudH0gZnJvbSAnLi4vLi4vZW52aXJvbm1lbnRzL2Vudmlyb25tZW50JztcbmltcG9ydCB7Qm9hcmR9IGZyb20gJy4uL2dyaWQvQm9hcmQnO1xuXG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBDb25maWd1cmF0aW9uU2VydmljZSB7XG4gICAgbW9kZWw6IEJvYXJkOyAvLyB0b2RvIHJldmlldyB0aGlzIG9iamVjdCBjbG9zZWx5XG4gICAgY3VycmVudE1vZGVsOiBhbnk7IC8vIHRoaXMgb2JqZWN0IGhlbHBzIHdpdGggdXBkYXRlcyB0byBwcm9wZXJ0eSBwYWdlIHZhbHVlc1xuICAgIGRlbW8gPSB0cnVlO1xuICAgIGVudjogYW55O1xuXG4gICAgZGVmYXVsdEJvYXJkOiBhbnk7XG4gICAgc2FtcGxlQm9hcmRDb2xsZWN0aW9uOiBhbnk7XG5cbiAgICAvKipcbiAgICAgKiB0b2RvIC0gZml4IHRoaXMgaGFyZCBjb2RlZCBzdG9yZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgcmVtb3RlQ29uZmlndXJhdGlvblJlcG9zaXRvcnkgPSAnJztcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX2h0dHA6IEh0dHBDbGllbnQpIHtcblxuICAgICAgICB0aGlzLmRlZmF1bHRCb2FyZCA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRCb2FyZCk7XG4gICAgICAgIHRoaXMuc2FtcGxlQm9hcmRDb2xsZWN0aW9uID0gT2JqZWN0LmFzc2lnbih7fSwgc2FtcGxlQm9hcmRDb2xsZWN0aW9uKTtcbiAgICAgICAgdGhpcy5lbnYgPSBlbnZpcm9ubWVudDtcbiAgICAgICAgdGhpcy5zZWVkTG9jYWxTdG9yYWdlV2l0aFNhbXBsZUJvYXJkQ29sbGVjdGlvbigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRCb2FyZHMoKTogT2JzZXJ2YWJsZTxhbnk+IHtcblxuICAgICAgICBpZiAodGhpcy5kZW1vKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUob2JzZXJ2ZXIgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBkYXRhID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnYm9hcmQnKSk7XG4gICAgICAgICAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSB7Ym9hcmQ6IFtdfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChkYXRhLmJvYXJkKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiB0b2RvIC0gdGhpcyBjYWxsIGlzIGJhc2VkIG9uIGFuIGludGVybmFsIHJlcHJlc2VudGF0aW9uIChhZG1pbiBjb25zb2xlKSBvZiBzb21ldGhpbmcgY2FsbGVkIGEgc3RvcmUuXG4gICAgICAgICAgICAgKiBUaGF0IGNvbmNlcHQgcmVxdWlyZXMgcmVmYWN0b3JpbmcuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9odHRwLmdldCh0aGlzLnJlbW90ZUNvbmZpZ3VyYXRpb25SZXBvc2l0b3J5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzYXZlQm9hcmQoYm9hcmQ6IEJvYXJkKSB7XG5cbiAgICAgICAgdGhpcy5tb2RlbCA9IGJvYXJkO1xuXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhib2FyZCkubGVuZ3RoID09PSAwICYmIGJvYXJkLmNvbnN0cnVjdG9yID09PSBPYmplY3QpIHtcbiAgICAgICAgICAgIHJldHVybiBFTVBUWTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmRlbW8pIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZShvYnNlcnZlciA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGJvYXJkX2NvbGxlY3Rpb247XG5cbiAgICAgICAgICAgICAgICAvLyBmaW5kIGFuZCByZW1vdmUgYm9hcmQgZnJvbSBzdG9yYWdlXG4gICAgICAgICAgICAgICAgdGhpcy5kZWxldGVCb2FyZEZyb21Mb2NhbFN0b3JlKGJvYXJkLnRpdGxlKTtcblxuICAgICAgICAgICAgICAgIC8vIGdldCBhIGNvbGxlY3Rpb24gb2JqZWN0IGFuZCBhZGQgYm9hcmQgdG8gaXRcbiAgICAgICAgICAgICAgICBpZiAoKGJvYXJkX2NvbGxlY3Rpb24gPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdib2FyZCcpKSkgPT0gbnVsbCkge1xuXG4gICAgICAgICAgICAgICAgICAgIGJvYXJkX2NvbGxlY3Rpb24gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBib2FyZDogW11cbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYm9hcmRfY29sbGVjdGlvblsnYm9hcmQnXS5wdXNoKGJvYXJkKTtcblxuICAgICAgICAgICAgICAgIC8vIHNhdmVcbiAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnYm9hcmQnLCBKU09OLnN0cmluZ2lmeShib2FyZF9jb2xsZWN0aW9uKSk7XG5cbiAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KHt9KTtcblxuICAgICAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiB0b2RvIC0gYSBkZWxldGUgbXVzdCBoYXBwZW4gaGVyZVxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgY29uc3QgaHR0cE9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faHR0cC5wb3N0KHRoaXMucmVtb3RlQ29uZmlndXJhdGlvblJlcG9zaXRvcnkgKyAnP2lkPScgKyBib2FyZC50aXRsZSwgSlNPTi5zdHJpbmdpZnkoYm9hcmQpLCBodHRwT3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZGVsZXRlQm9hcmQoYm9hcmRUaXRsZTogc3RyaW5nKSB7XG5cbiAgICAgICAgaWYgKHRoaXMuZGVtbykge1xuXG4gICAgICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUob2JzZXJ2ZXIgPT4ge1xuXG4gICAgICAgICAgICAgICAgdGhpcy5kZWxldGVCb2FyZEZyb21Mb2NhbFN0b3JlKGJvYXJkVGl0bGUpO1xuXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCh7fSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faHR0cC5kZWxldGUodGhpcy5yZW1vdGVDb25maWd1cmF0aW9uUmVwb3NpdG9yeSArICcvJyArIGJvYXJkVGl0bGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldERlZmF1bHRCb2FyZCgpIHtcblxuICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUob2JzZXJ2ZXIgPT4ge1xuICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCh0aGlzLmRlZmF1bHRCb2FyZCk7XG4gICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgd2hlbiBhIGdhZGdldCBpbnN0YW5jZSdzIHByb3BlcnR5IHBhZ2UgaXMgdXBkYXRlZCBhbmQgc2F2ZWQsIHRoZSBjaGFuZ2UgZ2V0cyBjb21tdW5pY2F0ZWQgdG8gYWxsXG4gICAgIGdhZGdldHMuIFRoZSBnYWRnZXQgaW5zdGFuY2UgaWQgdGhhdCBjYXVzZWQgdGhlIGNoYW5nZSB3aWxsIHVwZGF0ZSB0aGVpciBjdXJyZW50IGluc3RhbmNlLiB0b2RvIC0gdGhpcyBtaWdodCBiZSBhYmxlIHRvIGJlXG4gICAgIGltcHJvdmVkLiBGb3Igbm93IHRoZSB1dGlsaXR5IG9mIHRoaXMgYXBwcm9hY2ggYWxsb3dzIHRoZSBjb25maWd1cmF0aW9uIHNlcnZpY2UgdG8gY2FwdHVyZSB0aGUgcHJvcGVydHkgcGFnZSBjaGFuZ2UgaW4gYSB3YXlcbiAgICAgdGhhdCBhbGxvd3MgdXMgdG8gdXBkYXRlIHRoZSBwZXJzaXN0ZWQgYm9hcmQgbW9kZWwuXG4gICAgICovXG4gICAgbm90aWZ5R2FkZ2V0T25Qcm9wZXJ0eUNoYW5nZShnYWRnZXRDb25maWc6IHN0cmluZywgaW5zdGFuY2VJZDogbnVtYmVyKSB7XG5cbiAgICAgICAgdGhpcy5zYXZlUHJvcGVydHlQYWdlQ29uZmlndXJhdGlvblRvU3RvcmUoZ2FkZ2V0Q29uZmlnLCBpbnN0YW5jZUlkKTtcbiAgICB9XG5cbiAgICBzZXRDdXJyZW50TW9kZWwoX2N1cnJlbnRNb2RlbDogYW55KSB7XG4gICAgICAgIHRoaXMuY3VycmVudE1vZGVsID0gX2N1cnJlbnRNb2RlbDtcbiAgICB9XG5cbiAgICBzYXZlUHJvcGVydHlQYWdlQ29uZmlndXJhdGlvblRvU3RvcmUoZ2FkZ2V0Q29uZmlnOiBzdHJpbmcsIGluc3RhbmNlSWQ6IG51bWJlcikge1xuXG4gICAgICAgIHRoaXMuY3VycmVudE1vZGVsLnJvd3MuZm9yRWFjaChyb3cgPT4ge1xuXG4gICAgICAgICAgICByb3cuY29sdW1ucy5mb3JFYWNoKGNvbHVtbiA9PiB7XG5cbiAgICAgICAgICAgICAgICBpZiAoY29sdW1uLmdhZGdldHMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uLmdhZGdldHMuZm9yRWFjaChnYWRnZXQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVQcm9wZXJ0aWVzKGdhZGdldENvbmZpZywgZ2FkZ2V0LCBpbnN0YW5jZUlkKTtcblxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5zYXZlQm9hcmQodGhpcy5jdXJyZW50TW9kZWwpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuXG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogdG9kbyAtIGNyZWF0ZSBwb3B1cC90b2FzdCB0byBzaG93IGNvbmZpZ3VyYXRpb24gc2F2ZWQgbWVzc2FnZVxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoJ1RoZSBmb2xsb3dpbmcgY29uZmlndXJhdGlvbiBtb2RlbCB3YXMgc2F2ZWQhJyk7XG5cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvciA9PiBjb25zb2xlLmVycm9yKCdFcnJvcicgKyBlcnJvciksXG4gICAgICAgICAgICAoKSA9PiBjb25zb2xlLmRlYnVnKCdTYXZpbmcgY29uZmlndXJhdGlvbiB0byBzdG9yZSEnKSk7XG5cblxuICAgIH1cblxuICAgIHVwZGF0ZVByb3BlcnRpZXModXBkYXRlZFByb3BlcnRpZXM6IGFueSwgZ2FkZ2V0OiBhbnksIGluc3RhbmNlSWQ6IG51bWJlcikge1xuXG4gICAgICAgIGNvbnN0IHVwZGF0ZWRQcm9wc09iamVjdCA9IEpTT04ucGFyc2UodXBkYXRlZFByb3BlcnRpZXMpO1xuXG4gICAgICAgIGlmIChnYWRnZXQuaW5zdGFuY2VJZCA9PT0gaW5zdGFuY2VJZCkge1xuXG4gICAgICAgICAgICBnYWRnZXQuY29uZmlnLnByb3BlcnR5UGFnZXMuZm9yRWFjaChmdW5jdGlvbiAocHJvcGVydHlQYWdlKSB7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHByb3BlcnR5UGFnZS5wcm9wZXJ0aWVzLmxlbmd0aDsgeCsrKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBwcm9wIGluIHVwZGF0ZWRQcm9wc09iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZWRQcm9wc09iamVjdC5oYXNPd25Qcm9wZXJ0eShwcm9wKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wID09PSBwcm9wZXJ0eVBhZ2UucHJvcGVydGllc1t4XS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlQYWdlLnByb3BlcnRpZXNbeF0udmFsdWUgPSB1cGRhdGVkUHJvcHNPYmplY3RbcHJvcF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNlZWRMb2NhbFN0b3JhZ2VXaXRoU2FtcGxlQm9hcmRDb2xsZWN0aW9uKCkge1xuXG4gICAgICAgIGlmIChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnYm9hcmQnKSA9PT0gbnVsbCkge1xuXG5cbiAgICAgICAgICAgIGlmICghdGhpcy5lbnYucHJvZHVjdGlvbikge1xuICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdib2FyZCcsIEpTT04uc3RyaW5naWZ5KHRoaXMuc2FtcGxlQm9hcmRDb2xsZWN0aW9uKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGRlbGV0ZShib2FyZF9jb2xsZWN0aW9uOiBhbnkpIHtcblxuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnYm9hcmQnKTtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2JvYXJkJywgSlNPTi5zdHJpbmdpZnkoYm9hcmRfY29sbGVjdGlvbikpO1xuXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZWxldGVCb2FyZEZyb21Mb2NhbFN0b3JlKGJvYXJkVGl0bGU6IHN0cmluZykge1xuICAgICAgICBjb25zdCBib2FyZF9jb2xsZWN0aW9uID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnYm9hcmQnKSk7XG5cbiAgICAgICAgbGV0IGluZGV4O1xuICAgICAgICBpZiAoYm9hcmRfY29sbGVjdGlvbiAmJiAoaW5kZXggPSBib2FyZF9jb2xsZWN0aW9uWydib2FyZCddLmZpbmRJbmRleChpdGVtID0+IHtcbiAgICAgICAgICAgIHJldHVybiBpdGVtLnRpdGxlID09PSBib2FyZFRpdGxlO1xuICAgICAgICB9KSkgPj0gMCkge1xuXG4gICAgICAgICAgICBib2FyZF9jb2xsZWN0aW9uWydib2FyZCddLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAgICAgICAgIHRoaXMuZGVsZXRlKGJvYXJkX2NvbGxlY3Rpb24pO1xuXG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=