@project-sunbird/sunbird-video-player-v9
Version:
The Video player library is powered by Angular. This player is primarily designed to be used on Sunbird consumption platforms _(mobile app, web portal, offline desktop app)_ to drive reusability and maintainability, hence reducing the redundant developmen
544 lines • 102 kB
JavaScript
import { Component, EventEmitter, Input, Output, ViewChild, ViewEncapsulation, Optional } from '@angular/core';
import * as _ from 'lodash-es';
import 'videojs-contrib-quality-levels';
import videojshttpsourceselector from 'videojs-http-source-selector';
import * as i0 from "@angular/core";
import * as i1 from "../../services/viewer.service";
import * as i2 from "@project-sunbird/sunbird-quml-player-v9";
import * as i3 from "@angular/common/http";
import * as i4 from "@angular/common";
const _c0 = ["target"];
const _c1 = ["controlDiv"];
function VideoPlayerComponent_track_2_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "track", 6);
} if (rf & 2) {
const trans_r4 = ctx.$implicit;
i0.ɵɵpropertyInterpolate("default", trans_r4.default);
i0.ɵɵpropertyInterpolate("src", trans_r4.artifactUrl, i0.ɵɵsanitizeUrl);
i0.ɵɵpropertyInterpolate("srclang", trans_r4.languageCode);
i0.ɵɵpropertyInterpolate("label", trans_r4.language);
} }
function VideoPlayerComponent_div_6_span_6_Template(rf, ctx) { if (rf & 1) {
const _r8 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "span", 18);
i0.ɵɵlistener("click", function VideoPlayerComponent_div_6_span_6_Template_span_click_0_listener() { i0.ɵɵrestoreView(_r8); const ctx_r7 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r7.pause()); });
i0.ɵɵnamespaceSVG();
i0.ɵɵelementStart(1, "svg", 19)(2, "g", 20);
i0.ɵɵelement(3, "path", 21);
i0.ɵɵelementEnd()()();
} }
function VideoPlayerComponent_div_6_span_7_Template(rf, ctx) { if (rf & 1) {
const _r10 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "span", 22);
i0.ɵɵlistener("click", function VideoPlayerComponent_div_6_span_7_Template_span_click_0_listener() { i0.ɵɵrestoreView(_r10); const ctx_r9 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r9.play()); });
i0.ɵɵnamespaceSVG();
i0.ɵɵelementStart(1, "svg", 19)(2, "g", 23);
i0.ɵɵelement(3, "path", 24);
i0.ɵɵelementEnd()()();
} }
function VideoPlayerComponent_div_6_Template(rf, ctx) { if (rf & 1) {
const _r12 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "div", 7)(1, "div", 8);
i0.ɵɵlistener("click", function VideoPlayerComponent_div_6_Template_div_click_1_listener() { i0.ɵɵrestoreView(_r12); const ctx_r11 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r11.backward()); });
i0.ɵɵnamespaceSVG();
i0.ɵɵelementStart(2, "svg", 9)(3, "g", 10);
i0.ɵɵelement(4, "path", 11);
i0.ɵɵelementEnd()()();
i0.ɵɵnamespaceHTML();
i0.ɵɵelementStart(5, "div", 12);
i0.ɵɵtemplate(6, VideoPlayerComponent_div_6_span_6_Template, 4, 0, "span", 13);
i0.ɵɵtemplate(7, VideoPlayerComponent_div_6_span_7_Template, 4, 0, "span", 14);
i0.ɵɵelementEnd();
i0.ɵɵelementStart(8, "div", 15);
i0.ɵɵlistener("click", function VideoPlayerComponent_div_6_Template_div_click_8_listener() { i0.ɵɵrestoreView(_r12); const ctx_r13 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r13.forward()); });
i0.ɵɵnamespaceSVG();
i0.ɵɵelementStart(9, "svg", 9)(10, "g", 16);
i0.ɵɵelement(11, "path", 17);
i0.ɵɵelementEnd()()()();
} if (rf & 2) {
const ctx_r3 = i0.ɵɵnextContext();
i0.ɵɵadvance(1);
i0.ɵɵstyleProp("visibility", ctx_r3.showBackwardButton ? "visible" : "hidden");
i0.ɵɵadvance(5);
i0.ɵɵproperty("ngIf", ctx_r3.showPauseButton);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx_r3.showPlayButton);
i0.ɵɵadvance(1);
i0.ɵɵstyleProp("visibility", ctx_r3.showForwardButton ? "visible" : "hidden");
} }
const _c2 = function (a0) { return { "player-for-back-ward-controls": a0 }; };
export class VideoPlayerComponent {
constructor(viewerService, renderer2, questionCursor, http, cdr) {
this.viewerService = viewerService;
this.renderer2 = renderer2;
this.questionCursor = questionCursor;
this.http = http;
this.cdr = cdr;
this.questionSetData = new EventEmitter();
this.playerInstance = new EventEmitter();
this.transcripts = [];
this.showBackwardButton = false;
this.showForwardButton = false;
this.showPlayButton = true;
this.showPauseButton = false;
this.showControls = true;
this.currentPlayerState = 'none';
this.totalSeekedLength = 0;
this.previousTime = 0;
this.currentTime = 0;
this.seekStart = null;
this.time = 10;
this.totalSpentTime = 0;
this.isAutoplayPrevented = false;
this.setMetaDataConfig = false;
this.totalDuration = 0;
this.disablePictureInPicture = false;
this.playsinline = false;
this.disableRemotePlayback = false;
this.enterPiPHandler = (e) => {
e.preventDefault();
if (document.exitPictureInPicture) {
document.exitPictureInPicture().catch(error => {
console.error('Failed to exit Picture-in-Picture mode:', error);
});
}
};
}
ngOnInit() {
this.disablePictureInPicture = _.get(this.config, 'disablePictureInPictureMode', false);
this.playsinline = _.get(this.config, 'playsinline', false);
this.disableRemotePlayback = _.get(this.config, 'disableRemotePlayback', false);
this.transcripts = this.viewerService.handleTranscriptsData(_.get(this.config, 'transcripts') || []);
}
ngAfterViewInit() {
this.viewerService.getPlayerOptions().then(async (options) => {
this.player = await videojs(this.target.nativeElement, {
fluid: true,
responsive: true,
sources: options,
autoplay: true,
muted: _.get(this.config, 'muted'),
playbackRates: [0.5, 1, 1.5, 2],
controlBar: {
pictureInPictureToggle: !this.disablePictureInPicture,
children: ['playToggle', 'volumePanel', 'durationDisplay',
'progressControl', 'remainingTimeDisplay', 'CaptionsButton',
'playbackRateMenuButton', 'fullscreenToggle']
},
plugins: {
httpSourceSelector: {
default: 'low'
}
},
html5: {
hls: {
overrideNative: true
},
nativeAudioTracks: false,
nativeVideoTracks: false,
}
});
this.player.videojshttpsourceselector = videojshttpsourceselector;
this.player.videojshttpsourceselector();
const markers = this.viewerService.getMarkers();
if (markers && markers.length > 0) {
const identifiers = markers.map(item => {
return item.identifier;
});
if (this.viewerService.questionCursor) {
this.viewerService.questionCursor.getAllQuestionSet(identifiers).subscribe((response) => {
if (!_.isEmpty(response)) {
this.viewerService.maxScore = response.reduce((a, b) => a + b, 0);
}
});
}
}
if (markers) {
this.player.markers({
markers,
markerStyle: {
height: '7px',
bottom: '39%',
'background-color': 'orange'
},
onMarkerReached: (marker) => {
if (marker) {
const { time, text, identifier, duration } = marker;
if (!(this.player.currentTime() > (time + duration))) {
setTimeout(() => {
this.pause();
this.player.controls(false);
}, 1000);
this.viewerService.getQuestionSet(identifier).subscribe((response) => {
this.questionSetData.emit({ response, time, identifier });
}, (error) => {
this.play();
this.player.controls(true);
console.log(error);
});
}
}
}
});
this.playerInstance.emit(this.player);
this.viewerService.playerInstance = this.player;
this.viewerService.preFetchContent();
}
this.registerEvents();
});
setInterval(() => {
if (!this.isAutoplayPrevented && this.currentPlayerState !== 'pause') {
this.showControls = false;
}
}, 5000);
this.unlistenTargetMouseMove = this.renderer2.listen(this.target.nativeElement, 'mousemove', () => {
this.showControls = true;
});
this.unlistenTargetTouchStart = this.renderer2.listen(this.target.nativeElement, 'touchstart', () => {
this.showControls = true;
});
this.viewerService.sidebarMenuEvent.subscribe(event => {
if (event === 'OPEN_MENU') {
this.pause();
}
if (event === 'CLOSE_MENU') {
this.play();
}
});
}
ngOnChanges(changes) {
if (changes.action && this.player) {
if (changes.action.currentValue !== changes.action.previousValue) {
switch (changes.action.currentValue.name) {
case 'play':
this.play();
break;
case 'pause':
this.pause();
break;
default: console.warn('Invalid Case!');
}
}
}
}
onLoadMetadata(e) {
this.totalDuration = this.viewerService.metaData.totalDuration = this.player.duration();
this.viewerService.totalLength = this.totalDuration;
if (this.transcripts && this.transcripts.length && this.player.transcript) {
this.player.transcript({
showTitle: true,
showTrackSelector: true,
});
}
}
registerEvents() {
const promise = this.player.play();
if (promise !== undefined) {
promise.catch(error => {
this.isAutoplayPrevented = true;
});
}
const events = ['loadstart', 'play', 'pause',
'error', 'playing', 'progress', 'seeked', 'seeking', 'volumechange',
'ratechange'];
this.player.on('fullscreenchange', (data) => {
// This code is to show the controldiv in fullscreen mode
if (this.player.isFullscreen()) {
this.target.nativeElement.parentNode.appendChild(this.controlDiv.nativeElement);
}
this.viewerService.raiseHeartBeatEvent('FULLSCREEN');
});
this.player.on('pause', (data) => {
this.pause();
});
this.player.on('ratechange', (data) => {
this.viewerService.metaData.playBackSpeeds.push(this.player.playbackRate());
});
this.player.on('volumechange', (data) => {
this.viewerService.metaData.volume.push(this.player.volume());
this.viewerService.metaData.muted = this.player.muted();
});
this.player.on('play', (data) => {
this.currentPlayerState = 'play';
this.showPauseButton = true;
this.showPlayButton = false;
this.viewerService.raiseHeartBeatEvent('PLAY');
this.isAutoplayPrevented = false;
});
this.player.on('timeupdate', (data) => {
this.viewerService.metaData.currentDuration = this.player.currentTime();
this.handleVideoControls(data);
this.viewerService.playerEvent.emit(data);
this.viewerService.currentlength = this.viewerService.metaData.currentDuration;
this.totalSpentTime += new Date().getTime() - this.startTime;
this.startTime = new Date().getTime();
const currentTime = this.player.currentTime();
if (currentTime > 0 && this.totalDuration > 0) {
const remainingTime = Math.floor(this.totalDuration - currentTime);
if (remainingTime <= 0) {
this.viewerService.metaData.currentDuration = 0;
this.handleVideoControls({ type: 'ended' });
this.viewerService.playerEvent.emit({ type: 'ended' });
}
}
});
this.player.on('subtitleChanged', (event, track) => {
this.handleEventsForTranscripts(track);
});
this.player.on('durationchange', (data) => {
if (this.totalDuration === 0) {
this.totalDuration = this.viewerService.metaData.totalDuration = this.player.duration();
this.viewerService.playerEvent.emit({ ...data, duration: this.totalDuration });
}
});
this.player.ready(() => {
const videoEl = this.player.tech().el();
if (document.pictureInPictureEnabled && this.disablePictureInPicture) {
videoEl.addEventListener('enterpictureinpicture', this.enterPiPHandler);
}
});
events.forEach(event => {
this.player.on(event, (data) => {
this.handleVideoControls(data);
this.viewerService.playerEvent.emit(data);
});
});
this.trackTranscriptEvent();
}
trackTranscriptEvent() {
let timeout;
const player = this.player;
this.player.textTracks().on('change', function action(event) {
clearTimeout(timeout);
let transcriptObject = {};
this.tracks_.filter((track) => {
if ((track.kind === 'captions' || track.kind === 'subtitles') && track.mode === 'showing') {
transcriptObject = { artifactUrl: track.src, languageCode: track.language };
return true;
}
});
timeout = setTimeout(() => {
player.trigger('subtitleChanged', transcriptObject);
}, 10);
});
}
handleEventsForTranscripts(track) {
let telemetryObject;
if (!_.isEmpty(track)) {
telemetryObject = {
type: 'TRANSCRIPT_LANGUAGE_SELECTED',
extraValues: {
transcript: {
language: _.get(_.filter(this.transcripts, { artifactUrl: track.artifactUrl, languageCode: track.languageCode })[0], 'language')
},
videoTimeStamp: this.player.currentTime()
}
};
if (_.last(this.viewerService.metaData.transcripts) !== track.languageCode) {
this.viewerService.metaData.transcripts.push(track.languageCode);
}
}
else {
telemetryObject = {
type: 'TRANSCRIPT_LANGUAGE_OFF',
extraValues: {
videoTimeStamp: this.player.currentTime()
}
};
this.viewerService.metaData.transcripts.push('off');
}
this.viewerService.raiseHeartBeatEvent(telemetryObject.type, telemetryObject.extraValues);
}
toggleForwardRewindButton() {
this.showForwardButton = true;
this.showBackwardButton = true;
this.cdr.detectChanges();
if ((this.player.currentTime() + this.time) > this.totalDuration) {
this.showForwardButton = false;
this.cdr.detectChanges();
}
if ((this.player.currentTime() - this.time) < 0) {
this.showBackwardButton = false;
this.cdr.detectChanges();
}
}
play() {
if (this.player) {
this.player.play();
}
this.currentPlayerState = 'play';
this.showPauseButton = true;
this.showPlayButton = false;
this.toggleForwardRewindButton();
}
pause() {
if (this.player) {
this.player.pause();
}
this.currentPlayerState = 'pause';
this.showPauseButton = false;
this.showPlayButton = true;
this.toggleForwardRewindButton();
this.viewerService.raiseHeartBeatEvent('PAUSE');
}
backward() {
if (this.player) {
this.player.currentTime(this.player.currentTime() - this.time);
}
this.toggleForwardRewindButton();
this.viewerService.raiseHeartBeatEvent('BACKWARD');
}
forward() {
if (this.player) {
this.player.currentTime(this.player.currentTime() + this.time);
}
this.toggleForwardRewindButton();
this.viewerService.raiseHeartBeatEvent('FORWARD');
}
handleVideoControls({ type }) {
if (type === 'playing') {
this.showPlayButton = false;
this.showPauseButton = true;
if (this.setMetaDataConfig) {
this.setMetaDataConfig = false;
this.setPreMetaDataConfig();
}
}
if (type === 'ended') {
this.totalSpentTime += new Date().getTime() - this.startTime;
if (this.player) {
this.viewerService.currentlength = this.player.currentTime();
}
this.viewerService.totalLength = this.totalDuration;
this.updatePlayerEventsMetadata({ type });
this.viewerService.playBitEndTime = this.totalDuration;
this.viewerService.playerTimeSlots.push([this.viewerService.playBitStartTime, this.viewerService.playBitEndTime]);
}
if (type === 'pause') {
this.totalSpentTime += new Date().getTime() - this.startTime;
this.updatePlayerEventsMetadata({ type });
this.viewerService.playBitEndTime = this.previousTime;
this.viewerService.playerTimeSlots.push([this.viewerService.playBitStartTime, this.viewerService.playBitEndTime]);
}
if (type === 'play') {
this.startTime = new Date().getTime();
if (this.player?.currentTime()) {
this.viewerService.playBitStartTime = this.player?.currentTime();
}
this.updatePlayerEventsMetadata({ type });
}
if (type === 'loadstart') {
this.startTime = new Date().getTime();
this.setMetaDataConfig = true;
}
// Calculating total seeked length
if (type === 'timeupdate') {
this.previousTime = this.currentTime;
if (this.player) {
this.currentTime = this.player.currentTime();
}
this.toggleForwardRewindButton();
}
if (type === 'seeking') {
if (this.seekStart === null) {
this.seekStart = this.previousTime;
}
}
if (type === 'seeked') {
this.updatePlayerEventsMetadata({ type });
if (this.currentTime > this.seekStart) {
this.totalSeekedLength = this.totalSeekedLength + (this.currentTime - this.seekStart);
}
else if (this.seekStart > this.currentTime) {
this.totalSeekedLength = this.totalSeekedLength + (this.seekStart - this.currentTime);
}
this.viewerService.totalSeekedLength = this.totalSeekedLength;
this.seekStart = null;
if (this.player.markers && this.player.markers.getMarkers) {
const markers = this.player.markers.getMarkers();
markers.forEach(marker => {
if (!this.viewerService.interceptionResponses[marker.time] && marker.time < this.currentTime) {
this.viewerService.interceptionResponses[marker.time] = {
score: 0,
isSkipped: false
};
// eslint-disable-next-line @typescript-eslint/dot-notation
document.querySelector(`[data-marker-time="${marker.time}"]`)['style'].backgroundColor = 'red';
}
});
}
}
}
setPreMetaDataConfig() {
if (!_.isEmpty(_.get(this.config, 'volume'))) {
this.player.volume(_.last(_.get(this.config, 'volume')));
}
if (_.get(this.config, 'currentDuration')) {
this.player.currentTime(_.get(this.config, 'currentDuration'));
this.viewerService.playBitStartTime = _.get(this.config, 'currentDuration');
}
if (!_.isEmpty(_.get(this.config, 'playBackSpeeds'))) {
this.player.playbackRate(_.last(_.get(this.config, 'playBackSpeeds')));
}
}
updatePlayerEventsMetadata({ type }) {
const action = {};
action[type + ''] = this.player.currentTime();
this.viewerService.metaData.actions.push(action);
}
ngOnDestroy() {
if (this.player) {
const videoEl = this.player.tech().el();
videoEl.removeEventListener('enterpictureinpicture', this.enterPiPHandler);
this.player.dispose();
}
this.unlistenTargetMouseMove();
this.unlistenTargetTouchStart();
}
}
/** @nocollapse */ VideoPlayerComponent.ɵfac = function VideoPlayerComponent_Factory(t) { return new (t || VideoPlayerComponent)(i0.ɵɵdirectiveInject(i1.ViewerService), i0.ɵɵdirectiveInject(i0.Renderer2), i0.ɵɵdirectiveInject(i2.QuestionCursor, 8), i0.ɵɵdirectiveInject(i3.HttpClient), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
/** @nocollapse */ VideoPlayerComponent.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: VideoPlayerComponent, selectors: [["video-player"]], viewQuery: function VideoPlayerComponent_Query(rf, ctx) { if (rf & 1) {
i0.ɵɵviewQuery(_c0, 7);
i0.ɵɵviewQuery(_c1, 7);
} if (rf & 2) {
let _t;
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.target = _t.first);
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.controlDiv = _t.first);
} }, inputs: { config: "config", action: "action" }, outputs: { questionSetData: "questionSetData", playerInstance: "playerInstance" }, features: [i0.ɵɵNgOnChangesFeature], decls: 7, vars: 8, consts: [["controls", "", "crossorigin", "anonymous", 1, "video-js", 3, "loadeddata"], ["target", ""], ["kind", "captions", 3, "default", "src", "srclang", "label", 4, "ngFor", "ngForOf"], ["controlDiv", ""], [3, "ngClass"], ["class", "player-container", 4, "ngIf"], ["kind", "captions", 3, "default", "src", "srclang", "label"], [1, "player-container"], [1, "back-ward", "hide-in-desktop", 3, "click"], ["width", "39px", "height", "49px", "viewBox", "0 0 39 49", "version", "1.1", "xmlns", "http://www.w3.org/2000/svg", 0, "xmlns", "xlink", "http://www.w3.org/1999/xlink"], ["id", "video/default-copy-2", "transform", "translate(-70.000000, -77.000000)", "fill", "#FFFFFF"], ["d", "M108.4,106.3 C108.4,116.86 99.76,125.5 89.2,125.5 C78.64,125.5 70,116.86 70,106.3 L74.8,106.3 C74.8,114.22 81.28,120.7 89.2,120.7 C97.12,120.7 103.6,114.22 103.6,106.3 C103.6,98.38 97.12,91.9 89.2,91.9 L89.2,101.5 L77.2,89.5 L89.2,77.5 L89.2,87.1 C99.76,87.1 108.4,95.74 108.4,106.3 L108.4,106.3 Z M86.4320312,113.5 L84.4,113.5 L84.4,105.667187 L81.9742187,106.419531 L81.9742187,104.767187 L86.2140625,103.248437 L86.4320312,103.248437 L86.4320312,113.5 Z M96.6484375,109.267188 C96.6484375,110.68282 96.3554717,111.765621 95.7695312,112.515625 C95.1835908,113.265629 94.3257869,113.640625 93.1960937,113.640625 C92.0804632,113.640625 91.2273467,113.27266 90.6367187,112.536719 C90.0460908,111.800778 89.7437501,110.746101 89.7296875,109.372656 L89.7296875,107.488281 C89.7296875,106.058587 90.0261689,104.973441 90.6191406,104.232812 C91.2121123,103.492184 92.0664007,103.121875 93.1820312,103.121875 C94.2976618,103.121875 95.1507783,103.488668 95.7414062,104.222266 C96.3320342,104.955863 96.6343749,106.009368 96.6484375,107.382812 L96.6484375,109.267188 Z M94.6164062,107.2 C94.6164062,106.351558 94.5003918,105.733986 94.2683594,105.347266 C94.036327,104.960545 93.6742212,104.767188 93.1820312,104.767188 C92.7039039,104.767188 92.351173,104.95117 92.1238281,105.319141 C91.8964832,105.687111 91.7757813,106.262496 91.7617187,107.045312 L91.7617187,109.534375 C91.7617187,110.368754 91.8753895,110.98867 92.1027344,111.394141 C92.3300793,111.799611 92.6945287,112.002344 93.1960937,112.002344 C93.6929712,112.002344 94.0515614,111.807814 94.271875,111.41875 C94.4921886,111.029686 94.6070312,110.434379 94.6164062,109.632812 L94.6164062,107.2 Z", "id", "Shape-Copy"], [1, "pause-play"], ["class", "pause", 3, "click", 4, "ngIf"], ["class", "play", 3, "click", 4, "ngIf"], [1, "forward", "hide-in-desktop", 3, "click"], ["id", "video/default-copy-2", "transform", "translate(-251.000000, -77.000000)", "fill", "#FFFFFF"], ["d", "M251.4,106.3 C251.4,116.86 260.04,125.5 270.6,125.5 C281.16,125.5 289.8,116.86 289.8,106.3 L285,106.3 C285,114.22 278.52,120.7 270.6,120.7 C262.68,120.7 256.2,114.22 256.2,106.3 C256.2,98.38 262.68,91.9 270.6,91.9 L270.6,101.5 L282.6,89.5 L270.6,77.5 L270.6,87.1 C260.04,87.1 251.4,95.74 251.4,106.3 L251.4,106.3 Z M267.832031,113.5 L265.8,113.5 L265.8,105.667187 L263.374219,106.419531 L263.374219,104.767187 L267.614062,103.248437 L267.832031,103.248437 L267.832031,113.5 Z M278.048438,109.267188 C278.048438,110.68282 277.755472,111.765621 277.169531,112.515625 C276.583591,113.265629 275.725787,113.640625 274.596094,113.640625 C273.480463,113.640625 272.627347,113.27266 272.036719,112.536719 C271.446091,111.800778 271.14375,110.746101 271.129687,109.372656 L271.129687,107.488281 C271.129687,106.058587 271.426169,104.973441 272.019141,104.232812 C272.612112,103.492184 273.466401,103.121875 274.582031,103.121875 C275.697662,103.121875 276.550778,103.488668 277.141406,104.222266 C277.732034,104.955863 278.034375,106.009368 278.048438,107.382812 L278.048438,109.267188 Z M276.016406,107.2 C276.016406,106.351558 275.900392,105.733986 275.668359,105.347266 C275.436327,104.960545 275.074221,104.767188 274.582031,104.767188 C274.103904,104.767188 273.751173,104.95117 273.523828,105.319141 C273.296483,105.687111 273.175781,106.262496 273.161719,107.045312 L273.161719,109.534375 C273.161719,110.368754 273.275389,110.98867 273.502734,111.394141 C273.730079,111.799611 274.094529,112.002344 274.596094,112.002344 C275.092971,112.002344 275.451561,111.807814 275.671875,111.41875 C275.892189,111.029686 276.007031,110.434379 276.016406,109.632812 L276.016406,107.2 Z", "id", "Shape"], [1, "pause", 3, "click"], ["width", "48px", "height", "48px", "viewBox", "0 0 48 48", "version", "1.1", "xmlns", "http://www.w3.org/2000/svg", 0, "xmlns", "xlink", "http://www.w3.org/1999/xlink"], ["id", "video/default-copy-2", "transform", "translate(-156.000000, -77.000000)", "fill", "#FFFFFF"], ["d", "M180.4,77.5 C167.152,77.5 156.4,88.252 156.4,101.5 C156.4,114.748 167.152,125.5 180.4,125.5 C193.648,125.5 204.4,114.748 204.4,101.5 C204.4,88.252 193.648,77.5 180.4,77.5 L180.4,77.5 Z M178,111.1 L173.2,111.1 L173.2,91.9 L178,91.9 L178,111.1 L178,111.1 Z M187.6,111.1 L182.8,111.1 L182.8,91.9 L187.6,91.9 L187.6,111.1 L187.6,111.1 Z", "id", "Shape"], [1, "play", 3, "click"], ["id", "video/default-copy", "transform", "translate(-296.000000, -156.000000)", "fill", "#FFFFFF"], ["d", "M320,156 C306.752,156 296,166.752 296,180 C296,193.248 306.752,204 320,204 C333.248,204 344,193.248 344,180 C344,166.752 333.248,156 320,156 L320,156 Z M315.2,190.8 L315.2,169.2 L329.6,180 L315.2,190.8 L315.2,190.8 Z", "id", "Shape"]], template: function VideoPlayerComponent_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "video", 0, 1);
i0.ɵɵlistener("loadeddata", function VideoPlayerComponent_Template_video_loadeddata_0_listener($event) { return ctx.onLoadMetadata($event); });
i0.ɵɵtemplate(2, VideoPlayerComponent_track_2_Template, 1, 4, "track", 2);
i0.ɵɵelementEnd();
i0.ɵɵelementStart(3, "div", null, 3)(5, "div", 4);
i0.ɵɵtemplate(6, VideoPlayerComponent_div_6_Template, 12, 6, "div", 5);
i0.ɵɵelementEnd()();
} if (rf & 2) {
i0.ɵɵattribute("disablePictureInPicture", ctx.disablePictureInPicture)("playsinline", ctx.playsinline)("disableRemotePlayback", ctx.disableRemotePlayback);
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngForOf", ctx.transcripts);
i0.ɵɵadvance(3);
i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(6, _c2, ctx.currentPlayerState === "pause" || ctx.showControls));
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx.currentPlayerState === "pause" || ctx.showControls);
} }, dependencies: [i4.NgClass, i4.NgForOf, i4.NgIf], styles: [".video-js{width:100%;height:100%}.video-player{width:100%}.video-js .vjs-duration{display:block}.video-js .vjs-big-play-button{display:none}.video-js .vjs-control-bar{z-index:3;font-size:12px;background:rgba(0,0,0,.75)}@media (min-width: 1600px){.video-js .vjs-control-bar{font-size:16px}}.video-js .vjs-slider{background:#7b7b7b}.video-js .vjs-load-progress{background:#797979}.video-js .vjs-load-progress div{background:#a09f9f}.video-js .vjs-progress-holder,.video-js .vjs-progress-holder .vjs-load-progress,.video-js .vjs-progress-holder .vjs-load-progress div,.video-js .vjs-progress-holder .vjs-play-progress{border-radius:.2em}.vjs-menu-button-popup .vjs-menu .vjs-menu-content{background-color:#000000b8}.js-focus-visible .vjs-menu li.vjs-selected:hover,.vjs-menu li.vjs-selected,.vjs-menu li.vjs-selected:focus,.vjs-menu li.vjs-selected:hover{background-color:#d8d8d833;color:var(--white)}.video-js .vjs-play-progress:before{top:-.3em}.vjs-playback-rate .vjs-playback-rate-value{line-height:2.75}.vjs-menu li,.vjs-playback-rate .vjs-playback-rate-value{font-size:1.1em}@media screen and (min-width: 768px){.video-js .vjs-tech{pointer-events:none}.hide-in-desktop{visibility:hidden!important}}@media (hover: hover){.hide-in-desktop{visibility:hidden!important}}@media (pointer: fine){.hide-in-desktop{visibility:hidden!important}}.player-for-back-ward-controls{display:flex;align-items:center;justify-content:center;position:absolute;width:100%;height:100%;inset:0;z-index:2}.player-for-back-ward-controls .player-container{display:flex;align-items:center}.player-for-back-ward-controls .player-container .back-ward,.player-for-back-ward-controls .player-container .pause-play,.player-for-back-ward-controls .player-container .forward{width:2.5rem;height:2.5rem;padding:.5rem;transition:all .3s ease-in-out;box-sizing:content-box;display:flex;align-items:center;justify-content:center;background:rgba(var(--rc-rgba-black),.5);border-radius:50%;transform:scale(1)}@media (min-width: 768px){.player-for-back-ward-controls .player-container .back-ward:hover,.player-for-back-ward-controls .player-container .pause-play:hover,.player-for-back-ward-controls .player-container .forward:hover{background:rgba(var(--rc-rgba-black),1);border-radius:100%;transform:scale(1.25);cursor:pointer}.player-for-back-ward-controls .player-container .back-ward:hover svg g,.player-for-back-ward-controls .player-container .pause-play:hover svg g,.player-for-back-ward-controls .player-container .forward:hover svg g{fill:var(--primary-theme)}}.player-for-back-ward-controls .player-container .back-ward.touched,.player-for-back-ward-controls .player-container .pause-play.touched,.player-for-back-ward-controls .player-container .forward.touched{animation:scaling 2s;transform:scale(1)}@keyframes scaling{0%{transform:scale(1)}50%{transform:scale(1.25)}to{transform:scale(1)}}.player-for-back-ward-controls .player-container .back-ward.touched svg g,.player-for-back-ward-controls .player-container .pause-play.touched svg g,.player-for-back-ward-controls .player-container .forward.touched svg g{animation:scalingColor 2s;fill:var(--white)}@keyframes scalingColor{0%{fill:var(--white)}50%{fill:var(--primary-theme)}to{fill:var(--white)}}.player-for-back-ward-controls .player-container .back-ward.touchout,.player-for-back-ward-controls .player-container .pause-play.touchout,.player-for-back-ward-controls .player-container .forward.touchout{animation:scaling2 2s;transform:scale(1)}@keyframes scaling2{0%{transform:scale(1)}50%{transform:scale(1.25)}to{transform:scale(1)}}.player-for-back-ward-controls .player-container .back-ward.touchout svg g,.player-for-back-ward-controls .player-container .pause-play.touchout svg g,.player-for-back-ward-controls .player-container .forward.touchout svg g{animation:scalingColor2 2s;fill:var(--white)}@keyframes scalingColor2{0%{fill:var(--white)}50%{fill:var(--primary-theme)}to{fill:var(--white)}}.player-for-back-ward-controls .player-container .back-ward svg,.player-for-back-ward-controls .player-container .pause-play svg,.player-for-back-ward-controls .player-container .forward svg{width:100%}.player-for-back-ward-controls .player-container .pause-play{margin:0px 1.5rem}.player-for-back-ward-controls .player-container .pause-play .pause,.player-for-back-ward-controls .player-container .pause-play .play{display:flex;align-items:center}div[data-marker-key]{margin-left:.7%!important}.vjs-texttrack-settings{display:none}\n"], encapsulation: 2 });
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(VideoPlayerComponent, [{
type: Component,
args: [{ selector: 'video-player', encapsulation: ViewEncapsulation.None, template: "<video #target class=\"video-js\" controls [attr.disablePictureInPicture]=\"disablePictureInPicture\" [attr.playsinline]=\"playsinline\" [attr.disableRemotePlayback]=\"disableRemotePlayback\" crossorigin=\"anonymous\" (loadeddata)=\"onLoadMetadata($event)\">\n <track *ngFor=\"let trans of transcripts\" default=\"{{trans.default}}\" kind=\"captions\" src=\"{{trans.artifactUrl}}\" srclang=\"{{trans.languageCode}}\" label=\"{{trans.language}}\" >\n</video>\n<div #controlDiv>\n <div [ngClass]=\"{'player-for-back-ward-controls': currentPlayerState === 'pause' || showControls }\">\n <div class=\"player-container\" *ngIf=\"currentPlayerState === 'pause' || showControls\">\n <div class=\"back-ward hide-in-desktop\" [style.visibility]=\"showBackwardButton ? 'visible' : 'hidden'\" (click)=\"backward()\">\n <svg width=\"39px\" height=\"49px\" viewBox=\"0 0 39 49\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n <g id=\"video/default-copy-2\" transform=\"translate(-70.000000, -77.000000)\" fill=\"#FFFFFF\">\n <path\n d=\"M108.4,106.3 C108.4,116.86 99.76,125.5 89.2,125.5 C78.64,125.5 70,116.86 70,106.3 L74.8,106.3 C74.8,114.22 81.28,120.7 89.2,120.7 C97.12,120.7 103.6,114.22 103.6,106.3 C103.6,98.38 97.12,91.9 89.2,91.9 L89.2,101.5 L77.2,89.5 L89.2,77.5 L89.2,87.1 C99.76,87.1 108.4,95.74 108.4,106.3 L108.4,106.3 Z M86.4320312,113.5 L84.4,113.5 L84.4,105.667187 L81.9742187,106.419531 L81.9742187,104.767187 L86.2140625,103.248437 L86.4320312,103.248437 L86.4320312,113.5 Z M96.6484375,109.267188 C96.6484375,110.68282 96.3554717,111.765621 95.7695312,112.515625 C95.1835908,113.265629 94.3257869,113.640625 93.1960937,113.640625 C92.0804632,113.640625 91.2273467,113.27266 90.6367187,112.536719 C90.0460908,111.800778 89.7437501,110.746101 89.7296875,109.372656 L89.7296875,107.488281 C89.7296875,106.058587 90.0261689,104.973441 90.6191406,104.232812 C91.2121123,103.492184 92.0664007,103.121875 93.1820312,103.121875 C94.2976618,103.121875 95.1507783,103.488668 95.7414062,104.222266 C96.3320342,104.955863 96.6343749,106.009368 96.6484375,107.382812 L96.6484375,109.267188 Z M94.6164062,107.2 C94.6164062,106.351558 94.5003918,105.733986 94.2683594,105.347266 C94.036327,104.960545 93.6742212,104.767188 93.1820312,104.767188 C92.7039039,104.767188 92.351173,104.95117 92.1238281,105.319141 C91.8964832,105.687111 91.7757813,106.262496 91.7617187,107.045312 L91.7617187,109.534375 C91.7617187,110.368754 91.8753895,110.98867 92.1027344,111.394141 C92.3300793,111.799611 92.6945287,112.002344 93.1960937,112.002344 C93.6929712,112.002344 94.0515614,111.807814 94.271875,111.41875 C94.4921886,111.029686 94.6070312,110.434379 94.6164062,109.632812 L94.6164062,107.2 Z\"\n id=\"Shape-Copy\"></path>\n </g>\n </svg>\n </div>\n <div class=\"pause-play\">\n <span class=\"pause\" *ngIf=\"showPauseButton\" (click)=\"pause()\">\n <svg width=\"48px\" height=\"48px\" viewBox=\"0 0 48 48\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n <g id=\"video/default-copy-2\" transform=\"translate(-156.000000, -77.000000)\" fill=\"#FFFFFF\">\n <path\n d=\"M180.4,77.5 C167.152,77.5 156.4,88.252 156.4,101.5 C156.4,114.748 167.152,125.5 180.4,125.5 C193.648,125.5 204.4,114.748 204.4,101.5 C204.4,88.252 193.648,77.5 180.4,77.5 L180.4,77.5 Z M178,111.1 L173.2,111.1 L173.2,91.9 L178,91.9 L178,111.1 L178,111.1 Z M187.6,111.1 L182.8,111.1 L182.8,91.9 L187.6,91.9 L187.6,111.1 L187.6,111.1 Z\"\n id=\"Shape\"></path>\n </g>\n </svg>\n </span>\n <span class=\"play\" *ngIf=\"showPlayButton\" (click)=\"play()\">\n <svg width=\"48px\" height=\"48px\" viewBox=\"0 0 48 48\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n <g id=\"video/default-copy\" transform=\"translate(-296.000000, -156.000000)\" fill=\"#FFFFFF\">\n <path\n d=\"M320,156 C306.752,156 296,166.752 296,180 C296,193.248 306.752,204 320,204 C333.248,204 344,193.248 344,180 C344,166.752 333.248,156 320,156 L320,156 Z M315.2,190.8 L315.2,169.2 L329.6,180 L315.2,190.8 L315.2,190.8 Z\"\n id=\"Shape\"></path>\n </g>\n </svg>\n </span>\n </div>\n <div class=\"forward hide-in-desktop\" [style.visibility]=\"showForwardButton ? 'visible' : 'hidden'\" (click)=\"forward()\">\n <svg width=\"39px\" height=\"49px\" viewBox=\"0 0 39 49\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n <g id=\"video/default-copy-2\" transform=\"translate(-251.000000, -77.000000)\" fill=\"#FFFFFF\">\n <path\n d=\"M251.4,106.3 C251.4,116.86 260.04,125.5 270.6,125.5 C281.16,125.5 289.8,116.86 289.8,106.3 L285,106.3 C285,114.22 278.52,120.7 270.6,120.7 C262.68,120.7 256.2,114.22 256.2,106.3 C256.2,98.38 262.68,91.9 270.6,91.9 L270.6,101.5 L282.6,89.5 L270.6,77.5 L270.6,87.1 C260.04,87.1 251.4,95.74 251.4,106.3 L251.4,106.3 Z M267.832031,113.5 L265.8,113.5 L265.8,105.667187 L263.374219,106.419531 L263.374219,104.767187 L267.614062,103.248437 L267.832031,103.248437 L267.832031,113.5 Z M278.048438,109.267188 C278.048438,110.68282 277.755472,111.765621 277.169531,112.515625 C276.583591,113.265629 275.725787,113.640625 274.596094,113.640625 C273.480463,113.640625 272.627347,113.27266 272.036719,112.536719 C271.446091,111.800778 271.14375,110.746101 271.129687,109.372656 L271.129687,107.488281 C271.129687,106.058587 271.426169,104.973441 272.019141,104.232812 C272.612112,103.492184 273.466401,103.121875 274.582031,103.121875 C275.697662,103.121875 276.550778,103.488668 277.141406,104.222266 C277.732034,104.955863 278.034375,106.009368 278.048438,107.382812 L278.048438,109.267188 Z M276.016406,107.2 C276.016406,106.351558 275.900392,105.733986 275.668359,105.347266 C275.436327,104.960545 275.074221,104.767188 274.582031,104.767188 C274.103904,104.767188 273.751173,104.95117 273.523828,105.319141 C273.296483,105.687111 273.175781,106.262496 273.161719,107.045312 L273.161719,109.534375 C273.161719,110.368754 273.275389,110.98867 273.502734,111.394141 C273.730079,111.799611 274.094529,112.002344 274.596094,112.002344 C275.092971,112.002344 275.451561,111.807814 275.671875,111.41875 C275.892189,111.029686 276.007031,110.434379 276.016406,109.632812 L276.016406,107.2 Z\"\n id=\"Shape\"></path>\n </g>\n </svg>\n </div>\n </div>\n </div>\n\n\n</div>", styles: [".video-js{width:100%;height:100%}.video-player{width:100%}.video-js .vjs-duration{display:block}.video-js .vjs-big-play-button{display:none}.video-js .vjs-control-bar{z-index:3;font-size:12px;background:rgba(0,0,0,.75)}@media (min-width: 1600px){.video-js .vjs-control-bar{font-size:16px}}.video-js .vjs-slider{background:#7b7b7b}.video-js .vjs-load-progress{background:#797979}.video-js .vjs-load-progress div{background:#a09f9f}.video-js .vjs-progress-holder,.video-js .vjs-progress-holder .vjs-load-progress,.video-js .vjs-progress-holder .vjs-load-progress div,.video-js .vjs-progress-holder .vjs-play-progress{border-radius:.2em}.vjs-menu-button-popup .vjs-menu .vjs-menu-content{background-color:#000000b8}.js-focus-visible .vjs-menu li.vjs-selected:hover,.vjs-menu li.vjs-selected,.vjs-menu li.vjs-selected:focus,.vjs-menu li.vjs-selected:hover{background-color:#d8d8d833;color:var(--white)}.video-js .vjs-play-progress:before{top:-.3em}.vjs-playback-rate .vjs-playback-rate-value{line-height:2.75}.vjs-menu li,.vjs-playback-rate .vjs-playback-rate-value{font-size:1.1em}@media screen and (min-width: 768px){.video-js .vjs-tech{pointer-events:none}.hide-in-desktop{visibility:hidden!important}}@media (hover: hover){.hide-in-desktop{visibility:hidden!important}}@media (pointer: fine){.hide-in-desktop{visibility:hidden!important}}.player-for-back-ward-controls{display:flex;align-items:center;justify-content:center;position:absolute;width:100%;height:100%;inset:0;z-index:2}.player-for-back-ward-controls .player-container{display:flex;align-items:center}.player-for-back-ward-controls .player-container .back-ward,.player-for-back-ward-controls .player-container .pause-play,.player-for-back-ward-controls .player-container .forward{width:2.5rem;height:2.5rem;padding:.5rem;transition:all .3s ease-in-out;box-sizing:content-box;display:flex;align-items:center;justify-content:center;background:rgba(var(--rc-rgba-black),.5);border-radius:50%;transform:scale(1)}@media (min-width: 768px){.player-for-back-ward-controls .player-container .back-ward:hover,.player-for-back-ward-controls .player-container .pause-play:hover,.player-for-back-ward-controls .player-container .forward:hover{background:rgba(var(--rc-rgba-black),1);border-radius:100%;transform:scale(1.25);cursor:pointer}.player-for-back-ward-controls .player-container .back-ward:hover svg g,.player-for-back-ward-controls .player-container .pause-play:hover svg g,.player-for-back-ward-controls .player-container .forward:hover svg g{fill:var(--primary-theme)}}.player-for-back-ward-controls .player-container .back-ward.touched,.player-for-back-ward-controls .player-container .pause-play.touched,.player-for-back-ward-controls .player-container .forward.touched{animation:scaling 2s;transform:scale(1)}@keyframes scaling{0%{transform:scale(1)}50%{transform:scale(1.25)}to{transform:scale(1)}}.player-for-back-ward-controls .player-container .back-ward.touched svg g,.player-for-back-ward-controls .player-container .pause-play.touched svg g,.player-for-back-ward-controls .player-container .forward.touched svg g{animation:scalingColor 2s;fill:var(--white)}@keyframes scalingColor{0%{fill:var(--white)}50%{fill:var(--primary-theme)}to{fill:var(--white)}}.player-for-back-ward-controls .player-container .back-ward.touchout,.player-for-back-ward-controls .player-container .pause-play.touchout,.player-for-back-ward-controls .player-container .forward.touchout{animation:scaling2 2s;transform:scale(1)}@keyframes scaling2{0%{transform:scale(1)}50%{transform:scale(1.25)}to{transform:scale(1)}}.player-for-back-ward-controls .player-container .back-ward.touchout svg g,.player-for-back-ward-controls .player-container .pause-play.touchout svg g,.player-for-back-ward-controls .player-container .forward.touchout svg g{animation:scalingColor2 2s;fill:var(--white)}@keyframes scalingColor2{0%{fill:var(--white)}50%{fill:var(--primary-theme)}to{fill:var(--white)}}.player-for-back-ward-controls .player-container .back-ward svg,.player-for-back-ward-controls .player-container .pause-play svg,.player-for-back-ward-controls .player-container .forward svg{width:100%}.player-for-back-ward-controls .player-container .pause-play{margin:0px 1.5rem}.player-for-back-ward-controls .player-container .pause-play .pause,.player-for-back-ward-controls .player-container .pause-play .play{display:flex;align-items:center}div[data-marker-key]{margin-left:.7%!important}.vjs-texttrack-settings{display:none}\n"] }]
}], function () { return [{ type: i1.ViewerService }, { type: i0.Renderer2 }, { type: i2.QuestionCursor, decorators: [{
type: Optional
}] }, { type: i3.HttpClient }, { type: i0.ChangeDetectorRef }]; }, { config: [{
type: Input
}], action: [{
type: Input
}], questionSetData: [{
type: Output
}], playerInstance: [{
type: Output
}], target: [{
type: ViewChild,
args: ['target', { static: true }]
}], controlDiv: [{
type: ViewChild,
args: ['controlDiv', { static: true }]
}] }); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlkZW8tcGxheWVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N1bmJpcmQtdmlkZW8tcGxheWVyL3NyYy9saWIvY29tcG9uZW50cy92aWRlby1wbGF5ZXIvdmlkZW8tcGxheWVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N1bmJpcmQtdmlkZW8tcGxheWVyL3NyYy9saWIvY29tcG9uZW50cy92aWRlby1wbGF5ZXIvdmlkZW8tcGxheWVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBaUIsU0FBUyxFQUFjLFlBQVksRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUN2RSxTQUFTLEVBQUUsaUJBQWlCLEVBQVUsUUFBUSxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUV2RyxPQUFPLEtBQUssQ0FBQyxNQUFNLFdBQVcsQ0FBQztBQUMvQixPQUFPLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8seUJBQXlCLE1BQU0sOEJBQThCLENBQUM7Ozs7Ozs7OztJQ0xuRSwyQkFBOEs7OztJQUFySSxxREFBMkI7SUFBaUIsdUVBQTJCO0lBQUMsMERBQWdDO0lBQUMsb0RBQTBCOzs7O0lBZ0J0SyxnQ0FBOEQ7SUFBbEIsdUtBQVMsZUFBQSxjQUFPLENBQUEsSUFBQztJQUMzRCxtQkFDNkM7SUFEN0MsK0JBQzZDLFlBQUE7SUFFekMsMkJBRW9CO0lBQ3RCLGlCQUFJLEVBQUEsRUFBQTs7OztJQUdSLGdDQUEyRDtJQUFqQix3S0FBUyxlQUFBLGFBQU0sQ0FBQSxJQUFDO0lBQ3hELG1CQUM2QztJQUQ3QywrQkFDNkMsWUFBQTtJQUV6QywyQkFFb0I7SUFDdEIsaUJBQUksRUFBQSxFQUFBOzs7O0lBN0JaLDhCQUFxRixhQUFBO0lBQ21CLGdLQUFTLGVBQUEsa0JBQVUsQ0FBQSxJQUFDO0lBQ3hILG1CQUM2QztJQUQ3Qyw4QkFDNkMsWUFB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