UNPKG

videogular2

Version:

Videogular is a video application framework for desktop and mobile powered by Angular

252 lines 38.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); 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', vgMaster: true } }; expect(api.getMasterMedia()).toEqual({ id: 'secondary', vgMaster: 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 () { }); // @ts-ignore 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 () { }); // @ts-ignore 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 () { }); // @ts-ignore 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 () { }); // @ts-ignore 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 () { }); // @ts-ignore var playbackRate = api.playbackRate; expect(api.$$getAllProperties).toHaveBeenCalledWith('playbackRate'); }); it('Should get canPlay', function () { spyOn(api, '$$getAllProperties').and.callFake(function () { }); // @ts-ignore var canPlay = api.canPlay; expect(api.$$getAllProperties).toHaveBeenCalledWith('canPlay'); }); it('Should get canPlayThrough', function () { spyOn(api, '$$getAllProperties').and.callFake(function () { }); // @ts-ignore var canPlayThrough = api.canPlayThrough; expect(api.$$getAllProperties).toHaveBeenCalledWith('canPlayThrough'); }); it('Should get isMetadataLoaded', function () { spyOn(api, '$$getAllProperties').and.callFake(function () { }); // @ts-ignore var isMetadataLoaded = api.isMetadataLoaded; expect(api.$$getAllProperties).toHaveBeenCalledWith('isMetadataLoaded'); }); it('Should get isWaiting', function () { spyOn(api, '$$getAllProperties').and.callFake(function () { }); // @ts-ignore var isWaiting = api.isWaiting; expect(api.$$getAllProperties).toHaveBeenCalledWith('isWaiting'); }); it('Should get isCompleted', function () { spyOn(api, '$$getAllProperties').and.callFake(function () { }); // @ts-ignore var isCompleted = api.isCompleted; expect(api.$$getAllProperties).toHaveBeenCalledWith('isCompleted'); }); it('Should get time', function () { spyOn(api, '$$getAllProperties').and.callFake(function () { }); // @ts-ignore var time = api.time; expect(api.$$getAllProperties).toHaveBeenCalledWith('time'); }); it('Should get buffer', function () { spyOn(api, '$$getAllProperties').and.callFake(function () { }); // @ts-ignore var time = api.buffer; expect(api.$$getAllProperties).toHaveBeenCalledWith('buffer'); }); it('Should get buffered', function () { spyOn(api, '$$getAllProperties').and.callFake(function () { }); // @ts-ignore var buffered = api.buffered; expect(api.$$getAllProperties).toHaveBeenCalledWith('buffered'); }); it('Should get subscriptions', function () { spyOn(api, '$$getAllProperties').and.callFake(function () { }); // @ts-ignore 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmctYXBpLnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29yZS9zZXJ2aWNlcy92Zy1hcGkuc3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLG1DQUErQjtBQUUvQixpREFBNkM7QUFFN0MsUUFBUSxDQUFDLG1CQUFtQixFQUFFO0lBQzFCLElBQUksR0FBUyxDQUFDO0lBRWQsVUFBVSxDQUFDO1FBQ1AsR0FBRyxHQUFHLElBQUksY0FBSyxFQUFFLENBQUM7SUFDdEIsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsOEJBQThCLEVBQUU7UUFDL0IsR0FBRyxDQUFDLE1BQU0sR0FBRztZQUNULElBQUksRUFBRSxFQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUM7WUFDbEIsU0FBUyxFQUFFLEVBQUMsRUFBRSxFQUFFLFdBQVcsRUFBQztTQUMvQixDQUFDO1FBRUYsTUFBTSxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBWSxFQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUMsQ0FBQyxDQUFDO0lBQ25FLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGdCQUFnQixFQUFFO1FBQ3ZCLEVBQUUsQ0FBQyw2QkFBNkIsRUFBRTtZQUM5QixHQUFHLENBQUMsTUFBTSxHQUFHO2dCQUNULElBQUksRUFBRSxFQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUM7Z0JBQ2xCLFNBQVMsRUFBRSxFQUFDLEVBQUUsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBQzthQUMvQyxDQUFDO1lBRUYsTUFBTSxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBTSxFQUFDLEVBQUUsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7UUFDakYsQ0FBQyxDQUFDLENBQUM7UUFDSCxFQUFFLENBQUMsd0RBQXdELEVBQUU7WUFDekQsR0FB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TyxFQUFFLG9CQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFckQsTUFBTSxDQUFPLEdBQUcsQ0FBQyxNQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQy9ELE1BQU0sQ0FBTyxHQUFHLENBQUMsTUFBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsb0JBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN4RSxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxvQ0FBb0MsRUFBRTtRQUNyQyxJQUFJLEtBQUssR0FBRyxFQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUMsQ0FBQztRQUV6QixHQUFHLENBQUMsYUFBYSxDQUFZLEtBQUssQ0FBQyxDQUFDO1FBRXBDLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNDLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLG9DQUFvQyxFQUFFO1FBQ3JDLElBQUksS0FBSyxHQUFHLEVBQUMsRUFBRSxFQUFFLE1BQU0sRUFBQyxDQUFDO1FBQ3pCLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUM7UUFFakIsR0FBRyxDQUFDLGVBQWUsQ0FBWSxLQUFLLENBQUMsQ0FBQztRQUV0QyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMvQyxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtWZ0FQSX0gZnJvbSBcIi4vdmctYXBpXCI7XG5pbXBvcnQge0lQbGF5YWJsZX0gZnJvbSBcIi4uL3ZnLW1lZGlhL2ktcGxheWFibGVcIjtcbmltcG9ydCB7VmdTdGF0ZXN9IGZyb20gXCIuLi9zdGF0ZXMvdmctc3RhdGVzXCI7XG5cbmRlc2NyaWJlKCdWaWRlb2d1bGFyIFBsYXllcicsICgpID0+IHtcbiAgICBsZXQgYXBpOlZnQVBJO1xuXG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAgIGFwaSA9IG5ldyBWZ0FQSSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBnZXQgdGhlIGRlZmF1bHQgbWVkaWEnLCAoKSA9PiB7XG4gICAgICAgIGFwaS5tZWRpYXMgPSB7XG4gICAgICAgICAgICBtYWluOiB7aWQ6ICdtYWluJ30sXG4gICAgICAgICAgICBzZWNvbmRhcnk6IHtpZDogJ3NlY29uZGFyeSd9XG4gICAgICAgIH07XG5cbiAgICAgICAgZXhwZWN0KGFwaS5nZXREZWZhdWx0TWVkaWEoKSkudG9FcXVhbCg8SVBsYXlhYmxlPntpZDogJ21haW4nfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnZ2V0TWFzdGVyTWVkaWEnLCAoKSA9PiB7XG4gICAgICAgIGl0KCdTaG91bGQgZ2V0IHRoZSBtYXN0ZXIgbWVkaWEnLCAoKSA9PiB7XG4gICAgICAgICAgICBhcGkubWVkaWFzID0ge1xuICAgICAgICAgICAgICAgIG1haW46IHtpZDogJ21haW4nfSxcbiAgICAgICAgICAgICAgICBzZWNvbmRhcnk6IHtpZDogJ3NlY29uZGFyeScsIHZnTWFzdGVyOiB0cnVlfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgZXhwZWN0KGFwaS5nZXRNYXN0ZXJNZWRpYSgpKS50b0VxdWFsKDxhbnk+e2lkOiAnc2Vjb25kYXJ5JywgdmdNYXN0ZXI6IHRydWV9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCdTaG91bGQgZ2V0IHRoZSBkZWZhdWx0IG1lZGlhIHdoZW4gbm8gbWFzdGVyIGlzIGRlZmluZWQnLCAoKSA9PiB7XG4gICAgICAgICAgICBhcGkubWVkaWFzID0ge1xuICAgICAgICAgICAgICAgIG1haW46IHtpZDogJ21haW4nfSxcbiAgICAgICAgICAgICAgICBzZWNvbmRhcnk6IHtpZDogJ3NlY29uZGFyeSd9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBleHBlY3QoYXBpLmdldE1hc3Rlck1lZGlhKCkpLnRvRXF1YWwoYXBpLmdldERlZmF1bHRNZWRpYSgpKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIGdldCB0aGUgYXBpIGlmIHdlIGRvIG5vdCBwYXNzIGFuIGlkJywgKCkgPT4ge1xuICAgICAgICBhcGkubWVkaWFzID0ge1xuICAgICAgICAgICAgbWFpbjoge2lkOiAnbWFpbid9LFxuICAgICAgICAgICAgc2Vjb25kYXJ5OiB7aWQ6ICdzZWNvbmRhcnknfVxuICAgICAgICB9O1xuXG4gICAgICAgIGV4cGVjdChhcGkuZ2V0TWVkaWFCeUlkKCkpLnRvRXF1YWwoPGFueT5hcGkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBnZXQgdGhlIGFwaSBpZiB3ZSBwYXNzIGFuIConLCAoKSA9PiB7XG4gICAgICAgIGFwaS5tZWRpYXMgPSB7XG4gICAgICAgICAgICBtYWluOiB7aWQ6ICdtYWluJ30sXG4gICAgICAgICAgICBzZWNvbmRhcnk6IHtpZDogJ3NlY29uZGFyeSd9XG4gICAgICAgIH07XG5cbiAgICAgICAgZXhwZWN0KGFwaS5nZXRNZWRpYUJ5SWQoJyonKSkudG9FcXVhbCg8YW55PmFwaSk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIGdldCBhIG1lZGlhIG9iamVjdCBpZiB3ZSBwYXNzIGFuIGlkJywgKCkgPT4ge1xuICAgICAgICBhcGkubWVkaWFzID0ge1xuICAgICAgICAgICAgbWFpbjoge2lkOiAnbWFpbid9LFxuICAgICAgICAgICAgc2Vjb25kYXJ5OiB7aWQ6ICdzZWNvbmRhcnknfVxuICAgICAgICB9O1xuXG4gICAgICAgIGV4cGVjdChhcGkuZ2V0TWVkaWFCeUlkKCdtYWluJykpLnRvRXF1YWwoPElQbGF5YWJsZT57aWQ6ICdtYWluJ30pO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBwbGF5IGFsbCBtZWRpYXMnLCAoKSA9PiB7XG4gICAgICAgIGFwaS5tZWRpYXMgPSB7XG4gICAgICAgICAgICBtYWluOiB7aWQ6ICdtYWluJywgcGxheTogKCkgPT4ge319LFxuICAgICAgICAgICAgc2Vjb25kYXJ5OiB7aWQ6ICdzZWNvbmRhcnknLCBwbGF5OiAoKSA9PiB7fX1cbiAgICAgICAgfTtcblxuICAgICAgICBzcHlPbigoPGFueT5hcGkubWVkaWFzKS5tYWluLCAncGxheScpLmFuZC5jYWxsVGhyb3VnaCgpO1xuICAgICAgICBzcHlPbigoPGFueT5hcGkubWVkaWFzKS5zZWNvbmRhcnksICdwbGF5JykuYW5kLmNhbGxUaHJvdWdoKCk7XG5cbiAgICAgICAgYXBpLnBsYXkoKTtcblxuICAgICAgICBleHBlY3QoKDxhbnk+YXBpLm1lZGlhcykubWFpbi5wbGF5KS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICAgIGV4cGVjdCgoPGFueT5hcGkubWVkaWFzKS5zZWNvbmRhcnkucGxheSkudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBwYXVzZSBhbGwgbWVkaWFzJywgKCkgPT4ge1xuICAgICAgICBhcGkubWVkaWFzID0ge1xuICAgICAgICAgICAgbWFpbjoge2lkOiAnbWFpbicsIHBhdXNlOiAoKSA9PiB7fX0sXG4gICAgICAgICAgICBzZWNvbmRhcnk6IHtpZDogJ3NlY29uZGFyeScsIHBhdXNlOiAoKSA9PiB7fX1cbiAgICAgICAgfTtcblxuICAgICAgICBzcHlPbigoPGFueT5hcGkubWVkaWFzKS5tYWluLCAncGF1c2UnKS5hbmQuY2FsbFRocm91Z2goKTtcbiAgICAgICAgc3B5T24oKDxhbnk+YXBpLm1lZGlhcykuc2Vjb25kYXJ5LCAncGF1c2UnKS5hbmQuY2FsbFRocm91Z2goKTtcblxuICAgICAgICBhcGkucGF1c2UoKTtcblxuICAgICAgICBleHBlY3QoKDxhbnk+YXBpLm1lZGlhcykubWFpbi5wYXVzZSkudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgICAgICBleHBlY3QoKDxhbnk+YXBpLm1lZGlhcykuc2Vjb25kYXJ5LnBhdXNlKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIGdldCBkdXJhdGlvbicsICgpID0+IHtcbiAgICAgICAgc3B5T24oYXBpLCAnJCRnZXRBbGxQcm9wZXJ0aWVzJykuYW5kLmNhbGxGYWtlKCgpID0+IHt9KTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBsZXQgZHVyYXRpb24gPSBhcGkuZHVyYXRpb247XG5cbiAgICAgICAgZXhwZWN0KGFwaS4kJGdldEFsbFByb3BlcnRpZXMpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdkdXJhdGlvbicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBzZXQgYSBzdGF0ZScsICgpID0+IHtcbiAgICAgICAgc3B5T24oYXBpLCAnJCRzZXRBbGxQcm9wZXJ0aWVzJykuYW5kLmNhbGxGYWtlKCgpID0+IHt9KTtcblxuICAgICAgICBhcGkuc3RhdGUgPSAncGF1c2UnO1xuXG4gICAgICAgIGV4cGVjdChhcGkuJCRzZXRBbGxQcm9wZXJ0aWVzKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnc3RhdGUnLCAncGF1c2UnKTtcbiAgICB9KTtcblxuICAgIGl0KCdTaG91bGQgZ2V0IHN0YXRlJywgKCkgPT4ge1xuICAgICAgICBzcHlPbihhcGksICckJGdldEFsbFByb3BlcnRpZXMnKS5hbmQuY2FsbEZha2UoKCkgPT4ge30pO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGxldCBzdGF0ZSA9IGFwaS5zdGF0ZTtcblxuICAgICAgICBleHBlY3QoYXBpLiQkZ2V0QWxsUHJvcGVydGllcykudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ3N0YXRlJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIHNldCBhIGN1cnJlbnRUaW1lJywgKCkgPT4ge1xuICAgICAgICBzcHlPbihhcGksICckJHNldEFsbFByb3BlcnRpZXMnKS5hbmQuY2FsbEZha2UoKCkgPT4ge30pO1xuXG4gICAgICAgIGFwaS5jdXJyZW50VGltZSA9IDUwO1xuXG4gICAgICAgIGV4cGVjdChhcGkuJCRzZXRBbGxQcm9wZXJ0aWVzKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnY3VycmVudFRpbWUnLCA1MCk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIGdldCBjdXJyZW50VGltZScsICgpID0+IHtcbiAgICAgICAgc3B5T24oYXBpLCAnJCRnZXRBbGxQcm9wZXJ0aWVzJykuYW5kLmNhbGxGYWtlKCgpID0+IHt9KTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBsZXQgY3VycmVudFRpbWUgPSBhcGkuY3VycmVudFRpbWU7XG5cbiAgICAgICAgZXhwZWN0KGFwaS4kJGdldEFsbFByb3BlcnRpZXMpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdjdXJyZW50VGltZScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBzZXQgYSB2b2x1bWUnLCAoKSA9PiB7XG4gICAgICAgIHNweU9uKGFwaSwgJyQkc2V0QWxsUHJvcGVydGllcycpLmFuZC5jYWxsRmFrZSgoKSA9PiB7fSk7XG5cbiAgICAgICAgYXBpLnZvbHVtZSA9IDAuNTtcblxuICAgICAgICBleHBlY3QoYXBpLiQkc2V0QWxsUHJvcGVydGllcykudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ3ZvbHVtZScsIDAuNSk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIGdldCB2b2x1bWUnLCAoKSA9PiB7XG4gICAgICAgIHNweU9uKGFwaSwgJyQkZ2V0QWxsUHJvcGVydGllcycpLmFuZC5jYWxsRmFrZSgoKSA9PiB7fSk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgbGV0IHZvbHVtZSA9IGFwaS52b2x1bWU7XG5cbiAgICAgICAgZXhwZWN0KGFwaS4kJGdldEFsbFByb3BlcnRpZXMpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCd2b2x1bWUnKTtcbiAgICB9KTtcblxuICAgIGl0KCdTaG91bGQgc2V0IGEgcGxheWJhY2sgcmF0ZScsICgpID0+IHtcbiAgICAgICAgc3B5T24oYXBpLCAnJCRzZXRBbGxQcm9wZXJ0aWVzJykuYW5kLmNhbGxGYWtlKCgpID0+IHt9KTtcblxuICAgICAgICBhcGkucGxheWJhY2tSYXRlID0gMC41O1xuXG4gICAgICAgIGV4cGVjdChhcGkuJCRzZXRBbGxQcm9wZXJ0aWVzKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgncGxheWJhY2tSYXRlJywgMC41KTtcbiAgICB9KTtcblxuICAgIGl0KCdTaG91bGQgZ2V0IHBsYXliYWNrUmF0ZScsICgpID0+IHtcbiAgICAgICAgc3B5T24oYXBpLCAnJCRnZXRBbGxQcm9wZXJ0aWVzJykuYW5kLmNhbGxGYWtlKCgpID0+IHt9KTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBsZXQgcGxheWJhY2tSYXRlID0gYXBpLnBsYXliYWNrUmF0ZTtcblxuICAgICAgICBleHBlY3QoYXBpLiQkZ2V0QWxsUHJvcGVydGllcykudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ3BsYXliYWNrUmF0ZScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBnZXQgY2FuUGxheScsICgpID0+IHtcbiAgICAgICAgc3B5T24oYXBpLCAnJCRnZXRBbGxQcm9wZXJ0aWVzJykuYW5kLmNhbGxGYWtlKCgpID0+IHt9KTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBsZXQgY2FuUGxheSA9IGFwaS5jYW5QbGF5O1xuXG4gICAgICAgIGV4cGVjdChhcGkuJCRnZXRBbGxQcm9wZXJ0aWVzKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnY2FuUGxheScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBnZXQgY2FuUGxheVRocm91Z2gnLCAoKSA9PiB7XG4gICAgICAgIHNweU9uKGFwaSwgJyQkZ2V0QWxsUHJvcGVydGllcycpLmFuZC5jYWxsRmFrZSgoKSA9PiB7fSk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgbGV0IGNhblBsYXlUaHJvdWdoID0gYXBpLmNhblBsYXlUaHJvdWdoO1xuXG4gICAgICAgIGV4cGVjdChhcGkuJCRnZXRBbGxQcm9wZXJ0aWVzKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnY2FuUGxheVRocm91Z2gnKTtcbiAgICB9KTtcblxuICAgIGl0KCdTaG91bGQgZ2V0IGlzTWV0YWRhdGFMb2FkZWQnLCAoKSA9PiB7XG4gICAgICAgIHNweU9uKGFwaSwgJyQkZ2V0QWxsUHJvcGVydGllcycpLmFuZC5jYWxsRmFrZSgoKSA9PiB7fSk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgbGV0IGlzTWV0YWRhdGFMb2FkZWQgPSBhcGkuaXNNZXRhZGF0YUxvYWRlZDtcblxuICAgICAgICBleHBlY3QoYXBpLiQkZ2V0QWxsUHJvcGVydGllcykudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ2lzTWV0YWRhdGFMb2FkZWQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdTaG91bGQgZ2V0IGlzV2FpdGluZycsICgpID0+IHtcbiAgICAgICAgc3B5T24oYXBpLCAnJCRnZXRBbGxQcm9wZXJ0aWVzJykuYW5kLmNhbGxGYWtlKCgpID0+IHt9KTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBsZXQgaXNXYWl0aW5nID0gYXBpLmlzV2FpdGluZztcblxuICAgICAgICBleHBlY3QoYXBpLiQkZ2V0QWxsUHJvcGVydGllcykudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ2lzV2FpdGluZycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBnZXQgaXNDb21wbGV0ZWQnLCAoKSA9PiB7XG4gICAgICAgIHNweU9uKGFwaSwgJyQkZ2V0QWxsUHJvcGVydGllcycpLmFuZC5jYWxsRmFrZSgoKSA9PiB7fSk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgbGV0IGlzQ29tcGxldGVkID0gYXBpLmlzQ29tcGxldGVkO1xuXG4gICAgICAgIGV4cGVjdChhcGkuJCRnZXRBbGxQcm9wZXJ0aWVzKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnaXNDb21wbGV0ZWQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdTaG91bGQgZ2V0IHRpbWUnLCAoKSA9PiB7XG4gICAgICAgIHNweU9uKGFwaSwgJyQkZ2V0QWxsUHJvcGVydGllcycpLmFuZC5jYWxsRmFrZSgoKSA9PiB7fSk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgbGV0IHRpbWUgPSBhcGkudGltZTtcblxuICAgICAgICBleHBlY3QoYXBpLiQkZ2V0QWxsUHJvcGVydGllcykudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ3RpbWUnKTtcbiAgICB9KTtcblxuICAgIGl0KCdTaG91bGQgZ2V0IGJ1ZmZlcicsICgpID0+IHtcbiAgICAgICAgc3B5T24oYXBpLCAnJCRnZXRBbGxQcm9wZXJ0aWVzJykuYW5kLmNhbGxGYWtlKCgpID0+IHt9KTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBsZXQgdGltZSA9IGFwaS5idWZmZXI7XG5cbiAgICAgICAgZXhwZWN0KGFwaS4kJGdldEFsbFByb3BlcnRpZXMpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdidWZmZXInKTtcbiAgICB9KTtcblxuICAgIGl0KCdTaG91bGQgZ2V0IGJ1ZmZlcmVkJywgKCkgPT4ge1xuICAgICAgICBzcHlPbihhcGksICckJGdldEFsbFByb3BlcnRpZXMnKS5hbmQuY2FsbEZha2UoKCkgPT4ge30pO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGxldCBidWZmZXJlZCA9IGFwaS5idWZmZXJlZDtcblxuICAgICAgICBleHBlY3QoYXBpLiQkZ2V0QWxsUHJvcGVydGllcykudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ2J1ZmZlcmVkJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIGdldCBzdWJzY3JpcHRpb25zJywgKCkgPT4ge1xuICAgICAgICBzcHlPbihhcGksICckJGdldEFsbFByb3BlcnRpZXMnKS5hbmQuY2FsbEZha2UoKCkgPT4ge30pO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGxldCBzdWJzY3JpcHRpb25zID0gYXBpLnN1YnNjcmlwdGlvbnM7XG5cbiAgICAgICAgZXhwZWN0KGFwaS4kJGdldEFsbFByb3BlcnRpZXMpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdzdWJzY3JpcHRpb25zJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIHNlZWsgdG8gYSBzcGVjaWZpZWQgdGltZSBieSBzZWNvbmQnLCAoKSA9PiB7XG4gICAgICAgIGFwaS5tZWRpYXMgPSB7XG4gICAgICAgICAgICBtYWluOiB7aWQ6ICdtYWluJ30sXG4gICAgICAgICAgICBzZWNvbmRhcnk6IHtpZDogJ3NlY29uZGFyeSd9XG4gICAgICAgIH07XG5cbiAgICAgICAgc3B5T24oYXBpLCAnJCRzZWVrJykuYW5kLmNhbGxGYWtlKCgpID0+IHt9KTtcblxuICAgICAgICBhcGkuc2Vla1RpbWUoMTApO1xuXG4gICAgICAgIGV4cGVjdChhcGkuJCRzZWVrKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCg8SVBsYXlhYmxlPntpZDogJ21haW4nfSwgMTAsIGZhbHNlKTtcbiAgICAgICAgZXhwZWN0KGFwaS4kJHNlZWspLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKDxJUGxheWFibGU+e2lkOiAnc2Vjb25kYXJ5J30sIDEwLCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIHNlZWsgdG8gYSBzcGVjaWZpZWQgdGltZSBieSBwZXJjZW50YWdlJywgKCkgPT4ge1xuICAgICAgICBhcGkubWVkaWFzID0ge1xuICAgICAgICAgICAgbWFpbjoge2lkOiAnbWFpbid9LFxuICAgICAgICAgICAgc2Vjb25kYXJ5OiB7aWQ6ICdzZWNvbmRhcnknfVxuICAgICAgICB9O1xuXG4gICAgICAgIHNweU9uKGFwaSwgJyQkc2VlaycpLmFuZC5jYWxsRmFrZSgoKSA9PiB7fSk7XG5cbiAgICAgICAgYXBpLnNlZWtUaW1lKDEwLCB0cnVlKTtcblxuICAgICAgICBleHBlY3QoYXBpLiQkc2VlaykudG9IYXZlQmVlbkNhbGxlZFdpdGgoPElQbGF5YWJsZT57aWQ6ICdtYWluJ30sIDEwLCB0cnVlKTtcbiAgICAgICAgZXhwZWN0KGFwaS4kJHNlZWspLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKDxJUGxheWFibGU+e2lkOiAnc2Vjb25kYXJ5J30sIDEwLCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdTaG91bGQgc2VlayBtZWRpYSBmaWxlcyB0byBhIHNwZWNpZmllZCB0aW1lIGJ5IHNlY29uZCcsICgpID0+IHtcbiAgICAgICAgbGV0IG1lZGlhID0ge1xuICAgICAgICAgICAgY3VycmVudFRpbWU6IDBcbiAgICAgICAgfTtcblxuICAgICAgICBhcGkuJCRzZWVrKDxJUGxheWFibGU+bWVkaWEsIDEwKTtcblxuICAgICAgICBleHBlY3QobWVkaWEuY3VycmVudFRpbWUpLnRvQmUoMTApO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBzZWVrIG1lZGlhIGZpbGVzIHRvIGEgc3BlY2lmaWVkIHRpbWUgYnkgcGVyY2VudGFnZScsICgpID0+IHtcbiAgICAgICAgbGV0IG1lZGlhID0ge1xuICAgICAgICAgICAgZHVyYXRpb246IDIwMCxcbiAgICAgICAgICAgIGN1cnJlbnRUaW1lOiAwLFxuICAgICAgICAgICAgc3Vic2NyaXB0aW9uczoge31cbiAgICAgICAgfTtcblxuICAgICAgICBhcGkuJCRzZWVrKDxhbnk+bWVkaWEsIDEwLCB0cnVlKTtcblxuICAgICAgICBleHBlY3QobWVkaWEuY3VycmVudFRpbWUpLnRvQmUoMjApO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBnZXQgYSBwcm9wZXJ0eSBmcm9tIGFsbCBtZWRpYSBvYmplY3RzIGFuZCByZXR1cm4gYW4gb2JqZWN0JywgKCkgPT4ge1xuICAgICAgICBhcGkubWVkaWFzID0ge1xuICAgICAgICAgICAgbWFpbjoge2lkOiAnbWFpbicsIHN0YXRlOiBWZ1N0YXRlcy5WR19QTEFZSU5HfSxcbiAgICAgICAgICAgIHNlY29uZGFyeToge2lkOiAnc2Vjb25kYXJ5Jywgc3RhdGU6IFZnU3RhdGVzLlZHX1BBVVNFRH1cbiAgICAgICAgfTtcblxuICAgICAgICBsZXQgc3RhdGVzID0gYXBpLiQkZ2V0QWxsUHJvcGVydGllcygnc3RhdGUnKTtcblxuICAgICAgICBleHBlY3Qoc3RhdGVzKS50b0VxdWFsKFZnU3RhdGVzLlZHX1BMQVlJTkcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBnZXQgYSBwcm9wZXJ0eSBmcm9tIGFsbCBtZWRpYSBvYmplY3RzIGFuZCByZXR1cm4gYSBwbGFpbiB2YWx1ZSBpZiB0aGVyZSBpcyBvbmx5IG9uZSBtZWRpYSBvYmplY3QnLCAoKSA9PiB7XG4gICAgICAgIGFwaS5tZWRpYXMgPSB7XG4gICAgICAgICAgICBtYWluOiB7aWQ6ICdtYWluJywgc3RhdGU6IFZnU3RhdGVzLlZHX1BMQVlJTkd9XG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IHN0YXRlcyA9IGFwaS4kJGdldEFsbFByb3BlcnRpZXMoJ3N0YXRlJyk7XG5cbiAgICAgICAgZXhwZWN0KHN0YXRlcykudG9FcXVhbChWZ1N0YXRlcy5WR19QTEFZSU5HKTtcbiAgICB9KTtcblxuICAgIGl0KCdTaG91bGQgc2V0IGEgcHJvcGVydHkgdG8gYWxsIG1lZGlhIG9iamVjdHMnLCAoKSA9PiB7XG4gICAgICAgIGFwaS5tZWRpYXMgPSB7XG4gICAgICAgICAgICBtYWluOiB7aWQ6ICdtYWluJywgc3RhdGU6ICdzdG9wJ30sXG4gICAgICAgICAgICBzZWNvbmRhcnk6IHtpZDogJ3NlY29uZGFyeScsIHN0YXRlOiAnc3RvcCd9XG4gICAgICAgIH07XG5cbiAgICAgICAgYXBpLiQkc2V0QWxsUHJvcGVydGllcygnc3RhdGUnLCBWZ1N0YXRlcy5WR19QTEFZSU5HKTtcblxuICAgICAgICBleHBlY3QoKDxhbnk+YXBpLm1lZGlhcykubWFpbi5zdGF0ZSkudG9CZShWZ1N0YXRlcy5WR19QTEFZSU5HKTtcbiAgICAgICAgZXhwZWN0KCg8YW55PmFwaS5tZWRpYXMpLnNlY29uZGFyeS5zdGF0ZSkudG9CZShWZ1N0YXRlcy5WR19QTEFZSU5HKTtcbiAgICB9KTtcblxuICAgIGl0KCdTaG91bGQgcmVnaXN0ZXIgYSBuZXcgbWVkaWEgb2JqZWN0JywgKCkgPT4ge1xuICAgICAgICBsZXQgbWVkaWEgPSB7aWQ6ICdtYWluJ307XG5cbiAgICAgICAgYXBpLnJlZ2lzdGVyTWVkaWEoPElQbGF5YWJsZT5tZWRpYSk7XG5cbiAgICAgICAgZXhwZWN0KGFwaS5tZWRpYXNbJ21haW4nXSkudG9CZShtZWRpYSk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIHJlZ2lzdGVyIGEgbmV3IG1lZGlhIG9iamVjdCcsICgpID0+IHtcbiAgICAgICAgbGV0IG1lZGlhID0ge2lkOiAnbWFpbid9O1xuICAgICAgICBhcGlbJ21haW4nXSA9IHt9O1xuXG4gICAgICAgIGFwaS51bnJlZ2lzdGVyTWVkaWEoPElQbGF5YWJsZT5tZWRpYSk7XG5cbiAgICAgICAgZXhwZWN0KGFwaS5tZWRpYXNbJ21haW4nXSkudG9CZSh1bmRlZmluZWQpO1xuICAgIH0pO1xufSk7XG4iXX0=