@tekdi/sunbird-quml-player
Version:
The QuML player library components are 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 d
121 lines • 19.1 kB
JavaScript
import { Injectable } from '@angular/core';
import * as _ from 'lodash-es';
import { DEFAULT_SCORE } from './player-constants';
import * as i0 from "@angular/core";
export class UtilService {
uniqueId(length = 32) {
let result = '';
const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
const charactersLength = characters.length;
for (let i = 0; i < length; i++) {
result += characters.charAt(Math.floor(Math.random() * charactersLength));
}
return result;
}
getTimeSpentText(pdfPlayerStartTime) {
const duration = new Date().getTime() - pdfPlayerStartTime;
const minutes = Math.floor(duration / 60000);
const seconds = Number(((duration % 60000) / 1000).toFixed(0));
return (minutes + ':' + (seconds < 10 ? '0' : '') + seconds);
}
getKeyValue(keys) {
let key = keys.find((k) => {
return k.includes('response');
});
return key;
}
getMultiselectScore(options, responseDeclaration, isShuffleQuestions, outcomeDeclaration) {
let key = this.getKeyValue(Object.keys(responseDeclaration));
const selectedOptionValue = options.map(option => option.value);
let score;
let mapping = responseDeclaration[key]['mapping'];
if (isShuffleQuestions) {
score = DEFAULT_SCORE;
const scoreForEachMapping = _.round(1 / mapping.length, 2);
_.forEach(mapping, (map) => {
map.score = scoreForEachMapping;
});
}
else {
score = _.get(outcomeDeclaration, 'maxScore.defaultValue');
}
let correctValues = responseDeclaration[key].correctResponse.value.map((ele) => Number(ele));
if (_.isEqual(correctValues.sort(), selectedOptionValue.sort())) {
return score;
}
else if (!_.isEqual(correctValues.sort(), selectedOptionValue.sort())) {
let sum = 0;
_.forEach(mapping, (map, index) => {
if (_.includes(selectedOptionValue, map.value)) {
sum += (map?.score ? map.score : 0);
}
});
return sum;
}
}
hasDuplicates(selectedOptions, option) {
let duplicate = selectedOptions.find((o) => { return o.value === option.value; });
return duplicate;
}
getQuestionType(questions, currentIndex) {
let index = currentIndex - 1 === -1 ? 0 : currentIndex - 1;
return questions[index]['qType'];
}
canGo(progressBarClass) {
let attemptedParams = ['correct', 'wrong', 'attempted'];
return attemptedParams.includes(progressBarClass);
}
sumObjectsByKey(...objects) {
return objects.reduce((accumulator, currentValue) => {
for (const key in currentValue) {
/* istanbul ignore else */
if (currentValue.hasOwnProperty(key)) {
accumulator[key] = (accumulator[key] || 0) + currentValue[key];
}
}
return accumulator;
}, {});
}
scrollParentToChild(parent, child) {
const isMobilePortrait = window.matchMedia("(max-width: 480px)").matches;
const parentRect = parent.getBoundingClientRect();
const childRect = child.getBoundingClientRect();
if (isMobilePortrait) {
parent.scrollLeft = childRect.left + parent.scrollLeft - parentRect.left;
}
else {
parent.scrollTop = (childRect.top + parent.scrollTop) - parentRect.top;
}
}
// fetches the element using its tag video and sets the value of the “src” attribute of source element and poster attribute.
updateSourceOfVideoElement(baseUrl, media, identifier) {
const elements = Array.from(document.getElementsByTagName('video'));
_.forEach(elements, (element) => {
const videoId = element.getAttribute('data-asset-variable');
if (!videoId) {
return;
}
const asset = _.filter(media, ['id', videoId]);
const posterSrc = element.getAttribute('poster');
if (!_.isEmpty(asset) && posterSrc) {
element['poster'] = baseUrl ? `${baseUrl}/${identifier}/${posterSrc}` : asset[0].baseUrl + posterSrc;
}
if (!_.isEmpty(asset)) {
const sourceElement = Array.from(element.getElementsByTagName('source'));
_.forEach(sourceElement, (element) => {
const sourceSrc = element.getAttribute('src');
element['src'] = baseUrl ? `${baseUrl}/${identifier}/${sourceSrc}` : asset[0].baseUrl + sourceSrc;
});
}
});
}
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: UtilService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
/** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: UtilService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: UtilService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvcXVtbC1saWJyYXJ5L3NyYy9saWIvdXRpbC1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxLQUFLLENBQUMsTUFBTSxXQUFXLENBQUM7QUFDL0IsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG9CQUFvQixDQUFBOztBQUtsRCxNQUFNLE9BQU8sV0FBVztJQUViLFFBQVEsQ0FBQyxNQUFNLEdBQUcsRUFBRTtRQUN2QixJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDaEIsTUFBTSxVQUFVLEdBQUcsZ0VBQWdFLENBQUM7UUFDcEYsTUFBTSxnQkFBZ0IsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDO1FBQzNDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDN0IsTUFBTSxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1NBQzdFO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVNLGdCQUFnQixDQUFDLGtCQUFrQjtRQUN0QyxNQUFNLFFBQVEsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHLGtCQUFrQixDQUFDO1FBQzNELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxDQUFDO1FBQzdDLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FB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WUFFRCxJQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDbEIsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUE4QixDQUFDLENBQUM7Z0JBQ3RHLENBQUMsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUMsT0FBb0IsRUFBRSxFQUFFO29CQUM5QyxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUM5QyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sSUFBSSxVQUFVLElBQUksU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDO2dCQUN0RyxDQUFDLENBQUMsQ0FBQzthQUNOO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO2tJQW5IUSxXQUFXO3NJQUFYLFdBQVcsY0FGUixNQUFNOzs0RkFFVCxXQUFXO2tCQUh2QixVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IERFRkFVTFRfU0NPUkUgfSBmcm9tICcuL3BsYXllci1jb25zdGFudHMnXG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgVXRpbFNlcnZpY2Uge1xuXG4gICAgcHVibGljIHVuaXF1ZUlkKGxlbmd0aCA9IDMyKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSAnJztcbiAgICAgICAgY29uc3QgY2hhcmFjdGVycyA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSc7XG4gICAgICAgIGNvbnN0IGNoYXJhY3RlcnNMZW5ndGggPSBjaGFyYWN0ZXJzLmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcmVzdWx0ICs9IGNoYXJhY3RlcnMuY2hhckF0KE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGNoYXJhY3RlcnNMZW5ndGgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRUaW1lU3BlbnRUZXh0KHBkZlBsYXllclN0YXJ0VGltZSkge1xuICAgICAgICBjb25zdCBkdXJhdGlvbiA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gcGRmUGxheWVyU3RhcnRUaW1lO1xuICAgICAgICBjb25zdCBtaW51dGVzID0gTWF0aC5mbG9vcihkdXJhdGlvbiAvIDYwMDAwKTtcbiAgICAgICAgY29uc3Qgc2Vjb25kcyA9IE51bWJlcigoKGR1cmF0aW9uICUgNjAwMDApIC8gMTAwMCkudG9GaXhlZCgwKSk7XG4gICAgICAgIHJldHVybiAobWludXRlcyArICc6JyArIChzZWNvbmRzIDwgMTAgPyAnMCcgOiAnJykgKyBzZWNvbmRzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0S2V5VmFsdWUoa2V5cykge1xuICAgICAgICBsZXQga2V5ID0ga2V5cy5maW5kKChrKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gay5pbmNsdWRlcygncmVzcG9uc2UnKTtcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TXVsdGlzZWxlY3RTY29yZShvcHRpb25zLCByZXNwb25zZURlY2xhcmF0aW9uLCBpc1NodWZmbGVRdWVzdGlvbnMsIG91dGNvbWVEZWNsYXJhdGlvbikge1xuICAgICAgICBsZXQga2V5OiBhbnkgPSB0aGlzLmdldEtleVZhbHVlKE9iamVjdC5rZXlzKHJlc3BvbnNlRGVjbGFyYXRpb24pKTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRPcHRpb25WYWx1ZSA9IG9wdGlvbnMubWFwKG9wdGlvbiA9PiBvcHRpb24udmFsdWUpO1xuICAgICAgICBsZXQgc2NvcmU7XG4gICAgICAgIGxldCBtYXBwaW5nID0gcmVzcG9uc2VEZWNsYXJhdGlvbltrZXldWydtYXBwaW5nJ107XG4gICAgICAgIGlmIChpc1NodWZmbGVRdWVzdGlvbnMpIHtcbiAgICAgICAgICAgIHNjb3JlID0gREVGQVVMVF9TQ09SRTtcbiAgICAgICAgICAgIGNvbnN0IHNjb3JlRm9yRWFjaE1hcHBpbmcgPSBfLnJvdW5kKDEvbWFwcGluZy5sZW5ndGgsIDIpO1xuICAgICAgICAgICAgXy5mb3JFYWNoKG1hcHBpbmcsIChtYXApID0+IHtcbiAgICAgICAgICAgICAgICBtYXAuc2NvcmUgPSBzY29yZUZvckVhY2hNYXBwaW5nO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNjb3JlID0gXy5nZXQob3V0Y29tZURlY2xhcmF0aW9uLCAnbWF4U2NvcmUuZGVmYXVsdFZhbHVlJyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNvcnJlY3RWYWx1ZXMgPSByZXNwb25zZURlY2xhcmF0aW9uW2tleV0uY29ycmVjdFJlc3BvbnNlLnZhbHVlLm1hcCgoZWxlKSA9PiBOdW1iZXIoZWxlKSk7XG4gICAgICAgIGlmIChfLmlzRXF1YWwoY29ycmVjdFZhbHVlcy5zb3J0KCksIHNlbGVjdGVkT3B0aW9uVmFsdWUuc29ydCgpKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4gc2NvcmU7XG4gICAgICAgIH0gZWxzZSBpZiAoIV8uaXNFcXVhbChjb3JyZWN0VmFsdWVzLnNvcnQoKSwgc2VsZWN0ZWRPcHRpb25WYWx1ZS5zb3J0KCkpKSB7XG4gICAgICAgICAgICBsZXQgc3VtID0gMDtcbiAgICAgICAgICAgIF8uZm9yRWFjaChtYXBwaW5nLCAobWFwLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmKF8uaW5jbHVkZXMoc2VsZWN0ZWRPcHRpb25WYWx1ZSwgbWFwLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBzdW0gKz0gKG1hcD8uc2NvcmUgPyBtYXAuc2NvcmUgOiAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBzdW07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBoYXNEdXBsaWNhdGVzKHNlbGVjdGVkT3B0aW9ucywgb3B0aW9uKSB7XG4gICAgICAgIGxldCBkdXBsaWNhdGUgPSBzZWxlY3RlZE9wdGlvbnMuZmluZCgobykgPT4geyByZXR1cm4gby52YWx1ZSA9PT0gb3B0aW9uLnZhbHVlIH0pO1xuICAgICAgICByZXR1cm4gZHVwbGljYXRlO1xuICAgIH1cblxuICAgIGdldFF1ZXN0aW9uVHlwZShxdWVzdGlvbnMsIGN1cnJlbnRJbmRleCkge1xuICAgICAgICBsZXQgaW5kZXggPSBjdXJyZW50SW5kZXggLSAxID09PSAtMSA/IDAgOiBjdXJyZW50SW5kZXggLSAxO1xuICAgICAgICByZXR1cm4gcXVlc3Rpb25zW2luZGV4XVsncVR5cGUnXTtcblxuICAgIH1cblxuICAgIGNhbkdvKHByb2dyZXNzQmFyQ2xhc3MpIHtcbiAgICAgICAgbGV0IGF0dGVtcHRlZFBhcmFtcyA9IFsnY29ycmVjdCcsICd3cm9uZycsICdhdHRlbXB0ZWQnXTtcbiAgICAgICAgcmV0dXJuIGF0dGVtcHRlZFBhcmFtcy5pbmNsdWRlcyhwcm9ncmVzc0JhckNsYXNzKTtcbiAgICB9XG5cbiAgICBzdW1PYmplY3RzQnlLZXkoLi4ub2JqZWN0cykge1xuICAgICAgICByZXR1cm4gb2JqZWN0cy5yZWR1Y2UoKGFjY3VtdWxhdG9yLCBjdXJyZW50VmFsdWUpID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIGN1cnJlbnRWYWx1ZSkge1xuICAgICAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGFjY3VtdWxhdG9yW2tleV0gPSAoYWNjdW11bGF0b3Jba2V5XSB8fCAwKSArIGN1cnJlbnRWYWx1ZVtrZXldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICAgICAgfSwge30pO1xuICAgIH1cblxuICAgIHNjcm9sbFBhcmVudFRvQ2hpbGQocGFyZW50OiBIVE1MRWxlbWVudCwgY2hpbGQ6IEhUTUxFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGlzTW9iaWxlUG9ydHJhaXQgPSB3aW5kb3cubWF0Y2hNZWRpYShcIihtYXgtd2lkdGg6IDQ4MHB4KVwiKS5tYXRjaGVzO1xuICAgICAgICBjb25zdCBwYXJlbnRSZWN0ID0gcGFyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCBjaGlsZFJlY3QgPSBjaGlsZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICBpZiAoaXNNb2JpbGVQb3J0cmFpdCkge1xuICAgICAgICAgICAgcGFyZW50LnNjcm9sbExlZnQgPSBjaGlsZFJlY3QubGVmdCArIHBhcmVudC5zY3JvbGxMZWZ0IC0gcGFyZW50UmVjdC5sZWZ0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFyZW50LnNjcm9sbFRvcCA9IChjaGlsZFJlY3QudG9wICsgcGFyZW50LnNjcm9sbFRvcCkgLSBwYXJlbnRSZWN0LnRvcDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGZldGNoZXMgdGhlIGVsZW1lbnQgdXNpbmcgaXRzIHRhZyB2aWRlbyBhbmQgc2V0cyB0aGUgdmFsdWUgb2YgdGhlIOKAnHNyY+KAnSBhdHRyaWJ1dGUgb2Ygc291cmNlIGVsZW1lbnQgYW5kIHBvc3RlciBhdHRyaWJ1dGUuXG4gICAgdXBkYXRlU291cmNlT2ZWaWRlb0VsZW1lbnQoYmFzZVVybDogc3RyaW5nLCBtZWRpYTogYW55W10sIGlkZW50aWZpZXI6IHN0cmluZykgIHtcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBBcnJheS5mcm9tKGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCd2aWRlbycpIGFzIEhUTUxDb2xsZWN0aW9uT2Y8RWxlbWVudD4pO1xuICAgICAgICBfLmZvckVhY2goZWxlbWVudHMsIChlbGVtZW50OiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmlkZW9JZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWFzc2V0LXZhcmlhYmxlJyk7XG4gICAgICAgICAgICBpZighdmlkZW9JZCkgeyByZXR1cm47IH1cbiAgICAgICAgICAgIGNvbnN0IGFzc2V0ID0gXy5maWx0ZXIobWVkaWEsIFsnaWQnLCB2aWRlb0lkXSk7XG4gICAgICAgICAgICBjb25zdCBwb3N0ZXJTcmMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgncG9zdGVyJyk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmKCFfLmlzRW1wdHkoYXNzZXQpICYmIHBvc3RlclNyYykge1xuICAgICAgICAgICAgICAgIGVsZW1lbnRbJ3Bvc3RlciddID0gYmFzZVVybCA/IGAke2Jhc2VVcmx9LyR7aWRlbnRpZmllcn0vJHtwb3N0ZXJTcmN9YCA6IGFzc2V0WzBdLmJhc2VVcmwgKyBwb3N0ZXJTcmM7XG4gICAgICAgICAgICB9ICBcblxuICAgICAgICAgICAgaWYoIV8uaXNFbXB0eShhc3NldCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VFbGVtZW50ID0gQXJyYXkuZnJvbShlbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzb3VyY2UnKSBhcyBIVE1MQ29sbGVjdGlvbk9mPEVsZW1lbnQ+KTtcbiAgICAgICAgICAgICAgICBfLmZvckVhY2goc291cmNlRWxlbWVudCwgKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZVNyYyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdzcmMnKTtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudFsnc3JjJ10gPSBiYXNlVXJsID8gYCR7YmFzZVVybH0vJHtpZGVudGlmaWVyfS8ke3NvdXJjZVNyY31gIDogYXNzZXRbMF0uYmFzZVVybCArIHNvdXJjZVNyYztcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSBcblxufVxuIl19