videogular2
Version:
Videogular is a video application framework for desktop and mobile powered by Angular 2.0
237 lines • 37.7 kB
JavaScript
;
var vg_api_1 = require("./vg-api");
var vg_states_1 = require("../states/vg-states");
describe('Videogular Player', function () {
var api;
beforeEach(function () {
api = new vg_api_1.VgAPI();
});
it('Should get the default media', function () {
api.medias = {
main: { id: 'main' },
secondary: { id: 'secondary' }
};
expect(api.getDefaultMedia()).toEqual({ id: 'main' });
});
describe('getMasterMedia', function () {
it('Should get the master media', function () {
api.medias = {
main: { id: 'main' },
secondary: { id: 'secondary', vgMedia: true }
};
expect(api.getMasterMedia()).toEqual({ id: 'secondary', vgMedia: true });
});
it('Should get the default media when no master is defined', function () {
api.medias = {
main: { id: 'main' },
secondary: { id: 'secondary' }
};
expect(api.getMasterMedia()).toEqual(api.getDefaultMedia());
});
});
it('Should get the api if we do not pass an id', function () {
api.medias = {
main: { id: 'main' },
secondary: { id: 'secondary' }
};
expect(api.getMediaById()).toEqual(api);
});
it('Should get the api if we pass an *', function () {
api.medias = {
main: { id: 'main' },
secondary: { id: 'secondary' }
};
expect(api.getMediaById('*')).toEqual(api);
});
it('Should get a media object if we pass an id', function () {
api.medias = {
main: { id: 'main' },
secondary: { id: 'secondary' }
};
expect(api.getMediaById('main')).toEqual({ id: 'main' });
});
it('Should play all medias', function () {
api.medias = {
main: { id: 'main', play: function () { } },
secondary: { id: 'secondary', play: function () { } }
};
spyOn(api.medias.main, 'play').and.callThrough();
spyOn(api.medias.secondary, 'play').and.callThrough();
api.play();
expect(api.medias.main.play).toHaveBeenCalled();
expect(api.medias.secondary.play).toHaveBeenCalled();
});
it('Should pause all medias', function () {
api.medias = {
main: { id: 'main', pause: function () { } },
secondary: { id: 'secondary', pause: function () { } }
};
spyOn(api.medias.main, 'pause').and.callThrough();
spyOn(api.medias.secondary, 'pause').and.callThrough();
api.pause();
expect(api.medias.main.pause).toHaveBeenCalled();
expect(api.medias.secondary.pause).toHaveBeenCalled();
});
it('Should get duration', function () {
spyOn(api, '$$getAllProperties').and.callFake(function () { });
var duration = api.duration;
expect(api.$$getAllProperties).toHaveBeenCalledWith('duration');
});
it('Should set a state', function () {
spyOn(api, '$$setAllProperties').and.callFake(function () { });
api.state = 'pause';
expect(api.$$setAllProperties).toHaveBeenCalledWith('state', 'pause');
});
it('Should get state', function () {
spyOn(api, '$$getAllProperties').and.callFake(function () { });
var state = api.state;
expect(api.$$getAllProperties).toHaveBeenCalledWith('state');
});
it('Should set a currentTime', function () {
spyOn(api, '$$setAllProperties').and.callFake(function () { });
api.currentTime = 50;
expect(api.$$setAllProperties).toHaveBeenCalledWith('currentTime', 50);
});
it('Should get currentTime', function () {
spyOn(api, '$$getAllProperties').and.callFake(function () { });
var currentTime = api.currentTime;
expect(api.$$getAllProperties).toHaveBeenCalledWith('currentTime');
});
it('Should set a volume', function () {
spyOn(api, '$$setAllProperties').and.callFake(function () { });
api.volume = 0.5;
expect(api.$$setAllProperties).toHaveBeenCalledWith('volume', 0.5);
});
it('Should get volume', function () {
spyOn(api, '$$getAllProperties').and.callFake(function () { });
var volume = api.volume;
expect(api.$$getAllProperties).toHaveBeenCalledWith('volume');
});
it('Should set a playback rate', function () {
spyOn(api, '$$setAllProperties').and.callFake(function () { });
api.playbackRate = 0.5;
expect(api.$$setAllProperties).toHaveBeenCalledWith('playbackRate', 0.5);
});
it('Should get playbackRate', function () {
spyOn(api, '$$getAllProperties').and.callFake(function () { });
var playbackRate = api.playbackRate;
expect(api.$$getAllProperties).toHaveBeenCalledWith('playbackRate');
});
it('Should get canPlay', function () {
spyOn(api, '$$getAllProperties').and.callFake(function () { });
var canPlay = api.canPlay;
expect(api.$$getAllProperties).toHaveBeenCalledWith('canPlay');
});
it('Should get canPlayThrough', function () {
spyOn(api, '$$getAllProperties').and.callFake(function () { });
var canPlayThrough = api.canPlayThrough;
expect(api.$$getAllProperties).toHaveBeenCalledWith('canPlayThrough');
});
it('Should get isMetadataLoaded', function () {
spyOn(api, '$$getAllProperties').and.callFake(function () { });
var isMetadataLoaded = api.isMetadataLoaded;
expect(api.$$getAllProperties).toHaveBeenCalledWith('isMetadataLoaded');
});
it('Should get isWaiting', function () {
spyOn(api, '$$getAllProperties').and.callFake(function () { });
var isWaiting = api.isWaiting;
expect(api.$$getAllProperties).toHaveBeenCalledWith('isWaiting');
});
it('Should get isCompleted', function () {
spyOn(api, '$$getAllProperties').and.callFake(function () { });
var isCompleted = api.isCompleted;
expect(api.$$getAllProperties).toHaveBeenCalledWith('isCompleted');
});
it('Should get time', function () {
spyOn(api, '$$getAllProperties').and.callFake(function () { });
var time = api.time;
expect(api.$$getAllProperties).toHaveBeenCalledWith('time');
});
it('Should get buffer', function () {
spyOn(api, '$$getAllProperties').and.callFake(function () { });
var time = api.buffer;
expect(api.$$getAllProperties).toHaveBeenCalledWith('buffer');
});
it('Should get buffered', function () {
spyOn(api, '$$getAllProperties').and.callFake(function () { });
var buffered = api.buffered;
expect(api.$$getAllProperties).toHaveBeenCalledWith('buffered');
});
it('Should get subscriptions', function () {
spyOn(api, '$$getAllProperties').and.callFake(function () { });
var subscriptions = api.subscriptions;
expect(api.$$getAllProperties).toHaveBeenCalledWith('subscriptions');
});
it('Should seek to a specified time by second', function () {
api.medias = {
main: { id: 'main' },
secondary: { id: 'secondary' }
};
spyOn(api, '$$seek').and.callFake(function () { });
api.seekTime(10);
expect(api.$$seek).toHaveBeenCalledWith({ id: 'main' }, 10, false);
expect(api.$$seek).toHaveBeenCalledWith({ id: 'secondary' }, 10, false);
});
it('Should seek to a specified time by percentage', function () {
api.medias = {
main: { id: 'main' },
secondary: { id: 'secondary' }
};
spyOn(api, '$$seek').and.callFake(function () { });
api.seekTime(10, true);
expect(api.$$seek).toHaveBeenCalledWith({ id: 'main' }, 10, true);
expect(api.$$seek).toHaveBeenCalledWith({ id: 'secondary' }, 10, true);
});
it('Should seek media files to a specified time by second', function () {
var media = {
currentTime: 0
};
api.$$seek(media, 10);
expect(media.currentTime).toBe(10);
});
it('Should seek media files to a specified time by percentage', function () {
var media = {
duration: 200,
currentTime: 0,
subscriptions: {}
};
api.$$seek(media, 10, true);
expect(media.currentTime).toBe(20);
});
it('Should get a property from all media objects and return an object', function () {
api.medias = {
main: { id: 'main', state: vg_states_1.VgStates.VG_PLAYING },
secondary: { id: 'secondary', state: vg_states_1.VgStates.VG_PAUSED }
};
var states = api.$$getAllProperties('state');
expect(states).toEqual(vg_states_1.VgStates.VG_PLAYING);
});
it('Should get a property from all media objects and return a plain value if there is only one media object', function () {
api.medias = {
main: { id: 'main', state: vg_states_1.VgStates.VG_PLAYING }
};
var states = api.$$getAllProperties('state');
expect(states).toEqual(vg_states_1.VgStates.VG_PLAYING);
});
it('Should set a property to all media objects', function () {
api.medias = {
main: { id: 'main', state: 'stop' },
secondary: { id: 'secondary', state: 'stop' }
};
api.$$setAllProperties('state', vg_states_1.VgStates.VG_PLAYING);
expect(api.medias.main.state).toBe(vg_states_1.VgStates.VG_PLAYING);
expect(api.medias.secondary.state).toBe(vg_states_1.VgStates.VG_PLAYING);
});
it('Should register a new media object', function () {
var media = { id: 'main' };
api.registerMedia(media);
expect(api.medias['main']).toBe(media);
});
it('Should register a new media object', function () {
var media = { id: 'main' };
api['main'] = {};
api.unregisterMedia(media);
expect(api.medias['main']).toBe(undefined);
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmctYXBpLnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ2Zy1hcGkuc3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsdUJBQW9CLFVBQVUsQ0FBQyxDQUFBO0FBRS9CLDBCQUF1QixxQkFBcUIsQ0FBQyxDQUFBO0FBRTdDLFFBQVEsQ0FBQyxtQkFBbUIsRUFBRTtJQUMxQixJQUFJLEdBQVMsQ0FBQztJQUVkLFVBQVUsQ0FBQztRQUNQLEdBQUcsR0FBRyxJQUFJLGNBQUssRUFBRSxDQUFDO0lBQ3RCLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDhCQUE4QixFQUFFO1FBQy9CLEdBQUcsQ0FBQyxNQUFNLEdBQUc7WUFDVCxJQUFJLEVBQUUsRUFBQyxFQUFFLEVBQUUsTUFBTSxFQUFDO1lBQ2xCLFNBQVMsRUFBRSxFQUFDLEVBQUUsRUFBRSxXQUFXLEVBQUM7U0FDL0IsQ0FBQztRQUVGLE1BQU0sQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBQyxFQUFFLEVBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQztJQUN4RCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRTtRQUN2QixFQUFFLENBQUMsNkJBQTZCLEVBQUU7WUFDOUIsR0FBRyxDQUFDLE1BQU0sR0FBRztnQkFDVCxJQUFJLEVBQUUsRUFBQyxFQUFFLEVBQUUsTUFBTSxFQUFDO2dCQUNsQixTQUFTLEVBQUUsRUFBQyxFQUFFLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUM7YUFDOUMsQ0FBQztZQUVGLE1BQU0sQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBQyxFQUFFLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDO1FBQzNFLENBQUMsQ0FBQyxDQUFDO1FBQ0gsRUFBRSxDQUFDLHdEQUF3RCxFQUFFO1lBQ3pELEdB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TSxDQUFPLEdBQUcsQ0FBQyxNQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3hFLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLG9DQUFvQyxFQUFFO1FBQ3JDLElBQUksS0FBSyxHQUFHLEVBQUMsRUFBRSxFQUFFLE1BQU0sRUFBQyxDQUFDO1FBRXpCLEdBQUcsQ0FBQyxhQUFhLENBQVksS0FBSyxDQUFDLENBQUM7UUFFcEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0MsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsb0NBQW9DLEVBQUU7UUFDckMsSUFBSSxLQUFLLEdBQUcsRUFBQyxFQUFFLEVBQUUsTUFBTSxFQUFDLENBQUM7UUFDekIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUVqQixHQUFHLENBQUMsZUFBZSxDQUFZLEtBQUssQ0FBQyxDQUFDO1FBRXRDLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQy9DLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1ZnQVBJfSBmcm9tIFwiLi92Zy1hcGlcIjtcbmltcG9ydCB7SVBsYXlhYmxlfSBmcm9tIFwiLi4vdmctbWVkaWEvaS1wbGF5YWJsZVwiO1xuaW1wb3J0IHtWZ1N0YXRlc30gZnJvbSBcIi4uL3N0YXRlcy92Zy1zdGF0ZXNcIjtcblxuZGVzY3JpYmUoJ1ZpZGVvZ3VsYXIgUGxheWVyJywgKCkgPT4ge1xuICAgIGxldCBhcGk6VmdBUEk7XG5cbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgYXBpID0gbmV3IFZnQVBJKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIGdldCB0aGUgZGVmYXVsdCBtZWRpYScsICgpID0+IHtcbiAgICAgICAgYXBpLm1lZGlhcyA9IHtcbiAgICAgICAgICAgIG1haW46IHtpZDogJ21haW4nfSxcbiAgICAgICAgICAgIHNlY29uZGFyeToge2lkOiAnc2Vjb25kYXJ5J31cbiAgICAgICAgfTtcblxuICAgICAgICBleHBlY3QoYXBpLmdldERlZmF1bHRNZWRpYSgpKS50b0VxdWFsKHtpZDogJ21haW4nfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnZ2V0TWFzdGVyTWVkaWEnLCAoKSA9PiB7XG4gICAgICAgIGl0KCdTaG91bGQgZ2V0IHRoZSBtYXN0ZXIgbWVkaWEnLCAoKSA9PiB7XG4gICAgICAgICAgICBhcGkubWVkaWFzID0ge1xuICAgICAgICAgICAgICAgIG1haW46IHtpZDogJ21haW4nfSxcbiAgICAgICAgICAgICAgICBzZWNvbmRhcnk6IHtpZDogJ3NlY29uZGFyeScsIHZnTWVkaWE6IHRydWV9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBleHBlY3QoYXBpLmdldE1hc3Rlck1lZGlhKCkpLnRvRXF1YWwoe2lkOiAnc2Vjb25kYXJ5JywgdmdNZWRpYTogdHJ1ZX0pO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ1Nob3VsZCBnZXQgdGhlIGRlZmF1bHQgbWVkaWEgd2hlbiBubyBtYXN0ZXIgaXMgZGVmaW5lZCcsICgpID0+IHtcbiAgICAgICAgICAgIGFwaS5tZWRpYXMgPSB7XG4gICAgICAgICAgICAgICAgbWFpbjoge2lkOiAnbWFpbid9LFxuICAgICAgICAgICAgICAgIHNlY29uZGFyeToge2lkOiAnc2Vjb25kYXJ5J31cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGV4cGVjdChhcGkuZ2V0TWFzdGVyTWVkaWEoKSkudG9FcXVhbChhcGkuZ2V0RGVmYXVsdE1lZGlhKCkpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdTaG91bGQgZ2V0IHRoZSBhcGkgaWYgd2UgZG8gbm90IHBhc3MgYW4gaWQnLCAoKSA9PiB7XG4gICAgICAgIGFwaS5tZWRpYXMgPSB7XG4gICAgICAgICAgICBtYWluOiB7aWQ6ICdtYWluJ30sXG4gICAgICAgICAgICBzZWNvbmRhcnk6IHtpZDogJ3NlY29uZGFyeSd9XG4gICAgICAgIH07XG5cbiAgICAgICAgZXhwZWN0KGFwaS5nZXRNZWRpYUJ5SWQoKSkudG9FcXVhbChhcGkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBnZXQgdGhlIGFwaSBpZiB3ZSBwYXNzIGFuIConLCAoKSA9PiB7XG4gICAgICAgIGFwaS5tZWRpYXMgPSB7XG4gICAgICAgICAgICBtYWluOiB7aWQ6ICdtYWluJ30sXG4gICAgICAgICAgICBzZWNvbmRhcnk6IHtpZDogJ3NlY29uZGFyeSd9XG4gICAgICAgIH07XG5cbiAgICAgICAgZXhwZWN0KGFwaS5nZXRNZWRpYUJ5SWQoJyonKSkudG9FcXVhbChhcGkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBnZXQgYSBtZWRpYSBvYmplY3QgaWYgd2UgcGFzcyBhbiBpZCcsICgpID0+IHtcbiAgICAgICAgYXBpLm1lZGlhcyA9IHtcbiAgICAgICAgICAgIG1haW46IHtpZDogJ21haW4nfSxcbiAgICAgICAgICAgIHNlY29uZGFyeToge2lkOiAnc2Vjb25kYXJ5J31cbiAgICAgICAgfTtcblxuICAgICAgICBleHBlY3QoYXBpLmdldE1lZGlhQnlJZCgnbWFpbicpKS50b0VxdWFsKHtpZDogJ21haW4nfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIHBsYXkgYWxsIG1lZGlhcycsICgpID0+IHtcbiAgICAgICAgYXBpLm1lZGlhcyA9IHtcbiAgICAgICAgICAgIG1haW46IHtpZDogJ21haW4nLCBwbGF5OiAoKSA9PiB7fX0sXG4gICAgICAgICAgICBzZWNvbmRhcnk6IHtpZDogJ3NlY29uZGFyeScsIHBsYXk6ICgpID0+IHt9fVxuICAgICAgICB9O1xuXG4gICAgICAgIHNweU9uKCg8YW55PmFwaS5tZWRpYXMpLm1haW4sICdwbGF5JykuYW5kLmNhbGxUaHJvdWdoKCk7XG4gICAgICAgIHNweU9uKCg8YW55PmFwaS5tZWRpYXMpLnNlY29uZGFyeSwgJ3BsYXknKS5hbmQuY2FsbFRocm91Z2goKTtcblxuICAgICAgICBhcGkucGxheSgpO1xuXG4gICAgICAgIGV4cGVjdCgoPGFueT5hcGkubWVkaWFzKS5tYWluLnBsYXkpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICAgICAgZXhwZWN0KCg8YW55PmFwaS5tZWRpYXMpLnNlY29uZGFyeS5wbGF5KS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIHBhdXNlIGFsbCBtZWRpYXMnLCAoKSA9PiB7XG4gICAgICAgIGFwaS5tZWRpYXMgPSB7XG4gICAgICAgICAgICBtYWluOiB7aWQ6ICdtYWluJywgcGF1c2U6ICgpID0+IHt9fSxcbiAgICAgICAgICAgIHNlY29uZGFyeToge2lkOiAnc2Vjb25kYXJ5JywgcGF1c2U6ICgpID0+IHt9fVxuICAgICAgICB9O1xuXG4gICAgICAgIHNweU9uKCg8YW55PmFwaS5tZWRpYXMpLm1haW4sICdwYXVzZScpLmFuZC5jYWxsVGhyb3VnaCgpO1xuICAgICAgICBzcHlPbigoPGFueT5hcGkubWVkaWFzKS5zZWNvbmRhcnksICdwYXVzZScpLmFuZC5jYWxsVGhyb3VnaCgpO1xuXG4gICAgICAgIGFwaS5wYXVzZSgpO1xuXG4gICAgICAgIGV4cGVjdCgoPGFueT5hcGkubWVkaWFzKS5tYWluLnBhdXNlKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICAgIGV4cGVjdCgoPGFueT5hcGkubWVkaWFzKS5zZWNvbmRhcnkucGF1c2UpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdTaG91bGQgZ2V0IGR1cmF0aW9uJywgKCkgPT4ge1xuICAgICAgICBzcHlPbihhcGksICckJGdldEFsbFByb3BlcnRpZXMnKS5hbmQuY2FsbEZha2UoKCkgPT4ge30pO1xuXG4gICAgICAgIGxldCBkdXJhdGlvbiA9IGFwaS5kdXJhdGlvbjtcblxuICAgICAgICBleHBlY3QoYXBpLiQkZ2V0QWxsUHJvcGVydGllcykudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ2R1cmF0aW9uJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIHNldCBhIHN0YXRlJywgKCkgPT4ge1xuICAgICAgICBzcHlPbihhcGksICckJHNldEFsbFByb3BlcnRpZXMnKS5hbmQuY2FsbEZha2UoKCkgPT4ge30pO1xuXG4gICAgICAgIGFwaS5zdGF0ZSA9ICdwYXVzZSc7XG5cbiAgICAgICAgZXhwZWN0KGFwaS4kJHNldEFsbFByb3BlcnRpZXMpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdzdGF0ZScsICdwYXVzZScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBnZXQgc3RhdGUnLCAoKSA9PiB7XG4gICAgICAgIHNweU9uKGFwaSwgJyQkZ2V0QWxsUHJvcGVydGllcycpLmFuZC5jYWxsRmFrZSgoKSA9PiB7fSk7XG5cbiAgICAgICAgbGV0IHN0YXRlID0gYXBpLnN0YXRlO1xuXG4gICAgICAgIGV4cGVjdChhcGkuJCRnZXRBbGxQcm9wZXJ0aWVzKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnc3RhdGUnKTtcbiAgICB9KTtcblxuICAgIGl0KCdTaG91bGQgc2V0IGEgY3VycmVudFRpbWUnLCAoKSA9PiB7XG4gICAgICAgIHNweU9uKGFwaSwgJyQkc2V0QWxsUHJvcGVydGllcycpLmFuZC5jYWxsRmFrZSgoKSA9PiB7fSk7XG5cbiAgICAgICAgYXBpLmN1cnJlbnRUaW1lID0gNTA7XG5cbiAgICAgICAgZXhwZWN0KGFwaS4kJHNldEFsbFByb3BlcnRpZXMpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdjdXJyZW50VGltZScsIDUwKTtcbiAgICB9KTtcblxuICAgIGl0KCdTaG91bGQgZ2V0IGN1cnJlbnRUaW1lJywgKCkgPT4ge1xuICAgICAgICBzcHlPbihhcGksICckJGdldEFsbFByb3BlcnRpZXMnKS5hbmQuY2FsbEZha2UoKCkgPT4ge30pO1xuXG4gICAgICAgIGxldCBjdXJyZW50VGltZSA9IGFwaS5jdXJyZW50VGltZTtcblxuICAgICAgICBleHBlY3QoYXBpLiQkZ2V0QWxsUHJvcGVydGllcykudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ2N1cnJlbnRUaW1lJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIHNldCBhIHZvbHVtZScsICgpID0+IHtcbiAgICAgICAgc3B5T24oYXBpLCAnJCRzZXRBbGxQcm9wZXJ0aWVzJykuYW5kLmNhbGxGYWtlKCgpID0+IHt9KTtcblxuICAgICAgICBhcGkudm9sdW1lID0gMC41O1xuXG4gICAgICAgIGV4cGVjdChhcGkuJCRzZXRBbGxQcm9wZXJ0aWVzKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgndm9sdW1lJywgMC41KTtcbiAgICB9KTtcblxuICAgIGl0KCdTaG91bGQgZ2V0IHZvbHVtZScsICgpID0+IHtcbiAgICAgICAgc3B5T24oYXBpLCAnJCRnZXRBbGxQcm9wZXJ0aWVzJykuYW5kLmNhbGxGYWtlKCgpID0+IHt9KTtcblxuICAgICAgICBsZXQgdm9sdW1lID0gYXBpLnZvbHVtZTtcblxuICAgICAgICBleHBlY3QoYXBpLiQkZ2V0QWxsUHJvcGVydGllcykudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ3ZvbHVtZScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBzZXQgYSBwbGF5YmFjayByYXRlJywgKCkgPT4ge1xuICAgICAgICBzcHlPbihhcGksICckJHNldEFsbFByb3BlcnRpZXMnKS5hbmQuY2FsbEZha2UoKCkgPT4ge30pO1xuXG4gICAgICAgIGFwaS5wbGF5YmFja1JhdGUgPSAwLjU7XG5cbiAgICAgICAgZXhwZWN0KGFwaS4kJHNldEFsbFByb3BlcnRpZXMpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdwbGF5YmFja1JhdGUnLCAwLjUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBnZXQgcGxheWJhY2tSYXRlJywgKCkgPT4ge1xuICAgICAgICBzcHlPbihhcGksICckJGdldEFsbFByb3BlcnRpZXMnKS5hbmQuY2FsbEZha2UoKCkgPT4ge30pO1xuXG4gICAgICAgIGxldCBwbGF5YmFja1JhdGUgPSBhcGkucGxheWJhY2tSYXRlO1xuXG4gICAgICAgIGV4cGVjdChhcGkuJCRnZXRBbGxQcm9wZXJ0aWVzKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgncGxheWJhY2tSYXRlJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIGdldCBjYW5QbGF5JywgKCkgPT4ge1xuICAgICAgICBzcHlPbihhcGksICckJGdldEFsbFByb3BlcnRpZXMnKS5hbmQuY2FsbEZha2UoKCkgPT4ge30pO1xuXG4gICAgICAgIGxldCBjYW5QbGF5ID0gYXBpLmNhblBsYXk7XG5cbiAgICAgICAgZXhwZWN0KGFwaS4kJGdldEFsbFByb3BlcnRpZXMpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdjYW5QbGF5Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIGdldCBjYW5QbGF5VGhyb3VnaCcsICgpID0+IHtcbiAgICAgICAgc3B5T24oYXBpLCAnJCRnZXRBbGxQcm9wZXJ0aWVzJykuYW5kLmNhbGxGYWtlKCgpID0+IHt9KTtcblxuICAgICAgICBsZXQgY2FuUGxheVRocm91Z2ggPSBhcGkuY2FuUGxheVRocm91Z2g7XG5cbiAgICAgICAgZXhwZWN0KGFwaS4kJGdldEFsbFByb3BlcnRpZXMpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdjYW5QbGF5VGhyb3VnaCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBnZXQgaXNNZXRhZGF0YUxvYWRlZCcsICgpID0+IHtcbiAgICAgICAgc3B5T24oYXBpLCAnJCRnZXRBbGxQcm9wZXJ0aWVzJykuYW5kLmNhbGxGYWtlKCgpID0+IHt9KTtcblxuICAgICAgICBsZXQgaXNNZXRhZGF0YUxvYWRlZCA9IGFwaS5pc01ldGFkYXRhTG9hZGVkO1xuXG4gICAgICAgIGV4cGVjdChhcGkuJCRnZXRBbGxQcm9wZXJ0aWVzKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnaXNNZXRhZGF0YUxvYWRlZCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBnZXQgaXNXYWl0aW5nJywgKCkgPT4ge1xuICAgICAgICBzcHlPbihhcGksICckJGdldEFsbFByb3BlcnRpZXMnKS5hbmQuY2FsbEZha2UoKCkgPT4ge30pO1xuXG4gICAgICAgIGxldCBpc1dhaXRpbmcgPSBhcGkuaXNXYWl0aW5nO1xuXG4gICAgICAgIGV4cGVjdChhcGkuJCRnZXRBbGxQcm9wZXJ0aWVzKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnaXNXYWl0aW5nJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIGdldCBpc0NvbXBsZXRlZCcsICgpID0+IHtcbiAgICAgICAgc3B5T24oYXBpLCAnJCRnZXRBbGxQcm9wZXJ0aWVzJykuYW5kLmNhbGxGYWtlKCgpID0+IHt9KTtcblxuICAgICAgICBsZXQgaXNDb21wbGV0ZWQgPSBhcGkuaXNDb21wbGV0ZWQ7XG5cbiAgICAgICAgZXhwZWN0KGFwaS4kJGdldEFsbFByb3BlcnRpZXMpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdpc0NvbXBsZXRlZCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBnZXQgdGltZScsICgpID0+IHtcbiAgICAgICAgc3B5T24oYXBpLCAnJCRnZXRBbGxQcm9wZXJ0aWVzJykuYW5kLmNhbGxGYWtlKCgpID0+IHt9KTtcblxuICAgICAgICBsZXQgdGltZSA9IGFwaS50aW1lO1xuXG4gICAgICAgIGV4cGVjdChhcGkuJCRnZXRBbGxQcm9wZXJ0aWVzKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgndGltZScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBnZXQgYnVmZmVyJywgKCkgPT4ge1xuICAgICAgICBzcHlPbihhcGksICckJGdldEFsbFByb3BlcnRpZXMnKS5hbmQuY2FsbEZha2UoKCkgPT4ge30pO1xuXG4gICAgICAgIGxldCB0aW1lID0gYXBpLmJ1ZmZlcjtcblxuICAgICAgICBleHBlY3QoYXBpLiQkZ2V0QWxsUHJvcGVydGllcykudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ2J1ZmZlcicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBnZXQgYnVmZmVyZWQnLCAoKSA9PiB7XG4gICAgICAgIHNweU9uKGFwaSwgJyQkZ2V0QWxsUHJvcGVydGllcycpLmFuZC5jYWxsRmFrZSgoKSA9PiB7fSk7XG5cbiAgICAgICAgbGV0IGJ1ZmZlcmVkID0gYXBpLmJ1ZmZlcmVkO1xuXG4gICAgICAgIGV4cGVjdChhcGkuJCRnZXRBbGxQcm9wZXJ0aWVzKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnYnVmZmVyZWQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdTaG91bGQgZ2V0IHN1YnNjcmlwdGlvbnMnLCAoKSA9PiB7XG4gICAgICAgIHNweU9uKGFwaSwgJyQkZ2V0QWxsUHJvcGVydGllcycpLmFuZC5jYWxsRmFrZSgoKSA9PiB7fSk7XG5cbiAgICAgICAgbGV0IHN1YnNjcmlwdGlvbnMgPSBhcGkuc3Vic2NyaXB0aW9ucztcblxuICAgICAgICBleHBlY3QoYXBpLiQkZ2V0QWxsUHJvcGVydGllcykudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ3N1YnNjcmlwdGlvbnMnKTtcbiAgICB9KTtcblxuICAgIGl0KCdTaG91bGQgc2VlayB0byBhIHNwZWNpZmllZCB0aW1lIGJ5IHNlY29uZCcsICgpID0+IHtcbiAgICAgICAgYXBpLm1lZGlhcyA9IHtcbiAgICAgICAgICAgIG1haW46IHtpZDogJ21haW4nfSxcbiAgICAgICAgICAgIHNlY29uZGFyeToge2lkOiAnc2Vjb25kYXJ5J31cbiAgICAgICAgfTtcblxuICAgICAgICBzcHlPbihhcGksICckJHNlZWsnKS5hbmQuY2FsbEZha2UoKCkgPT4ge30pO1xuXG4gICAgICAgIGFwaS5zZWVrVGltZSgxMCk7XG5cbiAgICAgICAgZXhwZWN0KGFwaS4kJHNlZWspLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHtpZDogJ21haW4nfSwgMTAsIGZhbHNlKTtcbiAgICAgICAgZXhwZWN0KGFwaS4kJHNlZWspLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHtpZDogJ3NlY29uZGFyeSd9LCAxMCwgZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBzZWVrIHRvIGEgc3BlY2lmaWVkIHRpbWUgYnkgcGVyY2VudGFnZScsICgpID0+IHtcbiAgICAgICAgYXBpLm1lZGlhcyA9IHtcbiAgICAgICAgICAgIG1haW46IHtpZDogJ21haW4nfSxcbiAgICAgICAgICAgIHNlY29uZGFyeToge2lkOiAnc2Vjb25kYXJ5J31cbiAgICAgICAgfTtcblxuICAgICAgICBzcHlPbihhcGksICckJHNlZWsnKS5hbmQuY2FsbEZha2UoKCkgPT4ge30pO1xuXG4gICAgICAgIGFwaS5zZWVrVGltZSgxMCwgdHJ1ZSk7XG5cbiAgICAgICAgZXhwZWN0KGFwaS4kJHNlZWspLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHtpZDogJ21haW4nfSwgMTAsIHRydWUpO1xuICAgICAgICBleHBlY3QoYXBpLiQkc2VlaykudG9IYXZlQmVlbkNhbGxlZFdpdGgoe2lkOiAnc2Vjb25kYXJ5J30sIDEwLCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdTaG91bGQgc2VlayBtZWRpYSBmaWxlcyB0byBhIHNwZWNpZmllZCB0aW1lIGJ5IHNlY29uZCcsICgpID0+IHtcbiAgICAgICAgbGV0IG1lZGlhID0ge1xuICAgICAgICAgICAgY3VycmVudFRpbWU6IDBcbiAgICAgICAgfTtcblxuICAgICAgICBhcGkuJCRzZWVrKDxJUGxheWFibGU+bWVkaWEsIDEwKTtcblxuICAgICAgICBleHBlY3QobWVkaWEuY3VycmVudFRpbWUpLnRvQmUoMTApO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBzZWVrIG1lZGlhIGZpbGVzIHRvIGEgc3BlY2lmaWVkIHRpbWUgYnkgcGVyY2VudGFnZScsICgpID0+IHtcbiAgICAgICAgbGV0IG1lZGlhID0ge1xuICAgICAgICAgICAgZHVyYXRpb246IDIwMCxcbiAgICAgICAgICAgIGN1cnJlbnRUaW1lOiAwLFxuICAgICAgICAgICAgc3Vic2NyaXB0aW9uczoge31cbiAgICAgICAgfTtcblxuICAgICAgICBhcGkuJCRzZWVrKDxhbnk+bWVkaWEsIDEwLCB0cnVlKTtcblxuICAgICAgICBleHBlY3QobWVkaWEuY3VycmVudFRpbWUpLnRvQmUoMjApO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBnZXQgYSBwcm9wZXJ0eSBmcm9tIGFsbCBtZWRpYSBvYmplY3RzIGFuZCByZXR1cm4gYW4gb2JqZWN0JywgKCkgPT4ge1xuICAgICAgICBhcGkubWVkaWFzID0ge1xuICAgICAgICAgICAgbWFpbjoge2lkOiAnbWFpbicsIHN0YXRlOiBWZ1N0YXRlcy5WR19QTEFZSU5HfSxcbiAgICAgICAgICAgIHNlY29uZGFyeToge2lkOiAnc2Vjb25kYXJ5Jywgc3RhdGU6IFZnU3RhdGVzLlZHX1BBVVNFRH1cbiAgICAgICAgfTtcblxuICAgICAgICBsZXQgc3RhdGVzID0gYXBpLiQkZ2V0QWxsUHJvcGVydGllcygnc3RhdGUnKTtcblxuICAgICAgICBleHBlY3Qoc3RhdGVzKS50b0VxdWFsKFZnU3RhdGVzLlZHX1BMQVlJTkcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBnZXQgYSBwcm9wZXJ0eSBmcm9tIGFsbCBtZWRpYSBvYmplY3RzIGFuZCByZXR1cm4gYSBwbGFpbiB2YWx1ZSBpZiB0aGVyZSBpcyBvbmx5IG9uZSBtZWRpYSBvYmplY3QnLCAoKSA9PiB7XG4gICAgICAgIGFwaS5tZWRpYXMgPSB7XG4gICAgICAgICAgICBtYWluOiB7aWQ6ICdtYWluJywgc3RhdGU6IFZnU3RhdGVzLlZHX1BMQVlJTkd9XG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IHN0YXRlcyA9IGFwaS4kJGdldEFsbFByb3BlcnRpZXMoJ3N0YXRlJyk7XG5cbiAgICAgICAgZXhwZWN0KHN0YXRlcykudG9FcXVhbChWZ1N0YXRlcy5WR19QTEFZSU5HKTtcbiAgICB9KTtcblxuICAgIGl0KCdTaG91bGQgc2V0IGEgcHJvcGVydHkgdG8gYWxsIG1lZGlhIG9iamVjdHMnLCAoKSA9PiB7XG4gICAgICAgIGFwaS5tZWRpYXMgPSB7XG4gICAgICAgICAgICBtYWluOiB7aWQ6ICdtYWluJywgc3RhdGU6ICdzdG9wJ30sXG4gICAgICAgICAgICBzZWNvbmRhcnk6IHtpZDogJ3NlY29uZGFyeScsIHN0YXRlOiAnc3RvcCd9XG4gICAgICAgIH07XG5cbiAgICAgICAgYXBpLiQkc2V0QWxsUHJvcGVydGllcygnc3RhdGUnLCBWZ1N0YXRlcy5WR19QTEFZSU5HKTtcblxuICAgICAgICBleHBlY3QoKDxhbnk+YXBpLm1lZGlhcykubWFpbi5zdGF0ZSkudG9CZShWZ1N0YXRlcy5WR19QTEFZSU5HKTtcbiAgICAgICAgZXhwZWN0KCg8YW55PmFwaS5tZWRpYXMpLnNlY29uZGFyeS5zdGF0ZSkudG9CZShWZ1N0YXRlcy5WR19QTEFZSU5HKTtcbiAgICB9KTtcblxuICAgIGl0KCdTaG91bGQgcmVnaXN0ZXIgYSBuZXcgbWVkaWEgb2JqZWN0JywgKCkgPT4ge1xuICAgICAgICBsZXQgbWVkaWEgPSB7aWQ6ICdtYWluJ307XG5cbiAgICAgICAgYXBpLnJlZ2lzdGVyTWVkaWEoPElQbGF5YWJsZT5tZWRpYSk7XG5cbiAgICAgICAgZXhwZWN0KGFwaS5tZWRpYXNbJ21haW4nXSkudG9CZShtZWRpYSk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIHJlZ2lzdGVyIGEgbmV3IG1lZGlhIG9iamVjdCcsICgpID0+IHtcbiAgICAgICAgbGV0IG1lZGlhID0ge2lkOiAnbWFpbid9O1xuICAgICAgICBhcGlbJ21haW4nXSA9IHt9O1xuXG4gICAgICAgIGFwaS51bnJlZ2lzdGVyTWVkaWEoPElQbGF5YWJsZT5tZWRpYSk7XG5cbiAgICAgICAgZXhwZWN0KGFwaS5tZWRpYXNbJ21haW4nXSkudG9CZSh1bmRlZmluZWQpO1xuICAgIH0pO1xufSk7XG5cbmludGVyZmFjZSBEZWNvcmF0b3JJbnZvY2F0aW9uIHtcbiAgdHlwZTogRnVuY3Rpb247XG4gIGFyZ3M/OiBhbnlbXTtcbn1cbiJdfQ==