UNPKG

@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

287 lines 40.7 kB
import { Injectable } from '@angular/core'; import * as _ from 'lodash-es'; import { v4 as uuidv4 } from 'uuid'; import * as i0 from "@angular/core"; export class TransformationService { getTransformedHierarchy(questionsetMetadata) { let updatedMetadata = this.getTransformedQuestionSetMetadata(questionsetMetadata); if (!_.isEmpty(updatedMetadata, 'children')) { updatedMetadata.children = this.transformChildren(updatedMetadata.children); } return updatedMetadata; } getTransformedQuestionSetMetadata(data) { data = this.processMaxScoreProperty(data); data = _.omit(data, 'version'); data = this.processInstructions(data); data = this.processBloomsLevel(data); data = this.processBooleanProps(data); data = this.processTimeLimits(data); return data; } processMaxScoreProperty(data) { if (_.has(data, 'maxScore')) { const outcomeDeclaration = { maxScore: { cardinality: 'single', type: 'integer', defaultValue: data.maxScore } }; data = _.omit(data, 'maxScore'); data['outcomeDeclaration'] = outcomeDeclaration; } return data; } processInstructions(data) { if (_.has(data, 'instructions.default')) { data.instructions = data.instructions.default; } return data; } processBloomsLevel(data) { if (_.has(data, 'bloomsLevel')) { const bLevel = _.get(data, 'bloomsLevel'); _.unset(data, 'bloomsLevel'); _.set(data, 'complexityLevel', [bLevel.toString()]); } return data; } processBooleanProps(data) { const booleanProps = ["showSolutions", "showFeedback", "showHints", "showTimer"]; const getBooleanValue = (str) => str === "Yes"; _.forEach(booleanProps, (prop) => { if (_.has(data, prop)) { const propVal = data[prop]; data[prop] = getBooleanValue(propVal); } }); return data; } processTimeLimits(data) { let parsedTimeLimits; if (_.has(data, 'timeLimits') && !_.isNull(data.timeLimits)) { if (_.isString(data.timeLimits)) { parsedTimeLimits = JSON.parse(data.timeLimits); } else { parsedTimeLimits = data.timeLimits; } data.timeLimits = { questionSet: { min: 0, max: parsedTimeLimits?.maxTime ? _.toInteger(parsedTimeLimits.maxTime) : 0 } }; } return data; } transformChildren(children) { const self = this; if (!_.isEmpty(children)) { _.forEach(children, (ch) => { if (_.has(ch, 'version')) { _.unset(ch, 'version'); } ch = this.processBloomsLevel(ch); ch = this.processBooleanProps(ch); if (_.get(ch, 'mimeType').toLowerCase() === 'application/vnd.sunbird.questionset') { ch = this.processTimeLimits(ch); ch = this.processInstructions(ch); const nestedChildren = _.get(ch, 'children', []); self.transformChildren(nestedChildren); } }); } return children; } getTransformedQuestionMetadata(data) { if (_.has(data, 'questions')) { _.forEach(data.questions, (question) => { if (!_.has(question, 'qumlVersion') || question.qumlVersion != 1.1) { question = this.processResponseDeclaration(question); question = this.processInteractions(question); question = this.processSolutions(question); question = this.processInstructions(question); question = this.processHints(question); question = this.processBloomsLevel(question); question = this.processBooleanProps(question); const ans = this.getAnswer(question); if (!_.isEmpty(ans)) { _.set(question, 'answer', ans); } } }); return data; } } processResponseDeclaration(data) { let outcomeDeclaration = {}; if (_.isEqual(_.toLower(data.primaryCategory), 'subjective question')) { data = this.processSubjectiveResponseDeclaration(data); } else { let responseDeclaration = data.responseDeclaration; if (!_.isEmpty(responseDeclaration)) { for (const key in responseDeclaration) { const responseData = responseDeclaration[key]; const maxScore = { cardinality: _.get(responseData, 'cardinality', ''), type: _.get(responseData, 'type', ''), defaultValue: _.get(responseData, 'maxScore'), }; delete responseData.maxScore; outcomeDeclaration['maxScore'] = maxScore; const correctResp = responseData.correctResponse || {}; delete correctResp.outcomes; if (_.toLower(_.get(responseData, 'type')) === 'integer' && _.toLower(_.get(responseData, 'cardinality')) === 'single') { const correctKey = correctResp.value; correctResp.value = parseInt(correctKey, 10); } responseData.mapping = this.getUpdatedMapping(responseData); responseDeclaration[key] = responseData; } data.responseDeclaration = responseDeclaration; data['outcomeDeclaration'] = outcomeDeclaration; } } return data; } processSubjectiveResponseDeclaration(subjectiveMetadata) { let outcomeDeclaration = {}; delete subjectiveMetadata.responseDeclaration; delete subjectiveMetadata.interactions; if (_.has(subjectiveMetadata, 'maxScore') && !_.isNull(subjectiveMetadata.maxScore)) { outcomeDeclaration = { maxScore: { cardinality: 'single', type: 'integer', defaultValue: subjectiveMetadata.maxScore } }; subjectiveMetadata.outcomeDeclaration = outcomeDeclaration; return subjectiveMetadata; } return subjectiveMetadata; } getUpdatedMapping(responseData) { const mappingData = responseData.mapping || []; if (!_.isEmpty(mappingData)) { const updatedMapping = mappingData.map(mapData => ({ value: mapData.response, score: _.get(mapData, 'outcomes.score', 0), })); return updatedMapping; } return mappingData; } processInteractions(data) { const interactions = _.get(data, 'interactions', {}); if (!_.isEmpty(interactions)) { const validation = _.get(interactions, 'validation', {}); const resp1 = _.get(interactions, 'response1', {}); const resValData = _.get(interactions, 'response1.validation', {}); if (!_.isEmpty(resValData)) { _.forEach(resValData, (value, key) => { _.set(validation, key, value); }); } else { _.set(resp1, 'validation', validation); } _.unset(interactions, 'validation'); _.set(interactions, 'response1', resp1); _.set(data, 'interactions', interactions); } return data; } processSolutions(data) { const solutions = _.get(data, 'solutions', []); if (!_.isEmpty(solutions) && _.isArray(solutions)) { const updatedSolutions = _.reduce(solutions, (result, solution) => { result[_.get(solution, 'id')] = this.getSolutionString(solution, _.get(data, 'media', [])); return result; }, {}); _.set(data, 'solutions', updatedSolutions); } return data; } getSolutionString(data, media) { if (!_.isEmpty(data)) { const type = _.get(data, 'type', ''); switch (type) { case 'html': { return _.get(data, 'value', ''); } case 'video': { const value = _.get(data, 'value', ''); const mediaData = _.find(media, (item) => _.isEqual(value, _.get(item, 'id', ''))); if (mediaData) { const src = _.get(mediaData, 'src', ''); const thumbnail = _.get(mediaData, 'thumbnail', ''); const solutionStr = `<video data-asset-variable="media_identifier" width="400" controls poster="thumbnail_url"> <source type="video/mp4" src="media_source_url"> <source type="video/webm" src="media_source_url"> </video>`.replace('media_identifier', value).replace('thumbnail_url', thumbnail).replace(/media_source_url/g, src); return solutionStr; } return ''; } default: { return ''; } } } return ''; } processHints(data) { const hints = _.get(data, 'hints', []); let updatedHints = {}; if (!_.isEmpty(hints)) { _.forEach(hints, (hint) => { _.merge(updatedHints, { [uuidv4()]: hint }); }); _.set(data, 'hints', updatedHints); } return data; } getAnswer(data) { const interactions = _.get(data, 'interactions', {}); if (!_.isEqual(_.get(data, 'primaryCategory'), 'Subjective Question') && !_.isEmpty(interactions)) { const responseData = _.get(data, 'responseDeclaration.response1', {}); const options = _.get(interactions, 'response1.options', {}); let formatedAnswer = ''; let answerData = _.get(responseData, 'cardinality'); if (answerData === 'single') { const correctResp = _.get(_.get(responseData, 'correctResponse', {}), 'value', 0); const label = options[correctResp]; formatedAnswer = `<div class="answer-container"><div class="answer-body">${label.label}</div></div>`; } else { const correctResp = _.get(responseData, 'correctResponse.value'); let singleAns = '<div class="answer-body">answer_html</div>'; const answerList = []; _.forEach(options, (option) => { if (_.includes(correctResp, option.value)) { const replAns = _.replace(singleAns, 'answer_html', _.get(option, 'label')); answerList.push(replAns); } }); formatedAnswer = `<div class="answer-container">${answerList.join('')}</div>`; } return formatedAnswer; } else { return _.get(data, 'answer', ''); } } /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TransformationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); } /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TransformationService, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TransformationService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmb3JtYXRpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3F1bWwtbGlicmFyeS9zcmMvbGliL3NlcnZpY2VzL3RyYW5zZm9ybWF0aW9uLXNlcnZpY2UvdHJhbnNmb3JtYXRpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sS0FBSyxDQUFDLE1BQU0sV0FBVyxDQUFDO0FBQy9CLE9BQU8sRUFBRSxFQUFFLElBQUksTUFBTSxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQUtwQyxNQUFNLE9BQU8scUJBQXFCO0lBRWhDLHVCQUF1QixDQUFDLG1CQUFtQjtRQUN6QyxJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUMsaUNBQWlDLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUNsRixJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsVUFBVSxDQUFDLEVBQUU7WUFDM0MsZUFBZSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQzdFO1FBQ0QsT0FBTyxlQUFlLENBQUM7SUFDekIsQ0FBQztJQUVELGlDQUFpQyxDQUFDLElBQUk7UUFDcEMsSUFBSSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDL0IsSUFBSSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QyxJQUFJLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JDLElBQUksR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxD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QUFFLEVBQUUsQ0FBQyxDQUFDO1NBQ2xDO0lBQ0gsQ0FBQztrSUFoVFUscUJBQXFCO3NJQUFyQixxQkFBcUIsY0FGcEIsTUFBTTs7NEZBRVAscUJBQXFCO2tCQUhqQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IHY0IGFzIHV1aWR2NCB9IGZyb20gJ3V1aWQnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBUcmFuc2Zvcm1hdGlvblNlcnZpY2Uge1xuXG4gIGdldFRyYW5zZm9ybWVkSGllcmFyY2h5KHF1ZXN0aW9uc2V0TWV0YWRhdGEpIHtcbiAgICBsZXQgdXBkYXRlZE1ldGFkYXRhID0gdGhpcy5nZXRUcmFuc2Zvcm1lZFF1ZXN0aW9uU2V0TWV0YWRhdGEocXVlc3Rpb25zZXRNZXRhZGF0YSk7XG4gICAgaWYgKCFfLmlzRW1wdHkodXBkYXRlZE1ldGFkYXRhLCAnY2hpbGRyZW4nKSkge1xuICAgICAgdXBkYXRlZE1ldGFkYXRhLmNoaWxkcmVuID0gdGhpcy50cmFuc2Zvcm1DaGlsZHJlbih1cGRhdGVkTWV0YWRhdGEuY2hpbGRyZW4pO1xuICAgIH1cbiAgICByZXR1cm4gdXBkYXRlZE1ldGFkYXRhO1xuICB9XG5cbiAgZ2V0VHJhbnNmb3JtZWRRdWVzdGlvblNldE1ldGFkYXRhKGRhdGEpIHtcbiAgICBkYXRhID0gdGhpcy5wcm9jZXNzTWF4U2NvcmVQcm9wZXJ0eShkYXRhKTtcbiAgICBkYXRhID0gXy5vbWl0KGRhdGEsICd2ZXJzaW9uJyk7XG4gICAgZGF0YSA9IHRoaXMucHJvY2Vzc0luc3RydWN0aW9ucyhkYXRhKTtcbiAgICBkYXRhID0gdGhpcy5wcm9jZXNzQmxvb21zTGV2ZWwoZGF0YSk7XG4gICAgZGF0YSA9IHRoaXMucHJvY2Vzc0Jvb2xlYW5Qcm9wcyhkYXRhKTtcbiAgICBkYXRhID0gdGhpcy5wcm9jZXNzVGltZUxpbWl0cyhkYXRhKTtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIHByb2Nlc3NNYXhTY29yZVByb3BlcnR5KGRhdGEpIHtcbiAgICBpZiAoXy5oYXMoZGF0YSwgJ21heFNjb3JlJykpIHtcbiAgICAgIGNvbnN0IG91dGNvbWVEZWNsYXJhdGlvbiA9IHtcbiAgICAgICAgbWF4U2NvcmU6IHtcbiAgICAgICAgICBjYXJkaW5hbGl0eTogJ3NpbmdsZScsXG4gICAgICAgICAgdHlwZTogJ2ludGVnZXInLFxuICAgICAgICAgIGRlZmF1bHRWYWx1ZTogZGF0YS5tYXhTY29yZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBkYXRhID0gXy5vbWl0KGRhdGEsICdtYXhTY29yZScpO1xuICAgICAgZGF0YVsnb3V0Y29tZURlY2xhcmF0aW9uJ10gPSBvdXRjb21lRGVjbGFyYXRpb247XG4gICAgfVxuXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBwcm9jZXNzSW5zdHJ1Y3Rpb25zKGRhdGEpIHtcbiAgICBpZiAoXy5oYXMoZGF0YSwgJ2luc3RydWN0aW9ucy5kZWZhdWx0JykpIHtcbiAgICAgIGRhdGEuaW5zdHJ1Y3Rpb25zID0gZGF0YS5pbnN0cnVjdGlvbnMuZGVmYXVsdDtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBwcm9jZXNzQmxvb21zTGV2ZWwoZGF0YSkge1xuICAgIGlmIChfLmhhcyhkYXRhLCAnYmxvb21zTGV2ZWwnKSkge1xuICAgICAgY29uc3QgYkxldmVsID0gXy5nZXQoZGF0YSwgJ2Jsb29tc0xldmVsJyk7XG4gICAgICBfLnVuc2V0KGRhdGEsICdibG9vbXNMZXZlbCcpO1xuICAgICAgXy5zZXQoZGF0YSwgJ2NvbXBsZXhpdHlMZXZlbCcsIFtiTGV2ZWwudG9TdHJpbmcoKV0pO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIHByb2Nlc3NCb29sZWFuUHJvcHMoZGF0YTogYW55KSB7XG4gICAgY29uc3QgYm9vbGVhblByb3BzID0gW1wic2hvd1NvbHV0aW9uc1wiLCBcInNob3dGZWVkYmFja1wiLCBcInNob3dIaW50c1wiLCBcInNob3dUaW1lclwiXTtcbiAgICBjb25zdCBnZXRCb29sZWFuVmFsdWUgPSAoc3RyOiBhbnkpID0+IHN0ciA9PT0gXCJZZXNcIjtcblxuICAgIF8uZm9yRWFjaChib29sZWFuUHJvcHMsIChwcm9wOiBhbnkpID0+IHtcbiAgICAgIGlmIChfLmhhcyhkYXRhLCBwcm9wKSkge1xuICAgICAgICBjb25zdCBwcm9wVmFsID0gZGF0YVtwcm9wXTtcbiAgICAgICAgZGF0YVtwcm9wXSA9IGdldEJvb2xlYW5WYWx1ZShwcm9wVmFsKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgcHJvY2Vzc1RpbWVMaW1pdHMoZGF0YSkge1xuICBsZXQgcGFyc2VkVGltZUxpbWl0cztcbiAgaWYgKF8uaGFzKGRhdGEsICd0aW1lTGltaXRzJykgJiYgIV8uaXNOdWxsKGRhdGEudGltZUxpbWl0cykpIHtcbiAgICBpZiAoXy5pc1N0cmluZyhkYXRhLnRpbWVMaW1pdHMpKSB7XG4gICAgICBwYXJzZWRUaW1lTGltaXRzID0gSlNPTi5wYXJzZShkYXRhLnRpbWVMaW1pdHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJzZWRUaW1lTGltaXRzID0gZGF0YS50aW1lTGltaXRzO1xuICAgIH1cblxuICAgIGRhdGEudGltZUxpbWl0cyA9IHtcbiAgICAgIHF1ZXN0aW9uU2V0OiB7XG4gICAgICAgIG1pbjogMCxcbiAgICAgICAgbWF4OiBwYXJzZWRUaW1lTGltaXRzPy5tYXhUaW1lID8gXy50b0ludGVnZXIocGFyc2VkVGltZUxpbWl0cy5tYXhUaW1lKSA6IDBcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIGRhdGE7XG59XG5cbiAgdHJhbnNmb3JtQ2hpbGRyZW4oY2hpbGRyZW46IGFueSkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGlmICghXy5pc0VtcHR5KGNoaWxkcmVuKSkge1xuICAgICAgXy5mb3JFYWNoKGNoaWxkcmVuLCAoY2gpID0+IHtcbiAgICAgICAgaWYgKF8uaGFzKGNoLCAndmVyc2lvbicpKSB7XG4gICAgICAgICAgXy51bnNldChjaCwgJ3ZlcnNpb24nKTtcbiAgICAgICAgfVxuICAgICAgICBjaCA9IHRoaXMucHJvY2Vzc0Jsb29tc0xldmVsKGNoKTtcbiAgICAgICAgY2ggPSB0aGlzLnByb2Nlc3NCb29sZWFuUHJvcHMoY2gpO1xuICAgICAgICBpZiAoXy5nZXQoY2gsICdtaW1lVHlwZScpLnRvTG93ZXJDYXNlKCkgPT09ICdhcHBsaWNhdGlvbi92bmQuc3VuYmlyZC5xdWVzdGlvbnNldCcpIHtcbiAgICAgICAgICBjaCA9IHRoaXMucHJvY2Vzc1RpbWVMaW1pdHMoY2gpO1xuICAgICAgICAgIGNoID0gdGhpcy5wcm9jZXNzSW5zdHJ1Y3Rpb25zKGNoKTtcbiAgICAgICAgICBjb25zdCBuZXN0ZWRDaGlsZHJlbiA9IF8uZ2V0KGNoLCAnY2hpbGRyZW4nLCBbXSk7XG4gICAgICAgICAgc2VsZi50cmFuc2Zvcm1DaGlsZHJlbihuZXN0ZWRDaGlsZHJlbik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gY2hpbGRyZW47XG4gIH1cblxuICBnZXRUcmFuc2Zvcm1lZFF1ZXN0aW9uTWV0YWRhdGEoZGF0YSkge1xuICAgIGlmIChfLmhhcyhkYXRhLCAncXVlc3Rpb25zJykpIHtcbiAgICAgIF8uZm9yRWFjaChkYXRhLnF1ZXN0aW9ucywgKHF1ZXN0aW9uKSA9PiB7XG4gICAgICAgIGlmICghXy5oYXMocXVlc3Rpb24sICdxdW1sVmVyc2lvbicpIHx8IHF1ZXN0aW9uLnF1bWxWZXJzaW9uICE9IDEuMSkge1xuICAgICAgICAgIHF1ZXN0aW9uID0gdGhpcy5wcm9jZXNzUmVzcG9uc2VEZWNsYXJhdGlvbihxdWVzdGlvbik7XG4gICAgICAgICAgcXVlc3Rpb24gPSB0aGlzLnByb2Nlc3NJbnRlcmFjdGlvbnMocXVlc3Rpb24pO1xuICAgICAgICAgIHF1ZXN0aW9uID0gdGhpcy5wcm9jZXNzU29sdXRpb25zKHF1ZXN0aW9uKTtcbiAgICAgICAgICBxdWVzdGlvbiA9IHRoaXMucHJvY2Vzc0luc3RydWN0aW9ucyhxdWVzdGlvbik7XG4gICAgICAgICAgcXVlc3Rpb24gPSB0aGlzLnByb2Nlc3NIaW50cyhxdWVzdGlvbik7XG4gICAgICAgICAgcXVlc3Rpb24gPSB0aGlzLnByb2Nlc3NCbG9vbXNMZXZlbChxdWVzdGlvbik7XG4gICAgICAgICAgcXVlc3Rpb24gPSB0aGlzLnByb2Nlc3NCb29sZWFuUHJvcHMocXVlc3Rpb24pO1xuICAgICAgICAgIGNvbnN0IGFucyA9IHRoaXMuZ2V0QW5zd2VyKHF1ZXN0aW9uKVxuICAgICAgICAgIGlmICghXy5pc0VtcHR5KGFucykpIHtcbiAgICAgICAgICAgIF8uc2V0KHF1ZXN0aW9uLCAnYW5zd2VyJywgYW5zKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICB9XG5cbiAgcHJvY2Vzc1Jlc3BvbnNlRGVjbGFyYXRpb24oZGF0YSkge1xuICAgIGxldCBvdXRjb21lRGVjbGFyYXRpb24gPSB7fTtcbiAgICBpZiAoXy5pc0VxdWFsKF8udG9Mb3dlcihkYXRhLnByaW1hcnlDYXRlZ29yeSksICdzdWJqZWN0aXZlIHF1ZXN0aW9uJykpIHtcbiAgICAgIGRhdGEgPSB0aGlzLnByb2Nlc3NTdWJqZWN0aXZlUmVzcG9uc2VEZWNsYXJhdGlvbihkYXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHJlc3BvbnNlRGVjbGFyYXRpb24gPSBkYXRhLnJlc3BvbnNlRGVjbGFyYXRpb247XG4gICAgICBpZiAoIV8uaXNFbXB0eShyZXNwb25zZURlY2xhcmF0aW9uKSkge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiByZXNwb25zZURlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2VEZWNsYXJhdGlvbltrZXldO1xuICAgICAgICAgIGNvbnN0IG1heFNjb3JlID0ge1xuICAgICAgICAgICAgY2FyZGluYWxpdHk6IF8uZ2V0KHJlc3BvbnNlRGF0YSwgJ2NhcmRpbmFsaXR5JywgJycpLFxuICAgICAgICAgICAgdHlwZTogXy5nZXQocmVzcG9uc2VEYXRhLCAndHlwZScsICcnKSxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogXy5nZXQocmVzcG9uc2VEYXRhLCAnbWF4U2NvcmUnKSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGRlbGV0ZSByZXNwb25zZURhdGEubWF4U2NvcmU7XG4gICAgICAgICAgb3V0Y29tZURlY2xhcmF0aW9uWydtYXhTY29yZSddID0gbWF4U2NvcmU7XG4gICAgICAgICAgY29uc3QgY29ycmVjdFJlc3AgPSByZXNwb25zZURhdGEuY29ycmVjdFJlc3BvbnNlIHx8IHt9O1xuICAgICAgICAgIGRlbGV0ZSBjb3JyZWN0UmVzcC5vdXRjb21lcztcbiAgICAgICAgICBpZiAoXy50b0xvd2VyKF8uZ2V0KHJlc3BvbnNlRGF0YSwgJ3R5cGUnKSkgPT09ICdpbnRlZ2VyJyAmJiBfLnRvTG93ZXIoXy5nZXQocmVzcG9uc2VEYXRhLCAnY2FyZGluYWxpdHknKSkgPT09ICdzaW5nbGUnKSB7XG4gICAgICAgICAgICBjb25zdCBjb3JyZWN0S2V5ID0gY29ycmVjdFJlc3AudmFsdWU7XG4gICAgICAgICAgICBjb3JyZWN0UmVzcC52YWx1ZSA9IHBhcnNlSW50KGNvcnJlY3RLZXksIDEwKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzcG9uc2VEYXRhLm1hcHBpbmcgPSB0aGlzLmdldFVwZGF0ZWRNYXBwaW5nKHJlc3BvbnNlRGF0YSk7XG4gICAgICAgICAgcmVzcG9uc2VEZWNsYXJhdGlvbltrZXldID0gcmVzcG9uc2VEYXRhO1xuICAgICAgICB9XG4gICAgICAgIGRhdGEucmVzcG9uc2VEZWNsYXJhdGlvbiA9IHJlc3BvbnNlRGVjbGFyYXRpb247XG4gICAgICAgIGRhdGFbJ291dGNvbWVEZWNsYXJhdGlvbiddID0gb3V0Y29tZURlY2xhcmF0aW9uO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIHByb2Nlc3NTdWJqZWN0aXZlUmVzcG9uc2VEZWNsYXJhdGlvbihzdWJqZWN0aXZlTWV0YWRhdGEpIHtcbiAgICBsZXQgb3V0Y29tZURlY2xhcmF0aW9uID0ge307XG4gICAgZGVsZXRlIHN1YmplY3RpdmVNZXRhZGF0YS5yZXNwb25zZURlY2xhcmF0aW9uO1xuICAgIGRlbGV0ZSBzdWJqZWN0aXZlTWV0YWRhdGEuaW50ZXJhY3Rpb25zO1xuICAgIGlmIChfLmhhcyhzdWJqZWN0aXZlTWV0YWRhdGEsICdtYXhTY29yZScpICYmICFfLmlzTnVsbChzdWJqZWN0aXZlTWV0YWRhdGEubWF4U2NvcmUpKSB7XG4gICAgICBvdXRjb21lRGVjbGFyYXRpb24gPSB7XG4gICAgICAgIG1heFNjb3JlOiB7XG4gICAgICAgICAgY2FyZGluYWxpdHk6ICdzaW5nbGUnLFxuICAgICAgICAgIHR5cGU6ICdpbnRlZ2VyJyxcbiAgICAgICAgICBkZWZhdWx0VmFsdWU6IHN1YmplY3RpdmVNZXRhZGF0YS5tYXhTY29yZVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgc3ViamVjdGl2ZU1ldGFkYXRhLm91dGNvbWVEZWNsYXJhdGlvbiA9IG91dGNvbWVEZWNsYXJhdGlvbjtcbiAgICAgIHJldHVybiBzdWJqZWN0aXZlTWV0YWRhdGE7XG4gICAgfVxuICAgIHJldHVybiBzdWJqZWN0aXZlTWV0YWRhdGE7XG4gIH1cblxuICBnZXRVcGRhdGVkTWFwcGluZyhyZXNwb25zZURhdGEpIHtcbiAgICBjb25zdCBtYXBwaW5nRGF0YSA9IHJlc3BvbnNlRGF0YS5tYXBwaW5nIHx8IFtdO1xuICAgIGlmICghXy5pc0VtcHR5KG1hcHBpbmdEYXRhKSkge1xuICAgICAgY29uc3QgdXBkYXRlZE1hcHBpbmcgPSBtYXBwaW5nRGF0YS5tYXAobWFwRGF0YSA9PiAoe1xuICAgICAgICB2YWx1ZTogbWFwRGF0YS5yZXNwb25zZSxcbiAgICAgICAgc2NvcmU6IF8uZ2V0KG1hcERhdGEsICdvdXRjb21lcy5zY29yZScsIDApLFxuICAgICAgfSkpO1xuICAgICAgcmV0dXJuIHVwZGF0ZWRNYXBwaW5nO1xuICAgIH1cbiAgICByZXR1cm4gbWFwcGluZ0RhdGE7XG4gIH1cblxuICBwcm9jZXNzSW50ZXJhY3Rpb25zKGRhdGE6IGFueSkge1xuICAgIGNvbnN0IGludGVyYWN0aW9uczogYW55ID0gXy5nZXQoZGF0YSwgJ2ludGVyYWN0aW9ucycsIHt9KTtcbiAgICBpZiAoIV8uaXNFbXB0eShpbnRlcmFjdGlvbnMpKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uOiBhbnkgPSBfLmdldChpbnRlcmFjdGlvbnMsICd2YWxpZGF0aW9uJywge30pO1xuICAgICAgY29uc3QgcmVzcDE6IGFueSA9IF8uZ2V0KGludGVyYWN0aW9ucywgJ3Jlc3BvbnNlMScsIHt9KTtcbiAgICAgIGNvbnN0IHJlc1ZhbERhdGE6IGFueSA9IF8uZ2V0KGludGVyYWN0aW9ucywgJ3Jlc3BvbnNlMS52YWxpZGF0aW9uJywge30pO1xuICAgICAgaWYgKCFfLmlzRW1wdHkocmVzVmFsRGF0YSkpIHtcbiAgICAgICAgXy5mb3JFYWNoKHJlc1ZhbERhdGEsICh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgXy5zZXQodmFsaWRhdGlvbiwga2V5LCB2YWx1ZSlcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfLnNldChyZXNwMSwgJ3ZhbGlkYXRpb24nLCB2YWxpZGF0aW9uKTtcbiAgICAgIH1cbiAgICAgIF8udW5zZXQoaW50ZXJhY3Rpb25zLCAndmFsaWRhdGlvbicpO1xuICAgICAgXy5zZXQoaW50ZXJhY3Rpb25zLCAncmVzcG9uc2UxJywgcmVzcDEpO1xuICAgICAgXy5zZXQoZGF0YSwgJ2ludGVyYWN0aW9ucycsIGludGVyYWN0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgcHJvY2Vzc1NvbHV0aW9ucyhkYXRhKSB7XG4gICAgY29uc3Qgc29sdXRpb25zID0gXy5nZXQoZGF0YSwgJ3NvbHV0aW9ucycsIFtdKTtcblxuICAgIGlmICghXy5pc0VtcHR5KHNvbHV0aW9ucykgJiYgXy5pc0FycmF5KHNvbHV0aW9ucykpIHtcbiAgICAgIGNvbnN0IHVwZGF0ZWRTb2x1dGlvbnMgPSBfLnJlZHVjZShzb2x1dGlvbnMsIChyZXN1bHQsIHNvbHV0aW9uKSA9PiB7XG4gICAgICAgIHJlc3VsdFtfLmdldChzb2x1dGlvbiwgJ2lkJyldID0gdGhpcy5nZXRTb2x1dGlvblN0cmluZyhzb2x1dGlvbiwgXy5nZXQoZGF0YSwgJ21lZGlhJywgW10pKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0sIHt9KTtcblxuICAgICAgXy5zZXQoZGF0YSwgJ3NvbHV0aW9ucycsIHVwZGF0ZWRTb2x1dGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIGdldFNvbHV0aW9uU3RyaW5nKGRhdGEsIG1lZGlhKSB7XG4gICAgaWYgKCFfLmlzRW1wdHkoZGF0YSkpIHtcbiAgICAgIGNvbnN0IHR5cGUgPSBfLmdldChkYXRhLCAndHlwZScsICcnKTtcblxuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgJ2h0bWwnOiB7XG4gICAgICAgICAgcmV0dXJuIF8uZ2V0KGRhdGEsICd2YWx1ZScsICcnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ3ZpZGVvJzoge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gXy5nZXQoZGF0YSwgJ3ZhbHVlJywgJycpO1xuICAgICAgICAgIGNvbnN0IG1lZGlhRGF0YSA9IF8uZmluZChtZWRpYSwgKGl0ZW0pID0+IF8uaXNFcXVhbCh2YWx1ZSwgXy5nZXQoaXRlbSwgJ2lkJywgJycpKSk7XG5cbiAgICAgICAgICBpZiAobWVkaWFEYXRhKSB7XG4gICAgICAgICAgICBjb25zdCBzcmMgPSBfLmdldChtZWRpYURhdGEsICdzcmMnLCAnJyk7XG4gICAgICAgICAgICBjb25zdCB0aHVtYm5haWwgPSBfLmdldChtZWRpYURhdGEsICd0aHVtYm5haWwnLCAnJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IHNvbHV0aW9uU3RyID0gYDx2aWRlbyBkYXRhLWFzc2V0LXZhcmlhYmxlPVwibWVkaWFfaWRlbnRpZmllclwiIHdpZHRoPVwiNDAwXCIgY29udHJvbHMgcG9zdGVyPVwidGh1bWJuYWlsX3VybFwiPlxuICAgICAgICAgICAgICA8c291cmNlIHR5cGU9XCJ2aWRlby9tcDRcIiBzcmM9XCJtZWRpYV9zb3VyY2VfdXJsXCI+XG4gICAgICAgICAgICAgIDxzb3VyY2UgdHlwZT1cInZpZGVvL3dlYm1cIiBzcmM9XCJtZWRpYV9zb3VyY2VfdXJsXCI+XG4gICAgICAgICAgICA8L3ZpZGVvPmAucmVwbGFjZSgnbWVkaWFfaWRlbnRpZmllcicsIHZhbHVlKS5yZXBsYWNlKCd0aHVtYm5haWxfdXJsJywgdGh1bWJuYWlsKS5yZXBsYWNlKC9tZWRpYV9zb3VyY2VfdXJsL2csIHNyYyk7XG5cbiAgICAgICAgICAgIHJldHVybiBzb2x1dGlvblN0cjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHByb2Nlc3NIaW50cyhkYXRhKSB7XG4gICAgY29uc3QgaGludHMgPSBfLmdldChkYXRhLCAnaGludHMnLCBbXSk7XG4gICAgbGV0IHVwZGF0ZWRIaW50cyA9IHt9O1xuICAgIGlmICghXy5pc0VtcHR5KGhpbnRzKSkge1xuICAgICAgXy5mb3JFYWNoKGhpbnRzLCAoaGludCkgPT4ge1xuICAgICAgICBfLm1lcmdlKHVwZGF0ZWRIaW50cywge1t1dWlkdjQoKV06IGhpbnR9KTtcbiAgICAgIH0pXG5cbiAgICAgIF8uc2V0KGRhdGEsICdoaW50cycsIHVwZGF0ZWRIaW50cyk7XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgZ2V0QW5zd2VyKGRhdGEpIHtcbiAgICBjb25zdCBpbnRlcmFjdGlvbnMgPSBfLmdldChkYXRhLCAnaW50ZXJhY3Rpb25zJywge30pO1xuXG4gICAgaWYgKCFfLmlzRXF1YWwoXy5nZXQoZGF0YSwgJ3ByaW1hcnlDYXRlZ29yeScpLCAnU3ViamVjdGl2ZSBRdWVzdGlvbicpICYmICFfLmlzRW1wdHkoaW50ZXJhY3Rpb25zKSkge1xuICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gXy5nZXQoZGF0YSwgJ3Jlc3BvbnNlRGVjbGFyYXRpb24ucmVzcG9uc2UxJywge30pO1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IF8uZ2V0KGludGVyYWN0aW9ucywgJ3Jlc3BvbnNlMS5vcHRpb25zJywge30pO1xuICAgICAgbGV0IGZvcm1hdGVkQW5zd2VyID0gJyc7XG5cbiAgICAgIGxldCBhbnN3ZXJEYXRhID0gXy5nZXQocmVzcG9uc2VEYXRhLCAnY2FyZGluYWxpdHknKTtcblxuICAgICAgaWYgKGFuc3dlckRhdGEgPT09ICdzaW5nbGUnKSB7XG4gICAgICAgIGNvbnN0IGNvcnJlY3RSZXNwID0gXy5nZXQoXy5nZXQocmVzcG9uc2VEYXRhLCAnY29ycmVjdFJlc3BvbnNlJywge30pLCAndmFsdWUnLCAwKTtcbiAgICAgICAgY29uc3QgbGFiZWwgPSBvcHRpb25zW2NvcnJlY3RSZXNwXTtcblxuICAgICAgICBmb3JtYXRlZEFuc3dlciA9IGA8ZGl2IGNsYXNzPVwiYW5zd2VyLWNvbnRhaW5lclwiPjxkaXYgY2xhc3M9XCJhbnN3ZXItYm9keVwiPiR7bGFiZWwubGFiZWx9PC9kaXY+PC9kaXY+YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGNvcnJlY3RSZXNwID0gXy5nZXQocmVzcG9uc2VEYXRhLCAnY29ycmVjdFJlc3BvbnNlLnZhbHVlJyk7XG4gICAgICAgIGxldCBzaW5nbGVBbnMgPSAnPGRpdiBjbGFzcz1cImFuc3dlci1ib2R5XCI+YW5zd2VyX2h0bWw8L2Rpdj4nO1xuICAgICAgICBjb25zdCBhbnN3ZXJMaXN0ID0gW107XG4gICAgICAgIF8uZm9yRWFjaChvcHRpb25zLCAob3B0aW9uKSA9PiB7XG4gICAgICAgICAgaWYgKF8uaW5jbHVkZXMoY29ycmVjdFJlc3AsIG9wdGlvbi52YWx1ZSwpKSB7XG4gICAgICAgICAgICBjb25zdCByZXBsQW5zID0gXy5yZXBsYWNlKHNpbmdsZUFucywgJ2Fuc3dlcl9odG1sJywgXy5nZXQob3B0aW9uLCAnbGFiZWwnKSlcbiAgICAgICAgICAgIGFuc3dlckxpc3QucHVzaChyZXBsQW5zKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgZm9ybWF0ZWRBbnN3ZXIgPSBgPGRpdiBjbGFzcz1cImFuc3dlci1jb250YWluZXJcIj4ke2Fuc3dlckxpc3Quam9pbignJyl9PC9kaXY+YDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmb3JtYXRlZEFuc3dlcjtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICByZXR1cm4gXy5nZXQoZGF0YSwgJ2Fuc3dlcicsICcnKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==