-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathProcessedSensors.js
59 lines (59 loc) · 17.4 KB
/
ProcessedSensors.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
'use strict';Object.defineProperty(exports,"__esModule",{value:true});var _set=require('babel-runtime/core-js/set');var _set2=_interopRequireDefault(_set);var _classCallCheck2=require('babel-runtime/helpers/classCallCheck');var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=require('babel-runtime/helpers/createClass');var _createClass3=_interopRequireDefault(_createClass2);var _client=require('waves-lfo/client');var lfo=_interopRequireWildcard(_client);var _lfoMotion=require('lfo-motion');var lfoMotion=_interopRequireWildcard(_lfoMotion);function _interopRequireWildcard(obj){if(obj&&obj.__esModule){return obj;}else{var newObj={};if(obj!=null){for(var key in obj){if(Object.prototype.hasOwnProperty.call(obj,key))newObj[key]=obj[key];}}newObj.default=obj;return newObj;}}function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj};}/**
* High-level abstraction that listen for raw sensors (accelerometers and
* gyroscopes) and apply a set of preprocessing / filtering on it.
*
* The output is composed of 11 values:
* - IntensityNorm
* - IntensityNormBoost
* - BandPass AccX
* - BandPass AccY
* - BandPass AccZ
* - Orientation X (processed from acc and gyro)
* - Orientation Y (processed from acc and gyro)
* - Orientation Z (processed from acc and gyro)
* - gyro alpha (yaw) - degrees / ms
* - gyro beta (pitch) - degrees / ms
* - gyro gamma (roll) - degrees / ms
*
* @example
* import { ProcessedSensors } from 'iml-motion';
*
* const processedSensors = new ProcessedSensors();
* processedSensors.addListener(data => console.log(data));
* processedSensors
* .init()
* .then(() => processedSensors.start());
*/var ProcessedSensors=function(){function ProcessedSensors(){var _ref=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{},_ref$frameRate=_ref.frameRate,frameRate=_ref$frameRate===undefined?1/0.02:_ref$frameRate;(0,_classCallCheck3.default)(this,ProcessedSensors);this.frameRate=frameRate;this._emit=this._emit.bind(this);// create the lfo graph
this.motionInput=new lfoMotion.source.MotionInput();this.sampler=new lfoMotion.operator.Sampler({frameRate:frameRate});this.accSelect=new lfo.operator.Select({indexes:[0,1,2]});this.gyroSelect=new lfo.operator.Select({indexes:[3,4,5]});// intensity
this.intensity=new lfoMotion.operator.Intensity({feedback:0.7,gain:0.07});this.intensityNormSelect=new lfo.operator.Select({index:0});// boost
this.intensityClip=new lfo.operator.Clip({min:0,max:1});this.intensityPower=new lfo.operator.Power({exponent:0.25});this.powerClip=new lfo.operator.Clip({min:0.15,max:1});this.powerScale=new lfo.operator.Scale({inputMin:0.15,inputMax:1,outputMin:0,outputMax:1});// bandpass
this.normalizeAcc=new lfo.operator.Multiplier({factor:1/9.81});this.bandpass=new lfo.operator.Biquad({type:'bandpass',q:1,f0:5});this.bandpassGain=new lfo.operator.Multiplier({factor:1});// orientation filter
this.orientation=new lfoMotion.operator.Orientation();// gyroscopes scaling
this.gyroScale=new lfo.operator.Multiplier({factor:[1/1000,1/1000,1/1000]});// merge and output
this.merger=new lfo.operator.Merger({frameSizes:[1,1,3,3,3]});this.bridge=new lfo.sink.Bridge({processFrame:this._emit,finalizeStream:this._emit});this.motionInput.connect(this.sampler);// for intensity and bandpass
this.sampler.connect(this.accSelect);// intensity branch
this.accSelect.connect(this.intensity);this.intensity.connect(this.intensityNormSelect);this.intensityNormSelect.connect(this.merger);// boost branch
this.intensityNormSelect.connect(this.intensityClip);this.intensityClip.connect(this.intensityPower);this.intensityPower.connect(this.powerClip);this.powerClip.connect(this.powerScale);this.powerScale.connect(this.merger);// biquad branch
this.accSelect.connect(this.normalizeAcc);this.normalizeAcc.connect(this.bandpass);this.bandpass.connect(this.bandpassGain);this.bandpassGain.connect(this.merger);// orientation
this.sampler.connect(this.orientation);this.orientation.connect(this.merger);// gyroscpes
this.sampler.connect(this.gyroSelect);this.gyroSelect.connect(this.gyroScale);this.gyroScale.connect(this.merger);this.merger.connect(this.bridge);this._listeners=new _set2.default();}/**
* Initialize the sensors
* @return Promise
*/(0,_createClass3.default)(ProcessedSensors,[{key:'init',value:function init(){// do not override frameRate with values from motionInput as
// we resampler overrides the source sampleRate, cf. `constructor`
return this.motionInput.init();}/**
* Start listening to the sensors
*/},{key:'start',value:function start(){this.motionInput.start();}/**
* Stop listening to the sensors
*/},{key:'stop',value:function stop(){this.motionInput.stop();}/**
* Add a listener to the module.
*
* @param {ProcessedSensorsListener} callback - Listener to register, the
* callback is executed with an array containing the processed data from
* the sensors
*/},{key:'addListener',value:function addListener(callback){this._listeners.add(callback);}/**
* Remove a listener from the module.
*
* @param {ProcessedSensorsListener} callback - Listener to delete
*/},{key:'removeListener',value:function removeListener(callback){this._listeners.delete(callback);}/** @private */},{key:'_emit',value:function _emit(frame){this._listeners.forEach(function(listener){return listener(frame.data);});}}]);return ProcessedSensors;}();exports.default=ProcessedSensors;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LmpzIl0sIm5hbWVzIjpbImxmbyIsImxmb01vdGlvbiIsIlByb2Nlc3NlZFNlbnNvcnMiLCJmcmFtZVJhdGUiLCJfZW1pdCIsImJpbmQiLCJtb3Rpb25JbnB1dCIsInNvdXJjZSIsIk1vdGlvbklucHV0Iiwic2FtcGxlciIsIm9wZXJhdG9yIiwiU2FtcGxlciIsImFjY1NlbGVjdCIsIlNlbGVjdCIsImluZGV4ZXMiLCJneXJvU2VsZWN0IiwiaW50ZW5zaXR5IiwiSW50ZW5zaXR5IiwiZmVlZGJhY2siLCJnYWluIiwiaW50ZW5zaXR5Tm9ybVNlbGVjdCIsImluZGV4IiwiaW50ZW5zaXR5Q2xpcCIsIkNsaXAiLCJtaW4iLCJtYXgiLCJpbnRlbnNpdHlQb3dlciIsIlBvd2VyIiwiZXhwb25lbnQiLCJwb3dlckNsaXAiLCJwb3dlclNjYWxlIiwiU2NhbGUiLCJpbnB1dE1pbiIsImlucHV0TWF4Iiwib3V0cHV0TWluIiwib3V0cHV0TWF4Iiwibm9ybWFsaXplQWNjIiwiTXVsdGlwbGllciIsImZhY3RvciIsImJhbmRwYXNzIiwiQmlxdWFkIiwidHlwZSIsInEiLCJmMCIsImJhbmRwYXNzR2FpbiIsIm9yaWVudGF0aW9uIiwiT3JpZW50YXRpb24iLCJneXJvU2NhbGUiLCJtZXJnZXIiLCJNZXJnZXIiLCJmcmFtZVNpemVzIiwiYnJpZGdlIiwic2luayIsIkJyaWRnZSIsInByb2Nlc3NGcmFtZSIsImZpbmFsaXplU3RyZWFtIiwiY29ubmVjdCIsIl9saXN0ZW5lcnMiLCJpbml0Iiwic3RhcnQiLCJzdG9wIiwiY2FsbGJhY2siLCJhZGQiLCJkZWxldGUiLCJmcmFtZSIsImZvckVhY2giLCJsaXN0ZW5lciIsImRhdGEiXSwibWFwcGluZ3MiOiJxWkFBQSx3QyxHQUFZQSxJLGtDQUNaLHFDLEdBQVlDLFUsa1dBRVo7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7TUEwQk1DLGlCLFlBQ0osMkJBRVEsb0VBQUosRUFBSSxxQkFETkMsU0FDTSxDQUROQSxTQUNNLDRC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S0FBS3ZDLE9BQUwsQ0FBYStDLE9BQWIsQ0FBcUIsS0FBS3pDLFVBQTFCLEVBQ0EsS0FBS0EsVUFBTCxDQUFnQnlDLE9BQWhCLENBQXdCLEtBQUtULFNBQTdCLEVBQ0EsS0FBS0EsU0FBTCxDQUFlUyxPQUFmLENBQXVCLEtBQUtSLE1BQTVCLEVBRUEsS0FBS0EsTUFBTCxDQUFZUSxPQUFaLENBQW9CLEtBQUtMLE1BQXpCLEVBRUEsS0FBS00sVUFBTCxDQUFrQixtQkFBbEIsQ0FDRCxDQUVEOzs7a0ZBSU8sQ0FDTDtBQUNBO0FBQ0EsTUFBTyxNQUFLbkQsV0FBTCxDQUFpQm9ELElBQWpCLEVBQVAsQ0FDRCxDQUVEOzswQ0FHUSxDQUNOLEtBQUtwRCxXQUFMLENBQWlCcUQsS0FBakIsR0FDRCxDQUVEOzt3Q0FHTyxDQUNMLEtBQUtyRCxXQUFMLENBQWlCc0QsSUFBakIsR0FDRCxDQUVEOzs7Ozs7cURBT1lDLFEsQ0FBVSxDQUNwQixLQUFLSixVQUFMLENBQWdCSyxHQUFoQixDQUFvQkQsUUFBcEIsRUFDRCxDQUVEOzs7OzJEQUtlQSxRLENBQVUsQ0FDdkIsS0FBS0osVUFBTCxDQUFnQk0sTUFBaEIsQ0FBdUJGLFFBQXZCLEVBQ0QsQ0FFRCxlLG9DQUNNRyxLLENBQU8sQ0FDWCxLQUFLUCxVQUFMLENBQWdCUSxPQUFoQixDQUF3Qix5QkFBWUMsVUFBU0YsTUFBTUcsSUFBZixDQUFaLEVBQXhCLEVBQ0QsQyxnREFJWWpFLGdCIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgbGZvIGZyb20gJ3dhdmVzLWxmby9jbGllbnQnO1xuaW1wb3J0ICogYXMgbGZvTW90aW9uIGZyb20gJ2xmby1tb3Rpb24nO1xuXG4vKipcbiAqIEhpZ2gtbGV2ZWwgYWJzdHJhY3Rpb24gdGhhdCBsaXN0ZW4gZm9yIHJhdyBzZW5zb3JzIChhY2NlbGVyb21ldGVycyBhbmRcbiAqIGd5cm9zY29wZXMpIGFuZCBhcHBseSBhIHNldCBvZiBwcmVwcm9jZXNzaW5nIC8gZmlsdGVyaW5nIG9uIGl0LlxuICpcbiAqIFRoZSBvdXRwdXQgaXMgY29tcG9zZWQgb2YgMTEgdmFsdWVzOlxuICogLSBJbnRlbnNpdHlOb3JtXG4gKiAtIEludGVuc2l0eU5vcm1Cb29zdFxuICogLSBCYW5kUGFzcyBBY2NYXG4gKiAtIEJhbmRQYXNzIEFjY1lcbiAqIC0gQmFuZFBhc3MgQWNjWlxuICogLSBPcmllbnRhdGlvbiBYIChwcm9jZXNzZWQgZnJvbSBhY2MgYW5kIGd5cm8pXG4gKiAtIE9yaWVudGF0aW9uIFkgKHByb2Nlc3NlZCBmcm9tIGFjYyBhbmQgZ3lybylcbiAqIC0gT3JpZW50YXRpb24gWiAocHJvY2Vzc2VkIGZyb20gYWNjIGFuZCBneXJvKVxuICogLSBneXJvIGFscGhhICh5YXcpIC0gZGVncmVlcyAvIG1zXG4gKiAtIGd5cm8gYmV0YSAocGl0Y2gpIC0gZGVncmVlcyAvIG1zXG4gKiAtIGd5cm8gZ2FtbWEgKHJvbGwpIC0gZGVncmVlcyAvIG1zXG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IFByb2Nlc3NlZFNlbnNvcnMgfSBmcm9tICdpbWwtbW90aW9uJztcbiAqXG4gKiBjb25zdCBwcm9jZXNzZWRTZW5zb3JzID0gbmV3IFByb2Nlc3NlZFNlbnNvcnMoKTtcbiAqIHByb2Nlc3NlZFNlbnNvcnMuYWRkTGlzdGVuZXIoZGF0YSA9PiBjb25zb2xlLmxvZyhkYXRhKSk7XG4gKiBwcm9jZXNzZWRTZW5zb3JzXG4gKiAgLmluaXQoKVxuICogIC50aGVuKCgpID0+IHByb2Nlc3NlZFNlbnNvcnMuc3RhcnQoKSk7XG4gKi9cbmNsYXNzIFByb2Nlc3NlZFNlbnNvcnMge1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgZnJhbWVSYXRlID0gMSAvIDAuMDIsXG4gIH0gPSB7fSkge1xuICAgIHRoaXMuZnJhbWVSYXRlID0gZnJhbWVSYXRlO1xuXG4gICAgdGhpcy5fZW1pdCA9IHRoaXMuX2VtaXQuYmluZCh0aGlzKTtcblxuICAgIC8vIGNyZWF0ZSB0aGUgbGZvIGdyYXBoXG4gICAgdGhpcy5tb3Rpb25JbnB1dCA9IG5ldyBsZm9Nb3Rpb24uc291cmNlLk1vdGlvbklucHV0KCk7XG5cbiAgICB0aGlzLnNhbXBsZXIgPSBuZXcgbGZvTW90aW9uLm9wZXJhdG9yLlNhbXBsZXIoe1xuICAgICAgZnJhbWVSYXRlOiBmcmFtZVJhdGUsXG4gICAgfSk7XG5cbiAgICB0aGlzLmFjY1NlbGVjdCA9IG5ldyBsZm8ub3BlcmF0b3IuU2VsZWN0KHsgaW5kZXhlczogWzAsIDEsIDJdIH0pO1xuICAgIHRoaXMuZ3lyb1NlbGVjdCA9IG5ldyBsZm8ub3BlcmF0b3IuU2VsZWN0KHsgaW5kZXhlczogWzMsIDQsIDVdIH0pO1xuXG4gICAgLy8gaW50ZW5zaXR5XG4gICAgdGhpcy5pbnRlbnNpdHkgPSBuZXcgbGZvTW90aW9uLm9wZXJhdG9yLkludGVuc2l0eSh7XG4gICAgICBmZWVkYmFjazogMC43LFxuICAgICAgZ2FpbjogMC4wNyxcbiAgICB9KTtcblxuICAgIHRoaXMuaW50ZW5zaXR5Tm9ybVNlbGVjdCA9IG5ldyBsZm8ub3BlcmF0b3IuU2VsZWN0KHsgaW5kZXg6IDAgfSk7XG5cbiAgICAvLyBib29zdFxuICAgIHRoaXMuaW50ZW5zaXR5Q2xpcCA9IG5ldyBsZm8ub3BlcmF0b3IuQ2xpcCh7IG1pbjogMCwgbWF4OiAxIH0pO1xuICAgIHRoaXMuaW50ZW5zaXR5UG93ZXIgPSBuZXcgbGZvLm9wZXJhdG9yLlBvd2VyKHsgZXhwb25lbnQ6IDAuMjUgfSk7XG4gICAgdGhpcy5wb3dlckNsaXAgPSBuZXcgbGZvLm9wZXJhdG9yLkNsaXAoeyBtaW46IDAuMTUsIG1heDogMSB9KTtcbiAgICB0aGlzLnBvd2VyU2NhbGUgPSBuZXcgbGZvLm9wZXJhdG9yLlNjYWxlKHtcbiAgICAgIGlucHV0TWluOiAwLjE1LFxuICAgICAgaW5wdXRNYXg6IDEsXG4gICAgICBvdXRwdXRNaW46IDAsXG4gICAgICBvdXRwdXRNYXg6IDEsXG4gICAgfSk7XG5cbiAgICAvLyBiYW5kcGFzc1xuICAgIHRoaXMubm9ybWFsaXplQWNjID0gbmV3IGxmby5vcGVyYXRvci5NdWx0aXBsaWVyKHsgZmFjdG9yOiAxIC8gOS44MSB9KTtcbiAgICB0aGlzLmJhbmRwYXNzID0gbmV3IGxmby5vcGVyYXRvci5CaXF1YWQoe1xuICAgICAgdHlwZTogJ2JhbmRwYXNzJyxcbiAgICAgIHE6IDEsXG4gICAgICBmMDogNSxcbiAgICB9KTtcbiAgICB0aGlzLmJhbmRwYXNzR2FpbiA9IG5ldyBsZm8ub3BlcmF0b3IuTXVsdGlwbGllcih7IGZhY3RvcjogMSB9KTtcblxuICAgIC8vIG9yaWVudGF0aW9uIGZpbHRlclxuICAgIHRoaXMub3JpZW50YXRpb24gPSBuZXcgbGZvTW90aW9uLm9wZXJhdG9yLk9yaWVudGF0aW9uKCk7XG5cbiAgICAvLyBneXJvc2NvcGVzIHNjYWxpbmdcbiAgICB0aGlzLmd5cm9TY2FsZSA9IG5ldyBsZm8ub3BlcmF0b3IuTXVsdGlwbGllcih7XG4gICAgICBmYWN0b3I6IFsxLzEwMDAsIDEvMTAwMCwgMS8xMDAwXSxcbiAgICB9KTtcblxuICAgIC8vIG1lcmdlIGFuZCBvdXRwdXRcbiAgICB0aGlzLm1lcmdlciA9IG5ldyBsZm8ub3BlcmF0b3IuTWVyZ2VyKHtcbiAgICAgIGZyYW1lU2l6ZXM6IFsxLCAxLCAzLCAzLCAzXSxcbiAgICB9KTtcblxuICAgIHRoaXMuYnJpZGdlID0gbmV3IGxmby5zaW5rLkJyaWRnZSh7XG4gICAgICBwcm9jZXNzRnJhbWU6IHRoaXMuX2VtaXQsXG4gICAgICBmaW5hbGl6ZVN0cmVhbTogdGhpcy5fZW1pdCxcbiAgICB9KTtcblxuICAgIHRoaXMubW90aW9uSW5wdXQuY29ubmVjdCh0aGlzLnNhbXBsZXIpO1xuICAgIC8vIGZvciBpbnRlbnNpdHkgYW5kIGJhbmRwYXNzXG4gICAgdGhpcy5zYW1wbGVyLmNvbm5lY3QodGhpcy5hY2NTZWxlY3QpO1xuICAgIC8vIGludGVuc2l0eSBicmFuY2hcbiAgICB0aGlzLmFjY1NlbGVjdC5jb25uZWN0KHRoaXMuaW50ZW5zaXR5KTtcbiAgICB0aGlzLmludGVuc2l0eS5jb25uZWN0KHRoaXMuaW50ZW5zaXR5Tm9ybVNlbGVjdCk7XG4gICAgdGhpcy5pbnRlbnNpdHlOb3JtU2VsZWN0LmNvbm5lY3QodGhpcy5tZXJnZXIpO1xuICAgIC8vIGJvb3N0IGJyYW5jaFxuICAgIHRoaXMuaW50ZW5zaXR5Tm9ybVNlbGVjdC5jb25uZWN0KHRoaXMuaW50ZW5zaXR5Q2xpcCk7XG4gICAgdGhpcy5pbnRlbnNpdHlDbGlwLmNvbm5lY3QodGhpcy5pbnRlbnNpdHlQb3dlcik7XG4gICAgdGhpcy5pbnRlbnNpdHlQb3dlci5jb25uZWN0KHRoaXMucG93ZXJDbGlwKTtcbiAgICB0aGlzLnBvd2VyQ2xpcC5jb25uZWN0KHRoaXMucG93ZXJTY2FsZSk7XG4gICAgdGhpcy5wb3dlclNjYWxlLmNvbm5lY3QodGhpcy5tZXJnZXIpO1xuICAgIC8vIGJpcXVhZCBicmFuY2hcbiAgICB0aGlzLmFjY1NlbGVjdC5jb25uZWN0KHRoaXMubm9ybWFsaXplQWNjKTtcbiAgICB0aGlzLm5vcm1hbGl6ZUFjYy5jb25uZWN0KHRoaXMuYmFuZHBhc3MpO1xuICAgIHRoaXMuYmFuZHBhc3MuY29ubmVjdCh0aGlzLmJhbmRwYXNzR2Fpbik7XG4gICAgdGhpcy5iYW5kcGFzc0dhaW4uY29ubmVjdCh0aGlzLm1lcmdlcik7XG4gICAgLy8gb3JpZW50YXRpb25cbiAgICB0aGlzLnNhbXBsZXIuY29ubmVjdCh0aGlzLm9yaWVudGF0aW9uKTtcbiAgICB0aGlzLm9yaWVudGF0aW9uLmNvbm5lY3QodGhpcy5tZXJnZXIpO1xuICAgIC8vIGd5cm9zY3Blc1xuICAgIHRoaXMuc2FtcGxlci5jb25uZWN0KHRoaXMuZ3lyb1NlbGVjdCk7XG4gICAgdGhpcy5neXJvU2VsZWN0LmNvbm5lY3QodGhpcy5neXJvU2NhbGUpO1xuICAgIHRoaXMuZ3lyb1NjYWxlLmNvbm5lY3QodGhpcy5tZXJnZXIpO1xuXG4gICAgdGhpcy5tZXJnZXIuY29ubmVjdCh0aGlzLmJyaWRnZSk7XG5cbiAgICB0aGlzLl9saXN0ZW5lcnMgPSBuZXcgU2V0KCk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB0aGUgc2Vuc29yc1xuICAgKiBAcmV0dXJuIFByb21pc2VcbiAgICovXG4gIGluaXQoKSB7XG4gICAgLy8gZG8gbm90IG92ZXJyaWRlIGZyYW1lUmF0ZSB3aXRoIHZhbHVlcyBmcm9tIG1vdGlvbklucHV0IGFzXG4gICAgLy8gd2UgcmVzYW1wbGVyIG92ZXJyaWRlcyB0aGUgc291cmNlIHNhbXBsZVJhdGUsIGNmLiBgY29uc3RydWN0b3JgXG4gICAgcmV0dXJuIHRoaXMubW90aW9uSW5wdXQuaW5pdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0IGxpc3RlbmluZyB0byB0aGUgc2Vuc29yc1xuICAgKi9cbiAgc3RhcnQoKSB7XG4gICAgdGhpcy5tb3Rpb25JbnB1dC5zdGFydCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSBzZW5zb3JzXG4gICAqL1xuICBzdG9wKCkge1xuICAgIHRoaXMubW90aW9uSW5wdXQuc3RvcCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGxpc3RlbmVyIHRvIHRoZSBtb2R1bGUuXG4gICAqXG4gICAqIEBwYXJhbSB7UHJvY2Vzc2VkU2Vuc29yc0xpc3RlbmVyfSBjYWxsYmFjayAtIExpc3RlbmVyIHRvIHJlZ2lzdGVyLCB0aGVcbiAgICogIGNhbGxiYWNrIGlzIGV4ZWN1dGVkIHdpdGggYW4gYXJyYXkgY29udGFpbmluZyB0aGUgcHJvY2Vzc2VkIGRhdGEgZnJvbVxuICAgKiAgdGhlIHNlbnNvcnNcbiAgICovXG4gIGFkZExpc3RlbmVyKGNhbGxiYWNrKSB7XG4gICAgdGhpcy5fbGlzdGVuZXJzLmFkZChjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGEgbGlzdGVuZXIgZnJvbSB0aGUgbW9kdWxlLlxuICAgKlxuICAgKiBAcGFyYW0ge1Byb2Nlc3NlZFNlbnNvcnNMaXN0ZW5lcn0gY2FsbGJhY2sgLSBMaXN0ZW5lciB0byBkZWxldGVcbiAgICovXG4gIHJlbW92ZUxpc3RlbmVyKGNhbGxiYWNrKSB7XG4gICAgdGhpcy5fbGlzdGVuZXJzLmRlbGV0ZShjYWxsYmFjayk7XG4gIH1cblxuICAvKiogQHByaXZhdGUgKi9cbiAgX2VtaXQoZnJhbWUpIHtcbiAgICB0aGlzLl9saXN0ZW5lcnMuZm9yRWFjaChsaXN0ZW5lciA9PiBsaXN0ZW5lcihmcmFtZS5kYXRhKSk7XG4gIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBQcm9jZXNzZWRTZW5zb3JzO1xuIl19