@pie-element/select-text 9.6.1-next.2 → 9.6.2-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -177,6 +177,7 @@ var model = function model(question, session, env) {
177
177
  highlightChoices: normalizedQuestion.highlightChoices,
178
178
  prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,
179
179
  text: normalizedQuestion.text,
180
+ tokenizedText: normalizedQuestion.tokenizedText,
180
181
  disabled: env.mode !== 'gather',
181
182
  maxSelections: normalizedQuestion.maxSelections,
182
183
  correctness: correctness,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.js"],"names":["log","equalTokens","token1","token2","start","end","oldStart","oldEnd","normalizeTokens","tokens","selectedTokens","evaluateMode","map","token","isCorrect","correct","isMissing","find","selectedToken","undefined","getCorrectness","selected","filter","t","length","correctSelected","getCorrectSelected","s","findIndex","getPartialScore","question","session","totalCorrect","correctCount","correctTokens","extraSelected","incorrectCount","count","positiveCount","parseFloat","toFixed","outcome","env","Promise","resolve","score","empty","normalizeSession","mode","completed","enabled","partialScoring","createDefaultModel","model","defaults","normalize","normalizedQuestion","correctness","fb","feedbackEnabled","feedback","then","out","highlightChoices","prompt","promptEnabled","text","disabled","maxSelections","incorrect","language","extraCSSRules","role","rationale","rationaleEnabled","teacherInstructions","teacherInstructionsEnabled","createCorrectResponseSession","id","getInnerText","html","replaceAll","getContent","replace","validate","config","minTokens","maxTokens","errors","nbOfTokens","forEach","field","required","nbOfSelections","reduce","acc","tokensError","selectionsError"],"mappings":"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","sourcesContent":["import debug from 'debug';\nimport isEmpty from 'lodash/isEmpty';\nimport { getFeedbackForCorrectness } from '@pie-lib/pie-toolbox/feedback';\nimport { partialScoring } from '@pie-lib/pie-toolbox/controller-utils';\nimport defaults from './defaults';\n\nconst log = debug('@pie-element:select-text:controller');\n\nconst equalTokens = (token1 = {}, token2 = {}) =>\n (token1?.start === token2?.start && token1?.end === token2?.end) ||\n // this case is used for the cases when the token's start & end were recalculated\n (token1?.start === token2?.oldStart && token1?.end === token2?.oldEnd);\n\nconst normalizeTokens = (tokens = [], selectedTokens = [], evaluateMode = false) =>\n (tokens || []).map((token) => {\n const isCorrect = !!token.correct;\n // search if correct token is missing from session\n const isMissing = isCorrect && !(selectedTokens || []).find((selectedToken) => equalTokens(token, selectedToken));\n\n return {\n ...token,\n correct: evaluateMode ? isCorrect : undefined,\n isMissing: evaluateMode ? isMissing : undefined,\n };\n });\n\nexport const getCorrectness = (tokens, selected) => {\n const correct = tokens.filter((t) => t.correct === true);\n\n if (correct.length === 0) {\n return 'unknown';\n }\n\n const correctSelected = getCorrectSelected(tokens, selected);\n\n if (correctSelected.length === selected.length) {\n if (correctSelected.length === correct.length) {\n return 'correct';\n } else if (correctSelected.length > 0) {\n return 'partially-correct';\n }\n }\n\n if (correctSelected.length > 0) {\n return 'partially-correct';\n }\n\n return 'incorrect';\n};\n\nconst getCorrectSelected = (tokens, selected) =>\n (selected || []).filter((s) => tokens.findIndex((token) => token.correct && equalTokens(token, s)) !== -1);\n\nexport const getPartialScore = (question, session, totalCorrect) => {\n if (!session || isEmpty(session)) {\n return 0;\n }\n\n const correctCount = getCorrectSelected(question.tokens, session.selectedTokens).length;\n const correctTokens = (question.tokens || []).filter((t) => t.correct === true);\n const extraSelected = session.selectedTokens ? session.selectedTokens.length > correctTokens.length : 0;\n const incorrectCount = extraSelected ? session.selectedTokens && session.selectedTokens.length - correctCount : 0;\n const count = correctCount - incorrectCount;\n const positiveCount = count < 0 ? 0 : count;\n\n return totalCorrect.length ? parseFloat((positiveCount / totalCorrect.length).toFixed(2)) : 0;\n};\n\nexport const outcome = (question, session, env) =>\n new Promise((resolve) => {\n if (!session || isEmpty(session)) {\n resolve({ score: 0, empty: true });\n }\n\n session = normalizeSession(session);\n\n if (env.mode !== 'evaluate') {\n resolve({ score: undefined, completed: undefined });\n } else {\n const enabled = partialScoring.enabled(question, env, true);\n const totalCorrect = question.tokens.filter((t) => t.correct);\n const score = getPartialScore(question, session, totalCorrect);\n resolve({\n score: enabled ? score : score === 1 ? 1 : 0,\n });\n }\n });\n\nexport function createDefaultModel(model = {}) {\n return new Promise((resolve) => {\n resolve({ ...defaults, ...model });\n });\n}\n\nexport const normalizeSession = (session) => ({ selectedTokens: [], ...session });\n\nexport const normalize = (question) => ({ ...defaults, ...question });\n\nexport const model = (question, session, env) => {\n session = session || { selectedToken: [] };\n session.selectedTokens = session.selectedTokens || [];\n const normalizedQuestion = normalize(question);\n\n return new Promise((resolve) => {\n log('[model]', 'normalizedQuestion: ', normalizedQuestion);\n log('[model]', 'session: ', session);\n\n const tokens = normalizeTokens(normalizedQuestion.tokens, session.selectedTokens, env.mode === 'evaluate');\n log('[model] tokens:', tokens);\n\n const correctness =\n env.mode === 'evaluate' ? getCorrectness(normalizedQuestion.tokens, session.selectedTokens) : undefined;\n\n const fb =\n env.mode === 'evaluate' && normalizedQuestion.feedbackEnabled\n ? getFeedbackForCorrectness(correctness, normalizedQuestion.feedback)\n : Promise.resolve(undefined);\n\n fb.then((feedback) => {\n const out = {\n tokens,\n highlightChoices: normalizedQuestion.highlightChoices,\n prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,\n text: normalizedQuestion.text,\n disabled: env.mode !== 'gather',\n maxSelections: normalizedQuestion.maxSelections,\n correctness,\n env,\n feedback,\n incorrect: env.mode === 'evaluate' ? correctness !== 'correct' : undefined,\n language: normalizedQuestion.language,\n extraCSSRules: normalizedQuestion.extraCSSRules,\n };\n\n if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {\n out.rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : null;\n out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled\n ? normalizedQuestion.teacherInstructions\n : null;\n } else {\n out.rationale = null;\n out.teacherInstructions = null;\n }\n\n resolve(out);\n });\n });\n};\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const { tokens } = question;\n const selectedTokens = tokens.filter((t) => t.correct);\n\n resolve({\n id: '1',\n selectedTokens,\n });\n } else {\n resolve(null);\n }\n });\n};\n\n// remove all html tags\nconst getInnerText = (html) => (html || '').replaceAll(/<[^>]*>/g, '');\n\n// remove all html tags except img, iframe and source tag for audio\nconst getContent = (html) => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');\n\nexport const validate = (model = {}, config = {}) => {\n const { tokens } = model;\n const { minTokens = 2, maxTokens, maxSelections } = config;\n const errors = {};\n const nbOfTokens = (tokens || []).length;\n\n ['teacherInstructions', 'prompt', 'rationale'].forEach((field) => {\n if (config[field]?.required && !getContent(model[field])) {\n errors[field] = 'This field is required.';\n }\n });\n\n const nbOfSelections = (tokens || []).reduce((acc, token) => (token.correct ? acc + 1 : acc), 0);\n\n if (nbOfTokens < minTokens) {\n errors.tokensError = `There should be at least ${minTokens} tokens defined.`;\n } else if (nbOfTokens > maxTokens) {\n errors.tokensError = `No more than ${maxTokens} tokens should be defined.`;\n }\n\n if (nbOfSelections < 1) {\n errors.selectionsError = 'There should be at least 1 token selected.';\n } else if (nbOfSelections > maxSelections) {\n errors.selectionsError = `No more than ${maxSelections} tokens should be selected.`;\n }\n\n return errors;\n};\n"],"file":"index.js"}
1
+ {"version":3,"sources":["../src/index.js"],"names":["log","equalTokens","token1","token2","start","end","oldStart","oldEnd","normalizeTokens","tokens","selectedTokens","evaluateMode","map","token","isCorrect","correct","isMissing","find","selectedToken","undefined","getCorrectness","selected","filter","t","length","correctSelected","getCorrectSelected","s","findIndex","getPartialScore","question","session","totalCorrect","correctCount","correctTokens","extraSelected","incorrectCount","count","positiveCount","parseFloat","toFixed","outcome","env","Promise","resolve","score","empty","normalizeSession","mode","completed","enabled","partialScoring","createDefaultModel","model","defaults","normalize","normalizedQuestion","correctness","fb","feedbackEnabled","feedback","then","out","highlightChoices","prompt","promptEnabled","text","tokenizedText","disabled","maxSelections","incorrect","language","extraCSSRules","role","rationale","rationaleEnabled","teacherInstructions","teacherInstructionsEnabled","createCorrectResponseSession","id","getInnerText","html","replaceAll","getContent","replace","validate","config","minTokens","maxTokens","errors","nbOfTokens","forEach","field","required","nbOfSelections","reduce","acc","tokensError","selectionsError"],"mappings":";;;;;;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;;;;;AAEA,IAAMA,GAAG,GAAG,uBAAM,qCAAN,CAAZ;;AAEA,IAAMC,WAAW,GAAG,SAAdA,WAAc;AAAA,MAACC,MAAD,uEAAU,EAAV;AAAA,MAAcC,MAAd,uEAAuB,EAAvB;AAAA,SACjB,CAAAD,MAAM,SAAN,IAAAA,MAAM,WAAN,YAAAA,MAAM,CAAEE,KAAR,OAAkBD,MAAlB,aAAkBA,MAAlB,uBAAkBA,MAAM,CAAEC,KAA1B,KAAmC,CAAAF,MAAM,SAAN,IAAAA,MAAM,WAAN,YAAAA,MAAM,CAAEG,GAAR,OAAgBF,MAAhB,aAAgBA,MAAhB,uBAAgBA,MAAM,CAAEE,GAAxB,CAApC,IACA;AACC,GAAAH,MAAM,SAAN,IAAAA,MAAM,WAAN,YAAAA,MAAM,CAAEE,KAAR,OAAkBD,MAAlB,aAAkBA,MAAlB,uBAAkBA,MAAM,CAAEG,QAA1B,KAAsC,CAAAJ,MAAM,SAAN,IAAAA,MAAM,WAAN,YAAAA,MAAM,CAAEG,GAAR,OAAgBF,MAAhB,aAAgBA,MAAhB,uBAAgBA,MAAM,CAAEI,MAAxB,CAHrB;AAAA,CAApB;;AAKA,IAAMC,eAAe,GAAG,SAAlBA,eAAkB;AAAA,MAACC,MAAD,uEAAU,EAAV;AAAA,MAAcC,cAAd,uEAA+B,EAA/B;AAAA,MAAmCC,YAAnC,uEAAkD,KAAlD;AAAA,SACtB,CAACF,MAAM,IAAI,EAAX,EAAeG,GAAf,CAAmB,UAACC,KAAD,EAAW;AAC5B,QAAMC,SAAS,GAAG,CAAC,CAACD,KAAK,CAACE,OAA1B,CAD4B,CAE5B;;AACA,QAAMC,SAAS,GAAGF,SAAS,IAAI,CAAC,CAACJ,cAAc,IAAI,EAAnB,EAAuBO,IAAvB,CAA4B,UAACC,aAAD;AAAA,aAAmBjB,WAAW,CAACY,KAAD,EAAQK,aAAR,CAA9B;AAAA,KAA5B,CAAhC;AAEA,2CACKL,KADL;AAEEE,MAAAA,OAAO,EAAEJ,YAAY,GAAGG,SAAH,GAAeK,SAFtC;AAGEH,MAAAA,SAAS,EAAEL,YAAY,GAAGK,SAAH,GAAeG;AAHxC;AAKD,GAVD,CADsB;AAAA,CAAxB;;AAaO,IAAMC,cAAc,GAAG,SAAjBA,cAAiB,CAACX,MAAD,EAASY,QAAT,EAAsB;AAClD,MAAMN,OAAO,GAAGN,MAAM,CAACa,MAAP,CAAc,UAACC,CAAD;AAAA,WAAOA,CAAC,CAACR,OAAF,KAAc,IAArB;AAAA,GAAd,CAAhB;;AAEA,MAAIA,OAAO,CAACS,MAAR,KAAmB,CAAvB,EAA0B;AACxB,WAAO,SAAP;AACD;;AAED,MAAMC,eAAe,GAAGC,kBAAkB,CAACjB,MAAD,EAASY,QAAT,CAA1C;;AAEA,MAAII,eAAe,CAACD,MAAhB,KAA2BH,QAAQ,CAACG,MAAxC,EAAgD;AAC9C,QAAIC,eAAe,CAACD,MAAhB,KAA2BT,OAAO,CAACS,MAAvC,EAA+C;AAC7C,aAAO,SAAP;AACD,KAFD,MAEO,IAAIC,eAAe,CAACD,MAAhB,GAAyB,CAA7B,EAAgC;AACrC,aAAO,mBAAP;AACD;AACF;;AAED,MAAIC,eAAe,CAACD,MAAhB,GAAyB,CAA7B,EAAgC;AAC9B,WAAO,mBAAP;AACD;;AAED,SAAO,WAAP;AACD,CAtBM;;;;AAwBP,IAAME,kBAAkB,GAAG,SAArBA,kBAAqB,CAACjB,MAAD,EAASY,QAAT;AAAA,SACzB,CAACA,QAAQ,IAAI,EAAb,EAAiBC,MAAjB,CAAwB,UAACK,CAAD;AAAA,WAAOlB,MAAM,CAACmB,SAAP,CAAiB,UAACf,KAAD;AAAA,aAAWA,KAAK,CAACE,OAAN,IAAiBd,WAAW,CAACY,KAAD,EAAQc,CAAR,CAAvC;AAAA,KAAjB,MAAwE,CAAC,CAAhF;AAAA,GAAxB,CADyB;AAAA,CAA3B;;AAGO,IAAME,eAAe,GAAG,SAAlBA,eAAkB,CAACC,QAAD,EAAWC,OAAX,EAAoBC,YAApB,EAAqC;AAClE,MAAI,CAACD,OAAD,IAAY,yBAAQA,OAAR,CAAhB,EAAkC;AAChC,WAAO,CAAP;AACD;;AAED,MAAME,YAAY,GAAGP,kBAAkB,CAACI,QAAQ,CAACrB,MAAV,EAAkBsB,OAAO,CAACrB,cAA1B,CAAlB,CAA4Dc,MAAjF;AACA,MAAMU,aAAa,GAAG,CAACJ,QAAQ,CAACrB,MAAT,IAAmB,EAApB,EAAwBa,MAAxB,CAA+B,UAACC,CAAD;AAAA,WAAOA,CAAC,CAACR,OAAF,KAAc,IAArB;AAAA,GAA/B,CAAtB;AACA,MAAMoB,aAAa,GAAGJ,OAAO,CAACrB,cAAR,GAAyBqB,OAAO,CAACrB,cAAR,CAAuBc,MAAvB,GAAgCU,aAAa,CAACV,MAAvE,GAAgF,CAAtG;AACA,MAAMY,cAAc,GAAGD,aAAa,GAAGJ,OAAO,CAACrB,cAAR,IAA0BqB,OAAO,CAACrB,cAAR,CAAuBc,MAAvB,GAAgCS,YAA7D,GAA4E,CAAhH;AACA,MAAMI,KAAK,GAAGJ,YAAY,GAAGG,cAA7B;AACA,MAAME,aAAa,GAAGD,KAAK,GAAG,CAAR,GAAY,CAAZ,GAAgBA,KAAtC;AAEA,SAAOL,YAAY,CAACR,MAAb,GAAsBe,UAAU,CAAC,CAACD,aAAa,GAAGN,YAAY,CAACR,MAA9B,EAAsCgB,OAAtC,CAA8C,CAA9C,CAAD,CAAhC,GAAqF,CAA5F;AACD,CAbM;;;;AAeA,IAAMC,OAAO,GAAG,SAAVA,OAAU,CAACX,QAAD,EAAWC,OAAX,EAAoBW,GAApB;AAAA,SACrB,IAAIC,OAAJ,CAAY,UAACC,OAAD,EAAa;AACvB,QAAI,CAACb,OAAD,IAAY,yBAAQA,OAAR,CAAhB,EAAkC;AAChCa,MAAAA,OAAO,CAAC;AAAEC,QAAAA,KAAK,EAAE,CAAT;AAAYC,QAAAA,KAAK,EAAE;AAAnB,OAAD,CAAP;AACD;;AAEDf,IAAAA,OAAO,GAAGgB,gBAAgB,CAAChB,OAAD,CAA1B;;AAEA,QAAIW,GAAG,CAACM,IAAJ,KAAa,UAAjB,EAA6B;AAC3BJ,MAAAA,OAAO,CAAC;AAAEC,QAAAA,KAAK,EAAE1B,SAAT;AAAoB8B,QAAAA,SAAS,EAAE9B;AAA/B,OAAD,CAAP;AACD,KAFD,MAEO;AACL,UAAM+B,OAAO,GAAGC,gCAAeD,OAAf,CAAuBpB,QAAvB,EAAiCY,GAAjC,EAAsC,IAAtC,CAAhB;;AACA,UAAMV,YAAY,GAAGF,QAAQ,CAACrB,MAAT,CAAgBa,MAAhB,CAAuB,UAACC,CAAD;AAAA,eAAOA,CAAC,CAACR,OAAT;AAAA,OAAvB,CAArB;AACA,UAAM8B,KAAK,GAAGhB,eAAe,CAACC,QAAD,EAAWC,OAAX,EAAoBC,YAApB,CAA7B;AACAY,MAAAA,OAAO,CAAC;AACNC,QAAAA,KAAK,EAAEK,OAAO,GAAGL,KAAH,GAAWA,KAAK,KAAK,CAAV,GAAc,CAAd,GAAkB;AADrC,OAAD,CAAP;AAGD;AACF,GAjBD,CADqB;AAAA,CAAhB;;;;AAoBA,SAASO,kBAAT,GAAwC;AAAA,MAAZC,KAAY,uEAAJ,EAAI;AAC7C,SAAO,IAAIV,OAAJ,CAAY,UAACC,OAAD,EAAa;AAC9BA,IAAAA,OAAO,iCAAMU,oBAAN,GAAmBD,KAAnB,EAAP;AACD,GAFM,CAAP;AAGD;;AAEM,IAAMN,gBAAgB,GAAG,SAAnBA,gBAAmB,CAAChB,OAAD;AAAA;AAAgBrB,IAAAA,cAAc,EAAE;AAAhC,KAAuCqB,OAAvC;AAAA,CAAzB;;;;AAEA,IAAMwB,SAAS,GAAG,SAAZA,SAAY,CAACzB,QAAD;AAAA,yCAAoBwB,oBAApB,GAAiCxB,QAAjC;AAAA,CAAlB;;;;AAEA,IAAMuB,KAAK,GAAG,SAARA,KAAQ,CAACvB,QAAD,EAAWC,OAAX,EAAoBW,GAApB,EAA4B;AAC/CX,EAAAA,OAAO,GAAGA,OAAO,IAAI;AAAEb,IAAAA,aAAa,EAAE;AAAjB,GAArB;AACAa,EAAAA,OAAO,CAACrB,cAAR,GAAyBqB,OAAO,CAACrB,cAAR,IAA0B,EAAnD;AACA,MAAM8C,kBAAkB,GAAGD,SAAS,CAACzB,QAAD,CAApC;AAEA,SAAO,IAAIa,OAAJ,CAAY,UAACC,OAAD,EAAa;AAC9B5C,IAAAA,GAAG,CAAC,SAAD,EAAY,sBAAZ,EAAoCwD,kBAApC,CAAH;AACAxD,IAAAA,GAAG,CAAC,SAAD,EAAY,WAAZ,EAAyB+B,OAAzB,CAAH;AAEA,QAAMtB,MAAM,GAAGD,eAAe,CAACgD,kBAAkB,CAAC/C,MAApB,EAA4BsB,OAAO,CAACrB,cAApC,EAAoDgC,GAAG,CAACM,IAAJ,KAAa,UAAjE,CAA9B;AACAhD,IAAAA,GAAG,CAAC,iBAAD,EAAoBS,MAApB,CAAH;AAEA,QAAMgD,WAAW,GACff,GAAG,CAACM,IAAJ,KAAa,UAAb,GAA0B5B,cAAc,CAACoC,kBAAkB,CAAC/C,MAApB,EAA4BsB,OAAO,CAACrB,cAApC,CAAxC,GAA8FS,SADhG;AAGA,QAAMuC,EAAE,GACNhB,GAAG,CAACM,IAAJ,KAAa,UAAb,IAA2BQ,kBAAkB,CAACG,eAA9C,GACI,yCAA0BF,WAA1B,EAAuCD,kBAAkB,CAACI,QAA1D,CADJ,GAEIjB,OAAO,CAACC,OAAR,CAAgBzB,SAAhB,CAHN;AAKAuC,IAAAA,EAAE,CAACG,IAAH,CAAQ,UAACD,QAAD,EAAc;AACpB,UAAME,GAAG,GAAG;AACVrD,QAAAA,MAAM,EAANA,MADU;AAEVsD,QAAAA,gBAAgB,EAAEP,kBAAkB,CAACO,gBAF3B;AAGVC,QAAAA,MAAM,EAAER,kBAAkB,CAACS,aAAnB,GAAmCT,kBAAkB,CAACQ,MAAtD,GAA+D,IAH7D;AAIVE,QAAAA,IAAI,EAAEV,kBAAkB,CAACU,IAJf;AAKVC,QAAAA,aAAa,EAAEX,kBAAkB,CAACW,aALxB;AAMVC,QAAAA,QAAQ,EAAE1B,GAAG,CAACM,IAAJ,KAAa,QANb;AAOVqB,QAAAA,aAAa,EAAEb,kBAAkB,CAACa,aAPxB;AAQVZ,QAAAA,WAAW,EAAXA,WARU;AASVf,QAAAA,GAAG,EAAHA,GATU;AAUVkB,QAAAA,QAAQ,EAARA,QAVU;AAWVU,QAAAA,SAAS,EAAE5B,GAAG,CAACM,IAAJ,KAAa,UAAb,GAA0BS,WAAW,KAAK,SAA1C,GAAsDtC,SAXvD;AAYVoD,QAAAA,QAAQ,EAAEf,kBAAkB,CAACe,QAZnB;AAaVC,QAAAA,aAAa,EAAEhB,kBAAkB,CAACgB;AAbxB,OAAZ;;AAgBA,UAAI9B,GAAG,CAAC+B,IAAJ,KAAa,YAAb,KAA8B/B,GAAG,CAACM,IAAJ,KAAa,MAAb,IAAuBN,GAAG,CAACM,IAAJ,KAAa,UAAlE,CAAJ,EAAmF;AACjFc,QAAAA,GAAG,CAACY,SAAJ,GAAgBlB,kBAAkB,CAACmB,gBAAnB,GAAsCnB,kBAAkB,CAACkB,SAAzD,GAAqE,IAArF;AACAZ,QAAAA,GAAG,CAACc,mBAAJ,GAA0BpB,kBAAkB,CAACqB,0BAAnB,GACtBrB,kBAAkB,CAACoB,mBADG,GAEtB,IAFJ;AAGD,OALD,MAKO;AACLd,QAAAA,GAAG,CAACY,SAAJ,GAAgB,IAAhB;AACAZ,QAAAA,GAAG,CAACc,mBAAJ,GAA0B,IAA1B;AACD;;AAEDhC,MAAAA,OAAO,CAACkB,GAAD,CAAP;AACD,KA5BD;AA6BD,GA5CM,CAAP;AA6CD,CAlDM;;;;AAoDA,IAAMgB,4BAA4B,GAAG,SAA/BA,4BAA+B,CAAChD,QAAD,EAAWY,GAAX,EAAmB;AAC7D,SAAO,IAAIC,OAAJ,CAAY,UAACC,OAAD,EAAa;AAC9B,QAAIF,GAAG,CAACM,IAAJ,KAAa,UAAb,IAA2BN,GAAG,CAAC+B,IAAJ,KAAa,YAA5C,EAA0D;AACxD,UAAQhE,MAAR,GAAmBqB,QAAnB,CAAQrB,MAAR;AACA,UAAMC,cAAc,GAAGD,MAAM,CAACa,MAAP,CAAc,UAACC,CAAD;AAAA,eAAOA,CAAC,CAACR,OAAT;AAAA,OAAd,CAAvB;AAEA6B,MAAAA,OAAO,CAAC;AACNmC,QAAAA,EAAE,EAAE,GADE;AAENrE,QAAAA,cAAc,EAAdA;AAFM,OAAD,CAAP;AAID,KARD,MAQO;AACLkC,MAAAA,OAAO,CAAC,IAAD,CAAP;AACD;AACF,GAZM,CAAP;AAaD,CAdM,C,CAgBP;;;;;AACA,IAAMoC,YAAY,GAAG,SAAfA,YAAe,CAACC,IAAD;AAAA,SAAU,CAACA,IAAI,IAAI,EAAT,EAAaC,UAAb,CAAwB,UAAxB,EAAoC,EAApC,CAAV;AAAA,CAArB,C,CAEA;;;AACA,IAAMC,UAAU,GAAG,SAAbA,UAAa,CAACF,IAAD;AAAA,SAAU,CAACA,IAAI,IAAI,EAAT,EAAaG,OAAb,CAAqB,oCAArB,EAA2D,EAA3D,CAAV;AAAA,CAAnB;;AAEO,IAAMC,QAAQ,GAAG,SAAXA,QAAW,GAA6B;AAAA,MAA5BhC,KAA4B,uEAApB,EAAoB;AAAA,MAAhBiC,MAAgB,uEAAP,EAAO;AACnD,MAAQ7E,MAAR,GAAmB4C,KAAnB,CAAQ5C,MAAR;AACA,0BAAoD6E,MAApD,CAAQC,SAAR;AAAA,MAAQA,SAAR,kCAAoB,CAApB;AAAA,MAAuBC,SAAvB,GAAoDF,MAApD,CAAuBE,SAAvB;AAAA,MAAkCnB,aAAlC,GAAoDiB,MAApD,CAAkCjB,aAAlC;AACA,MAAMoB,MAAM,GAAG,EAAf;AACA,MAAMC,UAAU,GAAG,CAACjF,MAAM,IAAI,EAAX,EAAee,MAAlC;AAEA,GAAC,qBAAD,EAAwB,QAAxB,EAAkC,WAAlC,EAA+CmE,OAA/C,CAAuD,UAACC,KAAD,EAAW;AAAA;;AAChE,QAAI,iBAAAN,MAAM,CAACM,KAAD,CAAN,wDAAeC,QAAf,IAA2B,CAACV,UAAU,CAAC9B,KAAK,CAACuC,KAAD,CAAN,CAA1C,EAA0D;AACxDH,MAAAA,MAAM,CAACG,KAAD,CAAN,GAAgB,yBAAhB;AACD;AACF,GAJD;AAMA,MAAME,cAAc,GAAG,CAACrF,MAAM,IAAI,EAAX,EAAesF,MAAf,CAAsB,UAACC,GAAD,EAAMnF,KAAN;AAAA,WAAiBA,KAAK,CAACE,OAAN,GAAgBiF,GAAG,GAAG,CAAtB,GAA0BA,GAA3C;AAAA,GAAtB,EAAuE,CAAvE,CAAvB;;AAEA,MAAIN,UAAU,GAAGH,SAAjB,EAA4B;AAC1BE,IAAAA,MAAM,CAACQ,WAAP,sCAAiDV,SAAjD;AACD,GAFD,MAEO,IAAIG,UAAU,GAAGF,SAAjB,EAA4B;AACjCC,IAAAA,MAAM,CAACQ,WAAP,0BAAqCT,SAArC;AACD;;AAED,MAAIM,cAAc,GAAG,CAArB,EAAwB;AACtBL,IAAAA,MAAM,CAACS,eAAP,GAAyB,4CAAzB;AACD,GAFD,MAEO,IAAIJ,cAAc,GAAGzB,aAArB,EAAoC;AACzCoB,IAAAA,MAAM,CAACS,eAAP,0BAAyC7B,aAAzC;AACD;;AAED,SAAOoB,MAAP;AACD,CA3BM","sourcesContent":["import debug from 'debug';\nimport isEmpty from 'lodash/isEmpty';\nimport { getFeedbackForCorrectness } from '@pie-lib/pie-toolbox/feedback';\nimport { partialScoring } from '@pie-lib/pie-toolbox/controller-utils';\nimport defaults from './defaults';\n\nconst log = debug('@pie-element:select-text:controller');\n\nconst equalTokens = (token1 = {}, token2 = {}) =>\n (token1?.start === token2?.start && token1?.end === token2?.end) ||\n // this case is used for the cases when the token's start & end were recalculated\n (token1?.start === token2?.oldStart && token1?.end === token2?.oldEnd);\n\nconst normalizeTokens = (tokens = [], selectedTokens = [], evaluateMode = false) =>\n (tokens || []).map((token) => {\n const isCorrect = !!token.correct;\n // search if correct token is missing from session\n const isMissing = isCorrect && !(selectedTokens || []).find((selectedToken) => equalTokens(token, selectedToken));\n\n return {\n ...token,\n correct: evaluateMode ? isCorrect : undefined,\n isMissing: evaluateMode ? isMissing : undefined,\n };\n });\n\nexport const getCorrectness = (tokens, selected) => {\n const correct = tokens.filter((t) => t.correct === true);\n\n if (correct.length === 0) {\n return 'unknown';\n }\n\n const correctSelected = getCorrectSelected(tokens, selected);\n\n if (correctSelected.length === selected.length) {\n if (correctSelected.length === correct.length) {\n return 'correct';\n } else if (correctSelected.length > 0) {\n return 'partially-correct';\n }\n }\n\n if (correctSelected.length > 0) {\n return 'partially-correct';\n }\n\n return 'incorrect';\n};\n\nconst getCorrectSelected = (tokens, selected) =>\n (selected || []).filter((s) => tokens.findIndex((token) => token.correct && equalTokens(token, s)) !== -1);\n\nexport const getPartialScore = (question, session, totalCorrect) => {\n if (!session || isEmpty(session)) {\n return 0;\n }\n\n const correctCount = getCorrectSelected(question.tokens, session.selectedTokens).length;\n const correctTokens = (question.tokens || []).filter((t) => t.correct === true);\n const extraSelected = session.selectedTokens ? session.selectedTokens.length > correctTokens.length : 0;\n const incorrectCount = extraSelected ? session.selectedTokens && session.selectedTokens.length - correctCount : 0;\n const count = correctCount - incorrectCount;\n const positiveCount = count < 0 ? 0 : count;\n\n return totalCorrect.length ? parseFloat((positiveCount / totalCorrect.length).toFixed(2)) : 0;\n};\n\nexport const outcome = (question, session, env) =>\n new Promise((resolve) => {\n if (!session || isEmpty(session)) {\n resolve({ score: 0, empty: true });\n }\n\n session = normalizeSession(session);\n\n if (env.mode !== 'evaluate') {\n resolve({ score: undefined, completed: undefined });\n } else {\n const enabled = partialScoring.enabled(question, env, true);\n const totalCorrect = question.tokens.filter((t) => t.correct);\n const score = getPartialScore(question, session, totalCorrect);\n resolve({\n score: enabled ? score : score === 1 ? 1 : 0,\n });\n }\n });\n\nexport function createDefaultModel(model = {}) {\n return new Promise((resolve) => {\n resolve({ ...defaults, ...model });\n });\n}\n\nexport const normalizeSession = (session) => ({ selectedTokens: [], ...session });\n\nexport const normalize = (question) => ({ ...defaults, ...question });\n\nexport const model = (question, session, env) => {\n session = session || { selectedToken: [] };\n session.selectedTokens = session.selectedTokens || [];\n const normalizedQuestion = normalize(question);\n\n return new Promise((resolve) => {\n log('[model]', 'normalizedQuestion: ', normalizedQuestion);\n log('[model]', 'session: ', session);\n\n const tokens = normalizeTokens(normalizedQuestion.tokens, session.selectedTokens, env.mode === 'evaluate');\n log('[model] tokens:', tokens);\n\n const correctness =\n env.mode === 'evaluate' ? getCorrectness(normalizedQuestion.tokens, session.selectedTokens) : undefined;\n\n const fb =\n env.mode === 'evaluate' && normalizedQuestion.feedbackEnabled\n ? getFeedbackForCorrectness(correctness, normalizedQuestion.feedback)\n : Promise.resolve(undefined);\n\n fb.then((feedback) => {\n const out = {\n tokens,\n highlightChoices: normalizedQuestion.highlightChoices,\n prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,\n text: normalizedQuestion.text,\n tokenizedText: normalizedQuestion.tokenizedText,\n disabled: env.mode !== 'gather',\n maxSelections: normalizedQuestion.maxSelections,\n correctness,\n env,\n feedback,\n incorrect: env.mode === 'evaluate' ? correctness !== 'correct' : undefined,\n language: normalizedQuestion.language,\n extraCSSRules: normalizedQuestion.extraCSSRules,\n };\n\n if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {\n out.rationale = normalizedQuestion.rationaleEnabled ? normalizedQuestion.rationale : null;\n out.teacherInstructions = normalizedQuestion.teacherInstructionsEnabled\n ? normalizedQuestion.teacherInstructions\n : null;\n } else {\n out.rationale = null;\n out.teacherInstructions = null;\n }\n\n resolve(out);\n });\n });\n};\n\nexport const createCorrectResponseSession = (question, env) => {\n return new Promise((resolve) => {\n if (env.mode !== 'evaluate' && env.role === 'instructor') {\n const { tokens } = question;\n const selectedTokens = tokens.filter((t) => t.correct);\n\n resolve({\n id: '1',\n selectedTokens,\n });\n } else {\n resolve(null);\n }\n });\n};\n\n// remove all html tags\nconst getInnerText = (html) => (html || '').replaceAll(/<[^>]*>/g, '');\n\n// remove all html tags except img, iframe and source tag for audio\nconst getContent = (html) => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');\n\nexport const validate = (model = {}, config = {}) => {\n const { tokens } = model;\n const { minTokens = 2, maxTokens, maxSelections } = config;\n const errors = {};\n const nbOfTokens = (tokens || []).length;\n\n ['teacherInstructions', 'prompt', 'rationale'].forEach((field) => {\n if (config[field]?.required && !getContent(model[field])) {\n errors[field] = 'This field is required.';\n }\n });\n\n const nbOfSelections = (tokens || []).reduce((acc, token) => (token.correct ? acc + 1 : acc), 0);\n\n if (nbOfTokens < minTokens) {\n errors.tokensError = `There should be at least ${minTokens} tokens defined.`;\n } else if (nbOfTokens > maxTokens) {\n errors.tokensError = `No more than ${maxTokens} tokens should be defined.`;\n }\n\n if (nbOfSelections < 1) {\n errors.selectionsError = 'There should be at least 1 token selected.';\n } else if (nbOfSelections > maxSelections) {\n errors.selectionsError = `No more than ${maxSelections} tokens should be selected.`;\n }\n\n return errors;\n};\n"],"file":"index.js"}
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@pie-element/select-text-controller",
3
3
  "private": true,
4
- "version": "6.3.0",
4
+ "version": "6.2.10",
5
5
  "description": "",
6
6
  "main": "lib/index.js",
7
7
  "module": "src/index.js",
8
8
  "dependencies": {
9
- "@pie-lib/pie-toolbox": "2.22.1",
9
+ "@pie-lib/pie-toolbox": "2.20.0",
10
10
  "debug": "^3.1.0",
11
11
  "lodash": "^4.17.15"
12
12
  },
@@ -224,52 +224,109 @@ exports.model = (id, element) => {
224
224
  '<p>Select the sentence from&#160;&#34;The Gymnast&#34; that <span class="relative-emphasis">best</span> represents the theme.</p>',
225
225
  rationale:
226
226
  '<p>The final sentence of the passage best exemplifies the theme of the short story because Natasha&#39;s practice and determination finally pays off.</p>',
227
+ // tokens: [
228
+ // {
229
+ // text: 'She thought about what she had to do, struggling to rein in her wild, fearful thoughts.',
230
+ // end: 90,
231
+ // start: 3,
232
+ // correct: false,
233
+ // },
234
+ // {
235
+ // start: 449,
236
+ // end: 585,
237
+ // text: 'Just for a hair of a moment, Natasha wondered if she really wanted a perfect 10, so weary was she of trying for but never achieving one.',
238
+ // correct: false,
239
+ // },
240
+ // {
241
+ // end: 627,
242
+ // correct: false,
243
+ // text: 'At last Natasha\'s moment arrived.',
244
+ // start: 594,
245
+ // },
246
+ // {
247
+ // end: 743,
248
+ // text: 'The faces of past giants of gymnastics swam before her mind\'s eye, now razor&#8211;sharp with fierce determination.',
249
+ // correct: false,
250
+ // start: 628,
251
+ // },
252
+ // {
253
+ // text: 'Suddenly, the din of the gymnasium was silent to her.',
254
+ // end: 997,
255
+ // correct: false,
256
+ // start: 944,
257
+ // },
258
+ // {
259
+ // end: 1087,
260
+ // start: 998,
261
+ // correct: false,
262
+ // text: 'Forcing all sound out of her mind, she focused on the gleaming balance beam ahead of her.',
263
+ // },
264
+ // {
265
+ // correct: true,
266
+ // start: 1088,
267
+ // end: 1225,
268
+ // text: 'Taking a deep breath, Natasha made her graceful, yet powerful approach, mounted the beam flawlessly, and...executed her first perfect 10.',
269
+ // },
270
+ // ],
271
+ // "element": "select-text",
272
+ // text: '<p>She thought about what she had to do, struggling to rein in her wild, fearful thoughts. Coach Cummings always said that an undisciplined mind never scored a perfect 10. Natasha wanted to please her Coach, yet sometimes his approval wasn\'t as exciting as his anger. The gymnasts were unanimous about one thing: Coach Cummings\'s fits of disapproving rage were much more humorous to witness than his infrequent, backslapping moments of high praise. Just for a hair of a moment, Natasha wondered if she really wanted a perfect 10, so weary was she of trying for but never achieving one.</p>\n\n<p>At last Natasha\'s moment arrived. The faces of past giants of gymnastics swam before her mind\'s eye, now razor&#8211;sharp with fierce determination. "I am talented. I am not afraid. I will make a perfect 10," she spoke aloud to herself, as she approached the mat, dusted her hands with chalk to prevent slippage, and returned to her starting point. Suddenly, the din of the gymnasium was silent to her. Forcing all sound out of her mind, she focused on the gleaming balance beam ahead of her. Taking a deep breath, Natasha made her graceful, yet powerful approach, mounted the beam flawlessly, and...executed her first perfect 10.</p>\n',
227
273
  tokens: [
228
- {
229
- text: 'She thought about what she had to do, struggling to rein in her wild, fearful thoughts.',
230
- end: 90,
231
- start: 3,
232
- correct: false,
233
- },
234
- {
235
- start: 449,
236
- end: 585,
237
- text: 'Just for a hair of a moment, Natasha wondered if she really wanted a perfect 10, so weary was she of trying for but never achieving one.',
238
- correct: false,
239
- },
240
- {
241
- end: 627,
242
- correct: false,
243
- text: "At last Natasha's moment arrived.",
244
- start: 594,
245
- },
246
- {
247
- end: 743,
248
- text: "The faces of past giants of gymnastics swam before her mind's eye, now razor&#8211;sharp with fierce determination.",
249
- correct: false,
250
- start: 628,
251
- },
252
- {
253
- text: 'Suddenly, the din of the gymnasium was silent to her.',
254
- end: 997,
255
- correct: false,
256
- start: 944,
257
- },
258
- {
259
- end: 1087,
260
- start: 998,
261
- correct: false,
262
- text: 'Forcing all sound out of her mind, she focused on the gleaming balance beam ahead of her.',
263
- },
264
- {
265
- correct: true,
266
- start: 1088,
267
- end: 1225,
268
- text: 'Taking a deep breath, Natasha made her graceful, yet powerful approach, mounted the beam flawlessly, and...executed her first perfect 10.',
269
- },
274
+ // {
275
+ // id: '0-30-1751440197593',
276
+ // quote: 'She thought about what she had',
277
+ // start: 0,
278
+ // end: 30,
279
+ // },
280
+ // {
281
+ // id: '185-206-1751440199435',
282
+ // quote: 'o please her Coach, y',
283
+ // start: 185,
284
+ // end: 206,
285
+ // },
286
+ // {
287
+ // id: '356-379-1751440202337',
288
+ // quote: 'e much more humorous to',
289
+ // start: 356,
290
+ // end: 379,
291
+ // },
292
+ // {
293
+ // id: '0-88-1751443110733',
294
+ // quote: 'She thought about what she had to do, struggling to rein in her wild, fearful thoughts. ',
295
+ // start: 0,
296
+ // end: 88,
297
+ // },
298
+ // {
299
+ // id: '590-607-1751443116013',
300
+ // quote: "Át last Ñatasha's",
301
+ // start: 590,
302
+ // end: 607,
303
+ // },
304
+ // {
305
+ // id: '624-641-1751443118643',
306
+ // quote: 'The faces of past',
307
+ // start: 624,
308
+ // end: 641,
309
+ // },
310
+ // {
311
+ // id: '1223-1231-1751443121777',
312
+ // quote: 'header 2',
313
+ // start: 1223,
314
+ // end: 1231,
315
+ // },
316
+ // {
317
+ // id: '358-376-1751443129379',
318
+ // quote: '»»» were much more',
319
+ // start: 358,
320
+ // end: 376,
321
+ // },
322
+ // {
323
+ // id: '137-154-1751443132310',
324
+ // quote: 'mind never scored',
325
+ // start: 137,
326
+ // end: 154,
327
+ // },
270
328
  ],
271
- // "element": "select-text",
272
- text: "<p>She thought about what she had to do, struggling to rein in her wild, fearful thoughts. Coach Cummings always said that an undisciplined mind never scored a perfect 10. Natasha wanted to please her Coach, yet sometimes his approval wasn't as exciting as his anger. The gymnasts were unanimous about one thing: Coach Cummings's fits of disapproving rage were much more humorous to witness than his infrequent, backslapping moments of high praise. Just for a hair of a moment, Natasha wondered if she really wanted a perfect 10, so weary was she of trying for but never achieving one.</p>\n\n<p>At last Natasha's moment arrived. The faces of past giants of gymnastics swam before her mind's eye, now razor&#8211;sharp with fierce determination. \"I am talented. I am not afraid. I will make a perfect 10,\" she spoke aloud to herself, as she approached the mat, dusted her hands with chalk to prevent slippage, and returned to her starting point. Suddenly, the din of the gymnasium was silent to her. Forcing all sound out of her mind, she focused on the gleaming balance beam ahead of her. Taking a deep breath, Natasha made her graceful, yet powerful approach, mounted the beam flawlessly, and...executed her first perfect 10.</p>\n",
329
+ text: '<p>She thought about what she had to do, <u>struggling to rein</u> in her wild, <b>fearful thoughts</b>. Coach Cummings always said that an undisciplined mind <sup>never scored </sup>a perfect 10. Natasha €€€ wanted to please her Coach, yet sometimes his approval wasn&#x27;t as exciting as his anger. The gymnasts were unanimous about one thing: Coach Cummings&#x27;s fits of disapproving rage »»» were much more humorous to witness than his infrequent, backslapping moments of high praise. Just for a hair of a moment, Natasha wondered if she really wanted a perfect 10, so weary was she of trying for but never achieving one</p><p><em>Át last Ñatasha&#x27;s moment arrived.</em> The <s>faces</s> of past giants of gymnastics swam before her mind&#x27;s eye, now razor–sharp with fierce determination. &quot;I am talented. I am not afraid. I will make a perfect 10,&quot; she spoke aloud to herself, as she approached the mat, dusted her hands with chalk to prevent slippage, and returned to her starting point. Suddenly, the din of the gymnasium was silent to her. Forcing all sound out of her mind, she focused on the gleaming balance beam ahead of her. Taking a deep breath, Natasha made her graceful, yet powerful approach, mounted the beam flawlessly, and...executed her first perfect 10.</p><p></p><table border="1"><tbody><tr><td><p>header 1</p></td><td><p>header 2</p></td></tr><tr><td><p>row </p></td><td><p>row</p></td></tr></tbody></table><div></div>',
273
330
  rubricEnabled: false,
274
331
  }),
275
332
  );
@@ -0,0 +1,11 @@
1
+ {
2
+ "hash": "-2043355302",
3
+ "info": [
4
+ {
5
+ "pie": "@pie-element/select-text",
6
+ "version": {
7
+ "requested": "latest"
8
+ }
9
+ }
10
+ ]
11
+ }
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _ = _interopRequireDefault(require(".."));
6
+
7
+ var _react = _interopRequireDefault(require("react"));
8
+
9
+ var _reactDom = _interopRequireDefault(require("react-dom"));
10
+
11
+ var _piePlayerEvents = require("@pie-framework/pie-player-events");
12
+
13
+ var _mathRendering = require("@pie-lib/pie-toolbox/math-rendering");
14
+
15
+ jest.mock('@pie-lib/pie-toolbox/math-rendering', function () {
16
+ return {
17
+ renderMath: jest.fn()
18
+ };
19
+ });
20
+ jest.mock('../main', function () {
21
+ return jest.fn();
22
+ });
23
+ jest.mock('react', function () {
24
+ return {
25
+ createElement: jest.fn()
26
+ };
27
+ });
28
+ jest.mock('react-dom', function () {
29
+ return {
30
+ render: jest.fn(function (r, el, cb) {
31
+ cb();
32
+ })
33
+ };
34
+ });
35
+ describe('select-text', function () {
36
+ var c;
37
+ beforeEach(function () {
38
+ c = new _["default"]();
39
+ c.dispatchEvent = jest.fn();
40
+ c.tagName = 'select-text';
41
+ c.model = {};
42
+ c.session = {};
43
+ });
44
+ describe('init', function () {
45
+ it('calls createElement', function () {
46
+ expect(_react["default"].createElement).toBeCalled();
47
+ });
48
+ it('calls render', function () {
49
+ expect(_reactDom["default"].render).toBeCalledWith(undefined, expect.anything(), expect.any(Function));
50
+ });
51
+ it('calls renderMath', function () {
52
+ expect(_mathRendering.renderMath).toHaveBeenCalled();
53
+ });
54
+ });
55
+ describe('isSessionComplete', function () {
56
+ it('returns true for non empty selectedTokens', function () {
57
+ c.session = {
58
+ selectedTokens: [{
59
+ start: 0,
60
+ end: 1,
61
+ text: 'f'
62
+ }]
63
+ };
64
+ expect(c.isSessionComplete()).toEqual(true);
65
+ });
66
+ it('returns false for empty selectedTokens', function () {
67
+ c.session = {
68
+ selectedTokens: []
69
+ };
70
+ expect(c.isSessionComplete()).toEqual(false);
71
+ });
72
+ });
73
+ describe('selectionChanged', function () {
74
+ var newTokens;
75
+ beforeEach(function () {
76
+ newTokens = [{
77
+ start: 2,
78
+ end: 3,
79
+ text: 'f'
80
+ }];
81
+ c.selectionChanged(newTokens);
82
+ });
83
+ it('sets the tokens', function () {
84
+ expect(c._session.selectedTokens).toEqual(newTokens);
85
+ });
86
+ it('calls dispatchEvent', function () {
87
+ expect(c.dispatchEvent).toBeCalledWith(new _piePlayerEvents.SessionChangedEvent('select-text', true));
88
+ });
89
+ });
90
+ });
91
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vaW5kZXgudGVzdC5qcyJdLCJuYW1lcyI6WyJqZXN0IiwibW9jayIsInJlbmRlck1hdGgiLCJmbiIsImNyZWF0ZUVsZW1lbnQiLCJyZW5kZXIiLCJyIiwiZWwiLCJjYiIsImRlc2NyaWJlIiwiYyIsImJlZm9yZUVhY2giLCJTZWxlY3RUZXh0IiwiZGlzcGF0Y2hFdmVudCIsInRhZ05hbWUiLCJtb2RlbCIsInNlc3Npb24iLCJpdCIsImV4cGVjdCIsIlJlYWN0IiwidG9CZUNhbGxlZCIsIlJlYWN0RE9NIiwidG9CZUNhbGxlZFdpdGgiLCJ1bmRlZmluZWQiLCJhbnl0aGluZyIsImFueSIsIkZ1bmN0aW9uIiwidG9IYXZlQmVlbkNhbGxlZCIsInNlbGVjdGVkVG9rZW5zIiwic3RhcnQiLCJlbmQiLCJ0ZXh0IiwiaXNTZXNzaW9uQ29tcGxldGUiLCJ0b0VxdWFsIiwibmV3VG9rZW5zIiwic2VsZWN0aW9uQ2hhbmdlZCIsIl9zZXNzaW9uIiwiU2Vzc2lvbkNoYW5nZWRFdmVudCJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOztBQUNBQSxJQUFJLENBQUNDLElBQUwsQ0FBVSxxQ0FBVixFQUFpRDtBQUFBLFNBQU87QUFDdERDLElBQUFBLFVBQVUsRUFBRUYsSUFBSSxDQUFDRyxFQUFMO0FBRDBDLEdBQVA7QUFBQSxDQUFqRDtBQUdBSCxJQUFJLENBQUNDLElBQUwsQ0FBVSxTQUFWLEVBQXFCO0FBQUEsU0FBTUQsSUFBSSxDQUFDRyxFQUFMLEVBQU47QUFBQSxDQUFyQjtBQUVBSCxJQUFJLENBQUNDLElBQUwsQ0FBVSxPQUFWLEVBQW1CO0FBQUEsU0FBTztBQUN4QkcsSUFBQUEsYUFBYSxFQUFFSixJQUFJLENBQUNHLEVBQUw7QUFEUyxHQUFQO0FBQUEsQ0FBbkI7QUFJQUgsSUFBSSxDQUFDQyxJQUFMLENBQVUsV0FBVixFQUF1QjtBQUFBLFNBQU87QUFDNUJJLElBQUFBLE1BQU0sRUFBRUws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QztBQUNELEtBRkMsQ0FBRjtBQUlBakIsSUFBQUEsRUFBRSxDQUFDLHFCQUFELEVBQXdCLFlBQU07QUFDOUJDLE1BQUFBLE1BQU0sQ0FBQ1IsQ0FBQyxDQUFDRyxhQUFILENBQU4sQ0FBd0JTLGNBQXhCLENBQXVDLElBQUllLG9DQUFKLENBQXdCLGFBQXhCLEVBQXVDLElBQXZDLENBQXZDO0FBQ0QsS0FGQyxDQUFGO0FBR0QsR0FkTyxDQUFSO0FBZUQsQ0FsRE8sQ0FBUiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBTZWxlY3RUZXh0IGZyb20gJy4uJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUmVhY3RET00gZnJvbSAncmVhY3QtZG9tJztcbmltcG9ydCB7IFNlc3Npb25DaGFuZ2VkRXZlbnQgfSBmcm9tICdAcGllLWZyYW1ld29yay9waWUtcGxheWVyLWV2ZW50cyc7XG5cbmltcG9ydCB7IHJlbmRlck1hdGggfSBmcm9tICdAcGllLWxpYi9waWUtdG9vbGJveC9tYXRoLXJlbmRlcmluZyc7XG5qZXN0Lm1vY2soJ0BwaWUtbGliL3BpZS10b29sYm94L21hdGgtcmVuZGVyaW5nJywgKCkgPT4gKHtcbiAgcmVuZGVyTWF0aDogamVzdC5mbigpLFxufSkpO1xuamVzdC5tb2NrKCcuLi9tYWluJywgKCkgPT4gamVzdC5mbigpKTtcblxuamVzdC5tb2NrKCdyZWFjdCcsICgpID0+ICh7XG4gIGNyZWF0ZUVsZW1lbnQ6IGplc3QuZm4oKSxcbn0pKTtcblxuamVzdC5tb2NrKCdyZWFjdC1kb20nLCAoKSA9PiAoe1xuICByZW5kZXI6IGplc3QuZm4oKHIsIGVsLCBjYikgPT4ge1xuICAgIGNiKCk7XG4gIH0pLFxufSkpO1xuXG5kZXNjcmliZSgnc2VsZWN0LXRleHQnLCAoKSA9PiB7XG4gIGxldCBjO1xuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBjID0gbmV3IFNlbGVjdFRleHQoKTtcbiAgICBjLmRpc3BhdGNoRXZlbnQgPSBqZXN0LmZuKCk7XG4gICAgYy50YWdOYW1lID0gJ3NlbGVjdC10ZXh0JztcbiAgICBjLm1vZGVsID0ge307XG4gICAgYy5zZXNzaW9uID0ge307XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpbml0JywgKCkgPT4ge1xuICAgIGl0KCdjYWxscyBjcmVhdGVFbGVtZW50JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KFJlYWN0LmNyZWF0ZUVsZW1lbnQpLnRvQmVDYWxsZWQoKTtcbiAgICB9KTtcbiAgICBpdCgnY2FsbHMgcmVuZGVyJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KFJlYWN0RE9NLnJlbmRlcikudG9CZUNhbGxlZFdpdGgodW5kZWZpbmVkLCBleHBlY3QuYW55dGhpbmcoKSwgZXhwZWN0LmFueShGdW5jdGlvbikpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NhbGxzIHJlbmRlck1hdGgnLCAoKSA9PiB7XG4gICAgICBleHBlY3QocmVuZGVyTWF0aCkudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaXNTZXNzaW9uQ29tcGxldGUnLCAoKSA9PiB7XG4gICAgaXQoJ3JldHVybnMgdHJ1ZSBmb3Igbm9uIGVtcHR5IHNlbGVjdGVkVG9rZW5zJywgKCkgPT4ge1xuICAgICAgYy5zZXNzaW9uID0geyBzZWxlY3RlZFRva2VuczogW3sgc3RhcnQ6IDAsIGVuZDogMSwgdGV4dDogJ2YnIH1dIH07XG4gICAgICBleHBlY3QoYy5pc1Nlc3Npb25Db21wbGV0ZSgpKS50b0VxdWFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgZmFsc2UgZm9yIGVtcHR5IHNlbGVjdGVkVG9rZW5zJywgKCkgPT4ge1xuICAgICAgYy5zZXNzaW9uID0geyBzZWxlY3RlZFRva2VuczogW10gfTtcbiAgICAgIGV4cGVjdChjLmlzU2Vzc2lvbkNvbXBsZXRlKCkpLnRvRXF1YWwoZmFsc2UpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2VsZWN0aW9uQ2hhbmdlZCcsICgpID0+IHtcbiAgICBsZXQgbmV3VG9rZW5zO1xuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgbmV3VG9rZW5zID0gW3sgc3RhcnQ6IDIsIGVuZDogMywgdGV4dDogJ2YnIH1dO1xuICAgICAgYy5zZWxlY3Rpb25DaGFuZ2VkKG5ld1Rva2Vucyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2V0cyB0aGUgdG9rZW5zJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGMuX3Nlc3Npb24uc2VsZWN0ZWRUb2tlbnMpLnRvRXF1YWwobmV3VG9rZW5zKTtcbiAgICB9KTtcblxuICAgIGl0KCdjYWxscyBkaXNwYXRjaEV2ZW50JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGMuZGlzcGF0Y2hFdmVudCkudG9CZUNhbGxlZFdpdGgobmV3IFNlc3Npb25DaGFuZ2VkRXZlbnQoJ3NlbGVjdC10ZXh0JywgdHJ1ZSkpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
6
+
7
+ var _enzyme = require("enzyme");
8
+
9
+ var _react = _interopRequireDefault(require("react"));
10
+
11
+ var _main = require("../main");
12
+
13
+ jest.mock('@pie-lib/pie-toolbox/text-select', function () {
14
+ return {
15
+ prepareText: jest.fn()
16
+ };
17
+ });
18
+ describe('main', function () {
19
+ var getWrapper = function getWrapper(props) {
20
+ return (0, _enzyme.shallow)( /*#__PURE__*/_react["default"].createElement(_main.Main, (0, _extends2["default"])({
21
+ onSelectionChange: jest.fn(),
22
+ model: {
23
+ text: 'foo',
24
+ tokens: [{
25
+ start: 0,
26
+ end: 1,
27
+ text: 'f'
28
+ }]
29
+ },
30
+ session: {
31
+ selectedTokens: [{
32
+ start: 0,
33
+ end: 1,
34
+ text: 'f'
35
+ }]
36
+ },
37
+ classes: {}
38
+ }, props)));
39
+ };
40
+
41
+ describe('snapshot', function () {
42
+ it('renders', function () {
43
+ var w = getWrapper();
44
+ expect(w).toMatchSnapshot();
45
+ });
46
+ it('renders rationale', function () {
47
+ var w = getWrapper({
48
+ rationale: 'This is rationale '
49
+ });
50
+ expect(w).toMatchSnapshot();
51
+ });
52
+ it('renders showCorrect', function () {
53
+ var w = getWrapper();
54
+ w.instance().toggleShowCorrect();
55
+ expect(w).toMatchSnapshot();
56
+ });
57
+ });
58
+ describe('logic', function () {
59
+ var w;
60
+ beforeEach(function () {
61
+ w = getWrapper();
62
+ });
63
+ it('shows correct answer', function () {
64
+ var correctTokens = [{
65
+ start: 0,
66
+ end: 1,
67
+ text: 'f',
68
+ correct: true,
69
+ oldStart: 0,
70
+ oldEnd: 1
71
+ }];
72
+ w.setProps({
73
+ model: {
74
+ text: 'foo',
75
+ tokens: correctTokens
76
+ }
77
+ });
78
+ var result = w.instance().correctAnswer();
79
+ expect(result).toEqual(correctTokens);
80
+ });
81
+ });
82
+ });
83
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fX3Rlc3RzX18vbWFpbi50ZXN0LmpzeCJdLCJuYW1lcyI6WyJqZXN0IiwibW9jayIsInByZXBhcmVUZXh0IiwiZm4iLCJkZXNjcmliZSIsImdldFdyYXBwZXIiLCJwcm9wcyIsInRleHQiLCJ0b2tlbnMiLCJzdGFydCIsImVuZCIsInNlbGVjdGVkVG9rZW5zIiwiaXQiLCJ3IiwiZXhwZWN0IiwidG9NYXRjaFNuYXBzaG90IiwicmF0aW9uYWxlIiwiaW5zdGFuY2UiLCJ0b2dnbGVTaG93Q29ycmVjdCIsImJlZm9yZUVhY2giLCJjb3JyZWN0VG9rZW5zIiwiY29ycmVjdCIsIm9sZFN0YXJ0Iiwib2xkRW5kIiwic2V0UHJvcHMiLCJtb2RlbCIsInJlc3VsdCIsImNvcnJlY3RBbnN3ZXIiLCJ0b0VxdWFsIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFFQUEsSUFBSSxDQUFDQyxJQUFMLENBQVUsa0NBQVYsRUFBOEM7QUFBQSxTQUFPO0FBQ25EQyxJQUFBQSxXQUFXLEVBQUVGLElBQUksQ0FBQ0csRUFBTDtBQURzQyxHQUFQO0FBQUEsQ0FBOUM7QUFJQUMsUUFBUSxDQUFDLE1BQUQsRUFBUyxZQUFNO0FBQ3JCLE1BQU1DLFVBQVUsR0FBRyxTQUFiQSxVQUFhLENBQUNDLEtBQUQsRUFBVztBQUM1QixXQUFPLG1DQUNMLGdDQUFDLFVBQUQ7QUFDRSxNQUFBLGlCQUFpQixFQUFFTixJQUFJLENBQUNHLEVBQUwsRUFEckI7QUFFRSxNQUFBLEtBQUssRUFBRTtBQUNMSSxRQUFBQSxJQUFJLEVBQUUsS0FERDtBQUVMQyxRQUFBQSxNQUFNLEVBQUUsQ0FBQztBQUFFQyxVQUFBQSxLQUFLLEVBQUUsQ0FBVDtBQUFZQyxVQUFBQSxHQUFHLEVBQUUsQ0FBakI7QUFBb0JILFVBQUFBLElBQUksRUFBRTtBQUExQixTQUFEO0FBRkgsT0FGVDtBQU1FLE1BQUEsT0FBTyxFQUFFO0FBQ1BJLFFBQUFBLGNBQWMsRUFBRSxDQUFDO0FBQUVGLFVBQUFBLEtBQUssRUFBRSxDQUFUO0FBQVlDLFVBQUFBLEdBQUcsRUFBRSxDQUFqQjtBQUFvQkgsVUFBQUEsSUFBSSxFQUFFO0FBQTFCLFNBQUQ7QUFEVCxPQU5YO0FBU0UsTUFBQSxPQUFPLEVBQUU7QUFUWCxPQVVNRCxLQVZOLEVBREssQ0FBUDtBQWNELEdBZkQ7O0FBaUJBRixFQUFBQSxRQUFRLENBQUMsVUFBRCxFQUFhLFlBQU07QUFDekJRLElBQUFBLEVBQUUsQ0FBQyxTQUFELEVBQVksWUFBTTtBQUNsQixVQUFNQyxDQUFDLEdBQUdSLFVBQVUsRUFBcEI7QUFDQVMsTUFBQUEsTUFBTSxDQUFDRCxDQUFELENBQU4sQ0FBVUUsZUFBVjtBQUNELEtBSEMsQ0FBRjtBQUtBSCxJQUFBQSxFQUFFLENBQUMsbUJBQUQsRUFBc0IsWUFBTTtBQUM1QixVQUFNQyxDQUFDLEdBQUdSLFVBQVUsQ0FBQztBQUFFVyxRQUFBQSxTQUFTLEVBQUU7QUFBYixPQUFELENBQXBCO0FBQ0FGLE1BQUFBLE1BQU0sQ0FBQ0QsQ0FBRCxDQUFOLENBQVVFLGVBQVY7QUFDRCxLQUhDLENBQUY7QUFLQUgsSUFBQUEsRUFBRSxDQUFDLHFCQUFELEVBQXdCLFlBQU07QUFDOUIsVUFBTUMsQ0FBQyxHQUFHUixVQUFVLEVBQXBCO0FBQ0FRLE1BQUFBLENBQUMsQ0FBQ0ksUUFBRixHQUFhQyxpQkFBYjtBQUNBSixNQUFBQSxNQUFNLENBQUNELENBQUQsQ0FBTixDQUFVRSxlQUFWO0FBQ0QsS0FKQyxDQUFGO0FBS0QsR0FoQk8sQ0FBUjtBQWtCQVgsRUFBQUEsUUFBUSxDQUFDLE9BQUQsRUFBVSxZQUFNO0FBQ3RCLFFBQUlTLENBQUo7QUFFQU0sSUFBQUEsVUFBVSxDQUFDLFlBQU07QUFDZk4sTUFBQUEsQ0FBQyxHQUFHUixVQUFVLEVBQWQ7QUFDRCxLQUZTLENBQVY7QUFJQU8sSUFBQUEsRUFBRSxDQUFDLHNCQUFELEVBQXlCLFlBQU07QUFDL0IsVUFBTVEsYUFBYSxHQUFHLENBQUM7QUFBRVgsUUFBQUEsS0FBSyxFQUFFLENBQVQ7QUFBWUMsUUFBQUEsR0FBRyxFQUFFLENBQWpCO0FBQW9CSCxRQUFBQSxJQUFJLEVBQUUsR0FBMUI7QUFBK0JjLFFBQUFBLE9BQU8sRUFBRSxJQUF4QztBQUE4Q0MsUUFBQUEsUUFBUSxFQUFFLENBQXhEO0FBQTJEQyxRQUFBQSxNQUFNLEVBQUU7QUFBbkUsT0FBRCxDQUF0QjtBQUNBVixNQUFBQSxDQUFDLENBQUNXLFFBQUYsQ0FBVztBQUNUQyxRQUFBQSxLQUFLLEVBQUU7QUFBRWxCLFVBQUFBLElBQUksRUFBRSxLQUFSO0FBQWVDLFVBQUFBLE1BQU0sRUFBRVk7QUFBdkI7QUFERSxPQUFYO0FBR0EsVUFBTU0sTUFBTSxHQUFHYixDQUFDLENBQUNJLFFBQUYsR0FBYVUsYUFBYixFQUFmO0FBQ0FiLE1BQUFBLE1BQU0sQ0FBQ1ksTUFBRCxDQUFOLENBQWVFLE9BQWYsQ0FBdUJSLGFBQXZCO0FBQ0QsS0FQQyxDQUFGO0FBUUQsR0FmTyxDQUFSO0FBZ0JELENBcERPLENBQVIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzaGFsbG93IH0gZnJvbSAnZW56eW1lJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBNYWluIH0gZnJvbSAnLi4vbWFpbic7XG5cbmplc3QubW9jaygnQHBpZS1saWIvcGllLXRvb2xib3gvdGV4dC1zZWxlY3QnLCAoKSA9PiAoe1xuICBwcmVwYXJlVGV4dDogamVzdC5mbigpLFxufSkpO1xuXG5kZXNjcmliZSgnbWFpbicsICgpID0+IHtcbiAgY29uc3QgZ2V0V3JhcHBlciA9IChwcm9wcykgPT4ge1xuICAgIHJldHVybiBzaGFsbG93KFxuICAgICAgPE1haW5cbiAgICAgICAgb25TZWxlY3Rpb25DaGFuZ2U9e2plc3QuZm4oKX1cbiAgICAgICAgbW9kZWw9e3tcbiAgICAgICAgICB0ZXh0OiAnZm9vJyxcbiAgICAgICAgICB0b2tlbnM6IFt7IHN0YXJ0OiAwLCBlbmQ6IDEsIHRleHQ6ICdmJyB9XSxcbiAgICAgICAgfX1cbiAgICAgICAgc2Vzc2lvbj17e1xuICAgICAgICAgIHNlbGVjdGVkVG9rZW5zOiBbeyBzdGFydDogMCwgZW5kOiAxLCB0ZXh0OiAnZicgfV0sXG4gICAgICAgIH19XG4gICAgICAgIGNsYXNzZXM9e3t9fVxuICAgICAgICB7Li4ucHJvcHN9XG4gICAgICAvPixcbiAgICApO1xuICB9O1xuXG4gIGRlc2NyaWJlKCdzbmFwc2hvdCcsICgpID0+IHtcbiAgICBpdCgncmVuZGVycycsICgpID0+IHtcbiAgICAgIGNvbnN0IHcgPSBnZXRXcmFwcGVyKCk7XG4gICAgICBleHBlY3QodykudG9NYXRjaFNuYXBzaG90KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyByYXRpb25hbGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB3ID0gZ2V0V3JhcHBlcih7IHJhdGlvbmFsZTogJ1RoaXMgaXMgcmF0aW9uYWxlICcgfSk7XG4gICAgICBleHBlY3QodykudG9NYXRjaFNuYXBzaG90KCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBzaG93Q29ycmVjdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHcgPSBnZXRXcmFwcGVyKCk7XG4gICAgICB3Lmluc3RhbmNlKCkudG9nZ2xlU2hvd0NvcnJlY3QoKTtcbiAgICAgIGV4cGVjdCh3KS50b01hdGNoU25hcHNob3QoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2xvZ2ljJywgKCkgPT4ge1xuICAgIGxldCB3O1xuXG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICB3ID0gZ2V0V3JhcHBlcigpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3dzIGNvcnJlY3QgYW5zd2VyJywgKCkgPT4ge1xuICAgICAgY29uc3QgY29ycmVjdFRva2VucyA9IFt7IHN0YXJ0OiAwLCBlbmQ6IDEsIHRleHQ6ICdmJywgY29ycmVjdDogdHJ1ZSwgb2xkU3RhcnQ6IDAsIG9sZEVuZDogMSB9XTtcbiAgICAgIHcuc2V0UHJvcHMoe1xuICAgICAgICBtb2RlbDogeyB0ZXh0OiAnZm9vJywgdG9rZW5zOiBjb3JyZWN0VG9rZW5zIH0sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHcuaW5zdGFuY2UoKS5jb3JyZWN0QW5zd2VyKCk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKGNvcnJlY3RUb2tlbnMpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
package/lib/main.js CHANGED
@@ -35,6 +35,8 @@ var _styles = require("@material-ui/core/styles");
35
35
 
36
36
  var _utils = _interopRequireDefault(require("./utils"));
37
37
 
38
+ var _classnames = _interopRequireDefault(require("classnames"));
39
+
38
40
  var _debug = _interopRequireDefault(require("debug"));
39
41
 
40
42
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
@@ -73,9 +75,26 @@ var Main = /*#__PURE__*/function (_React$Component) {
73
75
  return t.correct;
74
76
  });
75
77
  });
78
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "initializeTokenizedText", function (html, onClick) {
79
+ var classes = _this.props.classes;
80
+ var container = document.createElement('div');
81
+ container.innerHTML = html;
82
+ var spans = container.querySelectorAll('span');
83
+ spans.forEach(function (span) {
84
+ span.className = (0, _classnames["default"])(classes.token); // span.addEventListener('click', (e) => onClick(e));
85
+ });
86
+ return container.innerHTML;
87
+ });
88
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleTokenClick", function (event) {
89
+ console.log('event click', event.target.id);
90
+ event.target.classList.toggle('selected');
91
+ });
76
92
  _this.state = {
77
93
  showCorrectAnswer: _this.props.model.alwaysShowCorrect || false,
78
- model: (0, _utils["default"])(props.model)
94
+ model: _objectSpread(_objectSpread({}, (0, _utils["default"])(props.model)), {}, {
95
+ tokenizedText: _this.initializeTokenizedText(props.model.tokenizedText || props.model.text, _this.handleTokenClick)
96
+ }),
97
+ selectedTokens: []
79
98
  };
80
99
  return _this;
81
100
  }
@@ -85,7 +104,9 @@ var Main = /*#__PURE__*/function (_React$Component) {
85
104
  value: function UNSAFE_componentWillReceiveProps(nextProps) {
86
105
  this.setState({
87
106
  showCorrectAnswer: !!nextProps.model.alwaysShowCorrect,
88
- model: (0, _utils["default"])(nextProps.model)
107
+ model: _objectSpread(_objectSpread({}, (0, _utils["default"])(nextProps.model)), {}, {
108
+ tokenizedText: this.initializeTokenizedText(nextProps.model.tokenizedText || nextProps.model.text, this.handleTokenClick)
109
+ })
89
110
  });
90
111
  }
91
112
  }, {
@@ -135,7 +156,7 @@ var Main = /*#__PURE__*/function (_React$Component) {
135
156
  }), /*#__PURE__*/_react["default"].createElement(_textSelect.TextSelect, {
136
157
  className: classes.textSelect,
137
158
  disabled: model.disabled,
138
- text: model.text,
159
+ text: model.tokenizedText || model.text,
139
160
  tokens: model.tokens,
140
161
  selectedTokens: selectedTokens,
141
162
  onChange: function onChange(selection) {
@@ -158,8 +179,7 @@ var Main = /*#__PURE__*/function (_React$Component) {
158
179
  maxNoOfSelections: model.maxSelections,
159
180
  animationsDisabled: model.animationsDisabled
160
181
  }), mode === 'evaluate' && /*#__PURE__*/_react["default"].createElement(_textSelect.Legend, {
161
- language: model.language,
162
- showOnlyCorrect: showCorrectAnswer
182
+ language: model.language
163
183
  }), showRationale && (!model.animationsDisabled ? /*#__PURE__*/_react["default"].createElement(_renderUi.Collapsible, {
164
184
  labels: {
165
185
  hidden: 'Show Rationale',
@@ -203,6 +223,20 @@ var StyledMain = (0, _styles.withStyles)(function (theme) {
203
223
  },
204
224
  collapsible: {
205
225
  marginBottom: theme.spacing.unit * 2
226
+ },
227
+ token: {
228
+ position: 'relative',
229
+ cursor: 'pointer',
230
+ border: 'dashed 2px grey',
231
+ lineHeight: '24px',
232
+ // backgroundColor: '#fff9c4',
233
+ '&:hover': {
234
+ backgroundColor: '#9fa8da'
235
+ },
236
+ '&.selected': {
237
+ backgroundColor: '#9fa8da',
238
+ border: 'none'
239
+ }
206
240
  }
207
241
  };
208
242
  })(Main);
@@ -261,4 +295,4 @@ var Stateful = /*#__PURE__*/function (_React$Component2) {
261
295
 
262
296
  exports["default"] = Stateful;
263
297
  (0, _defineProperty2["default"])(Stateful, "propTypes", Types);
264
- //# sourceMappingURL=main.js.map
298
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9tYWluLmpzeCJdLCJuYW1lcyI6WyJsb2ciLCJUeXBlcyIsIm1vZGVsIiwiUHJvcFR5cGVzIiwib2JqZWN0Iiwic2Vzc2lvbiIsIm9uU2VsZWN0aW9uQ2hhbmdlIiwiZnVuYyIsImlzUmVxdWlyZWQiLCJNYWluIiwicHJvcHMiLCJzZXRTdGF0ZSIsInNob3dDb3JyZWN0QW5zd2VyIiwic3RhdGUiLCJ0b2tlbnMiLCJmaWx0ZXIiLCJ0IiwiY29ycmVjdCIsImh0bWwiLCJvbkNsaWNrIiwiY2xhc3NlcyIsImNvbnRhaW5lciIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsImlubmVySFRNTCIsInNwYW5zIiwicXVlcnlTZWxlY3RvckFsbCIsImZvckVhY2giLCJzcGFuIiwiY2xhc3NOYW1lIiwidG9rZW4iLCJldmVudCIsImNvbnNvbGUiLCJ0YXJnZXQiLCJpZCIsImNsYXNzTGlzdCIsInRvZ2dsZSIsImFsd2F5c1Nob3dDb3JyZWN0IiwidG9rZW5pemVkVGV4dCIsImluaXRpYWxpemVUb2tlbml6ZWRUZXh0IiwidGV4dCIsImhhbmRsZVRva2VuQ2xpY2siLCJzZWxlY3RlZFRva2VucyIsIm5leHRQcm9wcyIsImVudiIsImV4dHJhQ1NTUnVsZXMiLCJtb2RlIiwiY29ycmVjdEFuc3dlciIsInNob3dSYXRpb25hbGUiLCJyYXRpb25hbGUiLCJzaG93VGVhY2hlckluc3RydWN0aW9ucyIsInRlYWNoZXJJbnN0cnVjdGlvbnMiLCJtYWluQ29udGFpbmVyIiwiYW5pbWF0aW9uc0Rpc2FibGVkIiwiaGlkZGVuIiwidmlzaWJsZSIsImNvbGxhcHNpYmxlIiwicHJvbXB0IiwiZGlzYWJsZWQiLCJpbmNvcnJlY3QiLCJ0b2dnbGVTaG93Q29ycmVjdCIsImxhbmd1YWdlIiwidGV4dFNlbGVjdCIsInNlbGVjdGlvbiIsIm5ld1NlbGVjdGlvbnMiLCJtYXAiLCJzZWxlY3QiLCJmaW5kIiwic3RhcnQiLCJlbmQiLCJoaWdobGlnaHRDaG9pY2VzIiwibWF4U2VsZWN0aW9ucyIsImNvcnJlY3RuZXNzIiwiZmVlZGJhY2siLCJSZWFjdCIsIkNvbXBvbmVudCIsIlN0eWxlZE1haW4iLCJ0aGVtZSIsImNvbG9yIiwiYmFja2dyb3VuZENvbG9yIiwiYmFja2dyb3VuZCIsIm1hcmdpbkJvdHRvbSIsInNwYWNpbmciLCJ1bml0IiwibWFyZ2luVG9wIiwid2hpdGVTcGFjZSIsInZlcnRpY2FsQWxpZ24iLCJwb3NpdGlvbiIsImN1cnNvciIsImJvcmRlciIsImxpbmVIZWlnaHQiLCJTdGF0ZWZ1bCIsImNoYW5nZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFTQTs7QUFDQTs7QUFDQTs7QUFFQTs7Ozs7Ozs7OztBQUVBLElBQU1BLEdBQUcsR0FBRyx1QkFBTSxxQkFBTixDQUFaO0FBRUEsSUFBTUMsS0FBSyxHQUFHO0FBQ1pDLEVBQUFBLEtBQUssRUFBRUMsc0JBQVVDLE1BREw7QUFFWkMsRUFBQUEsT0FBTyxFQUFFRixzQkFBVUMsTUFGUDtBQUdaRSxFQUFBQSxpQkFBaUIsRUFBRUgsc0JBQVVJLElBQVYsQ0FBZUM7QUFIdEIsQ0FBZDs7SUFNYUMsSTs7Ozs7QUFLWCxnQkFBWUMsS0FBWixFQUFtQjtBQUFBOztBQUFBO0FBQ2pCLDhCQUFNQSxLQUFOO0FBRGlCLDBHQTZCQyxZQUFNO0FBQ3hCLFlBQUtDLFFBQUwsQ0FBYztBQUFFQyxRQUFBQSxpQkFBaUIsRUFBRSxDQUFDLE1BQUtDLEtBQUwsQ0FBV0Q7QUFBakMsT0FBZDtBQUNELEtBL0JrQjtBQUFBLHNHQWlDSCxZQUFNO0FBQ3BCLFVBQVFWLEtBQVIsR0FBa0IsTUFBS1csS0FBdkIsQ0FBUVgsS0FBUjtBQUVBLGFBQU9BLEtBQUssQ0FBQ1ksTUFBTixDQUFhQyxNQUFiLENBQW9CLFVBQUNDLENBQUQ7QUFBQSxlQUFPQSxDQUFDLENBQUNDLE9BQVQ7QUFBQSxPQUFwQixDQUFQO0FBQ0QsS0FyQ2tCO0FBQUEsZ0hBdUNPLFVBQUNDLElBQUQs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TCxDQUFXSixpQkFBWCxDQUE2QixPQUFLTyxLQUFMLENBQVdSLE9BQVgsQ0FBbUJxQyxjQUFoRDtBQUNELE9BRkQ7QUFHRCxLQWpCa0I7QUFFakIsV0FBSzdCLEtBQUwsR0FBYTtBQUNYWCxNQUFBQSxLQUFLLEVBQUVRLEtBQUssQ0FBQ1IsS0FERjtBQUVYRyxNQUFBQSxPQUFPLEVBQUVLLEtBQUssQ0FBQ0w7QUFGSixLQUFiO0FBRmlCO0FBTWxCOzs7O1dBRUQsMENBQWlDc0MsU0FBakMsRUFBNEM7QUFDMUMsV0FBS2hDLFFBQUwsQ0FBYztBQUFFVCxRQUFBQSxLQUFLLEVBQUV5QyxTQUFTLENBQUN6QyxLQUFuQjtBQUEwQkcsUUFBQUEsT0FBTyxFQUFFc0MsU0FBUyxDQUFDdEM7QUFBN0MsT0FBZDtBQUNEOzs7V0FTRCxrQkFBUztBQUNQLHlCQUEyQixLQUFLUSxLQUFoQztBQUFBLFVBQVFYLEtBQVIsZ0JBQVFBLEtBQVI7QUFBQSxVQUFlRyxPQUFmLGdCQUFlQSxPQUFmO0FBQ0EsMEJBQU8sZ0NBQUMsVUFBRDtBQUFZLFFBQUEsS0FBSyxFQUFFSCxLQUFuQjtBQUEwQixRQUFBLE9BQU8sRUFBRUcsT0FBbkM7QUFBNEMsUUFBQSxpQkFBaUIsRUFBRSxLQUFLdUY7QUFBcEUsUUFBUDtBQUNEOzs7RUF6Qm1DbEIsa0JBQU1DLFM7OztpQ0FBdkJnQixRLGVBQ0ExRixLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgeyBUZXh0U2VsZWN0LCBMZWdlbmQgfSBmcm9tICdAcGllLWxpYi9waWUtdG9vbGJveC90ZXh0LXNlbGVjdCc7XG5pbXBvcnQgeyBDb3JyZWN0QW5zd2VyVG9nZ2xlIH0gZnJvbSAnQHBpZS1saWIvcGllLXRvb2xib3gvY29ycmVjdC1hbnN3ZXItdG9nZ2xlJztcbmltcG9ydCB7XG4gIGNvbG9yLFxuICBGZWVkYmFjayxcbiAgQ29sbGFwc2libGUsXG4gIGhhc1RleHQsXG4gIGhhc01lZGlhLFxuICBQcmV2aWV3UHJvbXB0LFxuICBVaUxheW91dCxcbn0gZnJvbSAnQHBpZS1saWIvcGllLXRvb2xib3gvcmVuZGVyLXVpJztcbmltcG9ydCB7IHdpdGhTdHlsZXMgfSBmcm9tICdAbWF0ZXJpYWwtdWkvY29yZS9zdHlsZXMnO1xuaW1wb3J0IGdlbmVyYXRlTW9kZWwgZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcblxuaW1wb3J0IGRlYnVnIGZyb20gJ2RlYnVnJztcblxuY29uc3QgbG9nID0gZGVidWcoJ0BwaWUtdWk6c2VsZWN0LXRleHQnKTtcblxuY29uc3QgVHlwZXMgPSB7XG4gIG1vZGVsOiBQcm9wVHlwZXMub2JqZWN0LFxuICBzZXNzaW9uOiBQcm9wVHlwZXMub2JqZWN0LFxuICBvblNlbGVjdGlvbkNoYW5nZTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbn07XG5cbmV4cG9ydCBjbGFzcyBNYWluIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgc3RhdGljIHByb3BUeXBlcyA9IHsgLi4uVHlwZXMsIGNsYXNzZXM6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCB9O1xuXG4gIHN0YXRpYyBkZWZhdWx0UHJvcHMgPSB7fTtcblxuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcblxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBzaG93Q29ycmVjdEFuc3dlcjogdGhpcy5wcm9wcy5tb2RlbC5hbHdheXNTaG93Q29ycmVjdCB8fCBmYWxzZSxcbiAgICAgIG1vZGVsOiB7XG4gICAgICAgIC4uLmdlbmVyYXRlTW9kZWwocHJvcHMubW9kZWwpLFxuICAgICAgICB0b2tlbml6ZWRUZXh0OiB0aGlzLmluaXRpYWxpemVUb2tlbml6ZWRUZXh0KFxuICAgICAgICAgIHByb3BzLm1vZGVsLnRva2VuaXplZFRleHQgfHwgcHJvcHMubW9kZWwudGV4dCxcbiAgICAgICAgICB0aGlzLmhhbmRsZVRva2VuQ2xpY2ssXG4gICAgICAgICksXG4gICAgICB9LFxuICAgICAgc2VsZWN0ZWRUb2tlbnM6IFtdLFxuICAgIH07XG4gIH1cblxuICBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpIHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIHNob3dDb3JyZWN0QW5zd2VyOiAhIW5leHRQcm9wcy5tb2RlbC5hbHdheXNTaG93Q29ycmVjdCxcbiAgICAgIG1vZGVsOiB7XG4gICAgICAgIC4uLmdlbmVyYXRlTW9kZWwobmV4dFByb3BzLm1vZGVsKSxcbiAgICAgICAgdG9rZW5pemVkVGV4dDogdGhpcy5pbml0aWFsaXplVG9rZW5pemVkVGV4dChcbiAgICAgICAgICBuZXh0UHJvcHMubW9kZWwudG9rZW5pemVkVGV4dCB8fCBuZXh0UHJvcHMubW9kZWwudGV4dCxcbiAgICAgICAgICB0aGlzLmhhbmRsZVRva2VuQ2xpY2ssXG4gICAgICAgICksXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgdG9nZ2xlU2hvd0NvcnJlY3QgPSAoKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7IHNob3dDb3JyZWN0QW5zd2VyOiAhdGhpcy5zdGF0ZS5zaG93Q29ycmVjdEFuc3dlciB9KTtcbiAgfTtcblxuICBjb3JyZWN0QW5zd2VyID0gKCkgPT4ge1xuICAgIGNvbnN0IHsgbW9kZWwgfSA9IHRoaXMuc3RhdGU7XG5cbiAgICByZXR1cm4gbW9kZWwudG9rZW5zLmZpbHRlcigodCkgPT4gdC5jb3JyZWN0KTtcbiAgfTtcblxuICBpbml0aWFsaXplVG9rZW5pemVkVGV4dCA9IChodG1sLCBvbkNsaWNrKSA9PiB7XG4gICAgY29uc3QgeyBjbGFzc2VzIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sO1xuXG4gICAgY29uc3Qgc3BhbnMgPSBjb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnc3BhbicpO1xuXG4gICAgc3BhbnMuZm9yRWFjaCgoc3BhbikgPT4ge1xuICAgICAgc3Bhbi5jbGFzc05hbWUgPSBjbGFzc05hbWVzKGNsYXNzZXMudG9rZW4pO1xuICAgICAgLy8gc3Bhbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiBvbkNsaWNrKGUpKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBjb250YWluZXIuaW5uZXJIVE1MO1xuICB9O1xuXG4gIGhhbmRsZVRva2VuQ2xpY2sgPSAoZXZlbnQpID0+IHtcbiAgICBjb25zb2xlLmxvZygnZXZlbnQgY2xpY2snLCBldmVudC50YXJnZXQuaWQpO1xuXG4gICAgZXZlbnQudGFyZ2V0LmNsYXNzTGlzdC50b2dnbGUoJ3NlbGVjdGVkJyk7XG4gIH07XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHsgc2Vzc2lvbiwgb25TZWxlY3Rpb25DaGFuZ2UsIGNsYXNzZXMgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgeyBzaG93Q29ycmVjdEFuc3dlciwgbW9kZWwgfSA9IHRoaXMuc3RhdGU7XG4gICAgY29uc3QgeyBlbnYsIGV4dHJhQ1NTUnVsZXMgfSA9IG1vZGVsO1xuICAgIGNvbnN0IHsgbW9kZSB9ID0gZW52IHx8IHt9O1xuXG4gICAgY29uc3Qgc2VsZWN0ZWRUb2tlbnMgPSBzaG93Q29ycmVjdEFuc3dlciA/IHRoaXMuY29ycmVjdEFuc3dlcigpIDogc2Vzc2lvbi5zZWxlY3RlZFRva2VucztcbiAgICBjb25zdCBzaG93UmF0aW9uYWxlID0gbW9kZWwucmF0aW9uYWxlICYmIChoYXNUZXh0KG1vZGVsLnJhdGlvbmFsZSkgfHwgaGFzTWVkaWEobW9kZWwucmF0aW9uYWxlKSk7XG4gICAgY29uc3Qgc2hvd1RlYWNoZXJJbnN0cnVjdGlvbnMgPVxuICAgICAgbW9kZWwudGVhY2hlckluc3RydWN0aW9ucyAmJiAoaGFzVGV4dChtb2RlbC50ZWFjaGVySW5zdHJ1Y3Rpb25zKSB8fCBoYXNNZWRpYShtb2RlbC50ZWFjaGVySW5zdHJ1Y3Rpb25zKSk7XG5cbiAgICBsb2coJ1tyZW5kZXJdIHNlbGVjdGVkVG9rZW5zOicsIHNlbGVjdGVkVG9rZW5zKTtcblxuICAgIHJldHVybiAoXG4gICAgICA8VWlMYXlvdXQgZXh0cmFDU1NSdWxlcz17ZXh0cmFDU1NSdWxlc30gY2xhc3NOYW1lPXtjbGFzc2VzLm1haW5Db250YWluZXJ9PlxuICAgICAgICB7c2hvd1RlYWNoZXJJbnN0cnVjdGlvbnMgJiZcbiAgICAgICAgICAoIW1vZGVsLmFuaW1hdGlvbnNEaXNhYmxlZCA/IChcbiAgICAgICAgICAgIDxDb2xsYXBzaWJsZVxuICAgICAgICAgICAgICBsYWJlbHM9e3sgaGlkZGVuOiAnU2hvdyBUZWFjaGVyIEluc3RydWN0aW9ucycsIHZpc2libGU6ICdIaWRlIFRlYWNoZXIgSW5zdHJ1Y3Rpb25zJyB9fVxuICAgICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzZXMuY29sbGFwc2libGV9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxQcmV2aWV3UHJvbXB0IHByb21wdD17bW9kZWwudGVhY2hlckluc3RydWN0aW9uc30gLz5cbiAgICAgICAgICAgIDwvQ29sbGFwc2libGU+XG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtjbGFzc2VzLnByb21wdH0+XG4gICAgICAgICAgICAgIDxQcmV2aWV3UHJvbXB0IHByb21wdD17bW9kZWwudGVhY2hlckluc3RydWN0aW9uc30gLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICkpfVxuXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPXtjbGFzc2VzLnByb21wdH0+XG4gICAgICAgICAgPFByZXZpZXdQcm9tcHQgcHJvbXB0PXttb2RlbC5wcm9tcHR9IC8+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIHshbW9kZWwuYWx3YXlzU2hvd0NvcnJlY3QgJiYgKFxuICAgICAgICAgIDxDb3JyZWN0QW5zd2VyVG9nZ2xlXG4gICAgICAgICAgICBzaG93PXttb2RlbC5kaXNhYmxlZCAmJiBtb2RlbC5pbmNvcnJlY3R9XG4gICAgICAgICAgICB0b2dnbGVkPXtzaG93Q29ycmVjdEFuc3dlcn1cbiAgICAgICAgICAgIG9uVG9nZ2xlPXt0aGlzLnRvZ2dsZVNob3dDb3JyZWN0fVxuICAgICAgICAgICAgbGFuZ3VhZ2U9e21vZGVsLmxhbmd1YWdlfVxuICAgICAgICAgIC8+XG4gICAgICAgICl9XG5cbiAgICAgICAgPFRleHRTZWxlY3RcbiAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzZXMudGV4dFNlbGVjdH1cbiAgICAgICAgICBkaXNhYmxlZD17bW9kZWwuZGlzYWJsZWR9XG4gICAgICAgICAgdGV4dD17bW9kZWwudG9rZW5pemVkVGV4dCB8fCBtb2RlbC50ZXh0fVxuICAgICAgICAgIHRva2Vucz17bW9kZWwudG9rZW5zfVxuICAgICAgICAgIHNlbGVjdGVkVG9rZW5zPXtzZWxlY3RlZFRva2Vuc31cbiAgICAgICAgICBvbkNoYW5nZT17KHNlbGVjdGlvbikgPT4ge1xuICAgICAgICAgICAgY29uc3QgbmV3U2VsZWN0aW9ucyA9IHNlbGVjdGlvbi5tYXAoKHNlbGVjdCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCB0b2tlbiA9IG1vZGVsLnRva2Vucy5maW5kKCh7IHN0YXJ0LCBlbmQgfSkgPT4gc2VsZWN0LnN0YXJ0ID09PSBzdGFydCAmJiBzZWxlY3QuZW5kID09PSBlbmQpO1xuXG4gICAgICAgICAgICAgIC8vIG5lZWRlZCBmb3IgZ2V0U2NvcmUgd2hlbiB0b2tlbnMgcG9zaXRpb24gaXMgcmVjYWxjdWxhdGVkLCB0byBrZWVwIG9sZFN0YXJ0IGFuZCBvbGRFbmRcbiAgICAgICAgICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdDtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBvblNlbGVjdGlvbkNoYW5nZShuZXdTZWxlY3Rpb25zKTtcbiAgICAgICAgICB9fVxuICAgICAgICAgIGhpZ2hsaWdodENob2ljZXM9e21vZGVsLmhpZ2hsaWdodENob2ljZXN9XG4gICAgICAgICAgbWF4Tm9PZlNlbGVjdGlvbnM9e21vZGVsLm1heFNlbGVjdGlvbnN9XG4gICAgICAgICAgYW5pbWF0aW9uc0Rpc2FibGVkPXttb2RlbC5hbmltYXRpb25zRGlzYWJsZWR9XG4gICAgICAgIC8+XG4gICAgICAgIHttb2RlID09PSAnZXZhbHVhdGUnICYmIDxMZWdlbmQgbGFuZ3VhZ2U9e21vZGVsLmxhbmd1YWdlfSAvPn1cblxuICAgICAgICB7c2hvd1JhdGlvbmFsZSAmJlxuICAgICAgICAgICghbW9kZWwuYW5pbWF0aW9uc0Rpc2FibGVkID8gKFxuICAgICAgICAgICAgPENvbGxhcHNpYmxlXG4gICAgICAgICAgICAgIGxhYmVscz17eyBoaWRkZW46ICdTaG93IFJhdGlvbmFsZScsIHZpc2libGU6ICdIaWRlIFJhdGlvbmFsZScgfX1cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc2VzLmNvbGxhcHNpYmxlfVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8UHJldmlld1Byb21wdCBwcm9tcHQ9e21vZGVsLnJhdGlvbmFsZX0gLz5cbiAgICAgICAgICAgIDwvQ29sbGFwc2libGU+XG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtjbGFzc2VzLnByb21wdH0+XG4gICAgICAgICAgICAgIDxQcmV2aWV3UHJvbXB0IHByb21wdD17bW9kZWwucmF0aW9uYWxlfSAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKSl9XG5cbiAgICAgICAge21vZGVsLmNvcnJlY3RuZXNzICYmIG1vZGVsLmZlZWRiYWNrICYmICFzaG93Q29ycmVjdEFuc3dlciAmJiAoXG4gICAgICAgICAgPEZlZWRiYWNrIGNvcnJlY3RuZXNzPXttb2RlbC5jb3JyZWN0bmVzc30gZmVlZGJhY2s9e21vZGVsLmZlZWRiYWNrfSAvPlxuICAgICAgICApfVxuICAgICAgPC9VaUxheW91dD5cbiAgICApO1xuICB9XG59XG5cbmNvbnN0IFN0eWxlZE1haW4gPSB3aXRoU3R5bGVzKCh0aGVtZSkgPT4gKHtcbiAgbWFpbkNvbnRhaW5lcjoge1xuICAgIGNvbG9yOiBjb2xvci50ZXh0KCksXG4gICAgYmFja2dyb3VuZENvbG9yOiBjb2xvci5iYWNrZ3JvdW5kKCksXG4gIH0sXG4gIHRleHRTZWxlY3Q6IHtcbiAgICBtYXJnaW5Cb3R0b206IHRoZW1lLnNwYWNpbmcudW5pdCxcbiAgICBtYXJnaW5Ub3A6IHRoZW1lLnNwYWNpbmcudW5pdCAqIDIsXG4gICAgd2hpdGVTcGFjZTogJ25vcm1hbCcsXG4gIH0sXG4gIHByb21wdDoge1xuICAgIHZlcnRpY2FsQWxpZ246ICdtaWRkbGUnLFxuICAgIG1hcmdpbkJvdHRvbTogdGhlbWUuc3BhY2luZy51bml0LFxuICB9LFxuICBjb2xsYXBzaWJsZToge1xuICAgIG1hcmdpbkJvdHRvbTogdGhlbWUuc3BhY2luZy51bml0ICogMixcbiAgfSxcbiAgdG9rZW46IHtcbiAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgICBib3JkZXI6ICdkYXNoZWQgMnB4IGdyZXknLFxuICAgIGxpbmVIZWlnaHQ6ICcyNHB4JyxcbiAgICAvLyBiYWNrZ3JvdW5kQ29sb3I6ICcjZmZmOWM0JyxcblxuICAgICcmOmhvdmVyJzoge1xuICAgICAgYmFja2dyb3VuZENvbG9yOiAnIzlmYThkYScsXG4gICAgfSxcblxuICAgICcmLnNlbGVjdGVkJzoge1xuICAgICAgYmFja2dyb3VuZENvbG9yOiAnIzlmYThkYScsXG4gICAgICBib3JkZXI6ICdub25lJyxcbiAgICB9LFxuICB9LFxufSkpKE1haW4pO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTdGF0ZWZ1bCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHN0YXRpYyBwcm9wVHlwZXMgPSBUeXBlcztcblxuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgbW9kZWw6IHByb3BzLm1vZGVsLFxuICAgICAgc2Vzc2lvbjogcHJvcHMuc2Vzc2lvbixcbiAgICB9O1xuICB9XG5cbiAgVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzKSB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7IG1vZGVsOiBuZXh0UHJvcHMubW9kZWwsIHNlc3Npb246IG5leHRQcm9wcy5zZXNzaW9uIH0pO1xuICB9XG5cbiAgY2hhbmdlID0gKHNlbGVjdGVkVG9rZW5zKSA9PiB7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IHsgLi4udGhpcy5zdGF0ZS5zZXNzaW9uLCBzZWxlY3RlZFRva2VucyB9O1xuICAgIHRoaXMuc2V0U3RhdGUoeyBzZXNzaW9uIH0sICgpID0+IHtcbiAgICAgIHRoaXMucHJvcHMub25TZWxlY3Rpb25DaGFuZ2UodGhpcy5zdGF0ZS5zZXNzaW9uLnNlbGVjdGVkVG9rZW5zKTtcbiAgICB9KTtcbiAgfTtcblxuICByZW5kZXIoKSB7XG4gICAgY29uc3QgeyBtb2RlbCwgc2Vzc2lvbiB9ID0gdGhpcy5zdGF0ZTtcbiAgICByZXR1cm4gPFN0eWxlZE1haW4gbW9kZWw9e21vZGVsfSBzZXNzaW9uPXtzZXNzaW9ufSBvblNlbGVjdGlvbkNoYW5nZT17dGhpcy5jaGFuZ2V9IC8+O1xuICB9XG59XG4iXX0=