{"version":3,"sources":["../js/durandal/system.js?v=1552304184357","../js/durandal/viewEngine.js?v=1552304184357","../js/durandal/viewLocator.js?v=1552304184357","../js/durandal/binder.js?v=1552304184357","../js/durandal/activator.js?v=1552304184357","../js/durandal/composition.js?v=1552304184357","../js/durandal/events.js?v=1552304184357","../js/durandal/app.js?v=1552304184357","browserSupport.js?v=1552304184357","bootstrapping/browserSupportTask.js?v=1552304184357","bootstrapping/viewLocatorTask.js?v=1552304184357","bootstrapping/knockoutBindings/areaBinding.js?v=1552304184357","bootstrapping/knockoutBindings/autofocusBinding.js?v=1552304184357","bootstrapping/knockoutBindings/autosizeBinding.js?v=1552304184357","bootstrapping/knockoutBindings/backgroundBinding.js?v=1552304184357","templateSettings.js?v=1552304184357","bootstrapping/knockoutBindings/circleProgressBinding.js?v=1552304184357","bootstrapping/knockoutBindings/contextBinding.js?v=1552304184357","bootstrapping/knockoutBindings/elementsWrapBinding.js?v=1552304184357","bootstrapping/knockoutBindings/focusHandlerBinding.js?v=1552304184357","bootstrapping/knockoutBindings/toggleVisibleBindingHandler.js?v=1552304184357","bootstrapping/knockoutBindings/dropDownBinding.js?v=1552304184357","bootstrapping/knockoutBindings/scrollTopBinding.js?v=1552304184357","bootstrapping/knockoutBindings/scrollIntoViewBinding.js?v=1552304184357","localizationManager.js?v=1552304184357","constants.js?v=1552304184357","helpers/documentBlock.js?v=1552304184357","bootstrapping/knockoutBindings/contentBlockBinding.js?v=1552304184357","bootstrapping/knockoutBindings/toolTipBindingHandler.js?v=1552304184357","helpers/fileDownloader.js?v=1552304184357","bootstrapping/knockoutBindings/downloadAsPdfBinding.js?v=1552304184357","bootstrapping/knockoutBindings/mediaPlayerBinding.js?v=1552304184357","bootstrapping/knockoutBindings/customFocusBinding.js?v=1552304184357","../js/durandal/plugins/history.js?v=1552304184357","../js/durandal/plugins/router.js?v=1552304184357","bootstrapping/knockoutBindings/reviewableBinding.js?v=1552304184357","bootstrapping/knockoutBindings/limitedLengthTextBinding.js?v=1552304184357","bootstrapping/knockoutBindings/scrollbarBinding.js?v=1552304184357","bootstrapping/knockoutBindings/localizeBinding.js?v=1552304184357","bootstrapping/knockoutBindings/fontScaleBinding.js?v=1552304184357","treeOfContent/utils/screenResolutionChecker.js?v=1552304184357","treeOfContent/bindingHandlers/treeOfContentAnimationsBinding.js?v=1552304184357","bootstrapping/knockoutBindings/selectTextBinding.js?v=1552304184357","bootstrapping/knockoutBindings/submitOnEnterBinding.js?v=1552304184357","bootstrapping/knockoutBindings/keyDownBinding.js?v=1552304184357","bootstrapping/knockoutBindings/tabFocusBinding.js?v=1552304184357","bootstrapping/knockoutBindings/copyToClipboardBinding.js?v=1552304184357","bootstrapping/knockoutBindings/changeCssClassByDelayBinding.js?v=1552304184357","bootstrapping/knockoutBindings/containImageBinding.js?v=1552304184357","bootstrapping/knockoutBindings/lessColorBinding.js?v=1552304184357","bootstrapping/knockoutBindings/editableTextBindingHandler.js?v=1552304184357","eventManager.js?v=1552304184357","models/course.js?v=1552304184357","models/section.js?v=1552304184357","publishSettings.js?v=1552304184357","guard.js?v=1552304184357","models/contentBlock.js?v=1552304184357","../js/durandal/plugins/http.js?v=1552304184357","models/questions/question.js?v=1552304184357","models/answers/answer.js?v=1552304184357","models/answers/checkableAnswer.js?v=1552304184357","models/questions/multipleSelectQuestion.js?v=1552304184357","models/answers/answerGroup.js?v=1552304184357","models/questions/fillInTheBlankQuestion.js?v=1552304184357","models/answers/draggableAnswer.js?v=1552304184357","models/questions/dragAndDropQuestion.js?v=1552304184357","models/answers/checkableImageAnswer.js?v=1552304184357","models/questions/singleSelectImageQuestion.js?v=1552304184357","models/questions/textMatchingQuestion.js?v=1552304184357","models/questions/informationContent.js?v=1552304184357","models/answers/statementAnswer.js?v=1552304184357","models/questions/statementQuestion.js?v=1552304184357","models/questions/hotspot.js?v=1552304184357","models/questions/openQuestion.js?v=1552304184357","models/questions/scenarioQuestion.js?v=1552304184357","models/questions/rankingTextQuestion.js?v=1552304184357","models/questions/questionsFactory.js?v=1552304184357","context.js?v=1552304184357","displaySettings.js?v=1552304184357","header/header.js?v=1552304184357","bootstrapping/knockoutBindings/headerHeightDepender.js?v=1552304184357","viewmodels/questions/dragAndDrop/bindingHandlers/draggableTextBindingHandler.js?v=1552304184357","viewmodels/questions/dragAndDrop/bindingHandlers/draggableTextContainerBindingHandler.js?v=1552304184357","viewmodels/questions/dragAndDrop/bindingHandlers/dropspotBindingHandler.js?v=1552304184357","viewmodels/questions/rankingText/bindingHandlers/preventDefaultTouchEventBinding.js?v=1552304184357","viewmodels/questions/fillInTheBlank/bindingHandlers/fillInTheBlankAnswersBinding.js?v=1552304184357","viewmodels/questions/textMatching/bindingHandlers/draggableBindingHandler.js?v=1552304184357","viewmodels/questions/textMatching/bindingHandlers/droppableBindingHandler.js?v=1552304184357","viewmodels/questions/textMatching/bindingHandlers/overlayBindingHandler.js?v=1552304184357","viewmodels/questions/textMatching/bindingHandlers/syncHeightBindingHandler.js?v=1552304184357","viewmodels/questions/openQuestion/bindingHandlers/textAreaBindingHandler.js?v=1552304184357","widgets/imagePreview/viewmodel.js?v=1552304184357","viewmodels/questions/singleSelectImage/bindingHandlers/previewImageBinding.js?v=1552304184357","widgets/imagePreview/bindingHandlers/fadeBindingHandler.js?v=1552304184357","widgets/imagePreview/bindingHandlers/imageLoaderBindingHandler.js?v=1552304184357","dialogs/bindingHandlers/blockBodyScrollBinding.js?v=1552304184357","dialogs/bindingHandlers/ratingBindingHandler.js?v=1552304184357","bootstrapping/knockoutBindingTask.js?v=1552304184357","bootstrapping/binders/background.js?v=1552304184357","bootstrapping/binderTask.js?v=1552304184357","routing/routerExtender.js?v=1552304184357","bootstrapping/routingTask.js?v=1552304184357","bootstrapping/reviewTask.js?v=1552304184357","bootstrapping/cssCustomBrowserFixTask.js?v=1552304184357","bootstrapper.tasks.js?v=1552304184357","bootstrapper.js?v=1552304184357","includedModules/moduleLoader.js?v=1552304184357","modules/progress/progressStorage/httpWrapper.js?v=1552304184357","modules/progress/progressStorage/urlProvider.js?v=1552304184357","modules/progress/progressStorage/auth.js?v=1552304184357","helpers/loginHelper.js?v=1552304184357","userContext.js?v=1552304184357","progressContext.js?v=1552304184357","errorTracking/ravenWrapper.js?v=1552304184357","errorTracking/errorTracker.js?v=1552304184357","includedModules/appExtender.js?v=1552304184357","includedModules/modulesInitializer.js?v=1552304184357","modules/index.js?v=1552304184357","modules/publishModeProvider.js?v=1552304184357","main.js?v=1552304184357","account/header/index.js?v=1552304184357","account/socialNetworks/index.js?v=1552304184357","account/helpers/validatedValue.js?v=1552304184357","xApi/constants.js?v=1552304184357","account/limitAccess/accessLimiter.js?v=1552304184357","xApi/configuration/routes.js?v=1552304184357","xApi/routingManager.js?v=1552304184357","xApi/configuration/xApiSettings.js?v=1552304184357","xApi/base64.js?v=1552304184357","xApi/errorsHandler.js?v=1552304184357","helpers/requestResender.js?v=1552304184357","xApi/requestManager.js?v=1552304184357","xApi/guard.js?v=1552304184357","xApi/models/statement.js?v=1552304184357","xApi/models/object.js?v=1552304184357","xApi/models/activityDefinition.js?v=1552304184357","xApi/models/activity.js?v=1552304184357","xApi/models/result.js?v=1552304184357","xApi/models/score.js?v=1552304184357","xApi/models/context.js?v=1552304184357","xApi/models/contextActivities.js?v=1552304184357","xApi/models/languageMap.js?v=1552304184357","xApi/models/interactionDefinition.js?v=1552304184357","xApi/utils/dateTimeConverter.js?v=1552304184357","xApi/statementQueue.js?v=1552304184357","repositories/sectionRepository.js?v=1552304184357","xApi/statementSender.js?v=1552304184357","xApi/models/actor.js?v=1552304184357","xApi/activityProvider.js?v=1552304184357","xApi/statementQueueHandler.js?v=1552304184357","xApi/xApiInitializer.js?v=1552304184357","account/routing/guardRoute.js?v=1552304184357","modules/progress/constants.js?v=1552304184357","modules/progress/localStorage/index.js?v=1552304184357","modules/progress/progressStorage/index.js?v=1552304184357","modules/progress/index.js?v=1552304184357","account/account.js?v=1552304184357","routing/routes.js?v=1552304184357","account/routing/routes.js?v=1552304184357","account/index.js?v=1552304184357","account/limitAccess/index.js?v=1552304184357","account/register/index.js?v=1552304184357","account/signin/index.js?v=1552304184357","dialogs/continueLater.js?v=1552304184357","dialogs/dialog.js?v=1552304184357","dialogs/nps/figures/evaluation.js?v=1552304184357","dialogs/nps/figures/feedback.js?v=1552304184357","dialogs/nps/figures/rocket.js?v=1552304184357","repositories/courseRepository.js?v=1552304184357","dialogs/nps/nps.js?v=1552304184357","dialogs/resultsResend/resultsResend.js?v=1552304184357","dialogs/startNewAttempt/startNewAttempt.js?v=1552304184357","errorsHandler.js?v=1552304184357","helpers/appOperations.js?v=1552304184357","modules/lti.js?v=1552304184357","modules/progress/progressStorage/certificateProvider.js?v=1552304184357","modules/questionsNavigation.js?v=1552304184357","modules/webhooks.js?v=1552304184357","viewmodels/questions/multipleSelect/multipleSelect.js?v=1552304184357","viewmodels/questions/singleSelectText/singleSelectText.js?v=1552304184357","viewmodels/questions/fillInTheBlank/fillInTheBlank.js?v=1552304184357","viewmodels/questions/dragAndDrop/dragAndDrop.js?v=1552304184357","viewmodels/questions/singleSelectImage/singleSelectImage.js?v=1552304184357","viewmodels/questions/textMatching/textMatchingSource.js?v=1552304184357","viewmodels/questions/textMatching/textMatchingTarget.js?v=1552304184357","viewmodels/questions/textMatching/textMatching.js?v=1552304184357","viewmodels/questions/statement/statement.js?v=1552304184357","viewmodels/questions/hotspot/hotspot.js?v=1552304184357","viewmodels/questions/openQuestion/openQuestion.js?v=1552304184357","viewmodels/questions/scenarioQuestion/components/branchtrackProvider.js?v=1552304184357","viewmodels/questions/scenarioQuestion/scenarioQuestion.js?v=1552304184357","viewmodels/questions/rankingText/rankingText.js?v=1552304184357","viewmodels/questions/questionsViewModelFactory.js?v=1552304184357","questionContent/questionContent.js?v=1552304184357","repositories/questionRepository.js?v=1552304184357","resultPage/resultPage.js?v=1552304184357","treeOfContent/treeNodes/TreeNode.js?v=1552304184357","treeOfContent/treeNodes/QuestionTreeNode.js?v=1552304184357","treeOfContent/treeNodes/SectionTreeNode.js?v=1552304184357","treeOfContent/treeOfContent.js?v=1552304184357","viewmodels/404.js?v=1552304184357","viewmodels/exitCourse.js?v=1552304184357","viewmodels/introduction.js?v=1552304184357","viewmodels/questions/content.js?v=1552304184357","viewmodels/questions/expandableBlock.js?v=1552304184357","viewmodels/questions/informationContent.js?v=1552304184357","viewmodels/questions/questionContent.js?v=1552304184357","viewmodels/questions/scenarioQuestion/submitQuestion.js?v=1552304184357","viewmodels/sections.js?v=1552304184357","viewmodels/shell.js?v=1552304184357","xApi/models/verb.js?v=1552304184357","xApi/viewmodels/xAPIError.js?v=1552304184357","../js/durandal/transitions/entrance.js?v=1552304184357","../js/durandal/plugins/dialog.js?v=1552304184357","../js/durandal/plugins/observable.js?v=1552304184357","../js/durandal/plugins/serializer.js?v=1552304184357","../js/durandal/plugins/widget.js?v=1552304184357","../js/text.js?v=1552304184357","account/account.html!text","account/header/index.html!text","account/limitAccess/index.html!text","account/register/index.html!text","account/signin/index.html!text","account/socialNetworks/index.html!text","dialogs/continueLater.html!text","dialogs/nps/figures/evaluation.html!text","dialogs/nps/figures/feedback.html!text","dialogs/nps/figures/rocket.html!text","dialogs/nps/nps.html!text","dialogs/resultsResend/resultsResend.html!text","dialogs/startNewAttempt/startNewAttempt.html!text","header/header.html!text","questionContent/questionContent.html!text","resultPage/resultPage.html!text","treeOfContent/treeOfContent.html!text","views/404.html!text","views/exitCourse.html!text","views/introduction.html!text","views/questions/content.html!text","views/questions/dragAndDrop/dragAndDrop.html!text","views/questions/expandableBlock.html!text","views/questions/feedback.html!text","views/questions/fillInTheBlank/fillInTheBlank.html!text","views/questions/hotspot/hotspot.html!text","views/questions/informationContent.html!text","views/questions/multipleSelect/multipleSelect.html!text","views/questions/openQuestion/feedback.html!text","views/questions/openQuestion/openQuestion.html!text","views/questions/questionContent.html!text","views/questions/rankingText/rankingText.html!text","views/questions/scenarioQuestion/feedback.html!text","views/questions/scenarioQuestion/scenarioQuestion.html!text","views/questions/scenarioQuestion/submitQuestion.html!text","views/questions/singleSelectImage/singleSelectImage.html!text","views/questions/singleSelectText/singleSelectText.html!text","views/questions/statement/statement.html!text","views/questions/textMatching/textMatching.html!text","views/sections.html!text","views/shell.html!text","widgets/imagePreview/view.html!text","xApi/views/xAPIError.html!text"],"names":["define","require","$","system","isDebugging","nativeKeys","Object","keys","hasOwnProperty","prototype","toString","treatAsIE8","nativeIsArray","Array","isArray","slice","Function","bind","console","log","forEach","method","this","call","ex","on","module","mid","setModuleId","requirejs","onResourceLoad","context","map","depArray","defined","id","noop","window","opera","i","arguments","length","apply","ignore","logError","error","Error","version","getModuleId","obj","__moduleId__","resolveObject","isFunction","debug","enable","assert","condition","message","defer","action","Deferred","guid","replace","c","r","Math","random","acquire","modules","first","arrayRequest","dfd","args","setTimeout","resolve","err","reject","promise","extend","rest","source","prop","wait","milliseconds","TypeError","key","isElement","nodeType","isObject","isBoolean","isPromise","then","isChecks","name","value","parseMarkup","parseHTML","html","get","viewExtension","viewPlugin","isViewUrl","url","indexOf","convertViewUrlToViewId","substring","convertViewIdToRequirePath","viewId","processMarkup","markup","allElements","ensureSingleElement","withoutCommentsOrEmptyText","current","test","nodeValue","push","wrapAll","parent","createView","that","requirePath","element","setAttribute","fail","createFallbackView","viewEngine","findInElements","nodes","getAttribute","escape","str","useConvention","modulesPath","viewsPath","areasPath","reg","RegExp","convertModuleIdToViewId","moduleId","translateViewIdToArea","area","locateViewForObject","elementsToSearch","view","getView","locateView","viewUrl","determineFallbackViewId","funcNameRegex","results","exec","constructor","viewOrUrlOrId","existing","ko","normalizeBindingInstruction","result","undefined","applyBindings","doBind","bindingTarget","data","binder","throwOnErrors","insufficientInfoMessage","unexpectedViewMessage","viewName","instruction","binding","utils","domData","set","koBindingContextKey","$data","bindingComplete","bindingInstructionKey","e","getBindingInstruction","bindContext","bindingContext","createChildContext","ensureSettings","settings","closeOnDeactivate","activator","defaults","beforeActivate","afterDeactivate","affirmations","interpretResponse","areSameItem","invoke","target","deactivate","item","close","setter","reason","activate","newItem","activeItem","callback","activationData","canDeactivateItem","lifecycleData","canDeactivate","resultOrPromise","canActivateItem","canActivate","createActivator","initialActiveItem","activeData","observable","computed","read","write","newValue","viaSetter","activateItem","__activator__","isActivating","deactivateItem","notifySubscribers","newActivationData","currentItem","dfd2","toCheck","toActivate","includeIn","forItems","items","determineNextItemToActivate","list","lastIndex","toRemoveAt","index","oldItem","remove","originalCanDeactivate","finish","j","originalDeactivate","listLength","can","isString","arrayIndexOf","toLowerCase","currentActivationData","create","isActivator","object","viewLocator","getHostState","elements","state","childElements","activeView","child","virtualElements","firstChild","activeViewAttributeName","nextSibling","endComposition","compositionCount","compositionCompleteCallbacks","cleanUp","viewElements","tryActivate","successCallback","skipActivation","model","triggerAttach","removeAttribute","attached","composingNewView","alwaysTriggerAttach","detached","domNodeDisposal","addDisposeCallback","e2","shouldTransition","transition","skipTransitionOnSameViewId","cloneNodes","nodesArray","newNodesArray","clonedNode","cloneNode","replaceParts","parts","replacementParts","composition","getParts","standardParts","partId","replaceWith","removePreviousView","len","children","childNodes","arrayChildren","removeNode","hide","visibilityKey","style","display","show","hasComposition","dataBind","composeBindings","dummyModel","bindableSettings","compositionTransaction","complete","convertTransitionToModuleId","defaultTransitionName","addBindingHandler","config","initOptionsFactory","handler","dataKey","bindingHandlers","init","valueAccessor","allBindingsAccessor","viewModel","trigger","update","isReplacementSearch","hasChildNodes","finalize","transitionModuleId","cacheViews","emptyNode","bindAndShow","preserveContext","prepend","modelToBind","currentModel","dataFor","recreatedView","defaultStrategy","getSettings","unwrapObservable","activatorPresent","attrName","executeStrategy","strategy","inject","compose","fromBinding","compositionComplete","hostState","controlsDescendantBindings","mode","allowedBindings","eventSplitter","Events","Subscription","owner","events","off","calls","event","callbacks","split","shift","splice","all","concat","proxy","arg","targetObject","loadPlugins","allPluginIds","loaded","currentModule","install","allPluginConfigs","app","title","configurePlugins","baseUrl","pluginIds","start","document","setRoot","root","applicationHost","hostElement","getElementById","initialize","browserInfo","getBrowserInfo","browserSupport","isFirefox","isMobileDevice","isSupportedMobile","isSupportedBrowser","isChromeWithPageCoordsBug","isSafari","navigator","userAgent","ua","match","appVersion","tem","N","appName","M","browser","parseInt","platform","v","execute","offset","x","pageX","left","y","pageY","top","click","autofocus","find","focus","autosize","setOverflowX","setOverflowY","background","css","src","image","Image","onload","height","width","getColorValue","color","settingColor","_","colors","templateSettings","less","getDefaultBasicColor","tree","Color","dimension","Dimension","functions","functionRegistry","toRGB","circleProgress","$element","score","progress","lineWidth","centerX","centerY","radius","cnxt","getContext","isMastered","masteryScore","addClass","basic","basicColor","progressColor","mastered","masteredColor","beginPath","strokeStyle","arc","PI","closePath","stroke","__context__","contextCallback","wrapElement","each","$image","$wrapper","cssFloat","$parent","closest","hasClass","wrap","table","$table","attr","iframe","$iframe","encodeURIComponent","getStyles","LessProcessor","vars","JSON","stringify","@main-color","@content-body-color","@text-color","elementsWrap","focusHandler","elem","wrapper","focusin","blur","is","hover","toggleClass","removeClass","toggleVisible","isExpanded","$animationContainer","slideDown","animate","dropDown","expandedClass","$html","scrollTop","time","unwrap","$document","isScrolling","isEnabled","scroll","bottom","opacity","scrollToElement","scrollIntoView","getLocalizedText","TranslationPlugin","getTextByKey","text","replacement","questionTypes","multipleSelect","fillInTheBlank","dragAndDrop","singleSelectText","singleSelectImage","textMatching","hotspot","statement","informationContent","openQuestion","scenario","rankingText","defaultImageUrl","appClosed","onError","appInitialized","imagePreviewClosed","localStorageProgressKey","localStorageResultKey","course","statuses","completed","failed","inProgress","progressContext","saved","ignored","documents","types","pdf","word","exel","powerpoint","zip","downloadLocalizationKey","containerSelector","downloadBtnSelector","documentTitleWrapperSelector","iframeSelector","sizeAttrName","typeAttrName","dialogs","resendResults","webhooks","resultsSendErrorTitleKey","endpointNameKey","loginTypes","byToken","byEmailAndName","byEmailAndNameWithoutCrossDeviceSaving","default","localizationManager","constants","getSize","size","toFixed","getDocumentBlockContent","$output","$container","downloadText","documentData","type","documentSizeString","downloadBtnText","iconClass","$typeIcon","$typeIconWrapper","append","documentBlockHelper","getContentBlockType","contentBlock","hotspotOnImage","HotspotStorage","content","getScoreTooltipText","mastery","scoreToComplete","toolTip","showTooltip","$tootlTipText","stop","margin-bottom","hideTooltip","toElement","relatedTarget","$canvasParent","parentNode","$toolTip","updateTooltipPosition","masteryScoreAngle","masteryScoreX","cos","masteryScoreY","sin","tooltipPosX","toolTipPosY","appendTo","focusout","downloadFile","filename","fetch","response","status","json","blob","isChrome","reader","FileReader","out","Blob","open","readAsDataURL","download","fileDownloader","setStatus","buttonStatuses","proggress","serverError","disableLink","$link","pointer-events","getBaseUrl","location","href","hash","pathname","pageName","pop","search","getFullPdfFilename","downloadAsPdf","serviceUrl","timeoutId","Url","addQueryStringParam","substr","convertionUrl","clearTimeout","catch","getVariablesList","mediaPlayer","embedCode","variablesList","empty","customFocus","removeFocusClass","focusClass","class","unbind","stopPropagation","updateHash","fragment","routeStripper","rootStripper","isExplorer","trailingSlash","history","interval","active","getHash","getFragment","forcePushState","_hasPushState","_wantsHashChange","options","hashChange","_wantsPushState","pushState","docMode","documentMode","oldIE","contentWindow","navigate","checkUrl","_checkUrlInterval","setInterval","loc","atRoot","replaceState","silent","loadUrl","clearInterval","fragmentOverride","routeHandler","assign","navigateBack","back","routeStringToRegExp","routeString","escapeRegExp","optionalParam","namedParam","optional","splatParam","stripParametersFromRoute","route","colonIndex","endsWith","suffix","compareArrays","second","startDeferred","rootRouter","createRouter","hasChildRouter","instance","router","setCurrentInstructionRouteIsActive","flag","currentInstruction","isActive","completeNavigation","fromModuleId","currentActivation","toModuleId","updateDocumentTitle","explicitNavigation","navigatingBack","cancelNavigation","activeInstruction","isProcessing","redirect","activateRoute","params","succeeded","previousActivation","fullFragment","queryString","handleGuardedRoute","guardRoute","ensureActivation","canReuseCurrentActivation","canReuseForRoute","dequeueInstruction","queue","queueInstruction","unshift","createParams","routePattern","decodeURIComponent","queryParams","parseQueryString","configureRoute","isRegExp","convertRouteToTitle","convertRouteToModuleId","convertRouteToHash","routes","paramInfo","mapRoute","nav","handlers","navigationModel","observableArray","isNavigating","processing","currentRouterIsProcesing","__router__","queryObject","pairs","pair","coreFragment","queryIndex","relativeToParentRouter","join","charAt","toUpperCase","buildNavigationModel","defaultOrder","fallbackOrder","isNumber","sort","a","b","mapUnknownRoutes","replaceRoute","catchAllPattern","reset","makeRelative","fromParent","createChildRouter","childRouter","targetIsThisWindow","targetWindow","delegate","evt","altKey","ctrlKey","metaKey","shiftKey","preventDefault","theRouter","reviewable","getQueryStringValue","limitedLengthText","maxLength","perfectScrollbar","scrollbar","valueAccessors","refreshScrollAfterDomChanged","scrollHeight","customScrollbarContainer","clientHeight","timeout","scrollToEndAfterDOMChanged","scrollEnabled","classList","toggle","cssClasses","overflow-y","byClass","checkDOMChanges","scrollStarted","scrollFinished","getElementsByClassName","suppressScrollX","addEventListener","add","destroy","localizeValue","isEmpty","isUndefined","localize","fontScale","coef","fSize","lHeight","checkResolution","checker","isLowResolution","lazyWindowResizeHandler","debounce","screenResolutionChecker","treeOfContentAnimations","onResolutionChanged","expanded","visibility","webkitTtransition","$body","max-height","overflow","onIsExpandedChanged","resolutionChangeSubscription","subscribe","expandedChangeSubscription","dispose","selectText","select","submitOnEnter","allBindings","keydown","which","keyDown","bindingData","keyDownEventHandler","keyCode","tabFocus","keyboardClass","copyToClipboard","targets","texts","copied","Clipboard","targetTexts","itemText","changeClass","delay","fromClass","toClass","getOriginalImageUrl","imageUrl","originalImage","coincidences","imageResizerQueryPattern","getImageSize","img","onerror","onabort","getResizedSectionThumbnailUrl","imageWidth","imageHeight","containImage","imageProps","resizedImageUrl","backgroundSize","lessColor","conditions","outputColor","func","editableText","onEnterKeyPress","updateValue","scrollLeft","courseStarted","courseFinished","courseFinalized","courseEvaluated","answersSubmitted","learningContentExperienced","turnAllEventsOff","subscribeForEvent","unsubscribeForEvent","executeAfterSubscribersDone","sendParentProgress","spentTime","eventData","isNullOrUndefined","Q","promises","eventManager","spec","templateId","createdBy","createdOn","authorContactEmail","authorPersonalPhone","authorShortBio","authorAvatarUrl","hasIntroductionContent","sections","isFinished","affectProgressSections","filter","section","affectProgress","sum","itemCount","isOverall","reduce","memo","questions","question","floor","isCompleted","some","getStatus","setFinishedStatus","withoutEvent","markAsAnswered","alert","fin","evaluate","hasSurveyQuestions","isSurvey","questionsLength","throwIfNotAnObject","throwIfNotString","throwIfNotBoolean","bool","throwIfNotArray","array","throwIfNotDate","date","isDate","throwIfNotNumber","number","ContentBlock","contentUrl","callbackParam","query","ajax","jsonp","dataType","post","toJSON","contentType","guard","http","Question","_protected","shortId","sectionId","learningContents","questionInstructions","isAnswered","isCorrectAnswered","isInformationContent","feedback","hasCorrect","hasCorrectFeedback","correct","hasIncorrect","hasIncorrectFeedback","incorrect","loadFeedback","loadLearningContent","loadQuestionInstructions","load","voiceOver","loadContent","getProgress","restoreProgress","submitAnswer","submit","requests","feedbackUrlPath","correctFeedbackContentUrl","incorrectFeedbackContentUrl","loadPage","allSettled","Answer","isCorrect","matchCase","CheckableAnswer","isChecked","MultipleSelectQuestion","answers","answer","checkedAnswerIds","contains","calculateScore","chain","AnswerGroup","answeredText","getCorrectText","checkIsCorrect","correctAnswers","where","answerGroupValue","FillInTheBlankQuestion","hasContent","answerGroupsValues","answerGroups","answerGroup","inputValues","saveAnsweredTexts","answerGroupValues","pointer","group","ctx","DraggableAnswer","correctPosition","currentPosition","DragAndDropQuestion","dropspots","dragableTexts","answersArray","dragableText","CheckableImageAnswer","SingleSelectImageQuestion","correctAnswerId","checkedAnswerId","answerId","checked","TextMatchingQuestion","attemptedValue","attempted","getScore","every","InformationContent","allowContentPagesScoring","superSubmitAnswer","isNaN","SatementAnswer","userAnswer","StatementAnswer","StatementQuestion","statements","userAnswers","Hotspot","spots","isMultiple","placedMarks","marks","mark","answerCorrect","spotsWithMarks","marksOnSpots","spot","markIsInSpot","uniq","inside","xi","yi","xj","yj","OpenQuestion","ScenarioQuestion","embedUrl","projectId","RankingTextQuestion","correctOrder","rankingItems","shuffle","pattern","pluck","answered","isEqual","intersection","RankingText","createQuestion","questionData","learningContent","mapContentBlock","questionId","childItem","Course","Section","publishSettings","questionsFactory","mapCourse","questionShortIds","Date","_response","cache","done","parse","isInReviewAttemptMode","backgroundSettings","repeat","fullscreen","position","right","leftTop","rightTop","leftBottom","rightBottom","cover","displaySettings","viewSettings","pdfExportEnabled","viewmodel","pdfServiceUrl","pdfConverterUrl","logo","maxWidth","maxHeight","backgroundType","header","option","bgSettings","backgroundProps","brightness","isBodyEnabled","body","enabled","backgroundPosition","backgroundRepeat","getCssName","lastIndexOf","cssName","headerHeightDepender","innerHeight","actual","draggableText","scope","draggable","revert","helper","draggableTextContainer","droppable","accept","drop","ui","dropSpot","dropspot","outerWidth","outerHeight","tolerance","isWriteableObservable","placed","$draggableTextContainer","$textChildren","preventDefaultTouchEvent","preventBehavior","fillInTheBlankAnswers","defaultText","blank","val","trim","stopPropagationHandler","$source","removeAttr","clone","revertDuration","activeClass","hoverClass","acceptValue","rejectValue","overlay","syncHeight","debounced","textArea","openPreviewImage","showOverlay","setPreviewImage","imagePreviewModel","imageId","isVisible","closePreview","hideOverlay","isLoaded","imagePreview","previewImage","fade","fadeIn","fadeOut","updatePreviewImageSize","browserWidth","max","documentElement","clientWidth","innerWidth","browserHeight","className","imageLoader","resizeHandler","orientationChangeHandler","maxSize","blockBodyScroll","isBlocked","ratingContainer","ratingItem","ratingItemBtn","ratingTipContainer","highlighted","rating","applyRatingStyles","onValueUpdated","mouseleave","$li","elementsClasses","texture","applyImage","applyColor","applyBrightness","background-color","background-image","background-position","-webkit-background-size","background-size","background-repeat","secondaryBackground","executed","isNavigationLocked","lock","urlParams","regex","extender","supportedBrowser","isBrowserSupported","reviewApiUrl","postMessage","supportsNativeReview","pluginsLocalizationService","languages","selected","reviewPlugin","ReviewPlugin","courseId","renderSpots","browsers","addStyle","head","getElementsByTagName","link","createElement","rel","mainFolder","media","appendChild","task","ie","edge","getCollection","tasks","run","loadModule","modulePath","requireModules","messsage","headers","UrlProvider","progressStorageUrl","courseLink","self","fcall","protocol","host","httpWrapper","urlProvider","_private","tokenKey","shortTermAccessKey","getToken","localStorage","getItem","removeToken","removeItem","auth","defineProperty","x-access-token","setItem","setToken","exists","email","identify","signin","password","rememberMe","shortTermAccess","token","register","getValueFromUrl","signout","sendSecreLink","courseTitle","sendMail","returnLink","forgotpassword","returnUrl","LoginHelper","username","getLoginMethod","allowCrossDeviceSaving","loginHelper","UserContext","account","keepMeLoggedIn","getCurrentUser","user","use","userInfoProvider","accountId","getAccountId","accountHomePage","getAccountHomePage","getUsername","homePage","_initialized","clear","authenticated","authenticatedUser","dataContext","userContext","save","storage","savedProgressResults","saveProgress","saveResults","navigated","finished","isNull","authenticationSkipped","questionAnswered","removeProgress","restore","onbeforeunload","ready","attemptId","RavenWrapper","raven","Raven","errorTrackingServiceUrl","logger","ignoreErrors","ignoreUrls","autoBreadcrumbs","xhr","dom","setUserContext","captureError","captureMessage","level","ravenWrapper","ErrorTracker","userInfo","trackError","errorTracker","addErrorHandler","progressProvider","moduleLoader","appExtender","hasModule","moduleName","_loadedModules","loadModulesSequentially","modulesIds","initializeModule","extendAppFromModule","onModuleLoadingFailed","manifest","customisations","WebFontLoader","fonts","styles","loadCustomStyles","modulesInitializer","publishMode","isScormEnabled","isReview","isPreview","xApi","nps","paths","durandal","plugins","transitions","jQuery","WebFont","Ps","bootstrapper","modulesLoader","publishModeProvider","initializeApp","errorTracking","dialog","widget","ConfigurationReader","configsFiles","configs","translations","Header","_instance","isCourseTitleTooLong","SocialNetworks","getAuthLink","_getAuthLink","facebookAuthLink","linkedinAuthLink","googleAuthLink","socialNetwork","validateCallback","isValid","isModified","hasFocus","markAsModified","verbs","started","en-US","stopped","passed","experienced","progressed","evaluated","interactionTypes","choice","fillIn","matching","sequencing","other","activityTypes","objective","extenstionKeys","surveyMode","questionType","answerTexts","patterns","isoDuration","accessLimitationEnabled","accessLimitation","userHasAccess","allowedUsers","accessLimitationSettings","mapRoutes","initxApi","selectedLrs","defaultXapi","initNps","defaultNps","scoresDistribution","positiveVerb","anonymousCredentials","allowedVerbs","defaultLanguage","xApiVersion","lrsHost","defaultLRSUrl","lrs","uri","authenticationRequired","credentials","npsHost","defaultNpsUrl","base64","_keyStr","encode","input","chr1","chr2","chr3","enc1","enc2","enc3","enc4","output","_utf8_encode","charCodeAt","decode","String","fromCharCode","_utf8_decode","string","utftext","n","c1","c2","c3","errors","invalidEndpoint","notFoundEndpoint","invalidCredentials","invalidEmail","invalidProtocol","xDomainRequestError","timeoutError","badRequest","unhandledMessage","verbIsIncorrect","actorDataIsIncorrect","notEnoughDataInSettings","handleError","navigateUrl","send","requestOptions","failedCallback","attemptNumber","textStatus","sendResultAttemptsCount","serverProblemStatus","noInternetConnectionStatus","sendResultAttemptsTimeout","xApiSettings","errorsHandler","requestResender","states","notInitialized","initPromise","initXDomainRequestTransport","initialized","initializationFailed","sendStatement","createRequestOptions","support","cors","getOptionsForIEMode","request","getErrorMessage","XDomainRequest","ajaxTransport","s","xdr","statusText","responses","responseHeaders","ontimeout","responseText","errorMessage","abort","newUrl","formData","qsIndex","headerName","userName","async","beforeSend","xmlHttpRequest","setRequestHeader","throwIfNotISODuration","duration","throwIfNotMbox","mbox","throwIfNotEmail","throwIfNotLanguageMap","locale","throwIfNotVerbId","isVerIdValid","verb","actor","timestamp","toISOString","objectType","interactionType","correctResponsesPattern","choices","activityDefinition","definition","scaled","raw","registration","contextActivities","extensions","grouping","timeToISODurationString","timeInMilliseconds","hours","minutes","enqueue","dequeue","getSectionByQuestionId","foundSection","requestManager","sendLrsStatement","sendNpsStatement","getUrl","settingsUrl","statementModel","activityModel","activityDefinitionModel","resultModel","scoreModel","contextModel","contextActivitiesModel","languageMapModel","interactionDefinitionModel","dateTimeConverter","statementQueue","globalConstants","sectionRepository","courseContext","statementSender","actorModel","initActivity","activityName","activityUrl","activityProvider","rootCourseUrl","initActor","createActor","subscribeToxApiEvents","unsubscribeFromxApiEvents","subscribeToEvent","enqueueCourseStarted","enqueueCourseFinished","enqueueLearningContentExperienced","enqueueQuestionAnsweredStatement","unsubscribeFromEvent","subscribeToNpsEvents","unsubscribeFromNpsEvents","handleCourseEvaluated","turnOffSubscriptions","subscriptions","subscription","createStatement","createActivity","createContextModel","pushStatementIfSupported","sectionUrl","enqueueCourseProgressedStatement","enqueueSectionProgressedStatement","getLearningContentExperiencedStatement","contextObj","getSelectTextQuestionActivityAndResult","getFillInQuestionActivityAndResult","getSingleSelectImageQuestionAcitivityAndResult","getStatementQuestionActivityAndResult","getDragAndDropTextQuestionActivityAndResult","getMatchingQuestionActivityAndResult","getHotSpotQuestionActivityAndResult","getOpenQuestionActivityAndResult","getScenarioQuestionActivityAndResult","getRankingTextQuestionActivityAndResult","getInformationContentActivityAndResult","parentUrl","getItemsIds","description","flatten","spotCoordinates","learningContentUrl","groupingUrl","contextSpec","contextExtensions","sessionId","activity","activityData","eventName","eventHandler","turnOffxApiSubscriptions","turnOffNpsSubscriptions","handle","routingManager","xApiSettingsConfig","statementQueueHandler","appConstants","xApiReportingSettings","npsReportingSettings","npsSettings","isCourseStarted","checkIsCourseStarted","initializeTracking","activateReporting","onInitializationFailed","initializeActor","deactivateLrsReporting","deactivateNpsReporting","xApiInitializer","isInitialized","initializeActorFromContext","initializeActivity","isUserAuthenticated","activateXapiReporting","activateNpsReporting","isLrsReportingInitialized","isNpsReportingInitialized","referrer","accessLimiter","guardViewUrl","guardView","defaultGuard","loginGuardSkipped","createGuard","xapiEnabled","npsEnabled","currentRoute","checkUserPermission","skipLoginGuard","progressKey","resultKey","LocalStorageProgressProvider","ProgressStorageProvider","_progress","setProgress","getProgressFromServer","jsonProgress","LocalStorageProvider","provider","_psProvider","_lsProvider","initProgressStorage","lsprogress","clearLocalStorage","validatedValue","isActivatedPreviously","requestProcessing","socialNetworks","socialLoginEnabled","checkUser","replaceWindow","crossDeviceEnabled","userExists","_navigate","skip","skipAllowed","allowLoginViaSocialMedia","required","_isRouteCorrect","displayTreeOfContent","showExitButton","rootLinkEnabled","showExitButtonInReviewMode","mainRoutes","xAPI","crossDeviceSaving","backToSignin","activateXapi","toggleRememberMe","togglePasswordVisibility","isPasswordVisible","whitespaceRegex","noSpaces","moreThanSevenSymbols","onKeyUp","emailPasswordCombination","sendSecretLink","isSecretLinkSent","isRestorePasswordEmailSent","toggleValueAfterSomeTime","forgotPassword","toggleKeepMeLoggedIn","exit","progressStorageActivated","isSecondRemarkShouldBeShown","Dialog","handleKeyDown","focusableState","getFocusableState","entries","activeElement","firstFocusable","lastFocusable","querySelectorAll","currentFocusable","closed","removeEventListener","textColor","correctColor","contentBodyColor","buttonTextColor","colorName","feedbackColor","mainColor","courseRepository","currentStep","steps","evaluation","isReporting","isFeedbackEditing","evaluationStepTitleKey","evaluationStepTitle","isCompositionComplete","goToFeedbackStep","end","finalized","isCourseEmbedded","isEvaluationStep","isFeedbackStep","isLastStep","throwIfNotDefined","resend","next","resultsSendErrorTitleText","localizeText","endpointNameText","retryCount","isResendingResults","hideDialog","retriesExceeded","animateNates","skipResultsSending","parameter","parameterName","resendingFailed","startNewAttempt","isStartingNewAttempt","startHandle","lastError","shouldCloseWindow","opener","resultCallbackUrl","resultCallbackUrlParameterName","onCourseFinished","xhrFields","withCredentials","CertificateProvider","getCertificateUrl","logoUrl","getCulture","urlCheckPattern","getNavigationContext","currentItemIndex","_getItemIndexById","previousQuestionUrl","_getQuestionUrl","currentQuestionUrl","nextQuestionUrl","questionsCount","currentQuestionIndex","nextSectionUrl","getNextSectionUrl","redirectToQuestion","collection","itemId","count","nextSection","getNextSection","currentSection","WebhooksModule","webhooksSettings","sendResults","learnerId","finishedOn","Content-Type","MultipleSelect","isSurveyModeEnabled","checkItem","tryAnswerAgain","SingleSelectText","FillInTheBlank","blankValue","DragAndDrop","selectedDropspot","selectedText","SingleSelectImage","canHover","Source","Target","TextMatching","values","sources","Statement","markStatementAsTrue","markStatementAsFalse","isTrueChecked","isFalseChecked","HotSpot","addMark","removeAll","removeMark","feedbackView","instanceId","isEmptyOrWhitespace","Branchtrack","branchtrackProvider","customSubmitViewModel","valueHasMutated","getViewModel","navigationModule","questionViewModelFactory","QuestionContent","copyright","correctFeedback","incorrectFeedback","feedbackResultText","submitViewModel","navigationContext","activeQuestionViewModel","isWrongAnswered","updateFeedbackResultText","hideTryAgain","isGoToNextSectionVisible","isGoToResultsVisible","updateNavigationState","hideFinishActionButtons","navigateNext","nextUrl","goToNextSection","goToResults","toggleExpand","appOperations","certificateProvider","npsDialog","newAttemptDialog","resendResultsDialog","canDownloadCertificate","allowCertificateDownload","xAPIEnabled","scormEnabled","stayLoggedIn","mapSection","readyToFinish","certificateDownloaded","preparingCertificate","downloadCertificate","always","doFinishCourse","sendingRequests","finishHandler","progressStatuses","sendWebhooks","isDownloadingCertificate","toggleStayLoggedIn","entity","readedContents","isQuestion","amountOfQuestions","correctQuestions","amountOfContents","TreeNode","canNavigate","QuestionTreeNode","hasChildren","activateQuestion","hasActiveQuestion","isQuestionToActivate","toggleIsExpanded","SectionTreeNode","treeNode","initializeRoute","isQuestionActivated","isExpandedForQuestionView","isQuestionActivatedForPreviousRoute","homeUrl","hideContinueLaterButton","confirm","continueLaterPopup","actions","isProgressSaved","isProgressNotSaved","finishAction","takeABreakAction","allowAuthorsBio","startCourse","questionRepository","backToSections","isNextQuestionAvailable","goNext","isPreviousQuestionAvailable","goPrevious","getActiveContentViewModel","isSectionMastered","startTime","activeViewModel","ExpandableBlock","submitCallback","canBeSubmitted","repository","getSectionButtonAccessibilityLabel","buttonTranslationKey","scoreTooltipText","sectionThumbnail","sectionsPage","sectionsLayout","goToFirstQuestion","caption","questionsNavigation","lti","initializeUrlProvider","initializeWebhooks","initializeProgressProvider","initApp","initRouter","exitButtonVisible","treeOfContentVisible","treeOfContent","activeInstructionConfig","isInReviewMode","isClosed","isNavigatingToAnotherView","inIframe","newView","pdfExport","isNotAccountModule","currentView","navigateBackUrl","allowToContinue","restartCourse","rootUrl","continueLearning","backUrl","endValues","marginRight","marginLeft","clearValues","endTransition","isObservable","scrollIfNeeded","keepScrollPosition","startTransition","startValues","fadeOnly","$child","easing","ensureDialogInstance","objOrModuleId","contexts","dialogCount","MessageBox","defaultTitle","defaultOptions","selectOption","dialogResult","defaultViewMarkup","setViewUrl","currentZIndex","getNextZIndex","isOpen","addContext","dialogContext","createCompositionSettings","getDialog","__dialog__","theDialog","dialogActivator","success","closeSuccess","removeHost","addHost","showMessage","showDialog","messageBox","messageBoxView","blockoutOpacity","removeDelay","blockout","z-index","oldBodyMarginRight","oldInlineMarginRight","oldBodyOuterWidth","oldScrollTop","newBodyOuterWidth","loadables","$this","setDialogPosition","windowHeight","constrainedHeight","min","margin-top","margin-left","shouldIgnorePropertyName","propertyName","isNode","canConvertType","jquery","nonObservableTypes","makeObservableArray","original","lookup","__observable__","notify","__full__","observableArrayMethods","methodName","methodCallResult","observableArrayFunctions","arrayMethods","valueWillMutate","arrayProto","additiveArrayFunctions","convertObject","convertProperty","logConversion","innerSetter","peek","destroyAll","oa","configurable","enumerable","evaluatorOrOptions","computedOptions","deferEvaluation","observableModule","fn","skipConversion","typeAttribute","space","replacer","serialize","getTypeId","typeMap","registerType","reviver","getConstructor","typeId","ctor","fromJSON","deserialize","extractParts","widgetDataKey","kindModuleMaps","kindViewMaps","kind","registerKind","mapKind","mapKindToModuleId","convertKindToModulePath","mapKindToViewId","convertKindToViewPath","compositionSettings","bindingName","kinds","toRegister","fs","Cc","Ci","xpcIsWindows","progIds","xmlRegExp","bodyRegExp","hasLocation","defaultProtocol","defaultHostName","hostname","defaultPort","port","buildMap","masterConfig","strip","matches","jsEscape","createXhr","progId","XMLHttpRequest","ActiveXObject","parseName","modName","ext","temp","isRelative","xdRegExp","useXhr","uProtocol","uHostName","uPort","finishLoad","onLoad","isBuild","req","inlineText","parsed","nonStripName","toUrl","pluginName","asModule","writeFile","extPart","fileName","textWrite","contents","env","process","versions","node","nodeRequire","errback","file","readFileSync","onXhr","onreadystatechange","readyState","onXhrComplete","Packages","java","stringBuffer","line","io","File","lineSeparator","lang","System","getProperty","BufferedReader","InputStreamReader","FileInputStream","StringBuffer","readLine","Components","classes","interfaces","inStream","convertStream","fileObj","readData","FileUtils","createInstance","nsIFileInputStream","nsIConverterInputStream","available","DEFAULT_REPLACEMENT_CHARACTER","readString","path"],"mappings":"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","file":"main.build.js?v=1552304184357","sourcesContent":["/**\n * Durandal 2.0.1 Copyright (c) 2012 Blue Spire Consulting, Inc. All Rights Reserved.\n * Available via the MIT license.\n * see: http://durandaljs.com or https://github.com/BlueSpire/Durandal for details.\n */\n/**\n * The system module encapsulates the most basic features used by other modules.\n * @module system\n * @requires require\n * @requires jquery\n */\ndefine('durandal/system',['require', 'jquery'], function(require, $) {\n    var isDebugging = false,\n        nativeKeys = Object.keys,\n        hasOwnProperty = Object.prototype.hasOwnProperty,\n        toString = Object.prototype.toString,\n        system,\n        treatAsIE8 = false,\n        nativeIsArray = Array.isArray,\n        slice = Array.prototype.slice;\n\n    //see http://patik.com/blog/complete-cross-browser-console-log/\n    // Tell IE9 to use its built-in console\n    if (Function.prototype.bind && (typeof console === 'object' || typeof console === 'function') && typeof console.log == 'object') {\n        try {\n            ['log', 'info', 'warn', 'error', 'assert', 'dir', 'clear', 'profile', 'profileEnd']\n                .forEach(function(method) {\n                    console[method] = this.call(console[method], console);\n                }, Function.prototype.bind);\n        } catch (ex) {\n            treatAsIE8 = true;\n        }\n    }\n\n    // callback for dojo's loader \n    // note: if you wish to use Durandal with dojo's AMD loader,\n    // currently you must fork the dojo source with the following\n    // dojo/dojo.js, line 1187, the last line of the finishExec() function: \n    //  (add) signal(\"moduleLoaded\", [module.result, module.mid]);\n    // an enhancement request has been submitted to dojo to make this\n    // a permanent change. To view the status of this request, visit:\n    // http://bugs.dojotoolkit.org/ticket/16727\n\n    if (require.on) {\n        require.on(\"moduleLoaded\", function(module, mid) {\n            system.setModuleId(module, mid);\n        });\n    }\n\n    // callback for require.js?v=1552304184357 loader\n    if (typeof requirejs !== 'undefined') {\n        requirejs.onResourceLoad = function(context, map, depArray) {\n            system.setModuleId(context.defined[map.id], map.id);\n        };\n    }\n\n    var noop = function() { };\n\n    var log = function() {\n        try {\n            // Modern browsers\n            if (typeof console != 'undefined' && typeof console.log == 'function') {\n                // Opera 11\n                if (window.opera) {\n                    var i = 0;\n                    while (i < arguments.length) {\n                        console.log('Item ' + (i + 1) + ': ' + arguments[i]);\n                        i++;\n                    }\n                }\n                // All other modern browsers\n                else if ((slice.call(arguments)).length == 1 && typeof slice.call(arguments)[0] == 'string') {\n                    console.log((slice.call(arguments)).toString());\n                } else {\n                    console.log.apply(console, slice.call(arguments));\n                }\n            }\n            // IE8\n            else if ((!Function.prototype.bind || treatAsIE8) && typeof console != 'undefined' && typeof console.log == 'object') {\n                Function.prototype.call.call(console.log, console, slice.call(arguments));\n            }\n\n            // IE7 and lower, and other old browsers\n        } catch (ignore) { }\n    };\n\n    var logError = function(error) {\n        if(error instanceof Error){\n            throw error;\n        }\n\n        throw new Error(error);\n    };\n\n    /**\n     * @class SystemModule\n     * @static\n     */\n    system = {\n        /**\n         * Durandal's version.\n         * @property {string} version\n         */\n        version: \"2.0.1\",\n        /**\n         * A noop function.\n         * @method noop\n         */\n        noop: noop,\n        /**\n         * Gets the module id for the specified object.\n         * @method getModuleId\n         * @param {object} obj The object whose module id you wish to determine.\n         * @return {string} The module id.\n         */\n        getModuleId: function(obj) {\n            if (!obj) {\n                return null;\n            }\n\n            if (typeof obj == 'function') {\n                return obj.prototype.__moduleId__;\n            }\n\n            if (typeof obj == 'string') {\n                return null;\n            }\n\n            return obj.__moduleId__;\n        },\n        /**\n         * Sets the module id for the specified object.\n         * @method setModuleId\n         * @param {object} obj The object whose module id you wish to set.\n         * @param {string} id The id to set for the specified object.\n         */\n        setModuleId: function(obj, id) {\n            if (!obj) {\n                return;\n            }\n\n            if (typeof obj == 'function') {\n                obj.prototype.__moduleId__ = id;\n                return;\n            }\n\n            if (typeof obj == 'string') {\n                return;\n            }\n\n            obj.__moduleId__ = id;\n        },\n        /**\n         * Resolves the default object instance for a module. If the module is an object, the module is returned. If the module is a function, that function is called with `new` and it's result is returned.\n         * @method resolveObject\n         * @param {object} module The module to use to get/create the default object for.\n         * @return {object} The default object for the module.\n         */\n        resolveObject: function(module) {\n            if (system.isFunction(module)) {\n                return new module();\n            } else {\n                return module;\n            }\n        },\n        /**\n         * Gets/Sets whether or not Durandal is in debug mode.\n         * @method debug\n         * @param {boolean} [enable] Turns on/off debugging.\n         * @return {boolean} Whether or not Durandal is current debugging.\n         */\n        debug: function(enable) {\n            if (arguments.length == 1) {\n                isDebugging = enable;\n                if (isDebugging) {\n                    this.log = log;\n                    this.error = logError;\n                    this.log('Debug:Enabled');\n                } else {\n                    this.log('Debug:Disabled');\n                    this.log = noop;\n                    this.error = noop;\n                }\n            }\n\n            return isDebugging;\n        },\n        /**\n         * Logs data to the console. Pass any number of parameters to be logged. Log output is not processed if the framework is not running in debug mode.\n         * @method log\n         * @param {object} info* The objects to log.\n         */\n        log: noop,\n        /**\n         * Logs an error.\n         * @method error\n         * @param {string|Error} obj The error to report.\n         */\n        error: noop,\n        /**\n         * Asserts a condition by throwing an error if the condition fails.\n         * @method assert\n         * @param {boolean} condition The condition to check.\n         * @param {string} message The message to report in the error if the condition check fails.\n         */\n        assert: function (condition, message) {\n            if (!condition) {\n                system.error(new Error(message || 'Assert:Failed'));\n            }\n        },\n        /**\n         * Creates a deferred object which can be used to create a promise. Optionally pass a function action to perform which will be passed an object used in resolving the promise.\n         * @method defer\n         * @param {function} [action] The action to defer. You will be passed the deferred object as a paramter.\n         * @return {Deferred} The deferred object.\n         */\n        defer: function(action) {\n            return $.Deferred(action);\n        },\n        /**\n         * Creates a simple V4 UUID. This should not be used as a PK in your database. It can be used to generate internal, unique ids. For a more robust solution see [node-uuid](https://github.com/broofa/node-uuid).\n         * @method guid\n         * @return {string} The guid.\n         */\n        guid: function() {\n            return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n                var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);\n                return v.toString(16);\n            });\n        },\n        /**\n         * Uses require.js?v=1552304184357 to obtain a module. This function returns a promise which resolves with the module instance. You can pass more than one module id to this function or an array of ids. If more than one or an array is passed, then the promise will resolve with an array of module instances.\n         * @method acquire\n         * @param {string|string[]} moduleId The id(s) of the modules to load.\n         * @return {Promise} A promise for the loaded module(s).\n         */\n        acquire: function() {\n            var modules,\n                first = arguments[0],\n                arrayRequest = false;\n\n            if(system.isArray(first)){\n                modules = first;\n                arrayRequest = true;\n            }else{\n                modules = slice.call(arguments, 0);\n            }\n\n            return this.defer(function(dfd) {\n                require(modules, function() {\n                    var args = arguments;\n                    setTimeout(function() {\n                        if(args.length > 1 || arrayRequest){\n                            dfd.resolve(slice.call(args, 0));\n                        }else{\n                            dfd.resolve(args[0]);\n                        }\n                    }, 1);\n                }, function(err){\n                    dfd.reject(err);\n                });\n            }).promise();\n        },\n        /**\n         * Extends the first object with the properties of the following objects.\n         * @method extend\n         * @param {object} obj The target object to extend.\n         * @param {object} extension* Uses to extend the target object.\n         */\n        extend: function(obj) {\n            var rest = slice.call(arguments, 1);\n\n            for (var i = 0; i < rest.length; i++) {\n                var source = rest[i];\n\n                if (source) {\n                    for (var prop in source) {\n                        obj[prop] = source[prop];\n                    }\n                }\n            }\n\n            return obj;\n        },\n        /**\n         * Uses a setTimeout to wait the specified milliseconds.\n         * @method wait\n         * @param {number} milliseconds The number of milliseconds to wait.\n         * @return {Promise}\n         */\n        wait: function(milliseconds) {\n            return system.defer(function(dfd) {\n                setTimeout(dfd.resolve, milliseconds);\n            }).promise();\n        }\n    };\n\n    /**\n     * Gets all the owned keys of the specified object.\n     * @method keys\n     * @param {object} object The object whose owned keys should be returned.\n     * @return {string[]} The keys.\n     */\n    system.keys = nativeKeys || function(obj) {\n        if (obj !== Object(obj)) {\n            throw new TypeError('Invalid object');\n        }\n\n        var keys = [];\n\n        for (var key in obj) {\n            if (hasOwnProperty.call(obj, key)) {\n                keys[keys.length] = key;\n            }\n        }\n\n        return keys;\n    };\n\n    /**\n     * Determines if the specified object is an html element.\n     * @method isElement\n     * @param {object} object The object to check.\n     * @return {boolean} True if matches the type, false otherwise.\n     */\n    system.isElement = function(obj) {\n        return !!(obj && obj.nodeType === 1);\n    };\n\n    /**\n     * Determines if the specified object is an array.\n     * @method isArray\n     * @param {object} object The object to check.\n     * @return {boolean} True if matches the type, false otherwise.\n     */\n    system.isArray = nativeIsArray || function(obj) {\n        return toString.call(obj) == '[object Array]';\n    };\n\n    /**\n     * Determines if the specified object is...an object. ie. Not an array, string, etc.\n     * @method isObject\n     * @param {object} object The object to check.\n     * @return {boolean} True if matches the type, false otherwise.\n     */\n    system.isObject = function(obj) {\n        return obj === Object(obj);\n    };\n\n    /**\n     * Determines if the specified object is a boolean.\n     * @method isBoolean\n     * @param {object} object The object to check.\n     * @return {boolean} True if matches the type, false otherwise.\n     */\n    system.isBoolean = function(obj) {\n        return typeof(obj) === \"boolean\";\n    };\n\n    /**\n     * Determines if the specified object is a promise.\n     * @method isPromise\n     * @param {object} object The object to check.\n     * @return {boolean} True if matches the type, false otherwise.\n     */\n    system.isPromise = function(obj) {\n        return obj && system.isFunction(obj.then);\n    };\n\n    /**\n     * Determines if the specified object is a function arguments object.\n     * @method isArguments\n     * @param {object} object The object to check.\n     * @return {boolean} True if matches the type, false otherwise.\n     */\n\n    /**\n     * Determines if the specified object is a function.\n     * @method isFunction\n     * @param {object} object The object to check.\n     * @return {boolean} True if matches the type, false otherwise.\n     */\n\n    /**\n     * Determines if the specified object is a string.\n     * @method isString\n     * @param {object} object The object to check.\n     * @return {boolean} True if matches the type, false otherwise.\n     */\n\n    /**\n     * Determines if the specified object is a number.\n     * @method isNumber\n     * @param {object} object The object to check.\n     * @return {boolean} True if matches the type, false otherwise.\n     */\n\n    /**\n     * Determines if the specified object is a date.\n     * @method isDate\n     * @param {object} object The object to check.\n     * @return {boolean} True if matches the type, false otherwise.\n     */\n\n    /**\n     * Determines if the specified object is a boolean.\n     * @method isBoolean\n     * @param {object} object The object to check.\n     * @return {boolean} True if matches the type, false otherwise.\n     */\n\n    //isArguments, isFunction, isString, isNumber, isDate, isRegExp.\n    var isChecks = ['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'];\n\n    function makeIsFunction(name) {\n        var value = '[object ' + name + ']';\n        system['is' + name] = function(obj) {\n            return toString.call(obj) == value;\n        };\n    }\n\n    for (var i = 0; i < isChecks.length; i++) {\n        makeIsFunction(isChecks[i]);\n    }\n\n    return system;\n});\n\n","/**\n * Durandal 2.0.1 Copyright (c) 2012 Blue Spire Consulting, Inc. All Rights Reserved.\n * Available via the MIT license.\n * see: http://durandaljs.com or https://github.com/BlueSpire/Durandal for details.\n */\n/**\n * The viewEngine module provides information to the viewLocator module which is used to locate the view's source file. The viewEngine also transforms a view id into a view instance.\n * @module viewEngine\n * @requires system\n * @requires jquery\n */\ndefine('durandal/viewEngine',['durandal/system', 'jquery'], function (system, $) {\n    var parseMarkup;\n\n    if ($.parseHTML) {\n        parseMarkup = function (html) {\n            return $.parseHTML(html);\n        };\n    } else {\n        parseMarkup = function (html) {\n            return $(html).get();\n        };\n    }\n\n    /**\n     * @class ViewEngineModule\n     * @static\n     */\n    return {\n        /**\n         * The file extension that view source files are expected to have.\n         * @property {string} viewExtension\n         * @default .html\n         */\n        viewExtension: '.html?v=1552304184357',\n        /**\n         * The name of the RequireJS loader plugin used by the viewLocator to obtain the view source. (Use requirejs to map the plugin's full path).\n         * @property {string} viewPlugin\n         * @default text\n         */\n        viewPlugin: 'text',\n        /**\n         * Determines if the url is a url for a view, according to the view engine.\n         * @method isViewUrl\n         * @param {string} url The potential view url.\n         * @return {boolean} True if the url is a view url, false otherwise.\n         */\n        isViewUrl: function (url) {\n            return url.indexOf(this.viewExtension, url.length - this.viewExtension.length) !== -1;\n        },\n        /**\n         * Converts a view url into a view id.\n         * @method convertViewUrlToViewId\n         * @param {string} url The url to convert.\n         * @return {string} The view id.\n         */\n        convertViewUrlToViewId: function (url) {\n            return url.substring(0, url.length - this.viewExtension.length);\n        },\n        /**\n         * Converts a view id into a full RequireJS path.\n         * @method convertViewIdToRequirePath\n         * @param {string} viewId The view id to convert.\n         * @return {string} The require path.\n         */\n        convertViewIdToRequirePath: function (viewId) {\n            return this.viewPlugin + '!' + viewId + this.viewExtension;\n        },\n        /**\n         * Parses the view engine recognized markup and returns DOM elements.\n         * @method parseMarkup\n         * @param {string} markup The markup to parse.\n         * @return {DOMElement[]} The elements.\n         */\n        parseMarkup: parseMarkup,\n        /**\n         * Calls `parseMarkup` and then pipes the results through `ensureSingleElement`.\n         * @method processMarkup\n         * @param {string} markup The markup to process.\n         * @return {DOMElement} The view.\n         */\n        processMarkup: function (markup) {\n            var allElements = this.parseMarkup(markup);\n            return this.ensureSingleElement(allElements);\n        },\n        /**\n         * Converts an array of elements into a single element. White space and comments are removed. If a single element does not remain, then the elements are wrapped.\n         * @method ensureSingleElement\n         * @param {DOMElement[]} allElements The elements.\n         * @return {DOMElement} A single element.\n         */\n        ensureSingleElement:function(allElements){\n            if (allElements.length == 1) {\n                return allElements[0];\n            }\n\n            var withoutCommentsOrEmptyText = [];\n\n            for (var i = 0; i < allElements.length; i++) {\n                var current = allElements[i];\n                if (current.nodeType != 8) {\n                    if (current.nodeType == 3) {\n                        var result = /\\S/.test(current.nodeValue);\n                        if (!result) {\n                            continue;\n                        }\n                    }\n\n                    withoutCommentsOrEmptyText.push(current);\n                }\n            }\n\n            if (withoutCommentsOrEmptyText.length > 1) {\n                return $(withoutCommentsOrEmptyText).wrapAll('<div class=\"durandal-wrapper\"></div>').parent().get(0);\n            }\n\n            return withoutCommentsOrEmptyText[0];\n        },\n        /**\n         * Creates the view associated with the view id.\n         * @method createView\n         * @param {string} viewId The view id whose view should be created.\n         * @return {Promise} A promise of the view.\n         */\n        createView: function(viewId) {\n            var that = this;\n            var requirePath = this.convertViewIdToRequirePath(viewId);\n\n            return system.defer(function(dfd) {\n                system.acquire(requirePath).then(function(markup) {\n                    var element = that.processMarkup(markup);\n                    element.setAttribute('data-view', viewId);\n                    dfd.resolve(element);\n                }).fail(function(err){\n                        that.createFallbackView(viewId, requirePath, err).then(function(element){\n                            element.setAttribute('data-view', viewId);\n                            dfd.resolve(element);\n                        });\n                    });\n            }).promise();\n        },\n        /**\n         * Called when a view cannot be found to provide the opportunity to locate or generate a fallback view. Mainly used to ease development.\n         * @method createFallbackView\n         * @param {string} viewId The view id whose view should be created.\n         * @param {string} requirePath The require path that was attempted.\n         * @param {Error} requirePath The error that was returned from the attempt to locate the default view.\n         * @return {Promise} A promise for the fallback view.\n         */\n        createFallbackView: function (viewId, requirePath, err) {\n            var that = this,\n                message = 'View Not Found. Searched for \"' + viewId + '\" via path \"' + requirePath + '\".';\n\n            return system.defer(function(dfd) {\n                dfd.resolve(that.processMarkup('<div class=\"durandal-view-404\">' + message + '</div>'));\n            }).promise();\n        }\n    };\n});\n\n","/**\n * Durandal 2.0.1 Copyright (c) 2012 Blue Spire Consulting, Inc. All Rights Reserved.\n * Available via the MIT license.\n * see: http://durandaljs.com or https://github.com/BlueSpire/Durandal for details.\n */\n/**\n * The viewLocator module collaborates with the viewEngine module to provide views (literally dom sub-trees) to other parts of the framework as needed. The primary consumer of the viewLocator is the composition module.\n * @module viewLocator\n * @requires system\n * @requires viewEngine\n */\ndefine('durandal/viewLocator',['durandal/system', 'durandal/viewEngine'], function (system, viewEngine) {\n    function findInElements(nodes, url) {\n        for (var i = 0; i < nodes.length; i++) {\n            var current = nodes[i];\n            var existingUrl = current.getAttribute('data-view');\n            if (existingUrl == url) {\n                return current;\n            }\n        }\n    }\n    \n    function escape(str) {\n        return (str + '').replace(/([\\\\\\.\\+\\*\\?\\[\\^\\]\\$\\(\\)\\{\\}\\=\\!\\<\\>\\|\\:])/g, \"\\\\$1\");\n    }\n\n    /**\n     * @class ViewLocatorModule\n     * @static\n     */\n    return {\n        /**\n         * Allows you to set up a convention for mapping module folders to view folders. It is a convenience method that customizes `convertModuleIdToViewId` and `translateViewIdToArea` under the covers.\n         * @method useConvention\n         * @param {string} [modulesPath] A string to match in the path and replace with the viewsPath. If not specified, the match is 'viewmodels'.\n         * @param {string} [viewsPath] The replacement for the modulesPath. If not specified, the replacement is 'views'.\n         * @param {string} [areasPath] Partial views are mapped to the \"views\" folder if not specified. Use this parameter to change their location.\n         */\n        useConvention: function(modulesPath, viewsPath, areasPath) {\n            modulesPath = modulesPath || 'viewmodels';\n            viewsPath = viewsPath || 'views';\n            areasPath = areasPath || viewsPath;\n\n            var reg = new RegExp(escape(modulesPath), 'gi');\n\n            this.convertModuleIdToViewId = function (moduleId) {\n                return moduleId.replace(reg, viewsPath);\n            };\n\n            this.translateViewIdToArea = function (viewId, area) {\n                if (!area || area == 'partial') {\n                    return areasPath + '/' + viewId;\n                }\n                \n                return areasPath + '/' + area + '/' + viewId;\n            };\n        },\n        /**\n         * Maps an object instance to a view instance.\n         * @method locateViewForObject\n         * @param {object} obj The object to locate the view for.\n         * @param {string} [area] The area to translate the view to.\n         * @param {DOMElement[]} [elementsToSearch] An existing set of elements to search first.\n         * @return {Promise} A promise of the view.\n         */\n        locateViewForObject: function(obj, area, elementsToSearch) {\n            var view;\n\n            if (obj.getView) {\n                view = obj.getView();\n                if (view) {\n                    return this.locateView(view, area, elementsToSearch);\n                }\n            }\n\n            if (obj.viewUrl) {\n                return this.locateView(obj.viewUrl, area, elementsToSearch);\n            }\n\n            var id = system.getModuleId(obj);\n            if (id) {\n                return this.locateView(this.convertModuleIdToViewId(id), area, elementsToSearch);\n            }\n\n            return this.locateView(this.determineFallbackViewId(obj), area, elementsToSearch);\n        },\n        /**\n         * Converts a module id into a view id. By default the ids are the same.\n         * @method convertModuleIdToViewId\n         * @param {string} moduleId The module id.\n         * @return {string} The view id.\n         */\n        convertModuleIdToViewId: function(moduleId) {\n            return moduleId;\n        },\n        /**\n         * If no view id can be determined, this function is called to genreate one. By default it attempts to determine the object's type and use that.\n         * @method determineFallbackViewId\n         * @param {object} obj The object to determine the fallback id for.\n         * @return {string} The view id.\n         */\n        determineFallbackViewId: function (obj) {\n            var funcNameRegex = /function (.{1,})\\(/;\n            var results = (funcNameRegex).exec((obj).constructor.toString());\n            var typeName = (results && results.length > 1) ? results[1] : \"\";\n\n            return 'views/' + typeName;\n        },\n        /**\n         * Takes a view id and translates it into a particular area. By default, no translation occurs.\n         * @method translateViewIdToArea\n         * @param {string} viewId The view id.\n         * @param {string} area The area to translate the view to.\n         * @return {string} The translated view id.\n         */\n        translateViewIdToArea: function (viewId, area) {\n            return viewId;\n        },\n        /**\n         * Locates the specified view.\n         * @method locateView\n         * @param {string|DOMElement} viewOrUrlOrId A view, view url or view id to locate.\n         * @param {string} [area] The area to translate the view to.\n         * @param {DOMElement[]} [elementsToSearch] An existing set of elements to search first.\n         * @return {Promise} A promise of the view.\n         */\n        locateView: function(viewOrUrlOrId, area, elementsToSearch) {\n            if (typeof viewOrUrlOrId === 'string') {\n                var viewId;\n\n                if (viewEngine.isViewUrl(viewOrUrlOrId)) {\n                    viewId = viewEngine.convertViewUrlToViewId(viewOrUrlOrId);\n                } else {\n                    viewId = viewOrUrlOrId;\n                }\n\n                if (area) {\n                    viewId = this.translateViewIdToArea(viewId, area);\n                }\n\n                if (elementsToSearch) {\n                    var existing = findInElements(elementsToSearch, viewId);\n                    if (existing) {\n                        return system.defer(function(dfd) {\n                            dfd.resolve(existing);\n                        }).promise();\n                    }\n                }\n\n                return viewEngine.createView(viewId);\n            }\n\n            return system.defer(function(dfd) {\n                dfd.resolve(viewOrUrlOrId);\n            }).promise();\n        }\n    };\n});\n\n","/**\n * Durandal 2.0.1 Copyright (c) 2012 Blue Spire Consulting, Inc. All Rights Reserved.\n * Available via the MIT license.\n * see: http://durandaljs.com or https://github.com/BlueSpire/Durandal for details.\n */\n/**\n * The binder joins an object instance and a DOM element tree by applying databinding and/or invoking binding lifecycle callbacks (binding and bindingComplete).\n * @module binder\n * @requires system\n * @requires knockout\n */\ndefine('durandal/binder',['durandal/system', 'knockout'], function (system, ko) {\n    var binder,\n        insufficientInfoMessage = 'Insufficient Information to Bind',\n        unexpectedViewMessage = 'Unexpected View Type',\n        bindingInstructionKey = 'durandal-binding-instruction',\n        koBindingContextKey = '__ko_bindingContext__';\n\n    function normalizeBindingInstruction(result){\n        if(result === undefined){\n            return { applyBindings: true };\n        }\n\n        if(system.isBoolean(result)){\n            return { applyBindings:result };\n        }\n\n        if(result.applyBindings === undefined){\n            result.applyBindings = true;\n        }\n\n        return result;\n    }\n\n    function doBind(obj, view, bindingTarget, data){\n        if (!view || !bindingTarget) {\n            if (binder.throwOnErrors) {\n                system.error(insufficientInfoMessage);\n            } else {\n                system.log(insufficientInfoMessage, view, data);\n            }\n            return;\n        }\n\n        if (!view.getAttribute) {\n            if (binder.throwOnErrors) {\n                system.error(unexpectedViewMessage);\n            } else {\n                system.log(unexpectedViewMessage, view, data);\n            }\n            return;\n        }\n\n        var viewName = view.getAttribute('data-view');\n\n        try {\n            var instruction;\n\n            if (obj && obj.binding) {\n                instruction = obj.binding(view);\n            }\n\n            instruction = normalizeBindingInstruction(instruction);\n            binder.binding(data, view, instruction);\n\n            if(instruction.applyBindings){\n                system.log('Binding', viewName, data);\n                ko.applyBindings(bindingTarget, view);\n            }else if(obj){\n                ko.utils.domData.set(view, koBindingContextKey, { $data:obj });\n            }\n\n            binder.bindingComplete(data, view, instruction);\n\n            if (obj && obj.bindingComplete) {\n                obj.bindingComplete(view);\n            }\n\n            ko.utils.domData.set(view, bindingInstructionKey, instruction);\n            return instruction;\n        } catch (e) {\n            e.message = e.message + ';\\nView: ' + viewName + \";\\nModuleId: \" + system.getModuleId(data);\n            if (binder.throwOnErrors) {\n                system.error(e);\n            } else {\n                system.log(e.message);\n            }\n        }\n    }\n\n    /**\n     * @class BinderModule\n     * @static\n     */\n    return binder = {\n        /**\n         * Called before every binding operation. Does nothing by default.\n         * @method binding\n         * @param {object} data The data that is about to be bound.\n         * @param {DOMElement} view The view that is about to be bound.\n         * @param {object} instruction The object that carries the binding instructions.\n         */\n        binding: system.noop,\n        /**\n         * Called after every binding operation. Does nothing by default.\n         * @method bindingComplete\n         * @param {object} data The data that has just been bound.\n         * @param {DOMElement} view The view that has just been bound.\n         * @param {object} instruction The object that carries the binding instructions.\n         */\n        bindingComplete: system.noop,\n        /**\n         * Indicates whether or not the binding system should throw errors or not.\n         * @property {boolean} throwOnErrors\n         * @default false The binding system will not throw errors by default. Instead it will log them.\n         */\n        throwOnErrors: false,\n        /**\n         * Gets the binding instruction that was associated with a view when it was bound.\n         * @method getBindingInstruction\n         * @param {DOMElement} view The view that was previously bound.\n         * @return {object} The object that carries the binding instructions.\n         */\n        getBindingInstruction:function(view){\n            return ko.utils.domData.get(view, bindingInstructionKey);\n        },\n        /**\n         * Binds the view, preserving the existing binding context. Optionally, a new context can be created, parented to the previous context.\n         * @method bindContext\n         * @param {KnockoutBindingContext} bindingContext The current binding context.\n         * @param {DOMElement} view The view to bind.\n         * @param {object} [obj] The data to bind to, causing the creation of a child binding context if present.\n         */\n        bindContext: function(bindingContext, view, obj) {\n            if (obj && bindingContext) {\n                bindingContext = bindingContext.createChildContext(obj);\n            }\n\n            return doBind(obj, view, bindingContext, obj || (bindingContext ? bindingContext.$data : null));\n        },\n        /**\n         * Binds the view, preserving the existing binding context. Optionally, a new context can be created, parented to the previous context.\n         * @method bind\n         * @param {object} obj The data to bind to.\n         * @param {DOMElement} view The view to bind.\n         */\n        bind: function(obj, view) {\n            return doBind(obj, view, obj, obj);\n        }\n    };\n});\n\n","/**\n * Durandal 2.0.1 Copyright (c) 2012 Blue Spire Consulting, Inc. All Rights Reserved.\n * Available via the MIT license.\n * see: http://durandaljs.com or https://github.com/BlueSpire/Durandal for details.\n */\n/**\n * The activator module encapsulates all logic related to screen/component activation.\n * An activator is essentially an asynchronous state machine that understands a particular state transition protocol.\n * The protocol ensures that the following series of events always occur: `canDeactivate` (previous state), `canActivate` (new state), `deactivate` (previous state), `activate` (new state).\n * Each of the _can_ callbacks may return a boolean, affirmative value or promise for one of those. If either of the _can_ functions yields a false result, then activation halts.\n * @module activator\n * @requires system\n * @requires knockout\n */\ndefine('durandal/activator',['durandal/system', 'knockout'], function (system, ko) {\n    var activator;\n\n    function ensureSettings(settings) {\n        if (settings == undefined) {\n            settings = {};\n        }\n\n        if (!settings.closeOnDeactivate) {\n            settings.closeOnDeactivate = activator.defaults.closeOnDeactivate;\n        }\n\n        if (!settings.beforeActivate) {\n            settings.beforeActivate = activator.defaults.beforeActivate;\n        }\n\n        if (!settings.afterDeactivate) {\n            settings.afterDeactivate = activator.defaults.afterDeactivate;\n        }\n\n        if(!settings.affirmations){\n            settings.affirmations = activator.defaults.affirmations;\n        }\n\n        if (!settings.interpretResponse) {\n            settings.interpretResponse = activator.defaults.interpretResponse;\n        }\n\n        if (!settings.areSameItem) {\n            settings.areSameItem = activator.defaults.areSameItem;\n        }\n\n        return settings;\n    }\n\n    function invoke(target, method, data) {\n        if (system.isArray(data)) {\n            return target[method].apply(target, data);\n        }\n\n        return target[method](data);\n    }\n\n    function deactivate(item, close, settings, dfd, setter) {\n        if (item && item.deactivate) {\n            system.log('Deactivating', item);\n\n            var result;\n            try {\n                result = item.deactivate(close);\n            } catch(error) {\n                system.error(error);\n                dfd.resolve(false);\n                return;\n            }\n\n            if (result && result.then) {\n                result.then(function() {\n                    settings.afterDeactivate(item, close, setter);\n                    dfd.resolve(true);\n                }, function(reason) {\n                    system.log(reason);\n                    dfd.resolve(false);\n                });\n            } else {\n                settings.afterDeactivate(item, close, setter);\n                dfd.resolve(true);\n            }\n        } else {\n            if (item) {\n                settings.afterDeactivate(item, close, setter);\n            }\n\n            dfd.resolve(true);\n        }\n    }\n\n    function activate(newItem, activeItem, callback, activationData) {\n        if (newItem) {\n            if (newItem.activate) {\n                system.log('Activating', newItem);\n\n                var result;\n                try {\n                    result = invoke(newItem, 'activate', activationData);\n                } catch (error) {\n                    system.error(error);\n                    callback(false);\n                    return;\n                }\n\n                if (result && result.then) {\n                    result.then(function() {\n                        activeItem(newItem);\n                        callback(true);\n                    }, function(reason) {\n                        system.log(reason);\n                        callback(false);\n                    });\n                } else {\n                    activeItem(newItem);\n                    callback(true);\n                }\n            } else {\n                activeItem(newItem);\n                callback(true);\n            }\n        } else {\n            callback(true);\n        }\n    }\n\n    function canDeactivateItem(item, close, settings) {\n        settings.lifecycleData = null;\n\n        return system.defer(function (dfd) {\n            if (item && item.canDeactivate) {\n                var resultOrPromise;\n                try {\n                    resultOrPromise = item.canDeactivate(close);\n                } catch(error) {\n                    system.error(error);\n                    dfd.resolve(false);\n                    return;\n                }\n\n                if (resultOrPromise.then) {\n                    resultOrPromise.then(function(result) {\n                        settings.lifecycleData = result;\n                        dfd.resolve(settings.interpretResponse(result));\n                    }, function(reason) {\n                        system.error(reason);\n                        dfd.resolve(false);\n                    });\n                } else {\n                    settings.lifecycleData = resultOrPromise;\n                    dfd.resolve(settings.interpretResponse(resultOrPromise));\n                }\n            } else {\n                dfd.resolve(true);\n            }\n        }).promise();\n    };\n\n    function canActivateItem(newItem, activeItem, settings, activationData) {\n        settings.lifecycleData = null;\n\n        return system.defer(function (dfd) {\n            if (newItem == activeItem()) {\n                dfd.resolve(true);\n                return;\n            }\n\n            if (newItem && newItem.canActivate) {\n                var resultOrPromise;\n                try {\n                    resultOrPromise = invoke(newItem, 'canActivate', activationData);\n                } catch (error) {\n                    system.error(error);\n                    dfd.resolve(false);\n                    return;\n                }\n\n                if (resultOrPromise.then) {\n                    resultOrPromise.then(function(result) {\n                        settings.lifecycleData = result;\n                        dfd.resolve(settings.interpretResponse(result));\n                    }, function(reason) {\n                        system.error(reason);\n                        dfd.resolve(false);\n                    });\n                } else {\n                    settings.lifecycleData = resultOrPromise;\n                    dfd.resolve(settings.interpretResponse(resultOrPromise));\n                }\n            } else {\n                dfd.resolve(true);\n            }\n        }).promise();\n    };\n\n    /**\n     * An activator is a read/write computed observable that enforces the activation lifecycle whenever changing values.\n     * @class Activator\n     */\n    function createActivator(initialActiveItem, settings) {\n        var activeItem = ko.observable(null);\n        var activeData;\n\n        settings = ensureSettings(settings);\n\n        var computed = ko.computed({\n            read: function () {\n                return activeItem();\n            },\n            write: function (newValue) {\n                computed.viaSetter = true;\n                computed.activateItem(newValue);\n            }\n        });\n\n        computed.__activator__ = true;\n\n        /**\n         * The settings for this activator.\n         * @property {ActivatorSettings} settings\n         */\n        computed.settings = settings;\n        settings.activator = computed;\n\n        /**\n         * An observable which indicates whether or not the activator is currently in the process of activating an instance.\n         * @method isActivating\n         * @return {boolean}\n         */\n        computed.isActivating = ko.observable(false);\n\n        /**\n         * Determines whether or not the specified item can be deactivated.\n         * @method canDeactivateItem\n         * @param {object} item The item to check.\n         * @param {boolean} close Whether or not to check if close is possible.\n         * @return {promise}\n         */\n        computed.canDeactivateItem = function (item, close) {\n            return canDeactivateItem(item, close, settings);\n        };\n\n        /**\n         * Deactivates the specified item.\n         * @method deactivateItem\n         * @param {object} item The item to deactivate.\n         * @param {boolean} close Whether or not to close the item.\n         * @return {promise}\n         */\n        computed.deactivateItem = function (item, close) {\n            return system.defer(function(dfd) {\n                computed.canDeactivateItem(item, close).then(function(canDeactivate) {\n                    if (canDeactivate) {\n                        deactivate(item, close, settings, dfd, activeItem);\n                    } else {\n                        computed.notifySubscribers();\n                        dfd.resolve(false);\n                    }\n                });\n            }).promise();\n        };\n\n        /**\n         * Determines whether or not the specified item can be activated.\n         * @method canActivateItem\n         * @param {object} item The item to check.\n         * @param {object} activationData Data associated with the activation.\n         * @return {promise}\n         */\n        computed.canActivateItem = function (newItem, activationData) {\n            return canActivateItem(newItem, activeItem, settings, activationData);\n        };\n\n        /**\n         * Activates the specified item.\n         * @method activateItem\n         * @param {object} newItem The item to activate.\n         * @param {object} newActivationData Data associated with the activation.\n         * @return {promise}\n         */\n        computed.activateItem = function (newItem, newActivationData) {\n            var viaSetter = computed.viaSetter;\n            computed.viaSetter = false;\n\n            return system.defer(function (dfd) {\n                if (computed.isActivating()) {\n                    dfd.resolve(false);\n                    return;\n                }\n\n                computed.isActivating(true);\n\n                var currentItem = activeItem();\n                if (settings.areSameItem(currentItem, newItem, activeData, newActivationData)) {\n                    computed.isActivating(false);\n                    dfd.resolve(true);\n                    return;\n                }\n\n                computed.canDeactivateItem(currentItem, settings.closeOnDeactivate).then(function (canDeactivate) {\n                    if (canDeactivate) {\n                        computed.canActivateItem(newItem, newActivationData).then(function (canActivate) {\n                            if (canActivate) {\n                                system.defer(function (dfd2) {\n                                    deactivate(currentItem, settings.closeOnDeactivate, settings, dfd2);\n                                }).promise().then(function () {\n                                    newItem = settings.beforeActivate(newItem, newActivationData);\n                                    activate(newItem, activeItem, function (result) {\n                                        activeData = newActivationData;\n                                        computed.isActivating(false);\n                                        dfd.resolve(result);\n                                    }, newActivationData);\n                                });\n                            } else {\n                                if (viaSetter) {\n                                    computed.notifySubscribers();\n                                }\n\n                                computed.isActivating(false);\n                                dfd.resolve(false);\n                            }\n                        });\n                    } else {\n                        if (viaSetter) {\n                            computed.notifySubscribers();\n                        }\n\n                        computed.isActivating(false);\n                        dfd.resolve(false);\n                    }\n                });\n            }).promise();\n        };\n\n        /**\n         * Determines whether or not the activator, in its current state, can be activated.\n         * @method canActivate\n         * @return {promise}\n         */\n        computed.canActivate = function () {\n            var toCheck;\n\n            if (initialActiveItem) {\n                toCheck = initialActiveItem;\n                initialActiveItem = false;\n            } else {\n                toCheck = computed();\n            }\n\n            return computed.canActivateItem(toCheck);\n        };\n\n        /**\n         * Activates the activator, in its current state.\n         * @method activate\n         * @return {promise}\n         */\n        computed.activate = function () {\n            var toActivate;\n\n            if (initialActiveItem) {\n                toActivate = initialActiveItem;\n                initialActiveItem = false;\n            } else {\n                toActivate = computed();\n            }\n\n            return computed.activateItem(toActivate);\n        };\n\n        /**\n         * Determines whether or not the activator, in its current state, can be deactivated.\n         * @method canDeactivate\n         * @return {promise}\n         */\n        computed.canDeactivate = function (close) {\n            return computed.canDeactivateItem(computed(), close);\n        };\n\n        /**\n         * Deactivates the activator, in its current state.\n         * @method deactivate\n         * @return {promise}\n         */\n        computed.deactivate = function (close) {\n            return computed.deactivateItem(computed(), close);\n        };\n\n        computed.includeIn = function (includeIn) {\n            includeIn.canActivate = function () {\n                return computed.canActivate();\n            };\n\n            includeIn.activate = function () {\n                return computed.activate();\n            };\n\n            includeIn.canDeactivate = function (close) {\n                return computed.canDeactivate(close);\n            };\n\n            includeIn.deactivate = function (close) {\n                return computed.deactivate(close);\n            };\n        };\n\n        if (settings.includeIn) {\n            computed.includeIn(settings.includeIn);\n        } else if (initialActiveItem) {\n            computed.activate();\n        }\n\n        computed.forItems = function (items) {\n            settings.closeOnDeactivate = false;\n\n            settings.determineNextItemToActivate = function (list, lastIndex) {\n                var toRemoveAt = lastIndex - 1;\n\n                if (toRemoveAt == -1 && list.length > 1) {\n                    return list[1];\n                }\n\n                if (toRemoveAt > -1 && toRemoveAt < list.length - 1) {\n                    return list[toRemoveAt];\n                }\n\n                return null;\n            };\n\n            settings.beforeActivate = function (newItem) {\n                var currentItem = computed();\n\n                if (!newItem) {\n                    newItem = settings.determineNextItemToActivate(items, currentItem ? items.indexOf(currentItem) : 0);\n                } else {\n                    var index = items.indexOf(newItem);\n\n                    if (index == -1) {\n                        items.push(newItem);\n                    } else {\n                        newItem = items()[index];\n                    }\n                }\n\n                return newItem;\n            };\n\n            settings.afterDeactivate = function (oldItem, close) {\n                if (close) {\n                    items.remove(oldItem);\n                }\n            };\n\n            var originalCanDeactivate = computed.canDeactivate;\n            computed.canDeactivate = function (close) {\n                if (close) {\n                    return system.defer(function (dfd) {\n                        var list = items();\n                        var results = [];\n\n                        function finish() {\n                            for (var j = 0; j < results.length; j++) {\n                                if (!results[j]) {\n                                    dfd.resolve(false);\n                                    return;\n                                }\n                            }\n\n                            dfd.resolve(true);\n                        }\n\n                        for (var i = 0; i < list.length; i++) {\n                            computed.canDeactivateItem(list[i], close).then(function (result) {\n                                results.push(result);\n                                if (results.length == list.length) {\n                                    finish();\n                                }\n                            });\n                        }\n                    }).promise();\n                } else {\n                    return originalCanDeactivate();\n                }\n            };\n\n            var originalDeactivate = computed.deactivate;\n            computed.deactivate = function (close) {\n                if (close) {\n                    return system.defer(function (dfd) {\n                        var list = items();\n                        var results = 0;\n                        var listLength = list.length;\n\n                        function doDeactivate(item) {\n                            computed.deactivateItem(item, close).then(function () {\n                                results++;\n                                items.remove(item);\n                                if (results == listLength) {\n                                    dfd.resolve();\n                                }\n                            });\n                        }\n\n                        for (var i = 0; i < listLength; i++) {\n                            doDeactivate(list[i]);\n                        }\n                    }).promise();\n                } else {\n                    return originalDeactivate();\n                }\n            };\n\n            return computed;\n        };\n\n        return computed;\n    }\n\n    /**\n     * @class ActivatorSettings\n     * @static\n     */\n    var activatorSettings = {\n        /**\n         * The default value passed to an object's deactivate function as its close parameter.\n         * @property {boolean} closeOnDeactivate\n         * @default true\n         */\n        closeOnDeactivate: true,\n        /**\n         * Lower-cased words which represent a truthy value.\n         * @property {string[]} affirmations\n         * @default ['yes', 'ok', 'true']\n         */\n        affirmations: ['yes', 'ok', 'true'],\n        /**\n         * Interprets the response of a `canActivate` or `canDeactivate` call using the known affirmative values in the `affirmations` array.\n         * @method interpretResponse\n         * @param {object} value\n         * @return {boolean}\n         */\n        interpretResponse: function(value) {\n            if(system.isObject(value)) {\n                value = value.can || false;\n            }\n\n            if(system.isString(value)) {\n                return ko.utils.arrayIndexOf(this.affirmations, value.toLowerCase()) !== -1;\n            }\n\n            return value;\n        },\n        /**\n         * Determines whether or not the current item and the new item are the same.\n         * @method areSameItem\n         * @param {object} currentItem\n         * @param {object} newItem\n         * @param {object} currentActivationData\n         * @param {object} newActivationData\n         * @return {boolean}\n         */\n        areSameItem: function(currentItem, newItem, currentActivationData, newActivationData) {\n            return currentItem == newItem;\n        },\n        /**\n         * Called immediately before the new item is activated.\n         * @method beforeActivate\n         * @param {object} newItem\n         */\n        beforeActivate: function(newItem) {\n            return newItem;\n        },\n        /**\n         * Called immediately after the old item is deactivated.\n         * @method afterDeactivate\n         * @param {object} oldItem The previous item.\n         * @param {boolean} close Whether or not the previous item was closed.\n         * @param {function} setter The activate item setter function.\n         */\n        afterDeactivate: function(oldItem, close, setter) {\n            if(close && setter) {\n                setter(null);\n            }\n        }\n    };\n\n    /**\n     * @class ActivatorModule\n     * @static\n     */\n    activator = {\n        /**\n         * The default settings used by activators.\n         * @property {ActivatorSettings} defaults\n         */\n        defaults: activatorSettings,\n        /**\n          * Creates a new activator.\n          * @method create\n          * @param {object} [initialActiveItem] The item which should be immediately activated upon creation of the ativator.\n          * @param {ActivatorSettings} [settings] Per activator overrides of the default activator settings.\n          * @return {Activator} The created activator.\n          */\n        create: createActivator,\n        /**\n         * Determines whether or not the provided object is an activator or not.\n         * @method isActivator\n         * @param {object} object Any object you wish to verify as an activator or not.\n         * @return {boolean} True if the object is an activator; false otherwise.\n         */\n        isActivator:function(object){\n            return object && object.__activator__;\n        }\n    };\n\n    return activator;\n});\n\n","/**\n * Durandal 2.0.1 Copyright (c) 2012 Blue Spire Consulting, Inc. All Rights Reserved.\n * Available via the MIT license.\n * see: http://durandaljs.com or https://github.com/BlueSpire/Durandal for details.\n */\n/**\n * The composition module encapsulates all functionality related to visual composition.\n * @module composition\n * @requires system\n * @requires viewLocator\n * @requires binder\n * @requires viewEngine\n * @requires activator\n * @requires jquery\n * @requires knockout\n */\ndefine('durandal/composition',['durandal/system', 'durandal/viewLocator', 'durandal/binder', 'durandal/viewEngine', 'durandal/activator', 'jquery', 'knockout'], function (system, viewLocator, binder, viewEngine, activator, $, ko) {\n    var dummyModel = {},\n        activeViewAttributeName = 'data-active-view',\n        composition,\n        compositionCompleteCallbacks = [],\n        compositionCount = 0,\n        compositionDataKey = 'durandal-composition-data',\n        partAttributeName = 'data-part',\n        bindableSettings = ['model', 'view', 'transition', 'area', 'strategy', 'activationData'],\n        visibilityKey = \"durandal-visibility-data\",\n        composeBindings = ['compose:'];\n\n    function getHostState(parent) {\n        var elements = [];\n        var state = {\n            childElements: elements,\n            activeView: null\n        };\n\n        var child = ko.virtualElements.firstChild(parent);\n\n        while (child) {\n            if (child.nodeType == 1) {\n                elements.push(child);\n                if (child.getAttribute(activeViewAttributeName)) {\n                    state.activeView = child;\n                }\n            }\n\n            child = ko.virtualElements.nextSibling(child);\n        }\n\n        if(!state.activeView){\n            state.activeView = elements[0];\n        }\n\n        return state;\n    }\n\n    function endComposition() {\n        compositionCount--;\n\n        if (compositionCount === 0) {\n            setTimeout(function(){\n                var i = compositionCompleteCallbacks.length;\n\n                while(i--) {\n                    try{\n                        compositionCompleteCallbacks[i]();\n                    }catch(e){\n                        system.error(e);\n                    }\n                }\n\n                compositionCompleteCallbacks = [];\n            }, 1);\n        }\n    }\n\n    function cleanUp(context){\n        delete context.activeView;\n        delete context.viewElements;\n    }\n\n    function tryActivate(context, successCallback, skipActivation) {\n        if(skipActivation){\n            successCallback();\n        } else if (context.activate && context.model && context.model.activate) {\n            var result;\n\n            try{\n                if(system.isArray(context.activationData)) {\n                    result = context.model.activate.apply(context.model, context.activationData);\n                } else {\n                    result = context.model.activate(context.activationData);\n                }\n\n                if(result && result.then) {\n                    result.then(successCallback, function(reason) {\n                        system.error(reason);\n                        successCallback();\n                    });\n                } else if(result || result === undefined) {\n                    successCallback();\n                } else {\n                    endComposition();\n                    cleanUp(context);\n                }\n            }\n            catch(e){\n                system.error(e);\n            }\n        } else {\n            successCallback();\n        }\n    }\n\n    function triggerAttach() {\n        var context = this;\n\n        if (context.activeView) {\n            context.activeView.removeAttribute(activeViewAttributeName);\n        }\n\n        if (context.child) {\n            try{\n                if (context.model && context.model.attached) {\n                    if (context.composingNewView || context.alwaysTriggerAttach) {\n                        context.model.attached(context.child, context.parent, context);\n                    }\n                }\n\n                if (context.attached) {\n                    context.attached(context.child, context.parent, context);\n                }\n\n                context.child.setAttribute(activeViewAttributeName, true);\n\n                if (context.composingNewView && context.model && context.model.detached) {\n                    ko.utils.domNodeDisposal.addDisposeCallback(context.child, function () {\n                        try{\n                            context.model.detached(context.child, context.parent, context);\n                        }catch(e2){\n                            system.error(e2);\n                        }\n                    });\n                }\n            }catch(e){\n                system.error(e);\n            }\n        }\n\n        context.triggerAttach = system.noop;\n    }\n\n    function shouldTransition(context) {\n        if (system.isString(context.transition)) {\n            if (context.activeView) {\n                if (context.activeView == context.child) {\n                    return false;\n                }\n\n                if (!context.child) {\n                    return true;\n                }\n\n                if (context.skipTransitionOnSameViewId) {\n                    var currentViewId = context.activeView.getAttribute('data-view');\n                    var newViewId = context.child.getAttribute('data-view');\n                    return currentViewId != newViewId;\n                }\n            }\n\n            return true;\n        }\n\n        return false;\n    }\n\n    function cloneNodes(nodesArray) {\n        for (var i = 0, j = nodesArray.length, newNodesArray = []; i < j; i++) {\n            var clonedNode = nodesArray[i].cloneNode(true);\n            newNodesArray.push(clonedNode);\n        }\n        return newNodesArray;\n    }\n\n    function replaceParts(context){\n        var parts = cloneNodes(context.parts);\n        var replacementParts = composition.getParts(parts, null, true);\n        var standardParts = composition.getParts(context.child);\n\n        for (var partId in replacementParts) {\n            $(standardParts[partId]).replaceWith(replacementParts[partId]);\n        }\n    }\n\n    function removePreviousView(context){\n        var children = ko.virtualElements.childNodes(context.parent), i, len;\n\n        if(!system.isArray(children)){\n            var arrayChildren = [];\n            for(i = 0, len = children.length; i < len; i++){\n                arrayChildren[i] = children[i];\n            }\n            children = arrayChildren;\n        }\n\n        for(i = 1,len = children.length; i < len; i++){\n            ko.removeNode(children[i]);\n        }\n    }\n\n    function hide(view) {\n        ko.utils.domData.set(view, visibilityKey, view.style.display);\n        view.style.display = \"none\";\n    }\n\n    function show(view) {\n        view.style.display = ko.utils.domData.get(view, visibilityKey);\n    }\n\n    function hasComposition(element){\n        var dataBind = element.getAttribute('data-bind');\n        if(!dataBind){\n            return false;\n        }\n\n        for(var i = 0, length = composeBindings.length; i < length; i++){\n            if(dataBind.indexOf(composeBindings[i]) > -1){\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    /**\n     * @class CompositionTransaction\n     * @static\n     */\n    var compositionTransaction = {\n        /**\n         * Registers a callback which will be invoked when the current composition transaction has completed. The transaction includes all parent and children compositions.\n         * @method complete\n         * @param {function} callback The callback to be invoked when composition is complete.\n         */\n        complete: function (callback) {\n            compositionCompleteCallbacks.push(callback);\n        }\n    };\n\n    /**\n     * @class CompositionModule\n     * @static\n     */\n    composition = {\n        /**\n         * An array of all the binding handler names (includeing :) that trigger a composition.\n         * @property {string} composeBindings\n         * @default ['compose:']\n         */\n        composeBindings:composeBindings,\n        /**\n         * Converts a transition name to its moduleId.\n         * @method convertTransitionToModuleId\n         * @param {string} name The name of the transtion.\n         * @return {string} The moduleId.\n         */\n        convertTransitionToModuleId: function (name) {\n            return 'transitions/' + name;\n        },\n        /**\n         * The name of the transition to use in all compositions.\n         * @property {string} defaultTransitionName\n         * @default null\n         */\n        defaultTransitionName: null,\n        /**\n         * Represents the currently executing composition transaction.\n         * @property {CompositionTransaction} current\n         */\n        current: compositionTransaction,\n        /**\n         * Registers a binding handler that will be invoked when the current composition transaction is complete.\n         * @method addBindingHandler\n         * @param {string} name The name of the binding handler.\n         * @param {object} [config] The binding handler instance. If none is provided, the name will be used to look up an existing handler which will then be converted to a composition handler.\n         * @param {function} [initOptionsFactory] If the registered binding needs to return options from its init call back to knockout, this function will server as a factory for those options. It will receive the same parameters that the init function does.\n         */\n        addBindingHandler:function(name, config, initOptionsFactory){\n            var key,\n                dataKey = 'composition-handler-' + name,\n                handler;\n\n            config = config || ko.bindingHandlers[name];\n            initOptionsFactory = initOptionsFactory || function(){ return undefined;  };\n\n            handler = ko.bindingHandlers[name] = {\n                init: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {\n                    if(compositionCount > 0){\n                        var data = {\n                            trigger:ko.observable(null)\n                        };\n\n                        composition.current.complete(function(){\n                            if(config.init){\n                                config.init(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext);\n                            }\n\n                            if(config.update){\n                                ko.utils.domData.set(element, dataKey, config);\n                                data.trigger('trigger');\n                            }\n                        });\n\n                        ko.utils.domData.set(element, dataKey, data);\n                    }else{\n                        ko.utils.domData.set(element, dataKey, config);\n\n                        if(config.init){\n                            config.init(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext);\n                        }\n                    }\n\n                    return initOptionsFactory(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext);\n                },\n                update: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {\n                    var data = ko.utils.domData.get(element, dataKey);\n\n                    if(data.update){\n                        return data.update(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext);\n                    }\n\n                    if(data.trigger){\n                        data.trigger();\n                    }\n                }\n            };\n\n            for (key in config) {\n                if (key !== \"init\" && key !== \"update\") {\n                    handler[key] = config[key];\n                }\n            }\n        },\n        /**\n         * Gets an object keyed with all the elements that are replacable parts, found within the supplied elements. The key will be the part name and the value will be the element itself.\n         * @method getParts\n         * @param {DOMElement\\DOMElement[]} elements The element(s) to search for parts.\n         * @return {object} An object keyed by part.\n         */\n        getParts: function(elements, parts, isReplacementSearch) {\n            parts = parts || {};\n\n            if (!elements) {\n                return parts;\n            }\n\n            if (elements.length === undefined) {\n                elements = [elements];\n            }\n\n            for (var i = 0, length = elements.length; i < length; i++) {\n                var element = elements[i];\n\n                if (element.getAttribute) {\n                    if(!isReplacementSearch && hasComposition(element)){\n                        continue;\n                    }\n\n                    var id = element.getAttribute(partAttributeName);\n                    if (id) {\n                        parts[id] = element;\n                    }\n\n                    if(!isReplacementSearch && element.hasChildNodes()){\n                        composition.getParts(element.childNodes, parts);\n                    }\n                }\n            }\n\n            return parts;\n        },\n        cloneNodes:cloneNodes,\n        finalize: function (context) {\n            if(context.transition === undefined) {\n                context.transition = this.defaultTransitionName;\n            }\n\n            if(!context.child && !context.activeView){\n                if (!context.cacheViews) {\n                    ko.virtualElements.emptyNode(context.parent);\n                }\n\n                context.triggerAttach();\n                endComposition();\n                cleanUp(context);\n            }else if (shouldTransition(context)) {\n                var transitionModuleId = this.convertTransitionToModuleId(context.transition);\n\n                system.acquire(transitionModuleId).then(function (transition) {\n                    context.transition = transition;\n\n                    transition(context).then(function () {\n                        if (!context.cacheViews) {\n                            if(!context.child){\n                                ko.virtualElements.emptyNode(context.parent);\n                            }else{\n                                removePreviousView(context);\n                            }\n                        }else if(context.activeView){\n                            var instruction = binder.getBindingInstruction(context.activeView);\n                            if(instruction && instruction.cacheViews != undefined && !instruction.cacheViews){\n                                ko.removeNode(context.activeView);\n                            }\n                        }\n\n                        context.triggerAttach();\n                        endComposition();\n                        cleanUp(context);\n                    });\n                }).fail(function(err){\n                    system.error('Failed to load transition (' + transitionModuleId + '). Details: ' + err.message);\n                });\n            } else {\n                if (context.child != context.activeView) {\n                    if (context.cacheViews && context.activeView) {\n                        var instruction = binder.getBindingInstruction(context.activeView);\n                        if(!instruction || (instruction.cacheViews != undefined && !instruction.cacheViews)){\n                            ko.removeNode(context.activeView);\n                        }else{\n                            hide(context.activeView);\n                        }\n                    }\n\n                    if (!context.child) {\n                        if (!context.cacheViews) {\n                            ko.virtualElements.emptyNode(context.parent);\n                        }\n                    } else {\n                        if (!context.cacheViews) {\n                            removePreviousView(context);\n                        }\n\n                        show(context.child);\n                    }\n                }\n\n                context.triggerAttach();\n                endComposition();\n                cleanUp(context);\n            }\n        },\n        bindAndShow: function (child, context, skipActivation) {\n            context.child = child;\n\n            if (context.cacheViews) {\n                context.composingNewView = (ko.utils.arrayIndexOf(context.viewElements, child) == -1);\n            } else {\n                context.composingNewView = true;\n            }\n\n            tryActivate(context, function () {\n                if (context.binding) {\n                    context.binding(context.child, context.parent, context);\n                }\n\n                if (context.preserveContext && context.bindingContext) {\n                    if (context.composingNewView) {\n                        if(context.parts){\n                            replaceParts(context);\n                        }\n\n                        hide(child);\n                        ko.virtualElements.prepend(context.parent, child);\n\n                        binder.bindContext(context.bindingContext, child, context.model);\n                    }\n                } else if (child) {\n                    var modelToBind = context.model || dummyModel;\n                    var currentModel = ko.dataFor(child);\n\n                    if (currentModel != modelToBind) {\n                        if (!context.composingNewView) {\n                            ko.removeNode(child);\n                            viewEngine.createView(child.getAttribute('data-view')).then(function(recreatedView) {\n                                composition.bindAndShow(recreatedView, context, true);\n                            });\n                            return;\n                        }\n\n                        if(context.parts){\n                            replaceParts(context);\n                        }\n\n                        hide(child);\n                        ko.virtualElements.prepend(context.parent, child);\n\n                        binder.bind(modelToBind, child);\n                    }\n                }\n\n                composition.finalize(context);\n            }, skipActivation);\n        },\n        /**\n         * Eecutes the default view location strategy.\n         * @method defaultStrategy\n         * @param {object} context The composition context containing the model and possibly existing viewElements.\n         * @return {promise} A promise for the view.\n         */\n        defaultStrategy: function (context) {\n            return viewLocator.locateViewForObject(context.model, context.area, context.viewElements);\n        },\n        getSettings: function (valueAccessor, element) {\n            var value = valueAccessor(),\n                settings = ko.utils.unwrapObservable(value) || {},\n                activatorPresent = activator.isActivator(value),\n                moduleId;\n\n            if (system.isString(settings)) {\n                if (viewEngine.isViewUrl(settings)) {\n                    settings = {\n                        view: settings\n                    };\n                } else {\n                    settings = {\n                        model: settings,\n                        activate: true\n                    };\n                }\n\n                return settings;\n            }\n\n            moduleId = system.getModuleId(settings);\n            if (moduleId) {\n                settings = {\n                    model: settings,\n                    activate: true\n                };\n\n                return settings;\n            }\n\n            if(!activatorPresent && settings.model) {\n                activatorPresent = activator.isActivator(settings.model);\n            }\n\n            for (var attrName in settings) {\n                if (ko.utils.arrayIndexOf(bindableSettings, attrName) != -1) {\n                    settings[attrName] = ko.utils.unwrapObservable(settings[attrName]);\n                } else {\n                    settings[attrName] = settings[attrName];\n                }\n            }\n\n            if (activatorPresent) {\n                settings.activate = false;\n            } else if (settings.activate === undefined) {\n                settings.activate = true;\n            }\n\n            return settings;\n        },\n        executeStrategy: function (context) {\n            context.strategy(context).then(function (child) {\n                composition.bindAndShow(child, context);\n            });\n        },\n        inject: function (context) {\n            if (!context.model) {\n                this.bindAndShow(null, context);\n                return;\n            }\n\n            if (context.view) {\n                viewLocator.locateView(context.view, context.area, context.viewElements).then(function (child) {\n                    composition.bindAndShow(child, context);\n                });\n                return;\n            }\n\n            if (!context.strategy) {\n                context.strategy = this.defaultStrategy;\n            }\n\n            if (system.isString(context.strategy)) {\n                system.acquire(context.strategy).then(function (strategy) {\n                    context.strategy = strategy;\n                    composition.executeStrategy(context);\n                }).fail(function(err){\n                    system.error('Failed to load view strategy (' + context.strategy + '). Details: ' + err.message);\n                });\n            } else {\n                this.executeStrategy(context);\n            }\n        },\n        /**\n         * Initiates a composition.\n         * @method compose\n         * @param {DOMElement} element The DOMElement or knockout virtual element that serves as the parent for the composition.\n         * @param {object} settings The composition settings.\n         * @param {object} [bindingContext] The current binding context.\n         */\n        compose: function (element, settings, bindingContext, fromBinding) {\n            compositionCount++;\n\n            if(!fromBinding){\n                settings = composition.getSettings(function() { return settings; }, element);\n            }\n\n            if (settings.compositionComplete) {\n                compositionCompleteCallbacks.push(function () {\n                    settings.compositionComplete(settings.child, settings.parent, settings);\n                });\n            }\n\n            compositionCompleteCallbacks.push(function () {\n                if(settings.composingNewView && settings.model && settings.model.compositionComplete){\n                    settings.model.compositionComplete(settings.child, settings.parent, settings);\n                }\n            });\n\n            var hostState = getHostState(element);\n\n            settings.activeView = hostState.activeView;\n            settings.parent = element;\n            settings.triggerAttach = triggerAttach;\n            settings.bindingContext = bindingContext;\n\n            if (settings.cacheViews && !settings.viewElements) {\n                settings.viewElements = hostState.childElements;\n            }\n\n            if (!settings.model) {\n                if (!settings.view) {\n                    this.bindAndShow(null, settings);\n                } else {\n                    settings.area = settings.area || 'partial';\n                    settings.preserveContext = true;\n\n                    viewLocator.locateView(settings.view, settings.area, settings.viewElements).then(function (child) {\n                        composition.bindAndShow(child, settings);\n                    });\n                }\n            } else if (system.isString(settings.model)) {\n                system.acquire(settings.model).then(function (module) {\n                    settings.model = system.resolveObject(module);\n                    composition.inject(settings);\n                }).fail(function(err){\n                    system.error('Failed to load composed module (' + settings.model + '). Details: ' + err.message);\n                });\n            } else {\n                composition.inject(settings);\n            }\n        }\n    };\n\n    ko.bindingHandlers.compose = {\n        init: function() {\n            return { controlsDescendantBindings: true };\n        },\n        update: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {\n            var settings = composition.getSettings(valueAccessor, element);\n            if(settings.mode){\n                var data = ko.utils.domData.get(element, compositionDataKey);\n                if(!data){\n                    var childNodes = ko.virtualElements.childNodes(element);\n                    data = {};\n\n                    if(settings.mode === 'inline'){\n                        data.view = viewEngine.ensureSingleElement(childNodes);\n                    }else if(settings.mode === 'templated'){\n                        data.parts = cloneNodes(childNodes);\n                    }\n\n                    ko.virtualElements.emptyNode(element);\n                    ko.utils.domData.set(element, compositionDataKey, data);\n                }\n\n                if(settings.mode === 'inline'){\n                    settings.view = data.view.cloneNode(true);\n                }else if(settings.mode === 'templated'){\n                    settings.parts = data.parts;\n                }\n\n                settings.preserveContext = true;\n            }\n\n            composition.compose(element, settings, bindingContext, true);\n        }\n    };\n\n    ko.virtualElements.allowedBindings.compose = true;\n\n    return composition;\n});\n\n","/**\n * Durandal 2.0.1 Copyright (c) 2012 Blue Spire Consulting, Inc. All Rights Reserved.\n * Available via the MIT license.\n * see: http://durandaljs.com or https://github.com/BlueSpire/Durandal for details.\n */\n/**\n * Durandal events originate from backbone.js?v=1552304184357 but also combine some ideas from signals.js?v=1552304184357 as well as some additional improvements.\n * Events can be installed into any object and are installed into the `app` module by default for convenient app-wide eventing.\n * @module events\n * @requires system\n */\ndefine('durandal/events',['durandal/system'], function (system) {\n    var eventSplitter = /\\s+/;\n    var Events = function() { };\n\n    /**\n     * Represents an event subscription.\n     * @class Subscription\n     */\n    var Subscription = function(owner, events) {\n        this.owner = owner;\n        this.events = events;\n    };\n\n    /**\n     * Attaches a callback to the event subscription.\n     * @method then\n     * @param {function} callback The callback function to invoke when the event is triggered.\n     * @param {object} [context] An object to use as `this` when invoking the `callback`.\n     * @chainable\n     */\n    Subscription.prototype.then = function (callback, context) {\n        this.callback = callback || this.callback;\n        this.context = context || this.context;\n        \n        if (!this.callback) {\n            return this;\n        }\n\n        this.owner.on(this.events, this.callback, this.context);\n        return this;\n    };\n\n    /**\n     * Attaches a callback to the event subscription.\n     * @method on\n     * @param {function} [callback] The callback function to invoke when the event is triggered. If `callback` is not provided, the previous callback will be re-activated.\n     * @param {object} [context] An object to use as `this` when invoking the `callback`.\n     * @chainable\n     */\n    Subscription.prototype.on = Subscription.prototype.then;\n\n    /**\n     * Cancels the subscription.\n     * @method off\n     * @chainable\n     */\n    Subscription.prototype.off = function () {\n        this.owner.off(this.events, this.callback, this.context);\n        return this;\n    };\n\n    /**\n     * Creates an object with eventing capabilities.\n     * @class Events\n     */\n\n    /**\n     * Creates a subscription or registers a callback for the specified event.\n     * @method on\n     * @param {string} events One or more events, separated by white space.\n     * @param {function} [callback] The callback function to invoke when the event is triggered. If `callback` is not provided, a subscription instance is returned.\n     * @param {object} [context] An object to use as `this` when invoking the `callback`.\n     * @return {Subscription|Events} A subscription is returned if no callback is supplied, otherwise the events object is returned for chaining.\n     */\n    Events.prototype.on = function(events, callback, context) {\n        var calls, event, list;\n\n        if (!callback) {\n            return new Subscription(this, events);\n        } else {\n            calls = this.callbacks || (this.callbacks = {});\n            events = events.split(eventSplitter);\n\n            while (event = events.shift()) {\n                list = calls[event] || (calls[event] = []);\n                list.push(callback, context);\n            }\n\n            return this;\n        }\n    };\n\n    /**\n     * Removes the callbacks for the specified events.\n     * @method off\n     * @param {string} [events] One or more events, separated by white space to turn off. If no events are specified, then the callbacks will be removed.\n     * @param {function} [callback] The callback function to remove. If `callback` is not provided, all callbacks for the specified events will be removed.\n     * @param {object} [context] The object that was used as `this`. Callbacks with this context will be removed.\n     * @chainable\n     */\n    Events.prototype.off = function(events, callback, context) {\n        var event, calls, list, i;\n\n        // No events\n        if (!(calls = this.callbacks)) {\n            return this;\n        }\n\n        //removing all\n        if (!(events || callback || context)) {\n            delete this.callbacks;\n            return this;\n        }\n\n        events = events ? events.split(eventSplitter) : system.keys(calls);\n\n        // Loop through the callback list, splicing where appropriate.\n        while (event = events.shift()) {\n            if (!(list = calls[event]) || !(callback || context)) {\n                delete calls[event];\n                continue;\n            }\n\n            for (i = list.length - 2; i >= 0; i -= 2) {\n                if (!(callback && list[i] !== callback || context && list[i + 1] !== context)) {\n                    list.splice(i, 2);\n                }\n            }\n        }\n\n        return this;\n    };\n\n    /**\n     * Triggers the specified events.\n     * @method trigger\n     * @param {string} [events] One or more events, separated by white space to trigger.\n     * @chainable\n     */\n    Events.prototype.trigger = function(events) {\n        var event, calls, list, i, length, args, all, rest;\n        if (!(calls = this.callbacks)) {\n            return this;\n        }\n\n        rest = [];\n        events = events.split(eventSplitter);\n        for (i = 1, length = arguments.length; i < length; i++) {\n            rest[i - 1] = arguments[i];\n        }\n\n        // For each event, walk through the list of callbacks twice, first to\n        // trigger the event, then to trigger any `\"all\"` callbacks.\n        while (event = events.shift()) {\n            // Copy callback lists to prevent modification.\n            if (all = calls.all) {\n                all = all.slice();\n            }\n\n            if (list = calls[event]) {\n                list = list.slice();\n            }\n\n            // Execute event callbacks.\n            if (list) {\n                for (i = 0, length = list.length; i < length; i += 2) {\n                    list[i].apply(list[i + 1] || this, rest);\n                }\n            }\n\n            // Execute \"all\" callbacks.\n            if (all) {\n                args = [event].concat(rest);\n                for (i = 0, length = all.length; i < length; i += 2) {\n                    all[i].apply(all[i + 1] || this, args);\n                }\n            }\n        }\n\n        return this;\n    };\n\n    /**\n     * Creates a function that will trigger the specified events when called. Simplifies proxying jQuery (or other) events through to the events object.\n     * @method proxy\n     * @param {string} events One or more events, separated by white space to trigger by invoking the returned function.\n     * @return {function} Calling the function will invoke the previously specified events on the events object.\n     */\n    Events.prototype.proxy = function(events) {\n        var that = this;\n        return (function(arg) {\n            that.trigger(events, arg);\n        });\n    };\n\n    /**\n     * Creates an object with eventing capabilities.\n     * @class EventsModule\n     * @static\n     */\n\n    /**\n     * Adds eventing capabilities to the specified object.\n     * @method includeIn\n     * @param {object} targetObject The object to add eventing capabilities to.\n     */\n    Events.includeIn = function(targetObject) {\n        targetObject.on = Events.prototype.on;\n        targetObject.off = Events.prototype.off;\n        targetObject.trigger = Events.prototype.trigger;\n        targetObject.proxy = Events.prototype.proxy;\n    };\n\n    return Events;\n});\n\n","/**\n * Durandal 2.0.1 Copyright (c) 2012 Blue Spire Consulting, Inc. All Rights Reserved.\n * Available via the MIT license.\n * see: http://durandaljs.com or https://github.com/BlueSpire/Durandal for details.\n */\n/**\n * The app module controls app startup, plugin loading/configuration and root visual display.\n * @module app\n * @requires system\n * @requires viewEngine\n * @requires composition\n * @requires events\n * @requires jquery\n */\ndefine('durandal/app',['durandal/system', 'durandal/viewEngine', 'durandal/composition', 'durandal/events', 'jquery'], function(system, viewEngine, composition, Events, $) {\n    var app,\n        allPluginIds = [],\n        allPluginConfigs = [];\n\n    function loadPlugins(){\n        return system.defer(function(dfd){\n            if(allPluginIds.length == 0){\n                dfd.resolve();\n                return;\n            }\n\n            system.acquire(allPluginIds).then(function(loaded){\n                for(var i = 0; i < loaded.length; i++){\n                    var currentModule = loaded[i];\n\n                    if(currentModule.install){\n                        var config = allPluginConfigs[i];\n                        if(!system.isObject(config)){\n                            config = {};\n                        }\n\n                        currentModule.install(config);\n                        system.log('Plugin:Installed ' + allPluginIds[i]);\n                    }else{\n                        system.log('Plugin:Loaded ' + allPluginIds[i]);\n                    }\n                }\n\n                dfd.resolve();\n            }).fail(function(err){\n                system.error('Failed to load plugin(s). Details: ' + err.message);\n            });\n        }).promise();\n    }\n\n    /**\n     * @class AppModule\n     * @static\n     * @uses Events\n     */\n    app = {\n        /**\n         * The title of your application.\n         * @property {string} title\n         */\n        title: 'Application',\n        /**\n         * Configures one or more plugins to be loaded and installed into the application.\n         * @method configurePlugins\n         * @param {object} config Keys are plugin names. Values can be truthy, to simply install the plugin, or a configuration object to pass to the plugin.\n         * @param {string} [baseUrl] The base url to load the plugins from.\n         */\n        configurePlugins:function(config, baseUrl){\n            var pluginIds = system.keys(config);\n            baseUrl = baseUrl || 'plugins/';\n\n            if(baseUrl.indexOf('/', baseUrl.length - 1) === -1){\n                baseUrl += '/';\n            }\n\n            for(var i = 0; i < pluginIds.length; i++){\n                var key = pluginIds[i];\n                allPluginIds.push(baseUrl + key);\n                allPluginConfigs.push(config[key]);\n            }\n        },\n        /**\n         * Starts the application.\n         * @method start\n         * @return {promise}\n         */\n        start: function() {\n            system.log('Application:Starting');\n\n            if (this.title) {\n                document.title = this.title;\n            }\n\n            return system.defer(function (dfd) {\n                $(function() {\n                    loadPlugins().then(function(){\n                        dfd.resolve();\n                        system.log('Application:Started');\n                    });\n                });\n            }).promise();\n        },\n        /**\n         * Sets the root module/view for the application.\n         * @method setRoot\n         * @param {string} root The root view or module.\n         * @param {string} [transition] The transition to use from the previous root (or splash screen) into the new root.\n         * @param {string} [applicationHost] The application host element or id. By default the id 'applicationHost' will be used.\n         */\n        setRoot: function(root, transition, applicationHost) {\n            var hostElement, settings = { activate:true, transition: transition };\n\n            if (!applicationHost || system.isString(applicationHost)) {\n                hostElement = document.getElementById(applicationHost || 'applicationHost');\n            } else {\n                hostElement = applicationHost;\n            }\n\n            if (system.isString(root)) {\n                if (viewEngine.isViewUrl(root)) {\n                    settings.view = root;\n                } else {\n                    settings.model = root;\n                }\n            } else {\n                settings.model = root;\n            }\n\n            composition.compose(hostElement, settings);\n        }\n    };\n\n    Events.includeIn(app);\n\n    return app;\n});\n\n","define('browserSupport',[], function () {\n    var ua = navigator.userAgent.toLowerCase();\n\n    var browserSupport = {\n        isSupportedMobile: null,\n        isSupportedBrowser: null,\n        isMobileDevice: null,\n        isFirefox: null,\n        isChromeWithPageCoordsBug: null,\n        isSafari: false,\n\n        initialize: initialize\n    };\n\n    return browserSupport;\n\n    function initialize() {\n        var browserInfo = getBrowserInfo();\n        browserSupport.isFirefox = isFirefox(browserInfo);\n\n        browserSupport.isMobileDevice = isMobileDevice();\n        browserSupport.isSupportedMobile = isSupportedMobile();\n        browserSupport.isSupportedBrowser = isSupportedBrowser(browserInfo);\n        browserSupport.isChromeWithPageCoordsBug = isChromeWithPageCoordsBug();\n        browserSupport.isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n    };\n\n    function isChromeWithPageCoordsBug() {\n        if (ua.match(/(chrome)\\/?\\s*([\\d\\.]+)/i)) {\n            return window.navigator.appVersion.match(/Chrome\\/(.*?) /)[1] == \"38.0.2125.102\";\n        }\n        return false;\n    }\n\n\n\n    function getBrowserInfo() {\n        var N = navigator.appName,\n            tem,\n            M = ua.match(/(chrome|safari|firefox|msie)\\/?\\s*([\\d\\.]+)/i) || [];\n\n        M = M[2] ? [M[1], M[2]] : [N, navigator.appVersion, '-?'];\n        if (M && (tem = ua.match(/version\\/([\\.\\d]+)/i)) != null) M[2] = tem[1];\n\n        var browser = M[0].toLowerCase();\n        var version = parseInt(M[1], 10);\n\n        return { browser: browser, version: version };\n    };\n\n    function isFirefox(browserInfo) {\n        return browserInfo.browser == \"firefox\";\n    };\n\n    function isMobileDevice() {\n        if (ua.indexOf(\"ipod\") != -1 ||\n            ua.indexOf(\"iphone\") != -1 ||\n            ua.indexOf(\"ipad\") != -1 ||\n            ua.indexOf(\"android\") != -1)\n            return true;\n        return false;\n    };\n\n    function isSupportedMobile() {\n        if (/iP(hone|od|ad)/.test(navigator.platform)) {\n            var v = (navigator.appVersion).match(/OS (\\d+)_(\\d+)_?(\\d+)?/);\n            if (parseInt(v[1], 10) >= 6) {\n                return true;\n            }\n        }\n\n        //Android is supported but not chrome, opera or firefox\n        if (ua.indexOf(\"android\") != -1 &&\n            ua.indexOf(\"opera\") == -1 &&\n            ua.indexOf(\"firefox\") == -1) {\n            return true;\n        }\n\n        return false;\n    };\n\n    function isSupportedBrowser(browserInfo) {\n        // Opera is not supported\n        if (navigator.appName.toLowerCase() == \"opera\" || navigator.userAgent.indexOf(\"OPR\") != -1)\n            return false;\n\n        //Chrome 28+, Firefox 22+, Safari 5+ are supported\n        var browser = browserInfo.browser;\n        var version = browserInfo.version;\n\n        if (browser == \"chrome\" && version >= 28 ||\n                browser == \"firefox\" && version >= 22 ||\n                browser == \"safari\" && version >= 533)\n            return true;\n\n        // IE 11 is supported\n        if (ua.indexOf('rv:11.0') != -1) {\n            return true;\n        }\n\n        return false;\n    };\n});\n","define('bootstrapping/browserSupportTask',['browserSupport'], function (browserSupport) {\n    return {\n        execute: function () {\n            browserSupport.initialize();\n        }\n    };\n});\n","define('bootstrapping/viewLocatorTask',['durandal/viewLocator'], function (viewLocator) {\n\n    return {\n        execute: function () {\n            viewLocator.useConvention();\n        }\n    };\n\n});\n","define('bootstrapping/knockoutBindings/areaBinding',[],function () {\n    ko.bindingHandlers.area = {\n        init: function (element, valueAccessor) {\n            var\n                value = valueAccessor(),\n                click = value ? value.click : undefined,\n                offset, x, y\n            ;\n\n            $(element).on('click', handler);\n            ko.utils.domNodeDisposal.addDisposeCallback(element, function () {\n                $(element).off('click', handler);\n            });\n\n            function handler(e) {\n                offset = $(element).offset();\n                x = e.pageX - offset.left;\n                y = e.pageY - offset.top;\n\n                if (typeof (click) == \"function\") {\n                    click({ x: x, y: y });\n                }\n            }\n\n        }\n    };\n});\n","define('bootstrapping/knockoutBindings/autofocusBinding',['knockout', 'jquery', 'durandal/composition'], function (ko, $, composition) {\n\n    ko.bindingHandlers.autofocus = {\n        init: function (element) {\n            var $element = $(element);\n            $element.find('.autofocus').first().focus();\n        }\n    };\n\n    composition.addBindingHandler('autofocus');\n\n});\n","define('bootstrapping/knockoutBindings/autosizeBinding',['jquery', 'knockout', 'durandal/composition'], function ($, ko, composition) {\n    ko.bindingHandlers.autosize = {\n        init: function (element, valueAccessor, allBindingsAccessor, data, context) {\n            autosize($(element), { setOverflowX: false, setOverflowY: false });\n        },\n        update: function (element, valueAccessor, allBindingsAccessor, data, context) {\n            autosize.update($(element));\n        }\n    }\n\n    composition.addBindingHandler('autosize');\n});\n","define('bootstrapping/knockoutBindings/backgroundBinding',[],function () {\n    ko.bindingHandlers.background = {\n        init: function (element) {\n            $(element)\n                .css('background-position', '0 0')\n                .css('background-repeat', 'no-repeat');\n        },\n        update: function (element, valueAccessor) {\n            var value = valueAccessor();\n            if (value) {\n                var src = ko.utils.unwrapObservable(value);\n                var image = new Image();\n                image.src = src;\n\n                image.onload = function () {\n                    $(element)\n                        .css('background-image', 'url(' + src + ')')\n                        .css('height', image.height)\n                        .css('width', image.width);\n                }\n            }\n        }\n    };\n});\n","define('templateSettings',[],function() {\n    'use strict';\n\n    return {\n        init: function(settings) {\n            for (var key in settings) {\n                this[key] = settings[key];\n            }\n        },\n        getColorValue: function(color) {\n            var settingColor = _.find(this.colors, function(c) {\n                return c.key === color;\n            });\n\n            if (!settingColor) {\n                throw 'Variable \"' + color + '\" does not exist in template settings';\n            }\n\n            return settingColor.value;\n        }\n    };\n});\n","define('bootstrapping/knockoutBindings/circleProgressBinding',['durandal/composition', 'templateSettings', 'less'], function (composition, templateSettings, less) {\n    \n        ko.bindingHandlers.circleProgress = {\n            update: function(element, valueAccessor) {\n    \n                var $element = $(element),\n                    score = valueAccessor().progress || 0,\n                    lineWidth = parseInt($element.css('column-width')) || valueAccessor().lineWidth || 4,\n    \n                    centerX = element.width / 2,\n                    centerY = element.height / 2,\n                    radius = valueAccessor().radius || (centerX < centerY ? centerX : centerY - lineWidth / 2 - 1),\n                    progress = score / 100,\n                    cnxt = element.getContext('2d'),\n                    masteryScore = valueAccessor().masteryScore,\n                    isMastered = valueAccessor().isMastered;\n    \n                if (isMastered) {\n                    $element.addClass('mastered')\n                }\n\n                var colors = {\n                    basic: $element.css('color') || valueAccessor().basicColor || getDefaultBasicColor(),\n                    progress: $element.css('border-top-color') || $element.css('border-color') || valueAccessor().progressColor || templateSettings.getColorValue('@secondary-color'),\n                    mastered: $element.css('outline-color') || valueAccessor().masteredColor || templateSettings.getColorValue('@correct-color')\n                };\n    \n                if (progress > 0) {\n                    cnxt.beginPath();\n                    cnxt.strokeStyle = isMastered ? colors.mastered : colors.progress;\n                    cnxt.lineWidth = lineWidth;\n    \n                    if (progress == 1) {\n                        cnxt.arc(centerX, centerY, radius, 0, 2 * Math.PI);\n                        cnxt.closePath();\n                        cnxt.stroke();\n                    } else {\n                        cnxt.arc(centerX, centerY, radius, 1.5 * Math.PI, (progress * 2 - .5) * Math.PI);\n                        cnxt.stroke();       \n    \n                        cnxt.beginPath();\n                        cnxt.arc(centerX, centerY, radius, (progress * 2 - .5) * Math.PI, 1.5 * Math.PI);\n                        cnxt.strokeStyle = colors.basic;\n                        cnxt.lineWidth = lineWidth;\n                        cnxt.stroke();\n                    }\n                } else {                    \n                    cnxt.beginPath();\n                    cnxt.arc(centerX, centerY, radius, 0, 2 * Math.PI);\n                    cnxt.strokeStyle = colors.basic;\n                    cnxt.lineWidth = lineWidth;\n                    cnxt.closePath();\n                    cnxt.stroke();\n                }\n    \n            }\n        };\n\n        function getDefaultBasicColor() {\n            var c = new less.tree.Color(templateSettings.getColorValue('@text-color').slice(1));\n            var dimension = new less.tree.Dimension('95');\n            var func = less.functions.functionRegistry.get('tint');\n            return func(c, dimension).toRGB();\n        }\n    });\n","define('bootstrapping/knockoutBindings/contextBinding',[], function () {\n\n    ko.bindingHandlers.context = {\n        init: function (element, valueAccessor, allBindingsAccessor, viewModel) {\n            viewModel.__context__ = element.getContext('2d');\n        },\n        update: function (element, valueAccessor, allBindingsAccessor, viewModel) {\n            var callback = ko.utils.unwrapObservable(allBindingsAccessor().contextCallback);\n            callback.call(viewModel, viewModel.__context__);\n        }\n    };\n});\n","define('bootstrapping/knockoutBindings/elementsWrapBinding',['knockout', 'jquery', 'durandal/composition'], function (ko, $, composition) {\n\n    ko.bindingHandlers.elementsWrap = {\n        init: function (element) {\n            wrapElement(element);\n        },\n\n        update: function (element) {\n            wrapElement(element);\n        }\n    };\n\n    function wrapElement(element) {\n        var $element = $(element),\n                imageWrapper = '<figure class=\"image-wrapper\"></figure>',\n                tableWrapper = '<figure class=\"table-wrapper\"></figure>';\n\n        $('img', $element).each(function (index, image) {\n            var $image = $(image),\n                $wrapper = $(imageWrapper).css('float', $image[0].style.cssFloat),\n                $parent = $image.parent();\n\n            if ($image.closest('.cropped-image').length > 0 || $parent.hasClass('image-wrapper')) {\n                return;\n            }\n\n            if ($parent.prop('tagName') == \"TD\" && $parent[0].style.width == \"\") {\n                $wrapper.css('width', $image[0].style.width);\n                $wrapper.css('height', $image[0].style.height);\n            }\n\n            // moved to css, because of IE11 crash on Windows 10 => .image-wrapper img {height:auto!important;float:none!important;}\n            //$image.height('auto');\n            //$image.css('float', 'none');\n            //\n            $image.wrap($wrapper);\n        });\n\n        $('table', $element).each(function (index, table) {\n            var $table = $(table),\n                $wrapper = $(tableWrapper).css('float', $table.attr('align'));\n\n            $table.attr('align', 'center');\n            $table.wrap($wrapper);\n        });\n\n        $('.audio-editor iframe', $element).each(function (index, iframe) {\n            var $iframe = $(iframe);\n\n            var src = $iframe.attr('src');\n            $iframe.attr('src', src + '&style_variables=' + encodeURIComponent(getStyles()));\n        });\n    }\n\n    composition.addBindingHandler('elementsWrap');\n\n    function getStyles() {\n        return window.LessProcessor && window.LessProcessor.vars ? JSON.stringify({ '@main-color': window.LessProcessor.vars['@main-color'], '@content-body-color': window.LessProcessor.vars['@content-body-color'], '@text-color': window.LessProcessor.vars['@text-color'] }) : undefined;\n    }\n\n});\n","define('bootstrapping/knockoutBindings/focusHandlerBinding',[],function() {\n\n    ko.bindingHandlers.focusHandler = {\n        update: function() {\n\n            var elem = '.xapi-form-input',\n                wrapper = elem + '-wrapper';\n\n            $(elem).focusin(function () { })\n                .blur(function () { })\n                .focusin();\n\n            $(wrapper).click(function() {\n                if ($(this).parent().find(elem).is(':focus')) {\n                    $(this).bind('click mousedown mouseup', function() {\n                        return false;\n                    });\n                } else {\n                    $(this).bind('click mousedown mouseup', function() {\n                        return false;\n                    }).parent().find(elem).focus();\n                }\n            });\n\n            $(elem).hover(function() {\n                $(this).parent().find(wrapper).toggleClass('hover');\n            });\n\n            $(elem).focusin(function() {\n                $(this).parent().find(wrapper).addClass('focus');\n            });\n            $(elem).blur(function() {\n                $(this).parent().find(wrapper).removeClass('focus');\n            });\n        }\n    };\n\n});\n","define('bootstrapping/knockoutBindings/toggleVisibleBindingHandler',[],function () {\n\n    ko.bindingHandlers.toggleVisible = {\n        update: function (element, valueAccessor) {\n            var $element = $(element),\n                isExpanded = valueAccessor().isExpanded,\n                $animationContainer = $element.children('[data-animate]'),\n                speed = 300;\n\n            if (isExpanded) {\n                $animationContainer.css('height', '').hide().slideDown(speed, function(){$animationContainer.css('overflow', '')});\n            } else {\n                $animationContainer.css('overflow','hidden').animate({height: 0}, speed);\n            }\n        }\n    }\n});\n","define('bootstrapping/knockoutBindings/dropDownBinding',[],function () {\n\n    ko.bindingHandlers.dropDown = {\n        init: function (element) {\n            var $element = $(element),\n                expandedClass = 'expanded',\n                disabledClass = 'disabled',\n                $html = $('html');\n\n            $element.on('click', function () {\n                if ($element.hasClass(expandedClass) || $element.hasClass(disabledClass)) {\n                    return;\n                } else {\n                    $element.addClass(expandedClass);\n\n                    _.defer(function () {\n                        $html.on('click', hide);\n                    });\n                }\n            });\n\n            function hide() {\n                $element.removeClass(expandedClass);\n                $html.off('click', hide);\n            };\n\n        }\n    }\n});\n","define('bootstrapping/knockoutBindings/scrollTopBinding',['knockout'], function (ko) {\n    'use strict';\n\n    ko.bindingHandlers.scrollTop = {\n        init: function (element, valueAccessor, allBindingsAccessor) {\n            var time = ko.unwrap(valueAccessor());\n            var $element = $(element);\n            var $document = $(document);\n            var isScrolling = false;\n            var isEnabled = false;\n\n            $element.hide().css('opacity', '0');\n            \n            $document.scroll(function() {\n                var y = $(this).scrollTop();\n\n                if (y > 0) {\n                    if(!isEnabled) {\n                        $element\n                            .show()       \n                            .animate({bottom: \"+=10\", opacity: '1'}, 300);\n\n                        isEnabled = true;\n                    }\n                } else {\n                    $element                   \n                        .animate({bottom: \"-=10\", opacity: '0'}, 300, function(){\n                                if(!isEnabled)\n                                    $element.hide();\n                            });\n\n                    isEnabled = false;\n                }\n            }); \n\n            $element.bind('click', function(){\n                if(!isScrolling && isEnabled){\n                    isScrolling = true;\n\n                    $('html, body').animate({scrollTop: 0}, time, function(){\n                        isScrolling = false;\n                    });\n                }\n            });\n        }\n    };\n});\n","define('bootstrapping/knockoutBindings/scrollIntoViewBinding',['durandal/composition'], function (composition) {\n\n    ko.bindingHandlers.scrollIntoView = {\n        update: function (element, valueAccessor) {\n            var $element = $(element),\n                isVisible = ko.utils.unwrapObservable(valueAccessor());\n\n            if (!isVisible) {\n                return;\n            }\n\n            scrollToElement($element);\n        }\n    };\n\n    function scrollToElement($element) {\n        _.defer(function () {\n            if (!$element.is(':hidden')){\n                $('html:not(:animated),body:not(:animated)').animate({\n                    scrollTop: $element.offset().top\n                }, function () { });\n            }\n        });\n    }\n\n    composition.addBindingHandler('scrollIntoView');\n\n});\n","define('localizationManager',[], function () {\n    return {\n        getLocalizedText: function(value) {\n            if (_.isString(value)) {\n                return TranslationPlugin.getTextByKey(value);\n            } else if (_.isObject(value)) {\n                var text = TranslationPlugin.getTextByKey(value.key);\n\n                for (var replacement in value.replace) {\n                    text = text.replace('{' + replacement + '}', value.replace[replacement]);\n                }\n\n                return text;\n            }\n        }\n    }\n});\n","define('constants',[],function () {\n    'use strict';\n\n    return {\n        questionTypes: {\n            multipleSelect: 'multipleSelect',\n            fillInTheBlank: 'fillInTheBlank',\n            dragAndDrop: 'dragAndDropText',\n            singleSelectText: 'singleSelectText',\n            singleSelectImage: 'singleSelectImage',\n            textMatching: 'textMatching',\n            hotspot: 'hotspot',\n            statement: 'statement',\n            informationContent: 'informationContent',\n            openQuestion: 'openQuestion',\n            scenario: 'scenario',\n            rankingText: 'rankingText'\n        },\n        defaultImageUrl: 'css/img/single-select-image-anwer.png?v=1552304184357',\n        events: {\n            appClosed: 'appClosed',\n            onError: 'onError',\n            appInitialized: 'appInitialized',\n            imagePreviewClosed: 'image:preview:closed'\n        },\n        localStorageProgressKey: 'course_progress',\n        localStorageResultKey: 'course_result',\n        course: {\n            statuses: {\n                completed: 'completed',\n                failed: 'failed',\n                inProgress: 'inProgress'\n            }\n        },\n        progressContext: {\n            statuses: {\n                undefined: 'undefined',\n                saved: 'saved',\n                error: 'error',\n                ignored: 'ignored'\n            }\n        },\n        documents: {\n            types: {\n                pdf: 'pdf',\n                word: 'word',\n                exel: 'exel',\n                powerpoint: 'powerpoint',\n                zip: 'zip'\n            },\n            downloadLocalizationKey: '[download]',\n            containerSelector: '.document-container',\n            downloadBtnSelector: '.download-document-btn',\n            documentTitleWrapperSelector: '.document-title-wrapper',\n            iframeSelector: '.document-block-iframe-wrapper iframe',\n\n            sizeAttrName: 'data-document-size',\n            typeAttrName: 'data-document-type'\n        },\n        dialogs: {\n            resendResults: {\n                webhooks: {\n                    resultsSendErrorTitleKey: '[results send error title]',\n                    endpointNameKey: '[webhooks endpoint name key]'\n                }    \n            }\n        },\n        loginTypes: {\n            byToken: 'byToken',\n            byEmailAndName: 'byEmailAndName',\n            byEmailAndNameWithoutCrossDeviceSaving: 'byEmailAndNameWithoutCrossDeviceSaving',\n            default: 'default'\n        }\n    };\n\n});\n\n","define('helpers/documentBlock',['localizationManager', 'constants'], function (localizationManager, constants) {\n    return {\n        getDocumentBlockContent: function (html) {\n            var $output = $('<output>').html(html),\n                $container = $output.find(constants.documents.containerSelector);\n\n            var downloadText = localizationManager.getLocalizedText(constants.documents.downloadLocalizationKey);\n            var documentData = {\n                type: $container.attr(constants.documents.typeAttrName),\n                size: +$container.attr(constants.documents.sizeAttrName)\n            };\n\n            var documentSizeString = getSize(documentData.size);\n            var downloadBtnText = downloadText + ' (' + documentSizeString + ')';\n\n            if(documentData.type === constants.documents.types.zip) {\n                $container.addClass(documentData.type);\n            }\n\n            $output.find(constants.documents.downloadBtnSelector)\n                .text(downloadBtnText);\n\n            var iconClass = documentData.type === constants.documents.types.zip ? 'icon-zip' : 'icon-file';\n            var $typeIcon = $('<div class=\"icon-container\">' +\n                '<span class=\"document-type-text\">' + documentData.type + '</span>' +\n                '</div>')\n                .addClass(iconClass);\n            var $typeIconWrapper = $('<div class=\"document-icon\"></div>')\n                .append($typeIcon);\n\n            var $documentInfo = $(constants.documents.documentTitleWrapperSelector, $container)\n                .prepend($typeIconWrapper);\n\n            var content = $output.children()[0];\n            return content;\n        }\n    };\n    /**\n     * Pluralize document size to user friendly string\n     *\n     * @param {Number} size - size of document in bytes\n     * */\n    function getSize(size) {\n        var sizeStr = '';\n        if (!size || size < 1024) {\n            return '0 Kb';\n        }\n        sizeStr = (size / (1024 * 1024)).toFixed(2);\n\n        return sizeStr + ' MB';\n    }\n});\n\n","define('bootstrapping/knockoutBindings/contentBlockBinding',['durandal/composition', 'helpers/documentBlock'], function (composition, documentBlockHelper) {\n    ko.bindingHandlers.contentBlock = {\n        init: function (element, valueAccessor) {\n            var $element = $(element),\n                html = valueAccessor();\n            \n            var dataType = getContentBlockType(html);\n            \n            switch(dataType){\n                case 'hotspot': {\n                    var hotspotOnImage = HotspotStorage.create($(html)[0]);\n                        \n                    $element.addClass('hotspot-on-image-container');\n                    $element.html(hotspotOnImage.element);\n\n                    ko.utils.domNodeDisposal.addDisposeCallback(element, function () {\n                        HotspotStorage.remove(hotspotOnImage);\n                    });\n\n                    break;\n                }\n                case 'document': {\n                    var content = documentBlockHelper.getDocumentBlockContent(html);\n                    $element.append(content);\n                    break;\n                }\n                default: {\n                    $element.html(html);\n                    return ko.bindingHandlers.elementsWrap.init(element, valueAccessor);\n                }\n            }\n        }\n    };\n    \n    composition.addBindingHandler('contentBlock');\n    \n    function getContentBlockType(data) {\n        var $output = $('<output>').html(data),\n            dataType = $('[data-type]', $output).attr('data-type');\n        \n        return dataType;\n    }\n});\n","define('bootstrapping/knockoutBindings/toolTipBindingHandler',['durandal/composition'], function (composition) {\r\n    ko.bindingHandlers.toolTip = {\r\n        init: function (element, valueAccessor) {\r\n            var $element = $(element),\r\n               lineWidth = valueAccessor().lineWidth || 4,\r\n               score = valueAccessor().progress || 0,\r\n               masteryScore = valueAccessor().masteryScore,\r\n               centerX = $element.width() / 2,\r\n               centerY = $element.height() / 2,\r\n               radius = valueAccessor().radius || (centerX < centerY ? centerX : centerY - lineWidth / 2 - 1),\r\n               $canvasParent = $element.parent();\r\n            if (masteryScore) {\r\n                var $toolTip = $('<div />')\r\n                    .addClass('mastered-score-tooltip').appendTo($canvasParent);\r\n\r\n\r\n                var $icon = $('<span> /')\r\n                    .addClass('material-icons')\r\n                    .text('done')\r\n                    .appendTo($toolTip)\r\n\r\n               \r\n\r\n                var $tootlTipText = $('<span />')\r\n                    .addClass('mastered-score-tooltip-text')\r\n                    .text(getScoreTooltipText(masteryScore, score))\r\n                    .appendTo($toolTip);\r\n\r\n\r\n                $canvasParent.hover(showTooltip, hideTooltip);\r\n                $toolTip.hover(showTooltip, hideTooltip);\r\n\r\n                $canvasParent.focusin(showTooltip);\r\n                $canvasParent.focusout(hideTooltip);\r\n\r\n                $toolTip.focusin(showTooltip);\r\n                $toolTip.focusout(hideTooltip);\r\n\r\n                updateTooltipPosition();\r\n                \r\n                ko.utils.domData.set(element, 'ko_tooltip', $toolTip);\r\n                ko.utils.domData.set(element, 'ko_tooltip_text', $tootlTipText);\r\n\r\n                $(window).on('resize', updateTooltipPosition);\r\n\r\n                ko.utils.domNodeDisposal.addDisposeCallback(element, function () {\r\n                    $toolTip.remove();\r\n                    $(window).off('resize', updateTooltipPosition);\r\n                });\r\n            }\r\n\r\n            function showTooltip() {\r\n                $tootlTipText.stop().animate({\r\n                    'opacity': 1,\r\n                    'margin-bottom': '10px'\r\n                }, 200);\r\n            }\r\n            function hideTooltip(event) {\r\n                var e = event.toElement || event.relatedTarget;\r\n                if (e && (e == $canvasParent[0] || e.parentNode == $canvasParent[0] || e == $toolTip[0] || e.parentNode == $toolTip[0])) {\r\n                    return;\r\n                }\r\n                $tootlTipText.stop().animate({\r\n                    'opacity': 0,\r\n                    'margin-bottom': '15px'\r\n                }, 200);\r\n            }\r\n\r\n            function updateTooltipPosition() {\r\n                \r\n                var masteryScoreAngle = 2 * Math.PI * (masteryScore / 100) - 0.5 * Math.PI,\r\n                    masteryScoreX = centerX + (Math.cos(masteryScoreAngle) * (radius)),\r\n                    masteryScoreY = centerY - (Math.sin(masteryScoreAngle) * (radius)),\r\n                    tooltipPosX = masteryScoreX - 6,\r\n                    toolTipPosY = masteryScoreY - 6;\r\n\r\n                $toolTip.css({\r\n                    'left': tooltipPosX,\r\n                    'bottom': toolTipPosY\r\n                });\r\n            }\r\n        },\r\n        update: function (element, valueAccessor) {\r\n            var score = valueAccessor().progress || 0,\r\n              masteryScore = valueAccessor().masteryScore,\r\n              $toolTip = ko.utils.domData.get(element, 'ko_tooltip'),\r\n              $tootlTipText = ko.utils.domData.get(element, 'ko_tooltip_text');\r\n\r\n            if ($tootlTipText) {\r\n                $tootlTipText.text(getScoreTooltipText(masteryScore, score));\r\n            }\r\n\r\n            if (score >= masteryScore && $toolTip) {\r\n                $toolTip.addClass('mastered');\r\n            }\r\n        }\r\n    }\r\n\r\n    function getScoreTooltipText(mastery, score) {\r\n        var scoreToComplete = mastery - score;\r\n        return scoreToComplete > 0 ? scoreToComplete + '% ' + TranslationPlugin.getTextByKey('[to complete]') : TranslationPlugin.getTextByKey('[completed]');\r\n    }\r\n\r\n    composition.addBindingHandler('toolTip');\r\n});\n","define('helpers/fileDownloader',[\"download\", \"jquery\"], function($) {\n  \"use strict\";\n\n  function downloadFile(url, filename) {\n    return fetch(url)\n      .then(function(response) {\n        if (response.status !== 200) {\n          return response.json().then(function(error) {\n            if (error && error.message) {\n              throw new Error(error.message);\n            }\n            throw new Error();\n          });\n        }\n\n        return response.blob();\n      })\n      .then(function(blob) {\n        var isChrome = navigator.userAgent.match(\"CriOS\");\n        var isFirefox = navigator.userAgent.match(\"FxiOS\");\n        if (!isChrome && !isFirefox) {\n          download(blob, filename, blob.type);\n        } else {\n          //for chrome in apple devices\n          var reader = new FileReader();\n          var out = new Blob([blob], { type: blob.type });\n          reader.onload = function(e) {\n            var win = window.open();\n            win.document.write(\n              '<iframe src=\"' +\n                reader.result +\n                '\" frameborder=\"0\" style=\"display: block; width: 100vw; height: 100vh; max-width: 100%;\" allowfullscreen />'\n            );\n          };\n          reader.readAsDataURL(out);\n        }\n      });\n  }\n\n  return {\n    downloadFile: downloadFile\n  };\n});\n\n","define('bootstrapping/knockoutBindings/downloadAsPdfBinding',['helpers/fileDownloader'], function (fileDownloader) {\n    var buttonStatuses = {\n        default: 'default',\n        proggress: 'proggress',\n        error: 'error',\n        serverError: 'server-error'\n    };\n\n    ko.bindingHandlers.downloadAsPdf = {\n        init: function (element, valueAccessor) {\n\n            var\n                $element = $(element),\n                filename = getFullPdfFilename((valueAccessor().title || $element.attr('title'))),\n                serviceUrl = valueAccessor().serviceUrl,\n                version = valueAccessor().version;\n            \n            if (location.href.indexOf('/preview/') !== -1) {\n                disableLink($element);\n                return;\n            }\n            \n            var Url = function (url) {\n                var that = this;\n                that.value = url || '',\n                that.addQueryStringParam = function (key, value) {\n                    that.value += that.value.substr(-1) === \"/\" ? '?' : '&';\n                    that.value += key;\n                    if (value) {\n                        that.value += '=' + encodeURIComponent(value);\n                    }\n\n                    return that;\n                }\n            };\n\n            var convertionUrl = new Url(serviceUrl + '/convert/')\n                .addQueryStringParam('url', getBaseUrl() + '/pdf/index.html?v=1552304184357')\n                .addQueryStringParam('version', version);\n\n            var timeoutId;\n\n            $element.click(function () {\n                if (timeoutId) {\n                    clearTimeout(timeoutId);\n                    timeoutId = null;\n                }\n                \n                setStatus($element, buttonStatuses.proggress);\n\n                fileDownloader.downloadFile(convertionUrl.value, filename)\n                    .then(function(){\n                        setStatus($element, buttonStatuses.default);\n                    })\n                    .catch(function(error) {\n                        if(error.message) {\n                            var el = $element.find('.server-error').text(error.message);\n                            setStatus($element, buttonStatuses.serverError);\n                        } else {\n                            setStatus($element, buttonStatuses.error);\n                        }\n                        timeoutId = setTimeout(function () {\n                            setStatus($element, buttonStatuses.default);\n                        }, 5000);\n                    });\n                return false;\n            });\n        }\n    };\n\n    function setStatus($element, status) {\n        $element\n            .toggleClass(buttonStatuses.default, status === buttonStatuses.default)\n            .toggleClass(buttonStatuses.proggress, status === buttonStatuses.proggress)\n            .toggleClass(buttonStatuses.error, status === buttonStatuses.error)\n            .toggleClass(buttonStatuses.serverError, status === buttonStatuses.serverError);\n    }\n\n    function getDateTimeString() {\n        var now = new Date();\n        return now.toLocaleDateString() + ' ' + now.toLocaleTimeString();\n    }\n    \n    function disableLink($link) {\n        $link.css({\n            'pointer-events': 'none',\n            'opacity': '0.5'\n        });\n        $link.parent().addClass('disabled');\n    }\n    \n    function getBaseUrl() {\n        var baseUrl = location.href.replace(location.hash, '');\n        baseUrl = baseUrl.replace('#', '');\n\n        if (location.pathname && location.pathname.length > 1) {\n            var pageName = location.pathname.split(\"/\").pop();\n            baseUrl = baseUrl.replace(pageName, '');\n        }\n\n        if (location.search && location.search.length > 1) {\n            baseUrl = baseUrl.replace(location.search, '');\n        }\n\n        return baseUrl;\n    }\n\n    /* Fix for IE11 and Edge (files can`t saved without extension) */\n    function getFullPdfFilename(title) {\n        return title + '.pdf';\n    }\n\n    function hasHostname(hostname) {\n        return location.host.indexOf(hostname) !== -1;\n    }\n});\n","define('bootstrapping/knockoutBindings/mediaPlayerBinding',[],function () {\n    ko.bindingHandlers.mediaPlayer = {\n        init: function (element, valueAccessor) {\n\n            var\n                $element = $(element),\n                args = valueAccessor(),\n                embedCode = ko.utils.unwrapObservable(args.embedCode);\n\n            $element.html(getMediaEmbedCode());\n\n            ko.utils.domNodeDisposal.addDisposeCallback(element, function () {\n                $iframe = $element.find('iframe');\n                if ($iframe.length) {\n                    $iframe.attr('src', 'about:blank');\n                }\n                $element.empty();\n            });\n\n            function getMediaEmbedCode() {\n\n                if (!embedCode)\n                    return embedCode;\n\n                var srcAttrName = 'src',\n                    $container = $('<div/>').html(embedCode),\n                    $iframe = $container.find('iframe'),\n                    src = $iframe.attr(srcAttrName),\n                    variablesList = getVariablesList();\n\n                src += '&style_variables=' + encodeURIComponent(variablesList);\n\n                $iframe.attr(srcAttrName, src);\n                return $container.html();\n            }\n        }\n    };\n\n    function getVariablesList() {\n        return window.LessProcessor && window.LessProcessor.vars ? JSON.stringify({ '@main-color': window.LessProcessor.vars['@main-color'], '@content-body-color': window.LessProcessor.vars['@content-body-color'], '@text-color': window.LessProcessor.vars['@text-color'] }) : undefined;\n    }\n});\n","define('bootstrapping/knockoutBindings/customFocusBinding',[],function () {\n    ko.bindingHandlers.customFocus = {\n        init: function (element, valueAccessor) {\n            var $element = $(element),\n                value = valueAccessor(),\n                focusClass = value.class || 'focused';\n\n            $('html').bind('touchstart', removeFocusClass);\n            $('html').bind('click', removeFocusClass);\n            $(window).bind('blur', removeFocusClass);\n\n            ko.utils.domNodeDisposal.addDisposeCallback(element, function () {\n                $('html').unbind('touchstart', removeFocusClass);\n                $('html').unbind('click', removeFocusClass);\n                $(window).unbind('blur', removeFocusClass);\n            });\n\n            $element.on('touchstart', function (e) {\n                e.stopPropagation();\n            });\n\n            $element.on('click', function (e) {\n                $element.addClass(focusClass);\n                e.stopPropagation();\n            });\n\n            function removeFocusClass() {\n                $element.removeClass(focusClass);\n            }\n\n        }\n    }\n});\n","/**\n * Durandal 2.0.1 Copyright (c) 2012 Blue Spire Consulting, Inc. All Rights Reserved.\n * Available via the MIT license.\n * see: http://durandaljs.com or https://github.com/BlueSpire/Durandal for details.\n */\n/**\n * This module is based on Backbone's core history support. It abstracts away the low level details of working with browser history and url changes in order to provide a solid foundation for a router.\n * @module history\n * @requires system\n * @requires jquery\n */\ndefine('plugins/history',['durandal/system', 'jquery'], function (system, $) {\n    // Cached regex for stripping a leading hash/slash and trailing space.\n    var routeStripper = /^[#\\/]|\\s+$/g;\n\n    // Cached regex for stripping leading and trailing slashes.\n    var rootStripper = /^\\/+|\\/+$/g;\n\n    // Cached regex for detecting MSIE.\n    var isExplorer = /msie [\\w.]+/;\n\n    // Cached regex for removing a trailing slash.\n    var trailingSlash = /\\/$/;\n\n    // Update the hash location, either replacing the current entry, or adding\n    // a new one to the browser history.\n    function updateHash(location, fragment, replace) {\n        if (replace) {\n            var href = location.href.replace(/(javascript:|#).*$/, '');\n            location.replace(href + '#' + fragment);\n        } else {\n            // Some browsers require that `hash` contains a leading #.\n            location.hash = '#' + fragment;\n        }\n    };\n\n    /**\n     * @class HistoryModule\n     * @static\n     */\n    var history = {\n        /**\n         * The setTimeout interval used when the browser does not support hash change events.\n         * @property {string} interval\n         * @default 50\n         */\n        interval: 50,\n        /**\n         * Indicates whether or not the history module is actively tracking history.\n         * @property {string} active\n         */\n        active: false\n    };\n    \n    // Ensure that `History` can be used outside of the browser.\n    if (typeof window !== 'undefined') {\n        history.location = window.location;\n        history.history = window.history;\n    }\n\n    /**\n     * Gets the true hash value. Cannot use location.hash directly due to a bug in Firefox where location.hash will always be decoded.\n     * @method getHash\n     * @param {string} [window] The optional window instance\n     * @return {string} The hash.\n     */\n    history.getHash = function(window) {\n        var match = (window || history).location.href.match(/#(.*)$/);\n        return match ? match[1] : '';\n    };\n    \n    /**\n     * Get the cross-browser normalized URL fragment, either from the URL, the hash, or the override.\n     * @method getFragment\n     * @param {string} fragment The fragment.\n     * @param {boolean} forcePushState Should we force push state?\n     * @return {string} he fragment.\n     */\n    history.getFragment = function(fragment, forcePushState) {\n        if (fragment == null) {\n            if (history._hasPushState || !history._wantsHashChange || forcePushState) {\n                fragment = history.location.pathname + history.location.search;\n                var root = history.root.replace(trailingSlash, '');\n                if (!fragment.indexOf(root)) {\n                    fragment = fragment.substr(root.length);\n                }\n            } else {\n                fragment = history.getHash();\n            }\n        }\n        \n        return fragment.replace(routeStripper, '');\n    };\n\n    /**\n     * Activate the hash change handling, returning `true` if the current URL matches an existing route, and `false` otherwise.\n     * @method activate\n     * @param {HistoryOptions} options.\n     * @return {boolean|undefined} Returns true/false from loading the url unless the silent option was selected.\n     */\n    history.activate = function(options) {\n        if (history.active) {\n            system.error(\"History has already been activated.\");\n        }\n\n        history.active = true;\n\n        // Figure out the initial configuration. Do we need an iframe?\n        // Is pushState desired ... is it available?\n        history.options = system.extend({}, { root: '/' }, history.options, options);\n        history.root = history.options.root;\n        history._wantsHashChange = history.options.hashChange !== false;\n        history._wantsPushState = !!history.options.pushState;\n        history._hasPushState = !!(history.options.pushState && history.history && history.history.pushState);\n\n        var fragment = history.getFragment();\n        var docMode = document.documentMode;\n        var oldIE = (isExplorer.exec(navigator.userAgent.toLowerCase()) && (!docMode || docMode <= 7));\n\n        // Normalize root to always include a leading and trailing slash.\n        history.root = ('/' + history.root + '/').replace(rootStripper, '/');\n\n        if (oldIE && history._wantsHashChange) {\n            history.iframe = $('<iframe src=\"javascript:0\" tabindex=\"-1\" />').hide().appendTo('body')[0].contentWindow;\n            history.navigate(fragment, false);\n        }\n\n        // Depending on whether we're using pushState or hashes, and whether\n        // 'onhashchange' is supported, determine how we check the URL state.\n        if (history._hasPushState) {\n            $(window).on('popstate', history.checkUrl);\n        } else if (history._wantsHashChange && ('onhashchange' in window) && !oldIE) {\n            $(window).on('hashchange', history.checkUrl);\n        } else if (history._wantsHashChange) {\n            history._checkUrlInterval = setInterval(history.checkUrl, history.interval);\n        }\n\n        // Determine if we need to change the base url, for a pushState link\n        // opened by a non-pushState browser.\n        history.fragment = fragment;\n        var loc = history.location;\n        var atRoot = loc.pathname.replace(/[^\\/]$/, '$&/') === history.root;\n\n        // Transition from hashChange to pushState or vice versa if both are requested.\n        if (history._wantsHashChange && history._wantsPushState) {\n            // If we've started off with a route from a `pushState`-enabled\n            // browser, but we're currently in a browser that doesn't support it...\n            if (!history._hasPushState && !atRoot) {\n                history.fragment = history.getFragment(null, true);\n                history.location.replace(history.root + history.location.search + '#' + history.fragment);\n                // Return immediately as browser will do redirect to new url\n                return true;\n\n            // Or if we've started out with a hash-based route, but we're currently\n            // in a browser where it could be `pushState`-based instead...\n            } else if (history._hasPushState && atRoot && loc.hash) {\n                this.fragment = history.getHash().replace(routeStripper, '');\n                this.history.replaceState({}, document.title, history.root + history.fragment + loc.search);\n            }\n        }\n\n        if (!history.options.silent) {\n            return history.loadUrl();\n        }\n    };\n\n    /**\n     * Disable history, perhaps temporarily. Not useful in a real app, but possibly useful for unit testing Routers.\n     * @method deactivate\n     */\n    history.deactivate = function() {\n        $(window).off('popstate', history.checkUrl).off('hashchange', history.checkUrl);\n        clearInterval(history._checkUrlInterval);\n        history.active = false;\n    };\n\n    /**\n     * Checks the current URL to see if it has changed, and if it has, calls `loadUrl`, normalizing across the hidden iframe.\n     * @method checkUrl\n     * @return {boolean} Returns true/false from loading the url.\n     */\n    history.checkUrl = function() {\n        var current = history.getFragment();\n        if (current === history.fragment && history.iframe) {\n            current = history.getFragment(history.getHash(history.iframe));\n        }\n\n        if (current === history.fragment) {\n            return false;\n        }\n\n        if (history.iframe) {\n            history.navigate(current, false);\n        }\n        \n        history.loadUrl();\n    };\n    \n    /**\n     * Attempts to load the current URL fragment. A pass-through to options.routeHandler.\n     * @method loadUrl\n     * @return {boolean} Returns true/false from the route handler.\n     */\n    history.loadUrl = function(fragmentOverride) {\n        var fragment = history.fragment = history.getFragment(fragmentOverride);\n\n        return history.options.routeHandler ?\n            history.options.routeHandler(fragment) :\n            false;\n    };\n\n    /**\n     * Save a fragment into the hash history, or replace the URL state if the\n     * 'replace' option is passed. You are responsible for properly URL-encoding\n     * the fragment in advance.\n     * The options object can contain `trigger: false` if you wish to not have the\n     * route callback be fired, or `replace: true`, if\n     * you wish to modify the current URL without adding an entry to the history.\n     * @method navigate\n     * @param {string} fragment The url fragment to navigate to.\n     * @param {object|boolean} options An options object with optional trigger and replace flags. You can also pass a boolean directly to set the trigger option. Trigger is `true` by default.\n     * @return {boolean} Returns true/false from loading the url.\n     */\n    history.navigate = function(fragment, options) {\n        if (!history.active) {\n            return false;\n        }\n\n        if(options === undefined) {\n            options = {\n                trigger: true\n            };\n        }else if(system.isBoolean(options)) {\n            options = {\n                trigger: options\n            };\n        }\n\n        fragment = history.getFragment(fragment || '');\n\n        if (history.fragment === fragment) {\n            return;\n        }\n\n        history.fragment = fragment;\n\n        var url = history.root + fragment;\n\n        // Don't include a trailing slash on the root.\n        if(fragment === '' && url !== '/') {\n            url = url.slice(0, -1);\n        }\n\n        // If pushState is available, we use it to set the fragment as a real URL.\n        if (history._hasPushState) {\n            history.history[options.replace ? 'replaceState' : 'pushState']({}, document.title, url);\n\n            // If hash changes haven't been explicitly disabled, update the hash\n            // fragment to store history.\n        } else if (history._wantsHashChange) {\n            updateHash(history.location, fragment, options.replace);\n            \n            if (history.iframe && (fragment !== history.getFragment(history.getHash(history.iframe)))) {\n                // Opening and closing the iframe tricks IE7 and earlier to push a\n                // history entry on hash-tag change.  When replace is true, we don't\n                // want history.\n                if (!options.replace) {\n                    history.iframe.document.open().close();\n                }\n                \n                updateHash(history.iframe.location, fragment, options.replace);\n            }\n\n            // If you've told us that you explicitly don't want fallback hashchange-\n            // based history, then `navigate` becomes a page refresh.\n        } else {\n            return history.location.assign(url);\n        }\n\n        if (options.trigger) {\n            return history.loadUrl(fragment);\n        }\n    };\n\n    /**\n     * Navigates back in the browser history.\n     * @method navigateBack\n     */\n    history.navigateBack = function() {\n        history.history.back();\n    };\n\n    /**\n     * @class HistoryOptions\n     * @static\n     */\n\n    /**\n     * The function that will be called back when the fragment changes.\n     * @property {function} routeHandler\n     */\n\n    /**\n     * The url root used to extract the fragment when using push state.\n     * @property {string} root\n     */\n\n    /**\n     * Use hash change when present.\n     * @property {boolean} hashChange\n     * @default true\n     */\n\n    /**\n     * Use push state when present.\n     * @property {boolean} pushState\n     * @default false\n     */\n\n    /**\n     * Prevents loading of the current url when activating history.\n     * @property {boolean} silent\n     * @default false\n     */\n\n    return history;\n});\n\n","/**\n * Durandal 2.0.1 Copyright (c) 2012 Blue Spire Consulting, Inc. All Rights Reserved.\n * Available via the MIT license.\n * see: http://durandaljs.com or https://github.com/BlueSpire/Durandal for details.\n */\n/**\n * Connects the history module's url and history tracking support to Durandal's activation and composition engine allowing you to easily build navigation-style applications.\n * @module router\n * @requires system\n * @requires app\n * @requires activator\n * @requires events\n * @requires composition\n * @requires history\n * @requires knockout\n * @requires jquery\n */\ndefine('plugins/router',['durandal/system', 'durandal/app', 'durandal/activator', 'durandal/events', 'durandal/composition', 'plugins/history', 'knockout', 'jquery'], function(system, app, activator, events, composition, history, ko, $) {\n    var optionalParam = /\\((.*?)\\)/g;\n    var namedParam = /(\\(\\?)?:\\w+/g;\n    var splatParam = /\\*\\w+/g;\n    var escapeRegExp = /[\\-{}\\[\\]+?.,\\\\\\^$|#\\s]/g;\n    var startDeferred, rootRouter;\n    var trailingSlash = /\\/$/;\n\n    function routeStringToRegExp(routeString) {\n        routeString = routeString.replace(escapeRegExp, '\\\\$&')\n            .replace(optionalParam, '(?:$1)?')\n            .replace(namedParam, function(match, optional) {\n                return optional ? match : '([^\\/]+)';\n            })\n            .replace(splatParam, '(.*?)');\n\n        return new RegExp('^' + routeString + '$');\n    }\n\n    function stripParametersFromRoute(route) {\n        var colonIndex = route.indexOf(':');\n        var length = colonIndex > 0 ? colonIndex - 1 : route.length;\n        return route.substring(0, length);\n    }\n\n    function endsWith(str, suffix) {\n        return str.indexOf(suffix, str.length - suffix.length) !== -1;\n    }\n\n    function compareArrays(first, second) {\n        if (!first || !second){\n            return false;\n        }\n\n        if (first.length != second.length) {\n            return false;\n        }\n\n        for (var i = 0, len = first.length; i < len; i++) {\n            if (first[i] != second[i]) {\n                return false;\n            }\n        }\n\n        return true;\n    }\n\n    /**\n     * @class Router\n     * @uses Events\n     */\n\n    /**\n     * Triggered when the navigation logic has completed.\n     * @event router:navigation:complete\n     * @param {object} instance The activated instance.\n     * @param {object} instruction The routing instruction.\n     * @param {Router} router The router.\n     */\n\n    /**\n     * Triggered when the navigation has been cancelled.\n     * @event router:navigation:cancelled\n     * @param {object} instance The activated instance.\n     * @param {object} instruction The routing instruction.\n     * @param {Router} router The router.\n     */\n\n    /**\n     * Triggered right before a route is activated.\n     * @event router:route:activating\n     * @param {object} instance The activated instance.\n     * @param {object} instruction The routing instruction.\n     * @param {Router} router The router.\n     */\n\n    /**\n     * Triggered right before a route is configured.\n     * @event router:route:before-config\n     * @param {object} config The route config.\n     * @param {Router} router The router.\n     */\n\n    /**\n     * Triggered just after a route is configured.\n     * @event router:route:after-config\n     * @param {object} config The route config.\n     * @param {Router} router The router.\n     */\n\n    /**\n     * Triggered when the view for the activated instance is attached.\n     * @event router:navigation:attached\n     * @param {object} instance The activated instance.\n     * @param {object} instruction The routing instruction.\n     * @param {Router} router The router.\n     */\n\n    /**\n     * Triggered when the composition that the activated instance participates in is complete.\n     * @event router:navigation:composition-complete\n     * @param {object} instance The activated instance.\n     * @param {object} instruction The routing instruction.\n     * @param {Router} router The router.\n     */\n\n    /**\n     * Triggered when the router does not find a matching route.\n     * @event router:route:not-found\n     * @param {string} fragment The url fragment.\n     * @param {Router} router The router.\n     */\n\n    var createRouter = function() {\n        var queue = [],\n            isProcessing = ko.observable(false),\n            currentActivation,\n            currentInstruction,\n            activeItem = activator.create();\n\n        var router = {\n            /**\n             * The route handlers that are registered. Each handler consists of a `routePattern` and a `callback`.\n             * @property {object[]} handlers\n             */\n            handlers: [],\n            /**\n             * The route configs that are registered.\n             * @property {object[]} routes\n             */\n            routes: [],\n            /**\n             * The route configurations that have been designated as displayable in a nav ui (nav:true).\n             * @property {KnockoutObservableArray} navigationModel\n             */\n            navigationModel: ko.observableArray([]),\n            /**\n             * The active item/screen based on the current navigation state.\n             * @property {Activator} activeItem\n             */\n            activeItem: activeItem,\n            /**\n             * Indicates that the router (or a child router) is currently in the process of navigating.\n             * @property {KnockoutComputed} isNavigating\n             */\n            isNavigating: ko.computed(function() {\n                var current = activeItem();\n                var processing = isProcessing();\n                var currentRouterIsProcesing = current\n                    && current.router\n                    && current.router != router\n                    && current.router.isNavigating() ? true : false;\n                return  processing || currentRouterIsProcesing;\n            }),\n            /**\n             * An observable surfacing the active routing instruction that is currently being processed or has recently finished processing.\n             * The instruction object has `config`, `fragment`, `queryString`, `params` and `queryParams` properties.\n             * @property {KnockoutObservable} activeInstruction\n             */\n            activeInstruction:ko.observable(null),\n            __router__:true\n        };\n\n        events.includeIn(router);\n\n        activeItem.settings.areSameItem = function (currentItem, newItem, currentActivationData, newActivationData) {\n            if (currentItem == newItem) {\n                return compareArrays(currentActivationData, newActivationData);\n            }\n\n            return false;\n        };\n\n        function hasChildRouter(instance) {\n            return instance.router && instance.router.parent == router;\n        }\n\n        function setCurrentInstructionRouteIsActive(flag) {\n            if (currentInstruction && currentInstruction.config.isActive) {\n                currentInstruction.config.isActive(flag)\n            }\n        }\n\n        function completeNavigation(instance, instruction) {\n            system.log('Navigation Complete', instance, instruction);\n\n            var fromModuleId = system.getModuleId(currentActivation);\n            if (fromModuleId) {\n                router.trigger('router:navigation:from:' + fromModuleId);\n            }\n\n            currentActivation = instance;\n\n            setCurrentInstructionRouteIsActive(false);\n            currentInstruction = instruction;\n            setCurrentInstructionRouteIsActive(true);\n\n            var toModuleId = system.getModuleId(currentActivation);\n            if (toModuleId) {\n                router.trigger('router:navigation:to:' + toModuleId);\n            }\n\n            if (!hasChildRouter(instance)) {\n                router.updateDocumentTitle(instance, instruction);\n            }\n\n            rootRouter.explicitNavigation = false;\n            rootRouter.navigatingBack = false;\n            router.trigger('router:navigation:complete', instance, instruction, router);\n        }\n\n        function cancelNavigation(instance, instruction) {\n            system.log('Navigation Cancelled');\n\n            router.activeInstruction(currentInstruction);\n\n            if (currentInstruction) {\n                router.navigate(currentInstruction.fragment, false);\n            }\n\n            isProcessing(false);\n            rootRouter.explicitNavigation = false;\n            rootRouter.navigatingBack = false;\n            router.trigger('router:navigation:cancelled', instance, instruction, router);\n        }\n\n        function redirect(url) {\n            system.log('Navigation Redirecting');\n\n            isProcessing(false);\n            rootRouter.explicitNavigation = false;\n            rootRouter.navigatingBack = false;\n            router.navigate(url, { trigger: true, replace: true });\n        }\n\n        function activateRoute(activator, instance, instruction) {\n            rootRouter.navigatingBack = !rootRouter.explicitNavigation && currentActivation != instruction.fragment;\n            router.trigger('router:route:activating', instance, instruction, router);\n\n            activator.activateItem(instance, instruction.params).then(function(succeeded) {\n                if (succeeded) {\n                    var previousActivation = currentActivation;\n                    completeNavigation(instance, instruction);\n\n                    if (hasChildRouter(instance)) {\n                        var fullFragment = instruction.fragment;\n                        if (instruction.queryString) {\n                            fullFragment += \"?\" + instruction.queryString;\n                        }\n\n                        instance.router.loadUrl(fullFragment);\n                    }\n\n                    if (previousActivation == instance) {\n                        router.attached();\n                        router.compositionComplete();\n                    }\n                } else if(activator.settings.lifecycleData && activator.settings.lifecycleData.redirect){\n                    redirect(activator.settings.lifecycleData.redirect);\n                }else{\n                    cancelNavigation(instance, instruction);\n                }\n\n                if (startDeferred) {\n                    startDeferred.resolve();\n                    startDeferred = null;\n                }\n            }).fail(function(err){\n                system.error(err);\n            });;\n        }\n\n        /**\n         * Inspects routes and modules before activation. Can be used to protect access by cancelling navigation or redirecting.\n         * @method guardRoute\n         * @param {object} instance The module instance that is about to be activated by the router.\n         * @param {object} instruction The route instruction. The instruction object has config, fragment, queryString, params and queryParams properties.\n         * @return {Promise|Boolean|String} If a boolean, determines whether or not the route should activate or be cancelled. If a string, causes a redirect to the specified route. Can also be a promise for either of these value types.\n         */\n        function handleGuardedRoute(activator, instance, instruction) {\n            var resultOrPromise = router.guardRoute(instance, instruction);\n            if (resultOrPromise) {\n                if (resultOrPromise.then) {\n                    resultOrPromise.then(function(result) {\n                        if (result) {\n                            if (system.isString(result)) {\n                                redirect(result);\n                            } else {\n                                activateRoute(activator, instance, instruction);\n                            }\n                        } else {\n                            cancelNavigation(instance, instruction);\n                        }\n                    });\n                } else {\n                    if (system.isString(resultOrPromise)) {\n                        redirect(resultOrPromise);\n                    } else {\n                        activateRoute(activator, instance, instruction);\n                    }\n                }\n            } else {\n                cancelNavigation(instance, instruction);\n            }\n        }\n\n        function ensureActivation(activator, instance, instruction) {\n            if (router.guardRoute) {\n                handleGuardedRoute(activator, instance, instruction);\n            } else {\n                activateRoute(activator, instance, instruction);\n            }\n        }\n\n        function canReuseCurrentActivation(instruction) {\n            return currentInstruction\n                && currentInstruction.config.moduleId == instruction.config.moduleId\n                && currentActivation\n                && ((currentActivation.canReuseForRoute && currentActivation.canReuseForRoute.apply(currentActivation, instruction.params))\n                || (!currentActivation.canReuseForRoute && currentActivation.router && currentActivation.router.loadUrl));\n        }\n\n        function dequeueInstruction() {\n            if (isProcessing()) {\n                return;\n            }\n\n            var instruction = queue.shift();\n            queue = [];\n\n            if (!instruction) {\n                return;\n            }\n\n            isProcessing(true);\n            router.activeInstruction(instruction);\n\n            if (canReuseCurrentActivation(instruction)) {\n                ensureActivation(activator.create(), currentActivation, instruction);\n            } else {\n                system.acquire(instruction.config.moduleId).then(function(module) {\n                    var instance = system.resolveObject(module);\n                    ensureActivation(activeItem, instance, instruction);\n                }).fail(function(err){\n                        system.error('Failed to load routed module (' + instruction.config.moduleId + '). Details: ' + err.message);\n                    });\n            }\n        }\n\n        function queueInstruction(instruction) {\n            queue.unshift(instruction);\n            dequeueInstruction();\n        }\n\n        // Given a route, and a URL fragment that it matches, return the array of\n        // extracted decoded parameters. Empty or unmatched parameters will be\n        // treated as `null` to normalize cross-browser behavior.\n        function createParams(routePattern, fragment, queryString) {\n            var params = routePattern.exec(fragment).slice(1);\n\n            for (var i = 0; i < params.length; i++) {\n                var current = params[i];\n                params[i] = current ? decodeURIComponent(current) : null;\n            }\n\n            var queryParams = router.parseQueryString(queryString);\n            if (queryParams) {\n                params.push(queryParams);\n            }\n\n            return {\n                params:params,\n                queryParams:queryParams\n            };\n        }\n\n        function configureRoute(config){\n            router.trigger('router:route:before-config', config, router);\n\n            if (!system.isRegExp(config)) {\n                config.title = config.title || router.convertRouteToTitle(config.route);\n                config.moduleId = config.moduleId || router.convertRouteToModuleId(config.route);\n                config.hash = config.hash || router.convertRouteToHash(config.route);\n                config.routePattern = routeStringToRegExp(config.route);\n            }else{\n                config.routePattern = config.route;\n            }\n\n            config.isActive = config.isActive || ko.observable(false);\n            router.trigger('router:route:after-config', config, router);\n            router.routes.push(config);\n\n            router.route(config.routePattern, function(fragment, queryString) {\n                var paramInfo = createParams(config.routePattern, fragment, queryString);\n                queueInstruction({\n                    fragment: fragment,\n                    queryString:queryString,\n                    config: config,\n                    params: paramInfo.params,\n                    queryParams:paramInfo.queryParams\n                });\n            });\n        };\n\n        function mapRoute(config) {\n            if(system.isArray(config.route)){\n                var isActive = config.isActive || ko.observable(false);\n\n                for(var i = 0, length = config.route.length; i < length; i++){\n                    var current = system.extend({}, config);\n\n                    current.route = config.route[i];\n                    current.isActive = isActive;\n\n                    if(i > 0){\n                        delete current.nav;\n                    }\n\n                    configureRoute(current);\n                }\n            }else{\n                configureRoute(config);\n            }\n\n            return router;\n        }\n\n        /**\n         * Parses a query string into an object.\n         * @method parseQueryString\n         * @param {string} queryString The query string to parse.\n         * @return {object} An object keyed according to the query string parameters.\n         */\n        router.parseQueryString = function (queryString) {\n            var queryObject, pairs;\n\n            if (!queryString) {\n                return null;\n            }\n\n            pairs = queryString.split('&');\n\n            if (pairs.length == 0) {\n                return null;\n            }\n\n            queryObject = {};\n\n            for (var i = 0; i < pairs.length; i++) {\n                var pair = pairs[i];\n                if (pair === '') {\n                    continue;\n                }\n\n                var parts = pair.split('=');\n                queryObject[parts[0]] = parts[1] && decodeURIComponent(parts[1].replace(/\\+/g, ' '));\n            }\n\n            return queryObject;\n        };\n\n        /**\n         * Add a route to be tested when the url fragment changes.\n         * @method route\n         * @param {RegEx} routePattern The route pattern to test against.\n         * @param {function} callback The callback to execute when the route pattern is matched.\n         */\n        router.route = function(routePattern, callback) {\n            router.handlers.push({ routePattern: routePattern, callback: callback });\n        };\n\n        /**\n         * Attempt to load the specified URL fragment. If a route succeeds with a match, returns `true`. If no defined routes matches the fragment, returns `false`.\n         * @method loadUrl\n         * @param {string} fragment The URL fragment to find a match for.\n         * @return {boolean} True if a match was found, false otherwise.\n         */\n        router.loadUrl = function(fragment) {\n            var handlers = router.handlers,\n                queryString = null,\n                coreFragment = fragment,\n                queryIndex = fragment.indexOf('?');\n\n            if (queryIndex != -1) {\n                coreFragment = fragment.substring(0, queryIndex);\n                queryString = fragment.substr(queryIndex + 1);\n            }\n\n            if(router.relativeToParentRouter){\n                var instruction = this.parent.activeInstruction();\n                coreFragment = instruction.params.join('/');\n\n                if(coreFragment && coreFragment.charAt(0) == '/'){\n                    coreFragment = coreFragment.substr(1);\n                }\n\n                if(!coreFragment){\n                    coreFragment = '';\n                }\n\n                coreFragment = coreFragment.replace('//', '/').replace('//', '/');\n            }\n\n            coreFragment = coreFragment.replace(trailingSlash, '');\n\n            for (var i = 0; i < handlers.length; i++) {\n                var current = handlers[i];\n                if (current.routePattern.test(coreFragment)) {\n                    current.callback(coreFragment, queryString);\n                    return true;\n                }\n            }\n\n            system.log('Route Not Found');\n            router.trigger('router:route:not-found', fragment, router);\n\n            if (currentInstruction) {\n                history.navigate(currentInstruction.fragment, { trigger:false, replace:true });\n            }\n\n            rootRouter.explicitNavigation = false;\n            rootRouter.navigatingBack = false;\n\n            return false;\n        };\n\n        /**\n         * Updates the document title based on the activated module instance, the routing instruction and the app.title.\n         * @method updateDocumentTitle\n         * @param {object} instance The activated module.\n         * @param {object} instruction The routing instruction associated with the action. It has a `config` property that references the original route mapping config.\n         */\n        router.updateDocumentTitle = function(instance, instruction) {\n            if (instruction.config.title) {\n                if (app.title) {\n                    document.title = instruction.config.title + \" | \" + app.title;\n                } else {\n                    document.title = instruction.config.title;\n                }\n            } else if (app.title) {\n                document.title = app.title;\n            }\n        };\n\n        /**\n         * Save a fragment into the hash history, or replace the URL state if the\n         * 'replace' option is passed. You are responsible for properly URL-encoding\n         * the fragment in advance.\n         * The options object can contain `trigger: false` if you wish to not have the\n         * route callback be fired, or `replace: true`, if\n         * you wish to modify the current URL without adding an entry to the history.\n         * @method navigate\n         * @param {string} fragment The url fragment to navigate to.\n         * @param {object|boolean} options An options object with optional trigger and replace flags. You can also pass a boolean directly to set the trigger option. Trigger is `true` by default.\n         * @return {boolean} Returns true/false from loading the url.\n         */\n        router.navigate = function(fragment, options) {\n            if(fragment && fragment.indexOf('://') != -1){\n                window.location.href = fragment;\n                return true;\n            }\n\n            rootRouter.explicitNavigation = true;\n            return history.navigate(fragment, options);\n        };\n\n        /**\n         * Navigates back in the browser history.\n         * @method navigateBack\n         */\n        router.navigateBack = function() {\n            history.navigateBack();\n        };\n\n        router.attached = function() {\n            router.trigger('router:navigation:attached', currentActivation, currentInstruction, router);\n        };\n\n        router.compositionComplete = function(){\n            isProcessing(false);\n            router.trigger('router:navigation:composition-complete', currentActivation, currentInstruction, router);\n            dequeueInstruction();\n        };\n\n        /**\n         * Converts a route to a hash suitable for binding to a link's href.\n         * @method convertRouteToHash\n         * @param {string} route\n         * @return {string} The hash.\n         */\n        router.convertRouteToHash = function(route) {\n            if(router.relativeToParentRouter){\n                var instruction = router.parent.activeInstruction(),\n                    hash = instruction.config.hash + '/' + route;\n\n                if(history._hasPushState){\n                    hash = '/' + hash;\n                }\n\n                hash = hash.replace('//', '/').replace('//', '/');\n                return hash;\n            }\n\n            if(history._hasPushState){\n                return route;\n            }\n\n            return \"#\" + route;\n        };\n\n        /**\n         * Converts a route to a module id. This is only called if no module id is supplied as part of the route mapping.\n         * @method convertRouteToModuleId\n         * @param {string} route\n         * @return {string} The module id.\n         */\n        router.convertRouteToModuleId = function(route) {\n            return stripParametersFromRoute(route);\n        };\n\n        /**\n         * Converts a route to a displayable title. This is only called if no title is specified as part of the route mapping.\n         * @method convertRouteToTitle\n         * @param {string} route\n         * @return {string} The title.\n         */\n        router.convertRouteToTitle = function(route) {\n            var value = stripParametersFromRoute(route);\n            return value.substring(0, 1).toUpperCase() + value.substring(1);\n        };\n\n        /**\n         * Maps route patterns to modules.\n         * @method map\n         * @param {string|object|object[]} route A route, config or array of configs.\n         * @param {object} [config] The config for the specified route.\n         * @chainable\n         * @example\n router.map([\n    { route: '', title:'Home', moduleId: 'homeScreen', nav: true },\n    { route: 'customer/:id', moduleId: 'customerDetails'}\n ]);\n         */\n        router.map = function(route, config) {\n            if (system.isArray(route)) {\n                for (var i = 0; i < route.length; i++) {\n                    router.map(route[i]);\n                }\n\n                return router;\n            }\n\n            if (system.isString(route) || system.isRegExp(route)) {\n                if (!config) {\n                    config = {};\n                } else if (system.isString(config)) {\n                    config = { moduleId: config };\n                }\n\n                config.route = route;\n            } else {\n                config = route;\n            }\n\n            return mapRoute(config);\n        };\n\n        /**\n         * Builds an observable array designed to bind a navigation UI to. The model will exist in the `navigationModel` property.\n         * @method buildNavigationModel\n         * @param {number} defaultOrder The default order to use for navigation visible routes that don't specify an order. The default is 100 and each successive route will be one more than that.\n         * @chainable\n         */\n        router.buildNavigationModel = function(defaultOrder) {\n            var nav = [], routes = router.routes;\n            var fallbackOrder = defaultOrder || 100;\n\n            for (var i = 0; i < routes.length; i++) {\n                var current = routes[i];\n\n                if (current.nav) {\n                    if (!system.isNumber(current.nav)) {\n                        current.nav = ++fallbackOrder;\n                    }\n\n                    nav.push(current);\n                }\n            }\n\n            nav.sort(function(a, b) { return a.nav - b.nav; });\n            router.navigationModel(nav);\n\n            return router;\n        };\n\n        /**\n         * Configures how the router will handle unknown routes.\n         * @method mapUnknownRoutes\n         * @param {string|function} [config] If not supplied, then the router will map routes to modules with the same name.\n         * If a string is supplied, it represents the module id to route all unknown routes to.\n         * Finally, if config is a function, it will be called back with the route instruction containing the route info. The function can then modify the instruction by adding a moduleId and the router will take over from there.\n         * @param {string} [replaceRoute] If config is a module id, then you can optionally provide a route to replace the url with.\n         * @chainable\n         */\n        router.mapUnknownRoutes = function(config, replaceRoute) {\n            var catchAllRoute = \"*catchall\";\n            var catchAllPattern = routeStringToRegExp(catchAllRoute);\n\n            router.route(catchAllPattern, function (fragment, queryString) {\n                var paramInfo = createParams(catchAllPattern, fragment, queryString);\n                var instruction = {\n                    fragment: fragment,\n                    queryString: queryString,\n                    config: {\n                        route: catchAllRoute,\n                        routePattern: catchAllPattern\n                    },\n                    params: paramInfo.params,\n                    queryParams: paramInfo.queryParams\n                };\n\n                if (!config) {\n                    instruction.config.moduleId = fragment;\n                } else if (system.isString(config)) {\n                    instruction.config.moduleId = config;\n                    if(replaceRoute){\n                        history.navigate(replaceRoute, { trigger:false, replace:true });\n                    }\n                } else if (system.isFunction(config)) {\n                    var result = config(instruction);\n                    if (result && result.then) {\n                        result.then(function() {\n                            router.trigger('router:route:before-config', instruction.config, router);\n                            router.trigger('router:route:after-config', instruction.config, router);\n                            queueInstruction(instruction);\n                        });\n                        return;\n                    }\n                } else {\n                    instruction.config = config;\n                    instruction.config.route = catchAllRoute;\n                    instruction.config.routePattern = catchAllPattern;\n                }\n\n                router.trigger('router:route:before-config', instruction.config, router);\n                router.trigger('router:route:after-config', instruction.config, router);\n                queueInstruction(instruction);\n            });\n\n            return router;\n        };\n\n        /**\n         * Resets the router by removing handlers, routes, event handlers and previously configured options.\n         * @method reset\n         * @chainable\n         */\n        router.reset = function() {\n            currentInstruction = currentActivation = undefined;\n            router.handlers = [];\n            router.routes = [];\n            router.off();\n            delete router.options;\n            return router;\n        };\n\n        /**\n         * Makes all configured routes and/or module ids relative to a certain base url.\n         * @method makeRelative\n         * @param {string|object} settings If string, the value is used as the base for routes and module ids. If an object, you can specify `route` and `moduleId` separately. In place of specifying route, you can set `fromParent:true` to make routes automatically relative to the parent router's active route.\n         * @chainable\n         */\n        router.makeRelative = function(settings){\n            if(system.isString(settings)){\n                settings = {\n                    moduleId:settings,\n                    route:settings\n                };\n            }\n\n            if(settings.moduleId && !endsWith(settings.moduleId, '/')){\n                settings.moduleId += '/';\n            }\n\n            if(settings.route && !endsWith(settings.route, '/')){\n                settings.route += '/';\n            }\n\n            if(settings.fromParent){\n                router.relativeToParentRouter = true;\n            }\n\n            router.on('router:route:before-config').then(function(config){\n                if(settings.moduleId){\n                    config.moduleId = settings.moduleId + config.moduleId;\n                }\n\n                if(settings.route){\n                    if(config.route === ''){\n                        config.route = settings.route.substring(0, settings.route.length - 1);\n                    }else{\n                        config.route = settings.route + config.route;\n                    }\n                }\n            });\n\n            return router;\n        };\n\n        /**\n         * Creates a child router.\n         * @method createChildRouter\n         * @return {Router} The child router.\n         */\n        router.createChildRouter = function() {\n            var childRouter = createRouter();\n            childRouter.parent = router;\n            return childRouter;\n        };\n\n        return router;\n    };\n\n    /**\n     * @class RouterModule\n     * @extends Router\n     * @static\n     */\n    rootRouter = createRouter();\n    rootRouter.explicitNavigation = false;\n    rootRouter.navigatingBack = false;\n\n    /**\n     * Verify that the target is the current window\n     * @method targetIsThisWindow\n     * @return {boolean} True if the event's target is the current window, false otherwise.\n     */\n    rootRouter.targetIsThisWindow = function(event) {\n        var targetWindow = $(event.target).attr('target');\n        \n        if (!targetWindow ||\n            targetWindow === window.name ||\n            targetWindow === '_self' ||\n            (targetWindow === 'top' && window === window.top)) { return true; }\n        \n        return false;\n    };\n\n    /**\n     * Activates the router and the underlying history tracking mechanism.\n     * @method activate\n     * @return {Promise} A promise that resolves when the router is ready.\n     */\n    rootRouter.activate = function(options) {\n        return system.defer(function(dfd) {\n            startDeferred = dfd;\n            rootRouter.options = system.extend({ routeHandler: rootRouter.loadUrl }, rootRouter.options, options);\n\n            history.activate(rootRouter.options);\n\n            if(history._hasPushState){\n                var routes = rootRouter.routes,\n                    i = routes.length;\n\n                while(i--){\n                    var current = routes[i];\n                    current.hash = current.hash.replace('#', '');\n                }\n            }\n\n            $(document).delegate(\"a\", 'click', function(evt){\n                if(history._hasPushState){\n                    if(!evt.altKey && !evt.ctrlKey && !evt.metaKey && !evt.shiftKey && rootRouter.targetIsThisWindow(evt)){\n                        var href = $(this).attr(\"href\");\n\n                        // Ensure the protocol is not part of URL, meaning its relative.\n                        // Stop the event bubbling to ensure the link will not cause a page refresh.\n                        if (href != null && !(href.charAt(0) === \"#\" || /^[a-z]+:/i.test(href))) {\n                            rootRouter.explicitNavigation = true;\n                            evt.preventDefault();\n                            history.navigate(href);\n                        }\n                    }\n                }else{\n                    rootRouter.explicitNavigation = true;\n                }\n            });\n\n            if(history.options.silent && startDeferred){\n                startDeferred.resolve();\n                startDeferred = null;\n            }\n        }).promise();\n    };\n\n    /**\n     * Disable history, perhaps temporarily. Not useful in a real app, but possibly useful for unit testing Routers.\n     * @method deactivate\n     */\n    rootRouter.deactivate = function() {\n        history.deactivate();\n    };\n\n    /**\n     * Installs the router's custom ko binding handler.\n     * @method install\n     */\n    rootRouter.install = function(){\n        ko.bindingHandlers.router = {\n            init: function() {\n                return { controlsDescendantBindings: true };\n            },\n            update: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {\n                var settings = ko.utils.unwrapObservable(valueAccessor()) || {};\n\n                if (settings.__router__) {\n                    settings = {\n                        model:settings.activeItem(),\n                        attached:settings.attached,\n                        compositionComplete:settings.compositionComplete,\n                        activate: false\n                    };\n                } else {\n                    var theRouter = ko.utils.unwrapObservable(settings.router || viewModel.router) || rootRouter;\n                    settings.model = theRouter.activeItem();\n                    settings.attached = theRouter.attached;\n                    settings.compositionComplete = theRouter.compositionComplete;\n                    settings.activate = false;\n                }\n\n                composition.compose(element, settings, bindingContext);\n            }\n        };\n\n        ko.virtualElements.allowedBindings.router = true;\n    };\n\n    return rootRouter;\n});\n\n","define('bootstrapping/knockoutBindings/reviewableBinding',['durandal/composition', 'plugins/router'], function (composition, router) {\n\n    ko.bindingHandlers.reviewable = {\n        init: function (element, valueAccessor) {\n            if (!router.getQueryStringValue('reviewApiUrl'))\n                return;\n\n            var $element = $(element),\n                context = valueAccessor();\n\n            $element.addClass('reviewable');\n            $element.data('review-context', context);\n        }\n    };\n\n    composition.addBindingHandler('reviewable');\n\n});\n","ko.bindingHandlers.limitedLengthText = {\n    init: function () {\n    },\n    update: function (element, valueAccessor) {\n        var text = ko.unwrap(valueAccessor().text),\n            maxLength = ko.unwrap(valueAccessor().maxLength),\n            $element = $(element);\n\n        if (text.length > maxLength) {\n            text = text.substr(0, maxLength - 3) + \"...\";\n        }\n\n        if (text !== $element.text()) {\n            $element.text(text);\n        }\n    }\n};\ndefine(\"bootstrapping/knockoutBindings/limitedLengthTextBinding\", function(){});\n\n","define('bootstrapping/knockoutBindings/scrollbarBinding',['durandal/composition', 'perfectScrollbar', 'browserSupport'], function (composition, perfectScrollbar, browserSupport) {\n\n    ko.bindingHandlers.scrollbar = {\n        init: function (element, valueAccessors) {\n            if (browserSupport.isMobileDevice) {\n                $(element).css({\n                    'overflow-y': 'auto'\n                });\n                return;\n            }\n\n            var byClass = valueAccessors().byClass;\n            var checkDOMChanges = valueAccessors().checkDOMChanges;\n            var scrollToEndAfterDOMChanged = valueAccessors().scrollToEndAfterDOMChanged;\n            var cssClasses = {\n                scrollStarted: 'cs-scroll-started',\n                scrollFinished: 'cs-scroll-finished',\n                scrollEnabled: 'cs-scroll-enabled'\n            };\n\n            var customScrollbarContainer = byClass ? element.getElementsByClassName(byClass)[0] : element;\n\n            perfectScrollbar.initialize(customScrollbarContainer, {\n                suppressScrollX: true\n            });\n\n            if (checkDOMChanges) {\n                refreshScrollAfterDomChanged();\n            }\n\n            document.addEventListener('ps-y-reach-start', function () {\n                customScrollbarContainer.classList.remove(cssClasses.scrollStarted);\n            });\n\n            document.addEventListener('ps-y-reach-end', function () {\n                customScrollbarContainer.classList.add(cssClasses.scrollFinished);\n            });\n\n            document.addEventListener('ps-scroll-up', function () {\n                customScrollbarContainer.classList.remove(cssClasses.scrollFinished);\n            });\n\n            document.addEventListener('ps-scroll-down', function () {\n                customScrollbarContainer.classList.add(cssClasses.scrollStarted);\n            });\n\n            scrollEnabled();\n\n            ko.utils.domNodeDisposal.addDisposeCallback(element, function () {\n                perfectScrollbar.destroy(customScrollbarContainer);\n            });\n\n            function refreshScrollAfterDomChanged() {\n                var scrollHeight = customScrollbarContainer.clientHeight;\n                var timeout = setTimeout(function () {\n                    perfectScrollbar.update(customScrollbarContainer);\n                    if (scrollToEndAfterDOMChanged && scrollHeight !== customScrollbarContainer.clientHeight) {\n                        scrollHeight = customScrollbarContainer.clientHeight;\n                        customScrollbarContainer.scrollTop = customScrollbarContainer.scrollHeight;\n                    }\n                    scrollEnabled();\n\n                    refreshScrollAfterDomChanged();\n                }, 500);\n\n                ko.utils.domNodeDisposal.addDisposeCallback(element, function () { clearTimeout(timeout); });\n            }\n\n            function scrollEnabled() {\n                customScrollbarContainer.classList.toggle(cssClasses.scrollEnabled, customScrollbarContainer.scrollHeight > customScrollbarContainer.clientHeight);\n            }\n        }\n    };\n\n    composition.addBindingHandler('scrollbar');\n\n});\n","define('bootstrapping/knockoutBindings/localizeBinding',['knockout', 'localizationManager'], function (ko, localizationManager) {\n    ko.bindingHandlers.localize = {\n        update: function (element, valueAccessor) {\n            localizeValue(element, valueAccessor);\n        }\n    };\n\n    function localizeValue(element, valueAccessor) {\n        var value = valueAccessor();\n\n        if (_.isEmpty(value)) {\n            return;\n        }\n\n        if (!_.isUndefined(value['text'])) {\n            $(element).text(localizationManager.getLocalizedText(value['text']));\n        }\n        if (!_.isUndefined(value['placeholder'])) {\n            $(element).attr('placeholder', localizationManager.getLocalizedText(value['placeholder']));\n        }\n        if (!_.isUndefined(value['value'])) {\n            $(element).prop('value', localizationManager.getLocalizedText(value['value']));\n        }\n        if (!_.isUndefined(value['title'])) {\n            $(element).prop('title', localizationManager.getLocalizedText(value['title']));\n        }\n        if (!_.isUndefined(value['html'])) {\n            $(element).html(localizationManager.getLocalizedText(value['html']));\n        }\n        if (!_.isUndefined(value['data-text'])) {\n            $(element).attr('data-text', localizationManager.getLocalizedText(value['data-text']));\n        }\n    }\n});\n","define('bootstrapping/knockoutBindings/fontScaleBinding',[],function () {\n\n    ko.bindingHandlers.fontScale = {\n        init: function (element, valueAccessor) {\n            var $element = $(element);\n            var text = ko.unwrap(valueAccessor());\n\n            $element.text(text);\n\n            if(text.length > 100) {\n                /*\n                    Formula description:\n\n                    Max text length = 255 symbols;\n                    Min text length = 100 symbols;\n                    maxLen - minLen = 155; \n\n                    coeficient = 1 - (length - minLen) / 155;\n\n                    Max font size = 1.385;\n                    Min font size = 0.65;\n                    maxFont - minFont = 0.825;\n\n                    Max line height = 38;\n                    Min line height = 25;\n                    maxLHeight - minLHeight = 13;\n\n                    Result font size = coeficient * 0.825 + minFont;\n                    Result line height = coeficient * 13 + minLHeight;\n                */\n\n                var coef = 1 - (text.length - 100) / 155;\n\n                var fSize = coef * 0.825 + 0.8;\n                var lHeight = coef * 13 + 25;\n\n                $element.css('fontSize', fSize + 'em');\n                $element.css('lineHeight', lHeight + 'px');\n            } else {\n                $element.css('fontSize', '1.385em');\n                $element.css('lineHeight', '38px');\n            }\n        }\n    };\n});\n","define('treeOfContent/utils/screenResolutionChecker',[], function () {\n\n    var checker = {\n        isLowResolution: ko.observable()\n    };\n\n    checkResolution();\n\n    var lazyWindowResizeHandler = _.debounce(checkResolution, 300);\n    $(window).on('resize', lazyWindowResizeHandler);\n\n    function checkResolution() {\n        checker.isLowResolution($(window).width() < 820);\n    }\n\n    return checker;\n});\n","define('treeOfContent/bindingHandlers/treeOfContentAnimationsBinding',['treeOfContent/utils/screenResolutionChecker', 'browserSupport'], function (screenResolutionChecker, browserSupport) {\n\n    ko.bindingHandlers.treeOfContentAnimations = {\n        init: function (element, valueAccessor) {\n            var $html = $('html'),\n                $body = $('body'),\n                $element = $(element),\n                resolutionChangeSubscription = screenResolutionChecker.isLowResolution.subscribe(onResolutionChanged),\n                expandedChangeSubscription = valueAccessor().expanded.subscribe(onIsExpandedChanged);\n\n            ko.utils.domNodeDisposal.addDisposeCallback(element, function () {\n                resolutionChangeSubscription.dispose();\n                expandedChangeSubscription.dispose();\n            });\n\n            onResolutionChanged(screenResolutionChecker.isLowResolution());\n            onIsExpandedChanged(ko.utils.unwrapObservable(valueAccessor().expanded));\n\n            function onResolutionChanged(isLowResolution) {\n                var isExpanded = ko.utils.unwrapObservable(valueAccessor().expanded);\n                if (isLowResolution) {\n                    setVisibilityWithoutAnimations(isExpanded ? 'visible' : 'hidden');\n                } else {\n                    $element.css({\n                        visibility: 'visible',\n                        webkitTtransition: 'left 0.2s ease-out',\n                        transition: 'left 0.2s ease-out'\n                    });\n                }\n\n                $body.css({\n                    'max-height': isExpanded && isLowResolution ? '100vh' : 'none',\n                    'overflow': isExpanded && isLowResolution ? 'hidden' : 'visible'\n                });\n\n                $html.css('overflow-y', isExpanded && isLowResolution ? 'hidden' : 'scroll');\n\n                function setVisibilityWithoutAnimations(visibility) {\n                    $element.css({\n                        transition: 'transform 0s, opacity 0s, visibility 0s',\n                        webkitTtransition: 'transform 0s, opacity 0s, visibility 0s'\n                    });\n\n                    $element.css({\n                        visibility: visibility\n                    });\n\n                    $element.css({\n                        webkitTtransition: 'transform 0.2s, opacity 0.2s, visibility 0.2s',\n                        transition: 'transform 0.2s, opacity 0.2s, visibility 0.2s'\n                    });\n                }\n            }\n\n            function onIsExpandedChanged(isExpanded) {\n                if (screenResolutionChecker.isLowResolution()) {\n                    $html.css('overflow-y', isExpanded ? 'hidden' : 'scroll');\n\n                    $body.css({\n                        'max-height': isExpanded ? '100vh' : 'none',\n                        'overflow': isExpanded ? 'hidden' : 'visible'\n                    });\n\n                    $element.css({\n                        visibility: isExpanded ? 'visible' : 'hidden'\n                    });\n                }\n            }\n        }\n    };\n});\n","define('bootstrapping/knockoutBindings/selectTextBinding',[],function () {\n\n    ko.bindingHandlers.selectText = {\n        init: function (element, valueAccessor) {\n            var $element = $(element);\n            \n            $element.on('click', function(){\n                this.select();\n            });\n        }\n    };\n});\n","define('bootstrapping/knockoutBindings/submitOnEnterBinding',[],function () {\n\n    ko.bindingHandlers.submitOnEnter = {\n        init: function (element, valueAccessor, allBindings, viewModel) {\n            var $element = $(element),\n                callback = valueAccessor();\n            \n            $element.keydown(function (e) {\n                if (e.which == 13) {\n                    e.preventDefault();\n                    e.stopPropagation();\n\n                    if (typeof callback === 'function') {\n                        callback.call(viewModel);\n                    } else {\n                        $element.click();\n                    }\n                }\n            });\n        }\n    };\n});\n","define('bootstrapping/knockoutBindings/keyDownBinding',[],function () {\n\n    ko.bindingHandlers.keyDown = {\n        init: function (element, valueAccessor, allBindings, viewModel) {\n            var bindingData = valueAccessor();\n            var keyDownEventHandler = function (event) {\n                if(bindingData.hasOwnProperty(event.keyCode)){\n                    if (_.isFunction(bindingData[event.keyCode].handler)) {\n                        bindingData[event.keyCode].handler(viewModel);\n                    }\n\n                    if(!bindingData[event.keyCode].hasOwnProperty('preventDefault') || bindingData[event.keyCode].preventDefault) {\n                        event.preventDefault();\n                    }\n\n                    if(!bindingData[event.keyCode].hasOwnProperty('stopPropagation') || bindingData[event.keyCode].stopPropagation) {                        \n                        event.stopPropagation();\n                    }                    \n                }\n            };\n\n            $(element).on('keydown', keyDownEventHandler);\n\n            ko.utils.domNodeDisposal.addDisposeCallback(element, function () {\n                $(element).off('keydown', keyDownEventHandler);\n            });\n        }\n    };\n});\n","define('bootstrapping/knockoutBindings/tabFocusBinding',['knockout', 'jquery', 'durandal/composition'], function (ko, $) {\n\n    ko.bindingHandlers.tabFocus = {\n        init: function (element, valueAccessor) {\r\n            var $element = $(element),\n                keyboardClass = valueAccessor() || 'keyboard-navigation';\n\n            $element.keydown(function (e) {\r\n                if (e.which == 9 && !$element.hasClass(keyboardClass)) {\n                    $element.addClass(keyboardClass);\n                }\r\n            });\n\n            $element.click(function() {\n                if ($element.hasClass(keyboardClass)) {\n                    $element.removeClass(keyboardClass);\n                }\n            });\n        }\n    };\n});\n","define('bootstrapping/knockoutBindings/copyToClipboardBinding',['knockout'], function(ko) {\n    ko.bindingHandlers.copyToClipboard = {\n        init: function(element, valueAccessor) {\n            var $element = $(element),\n                targets = valueAccessor().targets,\n                texts = valueAccessor().texts,\n                copied = valueAccessor().copied;\n\n            var cplipboard = new Clipboard(element, {\n                text: function() {\n                    var targetTexts = [];\n                    var text = '';\n                    targets.forEach(function(item) {\n                        var itemText = document.getElementById(item);\n                        targetTexts.push(itemText.value);\n                    });\n                    copied(true);\n                    setTimeout(function(){\n                        copied(false);\n                    }, 3000);\n                    if (texts) {\n                        texts.forEach(function(item, index) {\n                            if (index == texts.length - 1) {\n                                text += item + ': ' + targetTexts[index];\n                            } else {\n                                text += item + ': ' + targetTexts[index] + ', ';\n                            }\n                        });\n                        return text;\n                    }\n                    return targetTexts[0];\n                }\n            });\n        }\n    };\n});\n","define('bootstrapping/knockoutBindings/changeCssClassByDelayBinding',['knockout', 'underscore'], function (ko, _) {\n    ko.bindingHandlers.changeClass = {\n        update: function (element, valueAccessor) {\n            var delay = valueAccessor().delay || 400,\n                fromClass = valueAccessor().fromClass || 'hide',\n                toClass = valueAccessor().toClass || 'show',\n                value = ko.utils.unwrapObservable(valueAccessor().value) || false; \n\n            _.delay(function(){\n                element.classList.toggle(toClass, value);\n                element.classList.toggle(fromClass, !value);\n            }, delay);\n        }\n    };\n});\n","define('bootstrapping/knockoutBindings/containImageBinding',[],function () {\n    var imageResizerQueryPattern = /\\?width=\\d+\\&height=\\d+&scaleBySmallerSide=\\w+/;\n\n    ko.bindingHandlers.containImage = {\n        init: function (element, valueAccessor) {\n            var $element = $(element);\n            var imageProps = valueAccessor();\n            var imageUrl = getOriginalImageUrl(imageProps.imageUrl);\n            var imageWidth = imageProps.imageWidth;\n            var imageHeight = imageProps.imageHeight;\n\n            return getImageSize(imageUrl).then(function(size){\n                var resizedImageUrl = imageUrl;\n                var backgroundSize = 'initial';\n                if(size.width >= imageWidth || size.height >= imageHeight) {\n                    resizedImageUrl = getResizedSectionThumbnailUrl(imageUrl, imageWidth, imageHeight);\n                    backgroundSize = 'contain';\n                }\n                if(size.width >= imageWidth && size.height >= imageHeight) {\n                    backgroundSize = 'cover';\n                }\n                $element.css('backgroundSize', backgroundSize);\n                $element.css('backgroundImage', 'url(' + resizedImageUrl + ')');\n            });\n        }\n    };\n\n    function getOriginalImageUrl(imageUrl) {\n        var originalImage = imageUrl;\n        var coincidences = imageResizerQueryPattern.exec(imageUrl);\n        if (coincidences && coincidences.length) {\n            originalImage = imageUrl.substring(0, coincidences.index);\n        }\n        return originalImage;\n    }\n\n    function getImageSize(imageUrl) {\n        var dfd = $.Deferred();\n        var img = new Image();\n        img.onload = function() {\n            dfd.resolve({\n                width: this.width,\n                height: this.height\n            });\n        }\n        img.onerror = img.onabort = function() {\n            dfd.reject('can not load image, url: ' + imageUrl);\n        }\n        img.src = imageUrl;\n        return dfd.promise();\n    }\n\n    function getResizedSectionThumbnailUrl(imageUrl, imageWidth, imageHeight) {\n        return imageUrl + '?width=' + imageWidth + '&height=' + imageHeight;\n    }\n});\n","define('bootstrapping/knockoutBindings/lessColorBinding',['underscore', 'less'], function (_, less) {\n\n    ko.bindingHandlers.lessColor = {\n        init: function (element, valueAccessor) {\n            var conditions = valueAccessor();\n\n            _.each(conditions, function (condition) {\n                var outputColor = condition.color;\n                if (!condition.attr) return;\n                if (condition.func && condition.dimension) {\n                    var c = new less.tree.Color(condition.color.slice(1)),\n                        dimension = new less.tree.Dimension(condition.dimension),\n                        func = less.functions.functionRegistry.get(condition.func);\n                    outputColor = func(c, dimension).toRGB();\n                }\n                \n                element.setAttribute(condition.attr, outputColor);\n            });\n        }\n    };\n});\n","ko.bindingHandlers.editableText = {\n    init: function(element, valueAccessor) {\n        var $element = $(element);\n        var text = valueAccessor().text;\n        var onEnterKeyPress = valueAccessor().onEnterKeyPress;\n        var updateValue = function() {\n            if (ko.utils.unwrapObservable(text) !== $element.text()) {\n                text($element.text());\n            }\n        };\n\n        $element.text(ko.utils.unwrapObservable(text)).on('focus', function() {\n            $element.on('DOMSubtreeModified', updateValue);\n        }).on('blur', function() {\n            $element.scrollLeft(0);\n            $element.off('DOMSubtreeModified', updateValue);\n        }).on('keypress', function(event) {\n            if (event.keyCode !== 13) {\n                return;\n            }\n\n            $element.blur();\n            if (onEnterKeyPress) {\n                onEnterKeyPress();\n            }\n\n            event.preventDefault();\n            event.stopPropagation();\n        }).on('drop dragover', function(event) {\n            event.preventDefault();\n            event.stopPropagation();\n        });\n    },\n    update: function(element, valueAccessor) {\n        var text = ko.utils.unwrapObservable(valueAccessor().text);\n        var $element = $(element);\n\n        if (text !== $element.text()) {\n            $element.text(text);\n        }\n\n        if ($element.text().length === 0) {\n            $element.text('');\n        }\n    }\n};\ndefine(\"bootstrapping/knockoutBindings/editableTextBindingHandler\", function(){});\n\n","define('eventManager',['durandal/app'],\r\n    function (app) {\r\n\r\n        var\r\n            events = {\r\n                courseStarted: \"courseStarted\",\r\n                courseFinished: \"courseFinished\",\r\n                courseFinalized: \"courseFinalized\",\r\n                courseEvaluated: 'courseEvaluated',\r\n                answersSubmitted: \"answersSubmitted\",\r\n                learningContentExperienced: \"learningContentExperienced\"\r\n            },\r\n\r\n            turnAllEventsOff = function () {\r\n                _.each(events, function (event) {\r\n                    app.off(event);\r\n                });\r\n            },\r\n\r\n            subscribeForEvent = function (event) {\r\n                if (!events.hasOwnProperty(event)) {\r\n                    throw 'Unsupported event';\r\n                }\r\n\r\n                return app.on(event);\r\n            },\r\n\r\n            unsubscribeForEvent = function(event, callback) {\r\n                if (!events.hasOwnProperty(event)) {\r\n                    throw 'Unsupported event';\r\n                }\r\n\r\n                return app.off(event, callback);\r\n            },\r\n\r\n            courseStarted = function (data) {\r\n                app.trigger(events.courseStarted, data);\r\n            },\r\n\r\n            courseEvaluated = function (data) {\r\n                return executeAfterSubscribersDone(events.courseEvaluated, data);\r\n            },\r\n\r\n            courseFinished = function (data) {\r\n                return executeAfterSubscribersDone(events.courseFinished, data);\r\n            },\r\n\r\n            courseFinalized = function () {\r\n                return executeAfterSubscribersDone(events.courseFinalized, {});\r\n            },\r\n\r\n            answersSubmitted = function (data, sendParentProgress) {\r\n                app.trigger(events.answersSubmitted, data, sendParentProgress);\r\n            },\r\n            \r\n            learningContentExperienced = function (data, spentTime) {\r\n                app.trigger(events.learningContentExperienced, data, spentTime);\r\n            },\r\n            \r\n            executeAfterSubscribersDone = function (event, eventData) {\r\n                if (_.isNullOrUndefined(app.callbacks) || _.isNullOrUndefined(app.callbacks[event])) {\r\n                    return Q();\r\n                }\r\n\r\n                var promises = [];\r\n                _.each(app.callbacks[event], function (handler) {\r\n                    if (_.isFunction(handler)) {\r\n                        var promise = handler(eventData);\r\n\r\n                        if (Q.isPromise(promise)) {\r\n                            promises.push(promise);\r\n                        }\r\n                    }\r\n                });\r\n\r\n                return Q.all(promises);\r\n            };\r\n\r\n        return {\r\n            events: events,\r\n            turnAllEventsOff: turnAllEventsOff,\r\n            subscribeForEvent: subscribeForEvent,\r\n            unsubscribeForEvent: unsubscribeForEvent,\r\n\r\n            courseStarted: courseStarted,\r\n            courseFinished: courseFinished,\r\n            courseFinalized: courseFinalized,\r\n            courseEvaluated: courseEvaluated,\r\n            answersSubmitted: answersSubmitted,\r\n            learningContentExperienced: learningContentExperienced\r\n        };\r\n    }\r\n);\n","define('models/course',[\"eventManager\", \"constants\", \"templateSettings\"], function(\n  eventManager,\n  constants,\n  templateSettings\n) {\n  var ctor = function(spec) {\n    var course = {\n      id: spec.id,\n      templateId: spec.templateId,\n      title: spec.title,\n\n      createdBy: spec.createdBy,\n      createdOn: spec.createdOn,\n\n      authorContactEmail: spec.authorContactEmail,\n      authorPersonalPhone: spec.authorPersonalPhone,\n      authorShortBio: spec.authorShortBio,\n      authorAvatarUrl: spec.authorAvatarUrl,\n\n      hasIntroductionContent: spec.hasIntroductionContent,\n      sections: spec.sections,\n      isFinished: false\n    };\n\n    var affectProgressSections = _.filter(course.sections, function(section) {\n      return section.affectProgress;\n    });\n\n    course.score = function() {\n      var sum = 0;\n      var itemCount = 0;\n      if (templateSettings.masteryScore.isOverall) {\n        itemCount = _.reduce(\n          affectProgressSections,\n          function(memo, section) {\n            var questions = _.filter(section.questions, function(question) {\n              return question.affectProgress;\n            });\n            questions.forEach(function(question) {\n              sum += question.score();\n            });\n            return (memo += questions.length);\n          },\n          0\n        );\n      } else {\n        itemCount = affectProgressSections.length;\n        sum = _.reduce(\n          affectProgressSections,\n          function(memo, section) {\n            return memo + section.score();\n          },\n          0\n        );\n      }\n\n      return itemCount == 0 ? 0 : Math.floor(sum / itemCount);\n    };\n\n    course.result = function() {\n      return course.score() / 100;\n    };\n\n    course.isCompleted = function() {\n      if (templateSettings.masteryScore.isOverall) {\n        if (affectProgressSections.length === 0) {\n          return true;\n        }\n\n        return course.score() >= templateSettings.masteryScore.score;\n      }\n\n      return !_.some(affectProgressSections, function(section) {\n        return !section.isCompleted();\n      });\n    };\n\n    course.getStatus = function() {\n      if (!course.isFinished) {\n        return constants.course.statuses.inProgress;\n      }\n\n      return course.isCompleted()\n        ? constants.course.statuses.completed\n        : constants.course.statuses.failed;\n    };\n\n    course.setFinishedStatus = function() {\n      course.isFinished = true;\n    };\n\n    course.finish = function(callback, withoutEvent) {\n      course.setFinishedStatus();\n      course.sections.forEach(function(section) {\n        section.questions.forEach(function(question) {\n          question.markAsAnswered();\n        });\n      });\n\n      if (withoutEvent) {\n        callback && callback();\n      } else {\n        eventManager\n          .courseFinished(course)\n          .fail(function(error) {\n            alert(error);\n          })\n          .fin(function() {\n            callback && callback();\n          });\n      }\n    };\n\n    course.finalize = function(callback) {\n      eventManager.courseFinalized().then(function() {\n        eventManager.turnAllEventsOff();\n        if (callback) {\n          callback();\n        }\n      });\n    };\n\n    course.evaluate = function(score, callback) {\n      eventManager.courseEvaluated(score).fin(function() {\n        callback && callback();\n      });\n    };\n\n    return course;\n  };\n\n  return ctor;\n});\n\n","define('models/section',['templateSettings'],\n    function (templateSettings) {\n\n        var ctor = function (spec) {\n\n            var section = {\n                id: spec.id,\n                title: spec.title,\n                imageUrl: spec.imageUrl,\n                questions: spec.questions\n            };\n\n            var questions = _.filter(section.questions, function (question) {\n                return question.affectProgress;\n            });\n\n            section.affectProgress = questions.length > 0;\n\n            section.hasSurveyQuestions = !!_.filter(section.questions, function (question) {\n                return question.isSurvey;\n            }).length;\n\n            section.score = ko.computed(function () {\n                var result = _.reduce(questions, function (memo, question) {\n                    return memo + question.score();\n                }, 0);\n                var questionsLength = questions.length;\n                return questionsLength === 0 ? templateSettings.masteryScore.score : Math.floor(result / questionsLength);\n            });\n\n            section.isCompleted = ko.computed(function () {\n                return section.score() >= templateSettings.masteryScore.score;\n            });\n\n            return section;\n        };\n\n        return ctor;\n    }\n);\n","define('publishSettings',[],function () {\n    'use strict';\n\n    return {\n        init: function(settings){\n            for (var key in settings){\n                this[key] = settings[key]; \n            }\n        }\n    };\n});\n\n","define('guard',[], function () {\n\n    return {\n        throwIfNotAnObject: function (obj, message) {\n            if (!_.isObject(obj)) {\n                throw message;\n            }\n        },\n\n        throwIfNotString: function (str, message) {\n            if (!_.isString(str)) {\n                throw message;\n            }\n        },\n\n        throwIfNotBoolean: function (bool, message) {\n            if (!_.isBoolean(bool)) {\n                throw message;\n            }\n        },\n\n        throwIfNotArray: function (array, message) {\n            if (!_.isArray(array)) {\n                throw message;\n            }\n        },\n\n        throwIfNotDate: function (date, message) {\n            if (!_.isDate(date)) {\n                throw message;\n            }\n        },\n        \n        throwIfNotNumber: function (number, message) {\n            if (!_.isNumber(number)) {\n                throw message;\n            }\n        }\n    };\n\n});\n","define('models/contentBlock',[],\n    function () {\n\n        function ContentBlock(id, contentUrl, children) {\n            this.id = id;\n            this.contentUrl = contentUrl;\n            this.children = children;\n\n            this.content;\n        }\n\n        return ContentBlock;\n    }\n);\n","/**\n * Durandal 2.0.1 Copyright (c) 2012 Blue Spire Consulting, Inc. All Rights Reserved.\n * Available via the MIT license.\n * see: http://durandaljs.com or https://github.com/BlueSpire/Durandal for details.\n */\n/**\n * Enables common http request scenarios.\n * @module http\n * @requires jquery\n * @requires knockout\n */\ndefine('plugins/http',['jquery', 'knockout'], function($, ko) {\n    /**\n     * @class HTTPModule\n     * @static\n     */\n    return {\n        /**\n         * The name of the callback parameter to inject into jsonp requests by default.\n         * @property {string} callbackParam\n         * @default callback\n         */\n        callbackParam:'callback',\n        /**\n         * Makes an HTTP GET request.\n         * @method get\n         * @param {string} url The url to send the get request to.\n         * @param {object} [query] An optional key/value object to transform into query string parameters.\n         * @return {Promise} A promise of the get response data.\n         */\n        get:function(url, query) {\n            return $.ajax(url, { data: query });\n        },\n        /**\n         * Makes an JSONP request.\n         * @method jsonp\n         * @param {string} url The url to send the get request to.\n         * @param {object} [query] An optional key/value object to transform into query string parameters.\n         * @param {string} [callbackParam] The name of the callback parameter the api expects (overrides the default callbackParam).\n         * @return {Promise} A promise of the response data.\n         */\n        jsonp: function (url, query, callbackParam) {\n            if (url.indexOf('=?') == -1) {\n                callbackParam = callbackParam || this.callbackParam;\n\n                if (url.indexOf('?') == -1) {\n                    url += '?';\n                } else {\n                    url += '&';\n                }\n\n                url += callbackParam + '=?';\n            }\n\n            return $.ajax({\n                url: url,\n                dataType:'jsonp',\n                data:query\n            });\n        },\n        /**\n         * Makes an HTTP POST request.\n         * @method post\n         * @param {string} url The url to send the post request to.\n         * @param {object} data The data to post. It will be converted to JSON. If the data contains Knockout observables, they will be converted into normal properties before serialization.\n         * @return {Promise} A promise of the response data.\n         */\n        post:function(url, data) {\n            return $.ajax({\n                url: url,\n                data: ko.toJSON(data),\n                type: 'POST',\n                contentType: 'application/json',\n                dataType: 'json'\n            });\n        }\n    };\n});\n\n","define('models/questions/question',['eventManager', 'guard', 'plugins/http', 'constants'], function (eventManager, guard, http, constants) {\r\n    \"use strict\";\r\n\r\n    function Question(spec, _protected) {\r\n        if (typeof spec == typeof undefined) {\r\n            throw 'You should provide a specification to create an Question';\r\n        }\r\n\r\n        this.id = spec.id;\r\n        this.shortId = spec.shortId;\r\n        this.sectionId = spec.sectionId;\r\n        this.title = spec.title;\r\n        this.type = spec.type;\r\n        this.score = ko.observable(spec.score);\r\n        this.learningContents = spec.learningContents;\r\n        this.questionInstructions = spec.questionInstructions;\r\n        this.isAnswered = false;\r\n        this.isCorrectAnswered = false;\r\n        this.affectProgress = true;\r\n        this.isInformationContent = spec.type === constants.questionTypes.informationContent;\r\n\r\n        if(spec.hasOwnProperty('isSurvey')){\r\n            this.isSurvey = spec.isSurvey;\r\n            this.affectProgress = !this.isSurvey;\r\n        }\r\n\r\n        this.feedback = {\r\n            hasCorrect: spec.hasCorrectFeedback,\r\n            correct: null,\r\n\r\n            hasIncorrect: spec.hasIncorrectFeedback,\r\n            incorrect: null\r\n        };\r\n        this.loadFeedback = loadFeedback,\r\n\r\n        this.loadLearningContent = loadLearningContent;\r\n        this.loadQuestionInstructions = loadQuestionInstructions;\r\n        this.load = load;\r\n\r\n        this.voiceOver = spec.voiceOver;\r\n\r\n        this.learningContentExperienced = learningContentExperienced;\r\n\r\n        this.loadContent = loadContent;\r\n\r\n        this.progress = function (data) {\r\n            if (!this.affectProgress && !this.hasOwnProperty('isSurvey'))\r\n                return 0;\r\n\r\n            if (!_.isNullOrUndefined(data)) {\r\n                _protected.restoreProgress.call(this, data);\r\n\r\n                this.markAsAnswered();\r\n                this.isCorrectAnswered = this.score() === 100;\r\n            } else {\r\n                return _protected.getProgress.call(this);\r\n            }\r\n        };\r\n\r\n        this.submitAnswer = function () {\r\n            this.markAsAnswered();\r\n            \r\n            if (!this.affectProgress && !this.hasOwnProperty('isSurvey'))\r\n                return;\r\n                \r\n            this.score(_protected.submit.apply(this, arguments));\r\n\r\n            this.isCorrectAnswered = this.score() === 100;\r\n\r\n            eventManager.answersSubmitted(this, true);\r\n        }\r\n\r\n        this.markAsAnswered = function() {\r\n            this.isAnswered = true;\r\n        }\r\n    }\r\n\r\n    return Question;\r\n\r\n    function learningContentExperienced(spentTime) {\r\n        eventManager.learningContentExperienced(this, spentTime);\r\n    }\r\n    \r\n    function loadQuestionInstructions() {\r\n        return this.loadContent(this.questionInstructions);\r\n    }\r\n\r\n    function loadLearningContent() {\r\n        return this.loadContent(this.learningContents);\r\n    }\r\n\r\n    function load() {\r\n        var that = this;\r\n        return that.loadQuestionInstructions().then(function () {\r\n            return that.loadLearningContent().then(function () {\r\n                return that.loadFeedback();\r\n            });\r\n        });\r\n    }\r\n\r\n    function loadFeedback() {\r\n        var\r\n            that = this,\r\n            requests = [],\r\n            feedbackUrlPath = 'content/' + that.sectionId + '/' + that.id + '/',\r\n            correctFeedbackContentUrl = feedbackUrlPath + 'correctFeedback.html?v=1552304184357',\r\n            incorrectFeedbackContentUrl = feedbackUrlPath + 'incorrectFeedback.html?v=1552304184357';\r\n\r\n        if (that.feedback.hasCorrect) {\r\n            requests.push(loadPage(correctFeedbackContentUrl).then(function (content) {\r\n                that.feedback.correct = content;\r\n            }));\r\n        }\r\n        if (that.feedback.hasIncorrect) {\r\n            requests.push(loadPage(incorrectFeedbackContentUrl).then(function (content) {\r\n                that.feedback.incorrect = content;\r\n            }));\r\n        }\r\n\r\n        return Q.allSettled(requests);\r\n    }\r\n\r\n    function loadContent(items) {\r\n        var that = this;\r\n        var promises = [];\r\n        _.each(items, function(item) {\r\n            if (typeof item.content === typeof undefined) {\r\n                promises.push(loadPage(item.contentUrl).then(function(content) {\r\n                    item.content = content;\r\n                }));\r\n            }\r\n\r\n            return that.loadContent(item.children);\r\n        });\r\n\r\n        return Q.allSettled(promises);\r\n    }\r\n\r\n    function loadPage(contentUrl) {\r\n        return http.get(contentUrl);\r\n    }\r\n\r\n});\n","define('models/answers/answer',[],\n    function () {\n\n        function Answer(spec) {\n            this.id = spec.id;\n            this.shortId = spec.shortId;\n            this.text = spec.text;\n            this.isCorrect = spec.isCorrect;\n            this.matchCase = spec.matchCase;\n        }\n\n        return Answer;\n    }\n);\n","define('models/answers/checkableAnswer',['models/answers/answer'], function (Answer) {\n    \"use strict\";\n\n    function CheckableAnswer(spec) {\n        Answer.call(this, spec);\n\n        this.isChecked = false;\n    }\n\n    return CheckableAnswer;\n\n});\n","define('models/questions/multipleSelectQuestion',['guard', 'models/questions/question', 'models/answers/checkableAnswer'],\n    function (guard, Question, CheckableAnswer) {\n        \"use strict\";\n\n        function MultipleSelectQuestion(spec) {\n\n            Question.call(this, spec, {\n                getProgress: getProgress,\n                restoreProgress: restoreProgress,\n\n                submit: submitAnswer\n            });\n\n            this.answers = (function () {\n                var index = 0;\n                return _.map(spec.answers, function (answer) {\n                    return new CheckableAnswer({\n                        id: answer.id,\n                        shortId: index++,\n                        isCorrect: answer.isCorrect,\n                        text: answer.text\n                    });\n                });\n            })();\n        }\n\n        return MultipleSelectQuestion;\n\n        function submitAnswer(checkedAnswerIds) {\n            guard.throwIfNotArray(checkedAnswerIds, 'Checked answer ids is not an array');\n\n            _.each(this.answers, function (answer) {\n                answer.isChecked = _.contains(checkedAnswerIds, answer.id);\n            });\n\n            return calculateScore(this.answers);\n        }\n\n        function calculateScore(answers) {\n            var hasIncorrectCheckedAnswer = _.some(answers, function (answer) {\n                return answer.isChecked != answer.isCorrect;\n            });\n\n            return hasIncorrectCheckedAnswer ? 0 : 100;\n        }\n\n        function getProgress() {\n            if (this.isCorrectAnswered) {\n                return 100;\n            } else {\n                return _.chain(this.answers)\n                    .filter(function (answer) {\n                        return answer.isChecked;\n                    })\n                    .map(function (answer) {\n                        return answer.shortId;\n                    }).value();\n            }\n        }\n\n        function restoreProgress(progress) {\n            _.each(this.answers, function (answer) {\n                answer.isChecked = progress === 100 ? answer.isCorrect : progress && _.indexOf(progress, answer.shortId) > -1;\n            });\n            this.score(calculateScore(this.answers));\n        }\n\n    });\n","define('models/answers/answerGroup',[],function () {\n    \"use strict\";\n\n    function AnswerGroup(spec) {\n        this.id = spec.id;\n        this.shortId = spec.shortId;\n        this.answeredText = '';\n        this.answers = spec.answers;\n\n        this.getCorrectText = getCorrectText;\n        this.checkIsCorrect = checkIsCorrect;\n    }\n\n    return AnswerGroup;\n\n    function getCorrectText() {\n        var correctAnswers = _.where(this.answers, {\n            isCorrect: true\n        });\n        return _.map(correctAnswers, function (answer) {\n            return answer.text;\n        });\n    }\n\n    function checkIsCorrect(answerGroupValue) {\n        if (!_.isString(answerGroupValue.value)) {\n            return false;\n        }\n\n        return _.some(this.answers, function (answer) {\n            return answer.isCorrect &&\n                (answer.matchCase ? answer.text === answerGroupValue.value : answer.text.toLowerCase() === answerGroupValue.value.toLowerCase());\n        });\n    }\n});\n","define('models/questions/fillInTheBlankQuestion',['guard', 'models/questions/question', 'models/answers/answerGroup', 'models/answers/answer'],\n    function (guard, Question, AnswerGroup, Answer) {\n        \"use strict\";\n\n        function FillInTheBlankQuestion(spec) {\n\n            Question.call(this, spec, {\n                getProgress: getProgress,\n                restoreProgress: restoreProgress,\n\n                submit: submitAnswer\n            });\n\n            this.hasContent = spec.hasContent;\n            this.answerGroupsValues = null;\n\n            this.answerGroups = (function () {\n                var index = 0;\n                return _.map(spec.answerGroups, function (answerGroup) {\n                    return new AnswerGroup({\n                        id: answerGroup.id,\n                        shortId: index++,\n                        type: answerGroup.type,\n                        answers: _.map(answerGroup.answers, function (answer) {\n                            return new Answer({\n                                id: answer.id,\n                                isCorrect: answer.isCorrect,\n                                text: answer.text,\n                                matchCase: answer.matchCase\n                            });\n                        })\n                    });\n                });\n            })();\n        }\n\n        return FillInTheBlankQuestion;\n\n        function submitAnswer(inputValues) {\n            guard.throwIfNotArray(inputValues, 'Input values is not array.');\n\n            saveAnsweredTexts(inputValues, this.answerGroups);\n            this.answerGroupsValues = inputValues;\n\n            return calculateScore(inputValues, this.answerGroups);\n        }\n\n        function calculateScore(answerGroupValues, pointer) {\n            var hasIncorrectAnswer = _.some(answerGroupValues, function (answerGroupValue) {\n                return _.some(pointer, function (answerGroup) {\n                    if (_.isFunction(answerGroup.checkIsCorrect) && answerGroupValue.id == answerGroup.id) {\n                        return !answerGroup.checkIsCorrect(answerGroupValue);\n                    }\n                    return false;\n                });\n            });\n\n            return hasIncorrectAnswer ? 0 : 100;\n        }\n\n        function saveAnsweredTexts(answerGroupValues, answerGroups) {\n            _.each(answerGroupValues, function (answerGroupValue) {\n                var answerGroup = _.find(answerGroups, function (answerGroup) {\n                    return answerGroup.id === answerGroupValue.id;\n                });\n\n                answerGroup.answeredText = answerGroupValue.value;\n            });\n        }\n\n        function getProgress() {\n            if (this.isCorrectAnswered) {\n                return 100;\n            } else {\n                return _.chain(this.answerGroups)\n                    .filter(function (group) {\n                        return !!group.answeredText;\n                    })\n                    .reduce(function (obj, ctx) {\n                        obj[ctx.shortId] = ctx.answeredText;\n                        return obj;\n                    }, {})\n                    .value();\n            }\n        }\n\n        function restoreProgress(progress) {\n            var inputValues = _.chain(this.answerGroups)\n                .map(function (answerGroup) {\n                    var correct = _.chain(answerGroup.answers)\n                        .find(function (answer) {\n                            return answer.isCorrect;\n                        }).value();\n\n                    return {\n                        id: answerGroup.id,\n                        value: progress === 100 ? correct.text : progress[answerGroup.shortId],\n                        answers: answerGroup.answers\n                    };\n                }).value();\n\n            saveAnsweredTexts(inputValues, this.answerGroups);\n            this.score(calculateScore(inputValues, this.answerGroups));\n        }\n\n    });\n","define('models/answers/draggableAnswer',['models/answers/answer'], function (Answer) {\n    \"use strict\";\n\n    function DraggableAnswer(spec) {\n        Answer.call(this, spec);\n\n        this.correctPosition = { x: spec.x, y: spec.y };\n\n        this.currentPosition = { x: -1, y: -1 };\n    }\n\n    return DraggableAnswer;\n\n});\n","define('models/questions/dragAndDropQuestion',['guard', 'models/questions/question', 'models/answers/draggableAnswer'],\r\n    function (guard, Question, DraggableAnswer) {\r\n        \"use strict\";\r\n\r\n        function DragAndDropQuestion(spec) {\r\n\r\n            Question.call(this, spec, {\r\n                getProgress: getProgress,\r\n                restoreProgress: restoreProgress,\r\n\r\n                submit: submitAnswer\r\n            });\r\n\r\n            this.background = spec.background;\r\n\r\n            this.answers = (function () {\r\n                var index = 0;\r\n                return _.map(spec.dropspots, function (answer) {\r\n                    return new DraggableAnswer({\r\n                        id: answer.id,\r\n                        shortId: index++,\r\n                        isCorrect: true,\r\n                        text: answer.text,\r\n                        x: answer.x,\r\n                        y: answer.y\r\n                    });\r\n                });\r\n            })();\r\n        }\r\n\r\n        return DragAndDropQuestion;\r\n\r\n        function submitAnswer(dragableTexts) {\r\n            guard.throwIfNotArray(dragableTexts, 'Dragable texts is not array.');\r\n\r\n            var that = this;\r\n            var answersArray = [];\r\n            _.each(that.answers, function (answer) {\r\n                answer.currentPosition = { x: -1, y: -1 };\r\n            })\r\n            _.each(dragableTexts, function (dragableText) {\r\n                answersArray = _.where(that.answers, { text: dragableText.text });\r\n                var answer = _.find(answersArray, function (answer) {\r\n                    return answer.text === dragableText.text && answer.correctPosition.x === dragableText.x && answer.correctPosition.y === dragableText.y\r\n                })\r\n                if (answer && answer.currentPosition) {\r\n                    answer.currentPosition.x = answer.correctPosition.x,\r\n                    answer.currentPosition.y = answer.correctPosition.y\r\n                }\r\n                else {\r\n                    var answer = _.find(that.answers, function (answer) {\r\n                        return answer.text == dragableText.text\r\n                    })\r\n                    answer.currentPosition.x = dragableText.x,\r\n                    answer.currentPosition.y = dragableText.y\r\n                }\r\n            });\r\n\r\n            return calculateScore(this.answers);\r\n\r\n        }\r\n\r\n        function calculateScore(answers) {\r\n\r\n            var hasIncorrectAnswer = _.some(answers, function (answer) {\r\n                return answer.currentPosition.x != answer.correctPosition.x || answer.currentPosition.y != answer.correctPosition.y;\r\n            });\r\n\r\n            return hasIncorrectAnswer ? 0 : 100;\r\n        }\r\n\r\n        function getProgress() {\r\n\r\n            if (this.isCorrectAnswered) {\r\n                return 100;\r\n            } else {\r\n                return _.chain(this.answers)\r\n                    .filter(function (answer) {\r\n                        return answer.currentPosition\r\n                            && answer.currentPosition.x\r\n                            && answer.currentPosition.x > -1\r\n                            && answer.currentPosition.y\r\n                            && answer.currentPosition.y > -1;\r\n                    })\r\n                    .reduce(function (obj, ctx) {\r\n                        obj[ctx.shortId] = ctx.currentPosition;\r\n                        return obj;\r\n                    }, {})\r\n                    .value();\r\n            }\r\n        }\r\n\r\n        function restoreProgress(progress) {\r\n            if (progress === 100) {\r\n                _.each(this.answers, function (answer) {\r\n                    answer.currentPosition = { x: answer.correctPosition.x, y: answer.correctPosition.y }\r\n                });\r\n            } else {\r\n                _.each(this.answers, function (answer) {\r\n                    if (progress[answer.shortId]) {\r\n                        answer.currentPosition = progress[answer.shortId];\r\n                    }\r\n                });\r\n\r\n            }\r\n            this.score(calculateScore(this.answers));\r\n        }\r\n\r\n    });\n","define('models/answers/checkableImageAnswer',['models/answers/checkableAnswer'], function (CheckableAnswer) {\n    \"use strict\";\n\n    function CheckableImageAnswer(spec) {\n        this.id = spec.id;\n        this.shortId = spec.shortId;\n        this.image = spec.image;\n    }\n\n    return CheckableImageAnswer;\n\n});\n","define('models/questions/singleSelectImageQuestion',['guard', 'constants', 'models/questions/question', 'models/answers/checkableImageAnswer'],\n    function (guard, constants, Question, CheckableImageAnswer) {\n        \"use strict\";\n\n        function SingleSelectImageQuestion(spec) {\n\n            Question.call(this, spec, {\n                getProgress: getProgress,\n                restoreProgress: restoreProgress,\n\n                submit: submitAnswer\n            });\n\n            this.correctAnswerId = spec.correctAnswerId;\n            this.checkedAnswerId = null;\n            this.answers = (function () {\n                var index = 0;\n                return _.map(spec.answers, function (answer) {\n                    return new CheckableImageAnswer({\n                        id: answer.id,\n                        shortId: index++,\n                        image: answer.image || constants.defaultImageUrl\n                    });\n                });\n            })();\n        }\n\n        return SingleSelectImageQuestion;\n\n        function submitAnswer(checkedAnswerId) {\n\n            this.checkedAnswerId = checkedAnswerId;\n\n            return calculateScore(checkedAnswerId, this.correctAnswerId);\n        }\n\n        function calculateScore(answerId, correctAnswerId) {\n            return answerId != correctAnswerId ? 0 : 100;\n        }\n\n        function getProgress() {\n            var that = this;\n            if (that.isCorrectAnswered) {\n                return 100;\n            } else {\n                var checked = _.find(that.answers, function (answer) {\n                    return answer.id == that.checkedAnswerId;\n                });\n\n                return checked ? checked.shortId : undefined;\n            }\n        }\n\n        function restoreProgress(progress) {\n            var that = this;\n            if (progress === 100) {\n                that.checkedAnswerId = that.correctAnswerId;\n            } else {\n                var checked = _.find(that.answers, function (answer) {\n                    return answer.shortId === progress;\n                });\n\n                if (checked) {\n                    that.checkedAnswerId = checked.id;\n                }\n\n            }\n            that.score(calculateScore(that.checkedAnswerId, that.correctAnswerId));\n        }\n\n    });\n","define('models/questions/textMatchingQuestion',['models/questions/question'],\n    function (Question) {\n        \"use strict\";\n\n        function TextMatchingQuestion(spec) {\n\n            Question.call(this, spec, {\n                getProgress: getProgress,\n                restoreProgress: restoreProgress,\n\n                submit: submitAnswer\n            });\n\n            this.answers = (function () {\n                var index = 0;\n                return _.map(spec.answers, function (answer) {\n                    return {\n                        id: answer.id,\n                        shortId: index++,\n                        key: answer.key,\n                        value: answer.value,\n                        attemptedValue: null\n                    };\n                });\n            })();\n        }\n\n        return TextMatchingQuestion;\n\n        function submitAnswer(pairs) {\n            _.each(this.answers, function (answer) {\n                var attempted = _.find(pairs, function (pair) {\n                    return pair.id == answer.id;\n                });\n                if (attempted) {\n                    answer.attemptedValue = attempted.value;\n                } else {\n                    answer.attemptedValue = null;\n                }\n            });\n\n            return getScore(this.answers);\n        }\n\n        function getScore(answers) {\n            return _.every(answers, function (answer) {\n                return answer.value == answer.attemptedValue;\n            }) ? 100 : 0;\n        }\n\n        function getProgress() {\n            if (this.isCorrectAnswered) {\n                return 100;\n            } else {\n                return _.chain(this.answers)\n                    .filter(function (answer) {\n                        return !!answer.attemptedValue;\n                    })\n                    .map(function (answer) {\n                        return {\n                            shortId: answer.shortId,\n                            attemptedValue: answer.attemptedValue\n                        }\n                    })\n                    .reduce(function (obj, ctx) {\n                        obj[ctx.shortId] = ctx.attemptedValue;\n                        return obj;\n                    }, {})\n                    .value();\n            }\n        }\n\n        function restoreProgress(progress) {\n            if (progress === 100) {\n                _.each(this.answers, function (answer) {\n                    answer.attemptedValue = answer.value;\n                });\n            } else {\n                _.each(this.answers, function (answer) {\n                    if (progress[answer.shortId]) {\n                        answer.attemptedValue = progress[answer.shortId];\n                    }\n                });\n            }\n            this.score(getScore(this.answers));\n        }\n    });\n","define('models/questions/informationContent',['models/questions/question', 'templateSettings'],\n    function (Question, templateSettings) {\n        \"use strict\";\n\n        function InformationContent(spec) {\n\n            Question.call(this, spec, {\n                getProgress: getProgress,\n                restoreProgress: restoreProgress,\n\n                submit: submit\n            });\n\n            this.affectProgress = templateSettings.allowContentPagesScoring;\n\n            var superSubmitAnswer = this.submitAnswer;\n            this.submitAnswer = function () {\n                if (this.isAnswered)\n                    return;\n\n                superSubmitAnswer.call(this);\n            }\n        }\n\n        return InformationContent;\n\n        function getProgress() {\n            return this.score();\n        }\n\n        function restoreProgress(progress) {\n            if (!_.isNaN(progress)) {\n                this.score(progress === 100 ? progress : 0);\n            }\n        }\n\n        function submit() {\n            return 100;\n        }\n});\n","define('models/answers/statementAnswer',['models/answers/answer'], function (Answer) {\n    \"use strict\";\n\n    function SatementAnswer(spec) {\n        Answer.call(this, spec);\n        this.userAnswer = null;\n    }\n\n    return SatementAnswer;\n});\n","define('models/questions/statementQuestion',['models/questions/question', 'models/answers/statementAnswer', 'guard'],\n    function (Question, StatementAnswer, guard) {\n        \"use strict\";\n\n        function StatementQuestion(spec) {\n\n            Question.call(this, spec, {\n                getProgress: getProgress,\n                restoreProgress: restoreProgress,\n\n                submit: submitAnswer\n            });\n\n            this.statements = (function () {\n                var index = 0;\n                return _.map(spec.statements, function (statement) {\n                    return new StatementAnswer({\n                        id: statement.id,\n                        shortId: index++,\n                        text: statement.text,\n                        isCorrect: statement.isCorrect\n                    });\n                });\n            })();\n        }\n\n        return StatementQuestion;\n\n        function submitAnswer(userAnswers) {\n            guard.throwIfNotArray(userAnswers, 'userAnswers is not an array');\n\n            _.each(this.statements, function (statement) {\n                var userAnswer = _.find(userAnswers, function (answer) { return answer.id == statement.id; });\n                statement.userAnswer = !_.isNullOrUndefined(userAnswer) ? userAnswer.answer : null;\n            });\n\n            return calculateScore.call(this);\n        }\n\n        function calculateScore() {\n            return _.every(this.statements, function (statement) {\n                return statement.userAnswer == statement.isCorrect;\n            }) ? 100 : 0;\n        }\n\n        function getProgress() {\n            if (this.isCorrectAnswered) {\n                return 100;\n            } else {\n                return _.chain(this.statements)\n                    .filter(function (statement) {\n                        return _.isBoolean(statement.userAnswer);\n                    })\n                    .reduce(function (obj, ctx) {\n                        obj[ctx.shortId] = ctx.userAnswer ? 1 : 0;\n                        return obj;\n                    }, {})\n                    .value();\n\n            }\n        }\n\n        function restoreProgress(progress) {\n            _.chain(this.statements)\n                .each(function (statement) {\n                    if (progress == 100) {\n                        statement.userAnswer = statement.isCorrect;\n                    } else {\n                        statement.userAnswer = !!progress[statement.shortId];\n                    }\n                });\n            this.score(calculateScore.call(this));\n        }\n\n    });\n","define('models/questions/hotspot',['models/questions/question', 'guard'],\n    function (Question, guard) {\n        \"use strict\";\n\n        function Hotspot(spec) {\n\n            Question.call(this, spec, {\n                getProgress: getProgress,\n                restoreProgress: restoreProgress,\n\n                submit: submitAnswer\n            });\n\n            this.background = spec.background;\n            this.spots = spec.spots;\n            this.isMultiple = spec.isMultiple;\n            this.placedMarks = [];\n        };\n\n        return Hotspot;\n\n        function submitAnswer(marks) {\n            guard.throwIfNotArray(marks, 'Marks is not array.');\n\n            this.placedMarks = _.map(marks, function (mark) { return { x: mark.x, y: mark.y }; });\n\n            return calculateScore(this.isMultiple, this.spots, this.placedMarks);\n        };\n\n        function calculateScore(isMultiple, spots, placedMarks) {\n            if (!_.isArray(spots) || spots.length == 0) {\n                return placedMarks.length ? 0 : 100;\n            }\n\n            var answerCorrect;\n            if (!isMultiple) {\n                answerCorrect = _.some(spots, function (spot) {\n                    return _.some(placedMarks, function (mark) {\n                        return markIsInSpot(mark, spot);\n                    });\n                });\n            } else {\n                var spotsWithMarks = [];\n                var marksOnSpots = [];\n\n                _.each(placedMarks, function (mark) {\n                    _.each(spots, function (spot) {\n                        if (markIsInSpot(mark, spot)) {\n                            spotsWithMarks.push(spot);\n                            marksOnSpots.push(mark);\n                        }\n                    });\n                });\n\n                answerCorrect = _.uniq(spotsWithMarks).length === spots.length && _.uniq(marksOnSpots).length === placedMarks.length;\n            }\n\n            return answerCorrect ? 100 : 0;\n        }\n\n        function markIsInSpot(mark, spot) {\n            var x = mark.x, y = mark.y;\n\n            var inside = false;\n            for (var i = 0, j = spot.length - 1; i < spot.length; j = i++) {\n                var xi = spot[i].x, yi = spot[i].y;\n                var xj = spot[j].x, yj = spot[j].y;\n\n                var intersect = ((yi > y) != (yj > y))\n                    && (x < (xj - xi) * (y - yi) / (yj - yi) + xi);\n                if (intersect) inside = !inside;\n            }\n\n            return inside;\n        };\n\n        function getProgress() {\n            return this.placedMarks;\n        }\n\n        function restoreProgress(progress) {\n            var that = this;\n            _.each(progress, function (mark) {\n                that.placedMarks.push(mark);\n            });\n\n            this.score(calculateScore(that.isMultiple, that.spots, that.placedMarks));\n        }\n    });\n","define('models/questions/openQuestion',['models/questions/question', 'guard'], function (Question, guard) {\n    \"use strict\";\n\n    function OpenQuestion(spec) {\n        Question.call(this, spec, {\n            getProgress: getProgress,\n            restoreProgress: restoreProgress,\n\n            submit: submitAnswer\n        });\n\n        this.answeredText = '';\n    }\n\n    return OpenQuestion;\n\n    function getProgress() {\n        return this.isAnswered ? this.answeredText : 0;\n    }\n\n    function restoreProgress(progress) {\n        if (progress === 0) {\n            return;\n        }\n\n        this.answeredText = progress;\n        this.score(progress ? 100 : 0);\n    }\n\n    function submitAnswer(answeredText) {\n        guard.throwIfNotString(answeredText);\n        this.answeredText = answeredText;\n        return answeredText ? 100 : 0;\n    }\n});\n","define('models/questions/scenarioQuestion',['guard', 'models/questions/question'],\n    function (guard, Question) {\n        \"use strict\";\n\n        function ScenarioQuestion(spec) {\n            Question.call(this, spec, {\n                getProgress: getProgress,\n                restoreProgress: restoreProgress,\n\n                submit: submitAnswer\n            });\n\n            this.embedCode = spec.embedCode;\n\n            this.embedUrl = spec.embedUrl;\n\n            this.projectId = spec.projectId;\n\n            this.masteryScore = spec.masteryScore;\n        }\n\n        return ScenarioQuestion;\n\n        function getProgress() {\n            return this.score();\n        }\n\n        function restoreProgress(progress) {\n            if (!_.isNaN(progress)) {\n                this.score(progress === 100 ? progress : 0);\n            }\n        }\n\n        function submitAnswer(score) {\n            guard.throwIfNotNumber(score, 'Score is not a number');\n\n            var correctScore = score >= this.masteryScore ? 100 : 0;\n\n            return correctScore;\n        }\n    });\n","define('models/questions/rankingTextQuestion',['models/questions/question'],\n    function (Question) {\n        \"use strict\";\n\n        function RankingTextQuestion(spec) {\n            Question.call(this, spec, {\n                getProgress: getProgress,\n                restoreProgress: restoreProgress,\n\n                submit: submit\n            });\n\n            this.correctOrder = _.map(spec.rankingItems, function (item) {\n                return {\n                    text: item.text\n                };\n            });\n\n            this.rankingItems = _.shuffle(this.correctOrder);\n        }\n\n        return RankingTextQuestion;\n\n        function submit(items) {\n            var pattern = _.pluck(this.correctOrder, 'text'),\n                answered = _.pluck(items, 'text');\n\n            return _.isEqual(pattern, answered) ? 100 : 0;\n        }\n\n        function getProgress() {\n            if (this.isCorrectAnswered) {\n                return 100;\n            } else {\n                return _.pluck(this.rankingItems, 'text');\n            }\n        }\n\n        function restoreProgress(progress) {\n            if (progress === 100) {\n                this.rankingItems = this.correctOrder;\n                this.score(100);\n            } else {\n                var pattern = _.pluck(this.correctOrder, 'text');\n                if (pattern.length === progress.length && _.intersection(pattern, progress).length === pattern.length) {\n                    this.rankingItems = _.map(progress, function(item) {\n                        return {\n                            text: item\n                        };\n                    });\n                }\n                this.score(0);\n            }\n        }\n    });\n","define('models/questions/questionsFactory',['guard', 'constants', 'models/contentBlock', 'models/questions/multipleSelectQuestion',\r\n        'models/questions/fillInTheBlankQuestion', 'models/questions/dragAndDropQuestion',\r\n        'models/questions/singleSelectImageQuestion', 'models/questions/textMatchingQuestion',\r\n        'models/questions/informationContent', 'models/questions/statementQuestion', 'models/questions/hotspot',\r\n        'models/questions/openQuestion', 'models/questions/scenarioQuestion', 'models/questions/rankingTextQuestion'\r\n    ],\r\n    function (guard, constants, ContentBlock, MultipleSelectQuestion, FillInTheBlankQuestion, DragAndDropQuestion,\r\n        SingleSelectImageQuestion, TextMatchingQuestion, InformationContent,\r\n        StatementQuestion, Hotspot, OpenQuestion, ScenarioQuestion, RankingText) {\r\n        \"use strict\";\r\n\r\n        return {\r\n            createQuestion: createQuestion,\r\n        };\r\n\r\n        function createQuestion(sectionId, question, shortId) {\r\n            guard.throwIfNotString(sectionId, 'sectionId is invalid');\r\n            guard.throwIfNotAnObject(question, 'Question data is invalid');\r\n            guard.throwIfNotString(question.type, 'Question type is invalid');\r\n            \r\n            var questionData = {\r\n                id: question.id,\r\n                shortId: shortId,\r\n                sectionId: sectionId,\r\n                title: question.title,\r\n                type: question.type,\r\n                learningContents: _.map(question.learningContents, function (learningContent) {\r\n                    return mapContentBlock(learningContent, sectionId, question.id);\r\n                }),\r\n                questionInstructions: _.map(question.questionInstructions, function (instruction) {\r\n                    return mapContentBlock(instruction, sectionId, question.id);\r\n                }),\r\n                score: 0,\r\n                voiceOver: question.voiceOver,\r\n                hasCorrectFeedback: question.hasCorrectFeedback,\r\n                hasIncorrectFeedback: question.hasIncorrectFeedback\r\n            };\r\n\r\n            if (question.hasOwnProperty('isSurvey')) {\r\n                questionData.isSurvey = question.isSurvey;\r\n            }\r\n\r\n            switch (question.type) {\r\n                case constants.questionTypes.multipleSelect:\r\n                case constants.questionTypes.singleSelectText:\r\n                    questionData.answers = question.answers;\r\n                    return new MultipleSelectQuestion(questionData);\r\n                case constants.questionTypes.dragAndDrop:\r\n                    questionData.background = question.background;\r\n                    questionData.dropspots = question.dropspots;\r\n                    return new DragAndDropQuestion(questionData);\r\n                case constants.questionTypes.fillInTheBlank:\r\n                    questionData.answerGroups = question.answerGroups;\r\n                    questionData.hasContent = question.hasContent;\r\n                    return new FillInTheBlankQuestion(questionData);\r\n                case constants.questionTypes.singleSelectImage:\r\n                    questionData.correctAnswerId = question.correctAnswerId;\r\n                    questionData.answers = question.answers;\r\n                    return new SingleSelectImageQuestion(questionData);\r\n                case constants.questionTypes.textMatching:\r\n                    questionData.answers = question.answers;\r\n                    return new TextMatchingQuestion(questionData);\r\n                case constants.questionTypes.informationContent:\r\n                    return new InformationContent(questionData);\r\n                case constants.questionTypes.statement:\r\n                    questionData.statements = question.answers;\r\n                    return new StatementQuestion(questionData);\r\n                case constants.questionTypes.hotspot:\r\n                    questionData.spots = question.spots;\r\n                    questionData.isMultiple = question.isMultiple;\r\n                    questionData.background = question.background;\r\n                    return new Hotspot(questionData);\r\n                case constants.questionTypes.openQuestion:\r\n                    return new OpenQuestion(questionData);\r\n                case constants.questionTypes.scenario:\r\n                    questionData.embedCode = question.embedCode;\r\n                    questionData.masteryScore = question.masteryScore;\r\n                    questionData.projectId = question.projectId;\r\n                    questionData.embedUrl = question.embedUrl;\r\n                    return new ScenarioQuestion(questionData);\r\n                case constants.questionTypes.rankingText:\r\n                    questionData.rankingItems = question.answers;\r\n                    return new RankingText(questionData);\r\n                default:\r\n                    return null;\r\n            }\r\n        }\r\n\r\n        function mapContentBlock(item, sectionId, questionId) {\r\n            var contentUrl = 'content/' + sectionId + '/' + questionId + '/' + item.id + '.html?v=1552304184357';\r\n            var children = _.map(item.children, function(childItem) {\r\n                return mapContentBlock(childItem, sectionId, questionId);\r\n            })\r\n            \r\n            return new ContentBlock(item.id, contentUrl, children)\r\n        }\r\n    });\n","define('context',['models/course', 'models/section', 'publishSettings', 'models/questions/questionsFactory'],\n    function (Course, Section, publishSettings, questionsFactory) {\n\n        var _response;\n\n        function mapCourse(response) {\n            var questionShortIds = publishSettings.questionShortIds || {};\n\n            this.course = new Course({\n                id: response.id,\n                templateId: response.templateId,\n                title: response.title,\n                hasIntroductionContent: response.hasIntroductionContent,\n                sections: _.chain(response.sections)\n                    .filter(function (item) {\n                        return !_.isNullOrUndefined(item.questions) && item.questions.length > 0;\n                    })\n                    .map(function (section) {\n                        return new Section({\n                            id: section.id,\n                            title: section.title,\n                            imageUrl: section.imageUrl,\n                            questions: _.chain(section.questions).map(function (question) {\n                                return questionsFactory.createQuestion(section.id, question, questionShortIds[question.id]);\n                            }).filter(function(question){\n                                return question != null;\n                            }).value()\n                        });\n                    })\n                    .value(),\n                createdOn: new Date(response.createdOn),\n                createdBy: response.createdBy,\n                authorContactEmail: response.authorContactEmail,\n                authorPersonalPhone: response.authorPersonalPhone,\n                authorShortBio: response.authorShortBio,\n                authorAvatarUrl: response.authorAvatarUrl\n            });\n        }\n\n        var\n            course = {},\n\n            initialize = function () {\n                var that = this;\n                \n                if(_response){\n                    mapCourse.call(that, _response);\n                    return;\n                }\n\n                var dfd = Q.defer();\n\n                $.ajax({\n                    url: 'content/data.js?v=1552304184357',\n                    contentType: 'application/json',\n                    dataType: 'json',\n                    cache: false\n                }).done(function (response) {\n                    _response = JSON.parse(JSON.stringify(response));\n                    mapCourse.call(that, _response);\n                    dfd.resolve({\n                        course: that.course\n                    });\n                }).fail(function () {\n                    dfd.reject('Unable to load data.js?v=1552304184357');\n                });\n\n                return dfd.promise;\n            };\n\n        return {\n            initialize: initialize,\n            course: course,\n            isInReviewAttemptMode: function () {\n                return !!this.course.isFinished;\n            }\n        };\n    });\n","define('displaySettings',[],function() {\n  \"use strict\";\n\n  return {\n    backgroundSettings: {\n      repeat: {\n        repeat: \"repeat\"\n      },\n      fullscreen: {\n        size: \"cover\",\n        position: \"center\"\n      },\n      top: {\n        position: \"top\"\n      },\n      bottom: {\n        position: \"bottom\"\n      },\n      left: {\n        position: \"left\"\n      },\n      right: {\n        position: \"right\"\n      },\n      leftTop: {\n        position: \"left top\"\n      },\n      rightTop: {\n        position: \"right top\"\n      },\n      leftBottom: {\n        position: \"left bottom\"\n      },\n      rightBottom: {\n        position: \"right bottom\"\n      },\n      cover: {\n        size: \"cover\"\n      }\n    }\n  };\n});\n\n","define('header/header',[\n    'knockout', 'underscore', 'plugins/router', 'context', 'templateSettings', 'publishSettings', 'displaySettings'\n], function (ko, _, router, context, templateSettings, publishSettings, displaySettings) {\n\n        'use strict';\n        var viewmodel = {\n            version: '',\n            title: '',\n            logo: {\n                url: '',\n                maxWidth: '',\n                maxHeight: '',\n            },\n            viewSettings: null,\n            backgroundProps: null,\n            pdfServiceUrl: null,\n            pdfExportEnabled: ko.observable(false),\n            height: ko.observable(null),\n\n            cssName: ko.computed(getCssName),\n            activate: activate\n        };\n\n        return viewmodel;\n\n        //public methods\n        function activate(viewSettings, pdfExportEnabled) {\n            viewmodel.viewSettings = viewSettings;\n            viewmodel.pdfExportEnabled = pdfExportEnabled;\n            viewmodel.pdfServiceUrl = '//' + publishSettings.pdfConverterUrl;\n            viewmodel.version = context.course.id + (+new Date(context.course.createdOn));\n            viewmodel.title = context.course.title;\n            viewmodel.logo.url = templateSettings.logo.url;\n            viewmodel.logo.maxWidth = templateSettings.logo.maxWidth || '300px';\n            viewmodel.logo.maxHeight = templateSettings.logo.maxHeight || '100px';\n\n            var background = templateSettings.background,\n                backgroundType = background.header.image && background.header.image.option || 'fullscreen',\n                bgSettings = displaySettings.backgroundSettings[backgroundType];\n\n            viewmodel.backgroundProps = {\n                brightness: background.header.brightness || 0,\n                color: background.header.color || 'transparent',\n                isBodyEnabled: background.body.enabled,\n                image: {\n                    url: background.header.image && background.header.image.url,\n                    backgroundPosition: bgSettings && bgSettings.position || '0 0',\n                    backgroundSize: bgSettings && bgSettings.size || 'auto',\n                    backgroundRepeat: bgSettings && bgSettings.repeat || 'no-repeat'\n                }\n            };\n        }\n\n        function getCssName() {\n            var activeItem = router.activeItem();\n\n            if (_.isObject(activeItem)) {\n                var moduleId = activeItem.__moduleId__;\n\n                return moduleId.slice(moduleId.lastIndexOf('/') + 1);\n            }\n\n            return '';\n        }\n    });\n","define('bootstrapping/knockoutBindings/headerHeightDepender',['underscore', 'header/header'], function(_, header) {\n    ko.bindingHandlers.headerHeightDepender = {\n        init: function(element, valueAccessor, allBindings, viewModel, bindingContext) {\n            var deactivate = viewModel.deactivate;\n\n            viewModel.deactivate = function() {\n                if(_.isFunction(deactivate)) {\n                    deactivate();\n                }\n\n                header.height(null);\n            }\n        },\n        update: function (element) {\n            setTimeout(function(){\n                var innerHeight = $(element).actual('innerHeight');\n    \n                header.height(innerHeight);\n            }, 0)\n        }\n    }\n});\n","define('viewmodels/questions/dragAndDrop/bindingHandlers/draggableTextBindingHandler',['knockout'], function (ko) {\n    'use strict';\n\n    ko.bindingHandlers.draggableText = {\n        init: function (element, valueAccessor, allBindingsAccessor) {\n            var allBindings = allBindingsAccessor();\n            var scope = ko.utils.unwrapObservable(allBindings.scope) || 'question';\n            var $element = $(element);\n\t\t\t\n\t\t\t$element.css('touch-action','none');\n            $element.draggable({\n                appendTo: '.application-wrapper',\n                scope: scope,\n                revert: 'invalid',\n                helper: 'clone',\n                start: function () {\n                    $element.css({ visibility: 'hidden' });\n                },\n                stop: function () {\n                    $element.css({ visibility: 'visible' });\n                }\n            });\n        }\n    };\n});\n","define('viewmodels/questions/dragAndDrop/bindingHandlers/draggableTextContainerBindingHandler',['knockout'], function (ko) {\n    'use strict';\n\n    ko.bindingHandlers.draggableTextContainer = {\n        init: function (element, valueAccessor, allBindingsAccessor) {\n            var allBindings = allBindingsAccessor();\n            var scope = ko.utils.unwrapObservable(allBindings.scope) || 'question';\n\n            $(element).parent()\n                .on('dragstart', '.drag-and-drop-text-draggable', function () {\n                    $(element).addClass('active');\n                })\n                .on('dragstop', '.drag-and-drop-text-draggable', function () {\n                    $(element).removeClass('active');\n                    if ($(element).children('.drag-and-drop-text-draggable').length) {\n                        $(element).children('.drag-and-drop-text-draggable-container-message').hide();\n                    } else {\n                        $(element).children('.drag-and-drop-text-draggable-container-message').show();\n                    }\n                });\n\n            $(element).droppable({\n                accept: '.drag-and-drop-text-draggable',\n                scope: scope,\n                drop: function (e, ui) {\n                    ui.draggable.css('left', '').css('top', '').appendTo(this);\n                    var text = ko.dataFor(ui.draggable.get(0));\n                    if (text.dropSpot && text.dropSpot.text) {\n                        text.dropSpot.text(undefined);\n                    }\n                }\n            });\n        }\n    };\n});\n","define('viewmodels/questions/dragAndDrop/bindingHandlers/dropspotBindingHandler',['knockout', 'durandal/composition'], function (ko, composition) {\r\n    'use strict';\r\n\r\n    ko.bindingHandlers.dropspot = {\r\n        init: function (element, valueAccessor, allBindingsAccessor) {\r\n            var value = valueAccessor();\r\n            var allBindings = allBindingsAccessor();\r\n\r\n            var left = ko.utils.unwrapObservable(value.x);\r\n            var top = ko.utils.unwrapObservable(value.y);\r\n            var scope = ko.utils.unwrapObservable(allBindings.scope) || 'question';\r\n\r\n            $('.ui-draggable')\r\n                .on('dragstart', function (event, ui) {\r\n                    $(element).addClass('active');\r\n                    $(this).closest('.drag-and-drop-text-dropspot').removeClass('dropped');\r\n\r\n                    if ($(element).children('.drag-and-drop-text-draggable').length) {\r\n                        return;\r\n                    }\r\n\r\n                    $(element).css('min-width', ui.helper.outerWidth());\r\n                    $(element).height(ui.helper.outerHeight());\r\n\r\n                });\r\n                $('html').on('mouseup', function (event, ui) {\r\n                    $(element).removeClass('active');\r\n                    $(element).css('min-width', '');\r\n                    $(element).css('height', '');\r\n                    $(this).closest('.drag-and-drop-text-dropspot').addClass('dropped');\r\n                });\r\n\r\n            $(element).droppable({\r\n                accept: function (arg) {\r\n                    if ($(element).find(arg).length) {\r\n                        return true;\r\n                    }\r\n\r\n                    return $(element).find('.drag-and-drop-text-draggable').length == 0;\r\n                },\r\n                tolerance: 'intersect',\r\n                scope: scope,\r\n                drop: function (e, ui) {\r\n                    var text = ko.dataFor(ui.draggable.get(0));\r\n\r\n                    ui.draggable.css('left', '').css('top', '').appendTo(this);\r\n\r\n                    if (ko.isWriteableObservable(value.text)) {\r\n                        text.placed(true);\r\n                        value.text(text);\r\n                        text.dropSpot = value;\r\n                        $(element).addClass('dropped');\r\n                    }\r\n                }\r\n            });\r\n\r\n            $(element).css('left', left + 'px').css('top', top + 'px');\r\n        },\r\n        update: function (element, valueAccessor) {\r\n            var value = valueAccessor(),\r\n                text = ko.utils.unwrapObservable(value.text),\r\n                $draggableTextContainer = $('.drag-and-drop-text-draggable-container'),\r\n                draggableTextClass = '.drag-and-drop-text-draggable',\r\n                draggableContainerMessageClass = '.drag-and-drop-text-draggable-container-message';\r\n\r\n            if (text) {\r\n                \r\n                var $textChildren = $draggableTextContainer.children(draggableTextClass);\r\n                $.each($textChildren, function (index, item) {\r\n                    var data = ko.dataFor(item);\r\n                    if (data.text === text.text && data.placed() && $(element).children('.drag-and-drop-text-draggable').length ==0) {\r\n                        data.dropSpot = value;\r\n                        $(item).css('left', '').css('top', '').appendTo($(element));\r\n                    }\r\n                });\r\n                if ($draggableTextContainer.children(draggableTextClass).length) {\r\n                    $draggableTextContainer.children(draggableContainerMessageClass).hide();\r\n                } else {\r\n                    $draggableTextContainer.addClass('empty');\r\n                    $draggableTextContainer.children(draggableContainerMessageClass).show();\r\n                }\r\n            } else {\r\n                $(element).closest('.drag-and-drop-text-dropspot').removeClass('dropped');\r\n                $(element).children(draggableTextClass).css('left', '').css('top', '').appendTo($draggableTextContainer);\r\n                $draggableTextContainer.removeClass('empty');\r\n                $draggableTextContainer.children(draggableContainerMessageClass).hide();\r\n            }\r\n        }\r\n    };\r\n    composition.addBindingHandler('dropspot');\r\n});\n","define('viewmodels/questions/rankingText/bindingHandlers/preventDefaultTouchEventBinding',['knockout'], function (ko) {\n    'use strict';\n\n    ko.bindingHandlers.preventDefaultTouchEvent = {\n        update: function (element, valueAccessor) {\n            if(valueAccessor()) {\n                element.addEventListener(\"touchmove\", preventBehavior, false);\n            }\n\n            function preventBehavior(e) {\n                e.preventDefault(); \n            };\n        }\n    };\n});\n","define('viewmodels/questions/fillInTheBlank/bindingHandlers/fillInTheBlankAnswersBinding',['knockout', 'durandal/composition'], function (ko, composition) {\n    ko.bindingHandlers.fillInTheBlankAnswers = {\n        init: function (element, valueAccessor) {\n            var $element = $(element),\n                value = valueAccessor().inputValues(),\n                content = valueAccessor().content;\n\n            $element.html(content);\n\n            $(\".blankSelect\").select({\n                defaultText: TranslationPlugin.getTextByKey('[fill in the blank choose answer]')\n            });\n\n            _.each(value, function (blank) {\n                var source = $('[data-group-id=' + blank.id + ']', $element),\n                    handler = function () {\n                        blank.value = source.val().trim();\n                    },\n                    stopPropagationHandler = function (event) {\n                        event.stopPropagation();\n                    };\n\n                source.val(undefined)\n                    .on('blur change', handler)\n                    .on('keydown', stopPropagationHandler);\n\n                ko.utils.domNodeDisposal.addDisposeCallback(element, function () {\n                    source.off('blur change', handler);\n                    source.off('keydown', stopPropagationHandler);\n                });\n            });\n        },\n        update: function (element, valueAccessor) {\n            var $element = $(element),\n                isAnswered = ko.utils.unwrapObservable(valueAccessor().isAnswered),\n                inputValues = ko.utils.unwrapObservable(valueAccessor().inputValues);\n\n            if (!isAnswered) {\n                $('.blankSelect')\n                    .select('refresh')\n                    .select('enabled', true);\n\n                $('.blankInput').each(function () {\n                    $(this).val('');\n                    $(this).removeAttr('disabled');\n                });\n            } else {\n                _.each(inputValues, function (blank) {\n                    var $source = $('[data-group-id=' + blank.id + ']', $element);\n                    var defaultText = '...';\n\n                    if ($source.is('input')) {\n                        $source.val(blank.value || defaultText);\n                        $source.attr('disabled', 'disabled');\n                    } else if ($source.is('select')) {\n                        $source.select('updateValue', blank.value || defaultText);\n                        $source.select('enabled', false);\n                    }\n                });\n            }\n        }\n\n    };\n\n    composition.addBindingHandler('fillInTheBlankAnswers');\n\n});\n","define('viewmodels/questions/textMatching/bindingHandlers/draggableBindingHandler',['knockout'], function (ko) {\n\n    ko.bindingHandlers.draggable = {\n        init: function (element, valueAccessor, allBindingsAccessor) {\n            var allBindings = allBindingsAccessor();\n\t\t\t\n\t\t\t$(element).css('touch-action','none');\n            $(element).draggable({\n                appendTo: '.application-wrapper',\n                helper: function () {\n                    return $(element)\n                        .clone()\n                        .addClass('handle')\n                        .css({\n                            width: $(this).outerWidth(),\n                            height: $(this).outerHeight()\n                        });\n                },\n                scope: ko.utils.unwrapObservable(allBindings.scope) || 'default',\n                tolerance: 'pointer',\n                revert: true,\n                revertDuration: 0,\n                start: function () {\n                    $(element).hide();\n                },\n                stop: function () {\n                    $(element).show();\n                }\n            });\n        }\n    }\n\n});\n","define('viewmodels/questions/textMatching/bindingHandlers/droppableBindingHandler',['knockout'], function (ko) {\n\n    ko.bindingHandlers.droppable = {\n        init: function (element, valueAccessor, allBindingsAccessor) {\n            var\n                value = valueAccessor(),\n                allBindings = allBindingsAccessor()\n            ;\n\n            $(element).droppable({\n                accept: function (arg) {\n                    if ($(element).find(arg).length) {\n                        return true;\n                    }\n\n                    if (allBindings.accept) {\n                        return allBindings.accept > $(element).find('.ui-draggable').length;\n                    }\n\n                    return $(arg).hasClass('ui-draggable');\n                },\n                activeClass: 'active',\n                hoverClass: 'hover',\n                tolerance: 'pointer',\n                drop: function (event, ui) {\n                    ui.draggable.trigger('dragstop');\n                    $(ui.helper).remove();\n                   \n                    var draggable = ko.dataFor(ui.draggable.get(0));\n                    var droppable = ko.dataFor(ui.draggable.closest('.ui-droppable').get(0));\n\n                    if (droppable != value) {\n                        if (_.isFunction(value.acceptValue)) {\n                            value.acceptValue(draggable);\n                        }\n\n                        if (_.isFunction(droppable.rejectValue)) {\n                            droppable.rejectValue(draggable);\n                        }\n                    }\n                }\n            });\n\n        }\n    }\n\n});\n","define('viewmodels/questions/textMatching/bindingHandlers/overlayBindingHandler',['knockout'], function (ko) {\n\n    ko.bindingHandlers.overlay = {\n        update: function (element, valueAccessor) {\n            var value = valueAccessor();\n            if (ko.utils.unwrapObservable(value)) {\n                $(element).addClass('overlay-binding-wrapper');\n                $('<div />').addClass('overlay-binding').appendTo(element);\n            } else {\n                $(element).removeClass('overlay-binding-wrapper');\n                $(element).children('.overlay-binding').remove();\n            }\n        }\n    };\n\n});\n","define('viewmodels/questions/textMatching/bindingHandlers/syncHeightBindingHandler',['knockout', 'durandal/composition'], function (ko, composition) {\n\n    ko.bindingHandlers.syncHeight = {\n        init: function (element) {\n            var $element = $(element),\n                handler = function () {\n                    var height = 0;\n                    $element.find('.text-matching-row').each(function () {\n                        $(this).find('.text-matching-column').height('auto');\n                        $(this).height('auto');\n\n                        if ($(this).height() > height) {\n                            height = $(this).height();\n                        }\n                    });\n                    $element.find('.text-matching-row, .text-matching-column').each(function () {\n                        $(this).height(height);\n                    });\n\n                },\n                debounced = _.debounce(handler, 10);\n\n            $(window).on('resize', debounced);\n\n            ko.utils.domNodeDisposal.addDisposeCallback(element, function () {\n                $(window).off('resize', debounced);\n            });\n\n            handler();\n        }\n    };\n\n    composition.addBindingHandler('syncHeight');\n\n});\n","define('viewmodels/questions/openQuestion/bindingHandlers/textAreaBindingHandler',['jquery', 'knockout'], function ($, ko) {\n    ko.bindingHandlers.textArea = {\n        init: function (element, valueAccessor, allBindingsAccessor, data, context) {\n            ko.bindingHandlers.autosize.init(element, valueAccessor, allBindingsAccessor, data, context);\n            ko.bindingHandlers.value.init(element, valueAccessor, allBindingsAccessor, data, context);\n        },\n        update: function (element, valueAccessor, allBindingsAccessor, data, context) {\n            ko.bindingHandlers.value.update(element, valueAccessor, allBindingsAccessor, data, context);\n            ko.bindingHandlers.autosize.update(element, valueAccessor, allBindingsAccessor, data, context);\n        }\n    };\n});\n","define('widgets/imagePreview/viewmodel',['durandal/system', 'durandal/composition', 'durandal/app', 'constants'], function (system, composition, app, constants) {\r\n    \"use strict\";\r\n\r\n    var imagePreviewModel = {\r\n        imageId: ko.observable(null),\r\n        imageUrl: ko.observable(''),\r\n        isVisible: ko.observable(false),\r\n        isLoaded: ko.observable(false),\r\n\r\n        openPreviewImage: openPreviewImage,\r\n        closePreview: closePreview,\r\n        activate: activate\r\n    };\r\n\r\n    return imagePreviewModel;\r\n\r\n    function activate() {\r\n        \r\n    }\r\n\r\n    function openPreviewImage(data) {\r\n        showOverlay();\r\n        setPreviewImage(data);\r\n    }\r\n\r\n    function setPreviewImage(data) {\r\n        imagePreviewModel.imageId(data.id);\r\n        imagePreviewModel.imageUrl(data.image);\r\n    }\r\n\r\n    function showOverlay() {\r\n        imagePreviewModel.isVisible(true);\r\n    }\r\n\r\n    function closePreview() {\r\n        hideOverlay();\r\n    }\r\n\r\n    function hideOverlay() {\r\n        imagePreviewModel.isVisible(false);\r\n        app.trigger(constants.events.imagePreviewClosed, imagePreviewModel.imageId());\r\n    }\r\n});\n","define('viewmodels/questions/singleSelectImage/bindingHandlers/previewImageBinding',['durandal/app', 'constants', 'knockout', 'durandal/composition', 'widgets/imagePreview/viewmodel'],\r\n    function (app, constants, ko, composition, imagePreview) {\r\n        app.on(constants.events.imagePreviewClosed, function (id) {\r\n            $('#' + id).focus();\r\n        });\r\n\r\n        ko.bindingHandlers.previewImage = {\r\n            init: function (element, valueAccessor) {\r\n                var $element = $(element),\r\n                    $data = valueAccessor();\r\n\r\n                if ($data) {\r\n                    $element.on('click', function () {\r\n                        imagePreview.openPreviewImage($data);\r\n                    }).on('keydown', function (event) {\r\n                        if (event.which == 13) {\r\n                            event.preventDefault();\r\n                            event.stopPropagation();\r\n                            $element.click();\r\n                        }\r\n                    });\r\n                }\r\n            }\r\n        };\n\n        composition.addBindingHandler('previewImage');\r\n    });\n","define('widgets/imagePreview/bindingHandlers/fadeBindingHandler',['durandal/composition'], function (composition) {\n    ko.bindingHandlers.fade = {\n        init: function (element, valueAccessor) {\n            var $element = $(element),\n                data = valueAccessor() || {},\n                value = ko.utils.unwrapObservable(data);\n\n            if (value) {\n                $element.stop().show();\n            } else {\n                $element.stop().hide();\n            }\n        },\n        update: function (element, valueAccessor) {\n            var $element = $(element),\n                data = valueAccessor() || {},\n                value = ko.utils.unwrapObservable(data);\n\n            if (value) {\n                $element.stop().fadeIn();\n            } else {\n                $element.stop().fadeOut();\n            }\n        }\n    }\n\n    composition.addBindingHandler('fade');\n})\n;\n","define('widgets/imagePreview/bindingHandlers/imageLoaderBindingHandler',['durandal/composition'], function (composition) {\n    var image = new Image();\n    image.className = 'image';\n    image.style.display = 'none';\n    image.style.width = 'auto'; //Fix for IE\n    image.style.height = 'auto';\n\n    ko.bindingHandlers.imageLoader = {\n        init: function (element, valueAccessor) {\n\n            var $element = $(element),\n                data = valueAccessor() || {},\n                isLoaded = data.isLoaded;\n\n            var resizeHandler = $(window).on('resize', function () {\n                if (isLoaded()) {\n                    updatePreviewImageSize($element);\n                }\n            });\n\n            var orientationChangeHandler = $(window).on(\"orientationchange\", function () {\n                if (isLoaded()) {\n                    updatePreviewImageSize($element);\n                }\n            });\n\n            ko.utils.domNodeDisposal.addDisposeCallback(element, function () {\n                $(window).unbind('resize', resizeHandler);\n                $(window).unbind('orientationchange', orientationChangeHandler);\n            });\n\n            $element.append(image);\n        },\n        update: function (element, valueAccessor) {\n\n            var $element = $(element),\n                data = valueAccessor() || {},\n                isLoaded = data.isLoaded,\n                imageUrl = data.imageUrl();\n            $(image).hide();\n            isLoaded(false);\n\n            var browserWidth = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);\n            var browserHeight = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);\n            var maxSize = browserWidth > browserHeight ? browserWidth : browserHeight;\n\n            var resizedImageUrl = imageUrl + '?height=' + maxSize + '&width=' + maxSize;\n            image.onload = function () {\n                if (data.imageUrl() === imageUrl) {\n                    updatePreviewImageSize($element);\n                    isLoaded(true);\n                    $(image).fadeIn();\n                }\n            }\n            image.src = resizedImageUrl;\n        }\n    }\n\n    function updatePreviewImageSize($element) {\n        var browserWidth = Math.max(document.documentElement.clientWidth, window.innerWidth || 0) - 46; // 46 - padding for close button\n        var browserHeight = Math.max(document.documentElement.clientHeight, window.innerHeight || 0) - 46;\n\n        $('.image', $element).css('maxWidth', browserWidth - 46 + 'px').css('maxHeight', browserHeight - 46 + 'px');\n    }\n\n    composition.addBindingHandler('imageLoader');\n});\n\n","define('dialogs/bindingHandlers/blockBodyScrollBinding',['knockout'], function (ko) {\n    'use strict';\n    \n    ko.bindingHandlers.blockBodyScroll = {\n        update: function (element, valueAccessor) {\n            var isBlocked = ko.utils.unwrapObservable(valueAccessor()),\n                $body = $('body');\n            \n            $body.css({\n                'max-height': isBlocked ? '100vh' : 'none',\n                'overflow': isBlocked ? 'hidden' : 'visible'\n            });\n        }\n    };\n});\n","var css = {\n        ratingContainer: 'rating-container',\n        ratingItem: 'rating-item',\n        ratingItemBtn: 'rating-item-btn',\n        ratingTipContainer: 'rating-tip-container',\n        checked: 'checked',\n        highlighted: 'highlighted'\n    },\n    keys = {\n        rating: 'rating'\n    };\n\nko.bindingHandlers.rating = {\n    init: function(element, valueAccessors) {\n        var $element = $(element),\n            value = ko.utils.unwrapObservable(valueAccessors().value) || 0,\n            max = ko.utils.unwrapObservable(valueAccessors().max) || 5,\n            onValueUpdated = valueAccessors().onValueUpdated;\n\n        var $container = $('<ul>');\n        $container.addClass(css.ratingContainer)\n            .appendTo($element)\n            .mouseleave(function() {\n                $container.children().each(function(index, item) {\n                    $(item).removeClass(css.highlighted);\n                });\n            });\n\n        for (var i = 0; i < max; i++) {\n            var $li = $('<li>');\n            $li.appendTo($container);\n            $li.addClass(css.ratingItem)\n\n            var $item = $('<button>');\n            $item.addClass(css.ratingItemBtn)\n                .data(keys.rating, i + 1)\n                .text(i + 1)\n                .click(function() {\n                    var rating = $(this).data(keys.rating);\n                    valueAccessors().value(rating);\n                    applyRatingStyles(rating, css.checked);\n                    if (_.isFunction(onValueUpdated)) {\n                        onValueUpdated();\n                    }\n                })\n                .hover(function() {\n                    var rating = $(this).data(keys.rating);\n                    applyRatingStyles(rating, css.highlighted);\n                })\n                .appendTo($li);\n        }\n\n        applyRatingStyles(value, css.checked);\n\n        function applyRatingStyles(rating, className) {\n            $container.children().each(function(index, item) {\n                $(item).find('.' + css.ratingItemBtn).toggleClass(className, index < rating);\n            });\n        }\n    }\n};\ndefine(\"dialogs/bindingHandlers/ratingBindingHandler\", function(){});\n\n","define('bootstrapping/knockoutBindingTask',[\n    'bootstrapping/knockoutBindings/areaBinding',\n    'bootstrapping/knockoutBindings/autofocusBinding',\n    'bootstrapping/knockoutBindings/autosizeBinding',\n    'bootstrapping/knockoutBindings/backgroundBinding',\n    'bootstrapping/knockoutBindings/circleProgressBinding',\n    'bootstrapping/knockoutBindings/contextBinding',\n    'bootstrapping/knockoutBindings/elementsWrapBinding',\n    'bootstrapping/knockoutBindings/focusHandlerBinding',\n    'bootstrapping/knockoutBindings/toggleVisibleBindingHandler',\n    'bootstrapping/knockoutBindings/dropDownBinding',\n    'bootstrapping/knockoutBindings/scrollTopBinding',\n    'bootstrapping/knockoutBindings/scrollIntoViewBinding',\n    'bootstrapping/knockoutBindings/contentBlockBinding',\n    'bootstrapping/knockoutBindings/toolTipBindingHandler',\n    'bootstrapping/knockoutBindings/downloadAsPdfBinding',\n    'bootstrapping/knockoutBindings/mediaPlayerBinding',\n    'bootstrapping/knockoutBindings/customFocusBinding',\n    'bootstrapping/knockoutBindings/reviewableBinding',\n    'bootstrapping/knockoutBindings/limitedLengthTextBinding',\n    'bootstrapping/knockoutBindings/scrollbarBinding',\n    'bootstrapping/knockoutBindings/localizeBinding',\n    'bootstrapping/knockoutBindings/fontScaleBinding',\n    'treeOfContent/bindingHandlers/treeOfContentAnimationsBinding',\n    'bootstrapping/knockoutBindings/selectTextBinding',\n    'bootstrapping/knockoutBindings/submitOnEnterBinding',\n    'bootstrapping/knockoutBindings/keyDownBinding',\n    'bootstrapping/knockoutBindings/tabFocusBinding',\n    'bootstrapping/knockoutBindings/copyToClipboardBinding',\n    'bootstrapping/knockoutBindings/changeCssClassByDelayBinding',\n    'bootstrapping/knockoutBindings/containImageBinding',\n    'bootstrapping/knockoutBindings/lessColorBinding',\n    'bootstrapping/knockoutBindings/editableTextBindingHandler',\n    'bootstrapping/knockoutBindings/headerHeightDepender',\n    'viewmodels/questions/dragAndDrop/bindingHandlers/draggableTextBindingHandler',\n    'viewmodels/questions/dragAndDrop/bindingHandlers/draggableTextContainerBindingHandler',\n    'viewmodels/questions/dragAndDrop/bindingHandlers/dropspotBindingHandler',\n    'viewmodels/questions/rankingText/bindingHandlers/preventDefaultTouchEventBinding',\n    'viewmodels/questions/fillInTheBlank/bindingHandlers/fillInTheBlankAnswersBinding',\n    'viewmodels/questions/textMatching/bindingHandlers/draggableBindingHandler',\n    'viewmodels/questions/textMatching/bindingHandlers/droppableBindingHandler',\n    'viewmodels/questions/textMatching/bindingHandlers/overlayBindingHandler',\n    'viewmodels/questions/textMatching/bindingHandlers/syncHeightBindingHandler',\n    'viewmodels/questions/openQuestion/bindingHandlers/textAreaBindingHandler',\n    'viewmodels/questions/singleSelectImage/bindingHandlers/previewImageBinding',\n    'widgets/imagePreview/bindingHandlers/fadeBindingHandler',\n    'widgets/imagePreview/bindingHandlers/imageLoaderBindingHandler',\n    'dialogs/bindingHandlers/blockBodyScrollBinding',\n    'dialogs/bindingHandlers/ratingBindingHandler'\n], function () {\n\n    return {\n        execute: function () { }\n    };\n\n});\n","define('bootstrapping/binders/background',['templateSettings', 'displaySettings'], function (templateSettings, displaySettings) {\n    'use strict';\n\n    ko.bindingHandlers.secondaryBackground = {\n        init: function (element) {\n            var body = templateSettings && templateSettings.background && templateSettings.background.body;\n\n            if (body) {\n                if (body.texture && body.texture.length) {\n                    applyImage(element, body.texture, \"repeat\");\n                }\n\n                if (body.color && body.color.length) {\n                    applyColor(element, body.color);\n                }\n\n                if (body.brightness) {\n                    applyBrightness($('<div />').width('100%').height('100%').appendTo(element), body.brightness);\n                }\n            }\n        }\n    };\n\n    return {\n        apply: applyOnce()\n    };\n\n    function applyOnce() {\n        var executed = false;\n\n        return function () {\n            if (!executed) {\n                executed = true;\n                apply(templateSettings.background);\n            }\n        }\n    }\n\n    function apply(background) {\n\n        var elementsClasses = {\n            body: {\n                element: \"body\",\n                brightness: \".body-layout-wrapper\"\n            }\n        };\n\n        if (background.body.texture && background.body.texture.length) {\n            applyImage(elementsClasses.body.element, background.body.texture);\n        };\n\n        if (background.body.color && background.body.color.length) {\n            applyColor(elementsClasses.body.element, background.body.color);\n        };\n\n        if (background.body.brightness) {\n            applyBrightness(elementsClasses.body.brightness, background.body.brightness);\n        };\n    }\n\n    function applyBrightness(element, brightness) {\n        var $element = $(element);\n\n        if (brightness === 0) {\n            return;\n        }\n\n        $element.css({\n            \"background-color\": brightness > 0 ? 'white' : 'black',\n            \"opacity\": brightness > 0 ? brightness : -brightness\n        });\n    }\n\n    function applyImage(element, url, type) {\n        type = type || \"repeat\";\n\n        var $element = $(element),\n            image = new Image(),\n            position = displaySettings.backgroundSettings[type].position || '0 0',\n            repeat = displaySettings.backgroundSettings[type].repeat || 'no-repeat',\n            size = displaySettings.backgroundSettings[type].size || 'auto';\n\n        image.onload = function () {\n            $element.css({\n                'top': '0',\n                'bottom': '0',\n                'background-image': 'url(' + url + ')',\n                'background-position': position,\n                '-webkit-background-size': size,\n                'background-size': size,\n                'background-repeat': repeat\n            })\n        };\n        image.src = url;\n    }\n\n    function applyColor(element, color) {\n        $(element).css({\n            'background-color': color\n        });\n    }\n\n});\n","define('bootstrapping/binderTask',['durandal/binder', './binders/background'], function (binder, background) {\n\n    return {\n        execute: function () {\n            binder.binding = function (obj, view) {\n                TranslationPlugin.localize(view);\n                background.apply();\n            }\n        }\n    };\n\n});\n","define('routing/routerExtender',['plugins/router'], function (router) {\n    \"use strict\";\n\n    function execute() {\n\n        router.isNavigationLocked = ko.observable(false);\n\n        router.activeInstruction.subscribe(function (instruction) {\n            if (_.isObject(instruction)\n                && !_.isNullOrUndefined(instruction.queryParams)\n                && !_.isNullOrUndefined(instruction.queryParams.lock)) {\n\n                var lock = instruction.queryParams.lock.toLowerCase() == \"true\";\n                router.isNavigationLocked(lock);\n\n                var activationData = instruction.params;\n                _.each(activationData, function (item) {\n                    if (_.isObject(item) && !_.isNullOrUndefined(item.lock)) {\n                        delete item['lock'];\n                    }\n\n                    if (_.isEmpty(item)) {\n                        var i = _.indexOf(activationData, item);\n                        activationData.splice(i, 1);\n                    }\n                });\n\n                instruction.params = activationData;\n            }\n        });\n\n        router.getQueryStringValue = function (key) {\n            var urlParams = window.location.href;\n            var regex = new RegExp(\"[\\\\?&]\" + key + \"=([^&#]*)\");\n            var results = regex.exec(urlParams);\n            return results === null ? null : decodeURIComponent(results[1].replace(/\\+/g, \" \"));\n        };\n\n    }\n\n    return {\n        execute: execute\n    };\n});\n","define('bootstrapping/routingTask',['routing/routerExtender'], function (extender) {\n    \"use strict\";\n\n    var task = {\n        execute: execute\n    };\n\n    return task;\n\n    function execute() {\n        extender.execute();\n    }\n\n});\n","define('bootstrapping/reviewTask',['plugins/router', 'durandal/app', 'context', 'constants', 'templateSettings'], function (router, app, context, constants, templateSettings) {\n    \"use strict\";\n\n    var task = {\n        execute: execute\n    };\n\n    return task;\n\n    function execute() {\n        if (!supportedBrowser.isBrowserSupported())\n            return;\n\n        var reviewApiUrl = router.getQueryStringValue('reviewApiUrl');\n        if (!reviewApiUrl)\n            return;\n\n        postMessage({ supportsNativeReview: true });\n\n        app.on(constants.events.appInitialized, function () {\n            pluginsLocalizationService.init(templateSettings.languages.selected);\n\n            var reviewPlugin = new ReviewPlugin();\n            reviewPlugin.init({\n                reviewApiUrl: decodeURIComponent(reviewApiUrl),\n                courseId: context.course.id\n            });\n\n            router.on('router:navigation:composition-complete').then(function () {\n                reviewPlugin.renderSpots();\n            });\n        });\n\n        function postMessage(data) {\n            var editorWindow = window.parent;\n            editorWindow.postMessage(data, '*');\n        }\n    }\n});\n","define('bootstrapping/cssCustomBrowserFixTask',[],function () {\n    \"use strict\";\n\n    var task = {\n        execute: execute\n    };\n\n    var mainFolder = 'css/';\n\n    var browsers = {\n        ie: {\n            pattern: /MSIE|Trident\\//i,\n            css: 'ie.css?v=1552304184357'\n        },\n        edge: {\n            pattern: /Edge/i,\n            css: 'edge.css?v=1552304184357'\n        },\n    };\n\n    return task;\n\n    function execute() {\n        for(var key in browsers) {\n            var browser = browsers[key];\n\n            if(browser.pattern.test(navigator.userAgent)) {\n                addStyle(browser.css?v=1552304184357);\n            }\n        }\n    }\n\n    function addStyle(name) {\n        var head  = document.getElementsByTagName('head')[0];\n        var link  = document.createElement('link');\n\n        link.rel  = 'stylesheet';\n        link.type = 'text/css';\n        link.href = mainFolder + name;\n        link.media = 'all';\n\n        head.appendChild(link);\n    }\n\n});\n","define('bootstrapper.tasks',['require','bootstrapping/browserSupportTask','bootstrapping/viewLocatorTask','bootstrapping/knockoutBindingTask','bootstrapping/binderTask','bootstrapping/routingTask','bootstrapping/reviewTask','bootstrapping/cssCustomBrowserFixTask'],function (require) {\n    return {\n        getCollection: function () {\n            return [\n                require('bootstrapping/browserSupportTask'),\n                require('bootstrapping/viewLocatorTask'),\n                require('bootstrapping/knockoutBindingTask'),\n                require('bootstrapping/binderTask'),\n                require('bootstrapping/routingTask'),\n                require('bootstrapping/reviewTask'),\n                require('bootstrapping/cssCustomBrowserFixTask')\n            ];\n        }\n    };\n});\n","define('bootstrapper',['durandal/system', 'bootstrapper.tasks'], function (system, tasks) {\n\n    return {\n        run: run\n    };\n\n\n    function run() {\n        _.each(tasks.getCollection(), function (task) {\n            if (_.isFunction(task.execute)) {\n                task.execute();\n            } else {\n                system.log('Bootstrapper task ' + system.getModuleId(task) + 'is not executable');\n            }\n        });\n     }\n});\n","define('includedModules/moduleLoader',[],function () {\n\n    return {\n        loadModule: loadModule\n    };\n\n    function loadModule(modulePath) {\n        var defer = Q.defer();\n        require([modulePath],\n            function (module) {\n                defer.resolve(module);\n            },\n            function (error) {\n                defer.reject({ modulePath: error.requireModules && error.requireModules[0], messsage: error.message });\n            });\n\n        return defer.promise;\n    }\n});\n\n","define('modules/progress/progressStorage/httpWrapper',['jquery'], function ($) {\n    'use strict';\n\n    return {\n        get: get,\n        post: post\n    };\n\n    function get(url, query, headers) {\n        return $.ajax(url, {\n            data: query,\n            headers: headers,\n            cache: false\n        });\n    }\n\n    function post(url, data, headers) {\n        return $.ajax(url, {\n            method: 'POST',\n            data: data,\n            headers: headers,\n            cache: false\n        });\n    }\n\n});\n","define('modules/progress/progressStorage/urlProvider',[\"q\", \"publishSettings\"], function(Q, publishSettings) {\n  \"use strict\";\n\n  function UrlProvider() {\n    this.progressStorageUrl = '';\n    this.courseLink = '';\n  }\n\n  UrlProvider.prototype.initialize = initialize;\n\n  var instance = new UrlProvider();\n\n  return instance;\n\n  function initialize() {\n    var self = this;\n    return Q.fcall(function() {\n      self.progressStorageUrl = publishSettings.progressStorageUrl\n        ? '//' + publishSettings.progressStorageUrl + '/'\n        : '//progress-storage.easygenerator.com/';\n\n      self.courseLink =\n        window.location.protocol +\n        '//' +\n        window.location.host +\n        window.location.pathname +\n        '#/';\n    });\n  }\n});\n\n","define('modules/progress/progressStorage/auth',['./httpWrapper', './urlProvider'], function (httpWrapper, urlProvider) {\n    'use strict';\n\n    var _private = {\n        tokenKey: 'token.auth.template',\n        shortTermAccessKey: 'shortTermAccess.auth.template',\n        getToken: function () {\n            return localStorage.getItem(_private.tokenKey);\n        },\n        removeToken: function () {\n            localStorage.removeItem(_private.tokenKey);\n        }\n    };\n\n    var auth = {};\n\n    Object.defineProperty(auth, 'headers', {\n        get: function () {\n            return {\n                'x-access-token': _private.getToken()\n            };\n        }\n    });\n\n    Object.defineProperty(auth, 'authenticated', {\n        get: function () {\n            return _private.getToken() !== null;\n        }\n    });\n\n    Object.defineProperty(auth, 'shortTermAccess', {\n        get: function () {\n            return localStorage.getItem(_private.shortTermAccessKey) === 'true';\n        },\n        set: function (value) {\n            if (typeof value !== 'undefined' && value !== '') {\n                localStorage.setItem(_private.shortTermAccessKey, value);\n            } else if(value === ''){\n                localStorage.removeItem(_private.shortTermAccessKey);\n            }\n        }\n    })\n\n    auth.setToken = function (value) {\n        if (typeof value !== 'undefined') {\n            localStorage.setItem(_private.tokenKey, value);\n        }\n    };\n\n    auth.exists = function (email) {\n        return httpWrapper.post(urlProvider.progressStorageUrl + 'user/exists', {\n            email: email\n        });\n    };\n\n    auth.identify = function (email) {\n        return httpWrapper.post(urlProvider.progressStorageUrl + 'user', {\n            email: email\n        }, auth.headers);\n    };\n\n    auth.signin = function (email, password, rememberMe) {\n        return httpWrapper.post(urlProvider.progressStorageUrl + 'user/signin', {\n            email: email,\n            password: password,\n            shortTermAccess: !rememberMe\n        }).then(function (response) {\n            auth.setToken(response.token);\n            auth.shortTermAccess = !rememberMe;\n        });\n    };\n\n    auth.register = function (email, password, name, rememberMe) {\n        return httpWrapper.post(urlProvider.progressStorageUrl + 'user/register', {\n            email: email,\n            password: password,\n            name: name,\n            shortTermAccess: !rememberMe\n        }).then(function (response) {\n            auth.setToken(response.token);\n            auth.shortTermAccess = !rememberMe;\n        });\n    };\n\n    auth.getValueFromUrl = function (key) {\n        key = key || 'token';\n        var url = window.location.href,\n            regex = new RegExp('[?&]' + key + '(=([^&#]*)|&|#|$)', 'i'),\n            result = regex.exec(url);\n\n        if (!result || !result[2]) {\n            return null;\n        }\n\n        return decodeURIComponent(result[2].replace(/\\+/g, ' '));\n    };\n\n    auth.signout = function () {\n        _private.removeToken();\n        auth.shortTermAccess = '';\n    };\n\n    auth.sendSecreLink = function (email, courseTitle, password) {\n        return httpWrapper.post(urlProvider.progressStorageUrl + 'link', {\n            email: email,\n            password: password || null,\n            courseTitle: courseTitle,\n            courseLink: urlProvider.courseLink,\n            sendMail: true,\n            returnLink: false\n        }).then(function (response) {\n            auth.setToken(response.token);\n        });\n    };\n\n    auth.forgotpassword = function(email){\n        return httpWrapper.post(urlProvider.progressStorageUrl + 'user/forgotpassword', {\n            email: email,\n            returnUrl: urlProvider.courseLink\n        });\n    }\n\n    return auth;\n\n});\n","define('helpers/loginHelper',['plugins/router', 'q', 'constants', 'modules/progress/progressStorage/auth', 'templateSettings'], function (router, Q, constants, auth, templateSettings) {\n\n    function LoginHelper() {\n        this.token = '';\n        this.email = '';\n        this.username = '';\n    }\n\n    var instance = new LoginHelper();\n\n    LoginHelper.prototype.initialize = initialize.bind(instance);\n\n    LoginHelper.prototype.getLoginMethod = getLoginMethod.bind(instance);\n\n    return instance;\n\n    function initialize() {\n        var self = this;\n        return Q.fcall(function() {\n            self.token = auth.getValueFromUrl('token');\n            self.email = router.getQueryStringValue('email');\n            self.username = router.getQueryStringValue('name');\n        });\n    }\n\n    function getLoginMethod() {\n        if(this.token) {\n            return constants.loginTypes.byToken;\n        } else if (this.email && this.username && templateSettings.allowCrossDeviceSaving) {\n            return constants.loginTypes.byEmailAndName;\n        } else if (this.email && this.username && !templateSettings.allowCrossDeviceSaving) {\n            return constants.loginTypes.byEmailAndNameWithoutCrossDeviceSaving;\n        }\n\n        return constants.loginTypes.default;\n    }\n});\n","define('userContext',['plugins/router', 'durandal/app', 'helpers/loginHelper'], function(router, app, loginHelper) {\n\n    var _initialized = false;\n\n    var context = {\n        use: use,\n        initialize: initialize,\n        getCurrentUser: getCurrentUser,\n        user: new UserContext(),\n        clear: clear\n    };\n    \n    return context;\n\n    function UserContext() {\n        this.account = null;\n        this.email = '';\n        this.username = '';\n        this.password = null;\n        this.keepMeLoggedIn = false;\n    }\n\n    function getCurrentUser() {\n        return (context.user.email || context.user.account) && context.user.username ? context.user : null;\n    }\n\n    function use(userInfoProvider) {\n        if(!userInfoProvider) {\n            return;\n        }\n        var accountId = userInfoProvider.getAccountId(),\n            accountHomePage = userInfoProvider.getAccountHomePage(),\n            username = userInfoProvider.getUsername();\n        if(!accountId || !accountHomePage || !username) {\n            return;\n        }\n        context.user.email = accountId;\n        context.user.username = username;\n        context.user.account = {\n            homePage: accountHomePage,\n            name: accountId\n        };\n        _initialized = true;\n    }\n\n    function clear() {\n        context.user = new UserContext();\n    }\n\n    function initialize() {\n        return Q.fcall(function () {\n            if(_initialized){\n                return;\n            }\n            \n            app.on('user:authenticated').then(authenticated);\n\n            var username = loginHelper.username,\n                email = loginHelper.email;\n\n            if (username || email) {\n                context.user.email = email ? email : '';\n                context.user.username = username ? username : '';\n            }\n\n            _initialized = true;\n        });\n    }\n\n    function authenticated(authenticatedUser) {\n        context.user.email = authenticatedUser.email;\n        context.user.username = authenticatedUser.username;\n    }\n});\n","define('progressContext',['durandal/system', 'durandal/app', 'plugins/router', 'eventManager', 'context', 'userContext', 'constants'],\n    function (system, app, router, eventManager, dataContext, userContext, constants) {\n\n        var\n            statuses = constants.progressContext.statuses,\n            self = {\n                storage: null,\n                progress: {\n                    url: null,\n                    answers: {},\n                    user: null,\n                    attemptId: system.guid(),\n                    finished: false\n                }\n            },\n            context = {\n                get: get,\n                remove: remove,\n                finish: finish,\n\n                use: use,\n                ready: ready,\n                restoreProgress: restoreProgress,\n\n                status: ko.observable(statuses.undefined)\n            };\n\n        return context;\n\n        function save() {\n            if (!self.storage) {\n                return;\n            }\n\n            var savedProgressResults = self.storage.saveProgress(self.progress);\n            if (_.isObject(savedProgressResults) && _.isFunction(savedProgressResults.then)\n                && _.isFunction(savedProgressResults.fail)) {\n                savedProgressResults.then(function () {\n                    context.status(statuses.saved);\n                }).fail(function () {\n                    context.status(statuses.error);\n                });\n            } else {\n                context.status(savedProgressResults ? statuses.saved : statuses.error);\n            }\n\n            saveResults();\n            return savedProgressResults;\n        }\n\n        function navigated(obj, instruction) {\n            if (self.progress.finished) {\n                return;\n            }\n\n            if (instruction.config.moduleId === 'xApi/viewmodels/xAPIError' ||\n                instruction.config.moduleId === 'viewmodels/404' ||\n                instruction.config.moduleId === 'account/account' ||\n                instruction.config.moduleId === 'account/signin/index' ||\n                instruction.config.moduleId === 'account/register/index' ||\n                instruction.config.moduleId === 'account/limitAccess/index') {\n                return;\n            }\n            if (_.isNull(self.progress.url)) {\n                self.progress.url = instruction.fragment;\n                save();\n            } else if (self.progress.url != instruction.fragment) {\n                self.progress.url = instruction.fragment;\n                save();\n            }\n        }\n\n        function authenticated(user) {\n            self.progress.user = user;\n        }\n\n        function authenticationSkipped() {\n            self.progress.user = 0;\n        }\n\n        function questionAnswered(question) {\n            try {\n                self.progress.answers[question.shortId] = question.progress();\n                save();\n            } catch (e) {\n                console.error(e);\n            }\n        }\n\n        function finish(callback) {\n            callback = callback || function () { };\n\n            if (self.progress) {\n                self.progress.finished = true;\n                var promise = save();\n                if (_.isObject(promise) && _.isFunction(promise.then)) {\n                    promise.then(callback);\n                    return;\n                }\n            }\n\n            callback();\n        }\n\n        function get() {\n            return self.progress;\n        }\n\n        function remove(callback) {\n            callback = callback || function () { };\n            if (!self.storage) {\n                callback();\n                return;\n            }\n            saveResults();\n            if (_.isFunction(self.storage.removeProgress)) {\n                var promise = self.storage.removeProgress();\n                if (_.isObject(promise) && _.isFunction(promise.then)) {\n                    promise.then(callback);\n                } else {\n                    callback();\n                }\n            } else {\n                callback();\n            }\n        }\n\n        function saveResults() {\n            if (_.isFunction(self.storage.saveResults)) {\n                self.storage.saveResults();\n            }\n        }\n\n        function use(storage) {\n            if (_.isFunction(storage.getProgress) && _.isFunction(storage.saveProgress)) {\n                clear();\n\n                self.storage = storage;\n\n                restore(userContext.getCurrentUser());\n\n                eventManager.subscribeForEvent(eventManager.events.answersSubmitted).then(questionAnswered);\n\n                app.on('user:authenticated').then(authenticated);\n                app.on('user:authentication-skipped').then(authenticationSkipped);\n\n                router.on('router:route:activating', navigated);\n\n                window.onbeforeunload = function () {\n                    if (context.status() === statuses.error) {\n                        return TranslationPlugin.getTextByKey('[progress cannot be saved]');\n                    }\n                }\n            } else {\n                throw 'Cannot use this storage';\n            }\n        }\n\n        function ready() {\n            return !!self.storage;\n        }\n\n        function clear() {\n            self = {\n                storage: null,\n                progress: {\n                    url: null,\n                    answers: {},\n                    user: null,\n                    attemptId: system.guid(),\n                    finished: false\n                }\n            }\n        }\n\n        function restore(user) {\n            var progress = self.storage.getProgress();\n            if (!_.isEmpty(progress) &&\n                _.isString(progress.attemptId) &&\n                ((!user) || (!progress.user) || (user.username == progress.user.username && user.email == progress.user.email))) {\n                self.progress = progress;\n            }\n        }\n\n        function restoreProgress() {\n            dataContext.initialize();\n            var progress = null;\n\n            if (context.ready()) {\n                progress = context.get();\n                if (_.isObject(progress)) {\n                    if (progress.finished) {\n                        dataContext.course.finish(null, true);\n                    }\n                    if (_.isObject(progress.answers)) {\n                        _.each(dataContext.course.sections, function (section) {\n                            _.each(section.questions, function (question) {\n                                if (!_.isNullOrUndefined(progress.answers[question.shortId])) {\n                                    question.progress(progress.answers[question.shortId]);\n                                }\n                                if (progress.finished) {\n                                    question.markAsAnswered();\n                                }\n                            });\n                        });\n                    }\n                }\n                window.location.hash = !_.isString(progress.url) ? '' : progress.url.replace('objective', 'section'); //fix for old links\n            }\n        }\n    });\n","define('errorTracking/ravenWrapper',[],function() {\n  function RavenWrapper() {\n    var self = this;\n\n    self.raven = window.Raven;\n\n    self.initialize = function(\n      errorTrackingServiceUrl,\n      email\n    ) {\n      if (!self.raven) {\n        return;\n      }\n\n      self.raven.config(errorTrackingServiceUrl, {\n        logger: 'javascript',\n        ignoreErrors: [\n          'LMSSetValue',\n          'LMSInitialize',\n          'LMSCommit'\n        ],\n        ignoreUrls: [\n          /vendor\\.min\\.js/\n        ],\n        autoBreadcrumbs: {\n          xhr: true,\n          console: false,\n          dom: true,\n          location: true\n        }\n      }).install();\n\n      self.raven.setUserContext({ email: email });\n    };\n\n    self.captureError = function(error) {\n      if (!self.raven || !error) {\n        return;\n      }\n\n      self.raven.captureMessage(error, { level: 'error' });\n    };\n  }\n  return new RavenWrapper();\n});\n\n","define('errorTracking/errorTracker',[\"underscore\", \"errorTracking/ravenWrapper\", \"durandal/app\"], function(\n  _,\n  ravenWrapper,\n  app\n) {\n  function ErrorTracker() {\n    return {\n      init: init,\n      trackError: trackError\n    };\n\n    function init(errorTrackingServiceUrl) {\n      if (!errorTrackingServiceUrl) {\n        return;\n      }\n\n      app\n        .on(\"user:authenticated\")\n        .then(function (userInfo) {\n          ravenWrapper.initialize(errorTrackingServiceUrl, userInfo.email)\n        });\n    }\n\n    function trackError(error) {\n      if(!error) {\n        return;\n      }\n\n      ravenWrapper.captureError(error);\n    }\n  }\n  return new ErrorTracker();\n});\n\n","define('includedModules/appExtender',['eventManager', 'progressContext', 'userContext', 'errorTracking/errorTracker'],\n    function (eventManager, progressContext, userContext, errorTracker) {\n        'use strict';\n\n        return {\n            extend: extend\n        };\n\n        function extend(module) {\n            if (_.isFunction(module.courseFinished)) {\n                eventManager.subscribeForEvent(eventManager.events.courseFinished).then(module.courseFinished);\n            }\n            if (_.isFunction(module.courseFinalized)) {\n                eventManager.subscribeForEvent(eventManager.events.courseFinalized).then(module.courseFinalized);\n            }\n            if (_.isFunction(module.addErrorHandler)) {\n                module.addErrorHandler(errorTracker.trackError);\n            }\n            if (_.isObject(module.userInfoProvider)) {\n                userContext.use(module.userInfoProvider);\n            }\n            if (_.isObject(module.progressProvider)) {\n                progressContext.use(module.progressProvider);\n            }\n        }\n    });\n","define('includedModules/modulesInitializer',['underscore', 'q', './moduleLoader', './appExtender'],\n    function (_, Q, moduleLoader, appExtender) {\n        'use strict';\n\n        var _loadedModules = [];\n\n        return {\n            hasModule: hasModule,\n            load: load\n        };\n\n        function hasModule(moduleName) {\n            moduleName = moduleName || '';\n            return _.contains(_loadedModules, moduleName);\n        }\n\n        function load(modules) {\n            var modulesIds = _.map(modules, function(module){\n                return module.name;\n            });\n\n            var defer = Q.defer();\n\n\n            loadModulesSequentially();\n\n            return defer.promise;\n\n            function loadModulesSequentially() {\n                if (modulesIds.length == 0) {\n                    defer.resolve();\n                    return;\n                }\n\n\n                var module = modulesIds.shift();\n                moduleLoader.loadModule('../includedModules/' + module)\n                    .then(initializeModule)\n                    .then(extendAppFromModule)\n                    .then(function () {\n                        _loadedModules.push(module);\n                        loadModulesSequentially();\n                    })\n                    .fail(onModuleLoadingFailed);\n            }\n        }\n\n        function initializeModule(module) {\n            return Q.fcall(function () {\n                if (_.isFunction(module.initialize)) {\n                    module.initialize();\n                }\n                return module;\n            });\n        }\n\n        function extendAppFromModule(module) {\n            appExtender.extend(module);\n        }\n\n        function onModuleLoadingFailed(error) {\n            throw 'Cannot load module\"' + error.modulePath + '\". because of next error \"' + error.message + '\".';\n        }\n    }\n);\n","define('modules/index',[],function(){\n    'use strict';\n\n    return {\n        init: init\n    };\n\n    function init(templateSettings, manifest, publishSettings, customisations){\n        var promises = [];\n\n        window.WebFontLoader && promises.push(window.WebFontLoader.load(templateSettings.fonts, manifest, publishSettings));\n        window.LessProcessor && promises.push(window.LessProcessor.load(templateSettings.colors, templateSettings.fonts));\n        window.LessProcessor && customisations && customisations.styles && promises.push(window.LessProcessor.loadCustomStyles(customisations.styles));\n        \n        return Q.all(promises);\n    }\n});\n\n","define('modules/publishModeProvider',['includedModules/modulesInitializer', 'templateSettings'], function(modulesInitializer, templateSettings) {\n\n    \"use strict\";\n\n    var viewmodel = {\n        init: init,\n        isPreview: false,\n        isScormEnabled: false,\n        isReview: false\n    };\n\n    function init(publishMode) {\n        if (publishMode === 'Lms') {\n            viewmodel.isScormEnabled = modulesInitializer.hasModule('lms');\n            templateSettings.allowCrossDeviceSaving = false;\n        }\n        if (publishMode === 'Review') {\n            viewmodel.isReview = true;\n        }\n        if (publishMode === 'Preview') {\n            viewmodel.isPreview = true;\n        }\n\n        if (viewmodel.isPreview || viewmodel.isReview) {\n            templateSettings.allowCrossDeviceSaving = false;\n            templateSettings.xApi.enabled = false;\n            templateSettings.nps.enabled = false;\n        }\n    }\n\n    return viewmodel;\n});\n","requirejs.config({\r\n    paths: {\r\n        'text': '../js/text',\r\n        'durandal': '../js/durandal',\r\n        'plugins': '../js/durandal/plugins',\r\n        'transitions': '../js/durandal/transitions'\r\n    }\r\n});\r\n\r\ndefine('jquery', function () {\r\n    return jQuery;\r\n});\r\ndefine('knockout', function () {\r\n    return ko;\r\n});\r\ndefine('WebFont', function () {\r\n    return WebFont;\r\n});\r\ndefine('q', function () {\r\n    return Q;\r\n});\r\ndefine('underscore', function () {\r\n    return _;\r\n});\r\ndefine('perfectScrollbar', function () {\r\n    return Ps;\r\n});\r\n\r\ndefine('less', function () {\r\n    return less;\r\n});\r\n\r\ndefine('download', function () {\r\n    return download;\r\n});\r\n\r\ndefine('main',['durandal/app', 'durandal/system', 'underscore', 'bootstrapper', 'templateSettings', 'publishSettings', 'includedModules/modulesInitializer',\r\n        'modules/index', 'modules/publishModeProvider', 'errorTracking/errorTracker'\r\n    ],\r\n    function (app, system, _, bootstrapper, templateSettings, publishSettings, modulesInitializer, modulesLoader, publishModeProvider, errorTracker) {\r\n        app.title = 'easygenerator';        \r\n\r\n        system.debug(false);\r\n\r\n        app.configurePlugins({\r\n            router: true,\r\n            dialog: true,\r\n            http: true,\r\n            widget: true\r\n        });\r\n\r\n        app.start().then(function () {\r\n            bootstrapper.run();\r\n\r\n            return ConfigurationReader.read().then(function (configsFiles) {\r\n                var configs = ConfigurationReader.init(configsFiles);\r\n                templateSettings.init(configs.templateSettings);\r\n                TranslationPlugin.init(configs.translations);\r\n                publishSettings.init(configsFiles.publishSettings);\r\n\r\n                return modulesLoader.init(templateSettings, configsFiles.manifest, publishSettings, configsFiles.customisations).then(function () {\r\n                    if (publishSettings.modules) {\r\n                        return modulesInitializer.load(publishSettings.modules).then(function () {\r\n                            initializeApp(publishSettings.publishMode, publishSettings.errorTrackingServiceUrl, templateSettings.errorTracking);\r\n                        });\r\n                    } else {\r\n                        initializeApp(publishSettings.publishMode, publishSettings.errorTrackingServiceUrl, templateSettings.errorTracking);\r\n                    }\r\n                });\r\n            }).catch(function (e) {\r\n                console.error(e);\r\n            });\r\n        });\r\n\r\n        function initializeApp(publishMode, errorTrackingServiceUrl, errorTracking) {\r\n            if (errorTrackingServiceUrl && errorTracking.enabled) {\r\n                errorTracker.init(errorTrackingServiceUrl);\r\n            }\r\n            publishModeProvider.init(publishMode);\r\n            app.setRoot('viewmodels/shell');\r\n        }\r\n    });\r\n\n","define('account/header/index',[],function(){\n\t'use strict';\n\n\tvar _instance = null;\n\n\tfunction Header(courseTitle){\n\t\tif (_instance) {\n\t\t\treturn _instance;\n\t\t}\n\t\tthis.courseTitle = courseTitle;\n\t\tthis.isCourseTitleTooLong = this.courseTitle > 100;\n\t}\n\n\treturn Header;\n});\n\n","define('account/socialNetworks/index',[],function () {\n    'use strict';\n\n    var _instance = null;\n\n    var _getAuthLink = function (courseTitle, progressStorageUrl, socialNetwork) {\n        return progressStorageUrl + 'auth/' + socialNetwork +\n            '?courseLink=' + encodeURIComponent(window.location.href) +\n            '&courseTitle=' + encodeURIComponent(courseTitle);\n    };\n\n    function SocialNetworks(courseTitle, progressStorageUrl) {\n        if (_instance) {\n\t\t\treturn _instance;\n\t\t}\n        var getAuthLink = _getAuthLink.bind(this, courseTitle, progressStorageUrl);\n        this.facebookAuthLink = getAuthLink('facebook');\n        this.linkedinAuthLink = getAuthLink('linkedin');\n        this.googleAuthLink = getAuthLink('google');\n    }\n\n    return SocialNetworks;\n});\n","define('account/helpers/validatedValue',['knockout'], function(ko) {\n    'use strict';\n\n    return function (validateCallback){\n        var value = ko.observable('');\n        value.trim = function() {\n            value(ko.utils.unwrapObservable(value).trim());\n        };\n        value.isValid = ko.computed(validateCallback.bind(null, value));\n        value.isModified = ko.observable(false);\n        value.hasFocus = ko.observable(false);\n        value.markAsModified = function() {\n            value.isModified(true);\n            return value;\n        };\n        return value; \n    }\n});\n","define('xApi/constants',[],\n    function () {\n\n        var verbs = {\n            started: {\n                id: \"http://adlnet.gov/expapi/verbs/launched\",\n                display: {\n                    \"en-US\": \"started\"\n                }\n            },\n            stopped: {\n                id: \"http://adlnet.gov/expapi/verbs/exited\",\n                display: {\n                    \"en-US\": \"stopped\"\n                }\n            },\n            passed: {\n                id: \"http://adlnet.gov/expapi/verbs/passed\",\n                display: {\n                    \"en-US\": \"passed\"\n                }\n            },\n            failed: {\n                id: \"http://adlnet.gov/expapi/verbs/failed\",\n                display: {\n                    \"en-US\": \"failed\"\n                }\n            },\n            experienced: {\n                id: \"http://adlnet.gov/expapi/verbs/experienced\",\n                display: {\n                    \"en-US\": \"experienced\"\n                }\n            },\n            answered: {\n                id: \"http://adlnet.gov/expapi/verbs/answered\",\n                display: {\n                    \"en-US\": \"answered\"\n                }\n            },\n            mastered: {\n                id: \"http://adlnet.gov/expapi/verbs/mastered\",\n                display: {\n                    \"en-US\": \"mastered\"\n                }\n            },\n            progressed: {\n                id: \"http://adlnet.gov/expapi/verbs/progressed\",\n                display: {\n                    \"en-US\": \"progressed\"\n                }\n            },\n            evaluated: {\n                id: \"http://www.tincanapi.co.uk/verbs/evaluated\",\n                display: {\n                    \"en-US\": \"evaluated\"\n                }\n            }\n        };\n\n        var interactionTypes = {\n            choice: \"choice\",\n            fillIn: \"fill-in\",\n            matching: \"matching\",\n            dragAndDrop: \"dragAndDrop\",\n            hotspot: \"hotspot\",\n            sequencing: 'sequencing',\n            other: \"other\"\n        };\n\n        var activityTypes = {\n            course: \"http://adlnet.gov/expapi/activities/course\",\n            objective: \"http://adlnet.gov/expapi/activities/objective\"\n        }\n\n        var extenstionKeys = {\n            courseId: \"http://easygenerator/expapi/course/id\",\n            surveyMode: \"http://easygenerator/expapi/question/survey\",\n            questionType: \"http://easygenerator/expapi/question/type\",\n            imageUrl: \"http://easygenerator/expapi/question/imageUrl\",\n            content: \"http://easygenerator/expapi/question/content\",\n            answerTexts: \"http://easygenerator/expapi/question/answers\",\n        };\n\n        var patterns = {\n            email: /^[^@\\s]+@[^@\\s]+$/,\n            isoDuration: /^PT[0-9]{1,2}H[0-9]{1,2}M[0-9]{1,2}S$/\n        };\n\n        return {\n            verbs: verbs,\n            interactionTypes: interactionTypes,\n            activityTypes: activityTypes,\n            extenstionKeys: extenstionKeys,\n            patterns: patterns\n        };\n    }\n);\n","define('account/limitAccess/accessLimiter',['underscore'], function (_) {\n\n    \"use strict\";\n\n    var accessLimitation = { enabled: false };\n\n    function accessLimitationEnabled() {\n        return accessLimitation.enabled;\n    }\n    function userHasAccess(user) {\n        if (!accessLimitationEnabled())\n            return true;\n\n        return _.some(accessLimitation.allowedUsers, function(item) {\n            return _.isString(item.email) && (item.email.trim().toLowerCase() === user.email.trim().toLowerCase());\n        });\n    }\n    function initialize(accessLimitationSettings) {\n        if (!accessLimitationSettings)\n            return;\n\n        accessLimitation = accessLimitationSettings;\n    }\n\n    return {\n        userHasAccess: userHasAccess,\n        accessLimitationEnabled: accessLimitationEnabled,\n        initialize: initialize\n    };\n});\n","define('xApi/configuration/routes',[], function () {\n\n    return [\n        {\n            route: 'xapierror(/:backUrl)',\n            moduleId: 'xApi/viewmodels/xAPIError',\n            title: 'xAPI Error'\n        }\n    ];\n\n});\n","define('xApi/routingManager',['plugins/router', './configuration/routes'], function(router, routes) {\n    'use strict';\n\n    return {\n        mapRoutes: function() {\n            router.map(routes);\n        }\n    };\n});\n","define('xApi/configuration/xApiSettings',['../constants', 'publishSettings'],\n    function (constants, publishSettings) {\n\n        var settings = {\n            scoresDistribution: {\n                positiveVerb: constants.verbs.passed\n            },\n\n            anonymousCredentials: {\n                username: \"\",\n                password: \"\"\n            },\n\n            xApi: {\n                allowedVerbs: []\n            },\n\n            timeout: 120000,//2 minutes\n\n            defaultLanguage: \"en-US\",\n            xApiVersion: \"1.0.0\",\n\n            initxApi: initxApi,\n            initNps: initNps\n        };\n\n\n        var lrsHost = publishSettings.defaultLRSUrl || 'reports.easygenerator.com';\n\n        var defaultXapi = {\n            lrs: {\n                uri: '//' + lrsHost + '/xApi/statements',\n                authenticationRequired: false,\n                credentials: {\n                    username: '',\n                    password: ''\n                }\n            },\n            allowedVerbs: ['started', 'stopped', 'experienced', 'mastered', 'answered', 'passed', 'failed', 'progressed']\n        };\n\n        var npsHost = publishSettings.defaultNpsUrl || 'nps.easygenerator.com';\n\n        var defaultNps = {\n            nps: {\n                uri: '//' + npsHost + '/xApi/statements',\n                authenticationRequired: false,\n                credentials: {\n                    username: '',\n                    password: ''\n                }\n            }\n        };\n\n        return settings;\n\n        function initxApi(templateSettings) {\n            $.extend(settings.xApi, templateSettings);\n\n            if (templateSettings.selectedLrs == 'default') {\n                $.extend(settings.xApi, defaultXapi);\n            }\n        }\n\n        function initNps() {\n            $.extend(settings.xApi, defaultNps);\n        }\n\n    }\n);\n","define(\n    'xApi/base64',[],function() {\n\n        var base64 = {\n\n            // private property\n            _keyStr: \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\",\n\n            // public method for encoding\n            encode: function (input) {\n                var output = \"\";\n                var chr1, chr2, chr3, enc1, enc2, enc3, enc4;\n                var i = 0;\n\n                input = base64._utf8_encode(input);\n\n                while (i < input.length) {\n\n                    chr1 = input.charCodeAt(i++);\n                    chr2 = input.charCodeAt(i++);\n                    chr3 = input.charCodeAt(i++);\n\n                    enc1 = chr1 >> 2;\n                    enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);\n                    enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);\n                    enc4 = chr3 & 63;\n\n                    if (isNaN(chr2)) {\n                        enc3 = enc4 = 64;\n                    } else if (isNaN(chr3)) {\n                        enc4 = 64;\n                    }\n\n                    output = output +\n                    this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +\n                    this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);\n\n                }\n\n                return output;\n            },\n\n            // public method for decoding\n            decode: function (input) {\n                var output = \"\";\n                var chr1, chr2, chr3;\n                var enc1, enc2, enc3, enc4;\n                var i = 0;\n\n                input = input.replace(/[^A-Za-z0-9\\+\\/\\=]/g, \"\");\n\n                while (i < input.length) {\n\n                    enc1 = this._keyStr.indexOf(input.charAt(i++));\n                    enc2 = this._keyStr.indexOf(input.charAt(i++));\n                    enc3 = this._keyStr.indexOf(input.charAt(i++));\n                    enc4 = this._keyStr.indexOf(input.charAt(i++));\n\n                    chr1 = (enc1 << 2) | (enc2 >> 4);\n                    chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);\n                    chr3 = ((enc3 & 3) << 6) | enc4;\n\n                    output = output + String.fromCharCode(chr1);\n\n                    if (enc3 != 64) {\n                        output = output + String.fromCharCode(chr2);\n                    }\n                    if (enc4 != 64) {\n                        output = output + String.fromCharCode(chr3);\n                    }\n\n                }\n\n                output = base64._utf8_decode(output);\n\n                return output;\n\n            },\n\n            // private method for UTF-8 encoding\n            _utf8_encode: function (string) {\n                string = string.replace(/\\r\\n/g, \"\\n\");\n                var utftext = \"\";\n\n                for (var n = 0; n < string.length; n++) {\n\n                    var c = string.charCodeAt(n);\n\n                    if (c < 128) {\n                        utftext += String.fromCharCode(c);\n                    }\n                    else if ((c > 127) && (c < 2048)) {\n                        utftext += String.fromCharCode((c >> 6) | 192);\n                        utftext += String.fromCharCode((c & 63) | 128);\n                    }\n                    else {\n                        utftext += String.fromCharCode((c >> 12) | 224);\n                        utftext += String.fromCharCode(((c >> 6) & 63) | 128);\n                        utftext += String.fromCharCode((c & 63) | 128);\n                    }\n\n                }\n\n                return utftext;\n            },\n\n            // private method for UTF-8 decoding\n            _utf8_decode: function (utftext) {\n                var string = \"\";\n                var i = 0;\n                var c = c1 = c2 = 0;\n\n                while (i < utftext.length) {\n\n                    c = utftext.charCodeAt(i);\n\n                    if (c < 128) {\n                        string += String.fromCharCode(c);\n                        i++;\n                    }\n                    else if ((c > 191) && (c < 224)) {\n                        c2 = utftext.charCodeAt(i + 1);\n                        string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));\n                        i += 2;\n                    }\n                    else {\n                        c2 = utftext.charCodeAt(i + 1);\n                        c3 = utftext.charCodeAt(i + 2);\n                        string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));\n                        i += 3;\n                    }\n\n                }\n\n                return string;\n            }\n\n        };\n\n        return base64;\n\n    }\n);\n","define('xApi/errorsHandler',['durandal/app', 'constants'],\n    function (app, constants) {\n        \"use strict\";\n\n        var\n            errorMessages = {\n                invalidEndpoint: \"Invalid endpoint\",\n                notFoundEndpoint: \"Not found endpoint\",\n                invalidCredentials: \"Invalid credentials\",\n                invalidEmail: \"Invalid e-mail\",\n                invalidProtocol: \"Invalid protocol\",\n                xDomainRequestError: \"XDomainRequest error\",\n                timeoutError: \"Timeout error\",\n\n                badRequest: \"Bad request: \",\n                unhandledMessage: \"Unhandled error: \",\n\n                verbIsIncorrect: \"Vebr object is not well formed\",\n                actorDataIsIncorrect: \"Actor data is incorrect\",\n\n                notEnoughDataInSettings: \"Request failed: Not enough data in the settings\"\n            },\n\n            handleError = function (message) {\n                if (window.location.hash.indexOf('xapierror') !== -1) {\n                    return;\n                }\n\n                var hash = window.location.hash.slice(1, window.location.hash.length);\n                var navigateUrl = 'xapierror/' + encodeURIComponent(_.isEmpty(hash) ? '' : hash);\n\n                app.trigger(constants.events.onError, { navigateUrl: navigateUrl });\n            };\n\n        return {\n            errors: errorMessages,\n            handleError: handleError\n        };\n    }\n);\n","define('helpers/requestResender',[\"q\", \"jquery\"], function(Q, $) {\n  var constants = {\n    sendResultAttemptsTimeout: 10000,\n    sendResultAttemptsCount: 10,\n    serverProblemStatus: 500,\n    noInternetConnectionStatus: 0\n  };\n\n  function send(requestOptions, failedCallback, defer, attemptNumber) {\n    if (typeof defer === \"undefined\") {\n      defer = Q.defer();\n    }\n\n    if (typeof attemptNumber === \"undefined\") {\n      attemptNumber = 0;\n    }\n\n    $.ajax(requestOptions)\n      .done(function() {\n        defer.resolve();\n      })\n      .fail(function(response, textStatus, error) {\n        if (\n          attemptNumber >= constants.sendResultAttemptsCount ||\n          (response.status < constants.serverProblemStatus &&\n            response.status !== constants.noInternetConnectionStatus)\n        ) {\n          return defer.reject(\n            failedCallback && failedCallback(response, textStatus, error)\n          );\n        }\n\n        setTimeout(function() {\n          send(requestOptions, failedCallback, defer, ++attemptNumber);\n        }, constants.sendResultAttemptsTimeout);\n      });\n\n    return defer.promise;\n  }\n\n  return {\n    send: send\n  };\n});\n\n","define('xApi/requestManager',['./configuration/xApiSettings', './base64', './errorsHandler', 'helpers/requestResender'],\n    function (xApiSettings, base64, errorsHandler, requestResender) {\n\n        var states = {\n            notInitialized: 0,\n            initialized: 1,\n            initializationFailed: 2\n        };\n\n        var state = states.notInitialized;\n\n        var eventManager = {\n            init: init,\n            sendStatement: sendStatement\n        };\n        return eventManager;\n\n        function init() {\n            var dfd = Q.defer();\n            switch (state) {\n                case states.notInitialized:\n                    var initPromise = Q.fcall(function () {\n                        try {\n                            initXDomainRequestTransport();\n                            state = states.initialized;\n                        } catch (e) {\n                            state = states.initializationFailed;\n                            throw e;\n                        };\n                    });\n\n                    dfd.resolve(initPromise);\n                    break;\n                case states.initialized:\n                    dfd.resolve();\n                    break;\n                case states.initializationFailed:\n                    dfd.reject();\n                    break;\n            }\n\n            return dfd.promise;\n        }\n\n        function sendStatement(statement, uri, username, password) {\n            var requestOptions = createRequestOptions(statement, uri, username, password);\n\n            if (!$.support.cors) {\n                requestOptions = getOptionsForIEMode(requestOptions);\n            }\n\n            return requestResender.send(requestOptions, onError);\n        }\n\n        function onError(request, textStatus, error) {\n            return getErrorMessage(request, textStatus, error);\n        }\n\n        function initXDomainRequestTransport() {\n            if (window.XDomainRequest) {\n                jQuery.ajaxTransport(function (s) {\n\n                    var xdr;\n\n                    return {\n\n                        send: function (headers, complete) {\n\n                            function callback(status, statusText, responses, responseHeaders) {\n                                xdr.onload = xdr.onerror = xdr.ontimeout = jQuery.noop;\n                                xdr = undefined;\n                                complete(status, statusText, responses, responseHeaders);\n                            }\n\n                            xdr = new window.XDomainRequest();\n\n                            xdr.onload = function () {\n                                callback(200, \"OK\", { text: xdr.responseText });\n                            };\n\n                            xdr.onerror = function () {\n                                callback(-1, errorsHandler.errors.xDomainRequestError);\n                            };\n\n                            if (s.timeout) {\n                                xdr.timeout = s.timeout;\n                                xdr.ontimeout = function () {\n                                    callback(-1, errorsHandler.errors.timeoutError);\n                                };\n                            }\n\n                            try {\n                                xdr.open(s.type, s.url, true);\n                            }\n                            catch (e) {\n                                var errorMessage;\n\n                                if (location.protocol != s.url.split(\"/\")[0]) {\n                                    errorMessage = errorsHandler.errors.invalidProtocol;\n                                } else {\n                                    errorMessage = e.message;\n                                }\n\n                                callback(-1, errorMessage);\n                                return;\n                            }\n\n                            xdr.send((s.hasContent && s.data) || null);\n                        },\n\n                        abort: function () {\n                            if (xdr) {\n                                xdr.onerror = jQuery.noop();\n                                xdr.abort();\n                            }\n                        }\n                    };\n\n                });\n            }\n        }\n\n        function getOptionsForIEMode(options) {\n            var newUrl = options.url;\n\n            //Everything that was on query string goes into form vars\n            var formData = new Array();\n            var qsIndex = newUrl.indexOf('?');\n            if (qsIndex > 0) {\n                formData.push(newUrl.substr(qsIndex + 1));\n                newUrl = newUrl.substr(0, qsIndex);\n            }\n\n            //Method has to go on querystring, and nothing else\n            options.url = newUrl + '?method=' + options.type;\n\n            //Headers\n            if (!_.isUndefined(options.headers) && _.isArray(options.headers)) {\n                for (var headerName in options.headers) {\n                    formData.push(headerName + \"=\" + encodeURIComponent(options.headers[headerName]));\n                }\n            }\n\n            options.headers = {};\n\n            //The original data is repackaged as \"content\" form var\n            if (!_.isUndefined(options.data)) {\n                formData.push('content=' + encodeURIComponent(options.data));\n            }\n\n            options.data = formData.join(\"&\");\n            options.type = \"POST\";\n\n            return options;\n        }\n\n        function createRequestOptions(statement, url, userName, password) {\n            var headers = [];\n            headers[\"X-Experience-API-Version\"] = xApiSettings.xApiVersion;\n            headers[\"Content-Type\"] = \"application/json\";\n            var auth = \"Basic \" + base64.encode(userName + ':' + password);\n            headers[\"Authorization\"] = auth;\n\n            var options = {};\n\n            options.url = url;\n            options.data = JSON.stringify(statement);\n            options.type = 'POST';\n            options.headers = headers;\n            options.timeout = xApiSettings.timeout;\n            options.contentType = 'application/json';\n            options.async = true;\n\n            options.beforeSend = function (xmlHttpRequest) {\n                if (!_.isUndefined(options.headers) && _.isArray(options.headers)) {\n                    for (var headerName in options.headers)\n                        xmlHttpRequest.setRequestHeader(headerName, options.headers[headerName]);\n                }\n            };\n\n            return options;\n        }\n\n        function getErrorMessage(request, textStatus, error) {\n            switch (request.status) {\n                case 0:\n                    error = errorsHandler.errors.invalidEndpoint;\n                    break;\n                case 400:\n                    if (request.responseText.indexOf(\"Mbox\") !== -1) {\n                        error = errorsHandler.errors.invalidEmail;\n                    } else if (request.responseText.indexOf(\"URL\") !== -1 || request.responseText.indexOf(\"endpoint\") !== -1) {\n                        error = errorsHandler.errors.invalidEndpoint;\n                    } else {\n                        error = errorsHandler.errors.badRequest + request.responseText;\n                    }\n\n                    break;\n                case 401:\n                    error = errorsHandler.errors.invalidCredentials;\n                    break;\n                case 404:\n                    error = errorsHandler.errors.notFoundEndpoint;\n                    break;\n                default:\n                    error = errorsHandler.errors.unhandledMessage + request.statusText;\n                    break;\n            }\n\n            return error;\n        }\n    }\n);\n","define('xApi/guard',['./constants'],\n    function (constants) {\n\n        var\n\n            throwIfNotISODuration = function (duration, message) {\n                if (!_.isString(duration)) {\n                    throw message;\n                }\n\n                if (!constants.patterns.isoDuration.test(duration)) {\n                    throw message;\n                }\n            },\n\n            throwIfNotMbox = function (mbox, message) {\n                if (!_.isString(mbox)) {\n                    throw message;\n                }\n\n                if (mbox.indexOf('mailto:') == -1) {\n                    throw message;\n                }\n\n                try {\n                    throwIfNotEmail(mbox.split('mailto:')[1]);\n                } catch (e) {\n                    throw message;\n                }\n            },\n\n            throwIfNotEmail = function (email, message) {\n                if (!_.isString(email)) {\n                    throw message;\n                }\n\n                if (!constants.patterns.email.test(email)) {\n                    throw message;\n                }\n            },\n\n            throwIfNotLanguageMap = function (display, message) {\n                if (!_.isObject(display)) {\n                    throw message;\n                }\n\n                for (var locale in display) {\n                    if (!_.isString(display[locale])) {\n                        throw message;\n                    }\n                }\n            },\n\n            throwIfNotVerbId = function (id, message) {\n                if (!_.isString(id)) {\n                    throw message;\n                }\n\n                var isVerIdValid = false;\n                for (var verb in constants.verbs) {\n                    if (constants.verbs[verb].id === id) {\n                        isVerIdValid = true;\n                        break;\n                    }\n                }\n\n                if (!isVerIdValid) {\n                    throw message;\n                }\n            },\n\n            throwIfNotString = function (text, message) {\n                if (!_.isString(text)) {\n                    throw message;\n                }\n            },\n\n            throwIfNotAnObject = function (item, message) {\n                if (!_.isObject(item)) {\n                    throw message;\n                }\n            },\n\n            throwIfNotNumber = function (item, message) {\n                if (!_.isNumber(item)) {\n                    throw message;\n                }\n            };\n\n        return {\n            throwIfNotMbox: throwIfNotMbox,\n            throwIfNotEmail: throwIfNotEmail,\n            throwIfNotLanguageMap: throwIfNotLanguageMap,\n            throwIfNotVerbId: throwIfNotVerbId,\n            throwIfNotString: throwIfNotString,\n            throwIfNotAnObject: throwIfNotAnObject,\n            throwIfNotNumber: throwIfNotNumber,\n            throwIfNotISODuration: throwIfNotISODuration\n        };\n    }\n);\n","define('xApi/models/statement',['../guard', 'durandal/system'],\n    function (guard, system) {\n\n        var statement = function (spec) {\n\n            if (typeof spec == typeof undefined) {\n                throw 'You should provide a specification to create Statement';\n            }\n\n            guard.throwIfNotAnObject(spec.actor, 'You should provide actor for Statement');\n            guard.throwIfNotAnObject(spec.verb, 'You should provide verb for Statement');\n            guard.throwIfNotAnObject(spec.object, 'You should provide object for Statement');\n\n            var obj = {};\n            obj.id = system.guid();\n            obj.actor = spec.actor;\n            obj.verb = spec.verb;\n            obj.object = spec.object;\n            obj.timestamp = (new Date()).toISOString();\n\n            if (_.isObject(spec.context)) {\n                obj.context = spec.context;\n            }\n\n            if (_.isObject(spec.result)) {\n                obj.result = spec.result;\n            }\n\n            return obj;\n        };\n\n        return statement;\n    }\n);\n","define('xApi/models/object',['../guard'],\n    function (guard) {\n        \n        var object = function (spec) {\n\n            if (typeof spec == typeof undefined) {\n                throw 'You should provide a specification to create Object';\n            }\n\n            guard.throwIfNotString(spec.objectType, 'You should provide object type');\n\n            return {\n                objectType: spec.objectType\n            };\n        };\n\n        return object;\n\n    }\n);\n","define('xApi/models/activityDefinition',['../guard'],\n    function (guard) {\n\n        var activityDefinition = function (spec) {\n\n            if (typeof spec == typeof undefined) {\n                throw 'You should provide a specification to create an ActivityDefinition';\n            }\n\n            var obj = {};\n\n            guard.throwIfNotLanguageMap(spec.name, 'You should provide name for ActivityDefinition');\n\n            if (typeof spec.name != typeof undefined) {\n                obj.name = spec.name;\n            }\n\n            if (typeof spec.type != typeof undefined) {\n                obj.type = spec.type;\n            }\n\n            if (typeof spec.interactionType != typeof undefined) {\n                obj.interactionType = spec.interactionType;\n            }\n\n            if (typeof spec.correctResponsesPattern != typeof undefined) {\n                obj.correctResponsesPattern = spec.correctResponsesPattern;\n            }\n\n            if (typeof spec.choices != typeof undefined) {\n                obj.choices = spec.choices;\n            }\n\n            if (typeof spec.source != typeof undefined) {\n                obj.source = spec.source;\n            }\n\n            if (typeof spec.target != typeof undefined) {\n                obj.target = spec.target;\n            }\n\n            return obj;\n        };\n\n        return activityDefinition;\n    }\n);\n","define('xApi/models/activity',['../guard', './object', './activityDefinition'],\n    function (guard, object, activityDefinition) {\n\n        var activity = function (spec) {\n            \n            if (typeof spec == typeof undefined) {\n                throw 'You should provide a specification to create an Activity';\n            }\n\n            guard.throwIfNotString(spec.id, 'You should provide identity for Activity');\n            guard.throwIfNotAnObject(spec.definition, 'You should provide definition for Activity');\n\n            spec.objectType = 'Activity';\n\n            var obj = new object(spec);\n            obj.id = spec.id;\n            obj.definition = spec.definition;\n\n            return obj;\n        };\n\n        return activity;\n    }\n);\n","define('xApi/models/result',['../guard'],\n    function (guard) {\n\n        var result = function (spec) {\n\n            if (typeof spec == typeof undefined) {\n                throw 'You should provide a specification to create Result';\n            }\n\n            var obj = {};\n\n            if (typeof spec.score != typeof undefined) {\n                obj.score = spec.score;\n            }\n\n            if (typeof spec.duration != typeof undefined) {\n                guard.throwIfNotISODuration(spec.duration, 'You should provide duration in correct ISO duration format.');\n                obj.duration = spec.duration;\n            }\n\n            if (typeof spec.response != typeof undefined) {\n                obj.response = spec.response;\n            }\n\n            return obj;\n        };\n\n        return result;\n    }\n);\n","define('xApi/models/score',['../guard'],\n    function (guard) {\n\n        var score = function (spec) {\n\n            if (typeof spec == typeof undefined) {\n                throw 'You should provide a specification to create Statement';\n            }\n\n            guard.throwIfNotNumber(spec, 'You should provide score');\n\n            var obj = {};\n            \n            if (spec >= 0 && spec <= 1) {\n                obj.scaled = spec;\n            } else {\n                obj.raw = spec;\n            }\n            \n            return obj;\n        };\n\n        return score;\n    }\n);\n","define('xApi/models/context',['guard'], function (guard) {\n    var context = function(spec) {\n        if (typeof spec == typeof undefined) {\n            throw 'You should provide a specification to create Context';\n        }\n\n        guard.throwIfNotString(spec.registration, 'You should specify registration field for the context');\n        var obj = {};\n\n        obj.registration = spec.registration;\n        if (_.isObject(spec.contextActivities)) {\n            obj.contextActivities = spec.contextActivities;\n        }\n\n        if (_.isObject(spec.extensions)) {\n            obj.extensions = spec.extensions;\n        }\n\n\n        return obj;\n    };\n\n    return context;\n});\n","define('xApi/models/contextActivities',[], function() {\n    var contextActivities = function(spec) {\n        if (typeof spec == typeof undefined) {\n            throw 'You should provide a specification to create contextActivities';\n        }\n\n        var obj = {};\n\n        if (typeof spec.parent != typeof undefined) {\n            obj.parent = spec.parent;\n        }\n        \n        if (typeof spec.grouping != typeof undefined) {\n            obj.grouping = spec.grouping;\n        }\n\n        return obj;\n    };\n\n    return contextActivities;\n});\n","define('xApi/models/languageMap',['../guard'],\n    function (guard) {\n        \"use strict\";\n\n        var languageMap = function(text) {\n            guard.throwIfNotString(text, 'You should provide valid text according to \\'RFC 5646 Language Tag\\'.');\n\n            return {\n                \"en-US\": text\n            };\n        };\n\n        return languageMap;\n\n    }\n);\n","define('xApi/models/interactionDefinition',['./activityDefinition'], function (activityDefinition) {\n    \"use strict\";\n\n    var interactionDefinition = function (spec) {\n\n        spec.type = \"http://adlnet.gov/expapi/activities/cmi.interaction\";\n\n        return new activityDefinition(spec);\n    };\n\n    return interactionDefinition;\n\n});\n","define('xApi/utils/dateTimeConverter',['../guard'], function(guard) {\n    var timeToISODurationString = function (timeInMilliseconds) {\n        guard.throwIfNotNumber(timeInMilliseconds, 'You should provide only number');\n        timeInMilliseconds /= 1000;\n\n        var hours = parseInt(timeInMilliseconds / 3600, 10);\n        timeInMilliseconds -= hours * 3600;\n\n        var minutes = parseInt(timeInMilliseconds / 60, 10);\n        timeInMilliseconds -= minutes * 60;\n\n        var seconds = parseInt(timeInMilliseconds, 10);\n\n        return 'PT' + hours + 'H' + minutes + 'M' + seconds + 'S';\n    };\n\n    return {\n         timeToISODurationString: timeToISODurationString\n    };\n});\n","define('xApi/statementQueue',[], function() {\n\n    var statements = ko.observableArray([]);\n\n    var queue = {\n        statements: ko.computed({\n            read: statements\n        }),\n        enqueue: enqueue,\n        dequeue: dequeue\n    };\n\n    return queue;\n\n    function enqueue(statement) {\n        statements.push(statement);\n    }\n\n    function dequeue() {\n        return statements.shift();\n    }\n\n});\n","define('repositories/sectionRepository',['guard', 'context'], function (guard, context) {\n\n    return {\n        get: get,\n        getCollection: getCollection,\n        getSectionByQuestionId: getSectionByQuestionId\n    };\n\n    function get(sectionId) {\n        guard.throwIfNotString(sectionId, 'section id is not a string');\n\n        var section = _.find(context.course.sections, function (item) {\n            return item.id == sectionId;\n        });\n\n        if (!section) {\n            return null;\n        }\n\n        return section;\n    }\n\n    function getCollection() {\n        return context.course.sections;\n    }\n\n    function getSectionByQuestionId(questionId) {\n        guard.throwIfNotString(questionId, 'Question id is not a string');\n\n        var foundSection;\n        _.each(context.course.sections, function (section) {\n            _.each(section.questions, function (item) {\n                if (item.id === questionId) {\n                    foundSection = section;\n                }\n            });\n        });\n\n        return foundSection;\n    }\n});\n","define('xApi/statementSender',['./requestManager', './configuration/xApiSettings', './errorsHandler'],\n    function(requestManager, xApiSettings, errorsHandler) {\n\n        return {\n            sendLrsStatement: sendLrsStatement,\n            sendNpsStatement: sendNpsStatement\n        };\n\n        function sendLrsStatement(statement) {\n            return sendStatement(statement, xApiSettings.xApi.lrs).fail(function(error) {\n                errorsHandler.handleError(error);\n            });\n        }\n\n        function sendNpsStatement(statement) {\n            return sendStatement(statement, xApiSettings.xApi.nps);\n        }\n\n        function sendStatement(statement, settings) {\n            var url = getUrl(settings.uri);\n            \n            var credentials = settings.authenticationRequired ?\n                settings.credentials : xApiSettings.anonymousCredentials;\n\n            return requestManager.sendStatement(statement, url, credentials.username, credentials.password);\n        }\n\n        function getUrl(settingsUrl) {\n            var url = settingsUrl;\n\n            if (url.indexOf(\"/statements\") !== -1)\n                return url;\n\n            if (url.slice(-1) !== \"/\")\n                url += \"/\";\n\n            url += \"statements\";\n            return url;\n        }\n    });\n","define('xApi/models/actor',['../guard', './object'],\n    function (guard, object) {\n\n        var actor = function (spec) {\n\n            if (typeof spec == typeof undefined) {\n                throw 'You should provide a specification to create an Actor';\n            }\n\n            spec.objectType = 'Agent';\n            var obj = new object(spec);\n            \n            if(spec.account) {\n                guard.throwIfNotString(spec.account.homePage, 'You should provide homePage for Actor account');\n                guard.throwIfNotString(spec.account.name, 'You should provide name for Actor account');\n                obj.account = {\n                    homePage: spec.account.homePage,\n                    name: spec.account.name\n                };\n            } else {\n                guard.throwIfNotMbox(spec.mbox, 'You should provide mbox identity for Actor');\n                obj.mbox = spec.mbox;\n            }\n            obj.name = spec.name;\n\n            return obj;\n        };\n\n        return actor;\n    }\n);\n","define('xApi/activityProvider',['./models/statement', './models/activity', './models/activityDefinition', 'eventManager', './errorsHandler', './configuration/xApiSettings',\n    './constants', './models/result', './models/score', './models/context', './models/contextActivities', './models/languageMap',\n    './models/interactionDefinition', './utils/dateTimeConverter', './statementQueue', 'constants', 'guard', 'repositories/sectionRepository', 'progressContext', 'context',\n    './statementSender', './models/actor'],\n    function (statementModel, activityModel, activityDefinitionModel, eventManager, errorsHandler, xApiSettings, constants,\n        resultModel, scoreModel, contextModel, contextActivitiesModel, languageMapModel, interactionDefinitionModel, dateTimeConverter, statementQueue,\n        globalConstants, guard, sectionRepository, progressContext, courseContext, statementSender, actorModel) {\n\n        \"use strict\";\n\n        var subscriptions = [],\n            activityProvider = {\n                actor: null,\n                activityName: null,\n                activityUrl: null,\n\n                initActivity: initActivity,\n                initActor: initActor,\n                subscribeToxApiEvents: subscribeToxApiEvents,\n                turnOffxApiSubscriptions: unsubscribeFromxApiEvents,\n                subscribeToNpsEvents: subscribeToNpsEvents,\n                turnOffNpsSubscriptions: unsubscribeFromNpsEvents,\n                rootCourseUrl: null,\n                turnOffSubscriptions: turnOffSubscriptions,\n                courseId: null\n            },\n            sessionId = function () {\n                return progressContext.get().attemptId;\n            };\n\n        return activityProvider;\n\n        function initActivity(courseId, activityName, activityUrl) {\n            return Q.fcall(function () {\n                if (_.isUndefined(xApiSettings.scoresDistribution.positiveVerb)) {\n                    throw errorsHandler.errors.notEnoughDataInSettings;\n                }\n\n                activityProvider.activityName = activityName;\n                activityProvider.activityUrl = activityUrl;\n                activityProvider.rootCourseUrl = activityUrl !== undefined ? activityUrl.split(\"?\")[0].split(\"#\")[0] : '';\n                activityProvider.courseId = courseId;\n            });\n        }\n\n        function initActor(name, email, account) {\n            return Q.fcall(function () {\n                activityProvider.actor = createActor(name, email, account);\n            });\n        }\n\n        function subscribeToxApiEvents() {\n            unsubscribeFromxApiEvents();\n\n            subscribeToEvent(eventManager.events.courseStarted, enqueueCourseStarted);\n            subscribeToEvent(eventManager.events.courseFinished, enqueueCourseFinished);\n            subscribeToEvent(eventManager.events.learningContentExperienced, enqueueLearningContentExperienced);\n            subscribeToEvent(eventManager.events.answersSubmitted, enqueueQuestionAnsweredStatement);\n        }\n\n        function unsubscribeFromxApiEvents() {\n            unsubscribeFromEvent(eventManager.events.courseStarted, enqueueCourseStarted);\n            unsubscribeFromEvent(eventManager.events.courseFinished, enqueueCourseFinished);\n            unsubscribeFromEvent(eventManager.events.learningContentExperienced, enqueueLearningContentExperienced);\n            unsubscribeFromEvent(eventManager.events.answersSubmitted, enqueueQuestionAnsweredStatement);\n        }\n\n        function subscribeToNpsEvents() {\n            unsubscribeFromNpsEvents();\n            \n            subscribeToEvent(eventManager.events.courseEvaluated, handleCourseEvaluated);\n        }\n\n        function unsubscribeFromNpsEvents() {\n            unsubscribeFromEvent(eventManager.events.courseEvaluated, handleCourseEvaluated);\n        }\n\n        function turnOffSubscriptions() {\n            _.each(subscriptions, function (subscription) {\n                if (!_.isNullOrUndefined(subscription && subscription.off)) {\n                    subscription.off();\n                }\n            });\n        }\n\n        // #region Event handlers\n\n        function handleCourseEvaluated(data) {\n            guard.throwIfNotAnObject(data, 'Data is not an object');\n            guard.throwIfNotString(data.response, 'Data response is not a string');\n            guard.throwIfNotNumber(data.score, 'Data score is not a number');\n\n            var statement = createStatement(constants.verbs.evaluated,\n                                            new resultModel({ score: new scoreModel(data.score), response: data.response }),\n                                            createActivity(null, activityProvider.activityName, constants.activityTypes.course),\n                                            createContextModel());\n\n            return statementSender.sendNpsStatement(statement);\n        }\n\n        function enqueueCourseStarted() {\n            pushStatementIfSupported(createStatement(constants.verbs.started));\n        }\n\n        function enqueueCourseFinished(course) {\n            guard.throwIfNotAnObject(course, 'Course is not an object');\n\n            if (_.isArray(course.sections)) {\n                _.each(course.sections, function (section) {\n                    if (_.isArray(section.questions)) {\n                        _.each(section.questions, function (question) {\n                            if (question.affectProgress && !question.isAnswered) {\n                                enqueueQuestionAnsweredStatement(question);\n                            }\n                        });\n                    }\n\n                    var sectionUrl = activityProvider.rootCourseUrl + '#sections?section_id=' + section.id;\n                    var score = section.affectProgress ? new scoreModel(section.score() / 100) : undefined;\n                    var statement = createStatement(constants.verbs.mastered, new resultModel({ score: score }), createActivity(sectionUrl, section.title));\n                    pushStatementIfSupported(statement);\n                });\n            }\n\n            var result = new resultModel({\n                score: new scoreModel(course.result())\n            });\n\n            var resultVerb = course.isCompleted() ? xApiSettings.scoresDistribution.positiveVerb : constants.verbs.failed;\n            pushStatementIfSupported(createStatement(resultVerb, result));\n            pushStatementIfSupported(createStatement(constants.verbs.stopped));\n\n            var dfd = Q.defer();\n\n            statementQueue.statements.subscribe(function (newValue) {\n                if (newValue.length === 0) {\n                    dfd.resolve();\n                }\n            });\n\n            // (^\\ x_x /^)\n            statementQueue.enqueue(undefined);\n\n            return dfd.promise;\n        }\n\n        function enqueueCourseProgressedStatement(course) {\n            guard.throwIfNotAnObject(course, 'Course is not an object');\n\n            var result = new resultModel({\n                score: new scoreModel(course.result())\n            });\n\n            pushStatementIfSupported(createStatement(constants.verbs.progressed, result, createActivity(null, activityProvider.activityName, constants.activityTypes.course)));\n        }\n\n        function enqueueSectionProgressedStatement(section) {\n            guard.throwIfNotAnObject(section, 'Section is not an object');\n\n            var sectionUrl = activityProvider.rootCourseUrl + '#sections?section_id=' + section.id;\n            var score = section.affectProgress ? new scoreModel(section.score() / 100) : undefined;\n            var statement = createStatement(constants.verbs.progressed, new resultModel({ score: score }), createActivity(sectionUrl, section.title, constants.activityTypes.objective));\n            pushStatementIfSupported(statement);\n        }\n\n        function enqueueLearningContentExperienced(question, spentTime) {\n            pushStatementIfSupported(getLearningContentExperiencedStatement(question, spentTime));\n        }\n\n        function enqueueQuestionAnsweredStatement(question, sendParentProgress) {\n            try {\n                guard.throwIfNotAnObject(question, 'Question is not an object');\n\n                var section = sectionRepository.get(question.sectionId);\n                guard.throwIfNotAnObject(section, 'Section is not found');\n\n                var parts = null;\n                var contextObj = {};\n                contextObj.extensions = {};\n                switch (question.type) {\n                    case globalConstants.questionTypes.multipleSelect:\n                    case globalConstants.questionTypes.singleSelectText:\n                        parts = getSelectTextQuestionActivityAndResult(question);\n                        break;\n                    case globalConstants.questionTypes.fillInTheBlank:\n                        parts = getFillInQuestionActivityAndResult(question, contextObj);\n                        break;\n                    case globalConstants.questionTypes.singleSelectImage:\n                        parts = getSingleSelectImageQuestionAcitivityAndResult(question);\n                        break;\n                    case globalConstants.questionTypes.statement:\n                        parts = getStatementQuestionActivityAndResult(question);\n                        break;\n                    case globalConstants.questionTypes.dragAndDrop:\n                        parts = getDragAndDropTextQuestionActivityAndResult(question, contextObj);\n                        break;\n                    case globalConstants.questionTypes.textMatching:\n                        parts = getMatchingQuestionActivityAndResult(question);\n                        break;\n                    case globalConstants.questionTypes.hotspot:\n                        parts = getHotSpotQuestionActivityAndResult(question, contextObj);\n                        break;\n                    case globalConstants.questionTypes.openQuestion:\n                        parts = getOpenQuestionActivityAndResult(question);\n                        break;\n                    case globalConstants.questionTypes.scenario:\n                        parts = getScenarioQuestionActivityAndResult(question);\n                        break;\n                    case globalConstants.questionTypes.rankingText:\n                        parts = getRankingTextQuestionActivityAndResult(question);\n                        break;\n                    case globalConstants.questionTypes.informationContent:\n                        parts = getInformationContentActivityAndResult(question);\n                        break;\n                }\n\n                var parentUrl = activityProvider.rootCourseUrl + '#sections?section_id=' + section.id;\n\n                contextObj.contextActivities = new contextActivitiesModel({\n                    parent: [createActivity(parentUrl, section.title)]\n                });\n\n                contextObj.extensions[constants.extenstionKeys.surveyMode] = question.hasOwnProperty('isSurvey') && question.isSurvey;\n                contextObj.extensions[constants.extenstionKeys.questionType] = question.type;\n\n                var context = createContextModel(contextObj);\n\n                if (parts) {\n                    var verb = question.type === globalConstants.questionTypes.informationContent ?\n                        constants.verbs.experienced : constants.verbs.answered;\n\n                    var statement = createStatement(verb, parts.result, parts.object, context);\n                    if (statement) {\n                        pushStatementIfSupported(statement);\n                        if (sendParentProgress) {\n                            enqueueSectionProgressedStatement(section);\n                            enqueueCourseProgressedStatement(courseContext.course);\n                        }\n                    }\n                }\n\n            } catch (e) {\n                console.error(e);\n            }\n        }\n\n        // #endregion\n\n        // #region Statement creation\n\n        function getSelectTextQuestionActivityAndResult(question) {\n            return {\n                result: new resultModel({\n                    score: new scoreModel(question.score() / 100),\n                    response: getItemsIds(question.answers, function (item) {\n                        return item.isChecked;\n                    }).join(\"[,]\")\n                }),\n                object: new activityModel({\n                    id: activityProvider.rootCourseUrl + '#section/' + question.sectionId + '/question/' + question.id,\n                    definition: new interactionDefinitionModel({\n                        name: new languageMapModel(question.title),\n                        interactionType: constants.interactionTypes.choice,\n                        correctResponsesPattern: !!question.isSurvey ? [] : [\n                            getItemsIds(question.answers, function (item) {\n                                return item.isCorrect;\n                            }).join(\"[,]\")\n                        ],\n                        choices: _.map(question.answers, function (item) {\n                            return {\n                                id: item.id,\n                                description: new languageMapModel(item.text)\n                            };\n                        })\n                    })\n                })\n            };\n        }\n\n        function getStatementQuestionActivityAndResult(question) {\n            return {\n                result: new resultModel({\n                    score: new scoreModel(question.score() / 100),\n                    response: _.chain(question.statements).filter(function (statement) {\n                        return !_.isNullOrUndefined(statement.userAnswer);\n                    }).map(function (statement) {\n                        return statement.id + '[.]' + statement.userAnswer;\n                    }).value().join(\"[,]\")\n                }),\n                object: new activityModel({\n                    id: activityProvider.rootCourseUrl + '#section/' + question.sectionId + '/question/' + question.id,\n                    definition: new interactionDefinitionModel({\n                        name: new languageMapModel(question.title),\n                        interactionType: constants.interactionTypes.choice,\n                        correctResponsesPattern: !!question.isSurvey ? [] : [\n                            _.map(question.statements, function (item) {\n                                return item.id + '[.]' + item.isCorrect;\n                            }).join(\"[,]\")\n                        ],\n                        choices: _.map(question.statements, function (item) {\n                            return {\n                                id: item.id,\n                                description: new languageMapModel(item.text)\n                            };\n                        })\n                    })\n                })\n            };\n        }\n\n        function getSingleSelectImageQuestionAcitivityAndResult(question) {\n            return {\n                result: new resultModel({\n                    score: new scoreModel(question.score() / 100),\n                    response: question.checkedAnswerId || ''\n                }),\n                object: new activityModel({\n                    id: activityProvider.rootCourseUrl + '#section/' + question.sectionId + '/question/' + question.id,\n                    definition: new interactionDefinitionModel({\n                        name: new languageMapModel(question.title),\n                        interactionType: constants.interactionTypes.choice,\n                        correctResponsesPattern: [[question.correctAnswerId].join(\"[,]\")],\n                        choices: _.map(question.answers, function (item) {\n                            return {\n                                id: item.id,\n                                description: new languageMapModel(item.image)\n                            };\n                        })\n                    })\n                })\n            };\n\n        }\n\n        function getFillInQuestionActivityAndResult(question, contextObj) {\n            contextObj.extensions[constants.extenstionKeys.content] = question.content;\n            return {\n                result: new resultModel({\n                    score: new scoreModel(question.score() / 100),\n                    response: _.map(question.answerGroups, function (item) {\n                        return item.answeredText + \"[.]\" + item.id;\n                    }).join(\"[,]\")\n                }),\n                object: new activityModel({\n                    id: activityProvider.rootCourseUrl + '#section/' + question.sectionId + '/question/' + question.id,\n                    definition: new interactionDefinitionModel({\n                        name: new languageMapModel(question.title),\n                        interactionType: constants.interactionTypes.fillIn,\n                        correctResponsesPattern: [\n                            _.flatten(_.map(question.answerGroups, function (item) {\n                                return item.getCorrectText() + \"[.]\" + item.id;\n                            })).join(\"[,]\")\n                        ]\n                    })\n                })\n            };\n        }\n\n        function getHotSpotQuestionActivityAndResult(question, contextObj) {\n            contextObj.extensions[constants.extenstionKeys.imageUrl] = question.background;\n            return {\n                result: new resultModel({\n                    score: new scoreModel(question.score() / 100),\n                    response: _.map(question.placedMarks, function (mark) {\n                        return '(' + mark.x + ',' + mark.y + ')';\n                    }).join(\"[,]\")\n                }),\n                object: new activityModel({\n                    id: activityProvider.rootCourseUrl + '#section/' + question.sectionId + '/question/' + question.id,\n                    definition: new interactionDefinitionModel({\n                        name: new languageMapModel(question.title),\n                        interactionType: constants.interactionTypes.other,\n                        correctResponsesPattern: [_.map(question.spots, function (spot) {\n                            var polygonCoordinates = _.map(spot, function (spotCoordinates) {\n                                return '(' + spotCoordinates.x + ',' + spotCoordinates.y + ')';\n                            });\n                            return polygonCoordinates.join(\"[.]\");\n                        }).join(\"[,]\")]\n                    })\n                })\n            }\n        }\n\n        function getDragAndDropTextQuestionActivityAndResult(question, contextObj) {\n            var answerTexts = _.map(question.answers, function (item) {\n                return item.text;\n            }).join(\"[,]\");\n            contextObj.extensions[constants.extenstionKeys.answerTexts] = answerTexts;\n            contextObj.extensions[constants.extenstionKeys.imageUrl] = question.background;\n            return {\n                result: new resultModel({\n                    score: new scoreModel(question.score() / 100),\n                    response: _.map(question.answers, function (item) {\n                        return '(' + item.currentPosition.x + ',' + item.currentPosition.y + ')';\n                    }).join(\"[,]\")\n                }),\n\n                object: new activityModel({\n                    id: activityProvider.rootCourseUrl + '#section/' + question.sectionId + '/question/' + question.id,\n                    definition: new interactionDefinitionModel({\n                        name: new languageMapModel(question.title),\n                        interactionType: constants.interactionTypes.other,\n                        correctResponsesPattern: [_.map(question.answers, function (item) {\n                            return '(' + item.correctPosition.x + ',' + item.correctPosition.y + ')';\n                        }).join(\"[,]\")]\n                    })\n                })\n            }\n        }\n\n        function getMatchingQuestionActivityAndResult(question) {\n            var targets = _.uniq(_.pluck(question.answers, 'value'));\n\n            return {\n                result: new resultModel({\n                    score: new scoreModel(question.score() / 100),\n                    response: _.map(question.answers, function (answer) {\n                        return answer.shortId + \"[.]\" + (answer.attemptedValue ? _.indexOf(targets, answer.attemptedValue) : \"\");\n                    }).join(\"[,]\")\n                }),\n                object: new activityModel({\n                    id: activityProvider.rootCourseUrl + '#section/' + question.sectionId + '/question/' + question.id,\n                    definition: new interactionDefinitionModel({\n                        name: new languageMapModel(question.title),\n                        interactionType: constants.interactionTypes.matching,\n                        correctResponsesPattern: [_.map(question.answers, function (answer) {\n                            return answer.shortId + \"[.]\" + _.indexOf(targets, answer.value);\n                        }).join(\"[,]\")],\n                        source: _.map(question.answers, function (answer) {\n                            return { id: answer.shortId.toString(), description: new languageMapModel(answer.key) }\n                        }),\n                        target: _.map(targets, function (value, index) {\n                            return { id: index.toString(), description: new languageMapModel(value) }\n                        })\n                    })\n                })\n            };\n\n        }\n\n        function getOpenQuestionActivityAndResult(question) {\n            return {\n                result: new resultModel({\n                    response: question.answeredText\n                }),\n                object: new activityModel({\n                    id: activityProvider.rootCourseUrl + '#section/' + question.sectionId + '/question/' + question.id,\n                    definition: new interactionDefinitionModel({\n                        name: new languageMapModel(question.title),\n                        interactionType: constants.interactionTypes.other\n                    })\n                })\n            };\n        }\n\n        function getScenarioQuestionActivityAndResult(question) {\n            return {\n                result: new resultModel({\n                    score: new scoreModel(question.score() / 100),\n                }),\n                object: new activityModel({\n                    id: activityProvider.rootCourseUrl + '#section/' + question.sectionId + '/question/' + question.id,\n                    definition: new interactionDefinitionModel({\n                        name: new languageMapModel(question.title),\n                        interactionType: constants.interactionTypes.other\n                    })\n                })\n            };\n        }\n\n        function getRankingTextQuestionActivityAndResult(question) {\n            return {\n                result: new resultModel({\n                    score: new scoreModel(question.score() / 100),\n                    response: _.map(question.rankingItems, function (item) {\n                        return item.text.toLowerCase();\n                    }).join(\"[,]\")\n                }),\n                object: new activityModel({\n                    id: activityProvider.rootCourseUrl + '#section/' + question.sectionId + '/question/' + question.id,\n                    definition: new interactionDefinitionModel({\n                        name: new languageMapModel(question.title),\n                        interactionType: constants.interactionTypes.sequencing,\n                        correctResponsesPattern: [_.map(question.correctOrder, function (item) {\n                            return item.text.toLowerCase();\n                        }).join(\"[,]\")],\n                        choices: _.map(question.rankingItems, function (item) {\n                            return {\n                                id: item.text,\n                                description: new languageMapModel(item.text)\n                            };\n                        })\n                    })\n                })\n            };\n        }\n\n        function getInformationContentActivityAndResult(question) {\n            return {\n                result: new resultModel({\n                    score: new scoreModel(question.score() / 100)\n                }),\n                object: new activityModel({\n                    id: activityProvider.rootCourseUrl + '#section/' + question.sectionId + '/question/' + question.id,\n                    definition: new interactionDefinitionModel({\n                        name: new languageMapModel(question.title),\n                        interactionType: constants.interactionTypes.other\n                    })\n                })\n            };\n        }\n\n        function getLearningContentExperiencedStatement(question, spentTime) {\n            guard.throwIfNotAnObject(question, 'Question is not an object');\n            guard.throwIfNotNumber(spentTime, 'SpentTime is not a number');\n\n            var section = sectionRepository.get(question.sectionId);\n            guard.throwIfNotAnObject(section, 'Section is not found');\n\n            var result = new resultModel({\n                duration: dateTimeConverter.timeToISODurationString(spentTime)\n            });\n\n            var learningContentUrl = activityProvider.rootCourseUrl + '#section/' + section.id + '/question/' + question.id + '?learningContents';\n            var parentUrl = activityProvider.rootCourseUrl + '#section/' + section.id + '/question/' + question.id;\n            var groupingUrl = activityProvider.rootCourseUrl + '#sections?section_id=' + section.id;\n            var object = createActivity(learningContentUrl, question.title);\n\n            var context = createContextModel({\n                contextActivities: new contextActivitiesModel({\n                    parent: [createActivity(parentUrl, question.title)],\n                    grouping: [createActivity(groupingUrl, section.title)]\n                })\n            });\n\n            return createStatement(constants.verbs.experienced, result, object, context);\n        }\n\n        function createContextModel(contextSpec) {\n            contextSpec = contextSpec || {};\n            var contextExtensions = contextSpec.extensions || {};\n            contextExtensions[constants.extenstionKeys.courseId] = activityProvider.courseId;\n            contextSpec.extensions = contextExtensions;\n            contextSpec.registration = sessionId();\n\n            return new contextModel(contextSpec);\n        }\n\n        function createStatement(verb, result, activity, context) {\n            var activityData = activity || createActivity(null, activityProvider.activityName);\n            context = context || createContextModel();\n\n            return statementModel({\n                actor: activityProvider.actor,\n                verb: verb,\n                object: activityData,\n                result: result,\n                context: context\n            });\n        }\n\n        // #endregion\n\n        // #region Utilities\n\n        function createActor(name, email, account) {\n            var actor = {};\n\n            try {\n                actor = actorModel({\n                    name: name,\n                    mbox: 'mailto:' + email,\n                    account: account\n                });\n            } catch (e) {\n                errorsHandler.handleError(errorsHandler.errors.actorDataIsIncorrect);\n            }\n\n            return actor;\n        }\n\n        function createActivity(id, name, type) {\n            return activityModel({\n                id: id || activityProvider.activityUrl,\n                definition: new activityDefinitionModel({\n                    name: new languageMapModel(name),\n                    type: type\n                })\n            });\n        }\n\n\n        function pushStatementIfSupported(statement) {\n            if (_.contains(xApiSettings.xApi.allowedVerbs, statement.verb.display[xApiSettings.defaultLanguage])) {\n                statementQueue.enqueue(statement);\n            }\n        }\n\n        function subscribeToEvent(eventName, eventHandler) {\n            subscriptions.push(eventManager.subscribeForEvent(eventName).then(eventHandler));\n        }\n\n        function unsubscribeFromEvent(eventName, eventHandler) {\n            eventManager.unsubscribeForEvent(eventName, eventHandler);\n        }\n\n        function getItemsIds(items, filter) {\n            return _.chain(items)\n               .filter(function (item) {\n                   return filter(item);\n               })\n               .map(function (item) {\n                   return item.id;\n               }).value();\n        }\n\n        // #endregion\n\n    }\n);\n","define('xApi/statementQueueHandler',['durandal/app', './statementSender', './statementQueue'], function (app, statementSender, statementQueue) {\n\n    return {\n        handle: handle\n    };\n\n    function handle() {\n        var statement = statementQueue.dequeue();\n\n        if (statement) {\n            return statementSender.sendLrsStatement(statement).then(handle);\n        } else {\n            var subscription = statementQueue.statements.subscribe(function () {\n                handle();\n                subscription.dispose();\n            });\n        }\n\n    }\n\n});\n","define('xApi/xApiInitializer',['durandal/app', 'plugins/router', './routingManager', './requestManager', './activityProvider', './configuration/xApiSettings', './constants', './statementQueueHandler',\n        './errorsHandler', 'context', 'progressContext', 'userContext', 'eventManager', 'helpers/loginHelper', 'constants'\n    ],\n    function(app, router, routingManager, requestManager, activityProvider, xApiSettingsConfig, constants, statementQueueHandler, errorsHandler, context, progressContext,\n        userContext, eventManager, loginHelper, appConstants) {\n        \"use strict\";\n\n        var self = {\n                isUserAuthenticated: false,\n                npsSettings: null,\n                xApiSettings: null,\n            },\n            xApiInitializer = {\n                initialize: initialize,\n                deactivate: deactivate,\n                isLrsReportingInitialized: false,\n                isNpsReportingInitialized: false,\n                isInitialized: false,\n                activate: activate\n            };\n\n        return xApiInitializer;\n\n        function initialize(xApiReportingSettings, npsReportingSettings) {\n            return Q.fcall(function() {\n                self.xApiSettings = xApiReportingSettings;\n                self.npsSettings = npsReportingSettings;\n\n                if (!self.xApiSettings.enabled && !self.npsSettings.enabled)\n                    return;\n\n                routingManager.mapRoutes();\n                self.isCourseStarted = checkIsCourseStarted();\n                return initializeTracking()\n                    .then(function() {\n                        activateReporting();\n                        if (loginHelper.getLoginMethod() !== appConstants.loginTypes.byEmailAndName && !self.isCourseStarted) {\n                            return eventManager.courseStarted();\n                        }\n                    })\n                    .fail(onInitializationFailed);\n            });\n        }\n\n        function activate(user) {\n            return initializeActor(user)\n                .then(function() {\n                    activateReporting();\n                })\n                .fail(onInitializationFailed);\n        }\n\n        function deactivate() {\n            deactivateLrsReporting();\n            deactivateNpsReporting();\n            xApiInitializer.isInitialized = false;\n        }\n\n        function initializeTracking() {\n            return initializeActorFromContext().then(function() {\n                initializeActivity();\n\n                return requestManager.init()\n                    .then(function() {\n                        xApiInitializer.isInitialized = true;\n                    });\n            });\n        }\n\n        function activateReporting() {\n            if (!self.isUserAuthenticated)\n                return;\n\n            if (self.xApiSettings.enabled) activateXapiReporting();\n            if (self.npsSettings.enabled) activateNpsReporting();\n        }\n\n        function activateXapiReporting() {\n            xApiSettingsConfig.initxApi(self.xApiSettings);\n            activityProvider.subscribeToxApiEvents();\n\n            statementQueueHandler.handle();\n            xApiInitializer.isLrsReportingInitialized = true;\n        }\n\n        function activateNpsReporting() {\n            xApiSettingsConfig.initNps(self.npsSettings);\n            activityProvider.subscribeToNpsEvents();\n\n            xApiInitializer.isNpsReportingInitialized = true;\n        }\n\n        function deactivateLrsReporting() {\n            activityProvider.turnOffxApiSubscriptions();\n            xApiInitializer.isLrsReportingInitialized = false;\n            app.trigger('user:authentication-skipped');\n        }\n\n        function deactivateNpsReporting() {\n            activityProvider.turnOffNpsSubscriptions();\n            xApiInitializer.isNpsReportingInitialized = false;\n        }\n\n        function initializeActorFromContext() {\n            return Q.fcall(function() {\n                var user = userContext.getCurrentUser(),\n                    progress = progressContext.get();\n\n                if (user && user.username && (constants.patterns.email.test(user.email) || user.account)) {\n                    return initializeActor(user);\n                }\n\n                if (_.isObject(progress)) {\n                    if (_.isObject(progress.user)) {\n                        return initializeActor(progress.user);\n                    }\n                    if (progress.user === 0) {\n                        deactivateLrsReporting();\n                        return;\n                    }\n                }\n            });\n        }\n\n        function initializeActor(user) {\n            return Q.fcall(function() {\n                var actor = {};\n\n                actor.username = user.username;\n                actor.email = user.email || (user.account ? user.account.name : '');\n                if (user.account)\n                    actor.account = user.account;\n\n                self.isUserAuthenticated = true;\n                app.trigger('user:authenticated', user);\n\n                return activityProvider.initActor(actor.username, actor.email, actor.account);\n            });\n        }\n\n        function initializeActivity() {\n            return Q.fcall(function() {\n                var id = context.course.id;\n                var title = context.course.title;\n\n                var url = \"\";\n                if (window != window.top && ('referrer' in document)) {\n                    url = document.referrer;\n                } else {\n                    url = window.location.toString();\n                }\n\n                url = url + '?course_id=' + context.course.id;\n\n                activityProvider.initActivity(id, title, url);\n            });\n        }\n\n        function onInitializationFailed(reason) {\n            console.log(reason);\n            deactivate();\n            if (self.xApiSettings.enabled)\n                errorsHandler.handleError(reason);\n        }\n\n        function checkIsCourseStarted() {\n            var progress = progressContext.get();\n            return _.isObject(progress) && _.isObject(progress.user);\n        }\n    }\n);\n","define('account/routing/guardRoute',['plugins/router', 'underscore', 'templateSettings', 'userContext', '../limitAccess/accessLimiter',\n        'modules/progress/progressStorage/auth', 'progressContext'],\n function (router, _, templateSettings, userContext, accessLimiter, auth, progressContext) {\n    'use strict';\n\n    var defaultGuard = null,\n        loginGuardSkipped = false;\n\n\n    function guardViewUrl(route, guardView) {\n        return route.queryString ? guardView + '?' + route.queryString : guardView;\n    }\n\n    return {\n        createGuard: function () {\n            defaultGuard = router.guardRoute;\n            var loginGuardView = 'login',\n                registerGuardView = 'register',\n                signinGuardView = 'signin',\n                noAccessGuardView = 'noaccess';\n\n            router.guardRoute = function (model, route) {\n                var user = userContext.getCurrentUser(),\n                    accessLimitationEnabled = accessLimiter.accessLimitationEnabled(),\n                    xapiEnabled = templateSettings.xApi.enabled,\n                    npsEnabled = templateSettings.nps.enabled,\n                    allowCrossDeviceSaving = templateSettings.allowCrossDeviceSaving,\n                    currentRoute = route.config.route;\n                    \n                if (currentRoute === loginGuardView) {\n                    var checkUserPermission = user && accessLimiter.userHasAccess(user);\n                    if(allowCrossDeviceSaving){\n                        return checkUserPermission && auth.authenticated ? '/': true;\n                    }\n                    return checkUserPermission  ? '/' : true;\n                }\n\n                if((currentRoute === registerGuardView || currentRoute === signinGuardView)\n                    && userContext.user.email){\n                        return accessLimiter.userHasAccess({email:userContext.user.email});\n                    }\n\n                if (!userContext.user.email && !loginGuardSkipped && (xapiEnabled || npsEnabled || allowCrossDeviceSaving || accessLimitationEnabled)) {\n                    return guardViewUrl(route, loginGuardView);\n                }\n\n                if (currentRoute === noAccessGuardView) {\n                    return accessLimitationEnabled && (!user || !accessLimiter.userHasAccess(user)) ? true : '/';\n                }\n\n                if (accessLimitationEnabled && (!user || !accessLimiter.userHasAccess(user))) {\n                    return guardViewUrl(route, noAccessGuardView);\n                }\n\n                if(userContext.user.email && allowCrossDeviceSaving && !auth.authenticated){\n                    return guardViewUrl(route, loginGuardView);\n                }\n\n                if (_.isFunction(defaultGuard)) {\n                    return defaultGuard(model, route);\n                }\n                return true;\n            };\n        },\n        skipLoginGuard: function () {\n            loginGuardSkipped = true;\n        }\n    };\n});\n","define('modules/progress/constants',[],function(){\n    'use strict';\n    \n    return {\n        progressKey: 'course_progress',\n        resultKey: 'course_result'\n    };\n});\n","define('modules/progress/localStorage/index',['context', '../constants'], function (context, constants) {\n    'use strict';\n    \n    function LocalStorageProgressProvider(courseId, templateId) {\n        this.courseId = courseId;\n        this.templateId = templateId;\n\n        this.progressKey = constants.progressKey +this.courseId+this.templateId;\n        this.resultKey = constants.resultKey +this.courseId+this.templateId;\n        \n        this.getProgress = function () {\n            var progress = {};\n            try {\n                progress = JSON.parse(localStorage.getItem(this.progressKey));\n            } catch (e) {\n                console.log('Unable to restore progress from localStorage');\n            }\n            return progress;\n        };\n        \n        this.saveProgress = function(progress){\n            try {\n                localStorage.setItem(this.progressKey, JSON.stringify(progress));\n            } catch (e) {\n                return false;\n            }\n            return true;\n        };\n        \n        this.saveResults = function () {\n            var result = {\n                score: context.course.score(),\n                status: context.course.getStatus()\n            };\n\n            try {\n                localStorage.setItem(this.resultKey, JSON.stringify(result));\n            } catch (e) {\n                alert(TranslationPlugin.getTextByKey('[not enough memory to save progress]'));\n            }\n            return true;\n        };\n        \n        this.removeProgress = function () {\n            try {\n                localStorage.removeItem(this.progressKey);\n            } catch (e) {\n                console.log('Unable to remove progress from localStorage');\n            }\n            return true;\n        };\n    }\n    \n    return LocalStorageProgressProvider;\n});\n","define('modules/progress/progressStorage/index',['context', '../constants', './httpWrapper', './urlProvider',\n        './auth', 'helpers/requestResender'\n    ],\n    function (context, constants, httpWrapper, urlProvider, auth, requestResender) {\n        'use strict';\n\n        function ProgressStorageProvider(courseId, templateId) {\n            var _progress = null;\n            this.courseId = courseId;\n            this.templateId = templateId;\n\n            this.progressKey = constants.progressKey + this.courseId + this.templateId;\n            this.resultKey = constants.resultKey + this.courseId + this.templateId;\n\n            this.getProgress = function () {\n                return _progress;\n            };\n\n            this.setProgress = function (progress){\n                _progress = progress;\n            };\n\n            this.getProgressFromServer = function () {\n                return httpWrapper.get(urlProvider.progressStorageUrl + 'progress', {\n                    courseId: this.courseId,\n                    templateId: this.templateId,\n                }, auth.headers).then(function (response) {\n                    _progress = JSON.parse(response.progress);\n                    return response.progress;\n                });\n            }\n\n            this.saveProgress = function (progress) {\n                var requestOptions = {\n                    url: urlProvider.progressStorageUrl + 'progress',\n                    method: 'POST',\n                    data: {\n                        courseId: this.courseId,\n                        templateId: this.templateId,\n                        jsonProgress: progress ? JSON.stringify(progress) : null\n                    },\n                    headers: auth.headers,\n                    cache: false\n                };\n\n                return requestResender.send(requestOptions);\n            };\n\n            this.saveResults = function (getScore, getStatus, errorMessage) {\n                //TODO: now we use only localStorage for save results\n                var result = {\n                    score: context.course.score(),\n                    status: context.course.getStatus()\n                };\n\n                try {\n                    localStorage.setItem(this.resultKey, JSON.stringify(result));\n                } catch (e) {\n                    alert(TranslationPlugin.getTextByKey('[not enough memory to save progress]'));\n                }\n                return true;\n            };\n\n            this.removeProgress = function (callback) {\n                 return httpWrapper.post(urlProvider.progressStorageUrl + 'progress', {\n                    courseId: this.courseId,\n                    templateId: this.templateId,\n                    jsonProgress: null\n                }, auth.headers);\n            };\n        }\n\n        return ProgressStorageProvider;\n    });\n","define('modules/progress/index',['q', 'underscore', 'context', 'userContext', 'templateSettings', './localStorage/index', './progressStorage/index',\n        './progressStorage/auth', 'account/limitAccess/accessLimiter', 'helpers/loginHelper'\n    ],\n    function (Q, _, context, userContext, templateSettings, LocalStorageProvider, ProgressStorageProvider, auth, accessLimiter, loginHelper) {\n        'use strict';\n        var _psProvider = null,\n            _lsProvider = null;\n\n        return {\n            initialize: initialize,\n            initProgressStorage: initProgressStorage,\n            clearLocalStorage: clearLocalStorage\n        };\n\n        function initialize() {\n            var defer = Q.defer();\n\n            _psProvider = new ProgressStorageProvider(context.course.id, context.course.templateId);\n            _lsProvider = new LocalStorageProvider(context.course.id, context.course.templateId);\n\n            if (userContext.user.email) {\n                auth.signout();\n            }\n\n            if (templateSettings.allowCrossDeviceSaving) {\n                var token = loginHelper.token;\n\n                if (!_.isNull(token)) {\n                    auth.setToken(token);\n                }\n\n                if (auth.authenticated) {\n                    initProgressStorage(resolve);\n                } else {\n                    resolve(_lsProvider);\n                }\n            } else {\n                resolve(_lsProvider);\n            }\n\n            return defer.promise;\n\n            function resolve(provider) {\n                defer.resolve(provider);\n            }\n        }\n\n        function initProgressStorage(callback) {\n            auth.identify().then(function (user) {\n                userContext.user.email = user.email;\n                if (!accessLimiter.userHasAccess({ email: user.email })) {\n                    auth.signout();\n                    callback(_lsProvider);\n                    return;\n                }\n\n                userContext.user.email = user.email;\n                userContext.user.username = user.name;\n                userContext.user.keepMeLoggedIn = !auth.shortTermAccess;\n                return _psProvider.getProgressFromServer().then(function(progress){\n                    var lsprogress = _lsProvider.getProgress();\n                    if (lsprogress && lsprogress.user && user.email == lsprogress.user.email) {\n                        lsprogress.user.username = userContext.user.username;\n                        if(progress == null){\n                            _psProvider.setProgress(lsprogress);\n                            _psProvider.saveProgress(lsprogress);\n                        }\n                        _lsProvider.removeProgress();\n                    }\n                    callback(_psProvider)\n                });\n            }).fail(function () {\n                callback(_lsProvider);\n            });\n        }\n\n        function clearLocalStorage() {\n            _lsProvider.removeProgress();\n        }\n    });\n","define('account/account',['plugins/router', 'context', './header/index', './socialNetworks/index', './helpers/validatedValue', 'xApi/constants',\n        'userContext', 'templateSettings', 'modules/progress/progressStorage/urlProvider',\n        'modules/progress/progressStorage/auth', './limitAccess/accessLimiter', 'xApi/xApiInitializer', './routing/guardRoute',\n        'modules/progress/index', 'progressContext'\n    ],\n    function (router, context, Header, SocialNetworks, validatedValue, constants, userContext, templateSettings,\n        urlProvider, auth, accessLimiter, xApiInitializer, guardRoute, progressProvider, progressContext) {\n        'use strict';\n\n        var _private = {\n            crossDeviceEnabled: templateSettings.allowCrossDeviceSaving,\n            isActivatedPreviously: false\n        };\n\n        var viewmodel = {\n            activate: activate,\n            submit: checkUser,\n            skip: skip,\n            header: null,\n            socialNetworks: null,\n            email: userContext.user.email || '',\n            socialLoginEnabled: false,\n            skipAllowed: false,\n            canActivate: canActivate,\n            requestProcessing: ko.observable(false)\n        };\n        \n        viewmodel.socialLoginEnabled = templateSettings.allowCrossDeviceSaving && templateSettings.allowLoginViaSocialMedia;\n        viewmodel.skipAllowed = !templateSettings.xApi.required;\n\n        viewmodel.email = validatedValue(function (value) {\n            return !!value() && constants.patterns.email.test(value());\n        });\n\n        return viewmodel;\n\n        function canActivate(){\n            var defer = Q.defer();\n            if(userContext.user.email && !_private.isActivatedPreviously){\n                _private.isActivatedPreviously = true;\n                viewmodel.email(userContext.user.email);\n                submit(true, function(canActivate){\n                    defer.resolve(canActivate);\n                });\n            } else {\n                _private.isActivatedPreviously = true;\n                defer.resolve(true);\n            }\n            return defer.promise;\n        }\n\n        function activate() {\n            viewmodel.requestProcessing(false);\n            viewmodel.header = new Header(context.course.title);\n            viewmodel.socialNetworks = viewmodel.socialLoginEnabled ? new SocialNetworks(context.course.title, urlProvider.progressStorageUrl) : null;\n        }\n\n        function checkUser(){\n            submit(false);\n        }\n\n        function submit(replaceWindow, callback) {\n            if(viewmodel.requestProcessing()){\n                return;\n            }\n            callback = callback || function(){};\n            if(!viewmodel.email.isValid()){\n                viewmodel.email.markAsModified();\n                callback(true);\n                return;\n            }\n            userContext.user.email = viewmodel.email();\n            if(!accessLimiter.userHasAccess({ email: viewmodel.email() })){\n                _navigate('noaccess', replaceWindow);\n                callback(false);\n                return;\n            }\n            if(_private.crossDeviceEnabled){\n                return userExists(replaceWindow, callback);\n            } else {\n                _navigate('register', replaceWindow);\n                callback(false);\n            }\n        }\n\n        function skip() {\n            if(viewmodel.requestProcessing()){\n                return;\n            }\n\n            xApiInitializer.deactivate();\n            guardRoute.skipLoginGuard();\n            if (!accessLimiter.userHasAccess({ email: viewmodel.email() })) {\n                router.navigate('noaccess');\n                return;\n            }\n            templateSettings.allowCrossDeviceSaving = false;\n            progressProvider.initialize().then(function(provider){\n                progressContext.use(provider);                \n                progressContext.restoreProgress();\n            });\n        }\n\n        function userExists(replaceWindow, callback){\n            viewmodel.requestProcessing(true);\n            return auth.exists(viewmodel.email()).then(function(){\n                callback(false);\n                viewmodel.requestProcessing(false);\n                _navigate('register', replaceWindow);\n            }).fail(function(reason){\n                callback(false);\n                viewmodel.requestProcessing(false);\n                if(reason.status === 409){\n                    _navigate('signin', replaceWindow);\n                }\n            })\n        }\n\n        function _navigate(route, replaceWindow){\n            if(replaceWindow){\n                window.location.hash = '#' + route;\n                return;\n            }\n            router.navigate(route);\n        }\n    });\n","define('routing/routes',['underscore'], function (_) {\n    'use strict';\n\n    return {\n        routes: [{\n            route: ['', 'introduction'],\n            moduleId: 'viewmodels/introduction',\n            title: TranslationPlugin.getTextByKey('[introduction page title]')\n        }, {\n            route: 'sections',\n            moduleId: 'viewmodels/sections',\n            title: TranslationPlugin.getTextByKey('[sections page title]'),\n            displayTreeOfContent: true\n        }, {\n            route: 'section/:sectionId/question/:questionId',\n            moduleId: 'viewmodels/questions/content',\n            title: TranslationPlugin.getTextByKey('[question page title]'),\n            displayTreeOfContent: true,\n            showExitButton: true,\n            rootLinkEnabled: true\n        }, {\n            route: 'finish',\n            moduleId: 'resultPage/resultPage',\n            title: TranslationPlugin.getTextByKey('[results page title]'),\n            showExitButtonInReviewMode: true\n        }, {\n            route: '404(/:url)',\n            moduleId: 'viewmodels/404',\n            title: TranslationPlugin.getTextByKey('[not found page title]')\n        }],\n        add: add\n    };\n\n    function add(routes) {\n        var self = this;\n        if (_.isObject(routes) && _isRouteCorrect(routes)) {\n            this.routes.push(routes);\n        } else if (_.isArray(routes)) {\n            _.each(routes, function (route) {\n                if (_isRouteCorrect(route)) {\n                    self.routes.push(route);\n                } else {\n                    throw 'Route not correct';\n                }\n            });\n        }\n    };\n\n    function _isRouteCorrect(route) {\n        return _.isObject(route) && route.hasOwnProperty('route') &&\n            route.hasOwnProperty('moduleId') && route.hasOwnProperty('title');\n    }\n});\n","define('account/routing/routes',[],function () {\n    'use strict';\n\n    return [\n        {\n            route: 'login',\n            moduleId: 'account/account',\n            title: TranslationPlugin.getTextByKey('[login page title]')\n        }, {\n            route: 'noaccess',\n            moduleId: 'account/limitAccess/index',\n            title: TranslationPlugin.getTextByKey('[limited access page title]')\n        }, {\n            route: 'signin',\n            moduleId: 'account/signin/index',\n            title: TranslationPlugin.getTextByKey('[sign in page title]')\n        }, {\n            route: 'register',\n            moduleId: 'account/register/index',\n            title: TranslationPlugin.getTextByKey('[register page title]')\n        }\n    ];\n});\n","define('account/index',['plugins/router', 'routing/routes', 'templateSettings', 'publishSettings',\n        './limitAccess/accessLimiter', './routing/guardRoute', './routing/routes', 'modules/progress/progressStorage/auth', 'modules/publishModeProvider'\n    ],\n    function (router, mainRoutes, templateSettings, publishSettings, accessLimiter, guardRoute, routes, auth, publishModeProvider) {\n        'use strict';\n\n        return {\n            enable: enable\n        };\n\n        function enable() {\n            var xAPI = templateSettings.xApi.enabled;\n            var nps = templateSettings.nps.enabled;\n            var crossDeviceSaving = templateSettings.allowCrossDeviceSaving;\n            \n            if (publishModeProvider.isScormEnabled) {\n                return;\n            }\n\n            if (publishModeProvider.isPreview || publishModeProvider.isReview) {\n               return;\n            }\n            \n            accessLimiter.initialize(publishSettings.accessLimitation);\n\n            if (xAPI || nps || crossDeviceSaving || accessLimiter.accessLimitationEnabled()) {\n                guardRoute.createGuard();\n                mainRoutes.add(routes);\n            }\n        }\n\n    });\n","define('account/limitAccess/index',['plugins/router', 'context', 'userContext', './accessLimiter'], function (router, context, userContext, accessLimiter) {\n\n    \"use strict\";\n\n    return {\n        courseTitle: context.course.title,\n        canActivate: function () {\n            var user = userContext.getCurrentUser();\n            if (!accessLimiter.accessLimitationEnabled() || (user && accessLimiter.userHasAccess(user))) {\n                return { redirect: '/' };\n            }\n\n            return true;\n        },\n        activate: function () {\n        },\n        backToSignin: function () {\n            userContext.clear();\n            router.navigate('login');\n        }\n    };\n});\n","define('account/register/index',['knockout', 'plugins/router', 'context', 'userContext', '../header/index', '../helpers/validatedValue', 'modules/progress/progressStorage/auth',\n        'templateSettings', 'xApi/xApiInitializer', 'eventManager', 'modules/progress/index', 'progressContext'\n    ],\n    function (ko, router, context, userContext, Header, validatedValue,\n            auth, templateSettings, xApiInitializer, eventManager, progressProvider, progressContext) {\n        'use strict';\n\n        var whitespaceRegex = /\\s/;\n\n        var viewmodel = {\n            activate: activate,\n            header: null,\n            name: userContext.user.username || '',\n            password: null,\n            rememberMe: ko.observable(false),\n            isPasswordVisible: ko.observable(false),\n            togglePasswordVisibility: togglePasswordVisibility,\n            submit: submit,\n            toggleRememberMe: toggleRememberMe,\n            back: back,\n            crossDeviceEnabled: false,\n            requestProcessing: ko.observable(false)\n        };\n\n        viewmodel.name = validatedValue(function (value) {\n            return !!value();\n        });\n\n        viewmodel.password = validatedValue(function (value) {\n            return value().length >= 7 && !whitespaceRegex.test(value());\n        });\n        viewmodel.password.noSpaces = ko.observable(false);\n        viewmodel.password.moreThanSevenSymbols = ko.observable(false);\n        viewmodel.password.onKeyUp = function () {\n            if (viewmodel.password().length >= 7) {\n                viewmodel.password.moreThanSevenSymbols(true);\n            } else {\n                viewmodel.password.moreThanSevenSymbols(false);\n            }\n            if (!whitespaceRegex.test(viewmodel.password())) {\n                viewmodel.password.noSpaces(true);\n            } else {\n                viewmodel.password.noSpaces(false);\n            }\n        }\n\n\n        return viewmodel;\n\n        function activate() {\n            viewmodel.header = new Header(context.course.title);\n            viewmodel.crossDeviceEnabled = templateSettings.allowCrossDeviceSaving;\n            if(userContext.user.username){\n                viewmodel.name(userContext.user.username);\n            }\n        }\n\n        function submit() {\n            if(viewmodel.requestProcessing()){\n                return;\n            }\n            if (!viewmodel.name.isValid()) {\n                viewmodel.name.markAsModified();\n                return;\n            }\n            userContext.user.username = viewmodel.name();\n            if (viewmodel.crossDeviceEnabled && !viewmodel.password.isValid()) {\n                viewmodel.password.markAsModified();\n                return;\n            } else if (viewmodel.crossDeviceEnabled && viewmodel.password.isValid()) {\n                userContext.user.password = viewmodel.password();\n                register();\n            } else {\n                activateXapi(function () {\n                    eventManager.courseStarted();\n                    router.navigate('');\n                });\n            }\n        }\n\n        function toggleRememberMe() {\n            if(viewmodel.requestProcessing()){\n                return;\n            }\n            viewmodel.rememberMe(userContext.user.keepMeLoggedIn = !viewmodel.rememberMe());\n        }\n\n        function togglePasswordVisibility() {\n            viewmodel.isPasswordVisible(!viewmodel.isPasswordVisible());\n            viewmodel.password.hasFocus(true);\n        }\n\n        function back() {\n            router.navigate('login');\n        }\n\n        function register() {\n            viewmodel.requestProcessing(true);\n            auth.register(userContext.user.email,\n                    userContext.user.password,\n                    userContext.user.username,\n                    userContext.user.keepMeLoggedIn)\n                .then(function (response) {\n                    return progressProvider.initProgressStorage(function(provider){\n                        progressProvider.clearLocalStorage();\n                        progressContext.use(provider);\n                        return activateXapi(function () {\n                            viewmodel.requestProcessing(false);\n                            progressContext.restoreProgress();\n                            if (context.isInReviewAttemptMode()) {\n                                xApiInitializer.deactivate();\n                            }\n                            eventManager.courseStarted();\n                        });\n                    });\n                }).fail(function (reason) {\n                    viewmodel.requestProcessing(false);\n                    if (reason.status == 409) {\n                        router.navigate('signin');\n                    }\n                });\n        }\n\n        function activateXapi(callback) {\n            if (xApiInitializer.isInitialized) {\n                return xApiInitializer.activate(userContext.user).then(callback);\n            }\n            callback();\n        }\n    });\n","define('account/signin/index',['knockout', 'plugins/router', 'context', 'userContext', '../header/index', '../helpers/validatedValue', 'templateSettings',\n        'modules/progress/progressStorage/auth', 'xApi/xApiInitializer', 'modules/progress/index', 'progressContext', 'eventManager'\n],\n    function (ko, router, context, userContext, Header, validatedValue, templateSettings, auth,\n        xApiInitializer, progressProvider, progressContext, eventManager) {\n        'use strict';\n\n        var whitespaceRegex = /\\s/;\n\n        var viewmodel = {\n            activate: activate,\n            header: null,\n            password: null,\n            email: null,\n            back: back,\n            rememberMe: ko.observable(false),\n            toggleRememberMe: toggleRememberMe,\n            submit: submit,\n            sendSecretLink: sendSecretLink,\n            isSecretLinkSent: ko.observable(false),\n            isPasswordVisible: ko.observable(false),\n            togglePasswordVisibility: togglePasswordVisibility,\n            emailPasswordCombination: ko.observable(false),\n            requestProcessing: ko.observable(false),\n            isRestorePasswordEmailSent: ko.observable(false),\n            forgotPassword: forgotPassword\n        };\n\n        viewmodel.password = validatedValue(function (value) {\n            return value().length >= 7 && !whitespaceRegex.test(value());\n        });\n\n        return viewmodel;\n\n        function activate() {\n            viewmodel.header = new Header(context.course.title);\n            viewmodel.email = userContext.user.email;\n        }\n\n        function back() {\n            router.navigate('login');\n        }\n\n        function toggleRememberMe() {\n            if (viewmodel.requestProcessing()) {\n                return;\n            }\n            viewmodel.rememberMe(userContext.user.keepMeLoggedIn = !viewmodel.rememberMe());\n        }\n\n        function submit() {\n            if (viewmodel.requestProcessing()) {\n                return;\n            }\n            if (!viewmodel.password.isValid()) {\n                viewmodel.password.markAsModified();\n                return;\n            }\n            userContext.user.password = viewmodel.password();\n            viewmodel.requestProcessing(true);\n            auth.signin(userContext.user.email,\n                    userContext.user.password,\n                    userContext.user.keepMeLoggedIn)\n                .then(function (response) {\n                    return progressProvider.initProgressStorage(function (provider) {\n                        progressProvider.clearLocalStorage();\n                        progressContext.use(provider);\n                        return activateXapi(function () {\n                            viewmodel.requestProcessing(false);\n                            progressContext.restoreProgress();\n                            if (context.isInReviewAttemptMode()) {\n                                xApiInitializer.deactivate();\n                            }\n                            eventManager.courseStarted();\n                        });\n                    });\n                }).fail(function (reason) {\n                    viewmodel.requestProcessing(false);\n                    if (reason.status == 403) {\n                        viewmodel.emailPasswordCombination(true);\n                    }\n                })\n        }\n\n        function togglePasswordVisibility() {\n            viewmodel.isPasswordVisible(!viewmodel.isPasswordVisible());\n            viewmodel.password.hasFocus(true);\n        }\n\n        function activateXapi(callback) {\n            if (xApiInitializer.isInitialized) {\n                return xApiInitializer.activate(userContext.user).then(callback);\n            }\n            callback();\n        }\n\n        function sendSecretLink() {\n            if (viewmodel.requestProcessing() || viewmodel.isSecretLinkSent()) {\n                return;\n            }\n            auth.sendSecreLink(userContext.user.email, context.course.title).then(function () {\n                viewmodel.isRestorePasswordEmailSent(false);\n                viewmodel.isSecretLinkSent(true);\n                toggleValueAfterSomeTime(viewmodel.isSecretLinkSent, 5000);\n            });\n        }\n\n        function forgotPassword() {\n            if (viewmodel.requestProcessing() || viewmodel.isRestorePasswordEmailSent()) {\n                return;\n            }\n            auth.forgotpassword(userContext.user.email).then(function () {\n                viewmodel.isSecretLinkSent(false);\n                viewmodel.isRestorePasswordEmailSent(true);\n                toggleValueAfterSomeTime(viewmodel.isRestorePasswordEmailSent, 5000);\n            });\n        }\n\n        function toggleValueAfterSomeTime(value, time) {\n            _.delay(function () {\n                value(!value());\n            }, time);\n        }\n    });\n","define('dialogs/continueLater',['modules/progress/progressStorage/auth', 'context', 'userContext', 'templateSettings', 'includedModules/modulesInitializer', 'modules/publishModeProvider'],\n    function (auth, context, userContext, templateSettings, modulesInitializer, publishModeProvider) {\n\n        var viewModel = {\n            activate: activate,\n            progressStorageActivated: false,\n            email: '',\n            sendSecretLink: sendSecretLink,\n            isSecretLinkSent: ko.observable(false),\n            keepMeLoggedIn: ko.observable(false),\n            toggleKeepMeLoggedIn: toggleKeepMeLoggedIn,\n            isSecondRemarkShouldBeShown: true\n        };\n\n        return viewModel;\n\n        function sendSecretLink() {\n            auth.sendSecreLink(userContext.user.email, context.course.title).then(function () {\n                viewModel.isSecretLinkSent(true);\n            });\n        }\n        \n        function toggleKeepMeLoggedIn(){\n            viewModel.keepMeLoggedIn(userContext.user.keepMeLoggedIn = !viewModel.keepMeLoggedIn())\n            auth.shortTermAccess = !userContext.user.keepMeLoggedIn;\n        }\n\n        function activate(data) {\n            if (data) {\n                viewModel.close = data.close;\n                viewModel.exit = function () {\n                    if (!userContext.user.keepMeLoggedIn) {\n                        auth.signout();\n                    }\n                    data.exit();\n                };\n                viewModel.progressStorageActivated = templateSettings.allowCrossDeviceSaving && !publishModeProvider.isScormEnabled;\n                viewModel.isSecondRemarkShouldBeShown = !(templateSettings.allowCrossDeviceSaving || publishModeProvider.isScormEnabled);\n                viewModel.email = userContext.user.email;\n                viewModel.keepMeLoggedIn(userContext.user.keepMeLoggedIn);\n            }\n        }\n    });\n","define('dialogs/dialog',[\"plugins/router\"], function(router) {\n    function Dialog() {\n        var that = this;\n        this.view = null;\n        this.isVisible = ko.observable(false);\n        this.callbacks = {};\n        this.show = function(callbacks) {\n            if (router.isNavigationLocked()) {\n                return;\n            }\n\n            if (callbacks) that.callbacks = callbacks;\n\n            that.isVisible(true);\n        };\n\n        this.hide = function() {\n            that.isVisible(false);\n            if (_.isFunction(that.callbacks.closed)) {\n                that.callbacks.closed();\n            }\n\n            that.view &&\n                that.view.removeEventListener(\"keydown\", handleKeyDown);\n        };\n\n        this.compositionComplete = function(child) {\n            that.view = child;\n            that.view.addEventListener(\"keydown\", handleKeyDown);\n\n            var focusableState = getFocusableState(that.view);\n            if (!focusableState.currentFocusable) {\n                focusableState.firstFocusable &&\n                    focusableState.firstFocusable.focus();\n            }\n        };\n\n        function handleKeyDown(e) {\n            var KEY_TAB = 9;\n\n            var focusableState = getFocusableState(that.view);\n\n            switch (e.keyCode) {\n                case KEY_TAB:\n                    if (focusableState.entries.length === 1) {\n                        e.preventDefault();\n                        break;\n                    }\n                    if (e.shiftKey) {\n                        if (\n                            document.activeElement ===\n                            focusableState.firstFocusable\n                        ) {\n                            e.preventDefault();\n                            focusableState.lastFocusable.focus();\n                        }\n                    } else {\n                        if (\n                            document.activeElement ===\n                            focusableState.lastFocusable\n                        ) {\n                            e.preventDefault();\n                            focusableState.firstFocusable.focus();\n                        }\n                    }\n                    break;\n                default:\n                    break;\n            }\n        }\n\n        function getFocusableState(view) {\n            var result = {};\n            result.entries = [].slice.call(\n                view.querySelectorAll(\n                    \"a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), [contenteditable]\"\n                )\n            );\n\n            result.firstFocusable = result.entries[0];\n            result.lastFocusable = result.entries[result.entries.length - 1];\n\n            result.currentFocusable = null;\n\n            for (var i = 0; i < result.entries.length; i++) {\n                if (result.entries[i] === document.activeElement) {\n                    result.currentFocusable = result.entries[i];\n                    break;\n                }\n            }\n\n            return result;\n        }\n    }\n\n    return Dialog;\n});\n\n","define('dialogs/nps/figures/evaluation',['templateSettings'], function(templateSettings) {\n    return {\n        textColor: templateSettings.getColorValue('@text-color'),\n        correctColor: templateSettings.getColorValue('@correct-color'),\n        contentBodyColor: templateSettings.getColorValue('@content-body-color'),\n        buttonTextColor: templateSettings.getColorValue('@button-text-color')\n    };\n});\n","define('dialogs/nps/figures/feedback',['templateSettings'], function(templateSettings) {\n    var viewModel = {\n        score: 0,\n        feedbackColor: '',\n        textColor: templateSettings.getColorValue('@text-color'),\n        activate: activate\n    };\n\n    function activate(score) {\n        var colorName = score > 6 ? '@correct-color' : '@secondary-color';\n        viewModel.feedbackColor = templateSettings.getColorValue(colorName);\n        viewModel.score = score;\n    }\n\n    return viewModel;\n});\n","define('dialogs/nps/figures/rocket',['templateSettings'], function(templateSettings) {\n    return {\n        textColor: templateSettings.getColorValue('@text-color'),\n        mainColor: templateSettings.getColorValue('@main-color'),\n        contentBodyColor: templateSettings.getColorValue('@content-body-color')\n    };\n});\n","define('repositories/courseRepository',['context'], function (context) {\n\n    return {\n        get: get\n    };\n\n    function get() {\n        return _.isObject(context.course) ? context.course : null;\n    }\n\n});\n","define('dialogs/nps/nps',['knockout', 'underscore', 'repositories/courseRepository', 'templateSettings', 'browserSupport'],\n    function(ko, _, courseRepository, templateSettings, browserSupport) {\n        var steps = {\n            evaluation: 'evaluation',\n            feedback: 'feedback',\n            end: 'end'\n        };\n\n        var course = courseRepository.get();\n\n        var viewModel = {\n            activate: activate,\n            submit: submit,\n            goToFeedbackStep: goToFeedbackStep,\n            score: ko.observable(0),\n            feedback: ko.observable(''),\n            isFeedbackEditing: ko.observable(false),\n            currentStep: ko.observable(),\n            callbacks: {},\n            compositionComplete: compositionComplete,\n            isCompositionComplete: ko.observable(false),\n            evaluationStepTitle: '',\n            isCourseEmbedded: window.self !== window.top,\n            isReporting: ko.observable(false)\n        };\n\n        viewModel.isEvaluationStep = ko.computed(function() {\n            return viewModel.currentStep() === steps.evaluation;\n        });\n\n        viewModel.isFeedbackStep = ko.computed(function() {\n            return viewModel.currentStep() === steps.feedback;\n        });\n\n        viewModel.isLastStep = ko.computed(function() {\n            return viewModel.currentStep() === steps.end;\n        });\n\n        return viewModel;\n\n        function activate(data) {\n            if (!data.close)\n                throw 'Nps dialog activation data close() method is not specified';\n\n            viewModel.close = data.close;\n            if (data.callbacks)\n                viewModel.callbacks = data.callbacks;\n\n            viewModel.score(0);\n            viewModel.feedback('');\n            viewModel.currentStep(steps.evaluation);\n            viewModel.isReporting(false);\n            viewModel.isFeedbackEditing(false);\n\n            var evaluationStepTitleKey = templateSettings.xApi.enabled ? '[progress has been reported]' : '[you have finished your course]';\n            viewModel.evaluationStepTitle = TranslationPlugin.getTextByKey(evaluationStepTitleKey);\n        }\n\n        function compositionComplete() {\n            viewModel.isCompositionComplete(true);\n        }\n\n        function goToFeedbackStep() {\n            viewModel.currentStep(steps.feedback);\n            if (!browserSupport.isMobileDevice) {\n                viewModel.isFeedbackEditing(true);\n            }\n        }\n\n        function submit() {\n            viewModel.isReporting(true);\n\n            course.evaluate({\n                score: viewModel.score() / 10,\n                response: viewModel.feedback().trim()\n            }, function() {\n                viewModel.isReporting(false);\n                viewModel.currentStep(steps.end);\n                if (_.isFunction(viewModel.callbacks.finalized)) {\n                    viewModel.callbacks.finalized();\n                }\n            });\n        }\n    });\n","    define('dialogs/resultsResend/resultsResend',['knockout', 'localizationManager', 'underscore', 'repositories/courseRepository'],\n    function(ko, localizationManager, _, courseRepository) {\n        var course = courseRepository.get();\n\n        var viewModel = {\n            next: {},\n            resend: {},\n            retryCount: 0,\n            resultsSendErrorTitleText: '',\n            endpointNameText: '',\n\n            isCompositionComplete: ko.observable(false),\n            isResendingResults: ko.observable(false),\n            resendingFailed: ko.observable(false),\n            retriesExceeded: ko.observable(false),\n\n            activate: activate,\n            compositionComplete: compositionComplete,\n            resendResults: resendResults,\n            skipResultsSending: skipResultsSending,\n            hideDialog: hideDialog\n        };\n       \n        return viewModel;\n\n        function activate(data) {\n            throwIfNotDefined(data.callbacks, 'callbacks');\n            throwIfNotDefined(data.callbacks.resend, 'callbacks.resend');\n            throwIfNotDefined(data.callbacks.next, 'callbacks.next');\n            throwIfNotDefined(data.close, 'close');\n\n            throwIfNotDefined(data.resultsSendErrorTitleKey, 'resultsSendErrorTitleKey');\n            throwIfNotDefined(data.endpointNameKey, 'endpointNameKey');\n\n            viewModel.resultsSendErrorTitleText = localizeText(data.resultsSendErrorTitleKey);\n            viewModel.endpointNameText = localizeText(data.endpointNameKey);\n\n            viewModel.resend = data.callbacks.resend;\n            viewModel.next = data.callbacks.next;\n            viewModel.close = data.close;\n\n            viewModel.retryCount = data.retryCount || 10;\n\n        }\n\n        function compositionComplete() {\n            viewModel.isCompositionComplete(true);\n        }\n        \n        function resendResults() {\n            viewModel.isResendingResults(true);\n\n            viewModel.resend(course)\n                .then(function() {\n                    hideDialog();\n                    viewModel.next();\n                })\n                .catch(function() {\n                    viewModel.retryCount ? viewModel.retryCount-- : viewModel.retriesExceeded(true);\n                    \n                    viewModel.isResendingResults(false);\n                    animateNates();\n                });\n        }\n\n        function skipResultsSending() {\n            hideDialog();\n            viewModel.next();\n        }\n\n        function hideDialog() {\n            viewModel.isResendingResults(false);\n            viewModel.close();\n        }\n\n        function localizeText(key) {\n            return localizationManager.getLocalizedText(key);\n        }\n\n        function throwIfNotDefined(parameter, parameterName) {\n            if(_.isNullOrUndefined(parameter)) {\n                throw 'Can\\'t activate dialog. Parameter isn\\'t defined. Parameter name: ' + parameterName;\n            }\n        }\n\n        function animateNates() {\n            viewModel.resendingFailed(true);\n            setTimeout(function() {\n                viewModel.resendingFailed(false);\n            }, 400);\n        }\n    });\n","define('dialogs/startNewAttempt/startNewAttempt',['knockout', 'progressContext'],\n    function(ko, progressContext) {\n        var viewModel = {\n            activate: activate,\n            callbacks: {},\n            compositionComplete: compositionComplete,\n            isCompositionComplete: ko.observable(false),\n            isStartingNewAttempt: ko.observable(false),\n            startNewAttempt: startNewAttempt,\n            hide: hide\n        };\n       \n        return viewModel;\n\n        function activate(data) {\n            if (!data.close)\n                throw 'Start new attempt dialog activation data close() method is not specified';\n\n            viewModel.close = data.close;\n            if (data.callbacks)\n                viewModel.callbacks = data.callbacks;\n        }\n\n        function compositionComplete() {\n            viewModel.isCompositionComplete(true);\n        }\n\n        function hide() {\n            viewModel.isCompositionComplete(false);\n            viewModel.close && viewModel.close();\n        }\n        \n        function startNewAttempt() {\n            viewModel.isStartingNewAttempt(true);\n            progressContext.remove(function() {\n                window.location = window.location.href.split(\"#\")[0];\n            });\n        }\n    });\n","define('errorsHandler',['durandal/app', 'plugins/router', 'constants'],\n    function (app, router, constants) {\n        \"use strict\";\n\n        var lastError;\n        var started = false;\n\n        function handleError(error) {\n            if (error && error.navigateUrl) {\n                setTimeout(function() {\n                    router.navigate(error.navigateUrl, { replace: true, trigger: true });\n                }, 100);\n            }\n        }\n\n        function startHandle() {\n            started = true;\n            handleError(lastError);\n        };\n\n        app.on(constants.events.onError).then(function (error) {\n            if (started) {\n                handleError(error);\n            } else {\n                lastError = error;\n            }\n        });\n\n        return {\n            startHandle: startHandle\n        }\n    }\n);\n","define('helpers/appOperations',['durandal/app', 'constants'],\n    function(app, constants) {\n\n        \"use strict\";\n\n        var\n            appOperations = {\n                close: close\n            };\n\n        return appOperations;\n\n        function close(spec) {\n            spec = spec || { shouldCloseWindow: true };\n            if (spec.shouldCloseWindow && window.opener && window !== window.opener) {\n                window.close();\n            }\n            app.trigger(constants.events.appClosed);\n        }\n    }\n);\n","define('modules/lti',['eventManager', 'modules/progress/progressStorage/auth', 'helpers/requestResender', 'errorTracking/errorTracker'],\r\n    function (eventManager, auth, requestResender, errorTracker) {\r\n        'use strict';\r\n        \r\n        var constants = {\r\n            resultCallbackUrlParameterName: 'ltiResultCallbackUrl',\r\n            errorMessage: 'Something went wrong and your final score has not been reported ' + \r\n                '(reason: LTI reporting failed). Please contact the author of the course.'\r\n        };\r\n\r\n        return {\r\n            initialize: initialize\r\n        };\r\n\r\n        function initialize() {\r\n            var resultCallbackUrl = auth.getValueFromUrl(constants.resultCallbackUrlParameterName);\r\n            if (!resultCallbackUrl) {\r\n                return;\r\n            }\r\n\r\n            eventManager.subscribeForEvent(eventManager.events.courseFinished)\r\n                .then(onCourseFinished.bind(this, resultCallbackUrl));\r\n        }\r\n\r\n        function onCourseFinished(resultCallbackUrl, course) {\r\n            var url = resultCallbackUrl + '?score=' + course.score() / 100;\r\n\r\n            var requestOptions = {\r\n                url: url,\r\n                dataType: 'jsonp',\r\n                xhrFields: {\r\n                    withCredentials: true\r\n                }\r\n            };\r\n\r\n            return requestResender.send(requestOptions, onError);\r\n        }\r\n\r\n        function onError(response, textStatus, error) {\r\n            errorTracker.trackError(new Error('Error while sending LTI request. Status: ' \r\n                + textStatus + '. Error: ' + error + '. Response code: ' + response.status));\r\n\r\n            return constants.errorMessage;\r\n        }\r\n    }\r\n);\n","define('modules/progress/progressStorage/certificateProvider',['./urlProvider', './httpWrapper', './auth', 'templateSettings'],\n    function (urlProvider, httpWrapper, auth, templateSettings) {\n        'use strict';\n\n        function CertificateProvider() {\n            this.getCertificateUrl = function (courseId, templateId, courseTitle, score, logoUrl) {\n                var headers = auth.headers;\n                headers['X-UI-Culture'] = getCulture();\n\n                var urlCheckPattern = /(http|https):\\/\\/(\\w+:{0,1}\\w*)?(\\S+)(:[0-9]+)?(\\/|\\/([\\w#!:.?+=&%!\\-\\/]))?/\n\n                var newLogoUrl = function () {\n                    if(logoUrl && !urlCheckPattern.test(logoUrl)) {\n                        if(logoUrl.match(/\\/\\//g)) {\n                            return 'https:' + logoUrl;\n                        }\n                        return  'https://' + logoUrl;\n                    }\n                    else {\n                        return logoUrl;\n                    }\n                }\n                \n                return httpWrapper.post(urlProvider.progressStorageUrl + 'certificates', {\n                    courseId: courseId,\n                    templateId: templateId,\n                    courseTitle: courseTitle,\n                    score: score,\n                    logoUrl: newLogoUrl()\n                }, headers).then(function (response) {\n                    return response.url;\n                });\n            }\n        }\n\n        //todo: remove this temp fix\n        function getCulture() {\n            return templateSettings.languages.selected === 'ua' ? 'uk' : templateSettings.languages.selected;\n        }\n\n        return new CertificateProvider();\n    });\n","define('modules/questionsNavigation',['repositories/sectionRepository', 'plugins/router', 'underscore', 'modules/publishModeProvider'],\n    function (sectionRepository, router, _, publishModeProvider) {\n        function getNavigationContext(sectionId, questionId) {\n            var section = sectionRepository.get(sectionId);\n\n            if (section && section.questions) {\n                var currentItemIndex = _getItemIndexById(section.questions, questionId);\n                if (currentItemIndex > -1) {\n                    return {\n                        previousQuestionUrl: _getQuestionUrl(section, section.questions[currentItemIndex - 1]),\n                        currentQuestionUrl: _getQuestionUrl(section, section.questions[currentItemIndex]),\n                        nextQuestionUrl: _getQuestionUrl(section, section.questions[currentItemIndex + 1]),                        \n                        questionsCount: section.questions.length,\n                        currentQuestionIndex: currentItemIndex + 1,\n                        nextSectionUrl: getNextSectionUrl(section)\n                    };\n                }\n            }\n        }\n\n        function redirectToQuestion() {\n            if (!publishModeProvider.isPreview) {\n                return;\n            }\n\n            var questionId = router.getQueryStringValue('questionId');\n            if (_.isNullOrUndefined(questionId)) {\n                return;\n            }\n\n            var section = sectionRepository.getSectionByQuestionId(questionId);\n            if (_.isNullOrUndefined(section)) {\n                return;\n            }\n\n            window.location.hash = '#section/' + section.id + '/question/' + questionId;\n        }\n\n        function _getItemIndexById(collection, itemId) {\n            for (var i = 0, count = collection.length; i < count; i++) {\n                if (collection[i].id === itemId) {\n                    return i;\n                }\n            }\n            return -1;\n        }\n\n        function _getQuestionUrl(section, question) {\n            if (section && question) {\n                return '#section/' + section.id + '/question/' + question.id;\n            }\n\n            return undefined;\n        }\n\n        function getNextSectionUrl(section) {\n            if (!section) {\n                return;\n            }\n\n            var nextSection = getNextSection(section);\n            if (nextSection) {\n                return  _getQuestionUrl(nextSection, nextSection.questions[0]);\n            }\n        }\n\n        function getNextSection(currentSection) {\n            var sections = sectionRepository.getCollection();\n\n            for (var i = 0; i < sections.length; i++) {\n                if (sections[i].id === currentSection.id) {\n                    return sections[i + 1];\n                }\n            }\n        }\n\n        return {\n            getNavigationContext: getNavigationContext,\n            redirectToQuestion: redirectToQuestion\n        };\n    });\n","define('modules/webhooks',['underscore', 'eventManager', 'userContext'], function(_, eventManager, userContext){\n    'use strict';\n\n    function WebhooksModule () {\n        this.initialized = false;\n        this.url = '';\n    }\n\n    WebhooksModule.prototype.initialize = function (webhooksSettings) {\n        if (this.initialized || !webhooksSettings.url) return;\n\n        this.url = webhooksSettings.url;\n        this.initialized = true;\n    }\n\n    WebhooksModule.prototype.sendResults = function (course) {\n        var defer = Q.defer(),\n            user = userContext.getCurrentUser();\n\n        if(!_.isNullOrUndefined(user)) {\n            var data = {\n                courseId: course.id,\n                learnerId: user.email,\n                score: course.result() * 100,\n                finishedOn: (new Date()).toISOString(),\n                status: course.getStatus() === 'completed' ? 'passed' : 'failed'\n            };\n\n            fetch(this.url, {\n                method: 'POST',\n                headers: {\n                    'Content-Type': 'application/json'\n                },\n                body: JSON.stringify(data)\n            }).then(function(response) {\n                if(response.status !== 200) {\n                    defer.reject();\n                }\n\n                defer.resolve();\n            });\n        } else {\n            defer.resolve();\n        }\n\n        return defer.promise;\n    }\n\n    return new WebhooksModule();\n});\n\n","define('viewmodels/questions/multipleSelect/multipleSelect',[],function () {\n\t\"use strict\";\n\n\tfunction MultipleSelect() {\n\t\tvar self = this;\n\n\t\tthis.question = null;\n\n\t\tthis.questionInstructions = [];\n\t    this.isAnswered = ko.observable(false);\n\t    this.answers = null;\n\t\tthis.isSurveyModeEnabled = false;\n\t};\n\n\tMultipleSelect.prototype.checkItem = function(item) {\n\t\tif (this.isAnswered()) {\n\t\t\treturn;\n\t\t}\n\n\t\titem.isChecked(!item.isChecked());\n\t};\n\n\tMultipleSelect.prototype.initialize = function(question, isPreview) {\n\t\tvar self = this;\n\n\t\treturn Q.fcall(function () {\n\t\t\tself.question = question;\n\n\t\t\tself.isSurveyModeEnabled = !!question.isSurvey;\n\t\t\tself.questionInstructions = question.questionInstructions;\n\t\t\tself.isAnswered(question.isAnswered);\n\t\t\tself.isPreview = ko.observable(_.isUndefined(isPreview) ? false : isPreview);\n\n\t\t\tself.answers = _.map(question.answers, function (answer) {\n\t\t\t\treturn {\n\t\t\t\t\tid: answer.id,\n\t\t\t\t\ttext: answer.text,\n\t\t\t\t\tisChecked: ko.observable(answer.isChecked)\n\t\t\t\t};\n\t\t\t});\n\t\t});\n\t};\n\t\n\tMultipleSelect.prototype.submit = function() {\n\t\tvar self = this;\n\n\t\treturn Q.fcall(function () {\n\t\t\tself.question.submitAnswer(\n\t\t\t\t_.chain(self.answers)\n\t\t\t\t.filter(function (item) {\n\t\t\t\t\treturn item.isChecked();\n\t\t\t\t})\n\t\t\t\t.map(function (item) {\n\t\t\t\t\treturn item.id;\n\t\t\t\t}).value());\n\n\t\t\tself.isAnswered(true);\n\t\t});\n\t};\n\n\tMultipleSelect.prototype.tryAnswerAgain = function() {\n\t\tvar self = this;\n\n\t\treturn Q.fcall(function() {\n\t\t\t_.each(self.answers, function (answer) {\n\t\t\t\tanswer.isChecked(false);\n\t\t\t});\n\n\t\t\tself.isAnswered(false);\n\t\t});\n\t};\n\n\treturn MultipleSelect;\n});\n","define('viewmodels/questions/singleSelectText/singleSelectText',[],function () {\n    \"use strict\";\n\n    function SingleSelectText() {\n        this.question = null;\n\n        this.questionInstructions = [];\n        this.isAnswered = ko.observable(false);\n        this.answers = null;\n        this.isSurveyModeEnabled = false;\n    };   \n\n    SingleSelectText.prototype.checkItem = function (item) {\n            if (this.isAnswered()) {\n                return;\n            }\n\n            _.each(this.answers, function(answer) {\n                answer.isChecked(false);\n            });\n\n            item.isChecked(true);\n        };\n        \n    SingleSelectText.prototype.initialize = function (question, isPreview) {\n        var self = this;\n\n        return Q.fcall(function () {\n            self.question = question;\n\n            self.isSurveyModeEnabled = !!question.isSurvey;\n            self.questionInstructions = question.questionInstructions;\n            self.isAnswered(question.isAnswered);\n            self.isPreview = ko.observable(_.isUndefined(isPreview) ? false : isPreview);\n\n            self.answers = _.map(question.answers, function (answer) {\n                return {\n                    id: answer.id,\n                    text: answer.text,\n                    isChecked: ko.observable(answer.isChecked)\n                };\n            });\n        });\n    };\n\n    SingleSelectText.prototype.submit = function() {\n        var self = this;\n        \n        return Q.fcall(function () {\n            self.question.submitAnswer(\n                _.chain(self.answers)\n                .filter(function (item) {\n                    return item.isChecked();\n                })\n                .map(function (item) {\n                    return item.id;\n                }).value());\n\n            self.isAnswered(true);\n        });\n    };\n\n    SingleSelectText.prototype.tryAnswerAgain = function() {\n        var self = this;\n        \n        return Q.fcall(function () {\n            _.each(self.answers, function (answer) {\n                answer.isChecked(false);\n            });\n\n            self.isAnswered(false);\n        });\n    };\n\n    return SingleSelectText;\n});\n","define('viewmodels/questions/fillInTheBlank/fillInTheBlank',['knockout', 'plugins/http'], function (ko, http) {\n\t\"use strict\";\n\n\tfunction FillInTheBlank() {\n\t    this.question = null;\n\n\t    this.content = null;\n\t    this.loadContent = loadContent;\n\n\t    this.isAnswered = ko.observable(false);\n\t    this.inputValues = ko.observableArray([]);\n\t};\n\n\tFillInTheBlank.prototype.initialize = function(question, isPreview) {\n\t\tvar self = this;\n\n\t\treturn question.load().then(function () {\n\t\t    self.question = question;\n\n\t\t    self.isAnswered(question.isAnswered);\n\t\t    self.isPreview = ko.observable(_.isUndefined(isPreview) ? false : isPreview);\n\t\t    self.inputValues(_.map(question.answerGroups, function (answerGroup) {\n\t\t        return {\n\t\t            id: answerGroup.id,\n\t\t            value: answerGroup.answeredText,\n\t\t            answers: answerGroup.answers\n\t\t        };\n\t\t    }));\n\n\t\t    if (self.question.hasContent) {\n\t\t        return self.loadContent();\n\t\t    }\n\t\t});\n\t};\n\n\tFillInTheBlank.prototype.submit = function() {\n\t\tvar self = this;\n\n\t\treturn Q.fcall(function () {\n\t\t\tself.question.submitAnswer(self.inputValues());\n\t\t\t\n\t\t\tself.isAnswered(true);\n\t\t});\n\t};\n\n\tFillInTheBlank.prototype.tryAnswerAgain = function() {\n\t\tvar self = this;\n\t\t\n\t\treturn Q.fcall(function () {\n\t\t\t_.each(self.inputValues(), function (blankValue) {\n\t\t\t\tblankValue.value = '';\n\t\t\t});\n\t\t\tself.isAnswered(false);\n\t\t});\n\t};\n\n\treturn FillInTheBlank;\n\n\tfunction loadContent() {\n\t    var self = this;\n\t    return Q.fcall(function () {\n\t        var contentUrl = 'content/' + self.question.sectionId + '/' + self.question.id + '/content.html?v=1552304184357';\n\t        return http.get(contentUrl)\n                .then(function (response) {\n\t\t\t\t\tself.content = response;\n\t\t\t\t\tself.question.content = response;\n                })\n                .fail(function () {\n                    self.content = '';\n                });\n\t    });\n\t}\n});\n","define('viewmodels/questions/dragAndDrop/dragAndDrop',[],function () {\n    \"use strict\";\n\n    function DragAndDrop() {\n        this.question = null;\n        this.questionInstructions = [];\n\n        this.dropspots = [];\n        this.texts = [];\n\n        this.isPreview = ko.observable(true);\n\n        this.isAnswered = ko.observable(false);\n    };\n\n    DragAndDrop.prototype.submit = function() {\n        var self = this;\n\n        return Q.fcall(function () {\n            var answer = [];\n\n            _.each(self.dropspots, function (dropspot) {\n                var text = dropspot.text();\n                if (text) {\n                    answer.push({\n                        text: text.text,\n                        x: dropspot.x,\n                        y: dropspot.y\n                    });\n                }\n            });\n\n            self.question.submitAnswer(answer);\n            self.isAnswered(true);\n        });\n    };\n\n    DragAndDrop.prototype.tryAnswerAgain = function() {\n        var self = this;\n        \n        return Q.fcall(function () {\n            self.isAnswered(false);\n            _.each(self.dropspots, function (dropspot) {\n                dropspot.text(undefined);\n            });\n            _.each(self.texts, function (answer) {\n                answer.dropSpot = {};\n                answer.placed(false);\n            });\n        });\n    };\n\n    DragAndDrop.prototype.initialize = function(question, isPreview) {\n        var self = this;\n        \n        return Q.fcall(function () {\n            self.question = question;\n            self.questionInstructions = question.questionInstructions;\n            self.isPreview(_.isUndefined(isPreview) ? false : isPreview);\n\n            self.isAnswered(question.isAnswered);\n            self.dropspots = _.map(question.answers, function (answer) {\n                return {\n                    x: answer.correctPosition.x,\n                    y: answer.correctPosition.y,\n                    text: ko.observable(''),\n                    \n                };\n            });\n\n            self.texts = _.map(_.shuffle(question.answers), function (answer) {\n                return {\n                    id: answer.id,\n                    text: answer.text,\n                    placed: ko.observable(false)\n                };\n            });\n\n            _.each(question.answers, function (answer) {\n                var selectedDropspot = _.find(self.dropspots, function (dropspot) {\n                    return dropspot.x === answer.currentPosition.x\n                        && dropspot.y === answer.currentPosition.y;\n                });\n\n                if (selectedDropspot) {\n                    var selectedText = _.find(self.texts, function (item) {\n                        return item.id === answer.id;\n                    });\n                    selectedText.placed(true);\n                    selectedDropspot.text(selectedText);\n                }\n            });\n        });\n    };\n\n    return DragAndDrop;\n});\n","define('viewmodels/questions/singleSelectImage/singleSelectImage',['browserSupport'], function (browserSupport) {\r\n    \"use strict\";\r\n\r\n    function SingleSelectImage() {\r\n        var self = this;\r\n\r\n        this.canHover = !browserSupport.isMobileDevice;\r\n        this.question = null;\r\n\r\n        this.questionInstructions = [];\r\n        this.isAnswered = ko.observable(false);\r\n        this.answers = null;\r\n        this.checkedAnswerId = ko.observable(null);\r\n    };\r\n\r\n    SingleSelectImage.prototype.checkItem = function(item) {\r\n            if (this.isAnswered()) {\r\n                return;\r\n            }\r\n            \r\n            this.checkedAnswerId(item.id);\r\n        };\r\n\r\n    SingleSelectImage.prototype.initialize = function(question, isPreview) {\r\n        var self = this;\r\n\r\n        return Q.fcall(function () {\r\n            self.question = question;\r\n            self.checkedAnswerId(question.checkedAnswerId);\r\n\r\n            self.questionInstructions = question.questionInstructions;\r\n            self.isAnswered(question.isAnswered);\r\n            self.isPreview = ko.observable(_.isUndefined(isPreview) ? false : isPreview);\r\n            self.answers = _.map(question.answers, function (answer) {\r\n                return {\r\n                    id: answer.id,\r\n                    image: answer.image,\r\n                    isChecked: ko.observable(answer.isChecked)\r\n                };\r\n            });\r\n        });\r\n    };\r\n\r\n    SingleSelectImage.prototype.submit = function() {\r\n        var self = this;\r\n\r\n        return Q.fcall(function () {\r\n            self.question.submitAnswer(self.checkedAnswerId());\r\n\r\n            self.isAnswered(true);\r\n        });\r\n    };\r\n\r\n    SingleSelectImage.prototype.tryAnswerAgain = function() {\r\n        var self = this;\r\n        \r\n        return Q.fcall(function () {\r\n            self.checkedAnswerId(null);\r\n\r\n            self.isAnswered(false);\r\n        });\r\n    };\r\n\r\n    return SingleSelectImage;\r\n});\n","define('viewmodels/questions/textMatching/textMatchingSource',[], function () {\n    return function (id, key) {\n\n        this.id = id;\n        this.key = key;\n        this.value = ko.observable();\n\n        this.acceptValue = function (value) {\n            this.value(value);\n        };\n        this.rejectValue = function () {\n            this.value(null);\n        };\n    };\n});\n","define('viewmodels/questions/textMatching/textMatchingTarget',[],function () {\n\n    return function (value) {\n        this.value = ko.observable(value);\n\n        this.acceptValue = function (value) {\n            this.value(value);\n        };\n        this.rejectValue = function () {\n            this.value(null);\n        };\n    };\n\n});\n","define('viewmodels/questions/textMatching/textMatching',['viewmodels/questions/textMatching/textMatchingSource', 'viewmodels/questions/textMatching/textMatchingTarget'], function (Source, Target) {\n\n    function TextMatching() {\n        this.question = null;\n        this.questionInstructions = [];\n        this.isAnswered = ko.observable(false);\n\n        this.values = [];\n\n        this.sources = ko.observableArray([]);\n        this.targets = ko.observableArray([]);\n    };\n\n    TextMatching.prototype.acceptValue = function (value) {\n        this.targets.push(value);\n    };\n\n\n    TextMatching.prototype.rejectValue = function (value) {\n        this.targets.remove(value);\n    };\n\n    TextMatching.prototype.initialize = function(question, isPreview) {\n        var self = this;\n\n        return Q.fcall(function () {\n            self.question = question;\n\n            self.questionInstructions = question.questionInstructions;\n            self.isAnswered(question.isAnswered);\n            self.isPreview = ko.observable(_.isUndefined(isPreview) ? false : isPreview);\n\n            self.values = _.chain(question.answers)\n                .map(function (answer) {\n                    return answer.value;\n                })\n                .shuffle()\n                .value();\n\n            var targets = [];\n\n            _.each(self.values, function (value) {\n                targets.push(new Target(value));\n            });\n\n            var sources = [];\n            _.each(question.answers, function (pair) {\n                var source = new Source(pair.id, pair.key);\n                var target = _.find(targets, function (target) {\n                    return target.value() == pair.attemptedValue;\n                });\n\n                if (target) {\n                    source.acceptValue(target.value());\n                    target.rejectValue();\n                } else {\n                    source.value(null);\n                }\n\n                sources.push(source);\n            });\n\n            self.targets(targets);\n            self.sources(_.shuffle(sources));\n        });\n    };\n\n    TextMatching.prototype.submit = function() {\n        var self = this;\n\n        return Q.fcall(function () {\n            self.question.submitAnswer(_.map(self.sources(), function (source) {\n                var value = source.value() ? source.value() : null;\n                return { id: source.id, value: value };\n            }));\n            self.isAnswered(true);\n        });\n    };\n\n    TextMatching.prototype.tryAnswerAgain = function() {\n        var self = this;\n\n        return Q.fcall(function () {\n            _.each(self.sources(), function (pair, index) {\n                pair.rejectValue();\n                self.targets()[index].acceptValue(self.values[index]);\n            });\n\n            self.isAnswered(false);\n        });\n    };\n\n    return TextMatching;\n});\n","define('viewmodels/questions/statement/statement',[],function() {\n    \"use strict\";\n\n    function Statement() {\n        this.question = null;\n        this.questionInstructions = [];\n        this.statements = null;\n        this.isAnswered = ko.observable(false);\n        this.isSurveyModeEnabled = false;\n    };\n\n    Statement.prototype.markStatementAsTrue = function(statement) {\n        if (this.isAnswered()) {\n            return;\n        }\n\n        statement.userAnswer(true);\n    };\n\n    Statement.prototype.markStatementAsFalse = function(statement) {\n        if (this.isAnswered()) {\n            return;\n        }\n\n        statement.userAnswer(false);\n    };\n\n    Statement.prototype.initialize = function(question, isPreview) {\n        this.question = question;\n        this.isSurveyModeEnabled = !!question.isSurvey;\n        this.questionInstructions = question.questionInstructions;\n        this.isAnswered(question.isAnswered);\n        this.isPreview = ko.observable(_.isUndefined(isPreview) ? false : isPreview);\n        this.statements = _.map(question.statements, function(statement) {\n            var result = {\n                id: statement.id,\n                text: statement.text,\n                userAnswer: ko.observable(statement.userAnswer)\n            };\n\n            result.isTrueChecked = ko.computed(function() {\n                return result.userAnswer() == true;\n            });\n\n            result.isFalseChecked = ko.computed(function() {\n                return result.userAnswer() == false;\n            });\n\n            return result;\n        });\n    };\n\n    Statement.prototype.submit = function() {\n        var self = this;\n\n        return Q.fcall(function() {\n            var userAnswers = _.chain(self.statements)\n                .filter(function(statement) {\n                    return !_.isNullOrUndefined(statement.userAnswer());\n                })\n                .map(function(statement) {\n                    return { id: statement.id, answer: statement.userAnswer() };\n                })\n                .value();\n\n            self.question.submitAnswer(userAnswers);\n            self.isAnswered(true);\n        });\n    };\n\n    Statement.prototype.tryAnswerAgain = function() {\n        var self = this;\n        \n        return Q.fcall(function() {\n            self.isAnswered(false);\n            _.each(self.statements, function(statement) {\n                statement.userAnswer(null);\n            });\n        });\n    };\n\n    return Statement;\n});\n","define('viewmodels/questions/hotspot/hotspot',[],function () {\n    \"use strict\";\n\n    function HotSpot (){ }\n\n    HotSpot.prototype.initialize = function(question, isPreview) {\n        var self = this;\n\n        return Q.fcall(function (){\n            self.questionInstructions = question.questionInstructions;\n            self.background = question.background;\n            self.isAnswered = ko.observable(question.isAnswered);\n            self.isMultiple = question.isMultiple;\n            self.isPreview = ko.observable(_.isUndefined(isPreview) ? false : isPreview);\n            self.question = question;\n\n                self.submit = function () {         \n                return Q.fcall(function () {\n                        question.submitAnswer(self.marks());             \n                        self.isAnswered(true);\n                });\n                };\n        \n                self.marks = ko.observableArray(question.placedMarks ? _.map(question.placedMarks, function (mark) { return { x: mark.x, y: mark.y }; }) : []);\n\n            self.addMark = function (mark) {\n                if (!self.isMultiple) {\n                    self.marks.removeAll();\n                }\n                self.marks.push(mark);\n            };\n\n            self.removeMark = function (mark) {\n                self.marks.remove(mark);\n            };\n\n            self.tryAnswerAgain = function () {\n                return Q.fcall(function () {\n                    self.isAnswered(false);\n                    self.marks.removeAll();\n                });\n            };\n        });\n    };\n    \n    return HotSpot;\n});\n","define('viewmodels/questions/openQuestion/openQuestion',[], function() {\n    \"use strict\";\n\n    function OpenQuestion(){\n        this.question = null;\n        this.questionInstructions = [];\n        this.answeredText = ko.observable('');\n        this.isAnswered = ko.observable(false);\n        \n        this.feedbackView = 'questions/openQuestion/feedback.html?v=1552304184357';  \n    };\n\n    OpenQuestion.prototype.initialize = function(question, isPreview) {\n        var self = this;\n\n        return Q.fcall(function() {\n            self.question = question;\n            self.questionInstructions = question.questionInstructions;\n            self.answeredText(question.answeredText);\n            self.isAnswered(question.isAnswered);\n            self.isPreview = ko.observable(_.isUndefined(isPreview) ? false : isPreview);\n        });\n    };\n\n    OpenQuestion.prototype.submit = function() {\n        var self = this;\n\n        return Q.fcall(function () {\n            self.question.submitAnswer(self.answeredText().trim());\n            self.isAnswered(true);\n        });\n    };\n\n    OpenQuestion.prototype.tryAnswerAgain = function() {\n        var self = this;\n        \n        return Q.fcall(function () {\n            self.answeredText('');\n            self.isAnswered(false);\n        });\n    };\n\n    return OpenQuestion;\n});\n","define('viewmodels/questions/scenarioQuestion/components/branchtrackProvider',['knockout'], function(ko) {\n    'use strict';\n    var instance = null;\n\n    return {\n        isFinished: isFinished,\n        destroy: destroy,\n        reset: reset,\n        init: init,\n        score: getScore\n    };\n\n    function isFinished() {\n        if (!_.isNullOrUndefined(instance)) {\n            return instance.isFinished;\n        }\n\n        return false;\n    }\n\n    function destroy() {\n        if (!_.isNullOrUndefined(instance)) {\n            instance.destroy();\n        }\n    }\n\n    function reset() {\n        if (!_.isNullOrUndefined(instance)) {\n            instance.reset();\n        }\n    }\n\n    function getScore() {\n        if (!_.isNullOrUndefined(instance)) {\n            return instance.score;\n        }\n\n        return 0;\n    }\n\n    function init(instanceId) {\n        if (!_.isEmptyOrWhitespace(instanceId)) {\n            instance = Branchtrack.create(instanceId);\n        }\n    }\n});\n","define('viewmodels/questions/scenarioQuestion/scenarioQuestion',['knockout', 'viewmodels/questions/scenarioQuestion/components/branchtrackProvider'], function (ko, branchtrackProvider) {\n    \"use strict\";\n\n    function ScenarioQuestion(){\n        this.question = null;\n        this.questionInstructions = [];\n        this.embedCode = ko.observable(null);\n        this.isAnswered = ko.observable(false);\n        this.isCorrect = ko.observable(false);\n        \n        this.feedbackView = 'questions/scenarioQuestion/feedback.html?v=1552304184357';\n        this.customSubmitViewModel = 'viewmodels/questions/scenarioQuestion/submitQuestion';\n    };\n\n    ScenarioQuestion.prototype.initialize = function(question, isPreview) {\n        var self = this;\n\n        return Q.fcall(function () {\n            self.question = question;\n            self.questionInstructions = question.questionInstructions;\n            self.embedCode(question.embedCode);\n            self.isAnswered(question.isAnswered);\n            self.isCorrect(question.isCorrectAnswered);\n            self.isPreview = ko.observable(_.isUndefined(isPreview) ? false : isPreview);\n            branchtrackProvider.init(question.projectId, question.masteryScore);\n        });\n    }\n\n    ScenarioQuestion.prototype.submit = function() {\n        var self = this;\n\n        return Q.fcall(function () {\n            self.question.submitAnswer(branchtrackProvider.score());\n            self.isAnswered(true);\n        });\n    }\n\n    ScenarioQuestion.prototype.tryAnswerAgain = function() {\n        var self = this;\n        \n        return Q.fcall(function () {\n            self.isAnswered(false);\n            self.embedCode.valueHasMutated();\n            branchtrackProvider.reset();\n        });\n    }\n\n    ScenarioQuestion.prototype.deactivate = function() {\n        branchtrackProvider.destroy();\n    }\n\n    return ScenarioQuestion;\n});\n","define('viewmodels/questions/rankingText/rankingText',[],function () {\n    \"use strict\";\n\n    function RankingText() {\n        this.question = null;\n        this.questionInstructions = [];\n\n        this.isAnswered = ko.observable(false);\n        this.rankingItems = ko.observableArray([]);\n    };\n\n    RankingText.prototype.initialize = function(question, isPreview) {\n        var self = this;\n\n        return Q.fcall(function () {\n            self.question = question;\n\n            self.questionInstructions = question.questionInstructions;\n            self.isAnswered(question.isAnswered);\n\n            self.rankingItems(question.rankingItems);\n            self.isPreview = ko.observable(_.isUndefined(isPreview) ? false : isPreview);\n        });\n    };\n\n    RankingText.prototype.submit = function() {\n        var self = this;\n\n        return Q.fcall(function () {\n            self.question.submitAnswer(self.rankingItems());\n\n            self.isAnswered(true);\n        });\n    };\n\n    RankingText.prototype.tryAnswerAgain = function() {\n        var self = this;\n\n        return Q.fcall(function () {\n            self.isAnswered(false);\n        });\n    };\n\n    return RankingText;    \n});\n","define('viewmodels/questions/questionsViewModelFactory',['constants', 'viewmodels/questions/multipleSelect/multipleSelect', 'viewmodels/questions/singleSelectText/singleSelectText', 'viewmodels/questions/fillInTheBlank/fillInTheBlank',\n    'viewmodels/questions/dragAndDrop/dragAndDrop', 'viewmodels/questions/singleSelectImage/singleSelectImage', 'viewmodels/questions/textMatching/textMatching',\n    'viewmodels/questions/statement/statement', 'viewmodels/questions/hotspot/hotspot', 'viewmodels/questions/openQuestion/openQuestion',\n    'viewmodels/questions/scenarioQuestion/scenarioQuestion', 'viewmodels/questions/rankingText/rankingText'],\n    function (constants, MultipleSelect, SingleSelectText, FillInTheBlank, DragAndDrop, SingleSelectImage,\n        TextMatching, Statement, Hotspot, OpenQuestion, ScenarioQuestion, RankingText) {\n        'use strict';\n\n        return {\n            getViewModel: getViewModel\n        };\n\n        function getViewModel(type) {\n            switch (type) {\n                case constants.questionTypes.multipleSelect:\n                    return new MultipleSelect();\n                case constants.questionTypes.dragAndDrop:\n                    return new DragAndDrop();\n                case constants.questionTypes.singleSelectText:\n                    return new SingleSelectText();\n                case constants.questionTypes.fillInTheBlank:\n                    return new FillInTheBlank();\n                case constants.questionTypes.singleSelectImage:\n                    return new SingleSelectImage();\n                case constants.questionTypes.textMatching:\n                    return new TextMatching();\n                case constants.questionTypes.statement:\n                    return new Statement();\n                case constants.questionTypes.hotspot:\n                    return new Hotspot();\n                case constants.questionTypes.openQuestion:\n                    return new OpenQuestion();\n                case constants.questionTypes.scenario:\n                    return new ScenarioQuestion();\n                case constants.questionTypes.rankingText:\n                    return new RankingText();\n                default:\n                    return new MultipleSelect();\n            }\n        }\n\n    });\n","define('questionContent/questionContent',['knockout', 'plugins/router', 'constants', 'modules/questionsNavigation', 'viewmodels/questions/questionsViewModelFactory', 'templateSettings', 'localizationManager', 'context'],\n    function (ko, router, constants, navigationModule, questionViewModelFactory, templateSettings, localizationManager, context) {\n        \"use strict\";\n\n        function QuestionContent() {\n            var self = this;\n            \n            this.sectionId = null;\n            this.question = null;\n            \n            this.title = '';\n            this.index = 0;\n            this.isAnswered = ko.observable(false);\n            this.isCorrect = ko.observable(false);\n            this.isExpanded = ko.observable(true);\n            this.isPreview = false;\n            this.isSurvey = false;\n            this.copyright = templateSettings.copyright;\n\n            this.learningContents = [];\n            this.questionInstructions = [];\n            this.correctFeedback = ko.observable(null);\n            this.incorrectFeedback = ko.observable(null);\n            this.feedbackResultText = ko.observable('');\n            this.feedbackView = '';\n            this.submitViewModel = '';\n\n            this.navigationContext = null;\n\n            this.activeQuestionViewModel = null;\n            \n            this.isNavigationLocked = router.isNavigationLocked;\n\n            this.isCorrectAnswered = ko.computed(function() {\n                return self.isAnswered() && self.isCorrect();\n            });\n\n            this.isWrongAnswered = ko.computed(function () {\n                return self.isAnswered() && !self.isCorrect();\n            });\n\n            // this logic moved here from html view to fix blinking bug in IE11\n            this.updateFeedbackResultText = function() {\n                var key = '[your answer was stored]';\n                if (!self.isSurvey) {\n                    key = self.isCorrect() ? '[correct answer]': '[incorrect answer]';\n                }\n\n                this.feedbackResultText(localizationManager.getLocalizedText(key));\n            }\n\n            this.hideTryAgain = false;\n\n            this.isGoToNextSectionVisible = ko.observable(false);\n            this.isGoToResultsVisible = ko.observable(false);\n        };\n\n        QuestionContent.prototype.submit = function() {\n            var self = this;\n            \n            return self.activeQuestionViewModel.submit().then(function () {\n                self.isCorrect(self.question.isCorrectAnswered);\n                self.updateFeedbackResultText();\n                self.isAnswered(self.question.isAnswered);\n\n                updateNavigationState(self);\n            });\n        }\n\n        QuestionContent.prototype.tryAnswerAgain = function () {\t\n            var self = this;\n\n            return self.activeQuestionViewModel.tryAnswerAgain().then(function () {\n                self.isAnswered(false);\n            });\n        }\n\n        QuestionContent.prototype.navigateNext = function () {\n            if (router.isNavigationLocked()) {\n                return;\n            }\n\n            var nextUrl = !_.isNullOrUndefined(this.navigationContext.nextQuestionUrl) ? this.navigationContext.nextQuestionUrl : 'sections';\n            router.navigate(nextUrl);\n        }\n\n        QuestionContent.prototype.goToNextSection = function () {\n            if (router.isNavigationLocked()) {\n                return;\n            }\n            if (!this.navigationContext.nextSectionUrl) {\n                return;\n            }\n    \n            router.navigate(this.navigationContext.nextSectionUrl);\n        }\n\n        QuestionContent.prototype.goToResults = function () {\n            if (router.isNavigationLocked()) {\n                return;\n            }\n    \n            router.navigate('#finish');\n        }\n        \n        QuestionContent.prototype.toggleExpand = function () {\n            return this.isExpanded(!this.isExpanded());\n        }\n\n        QuestionContent.prototype.activate = function (sectionId, question, index, isPreview) {\n            if (!sectionId || !question) {\n                return;\n            }\n\n\n            this.isGoToResultsVisible(false);\n            this.isGoToNextSectionVisible(false);\n\n            this.sectionId = sectionId;\n            this.question = question;\n            this.isPreview = _.isUndefined(isPreview) ? false : isPreview;\n            this.index = _.isUndefined(index) ? 0 : index < 10 ? '0' + index : index;\n            this.navigationContext = navigationModule.getNavigationContext(this.sectionId, this.question.id);\n            this.title = this.question.title;\n            this.isAnswered(this.question.isAnswered);\n            this.isCorrect(this.question.isCorrectAnswered);\n            this.isSurvey = !!question.isSurvey;\n\n            this.learningContents = this.question.learningContents;\n            this.questionInstructions = this.question.questionInstructions;\n            this.correctFeedback(this.question.feedback.correct);\n            this.incorrectFeedback(this.question.feedback.incorrect);\n            this.updateFeedbackResultText();\n\n            this.activeQuestionViewModel = questionViewModelFactory.getViewModel(this.question.type);\n            this.feedbackView = this.activeQuestionViewModel.feedbackView || 'questions/feedback.html?v=1552304184357';\n            this.submitViewModel = this.activeQuestionViewModel.customSubmitViewModel || '';\n\n            this.hideTryAgain = templateSettings.hideTryAgain || context.isInReviewAttemptMode();\n\n            updateNavigationState(this);\n\n            if(isPreview){\n                var self = this;\n\n                return this.question.load().then(function(){\n                    return self.activeQuestionViewModel.initialize(self.question, isPreview);\n                });\n            } else {\n                return this.activeQuestionViewModel.initialize(this.question, isPreview);\n            }\n        }\n\n        QuestionContent.prototype.deactivate = function () {\n            if (_.isFunction(this.activeQuestionViewModel.deactivate)) {\n                this.activeQuestionViewModel.deactivate();\n            }\n        }\n\n        function updateNavigationState(viewModel) {\n            if (context.course.score() === 100) {\n                viewModel.isGoToResultsVisible(!templateSettings.hideFinishActionButtons);\n                viewModel.isGoToNextSectionVisible(viewModel.navigationContext.questionsCount === viewModel.navigationContext.currentQuestionIndex && viewModel.navigationContext.nextSectionUrl);\n            } else {\n                if (viewModel.navigationContext.questionsCount === viewModel.navigationContext.currentQuestionIndex) {\n                    viewModel.isGoToResultsVisible(!viewModel.navigationContext.nextSectionUrl && !templateSettings.hideFinishActionButtons);\n                    viewModel.isGoToNextSectionVisible(!!viewModel.navigationContext.nextSectionUrl);\n                } else {\n                    viewModel.isGoToResultsVisible(false);\n                    viewModel.isGoToNextSectionVisible(false);\n                }\n            }\n        }\n\n        return QuestionContent;\n    }\n);\n","define('repositories/questionRepository',['context', 'guard'], function (context, guard) {\n\n    return {\n        get: get\n    };\n\n    function get(sectionId, questionId) {\n        guard.throwIfNotString(sectionId, 'section id is not a string');\n        guard.throwIfNotString(questionId, 'Question id is not a string');\n\n        var section = _.find(context.course.sections, function (item) {\n            return item.id == sectionId;\n        });\n\n        if (!section) {\n            return null;\n        }\n        var question = _.find(section.questions, function (item) {\n            return item.id == questionId;\n        });\n        \n        if (!question) {\n            return null;\n        }\n\n        return question;\n    }\n\n});\n","define('resultPage/resultPage',[\n    'repositories/courseRepository', 'templateSettings', 'plugins/router', 'progressContext',\n    'userContext', 'xApi/xApiInitializer', 'helpers/appOperations', 'constants', 'modules/progress/progressStorage/auth',\n    'modules/publishModeProvider', 'dialogs/dialog', 'modules/progress/progressStorage/certificateProvider',\n    'helpers/fileDownloader', 'localizationManager', 'modules/webhooks'\n], function(courseRepository, templateSettings, router, progressContext, userContext,\n    xApiInitializer, appOperations, constants, auth, publishModeProvider, \n    Dialog, certificateProvider, fileDownloader, localizationManager, webhooks) {\n    \"use strict\";\n\n    var course = courseRepository.get();\n\n    var progressStatuses = constants.progressContext.statuses;\n\n    var statuses = {\n        readyToFinish: 'readyToFinish',\n        preparingCertificate: 'preparingCertificate',\n        sendingRequests: 'sendingRequests',\n        finished: 'finished'\n    };\n\n    var viewModel = {\n        score: course.score,\n        title: course.title,\n        sections: [],\n        status: ko.observable(statuses.readyToFinish),\n        statuses: statuses,\n        activate: activate,\n        close: close,\n        finish: finish,\n        isDownloadingCertificate: ko.observable(false),\n        downloadCertificate: downloadCertificate,\n        npsDialog: new Dialog(),\n        newAttemptDialog: new Dialog(),\n        resendResultsDialog: new Dialog(),\n\n        //properties\n        isInReviewAttemptMode: false,\n        isCompleted: false,\n        crossDeviceEnabled: false,\n        allowContentPagesScoring: false,\n        xAPIEnabled: false,\n        scormEnabled: false,\n        canDownloadCertificate: false,\n        certificateDownloaded: false,\n        stayLoggedIn: ko.observable(false),\n\n        //methods\n        toggleStayLoggedIn: toggleStayLoggedIn\n    };\n\n    return viewModel;\n\n    function activate() {\n        viewModel.isInReviewAttemptMode = course.isFinished;\n        viewModel.npsDialog.isVisible(false);\n        viewModel.newAttemptDialog.isVisible(false);\n        viewModel.resendResultsDialog.isVisible(false);\n        viewModel.crossDeviceEnabled = templateSettings.allowCrossDeviceSaving;\n        viewModel.canDownloadCertificate =  templateSettings.allowCrossDeviceSaving \n                                                && templateSettings.allowCertificateDownload \n                                                && course.isCompleted();\n        \n        viewModel.allowContentPagesScoring = templateSettings.allowContentPagesScoring;\n\n        viewModel.xAPIEnabled = xApiInitializer.isLrsReportingInitialized;\n        viewModel.scormEnabled = publishModeProvider.isScormEnabled;\n\n        viewModel.stayLoggedIn(userContext.user.keepMeLoggedIn);\n        viewModel.sections = _.chain(course.sections)\n            .filter(function(section) {\n                return section.affectProgress || section.hasSurveyQuestions;\n            })\n            .map(mapSection)\n            .value();\n\n        viewModel.isCompleted = course.isCompleted();\n    }\n    \n    function close() {\n        router.navigate(\"#sections\");\n    }\n\n    function finish() {\n        if (router.isNavigationLocked() || viewModel.status() !== statuses.readyToFinish) {\n            return;\n        }\n\n        if(viewModel.canDownloadCertificate && !viewModel.certificateDownloaded){\n            viewModel.status(statuses.preparingCertificate);\n            downloadCertificate().always(doFinishCourse);\n            return;\n        }\n\n        doFinishCourse();\n    }\n\n    function doFinishCourse(){\n        if (templateSettings.xApi.enabled && xApiInitializer.isLrsReportingInitialized) {\n            viewModel.status(statuses.sendingRequests);\n        }\n\n        if(course.getStatus() === constants.course.statuses.inProgress) {\n            var finishHandler = (viewModel.crossDeviceEnabled || viewModel.scormEnabled) ?\n                progressContext.finish : progressContext.remove;\n                \n            course.setFinishedStatus();\n            return finishHandler(function() {\n                progressContext.status(progressStatuses.ignored);\n                course.finish(sendWebhooks);\n            });\n        }\n\n        sendWebhooks();\n    }\n\n    function downloadCertificate() {\n        viewModel.isDownloadingCertificate(true);\n        return certificateProvider.getCertificateUrl(course.id, course.templateId, course.title, course.score, templateSettings.logo.url)\n            .then(function(url){\n                /* Fix for IE11 and Edge (files can`t saved without extension) */\n                var filename = localizationManager.getLocalizedText('[certificate file name]') + '.pdf';\n                return fileDownloader.downloadFile(url, filename);\n            })\n            .always(function(){\n                viewModel.isDownloadingCertificate(false);\n                viewModel.certificateDownloaded = true;\n            });\n    }\n\n    function sendWebhooks() {\n        if (webhooks.initialized) {\n            return webhooks.sendResults(course)\n                .then(function() {\n                    onCourseFinished();\n                })\n                .catch(function() {\n                    viewModel.status(statuses.readyToFinish);\n                    viewModel.resendResultsDialog.resultsSendErrorTitleKey = constants.dialogs.resendResults.webhooks.resultsSendErrorTitleKey;\n                    viewModel.resendResultsDialog.endpointNameKey = constants.dialogs.resendResults.webhooks.endpointNameKey;\n                    viewModel.resendResultsDialog.show({\n                        resend: webhooks.sendResults.bind(webhooks),\n                        next: onCourseFinished, \n                    });\n                });\n        } \n\n        onCourseFinished();\n    }\n\n    function onCourseFinished() {\n        viewModel.status(statuses.finished);\n\n        if (templateSettings.nps.enabled && xApiInitializer.isNpsReportingInitialized) {\n            return viewModel.npsDialog.show({\n                closed: function() {\n                   finalize({close: true});\n                },\n                finalized: function() {\n                   finalize({close: false});\n                }\n            });\n        }\n\n        finalize({close: true});\n    }\n\n    function finalize(params) {\n        params = params || {};\n        if (auth.authenticated && !viewModel.stayLoggedIn())\n            auth.signout();\n\n        course.finalize(function() {\n            if (params.close){\n                appOperations.close({ \n                    shouldCloseWindow: !viewModel.canDownloadCertificate \n                });\n            }\n        });\n    }\n\n    function toggleStayLoggedIn() {\n        viewModel.stayLoggedIn(userContext.user.keepMeLoggedIn = !viewModel.stayLoggedIn());\n        auth.shortTermAccess = !userContext.user.keepMeLoggedIn;\n    }\n\n    function mapSection(entity) {\n        var section = {};\n\n        section.id = entity.id;\n        section.title = entity.title;\n        section.score = entity.score();\n\n        section.readedContents = _.filter(entity.questions, function(question) {\n                return !isQuestion(question) && question.isAnswered;\n            })\n            .length;\n\n        section.questions = _.filter(entity.questions, function(question) {\n            return isQuestion(question);\n        });\n\n        section.amountOfQuestions = _.filter(section.questions, function(question) {\n                return !question.isSurvey;\n            })\n            .length;\n\n        section.correctQuestions = _.filter(section.questions, function(question) {\n                return question.isAnswered && question.isCorrectAnswered && !question.isSurvey;\n            })\n            .length;\n\n        section.amountOfContents = entity.questions.length - section.questions.length;\n        section.affectProgress = entity.affectProgress;\n        section.title = entity.title;\n\n        section.isCorrect = entity.isCompleted();\n\n        return section;\n    }\n\n    function isQuestion(question) {\n        return question.type !== constants.questionTypes.informationContent;\n    }\n});\n","define('treeOfContent/treeNodes/TreeNode',[], function() {\n    return function(id, title) {\n        this.id = id;\n        this.title = title;\n    };\n});\n","define('treeOfContent/treeNodes/QuestionTreeNode',['treeOfContent/treeNodes/TreeNode', 'plugins/router'], function (TreeNode, router) {\n\n    return function (id, title, isInformationContent, url) {\n        TreeNode.call(this, id, title);\n        var self = this;\n        this.url = url;\n        this.isActive = ko.observable(false);\n        this.isInformationContent = isInformationContent;\n        this.canNavigate = ko.computed(function () {\n            return !self.isActive() && !router.isNavigationLocked();\n        });\n    };\n});\n","define('treeOfContent/treeNodes/SectionTreeNode',['treeOfContent/treeNodes/TreeNode', 'treeOfContent/treeNodes/QuestionTreeNode', 'repositories/sectionRepository'],\n    function (TreeNode, QuestionTreeNode, sectionRepository) {\n\n        return function (sectionId, title) {\n            TreeNode.call(this, sectionId, title);\n            this.children = [];\n\n            this.isExpanded = ko.observable(false);\n            this.toggleIsExpanded = toggleIsExpanded;\n            this.activate = activate;\n            this.activateQuestion = activateQuestion;\n            this.hasActiveQuestion = ko.observable(false);\n        };\n\n        function activate() {\n            var sectionId = this.id;\n            this.children = _.chain(sectionRepository.get(sectionId).questions)\n                .map(function (question) {\n                    return new QuestionTreeNode(question.id, question.title, question.isInformationContent,\n                        '#section/' + sectionId + '/question/' + question.id);\n                })\n                .value();\n\n            this.hasChildren = this.children.length > 0;\n        }\n\n        function activateQuestion(url) {\n            var self = this;\n            self.hasActiveQuestion(false);\n            this.children.forEach(function (question) {\n                var isQuestionToActivate = question.url === url;\n                question.isActive(isQuestionToActivate);\n                if (isQuestionToActivate) {\n                    self.isExpanded(true);\n                    self.hasActiveQuestion(true);\n                }\n            });\n            \n            return self.hasActiveQuestion();\n        }\n\n        function toggleIsExpanded() {\n            this.isExpanded(!this.isExpanded());\n        }\n    }\n);\n","define('treeOfContent/treeOfContent',['repositories/courseRepository', 'treeOfContent/treeNodes/SectionTreeNode', 'plugins/router', 'treeOfContent/utils/screenResolutionChecker'],\nfunction (courseRepository, SectionTreeNode, router, screenResolutionChecker) {\n    var viewModel = {\n        children: [],\n        hasChildren: false,\n        isExpanded: ko.observable(true),\n        isQuestionActivated: false,\n        state: {\n            isExpanded: false,\n            isExpandedForQuestionView: true\n        },\n        toggleIsExpanded: toggleIsExpanded,\n        activate: activate,\n        deactivate: deactivate,\n        initializeRoute: initializeRoute,\n        activateQuestion: activateQuestion\n    };\n\n    return viewModel;\n\n    function activate() {\n        viewModel.children = _.chain(courseRepository.get().sections)\n                .map(function (section) {\n                    var treeNode = new SectionTreeNode(section.id, section.title);\n                    treeNode.activate();\n                    return treeNode;\n                })\n                .value();\n\n        viewModel.hasChildren = viewModel.children.length > 0;\n        viewModel.initializeRoute();\n        router.on('router:navigation:complete', viewModel.initializeRoute);\n    }\n\n    function deactivate() {\n        router.off('router:navigation:complete', viewModel.initializeRoute);\n        viewModel.children = [];\n        viewModel.hasChildren = false;\n    }\n\n    function toggleIsExpanded() {\n        viewModel.isExpanded(!viewModel.isExpanded());\n        if (viewModel.isQuestionActivated) {\n            viewModel.state.isExpandedForQuestionView = viewModel.isExpanded();\n        } else {\n            viewModel.state.isExpanded = viewModel.isExpanded();\n        }\n    }\n\n    function initializeRoute() {\n        var activeInstruction = router.activeInstruction();\n        if (!activeInstruction || !activeInstruction.fragment) {\n            return;\n        }\n\n        var isQuestionActivatedForPreviousRoute = viewModel.isQuestionActivated;\n        viewModel.isQuestionActivated = viewModel.activateQuestion('#' + activeInstruction.fragment);\n        if (viewModel.isQuestionActivated) {\n            if (!isQuestionActivatedForPreviousRoute) {\n                viewModel.children.forEach(function (section) {\n                    section.isExpanded(section.hasActiveQuestion());\n                });\n            }\n        } else {\n            viewModel.children.forEach(function (section, index) {\n                section.isExpanded(index === 0);\n            });\n        }\n\n        var isExpanded = false;\n        if (!screenResolutionChecker.isLowResolution()) {\n            isExpanded = viewModel.isQuestionActivated ? viewModel.state.isExpandedForQuestionView : viewModel.state.isExpanded;\n        }\n\n        viewModel.isExpanded(isExpanded);\n    }\n\n    function activateQuestion(url) {\n        var isQuestionActivated = false;\n        viewModel.children.forEach(function (section) {\n            if (section.activateQuestion(url)) {\n                isQuestionActivated = true;\n            }\n        });\n\n        return isQuestionActivated;\n    }\n});\n","define('viewmodels/404',[], function () {\n    var viewModel = {\n        homeUrl: '#sections'\n    };\n\n    return viewModel;\n});\n","define('viewmodels/exitCourse',[\n    'durandal/app', 'helpers/appOperations', 'repositories/courseRepository', 'progressContext',\n    'plugins/router', 'templateSettings', 'constants',\n    'xApi/xApiInitializer', 'includedModules/modulesInitializer', 'context', 'modules/publishModeProvider','dialogs/dialog'\n], function(app, appOperations, courseRepository, progressContext, router, templateSettings,\n    constants, xApiInitializer, modulesInitializer, context, publishModeProvider, Dialog) {\n    \"use strict\";\n\n    var progressStatuses = constants.progressContext.statuses;\n    var course = courseRepository.get();\n\n    var statuses = {\n        readyToFinish: 'readyToFinish',\n        sendingRequests: 'sendingRequests',\n        finished: 'finished'\n    };\n\n    var viewModel = {\n        type: ko.observable(),\n        isNavigationLocked: router.isNavigationLocked,\n\n        status: ko.observable(statuses.readyToFinish),\n        statuses: statuses,\n\n        score: null,\n        isCompleted: false,\n        isInReviewAttemptMode: false,\n        xAPIEnabled: false,\n        scormEnabled: false,\n        hideFinishActionButtons: false,\n        hideContinueLaterButton: false,\n        activate: activate\n    };\n\n    viewModel.continueLaterPopup = new Dialog();\n\n    viewModel.continueLaterPopup.actions = {\n        close: viewModel.continueLaterPopup.hide,\n        exit: exit\n    };\n\n    viewModel.isProgressSaved = ko.computed(function() {\n        return progressContext.status() === progressStatuses.saved;\n    });\n\n    viewModel.isProgressNotSaved = ko.computed(function() {\n        return progressContext.status() === progressStatuses.error;\n    });\n\n    viewModel.finishAction = function() {\n        router.navigate('#finish');\n    };\n\n    viewModel.takeABreakAction = function() {\n        viewModel.continueLaterPopup.show();\n    }\n\n    return viewModel;\n\n    function activate(type) {\n        viewModel.score = context.course.score;\n        viewModel.isCompleted = context.course.isCompleted();\n        viewModel.isInReviewAttemptMode = context.isInReviewAttemptMode();\n        viewModel.type(type);\n        viewModel.xAPIEnabled = xApiInitializer.isLrsReportingInitialized;\n        viewModel.scormEnabled = publishModeProvider.isScormEnabled;\n        viewModel.hideFinishActionButtons = templateSettings.hideFinishActionButtons;\n        viewModel.hideContinueLaterButton = templateSettings.hideContinueLaterButton || false;\n    }\n\n    function exit() {\n        if (progressContext.status() === progressStatuses.error) {\n            var isCourseClosingConfirmed = confirm(TranslationPlugin.getTextByKey('[progress is not saved confirmation]'));\n            if (!isCourseClosingConfirmed) {\n                return;\n            }\n            progressContext.status(progressStatuses.ignored);\n        }\n\n        course.finalize(function() {\n            appOperations.close();\n        });\n    }\n\n});\n","define('viewmodels/introduction',['durandal/app', 'context', 'plugins/router', 'plugins/http', 'templateSettings'],\n    function (app, context, router, http, templateSettings) {\n        var viewModel = {\n            courseTitle: context.course.title,\n            content: null,\n            copyright: templateSettings.copyright,\n            authorContactEmail: context.course.authorContactEmail,\n            authorPersonalPhone: context.course.authorPersonalPhone,\n            authorShortBio: context.course.authorShortBio,\n            createdBy: context.course.createdBy,\n            authorAvatarUrl: context.course.authorAvatarUrl,\n            allowAuthorsBio: templateSettings.allowAuthorsBio,\n            isNavigationLocked: router.isNavigationLocked()\n        }\n\n        viewModel.canActivate = function () {\n            if (context.course.hasIntroductionContent == false && !viewModel.allowAuthorsBio) {\n                return { redirect: '#sections' };\n            }\n            return true;\n        };\n\n        viewModel.activate = function () {\n            return Q.fcall(function () {\n                return context.course.hasIntroductionContent \n                    && http.get('content/content.html?v=1552304184357').then(function (response) {\n                        viewModel.content = response;\n                    }).fail(function () {\n                        viewModel.content = '';\n                    });\n            });\n        };\n\n        viewModel.startCourse = function () {\n            if (router.isNavigationLocked()) {\n                return;\n            }\n            router.navigate('sections');\n        }\n\n        return viewModel;\n    }\n);\n","define('viewmodels/questions/content',['plugins/router', 'constants', 'repositories/questionRepository', 'repositories/sectionRepository', 'templateSettings', 'modules/questionsNavigation'],\r\n    function(router, constants, questionRepository, sectionRepository, templateSettings, navigationModule) {\r\n        \"use strict\";\r\n\r\n        var viewModel = {\r\n            section: null,\r\n            question: null,\r\n\r\n            startTime: null,\r\n\r\n            masteryScore: 0,\r\n\r\n            navigationContext: null,\r\n            backToSections: backToSections,\r\n            isNextQuestionAvailable: isNextQuestionAvailable,\r\n            nextQuestionUrl: nextQuestionUrl,\r\n            goNext: goNext,\r\n            isPreviousQuestionAvailable: isPreviousQuestionAvailable,\r\n            previousQuestionUrl: previousQuestionUrl,\r\n            goPrevious: goPrevious,\r\n\r\n            voiceOver: null,\r\n\r\n            activeViewModel: null,\r\n\r\n            activate: activate,\r\n            isNavigationLocked: router.isNavigationLocked,\r\n            deactivate: deactivate\r\n        };\r\n\r\n        return viewModel;\r\n\r\n        function backToSections() {\r\n            if (router.isNavigationLocked()) {\r\n                return;\r\n            }\r\n            router.navigate('sections');\r\n        }\r\n\r\n        function isNextQuestionAvailable() {\r\n            return !_.isNullOrUndefined(viewModel.navigationContext.nextQuestionUrl) && !router.isNavigationLocked();\r\n        }\r\n\r\n        function nextQuestionUrl() {\r\n            return router.isNavigationLocked() ? undefined : viewModel.navigationContext.nextQuestionUrl;\r\n        }\r\n\r\n        function goNext() {\r\n            if (router.isNavigationLocked() || !isNextQuestionAvailable()) {\r\n                return;\r\n            }\r\n            router.navigate(viewModel.navigationContext.nextQuestionUrl);\r\n        }\r\n\r\n        function isPreviousQuestionAvailable() {\r\n            return !_.isNullOrUndefined(viewModel.navigationContext.previousQuestionUrl) && !router.isNavigationLocked();\r\n        }\r\n\r\n        function previousQuestionUrl() {\r\n            return router.isNavigationLocked() ? undefined : viewModel.navigationContext.previousQuestionUrl;\r\n        }\r\n\r\n        function goPrevious() {\r\n            if (router.isNavigationLocked() || !isPreviousQuestionAvailable()) {\r\n                return;\r\n            }\r\n            router.navigate(viewModel.navigationContext.previousQuestionUrl);\r\n        }\r\n\r\n        function getActiveContentViewModel(question) {\r\n            switch (question.type) {\r\n                case constants.questionTypes.informationContent:\r\n                    return 'viewmodels/questions/informationContent';\r\n                default:\r\n                    return 'viewmodels/questions/questionContent';\r\n            }\r\n        }\r\n\r\n        function activate(sectionId, questionId) {\r\n\r\n            return Q.fcall(function() {\r\n                viewModel.section = sectionRepository.get(sectionId);\r\n                if (viewModel.section === null) {\r\n                    router.navigate('404', { replace: true, trigger: true });\r\n                    return;\r\n                }\r\n\r\n                viewModel.masteryScore = templateSettings.masteryScore.score;\r\n                viewModel.isSectionMastered = ko.computed(function() {\r\n                    return viewModel.section.score() >= templateSettings.masteryScore.score;\r\n                });\r\n\r\n                viewModel.question = questionRepository.get(sectionId, questionId);\r\n                if (viewModel.question === null) {\r\n                    router.navigate('404', { replace: true, trigger: true });\r\n                    return;\r\n                }\r\n\r\n\r\n                viewModel.voiceOver = viewModel.question.voiceOver;\r\n\r\n                viewModel.startTime = new Date();\r\n                viewModel.navigationContext = navigationModule.getNavigationContext(viewModel.section.id, viewModel.question.id);\r\n\r\n\r\n                return viewModel.question.load().then(function() {\r\n                    router.activeInstruction().config.title = TranslationPlugin.getTextByKey(\r\n                        viewModel.question.isInformationContent \r\n                        ? '[content page title]' \r\n                        : '[question page title]'\r\n                    );\r\n\r\n                    viewModel.activeViewModel = getActiveContentViewModel(viewModel.question);\r\n                });\r\n            });\r\n        }\r\n\r\n        function deactivate() {\r\n            if (viewModel.question && viewModel.question.learningContents.length > 0) {\r\n                viewModel.question.learningContentExperienced(new Date() - viewModel.startTime);\r\n            }\r\n        }\r\n    }\r\n);\n","define('viewmodels/questions/expandableBlock',['knockout'], function (ko) {\n    \"use strict\";\n\n    function ExpandableBlock() {\n        this.content = undefined;\n        this.children = undefined;\n        this.isExpanded = ko.observable();\n    };\n\n    ExpandableBlock.prototype.activate = function(data) {\n        this.content = data.content;\n        this.children = data.children;\n        this.isExpanded(false);\n    }\n\n    ExpandableBlock.prototype.toggleExpand = function() {\n        return this.isExpanded(!this.isExpanded());\n    }\n\n    return ExpandableBlock;\n});\n","define('viewmodels/questions/informationContent',['modules/questionsNavigation', 'plugins/router', 'templateSettings', 'context'], function (navigationModule, router, templateSettings, context) {\n    \"use strict\";\n\n    var viewModel = {\n        title: null,\n        learningContents: null,\n        navigateNext: navigateNext,\n        goToNextSection: goToNextSection,\n        goToResults: goToResults,\n        copyright: templateSettings.copyright,\n\n        activate: activate,\n        isGoToNextSectionVisible: ko.observable(false),\n        isGoToResultsVisible: ko.observable(false),\n        isNavigationLocked: router.isNavigationLocked\n    };\n\n    return viewModel;\n\n    function navigateNext() {\n        if (router.isNavigationLocked()) {\n            return;\n        }\n\n        var nextUrl = !_.isNullOrUndefined(viewModel.navigationContext.nextQuestionUrl) ? viewModel.navigationContext.nextQuestionUrl : 'sections';\n        router.navigate(nextUrl);\n    }\n\n    function goToNextSection() {\n        if (router.isNavigationLocked()) {\n            return;\n        }\n        if (!viewModel.navigationContext.nextSectionUrl) {\n            return;\n        }\n\n        router.navigate(viewModel.navigationContext.nextSectionUrl);\n    }\n\n    function goToResults() {\n        if (router.isNavigationLocked()) {\n            return;\n        }\n        router.navigate('#finish');\n    }\n\n    function activate(sectionId, question) {\n        return Q.fcall(function () {\n            question.submitAnswer();\n\n            viewModel.navigationContext = navigationModule.getNavigationContext(sectionId, question.id);\n            viewModel.id = question.id;\n            viewModel.title = question.title;\n            viewModel.learningContents = question.learningContents;\n\n            if (context.course.score() === 100) {\n                viewModel.isGoToResultsVisible(!templateSettings.hideFinishActionButtons);\n                viewModel.isGoToNextSectionVisible(viewModel.navigationContext.questionsCount === viewModel.navigationContext.currentQuestionIndex && viewModel.navigationContext.nextSectionUrl);\n            } else {\n                if (viewModel.navigationContext.questionsCount === viewModel.navigationContext.currentQuestionIndex) {\n                    viewModel.isGoToResultsVisible(!viewModel.navigationContext.nextSectionUrl && !templateSettings.hideFinishActionButtons);\n                    viewModel.isGoToNextSectionVisible(!!viewModel.navigationContext.nextSectionUrl);\n                } else {\n                    viewModel.isGoToResultsVisible(false);\n                    viewModel.isGoToNextSectionVisible(false);\n                }\n            }\n        });\n    }\n});\n","define('viewmodels/questions/questionContent',['questionContent/questionContent'],\n\tfunction (QuestionContent) {\n\t    \"use strict\";\n\n\t    return new QuestionContent();\n\t});\n","define('viewmodels/questions/scenarioQuestion/submitQuestion',['knockout', 'viewmodels/questions/scenarioQuestion/components/branchtrackProvider'], function (ko, branchtrackProvider) {\r\n    'use strict';\r\n\r\n    var submitCallback = function() {};\r\n\r\n    var viewmodel = {\r\n        submit: submit,\r\n        canBeSubmitted: ko.observable(false),\r\n        activate: activate\r\n    };\r\n\r\n    return viewmodel;\r\n\r\n    function activate(activationData) {\r\n        if (_.isFunction(activationData.submit)) {\r\n            submitCallback = activationData.submit;\r\n            viewmodel.canBeSubmitted(branchtrackProvider.isFinished());\r\n        }\r\n    }\r\n\r\n    function submit() {\r\n        viewmodel.canBeSubmitted(branchtrackProvider.isFinished());\r\n        if (viewmodel.canBeSubmitted()) {\r\n            submitCallback();\r\n        }\r\n    }\r\n});\n","define('viewmodels/sections',['underscore', 'context', 'repositories/courseRepository', 'plugins/router', 'templateSettings'],\n    function (_, context, repository, router, templateSettings) {\n\n        var\n            sections = [],\n            masteryScore = 0,\n            courseTitle = context.course.title,\n            sectionsLayout = null,\n            sectionThumbnail = { width: 284, height: 170 },\n            \n            canActivate = function () {\n                if (templateSettings.sectionsPage && !templateSettings.sectionsPage.enabled && !router.isNavigationLocked()) {\n                    var section = _.find(context.course.sections, function(section) {\n                        return section.questions.length > 0;\n                    });\n\n                    if(section) {\n                        return { redirect: '#section/' + section.id + '/question/' + section.questions[0].id };\n                    } else {\n                        return { redirect: '#finish' };\n                    }\n                }\n\n                return true;\n            },\n\n            activate = function () {\n                var course = repository.get();\n                if (course == null) {\n                    router.navigate('404');\n                    return;\n                }\n                this.sectionsLayout = templateSettings.sectionsLayout;\n                this.masteryScore = templateSettings.masteryScore.score;\n\n                if (sectionsLayout === \"List\") {\n                    sectionThumbnail.width = 100;\n                    sectionThumbnail.height = 70;\n                }\n\n                this.sections = _.map(course.sections, function (item) {\n                    return {\n                        id: item.id,\n                        title: item.title,\n                        imageUrl: item.imageUrl,\n                        imageWidth: sectionThumbnail.width,\n                        imageHeight: sectionThumbnail.height,\n                        score: item.score(),\n                        isMastered: item.score() >= templateSettings.masteryScore.score,\n                        scoreTooltipText: getScoreTooltipText(templateSettings.masteryScore.score, item.score()),\n                        questions: item.questions,\n                        affectProgress: item.affectProgress,\n                        goToFirstQuestion: function () {\n                            if (router.isNavigationLocked()) {\n                                return;\n                            }\n                            router.navigate('#/section/' + item.id + '/question/' + item.questions[0].id);\n                        }\n                    };\n                });\n            }\n\n        return {\n            activate: activate,\n            canActivate: canActivate,\n            isNavigationLocked: router.isNavigationLocked,\n            caption: 'Sections and questions',\n            courseTitle: courseTitle,\n            sectionsLayout: sectionsLayout,\n            isInReviewAttemptMode: context.isInReviewAttemptMode(),\n            getSectionButtonAccessibilityLabel: getSectionButtonAccessibilityLabel,\n\n            masteryScore: masteryScore,\n            sections: sections\n        };\n\n        function getSectionButtonAccessibilityLabel(buttonTranslationKey, section) {\n            return TranslationPlugin.getTextByKey(buttonTranslationKey) + ' ' + section.title + ' ' + section.score + '% ' + section.scoreTooltipText;\n        }\n        \n        function getScoreTooltipText(masteryScore, score) {\n            var scoreToComplete = masteryScore - score;\n            return scoreToComplete > 0 ? scoreToComplete + '% ' + TranslationPlugin.getTextByKey('[to complete]') : TranslationPlugin.getTextByKey('[completed]');\n        }\n\n    });\n","define('viewmodels/shell',[\n    'knockout', 'underscore', 'durandal/app', 'durandal/composition', 'plugins/router',\n    'routing/routes', 'context', 'includedModules/modulesInitializer', 'templateSettings',\n    'progressContext', 'constants', 'userContext', 'errorsHandler',\n    'modules/progress/index', 'account/index', 'xApi/xApiInitializer', 'modules/publishModeProvider', \n    'modules/questionsNavigation', 'modules/lti', 'modules/webhooks', 'helpers/loginHelper',\n    'modules/progress/progressStorage/urlProvider'\n], function (ko, _, app, composition, router, routes, context, modulesInitializer, templateSettings,\n    progressContext, constants, userContext, errorsHandler, progressProvider, account, xApiInitializer, publishModeProvider, \n    questionsNavigation, lti, webhooks, loginHelper, urlProvider) {\n\n        'use strict';\n        var viewmodel = {\n            router: null,\n            cssName: null,\n            isInReviewMode: false,\n            title: '',\n            createdOn: null,\n            logo: {\n                url: '',\n                maxWidth: '',\n                maxHeight: '',\n            },\n            pdfExportEnabled: ko.observable(false),\n            isClosed: ko.observable(false),\n            isNavigatingToAnotherView: ko.observable(false),\n            inIframe: window.self !== window.top,\n\n            viewSettings: ko.computed(viewSettings),\n            activate: activate\n        };\n\n        viewmodel.router = router;\n        viewmodel.cssName = ko.computed(function () {\n            var activeItem = router.activeItem();\n            if (_.isObject(activeItem)) {\n                var moduleId = activeItem.__moduleId__;\n                moduleId = moduleId.slice(moduleId.lastIndexOf('/') + 1);\n                return moduleId;\n            }\n            return '';\n        });\n\n        viewmodel.isInReviewMode = router.getQueryStringValue('reviewApiUrl');\n\n        router.on('router:route:activating')\n            .then(function (newView) {\n                if (!publishModeProvider.isScormEnabled && !viewmodel.pdfExportEnabled() === templateSettings.pdfExport.enabled) {\n                    var isNotAccountModule = newView && (newView.__moduleId__.slice(0, newView.__moduleId__.indexOf('/')) !== 'account');\n                    viewmodel.pdfExportEnabled(isNotAccountModule);\n                }\n\n                var currentView = router.activeItem();\n                if (newView && currentView && newView.__moduleId__ === currentView.__moduleId__) {\n                    return;\n                }\n                viewmodel.isNavigatingToAnotherView(true);\n            });\n\n        app.on(constants.events.appClosed)\n            .then(function () {\n                viewmodel.isClosed(true);\n            });\n\n        return viewmodel;\n\n        //public methods\n        function activate() {\n            return context.initialize()\n                .then(initializeUrlProvider)\n                .then(loginHelper.initialize)\n                .then(userContext.initialize)\n                .then(lti.initialize)\n                .then(account.enable)\n                .then(initializeWebhooks)\n                .then(initializeProgressProvider)\n                .then(initxApi)\n                .then(initApp)\n                .then(initRouter)\n                .catch(function (e) {\n                    console.error(e);\n                });\n\n            function initializeUrlProvider() {\n                return urlProvider.initialize();\n            }\n\n            function initializeWebhooks() {\n                if(templateSettings.xApi.enabled) {\n                    webhooks.initialize(templateSettings.webhooks);\n                }\n            }\n\n            function initxApi() {\n                return xApiInitializer.initialize(templateSettings.xApi, templateSettings.nps);\n            }\n\n            function initializeProgressProvider() {\n                if (!publishModeProvider.isScormEnabled && !publishModeProvider.isPreview && !publishModeProvider.isReview) {\n                    return progressProvider.initialize().then(function (provider) {\n                        progressContext.use(provider);\n                    });\n                }\n            }\n\n            function initApp() {\n                return Q.fcall(function () {\n                    viewmodel.logo.url = templateSettings.logo.url;\n                    viewmodel.logo.maxWidth = templateSettings.logo.maxWidth || '300px';\n                    viewmodel.logo.maxHeight = templateSettings.logo.maxHeight || '100px';\n                    viewmodel.title = app.title = context.course.title;\n                    viewmodel.createdOn = context.course.createdOn;\n                    progressContext.restoreProgress();\n                    if (context.isInReviewAttemptMode()) {\n                        xApiInitializer.deactivate();\n                    }\n                    app.trigger(constants.events.appInitialized);\n                });\n            }\n\n            function initRouter() {\n                questionsNavigation.redirectToQuestion();\n                return router.map(routes.routes).buildNavigationModel().mapUnknownRoutes('viewmodels/404', '404').activate().then(function () {\n                    errorsHandler.startHandle();\n                });\n            }\n        }\n\n        function viewSettings() {\n            var settings = {\n                rootLinkEnabled: false,\n                exitButtonVisible: false,\n                treeOfContentVisible: false,\n                isInReviewAttemptMode: false\n            };\n\n            var activeInstruction = router.activeInstruction();\n            if (_.isObject(activeInstruction)) {\n                settings.rootLinkEnabled = !!activeInstruction.config.rootLinkEnabled && !router.isNavigationLocked();\n                settings.exitButtonVisible = showExitButton(activeInstruction.config) && !templateSettings.hideFinishActionButtons;\n                settings.treeOfContentVisible = templateSettings.treeOfContent.enabled && !!activeInstruction.config.displayTreeOfContent;\n            }\n            settings.isInReviewAttemptMode = context.isInReviewAttemptMode();\n\n            return settings;\n        }\n\n        function showExitButton(activeInstructionConfig) {\n            return !!activeInstructionConfig.showExitButton ||\n                (!!activeInstructionConfig.showExitButtonInReviewMode && context.isInReviewAttemptMode());\n        }\n    });\n","define('xApi/models/verb',['../guard'],\n    function (guard) {\n\n        var verb = function (spec) {\n\n            if (typeof spec == typeof undefined) {\n                throw 'You should provide a specification to create Verb';\n            }\n\n            guard.throwIfNotVerbId(spec.id, 'You should provide valid id for Verb');\n            guard.throwIfNotLanguageMap(spec.display, 'You should provide valid language map as display for Verb');\n\n            return {\n                id: spec.id,\n                display: spec.display\n            };\n        };\n\n        return verb;\n    }\n);\n","define('xApi/viewmodels/xAPIError',['knockout', 'durandal/app', 'plugins/router', '../xApiInitializer', '../configuration/xApiSettings'],\n    function (ko, app, router, xApiInitializer, xApiSettings) {\n\n    var\n        navigateBackUrl = '',\n\n        allowToContinue = ko.observable(false),\n\n        restartCourse = function () {\n            var rootUrl = location.toString().replace(location.hash, '');\n            router.navigate(rootUrl, { replace: true, trigger: true });\n        },\n        \n        continueLearning = function () {\n            if (!allowToContinue()) {\n                return;\n            }\n\n            xApiInitializer.deactivate();\n            router.navigate(navigateBackUrl);\n            app.trigger('user:authentication-skipped');\n        },\n\n        activate = function (backUrl) {\n            navigateBackUrl = backUrl;\n            allowToContinue(!xApiSettings.xApi.required);\n        };\n\n        return {\n            allowToContinue: allowToContinue,\n            restartCourse: restartCourse,\n            continueLearning: continueLearning,\n        \n            activate: activate\n        };\n});\n","/**\n * Durandal 2.0.1 Copyright (c) 2012 Blue Spire Consulting, Inc. All Rights Reserved.\n * Available via the MIT license.\n * see: http://durandaljs.com or https://github.com/BlueSpire/Durandal for details.\n */\n/**\n * The entrance transition module.\n * @module entrance\n * @requires system\n * @requires composition\n * @requires jquery\n */\ndefine('transitions/entrance',['durandal/system', 'durandal/composition', 'jquery'], function(system, composition, $) {\n    var fadeOutDuration = 50;\n    var endValues = {\n        marginRight: 0,\n        marginLeft: 0,\n        opacity: 1\n    };\n    var clearValues = {\n        marginLeft: '',\n        marginRight: '',\n        opacity: '',\n        display: ''\n    };\n\n    /**\n     * @class EntranceModule\n     * @constructor\n     */\n    var entrance = function(context) {\n        return system.defer(function (dfd) {\n            function endTransition() {\n                if (context.bindingContext.$data && context.bindingContext.$data.isNavigatingToAnotherView && ko.isObservable(context.bindingContext.$data.isNavigatingToAnotherView)) {\n                    context.bindingContext.$data.isNavigatingToAnotherView(false);\n                }\n                dfd.resolve();\n            }\n\n            function scrollIfNeeded() {\n                if (!context.keepScrollPosition) {\n                    $(document).scrollTop(0);\n                }\n            }\n\n            if (!context.child) {\n                $(context.activeView).fadeOut(fadeOutDuration, endTransition);\n            } else {\n                var duration = context.duration || 300;\n                var fadeOnly = !!context.fadeOnly;\n\n                function startTransition() {\n                    scrollIfNeeded();\n                    context.triggerAttach();\n\n                    var startValues = {\n                        marginLeft: fadeOnly ? '0' : '20px',\n                        marginRight: fadeOnly ? '0' : '-20px',\n                        opacity: 0,\n                        display: 'block'\n                    };\n\n                    var $child = $(context.child);\n\n                    $child.css(startValues);\n                    $child.animate(endValues, {\n                        duration: duration,\n                        easing: 'swing',\n                        always: function () {\n                            $child.css(clearValues);\n                            endTransition();\n                        }\n                    });\n                }\n                \n                if (context.activeView) {\n                    $(context.activeView).fadeOut({ duration: fadeOutDuration, always: startTransition });\n                } else {\n                    startTransition();\n                }\n                \n            }\n        }).promise();\n    };\n\n    return entrance;\n});\n\n","/**\n * Durandal 2.0.1 Copyright (c) 2012 Blue Spire Consulting, Inc. All Rights Reserved.\n * Available via the MIT license.\n * see: http://durandaljs.com or https://github.com/BlueSpire/Durandal for details.\n */\n/**\n * The dialog module enables the display of message boxes, custom modal dialogs and other overlays or slide-out UI abstractions. Dialogs are constructed by the composition system which interacts with a user defined dialog context. The dialog module enforced the activator lifecycle.\n * @module dialog\n * @requires system\n * @requires app\n * @requires composition\n * @requires activator\n * @requires viewEngine\n * @requires jquery\n * @requires knockout\n */\ndefine('plugins/dialog',['durandal/system', 'durandal/app', 'durandal/composition', 'durandal/activator', 'durandal/viewEngine', 'jquery', 'knockout'], function (system, app, composition, activator, viewEngine, $, ko) {\n    var contexts = {},\n        dialogCount = 0,\n        dialog;\n\n    /**\n     * Models a message box's message, title and options.\n     * @class MessageBox\n     */\n    var MessageBox = function(message, title, options) {\n        this.message = message;\n        this.title = title || MessageBox.defaultTitle;\n        this.options = options || MessageBox.defaultOptions;\n    };\n\n    /**\n     * Selects an option and closes the message box, returning the selected option through the dialog system's promise.\n     * @method selectOption\n     * @param {string} dialogResult The result to select.\n     */\n    MessageBox.prototype.selectOption = function (dialogResult) {\n        dialog.close(this, dialogResult);\n    };\n\n    /**\n     * Provides the view to the composition system.\n     * @method getView\n     * @return {DOMElement} The view of the message box.\n     */\n    MessageBox.prototype.getView = function(){\n        return viewEngine.processMarkup(MessageBox.defaultViewMarkup);\n    };\n\n    /**\n     * Configures a custom view to use when displaying message boxes.\n     * @method setViewUrl\n     * @param {string} viewUrl The view url relative to the base url which the view locator will use to find the message box's view.\n     * @static\n     */\n    MessageBox.setViewUrl = function(viewUrl){\n        delete MessageBox.prototype.getView;\n        MessageBox.prototype.viewUrl = viewUrl;\n    };\n\n    /**\n     * The title to be used for the message box if one is not provided.\n     * @property {string} defaultTitle\n     * @default Application\n     * @static\n     */\n    MessageBox.defaultTitle = app.title || 'Application';\n\n    /**\n     * The options to display in the message box of none are specified.\n     * @property {string[]} defaultOptions\n     * @default ['Ok']\n     * @static\n     */\n    MessageBox.defaultOptions = ['Ok'];\n\n    /**\n     * The markup for the message box's view.\n     * @property {string} defaultViewMarkup\n     * @static\n     */\n    MessageBox.defaultViewMarkup = [\n        '<div data-view=\"plugins/messageBox\" class=\"messageBox\">',\n            '<div class=\"modal-header\">',\n                '<h3 data-bind=\"text: title\"></h3>',\n            '</div>',\n            '<div class=\"modal-body\">',\n                '<p class=\"message\" data-bind=\"text: message\"></p>',\n            '</div>',\n            '<div class=\"modal-footer\" data-bind=\"foreach: options\">',\n                '<button class=\"btn\" data-bind=\"click: function () { $parent.selectOption($data); }, text: $data, css: { \\'btn-primary\\': $index() == 0, autofocus: $index() == 0 }\"></button>',\n            '</div>',\n        '</div>'\n    ].join('\\n');\n\n    function ensureDialogInstance(objOrModuleId) {\n        return system.defer(function(dfd) {\n            if (system.isString(objOrModuleId)) {\n                system.acquire(objOrModuleId).then(function (module) {\n                    dfd.resolve(system.resolveObject(module));\n                }).fail(function(err){\n                    system.error('Failed to load dialog module (' + objOrModuleId + '). Details: ' + err.message);\n                });\n            } else {\n                dfd.resolve(objOrModuleId);\n            }\n        }).promise();\n    }\n\n    /**\n     * @class DialogModule\n     * @static\n     */\n    dialog = {\n        /**\n         * The constructor function used to create message boxes.\n         * @property {MessageBox} MessageBox\n         */\n        MessageBox:MessageBox,\n        /**\n         * The css zIndex that the last dialog was displayed at.\n         * @property {number} currentZIndex\n         */\n        currentZIndex: 1050,\n        /**\n         * Gets the next css zIndex at which a dialog should be displayed.\n         * @method getNextZIndex\n         * @return {number} The next usable zIndex.\n         */\n        getNextZIndex: function () {\n            return ++this.currentZIndex;\n        },\n        /**\n         * Determines whether or not there are any dialogs open.\n         * @method isOpen\n         * @return {boolean} True if a dialog is open. false otherwise.\n         */\n        isOpen: function() {\n            return dialogCount > 0;\n        },\n        /**\n         * Gets the dialog context by name or returns the default context if no name is specified.\n         * @method getContext\n         * @param {string} [name] The name of the context to retrieve.\n         * @return {DialogContext} True context.\n         */\n        getContext: function(name) {\n            return contexts[name || 'default'];\n        },\n        /**\n         * Adds (or replaces) a dialog context.\n         * @method addContext\n         * @param {string} name The name of the context to add.\n         * @param {DialogContext} dialogContext The context to add.\n         */\n        addContext: function(name, dialogContext) {\n            dialogContext.name = name;\n            contexts[name] = dialogContext;\n\n            var helperName = 'show' + name.substr(0, 1).toUpperCase() + name.substr(1);\n            this[helperName] = function (obj, activationData) {\n                return this.show(obj, activationData, name);\n            };\n        },\n        createCompositionSettings: function(obj, dialogContext) {\n            var settings = {\n                model:obj,\n                activate:false,\n                transition: false\n            };\n\n            if (dialogContext.attached) {\n                settings.attached = dialogContext.attached;\n            }\n\n            if (dialogContext.compositionComplete) {\n                settings.compositionComplete = dialogContext.compositionComplete;\n            }\n\n            return settings;\n        },\n        /**\n         * Gets the dialog model that is associated with the specified object.\n         * @method getDialog\n         * @param {object} obj The object for whom to retrieve the dialog.\n         * @return {Dialog} The dialog model.\n         */\n        getDialog:function(obj){\n            if(obj){\n                return obj.__dialog__;\n            }\n\n            return undefined;\n        },\n        /**\n         * Closes the dialog associated with the specified object.\n         * @method close\n         * @param {object} obj The object whose dialog should be closed.\n         * @param {object} results* The results to return back to the dialog caller after closing.\n         */\n        close:function(obj){\n            var theDialog = this.getDialog(obj);\n            if(theDialog){\n                var rest = Array.prototype.slice.call(arguments, 1);\n                theDialog.close.apply(theDialog, rest);\n            }\n        },\n        /**\n         * Shows a dialog.\n         * @method show\n         * @param {object|string} obj The object (or moduleId) to display as a dialog.\n         * @param {object} [activationData] The data that should be passed to the object upon activation.\n         * @param {string} [context] The name of the dialog context to use. Uses the default context if none is specified.\n         * @return {Promise} A promise that resolves when the dialog is closed and returns any data passed at the time of closing.\n         */\n        show: function(obj, activationData, context) {\n            var that = this;\n            var dialogContext = contexts[context || 'default'];\n\n            return system.defer(function(dfd) {\n                ensureDialogInstance(obj).then(function(instance) {\n                    var dialogActivator = activator.create();\n\n                    dialogActivator.activateItem(instance, activationData).then(function (success) {\n                        if (success) {\n                            var theDialog = instance.__dialog__ = {\n                                owner: instance,\n                                context: dialogContext,\n                                activator: dialogActivator,\n                                close: function () {\n                                    var args = arguments;\n                                    dialogActivator.deactivateItem(instance, true).then(function (closeSuccess) {\n                                        if (closeSuccess) {\n                                            dialogCount--;\n                                            dialogContext.removeHost(theDialog);\n                                            delete instance.__dialog__;\n\n                                            if (args.length === 0) {\n                                                dfd.resolve();\n                                            } else if (args.length === 1) {\n                                                dfd.resolve(args[0]);\n                                            } else {\n                                                dfd.resolve.apply(dfd, args);\n                                            }\n                                        }\n                                    });\n                                }\n                            };\n\n                            theDialog.settings = that.createCompositionSettings(instance, dialogContext);\n                            dialogContext.addHost(theDialog);\n\n                            dialogCount++;\n                            composition.compose(theDialog.host, theDialog.settings);\n                        } else {\n                            dfd.resolve(false);\n                        }\n                    });\n                });\n            }).promise();\n        },\n        /**\n         * Shows a message box.\n         * @method showMessage\n         * @param {string} message The message to display in the dialog.\n         * @param {string} [title] The title message.\n         * @param {string[]} [options] The options to provide to the user.\n         * @return {Promise} A promise that resolves when the message box is closed and returns the selected option.\n         */\n        showMessage:function(message, title, options){\n            if(system.isString(this.MessageBox)){\n                return dialog.show(this.MessageBox, [\n                    message,\n                    title || MessageBox.defaultTitle,\n                    options || MessageBox.defaultOptions\n                ]);\n            }\n\n            return dialog.show(new this.MessageBox(message, title, options));\n        },\n        /**\n         * Installs this module into Durandal; called by the framework. Adds `app.showDialog` and `app.showMessage` convenience methods.\n         * @method install\n         * @param {object} [config] Add a `messageBox` property to supply a custom message box constructor. Add a `messageBoxView` property to supply custom view markup for the built-in message box.\n         */\n        install:function(config){\n            app.showDialog = function(obj, activationData, context) {\n                return dialog.show(obj, activationData, context);\n            };\n\n            app.showMessage = function(message, title, options) {\n                return dialog.showMessage(message, title, options);\n            };\n\n            if(config.messageBox){\n                dialog.MessageBox = config.messageBox;\n            }\n\n            if(config.messageBoxView){\n                dialog.MessageBox.prototype.getView = function(){\n                    return config.messageBoxView;\n                };\n            }\n        }\n    };\n\n    /**\n     * @class DialogContext\n     */\n    dialog.addContext('default', {\n        blockoutOpacity: .2,\n        removeDelay: 200,\n        /**\n         * In this function, you are expected to add a DOM element to the tree which will serve as the \"host\" for the modal's composed view. You must add a property called host to the modalWindow object which references the dom element. It is this host which is passed to the composition module.\n         * @method addHost\n         * @param {Dialog} theDialog The dialog model.\n         */\n        addHost: function(theDialog) {\n            var body = $('body');\n            var blockout = $('<div class=\"modalBlockout\"></div>')\n                .css({ 'z-index': dialog.getNextZIndex(), 'opacity': this.blockoutOpacity })\n                .appendTo(body);\n\n            var host = $('<div class=\"modalHost\"></div>')\n                .css({ 'z-index': dialog.getNextZIndex() })\n                .appendTo(body);\n\n            theDialog.host = host.get(0);\n            theDialog.blockout = blockout.get(0);\n\n            if (!dialog.isOpen()) {\n                theDialog.oldBodyMarginRight = body.css(\"margin-right\");\n                theDialog.oldInlineMarginRight = body.get(0).style.marginRight;\n\n                var html = $(\"html\");\n                var oldBodyOuterWidth = body.outerWidth(true);\n                var oldScrollTop = html.scrollTop();\n                $(\"html\").css(\"overflow-y\", \"hidden\");\n                var newBodyOuterWidth = $(\"body\").outerWidth(true);\n                body.css(\"margin-right\", (newBodyOuterWidth - oldBodyOuterWidth + parseInt(theDialog.oldBodyMarginRight, 10)) + \"px\");\n                html.scrollTop(oldScrollTop); // necessary for Firefox\n            }\n        },\n        /**\n         * This function is expected to remove any DOM machinery associated with the specified dialog and do any other necessary cleanup.\n         * @method removeHost\n         * @param {Dialog} theDialog The dialog model.\n         */\n        removeHost: function(theDialog) {\n            $(theDialog.host).css('opacity', 0);\n            $(theDialog.blockout).css('opacity', 0);\n\n            setTimeout(function() {\n                ko.removeNode(theDialog.host);\n                ko.removeNode(theDialog.blockout);\n            }, this.removeDelay);\n\n            if (!dialog.isOpen()) {\n                var html = $(\"html\");\n                var oldScrollTop = html.scrollTop(); // necessary for Firefox.\n                html.css(\"overflow-y\", \"\").scrollTop(oldScrollTop);\n\n                if(theDialog.oldInlineMarginRight) {\n                    $(\"body\").css(\"margin-right\", theDialog.oldBodyMarginRight);\n                } else {\n                    $(\"body\").css(\"margin-right\", '');\n                }\n            }\n        },\n        attached: function (view) {\n            //To prevent flickering in IE8, we set visibility to hidden first, and later restore it\n            $(view).css(\"visibility\", \"hidden\");\n        },\n        /**\n         * This function is called after the modal is fully composed into the DOM, allowing your implementation to do any final modifications, such as positioning or animation. You can obtain the original dialog object by using `getDialog` on context.model.\n         * @method compositionComplete\n         * @param {DOMElement} child The dialog view.\n         * @param {DOMElement} parent The parent view.\n         * @param {object} context The composition context.\n         */\n        compositionComplete: function (child, parent, context) {\n            var theDialog = dialog.getDialog(context.model);\n            var $child = $(child);\n            var loadables = $child.find(\"img\").filter(function () {\n                //Remove images with known width and height\n                var $this = $(this);\n                return !(this.style.width && this.style.height) && !($this.attr(\"width\") && $this.attr(\"height\"));\n            });\n\n            $child.data(\"predefinedWidth\", $child.get(0).style.width);\n\n            var setDialogPosition = function () {\n                //Setting a short timeout is need in IE8, otherwise we could do this straight away\n                setTimeout(function () {\n                    //We will clear and then set width for dialogs without width set \n                    if (!$child.data(\"predefinedWidth\")) {\n                        $child.css({ width: '' }); //Reset width\n                    }\n                    var width = $child.outerWidth(false);\n                    var height = $child.outerHeight(false);\n                    var windowHeight = $(window).height();\n                    var constrainedHeight = Math.min(height, windowHeight);\n\n                    $child.css({\n                        'margin-top': (-constrainedHeight / 2).toString() + 'px',\n                        'margin-left': (-width / 2).toString() + 'px'\n                    });\n\n                    if (!$child.data(\"predefinedWidth\")) {\n                        //Ensure the correct width after margin-left has been set\n                        $child.outerWidth(width);\n                    }\n\n                    if (height > windowHeight) {\n                        $child.css(\"overflow-y\", \"auto\");\n                    } else {\n                        $child.css(\"overflow-y\", \"\");\n                    }\n\n                    $(theDialog.host).css('opacity', 1);\n                    $child.css(\"visibility\", \"visible\");\n\n                    $child.find('.autofocus').first().focus();\n                }, 1);\n            };\n\n            setDialogPosition();\n            loadables.load(setDialogPosition);\n\n            if ($child.hasClass('autoclose')) {\n                $(theDialog.blockout).click(function () {\n                    theDialog.close();\n                });\n            }\n        }\n    });\n\n    return dialog;\n});\n\n","/**\n * Durandal 2.0.1 Copyright (c) 2012 Blue Spire Consulting, Inc. All Rights Reserved.\n * Available via the MIT license.\n * see: http://durandaljs.com or https://github.com/BlueSpire/Durandal for details.\n */\n/**\n * Enables automatic observability of plain javascript object for ES5 compatible browsers. Also, converts promise properties into observables that are updated when the promise resolves.\n * @module observable\n * @requires system\n * @requires binder\n * @requires knockout\n */\ndefine('plugins/observable',['durandal/system', 'durandal/binder', 'knockout'], function(system, binder, ko) {\n    var observableModule,\n        toString = Object.prototype.toString,\n        nonObservableTypes = ['[object Function]', '[object String]', '[object Boolean]', '[object Number]', '[object Date]', '[object RegExp]'],\n        observableArrayMethods = ['remove', 'removeAll', 'destroy', 'destroyAll', 'replace'],\n        arrayMethods = ['pop', 'reverse', 'sort', 'shift', 'splice'],\n        additiveArrayFunctions = ['push', 'unshift'],\n        arrayProto = Array.prototype,\n        observableArrayFunctions = ko.observableArray.fn,\n        logConversion = false;\n\n    /**\n     * You can call observable(obj, propertyName) to get the observable function for the specified property on the object.\n     * @class ObservableModule\n     */\n\n    function shouldIgnorePropertyName(propertyName){\n        var first = propertyName[0];\n        return first === '_' || first === '$';\n    }\n\n    function isNode(obj) {\n        return !!(obj && obj.nodeType !== undefined && system.isNumber(obj.nodeType));\n    }\n\n    function canConvertType(value) {\n        if (!value || isNode(value) || value.ko === ko || value.jquery) {\n            return false;\n        }\n\n        var type = toString.call(value);\n\n        return nonObservableTypes.indexOf(type) == -1 && !(value === true || value === false);\n    }\n\n    function makeObservableArray(original, observable) {\n        var lookup = original.__observable__, notify = true;\n\n        if(lookup && lookup.__full__){\n            return;\n        }\n\n        lookup = lookup || (original.__observable__ = {});\n        lookup.__full__ = true;\n\n        observableArrayMethods.forEach(function(methodName) {\n            original[methodName] = function() {\n                notify = false;\n                var methodCallResult = observableArrayFunctions[methodName].apply(observable, arguments);\n                notify = true;\n                return methodCallResult;\n            };\n        });\n\n        arrayMethods.forEach(function(methodName) {\n            original[methodName] = function() {\n                if(notify){\n                    observable.valueWillMutate();\n                }\n\n                var methodCallResult = arrayProto[methodName].apply(original, arguments);\n\n                if(notify){\n                    observable.valueHasMutated();\n                }\n\n                return methodCallResult;\n            };\n        });\n\n        additiveArrayFunctions.forEach(function(methodName){\n            original[methodName] = function() {\n                for (var i = 0, len = arguments.length; i < len; i++) {\n                    convertObject(arguments[i]);\n                }\n\n                if(notify){\n                    observable.valueWillMutate();\n                }\n\n                var methodCallResult = arrayProto[methodName].apply(original, arguments);\n\n                if(notify){\n                    observable.valueHasMutated();\n                }\n\n                return methodCallResult;\n            };\n        });\n\n        original['splice'] = function() {\n            for (var i = 2, len = arguments.length; i < len; i++) {\n                convertObject(arguments[i]);\n            }\n\n            if(notify){\n                observable.valueWillMutate();\n            }\n\n            var methodCallResult = arrayProto['splice'].apply(original, arguments);\n\n            if(notify){\n                observable.valueHasMutated();\n            }\n\n            return methodCallResult;\n        };\n\n        for (var i = 0, len = original.length; i < len; i++) {\n            convertObject(original[i]);\n        }\n    }\n\n    /**\n     * Converts an entire object into an observable object by re-writing its attributes using ES5 getters and setters. Attributes beginning with '_' or '$' are ignored.\n     * @method convertObject\n     * @param {object} obj The target object to convert.\n     */\n    function convertObject(obj){\n        var lookup, value;\n\n        if(!canConvertType(obj)){\n            return;\n        }\n\n        lookup = obj.__observable__;\n\n        if(lookup && lookup.__full__){\n            return;\n        }\n\n        lookup = lookup || (obj.__observable__ = {});\n        lookup.__full__ = true;\n\n        if (system.isArray(obj)) {\n            var observable = ko.observableArray(obj);\n            makeObservableArray(obj, observable);\n        } else {\n            for (var propertyName in obj) {\n                if(shouldIgnorePropertyName(propertyName)){\n                    continue;\n                }\n\n                if(!lookup[propertyName]){\n                    value = obj[propertyName];\n\n                    if(!system.isFunction(value)){\n                        convertProperty(obj, propertyName, value);\n                    }\n                }\n            }\n        }\n\n        if(logConversion) {\n            system.log('Converted', obj);\n        }\n    }\n\n    function innerSetter(observable, newValue, isArray) {\n        var val;\n        observable(newValue);\n        val = observable.peek();\n\n        //if this was originally an observableArray, then always check to see if we need to add/replace the array methods (if newValue was an entirely new array)\n        if (isArray) {\n            if (!val) {\n                //don't allow null, force to an empty array\n                val = [];\n                observable(val);\n                makeObservableArray(val, observable);\n            }\n            else if (!val.destroyAll) {\n                makeObservableArray(val, observable);\n            }\n        } else {\n            convertObject(val);\n        }\n    }\n\n    /**\n     * Converts a normal property into an observable property using ES5 getters and setters.\n     * @method convertProperty\n     * @param {object} obj The target object on which the property to convert lives.\n     * @param {string} propertyName The name of the property to convert.\n     * @param {object} [original] The original value of the property. If not specified, it will be retrieved from the object.\n     * @return {KnockoutObservable} The underlying observable.\n     */\n    function convertProperty(obj, propertyName, original){\n        var observable,\n            isArray,\n            lookup = obj.__observable__ || (obj.__observable__ = {});\n\n        if(original === undefined){\n            original = obj[propertyName];\n        }\n\n        if (system.isArray(original)) {\n            observable = ko.observableArray(original);\n            makeObservableArray(original, observable);\n            isArray = true;\n        } else if (typeof original == \"function\") {\n            if(ko.isObservable(original)){\n                observable = original;\n            }else{\n                return null;\n            }\n        } else if(system.isPromise(original)) {\n            observable = ko.observable();\n\n            original.then(function (result) {\n                if(system.isArray(result)) {\n                    var oa = ko.observableArray(result);\n                    makeObservableArray(result, oa);\n                    result = oa;\n                }\n\n                observable(result);\n            });\n        } else {\n            observable = ko.observable(original);\n            convertObject(original);\n        }\n\n        Object.defineProperty(obj, propertyName, {\n            configurable: true,\n            enumerable: true,\n            get: observable,\n            set: ko.isWriteableObservable(observable) ? (function (newValue) {\n                if (newValue && system.isPromise(newValue)) {\n                    newValue.then(function (result) {\n                        innerSetter(observable, result, system.isArray(result));\n                    });\n                } else {\n                    innerSetter(observable, newValue, isArray);\n                }\n            }) : undefined\n        });\n\n        lookup[propertyName] = observable;\n        return observable;\n    }\n\n    /**\n     * Defines a computed property using ES5 getters and setters.\n     * @method defineProperty\n     * @param {object} obj The target object on which to create the property.\n     * @param {string} propertyName The name of the property to define.\n     * @param {function|object} evaluatorOrOptions The Knockout computed function or computed options object.\n     * @return {KnockoutObservable} The underlying computed observable.\n     */\n    function defineProperty(obj, propertyName, evaluatorOrOptions) {\n        var computedOptions = { owner: obj, deferEvaluation: true },\n            computed;\n\n        if (typeof evaluatorOrOptions === 'function') {\n            computedOptions.read = evaluatorOrOptions;\n        } else {\n            if ('value' in evaluatorOrOptions) {\n                system.error('For defineProperty, you must not specify a \"value\" for the property. You must provide a \"get\" function.');\n            }\n\n            if (typeof evaluatorOrOptions.get !== 'function') {\n                system.error('For defineProperty, the third parameter must be either an evaluator function, or an options object containing a function called \"get\".');\n            }\n\n            computedOptions.read = evaluatorOrOptions.get;\n            computedOptions.write = evaluatorOrOptions.set;\n        }\n\n        computed = ko.computed(computedOptions);\n        obj[propertyName] = computed;\n\n        return convertProperty(obj, propertyName, computed);\n    }\n\n    observableModule = function(obj, propertyName){\n        var lookup, observable, value;\n\n        if (!obj) {\n            return null;\n        }\n\n        lookup = obj.__observable__;\n        if(lookup){\n            observable = lookup[propertyName];\n            if(observable){\n                return observable;\n            }\n        }\n\n        value = obj[propertyName];\n\n        if(ko.isObservable(value)){\n            return value;\n        }\n\n        return convertProperty(obj, propertyName, value);\n    };\n\n    observableModule.defineProperty = defineProperty;\n    observableModule.convertProperty = convertProperty;\n    observableModule.convertObject = convertObject;\n\n    /**\n     * Installs the plugin into the view model binder's `beforeBind` hook so that objects are automatically converted before being bound.\n     * @method install\n     */\n    observableModule.install = function(options) {\n        var original = binder.binding;\n\n        binder.binding = function(obj, view, instruction) {\n            if(instruction.applyBindings && !instruction.skipConversion){\n                convertObject(obj);\n            }\n\n            original(obj, view);\n        };\n\n        logConversion = options.logConversion;\n    };\n\n    return observableModule;\n});\n\n","/**\n * Durandal 2.0.1 Copyright (c) 2012 Blue Spire Consulting, Inc. All Rights Reserved.\n * Available via the MIT license.\n * see: http://durandaljs.com or https://github.com/BlueSpire/Durandal for details.\n */\n/**\n * Serializes and deserializes data to/from JSON.\n * @module serializer\n * @requires system\n */\ndefine('plugins/serializer',['durandal/system'], function(system) {\n    /**\n     * @class SerializerModule\n     * @static\n     */\n    return {\n        /**\n         * The name of the attribute that the serializer should use to identify an object's type.\n         * @property {string} typeAttribute\n         * @default type\n         */\n        typeAttribute: 'type',\n        /**\n         * The amount of space to use for indentation when writing out JSON.\n         * @property {string|number} space\n         * @default undefined\n         */\n        space:undefined,\n        /**\n         * The default replacer function used during serialization. By default properties starting with '_' or '$' are removed from the serialized object.\n         * @method replacer\n         * @param {string} key The object key to check.\n         * @param {object} value The object value to check.\n         * @return {object} The value to serialize.\n         */\n        replacer: function(key, value) {\n            if(key){\n                var first = key[0];\n                if(first === '_' || first === '$'){\n                    return undefined;\n                }\n            }\n\n            return value;\n        },\n        /**\n         * Serializes the object.\n         * @method serialize\n         * @param {object} object The object to serialize.\n         * @param {object} [settings] Settings can specify a replacer or space to override the serializer defaults.\n         * @return {string} The JSON string.\n         */\n        serialize: function(object, settings) {\n            settings = (settings === undefined) ? {} : settings;\n\n            if(system.isString(settings) || system.isNumber(settings)) {\n                settings = { space: settings };\n            }\n\n            return JSON.stringify(object, settings.replacer || this.replacer, settings.space || this.space);\n        },\n        /**\n         * Gets the type id for an object instance, using the configured `typeAttribute`.\n         * @method getTypeId\n         * @param {object} object The object to serialize.\n         * @return {string} The type.\n         */\n        getTypeId: function(object) {\n            if (object) {\n                return object[this.typeAttribute];\n            }\n\n            return undefined;\n        },\n        /**\n         * Maps type ids to object constructor functions. Keys are type ids and values are functions.\n         * @property {object} typeMap.\n         */\n        typeMap: {},\n        /**\n         * Adds a type id/constructor function mampping to the `typeMap`.\n         * @method registerType\n         * @param {string} typeId The type id.\n         * @param {function} constructor The constructor.\n         */\n        registerType: function() {\n            var first = arguments[0];\n\n            if (arguments.length == 1) {\n                var id = first[this.typeAttribute] || system.getModuleId(first);\n                this.typeMap[id] = first;\n            } else {\n                this.typeMap[first] = arguments[1];\n            }\n        },\n        /**\n         * The default reviver function used during deserialization. By default is detects type properties on objects and uses them to re-construct the correct object using the provided constructor mapping.\n         * @method reviver\n         * @param {string} key The attribute key.\n         * @param {object} value The object value associated with the key.\n         * @param {function} getTypeId A custom function used to get the type id from a value.\n         * @param {object} getConstructor A custom function used to get the constructor function associated with a type id.\n         * @return {object} The value.\n         */\n        reviver: function(key, value, getTypeId, getConstructor) {\n            var typeId = getTypeId(value);\n            if (typeId) {\n                var ctor = getConstructor(typeId);\n                if (ctor) {\n                    if (ctor.fromJSON) {\n                        return ctor.fromJSON(value);\n                    }\n\n                    return new ctor(value);\n                }\n            }\n\n            return value;\n        },\n        /**\n         * Deserialize the JSON.\n         * @method deserialize\n         * @param {string} text The JSON string.\n         * @param {object} [settings] Settings can specify a reviver, getTypeId function or getConstructor function.\n         * @return {object} The deserialized object.\n         */\n        deserialize: function(text, settings) {\n            var that = this;\n            settings = settings || {};\n\n            var getTypeId = settings.getTypeId || function(object) { return that.getTypeId(object); };\n            var getConstructor = settings.getConstructor || function(id) { return that.typeMap[id]; };\n            var reviver = settings.reviver || function(key, value) { return that.reviver(key, value, getTypeId, getConstructor); };\n\n            return JSON.parse(text, reviver);\n        }\n    };\n});\n\n","/**\n * Durandal 2.0.1 Copyright (c) 2012 Blue Spire Consulting, Inc. All Rights Reserved.\n * Available via the MIT license.\n * see: http://durandaljs.com or https://github.com/BlueSpire/Durandal for details.\n */\n/**\n * Layers the widget sugar on top of the composition system.\n * @module widget\n * @requires system\n * @requires composition\n * @requires jquery\n * @requires knockout\n */\ndefine('plugins/widget',['durandal/system', 'durandal/composition', 'jquery', 'knockout'], function(system, composition, $, ko) {\n    var kindModuleMaps = {},\n        kindViewMaps = {},\n        bindableSettings = ['model', 'view', 'kind'],\n        widgetDataKey = 'durandal-widget-data';\n\n    function extractParts(element, settings){\n        var data = ko.utils.domData.get(element, widgetDataKey);\n\n        if(!data){\n            data = {\n                parts:composition.cloneNodes(ko.virtualElements.childNodes(element))\n            };\n\n            ko.virtualElements.emptyNode(element);\n            ko.utils.domData.set(element, widgetDataKey, data);\n        }\n\n        settings.parts = data.parts;\n    }\n\n    /**\n     * @class WidgetModule\n     * @static\n     */\n    var widget = {\n        getSettings: function(valueAccessor) {\n            var settings = ko.utils.unwrapObservable(valueAccessor()) || {};\n\n            if (system.isString(settings)) {\n                return { kind: settings };\n            }\n\n            for (var attrName in settings) {\n                if (ko.utils.arrayIndexOf(bindableSettings, attrName) != -1) {\n                    settings[attrName] = ko.utils.unwrapObservable(settings[attrName]);\n                } else {\n                    settings[attrName] = settings[attrName];\n                }\n            }\n\n            return settings;\n        },\n        /**\n         * Creates a ko binding handler for the specified kind.\n         * @method registerKind\n         * @param {string} kind The kind to create a custom binding handler for.\n         */\n        registerKind: function(kind) {\n            ko.bindingHandlers[kind] = {\n                init: function() {\n                    return { controlsDescendantBindings: true };\n                },\n                update: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {\n                    var settings = widget.getSettings(valueAccessor);\n                    settings.kind = kind;\n                    extractParts(element, settings);\n                    widget.create(element, settings, bindingContext, true);\n                }\n            };\n\n            ko.virtualElements.allowedBindings[kind] = true;\n            composition.composeBindings.push(kind + ':');\n        },\n        /**\n         * Maps views and module to the kind identifier if a non-standard pattern is desired.\n         * @method mapKind\n         * @param {string} kind The kind name.\n         * @param {string} [viewId] The unconventional view id to map the kind to.\n         * @param {string} [moduleId] The unconventional module id to map the kind to.\n         */\n        mapKind: function(kind, viewId, moduleId) {\n            if (viewId) {\n                kindViewMaps[kind] = viewId;\n            }\n\n            if (moduleId) {\n                kindModuleMaps[kind] = moduleId;\n            }\n        },\n        /**\n         * Maps a kind name to it's module id. First it looks up a custom mapped kind, then falls back to `convertKindToModulePath`.\n         * @method mapKindToModuleId\n         * @param {string} kind The kind name.\n         * @return {string} The module id.\n         */\n        mapKindToModuleId: function(kind) {\n            return kindModuleMaps[kind] || widget.convertKindToModulePath(kind);\n        },\n        /**\n         * Converts a kind name to it's module path. Used to conventionally map kinds who aren't explicitly mapped through `mapKind`.\n         * @method convertKindToModulePath\n         * @param {string} kind The kind name.\n         * @return {string} The module path.\n         */\n        convertKindToModulePath: function(kind) {\n            return 'widgets/' + kind + '/viewmodel';\n        },\n        /**\n         * Maps a kind name to it's view id. First it looks up a custom mapped kind, then falls back to `convertKindToViewPath`.\n         * @method mapKindToViewId\n         * @param {string} kind The kind name.\n         * @return {string} The view id.\n         */\n        mapKindToViewId: function(kind) {\n            return kindViewMaps[kind] || widget.convertKindToViewPath(kind);\n        },\n        /**\n         * Converts a kind name to it's view id. Used to conventionally map kinds who aren't explicitly mapped through `mapKind`.\n         * @method convertKindToViewPath\n         * @param {string} kind The kind name.\n         * @return {string} The view id.\n         */\n        convertKindToViewPath: function(kind) {\n            return 'widgets/' + kind + '/view';\n        },\n        createCompositionSettings: function(element, settings) {\n            if (!settings.model) {\n                settings.model = this.mapKindToModuleId(settings.kind);\n            }\n\n            if (!settings.view) {\n                settings.view = this.mapKindToViewId(settings.kind);\n            }\n\n            settings.preserveContext = true;\n            settings.activate = true;\n            settings.activationData = settings;\n            settings.mode = 'templated';\n\n            return settings;\n        },\n        /**\n         * Creates a widget.\n         * @method create\n         * @param {DOMElement} element The DOMElement or knockout virtual element that serves as the target element for the widget.\n         * @param {object} settings The widget settings.\n         * @param {object} [bindingContext] The current binding context.\n         */\n        create: function(element, settings, bindingContext, fromBinding) {\n            if(!fromBinding){\n                settings = widget.getSettings(function() { return settings; }, element);\n            }\n\n            var compositionSettings = widget.createCompositionSettings(element, settings);\n\n            composition.compose(element, compositionSettings, bindingContext);\n        },\n        /**\n         * Installs the widget module by adding the widget binding handler and optionally registering kinds.\n         * @method install\n         * @param {object} config The module config. Add a `kinds` array with the names of widgets to automatically register. You can also specify a `bindingName` if you wish to use another name for the widget binding, such as \"control\" for example.\n         */\n        install:function(config){\n            config.bindingName = config.bindingName || 'widget';\n\n            if(config.kinds){\n                var toRegister = config.kinds;\n\n                for(var i = 0; i < toRegister.length; i++){\n                    widget.registerKind(toRegister[i]);\n                }\n            }\n\n            ko.bindingHandlers[config.bindingName] = {\n                init: function() {\n                    return { controlsDescendantBindings: true };\n                },\n                update: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {\n                    var settings = widget.getSettings(valueAccessor);\n                    extractParts(element, settings);\n                    widget.create(element, settings, bindingContext, true);\n                }\n            };\n\n            composition.composeBindings.push(config.bindingName + ':');\n            ko.virtualElements.allowedBindings[config.bindingName] = true;\n        }\n    };\n\n    return widget;\n});\n\n","/**\n * @license RequireJS text 2.0.12 Copyright (c) 2010-2014, The Dojo Foundation All Rights Reserved.\n * Available via the MIT or new BSD license.\n * see: http://github.com/requirejs/text for details\n */\n/*jslint regexp: true */\n/*global require, XMLHttpRequest, ActiveXObject,\n  define, window, process, Packages,\n  java, location, Components, FileUtils */\n\ndefine('text',['module'], function (module) {\n    'use strict';\n\n    var text, fs, Cc, Ci, xpcIsWindows,\n        progIds = ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.4.0'],\n        xmlRegExp = /^\\s*<\\?xml(\\s)+version=[\\'\\\"](\\d)*.(\\d)*[\\'\\\"](\\s)*\\?>/im,\n        bodyRegExp = /<body[^>]*>\\s*([\\s\\S]+)\\s*<\\/body>/im,\n        hasLocation = typeof location !== 'undefined' && location.href,\n        defaultProtocol = hasLocation && location.protocol && location.protocol.replace(/\\:/, ''),\n        defaultHostName = hasLocation && location.hostname,\n        defaultPort = hasLocation && (location.port || undefined),\n        buildMap = {},\n        masterConfig = (module.config && module.config()) || {};\n\n    text = {\n        version: '2.0.12',\n\n        strip: function (content) {\n            //Strips <?xml ...?> declarations so that external SVG and XML\n            //documents can be added to a document without worry. Also, if the string\n            //is an HTML document, only the part inside the body tag is returned.\n            if (content) {\n                content = content.replace(xmlRegExp, \"\");\n                var matches = content.match(bodyRegExp);\n                if (matches) {\n                    content = matches[1];\n                }\n            } else {\n                content = \"\";\n            }\n            return content;\n        },\n\n        jsEscape: function (content) {\n            return content.replace(/(['\\\\])/g, '\\\\$1')\n                .replace(/[\\f]/g, \"\\\\f\")\n                .replace(/[\\b]/g, \"\\\\b\")\n                .replace(/[\\n]/g, \"\\\\n\")\n                .replace(/[\\t]/g, \"\\\\t\")\n                .replace(/[\\r]/g, \"\\\\r\")\n                .replace(/[\\u2028]/g, \"\\\\u2028\")\n                .replace(/[\\u2029]/g, \"\\\\u2029\");\n        },\n\n        createXhr: masterConfig.createXhr || function () {\n            //Would love to dump the ActiveX crap in here. Need IE 6 to die first.\n            var xhr, i, progId;\n            if (typeof XMLHttpRequest !== \"undefined\") {\n                return new XMLHttpRequest();\n            } else if (typeof ActiveXObject !== \"undefined\") {\n                for (i = 0; i < 3; i += 1) {\n                    progId = progIds[i];\n                    try {\n                        xhr = new ActiveXObject(progId);\n                    } catch (e) {}\n\n                    if (xhr) {\n                        progIds = [progId];  // so faster next time\n                        break;\n                    }\n                }\n            }\n\n            return xhr;\n        },\n\n        /**\n         * Parses a resource name into its component parts. Resource names\n         * look like: module/name.ext!strip, where the !strip part is\n         * optional.\n         * @param {String} name the resource name\n         * @returns {Object} with properties \"moduleName\", \"ext\" and \"strip\"\n         * where strip is a boolean.\n         */\n        parseName: function (name) {\n            var modName, ext, temp,\n                strip = false,\n                index = name.indexOf(\".\"),\n                isRelative = name.indexOf('./') === 0 ||\n                             name.indexOf('../') === 0;\n\n            if (index !== -1 && (!isRelative || index > 1)) {\n                modName = name.substring(0, index);\n                ext = name.substring(index + 1, name.length);\n            } else {\n                modName = name;\n            }\n\n            temp = ext || modName;\n            index = temp.indexOf(\"!\");\n            if (index !== -1) {\n                //Pull off the strip arg.\n                strip = temp.substring(index + 1) === \"strip\";\n                temp = temp.substring(0, index);\n                if (ext) {\n                    ext = temp;\n                } else {\n                    modName = temp;\n                }\n            }\n\n            return {\n                moduleName: modName,\n                ext: ext,\n                strip: strip\n            };\n        },\n\n        xdRegExp: /^((\\w+)\\:)?\\/\\/([^\\/\\\\]+)/,\n\n        /**\n         * Is an URL on another domain. Only works for browser use, returns\n         * false in non-browser environments. Only used to know if an\n         * optimized .js?v=1552304184357 version of a text resource should be loaded\n         * instead.\n         * @param {String} url\n         * @returns Boolean\n         */\n        useXhr: function (url, protocol, hostname, port) {\n            var uProtocol, uHostName, uPort,\n                match = text.xdRegExp.exec(url);\n            if (!match) {\n                return true;\n            }\n            uProtocol = match[2];\n            uHostName = match[3];\n\n            uHostName = uHostName.split(':');\n            uPort = uHostName[1];\n            uHostName = uHostName[0];\n\n            return (!uProtocol || uProtocol === protocol) &&\n                   (!uHostName || uHostName.toLowerCase() === hostname.toLowerCase()) &&\n                   ((!uPort && !uHostName) || uPort === port);\n        },\n\n        finishLoad: function (name, strip, content, onLoad) {\n            content = strip ? text.strip(content) : content;\n            if (masterConfig.isBuild) {\n                buildMap[name] = content;\n            }\n            onLoad(content);\n        },\n\n        load: function (name, req, onLoad, config) {\n            //Name has format: some.module.filext!strip\n            //The strip part is optional.\n            //if strip is present, then that means only get the string contents\n            //inside a body tag in an HTML string. For XML/SVG content it means\n            //removing the <?xml ...?> declarations so the content can be inserted\n            //into the current doc without problems.\n\n            // Do not bother with the work if a build and text will\n            // not be inlined.\n            if (config && config.isBuild && !config.inlineText) {\n                onLoad();\n                return;\n            }\n\n            masterConfig.isBuild = config && config.isBuild;\n\n            var parsed = text.parseName(name),\n                nonStripName = parsed.moduleName +\n                    (parsed.ext ? '.' + parsed.ext : ''),\n                url = req.toUrl(nonStripName),\n                useXhr = (masterConfig.useXhr) ||\n                         text.useXhr;\n\n            // Do not load if it is an empty: url\n            if (url.indexOf('empty:') === 0) {\n                onLoad();\n                return;\n            }\n\n            //Load the text. Use XHR if possible and in a browser.\n            if (!hasLocation || useXhr(url, defaultProtocol, defaultHostName, defaultPort)) {\n                text.get(url, function (content) {\n                    text.finishLoad(name, parsed.strip, content, onLoad);\n                }, function (err) {\n                    if (onLoad.error) {\n                        onLoad.error(err);\n                    }\n                });\n            } else {\n                //Need to fetch the resource across domains. Assume\n                //the resource has been optimized into a JS module. Fetch\n                //by the module name + extension, but do not include the\n                //!strip part to avoid file system issues.\n                req([nonStripName], function (content) {\n                    text.finishLoad(parsed.moduleName + '.' + parsed.ext,\n                                    parsed.strip, content, onLoad);\n                });\n            }\n        },\n\n        write: function (pluginName, moduleName, write, config) {\n            if (buildMap.hasOwnProperty(moduleName)) {\n                var content = text.jsEscape(buildMap[moduleName]);\n                write.asModule(pluginName + \"!\" + moduleName,\n                               \"define(function () { return '\" +\n                                   content +\n                               \"';});\\n\");\n            }\n        },\n\n        writeFile: function (pluginName, moduleName, req, write, config) {\n            var parsed = text.parseName(moduleName),\n                extPart = parsed.ext ? '.' + parsed.ext : '',\n                nonStripName = parsed.moduleName + extPart,\n                //Use a '.js?v=1552304184357' file name so that it indicates it is a\n                //script that can be loaded across domains.\n                fileName = req.toUrl(parsed.moduleName + extPart) + '.js?v=1552304184357';\n\n            //Leverage own load() method to load plugin value, but only\n            //write out values that do not have the strip argument,\n            //to avoid any potential issues with ! in file names.\n            text.load(nonStripName, req, function (value) {\n                //Use own write() method to construct full module value.\n                //But need to create shell that translates writeFile's\n                //write() to the right interface.\n                var textWrite = function (contents) {\n                    return write(fileName, contents);\n                };\n                textWrite.asModule = function (moduleName, contents) {\n                    return write.asModule(moduleName, fileName, contents);\n                };\n\n                text.write(pluginName, nonStripName, textWrite, config);\n            }, config);\n        }\n    };\n\n    if (masterConfig.env === 'node' || (!masterConfig.env &&\n            typeof process !== \"undefined\" &&\n            process.versions &&\n            !!process.versions.node &&\n            !process.versions['node-webkit'])) {\n        //Using special require.nodeRequire, something added by r.js.\n        fs = require.nodeRequire('fs');\n\n        text.get = function (url, callback, errback) {\n            try {\n                var file = fs.readFileSync(url, 'utf8');\n                //Remove BOM (Byte Mark Order) from utf8 files if it is there.\n                if (file.indexOf('\\uFEFF') === 0) {\n                    file = file.substring(1);\n                }\n                callback(file);\n            } catch (e) {\n                if (errback) {\n                    errback(e);\n                }\n            }\n        };\n    } else if (masterConfig.env === 'xhr' || (!masterConfig.env &&\n            text.createXhr())) {\n        text.get = function (url, callback, errback, headers) {\n            var xhr = text.createXhr(), header;\n            xhr.open('GET', url, true);\n\n            //Allow plugins direct access to xhr headers\n            if (headers) {\n                for (header in headers) {\n                    if (headers.hasOwnProperty(header)) {\n                        xhr.setRequestHeader(header.toLowerCase(), headers[header]);\n                    }\n                }\n            }\n\n            //Allow overrides specified in config\n            if (masterConfig.onXhr) {\n                masterConfig.onXhr(xhr, url);\n            }\n\n            xhr.onreadystatechange = function (evt) {\n                var status, err;\n                //Do not explicitly handle errors, those should be\n                //visible via console output in the browser.\n                if (xhr.readyState === 4) {\n                    status = xhr.status || 0;\n                    if (status > 399 && status < 600) {\n                        //An http 4xx or 5xx error. Signal an error.\n                        err = new Error(url + ' HTTP status: ' + status);\n                        err.xhr = xhr;\n                        if (errback) {\n                            errback(err);\n                        }\n                    } else {\n                        callback(xhr.responseText);\n                    }\n\n                    if (masterConfig.onXhrComplete) {\n                        masterConfig.onXhrComplete(xhr, url);\n                    }\n                }\n            };\n            xhr.send(null);\n        };\n    } else if (masterConfig.env === 'rhino' || (!masterConfig.env &&\n            typeof Packages !== 'undefined' && typeof java !== 'undefined')) {\n        //Why Java, why is this so awkward?\n        text.get = function (url, callback) {\n            var stringBuffer, line,\n                encoding = \"utf-8\",\n                file = new java.io.File(url),\n                lineSeparator = java.lang.System.getProperty(\"line.separator\"),\n                input = new java.io.BufferedReader(new java.io.InputStreamReader(new java.io.FileInputStream(file), encoding)),\n                content = '';\n            try {\n                stringBuffer = new java.lang.StringBuffer();\n                line = input.readLine();\n\n                // Byte Order Mark (BOM) - The Unicode Standard, version 3.0, page 324\n                // http://www.unicode.org/faq/utf_bom.html\n\n                // Note that when we use utf-8, the BOM should appear as \"EF BB BF\", but it doesn't due to this bug in the JDK:\n                // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4508058\n                if (line && line.length() && line.charAt(0) === 0xfeff) {\n                    // Eat the BOM, since we've already found the encoding on this file,\n                    // and we plan to concatenating this buffer with others; the BOM should\n                    // only appear at the top of a file.\n                    line = line.substring(1);\n                }\n\n                if (line !== null) {\n                    stringBuffer.append(line);\n                }\n\n                while ((line = input.readLine()) !== null) {\n                    stringBuffer.append(lineSeparator);\n                    stringBuffer.append(line);\n                }\n                //Make sure we return a JavaScript string and not a Java string.\n                content = String(stringBuffer.toString()); //String\n            } finally {\n                input.close();\n            }\n            callback(content);\n        };\n    } else if (masterConfig.env === 'xpconnect' || (!masterConfig.env &&\n            typeof Components !== 'undefined' && Components.classes &&\n            Components.interfaces)) {\n        //Avert your gaze!\n        Cc = Components.classes;\n        Ci = Components.interfaces;\n        Components.utils['import']('resource://gre/modules/FileUtils.jsm');\n        xpcIsWindows = ('@mozilla.org/windows-registry-key;1' in Cc);\n\n        text.get = function (url, callback) {\n            var inStream, convertStream, fileObj,\n                readData = {};\n\n            if (xpcIsWindows) {\n                url = url.replace(/\\//g, '\\\\');\n            }\n\n            fileObj = new FileUtils.File(url);\n\n            //XPCOM, you so crazy\n            try {\n                inStream = Cc['@mozilla.org/network/file-input-stream;1']\n                           .createInstance(Ci.nsIFileInputStream);\n                inStream.init(fileObj, 1, 0, false);\n\n                convertStream = Cc['@mozilla.org/intl/converter-input-stream;1']\n                                .createInstance(Ci.nsIConverterInputStream);\n                convertStream.init(inStream, \"utf-8\", inStream.available(),\n                Ci.nsIConverterInputStream.DEFAULT_REPLACEMENT_CHARACTER);\n\n                convertStream.readString(inStream.available(), readData);\n                convertStream.close();\n                inStream.close();\n                callback(readData.value);\n            } catch (e) {\n                throw new Error((fileObj && fileObj.path || '') + ': ' + e);\n            }\n        };\n    }\n    return text;\n});\n\n","\ndefine('text!account/account.html?v=1552304184357',[],function () { return '<section id=\"account\" class=\"account unselectable\" data-bind=\"autofocus\">\\n    <!-- ko compose: header --><!-- /ko -->\\n    <article class=\"content\">\\n        <h2 data-translate-text=\"[login header]\"></h2>\\n        <!-- ko if: socialNetworks -->\\n        <!-- ko compose: socialNetworks --><!-- /ko -->\\n        <div class=\"or-separator\">\\n            <span class=\"or-separator-text\" data-translate-text=\"[or]\"></span>\\n        </div>\\n        <!-- /ko -->\\n        <div class=\"input-container\" data-bind=\"css: { error: !email.isValid() && email.isModified() }\">\\n            <input class=\"input-field autofocus\" type=\"email\" ondrop=\"return false;\"\\n                data-bind=\"value: email, valueUpdate: \\'input\\',  css: { empty: !email().length }, event: { blur: email.trim }, hasFocus: email.hasFocus, submitOnEnter: submit\" />\\n            <label class=\"input-label\" data-translate-text=\"[login email field]\"></label>\\n            <span class=\"input-icon icon-mail\"></span>\\n            <p class=\"error-message\" data-translate-text=\"[tracking and tracing email is not valid]\"></p>\\n        </div>\\n        <button class=\"button primary small autofocus\" data-bind=\"click: submit, css: { important: !requestProcessing() }\">\\n            <!-- ko ifnot: requestProcessing -->\\n            <span data-translate-text=\"[OK, email are correct]\"></span>\\n            <!-- /ko -->\\n            <!-- ko if: requestProcessing -->\\n            <div class=\"pulsar-loader align-center\">\\n                <div class=\"pulsar-loader-item\"></div>\\n                <div class=\"pulsar-loader-item\"></div>\\n                <div class=\"pulsar-loader-item\"></div>\\n            </div>\\n            <!-- /ko -->\\n        </button>\\n        <!-- ko if: skipAllowed -->\\n        <button class=\"button link\" data-bind=\"click: skip\" data-translate-text=\"[login skip]\"></button>\\n        <!-- /ko -->\\n        <hr />\\n        <p class=\"account-hint\" data-translate-text=\"[login explanation]\"></p>\\n    </article>\\n</section>\\n';});\n\n","\ndefine('text!account/header/index.html?v=1552304184357',[],function () { return '<header data-bind=\"focusHandler: {}\">\\n    <div class=\"page-header\">\\n        <h1 class=\"course-title\" data-bind=\"css: { small: isCourseTitleTooLong }\">\\n            <span class=\"course-caption\" data-bind=\"text: courseTitle, reviewable: { type: \\'course\\', property: \\'title\\' }\"></span>\\n        </h1>\\n    </div>\\n</header>\\n';});\n\n","\ndefine('text!account/limitAccess/index.html?v=1552304184357',[],function () { return '<section id=\"noaccess\" class=\"unselectable\">\\n    <header class=\"page-header\">\\n        <h1 class=\"course-title\" data-bind=\"css: {small: courseTitle.length>100}\">\\n            <span class=\"course-caption\" data-bind=\"text: courseTitle, reviewable: {type: \\'course\\', property: \\'title\\'}\">\"course_name\"</span>\\n        </h1>\\n    </header>\\n    <section class=\"content noaccess\">\\n        <div class=\"noaccess-icon\">\\n            <span class=\"icon-attention\"></span>\\n        </div>\\n        <div class=\"noaccess-notification\" data-translate-text=\"[the owner of the course has limited the access]\"></div>\\n        <button class=\"button primary small autofocus back-to-signin\" data-bind=\"click: backToSignin\">\\n            <span class=\"icon-home\"></span>\\n            <span data-translate-text=\"[back to sign in]\" data-translate-title=\"[back to sign in]\"></span>\\n        </button>\\n    </section>\\n</section>\\n';});\n\n","\ndefine('text!account/register/index.html?v=1552304184357',[],function () { return '<section id=\"register\" class=\"account unselectable\" data-bind=\"autofocus\">\\n    <!-- ko compose: header --><!-- /ko -->\\n    <article class=\"content second-step\">\\n        <div class=\"back-button-container\" data-bind=\"click: back\">\\n            <span class=\"back-button-arrow icon-left_arrow\"></span><span class=\"back-button-text\" data-translate-text=\"[back]\"></span>\\n        </div>\\n        <!-- ko if: crossDeviceEnabled -->\\n        <h2 data-translate-text=\"[set your name and password]\"></h2>\\n        <!-- /ko -->\\n        <!-- ko ifnot: crossDeviceEnabled -->\\n        <h2 data-translate-text=\"[set your name]\"></h2>\\n        <!-- /ko -->\\n        <div class=\"input-container\" data-bind=\"css: { error: !name.isValid() && name.isModified() }\">\\n            <input class=\"input-field\" type=\"text\" ondrop=\"return false;\"\\n                data-bind=\"value: name, valueUpdate: \\'afterkeydown\\',  css: { empty: !name().length, autofocus: !name().length }, event: { blur: name.trim }, hasFocus: name.hasFocus, submitOnEnter: submit\" />\\n            <label class=\"input-label\" data-translate-text=\"[login name field]\"></label>\\n            <span class=\"input-icon icon-name\"></span>\\n            <p class=\"error-message\" data-translate-text=\"[tracking and tracing name is not valid]\"></p>\\n        </div>\\n        <!-- ko if: crossDeviceEnabled -->\\n        <div class=\"input-container\" data-bind=\"css: { error: !password.isValid() && password.isModified() }\">\\n            <input class=\"input-field\" type=\"password\" ondrop=\"return false;\"\\n                data-bind=\"value: password, valueUpdate: \\'afterkeydown\\',  css: { empty: !password().length, autofocus: name().length }, event: { keyup: password.onKeyUp, blur: password.trim }, hasFocus: password.hasFocus, attr: { type: isPasswordVisible() ? \\'text\\' : \\'password\\'}, submitOnEnter: submit\" />\\n            <label class=\"input-label\" data-translate-text=\"[password]\"></label>\\n            <span class=\"input-icon icon-password2\"></span>\\n            <span class=\"input-icon align-right pointer password\" data-bind=\"click: togglePasswordVisibility, css: { \\'icon-eye_lock\\': isPasswordVisible(), \\'icon-eye\\': !isPasswordVisible() }\"></span>\\n            <div class=\"validation-container\">\\n                <span class=\"validator\" data-bind=\"css: { correct: password.moreThanSevenSymbols }\">\\n                    <span class=\"validator-icon\">\\n                        <span class=\"icon-check_mark\"></span>\\n                    </span>\\n                    <span class=\"validator-text\" data-translate-text=\"[at least 7 characters]\"></span>\\n                </span>\\n                <span class=\"validator\" data-bind=\"css: { correct: password.noSpaces }\">\\n                    <span class=\"validator-icon\">\\n                        <span class=\"icon-check_mark\"></span>\\n                    </span>\\n                    <span class=\"validator-text\" data-translate-text=\"[no spaces]\"></span>\\n                </span>\\n            </div>\\n        </div>\\n        <button class=\"button check small\" data-bind=\"click: toggleRememberMe, css: { active: rememberMe }\">\\n            <span data-translate-text=\"[remember me on this device]\"></span>\\n        </button>\\n        <!-- /ko -->\\n        <button class=\"button primary small\" data-bind=\"click: submit\">\\n            <!-- ko ifnot: requestProcessing -->\\n            <span data-translate-text=\"[OK, go to the course]\"></span>\\n            <!-- /ko -->\\n            <!-- ko if: requestProcessing -->\\n            <div class=\"pulsar-loader align-center\">\\n                <div class=\"pulsar-loader-item\"></div>\\n                <div class=\"pulsar-loader-item\"></div>\\n                <div class=\"pulsar-loader-item\"></div>\\n            </div>\\n            <!-- /ko -->\\n        </button>\\n    </article>\\n</section>';});\n\n","\ndefine('text!account/signin/index.html?v=1552304184357',[],function () { return '<section id=\"signin\" class=\"account unselectable\" data-bind=\"autofocus\">\\n    <!-- ko compose: header --><!-- /ko -->\\n    <article class=\"content second-step\">\\n        <div class=\"back-button-container\" data-bind=\"click: back\">\\n            <span class=\"back-button-arrow icon-left_arrow\"></span><span class=\"back-button-text\" data-translate-text=\"[back]\"></span>\\n        </div>\\n        <h2 data-translate-text=\"[type your password]\"></h2>\\n        <h3>(<span data-bind=\"text: email\"></span>)</h3>\\n        <div class=\"input-container\" data-bind=\"css: { error: !password.isValid() && password.isModified() || emailPasswordCombination() }\">\\n            <input class=\"input-field autofocus\" type=\"password\" ondrop=\"return false;\"\\n                data-bind=\"value: password, valueUpdate: \\'input\\',  css: { empty: !password().length }, event: { blur: password.trim }, hasFocus: password.hasFocus, attr: { type: isPasswordVisible() ? \\'text\\' : \\'password\\'}, submitOnEnter: submit\" />\\n            <label class=\"input-label\" data-translate-text=\"[password]\"></label>\\n            <span class=\"input-icon icon-password2\"></span>\\n            <span class=\"input-icon align-right pointer password\" data-bind=\"click: togglePasswordVisibility, css: { \\'icon-eye_lock\\': isPasswordVisible(), \\'icon-eye\\': !isPasswordVisible() }\"></span>\\n            <p class=\"error-message\" data-bind=\"visible: !emailPasswordCombination()\" data-translate-text=\"[login email / password combination is not valid]\" data-translate-title=\"[login email / password combination is not valid]\"></p>\\n            <p class=\"error-message\" data-bind=\"visible: emailPasswordCombination()\" data-translate-text=\"[login email / password combination is not valid]\" data-translate-title=\"[login email / password combination is not valid]\"></p>\\n            <p class=\"forgot-password\" data-bind=\"click: forgotPassword\" data-translate-text=\"[forgot password]\"></p>\\n        </div>\\n        <button class=\"button check small\" data-bind=\"click: toggleRememberMe, css: { active: rememberMe }\">\\n            <span data-translate-text=\"[remember me on this device]\"></span>\\n        </button>\\n        <button class=\"button primary small autofocus\" data-bind=\"click: submit\">\\n            <!-- ko ifnot: requestProcessing -->\\n            <span data-translate-text=\"[OK, go to the course]\"></span>\\n            <!-- /ko -->\\n            <!-- ko if: requestProcessing -->\\n            <div class=\"pulsar-loader align-center\">\\n                <div class=\"pulsar-loader-item\"></div>\\n                <div class=\"pulsar-loader-item\"></div>\\n                <div class=\"pulsar-loader-item\"></div>\\n            </div>\\n            <!-- /ko -->\\n        </button>\\n        <div class=\"account-hint\">\\n            <span data-translate-text=\"[or]\"></span>&nbsp;\\n            <a tabindex=\"0\"  data-bind=\"click: sendSecretLink, submitOnEnter\" data-translate-text=\"[request a secret link]\"></a>&nbsp;\\n            <span data-translate-text=\"[to your progress via email]\"></span>\\n        </div>\\n        <!-- ko if: isSecretLinkSent() || isRestorePasswordEmailSent() -->\\n        <div class=\"secret-link-confirm-container show\">\\n            <span class=\"secret-link-confirm-wrapper\">\\n                <span class=\"icon-envelope\"></span>\\n                <!-- ko if: isRestorePasswordEmailSent -->\\n                <span class=\"secret-link-confirm-text\" data-translate-text=\"[forgot password email sent]\" data-translate-title=\"[forgot password email sent]\"></span>\\n                <!-- /ko -->\\n                <!-- ko if: isSecretLinkSent -->\\n                <span class=\"secret-link-confirm-text\" data-translate-text=\"[the letter has been successfully sent]\" data-translate-title=\"[the letter has been successfully sent]\"></span>\\n                <!-- /ko -->\\n            </span>\\n        </div>\\n        <!-- /ko -->\\n    </article>\\n</section>';});\n\n","\ndefine('text!account/socialNetworks/index.html?v=1552304184357',[],function () { return '<div class=\"social-container\">\\n    <h4 data-translate-text=\"[authorize with]\"></h4>\\n    <div class=\"link-wrapper\">\\n        <a href=\"#\" data-bind=\"attr: { href: facebookAuthLink }\" class=\"social-button facebook\"><span class=\"icon-facebook\"></span></a>\\n        <a href=\"#\" data-bind=\"attr: { href: linkedinAuthLink }\" class=\"social-button linkedin\"><span class=\"icon-linkedin\"></span></a>\\n        <a href=\"#\" data-bind=\"attr: { href: googleAuthLink }\" class=\"social-button google\"><span class=\"icon-google\"></span></a>\\n    </div>\\n</div>';});\n\n","\ndefine('text!dialogs/continueLater.html?v=1552304184357',[],function () { return '<section class=\"popup-layout\" data-bind=\"scrollbar: { checkDOMChanges: true }, keyDown: { 27: { handler: close } }\">\\n    <div class=\"popup\">\\n        <span class=\"close-btn material-icons\" data-bind=\"click: close\">clear</span>\\n        <!-- ko ifnot: progressStorageActivated -->\\n        <div class=\"popup-wrapper\">\\n            <article>\\n                <header>\\n                    <h2>\\n                        <span data-translate-text=\"[note that]\"></span>\\n                    </h2>\\n                </header>\\n                <section>\\n                    <ul>\\n                        <!-- ko if: exit -->\\n                        <li data-translate-text=\"[finish course take brake first remark]\"></li>\\n                        <!-- ko if: isSecondRemarkShouldBeShown -->\\n                        <li data-translate-text=\"[finish course take brake second remark]\"></li>\\n                        <!-- /ko -->\\n                        <!-- /ko -->\\n                    </ul>\\n                </section>\\n                <footer data-bind=\"autofocus\">\\n                    <span class=\"button-wrapper\">\\n                        <button class=\"button block default\" data-bind=\"click: close\" data-translate-text=\"[cancel, continue course]\" data-translate-title=\"[cancel, continue course]\"></button>\\n                    </span>\\n                    <!-- ko if: exit -->\\n                    <span class=\"button-wrapper\">\\n                        <button class=\"button block primary autofocus\" data-bind=\"click: exit\" data-translate-text=\"[OK, close course]\" data-translate-title=\"[OK, close course]\"></button>\\n                    </span>\\n                    <!-- /ko -->\\n                </footer>\\n            </article>\\n        </div>\\n        <!-- /ko -->\\n        <!-- ko if: progressStorageActivated -->\\n        <div class=\"popup-wrapper\">\\n            <article class=\"without-note\">\\n                <div class=\"icon-container pt70\">\\n                    <span class=\"icon-wrapper\">\\n                        <span class=\"icon-all_devices\"></span>\\n                    </span>\\n                </div>\\n                <header>\\n                    <h3>\\n                        <span data-translate-text=\"[continue anytime]\"></span>\\n                    </h3>\\n                    <p>\\n                        <span>\\n                            <span data-translate-text=\"[get secret link to]\"></span>&nbsp;<span class=\"bold\" data-bind=\"text: email\"></span><span data-translate-text=\"[you can sign in to the course]\"></span>\\n                        </span>\\n                    </p>\\n                </header>\\n                <section>\\n                    <div class=\"popup-button-wrapper\">\\n                        <button class=\"button primary small autofocus\" data-bind=\"click: sendSecretLink, css: { hide: isSecretLinkSent }\">\\n                            <span data-translate-text=\"[send me the link]\"></span>\\n                        </button>\\n                        <div class=\"secret-link-confirm-container\" data-bind=\"css: { show: isSecretLinkSent }\">\\n                            <span class=\"secret-link-confirm-wrapper\">\\n                                <span class=\"icon-envelope\"></span>\\n                                <span class=\"secret-link-confirm-text\" data-translate-text=\"[the letter has been successfully sent]\" data-translate-title=\"[the letter has been successfully sent]\"></span>\\n                            </span>\\n                        </div>\\n                    </div>\\n                    <div class=\"popup-button-wrapper\">\\n                        <button class=\"button small default\" data-bind=\"click: exit, changeClass: { delay: 500, fromClass: \\'default\\', toClass: \\'primary\\', value: isSecretLinkSent }\">\\n                            <!-- ko if: keepMeLoggedIn -->\\n                            <span data-translate-text=\"[close course]\"></span>\\n                            <!-- /ko -->\\n                            <!-- ko ifnot: keepMeLoggedIn -->\\n                            <span data-translate-text=\"[close course and logout]\"></span>\\n                            <!-- /ko -->\\n                        </button>\\n                    </div>\\n                    <div class=\"popup-button-wrapper\">\\n                        <button class=\"button check small\" data-bind=\"click: toggleKeepMeLoggedIn, css: { active: keepMeLoggedIn }\">\\n                            <span data-translate-text=\"[remember me on this device]\"></span>\\n                        </button>\\n                    </div>\\n                </section>\\n            </article>\\n        </div>\\n        <!-- ko ifnot: progressStorageActivated -->\\n        <div class=\"popup-wrapper\">\\n            <article class=\"without-note\">\\n                <header>\\n                    <div class=\"icon-container\">\\n                        <span class=\"icon-no_connection\"></span>\\n                    </div>\\n                    <h3>\\n                        <span data-translate-text=\"[continue anytime in browser]\"></span>\\n                    </h3>\\n                    <p>\\n                        <span data-translate-text=\"[note about continue course]\"></span>\\n                    </p>\\n                </header>\\n                <footer class=\"background-transparent\">\\n                    <span class=\"button-wrapper\">\\n                        <button class=\"button block primary small\" data-bind=\"click: exit\" data-translate-text=\"[OK, close course]\" data-translate-title=\"[OK, close course]\"></button>\\n                    </span>\\n                </footer>\\n            </article>\\n        </div>\\n        <!-- /ko -->\\n        <!-- /ko -->\\n    </div>\\n</section>';});\n\n","\ndefine('text!dialogs/nps/figures/evaluation.html?v=1552304184357',[],function () { return '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<svg width=\"300px\" height=\"120px\" viewBox=\"0 0 300 120\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\\n    <!-- Generator: Sketch 44.1 (41455) - http://www.bohemiancoding.com/sketch -->\\n    <title>Group</title>\\n    <desc>Created with Sketch.</desc>\\n    <defs>\\n        <filter x=\"0.0%\" y=\"0.0%\" width=\"100.0%\" height=\"100.0%\" filterUnits=\"objectBoundingBox\" id=\"filter-1\">\\n            <feGaussianBlur stdDeviation=\"0\" in=\"SourceGraphic\"></feGaussianBlur>\\n        </filter>\\n        <filter x=\"0.0%\" y=\"0.0%\" width=\"100.0%\" height=\"100.0%\" filterUnits=\"objectBoundingBox\" id=\"filter-2\">\\n            <feGaussianBlur stdDeviation=\"0\" in=\"SourceGraphic\"></feGaussianBlur>\\n        </filter>\\n        <circle id=\"path-3\" cx=\"151\" cy=\"50\" r=\"32\"></circle>\\n        <filter x=\"-13.3%\" y=\"-10.2%\" width=\"126.6%\" height=\"126.6%\" filterUnits=\"objectBoundingBox\" id=\"filter-4\">\\n            <feOffset dx=\"0\" dy=\"2\" in=\"SourceAlpha\" result=\"shadowOffsetOuter1\"></feOffset>\\n            <feGaussianBlur stdDeviation=\"2.5\" in=\"shadowOffsetOuter1\" result=\"shadowBlurOuter1\"></feGaussianBlur>\\n            <feColorMatrix values=\"0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.1 0\" type=\"matrix\" in=\"shadowBlurOuter1\"></feColorMatrix>\\n        </filter>\\n    </defs>\\n    <g id=\"Page-1\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\\n        <g id=\"nps-xapi-enabled\" transform=\"translate(-577.000000, -236.000000)\">\\n            <g id=\"Group\" transform=\"translate(577.000000, 236.000000)\">\\n                <path data-bind=\"lessColor: [{ color: textColor, attr: \\'fill\\' }]\" d=\"M85.9375,24.4478528 L24.2138056,24.4478528 C24.2138056,24.4478528 13.3928571,25.5180635 13.3928571,33.404908 C13.3928571,41.2917525 24.2138056,42.3619632 24.2138056,42.3619632 L60.9375,42.4259422 C60.9375,42.4259422 69.53125,43.9614373 69.53125,50.8711656 C69.53125,57.780894 60.9375,59.8282209 60.9375,59.8282209 L41.9642857,59.8282209 C41.9642857,59.8282209 26.5625,60.6902176 26.5625,69.2331288 C26.5625,77.77604 41.9642857,79.0858896 41.9642857,79.0858896 L10.9375,79.0858896 C10.9375,79.0858896 5.84683802e-16,80.8133216 0,87.9789658 C0,95.14461 10.9375,97 10.9375,97 L250.782522,97 C250.782522,97 264.285714,95.5924628 264.285714,87.9789658 C264.285714,80.3654689 250.782522,79.0858896 250.782522,79.0858896 L227.331152,79.0858896 C227.331152,79.0858896 213.637423,78.3376034 213.392857,70.5766871 C213.148291,62.8157708 227.331152,61.363716 227.331152,61.363716 L254.545455,60.5 C254.545455,60.5 268.75,62.4194542 268.75,51.6389132 C268.75,40.8583723 255.681818,42.3619632 255.681818,42.3619632 L288.28125,42.4259422 C288.28125,42.4259422 300,41.7802657 300,33.404908 C300,25.0295503 288.28125,24 288.28125,24 L85.9375,24.4478528 Z\" id=\"Path-8\" opacity=\"0.05\" filter=\"url(#filter-1)\"></path>\\n                <path data-bind=\"lessColor: [{ color: textColor, attr: \\'fill\\' }]\" d=\"M216.405846,39.484982 C216.088518,39.8101473 215.943659,40.2786626 216.018645,40.7379796 L216.37108,42.8989795 L214.525398,41.8786865 C214.329411,41.7702184 214.11411,41.7162233 213.898923,41.7162233 C213.683735,41.7162233 213.468548,41.7704573 213.272447,41.8786865 L211.426766,42.8989795 L211.7792,40.7379796 C211.854187,40.2787821 211.709327,39.8102668 211.391999,39.484982 L209.898979,37.9547217 L211.962462,37.6393519 C212.400904,37.5724553 212.780038,37.282769 212.976139,36.8650235 L213.899036,34.8989795 L214.82182,36.8650235 C215.018034,37.282769 215.396942,37.5723358 215.835497,37.6393519 L217.898979,37.9547217 L216.405846,39.484982 Z\" id=\"Shape-Copy-5\" fill-rule=\"nonzero\" opacity=\"0.300000012\" transform=\"translate(213.898979, 38.898979) scale(-1, 1) rotate(-15.000000) translate(-213.898979, -38.898979) \"></path>\\n                <ellipse data-bind=\"lessColor: [{ color: textColor, attr: \\'fill\\' }]\" id=\"Oval-6\" opacity=\"0.100000001\" filter=\"url(#filter-2)\" cx=\"151\" cy=\"117\" rx=\"30\" ry=\"3\"></ellipse>\\n                <path data-bind=\"lessColor: [{ color: textColor, attr: \\'fill\\' }]\" d=\"M252,68 L252,65.9970301 C252,65.4530363 251.552285,65 251,65 C250.443865,65 250,65.4463856 250,65.9970301 L250,68 L247.99703,68 C247.453036,68 247,68.4477153 247,69 C247,69.5561352 247.446386,70 247.99703,70 L250,70 L250,72.0029699 C250,72.5469637 250.447715,73 251,73 C251.556135,73 252,72.5536144 252,72.0029699 L252,70 L254.00297,70 C254.546964,70 255,69.5522847 255,69 C255,68.4438648 254.553614,68 254.00297,68 L252,68 Z\" id=\"Combined-Shape\" opacity=\"0.300000012\"></path>\\n                <path data-bind=\"lessColor: [{ color: textColor, attr: \\'fill\\' }]\" d=\"M93,107 L93,104.99703 C93,104.453036 92.5522847,104 92,104 C91.4438648,104 91,104.446386 91,104.99703 L91,107 L88.9970301,107 C88.4530363,107 88,107.447715 88,108 C88,108.556135 88.4463856,109 88.9970301,109 L91,109 L91,111.00297 C91,111.546964 91.4477153,112 92,112 C92.5561352,112 93,111.553614 93,111.00297 L93,109 L95.0029699,109 C95.5469637,109 96,108.552285 96,108 C96,107.443865 95.5536144,107 95.0029699,107 L93,107 Z\" id=\"Combined-Shape-Copy-3\" opacity=\"0.300000012\"></path>\\n                <path data-bind=\"lessColor: [{ color: textColor, attr: \\'fill\\' }]\" d=\"M61,6 L61,3.99703014 C61,3.45303631 60.5522847,3 60,3 C59.4438648,3 59,3.4463856 59,3.99703014 L59,6 L56.9970301,6 C56.4530363,6 56,6.44771525 56,7 C56,7.55613518 56.4463856,8 56.9970301,8 L59,8 L59,10.0029699 C59,10.5469637 59.4477153,11 60,11 C60.5561352,11 61,10.5536144 61,10.0029699 L61,8 L63.0029699,8 C63.5469637,8 64,7.55228475 64,7 C64,6.44386482 63.5536144,6 63.0029699,6 L61,6 Z\" id=\"Combined-Shape-Copy\" opacity=\"0.300000012\"></path>\\n                <circle data-bind=\"lessColor: [{ color: textColor, attr: \\'stroke\\' }]\" id=\"Oval-7\" stroke-width=\"2\" opacity=\"0.300000012\" cx=\"31\" cy=\"47\" r=\"3\"></circle>\\n                <circle data-bind=\"lessColor: [{ color: textColor, attr: \\'stroke\\' }]\" id=\"Oval-7-Copy\" stroke-width=\"2\" opacity=\"0.300000012\" cx=\"234\" cy=\"4\" r=\"3\"></circle>\\n                <circle data-bind=\"lessColor: [{ color: textColor, attr: \\'stroke\\' }]\" id=\"Oval-7-Copy-2\" stroke-width=\"2\" opacity=\"0.300000012\" cx=\"199\" cy=\"107\" r=\"3\"></circle>\\n                <circle data-bind=\"lessColor: [{ color: textColor, attr: \\'stroke\\' }]\" id=\"Oval-7-Copy-3\" stroke-width=\"2\" opacity=\"0.300000012\" cx=\"78\" cy=\"73\" r=\"3\"></circle>\\n                <circle data-bind=\"lessColor: [{ color: correctColor, attr: \\'fill\\' }]\" id=\"Oval-Copy-2\" cx=\"125\" cy=\"28\" r=\"12\"></circle>\\n                <circle data-bind=\"lessColor: [{ color: correctColor, attr: \\'fill\\' }]\" id=\"Oval-Copy-3\" cx=\"174\" cy=\"73\" r=\"12\"></circle>\\n                <g id=\"Oval-Copy\">\\n                    <use fill=\"black\" fill-opacity=\"1\" filter=\"url(#filter-4)\" xlink:href=\"#path-3\"></use>\\n                    <use data-bind=\"lessColor: [{ color: correctColor, attr: \\'fill\\' }]\" fill-rule=\"evenodd\" xlink:href=\"#path-3\"></use>\\n                </g>\\n                <polyline data-bind=\"lessColor: [{ color: buttonTextColor, attr: \\'stroke\\' }]\" id=\"Path-2-Copy\" stroke-width=\"2\" points=\"140 51.8381204 147.706943 59 163 43\"></polyline>\\n            </g>\\n        </g>\\n    </g>\\n</svg>';});\n\n","\ndefine('text!dialogs/nps/figures/feedback.html?v=1552304184357',[],function () { return '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<svg width=\"300px\" height=\"112px\" viewBox=\"0 0 300 112\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\\n    <!-- Generator: Sketch 44.1 (41455) - http://www.bohemiancoding.com/sketch -->\\n    <title>Group</title>\\n    <desc>Created with Sketch.</desc>\\n    <defs>\\n        <filter x=\"0.0%\" y=\"0.0%\" width=\"100.0%\" height=\"100.0%\" filterUnits=\"objectBoundingBox\" id=\"filter-1\">\\n            <feGaussianBlur stdDeviation=\"0\" in=\"SourceGraphic\"></feGaussianBlur>\\n        </filter>\\n        <filter x=\"0.0%\" y=\"0.0%\" width=\"100.0%\" height=\"100.0%\" filterUnits=\"objectBoundingBox\" id=\"filter-2\">\\n            <feGaussianBlur stdDeviation=\"0\" in=\"SourceGraphic\"></feGaussianBlur>\\n        </filter>\\n    </defs>\\n    <g id=\"Page-1\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\\n        <g id=\"8-10-rate-feedback\" transform=\"translate(-570.000000, -275.000000)\">\\n            <g id=\"Group\" transform=\"translate(570.000000, 275.000000)\">\\n                <path data-bind=\"lessColor: [{ color: feedbackColor, attr: \\'fill\\', func: \\'fadein\\', dimension: \\'10%\\' }]\" d=\"M85.9375,24.4478528 L24.2138056,24.4478528 C24.2138056,24.4478528 13.3928571,25.5180635 13.3928571,33.404908 C13.3928571,41.2917525 24.2138056,42.3619632 24.2138056,42.3619632 L60.9375,42.4259422 C60.9375,42.4259422 69.53125,43.9614373 69.53125,50.8711656 C69.53125,57.780894 60.9375,59.8282209 60.9375,59.8282209 L41.9642857,59.8282209 C41.9642857,59.8282209 26.5625,60.6902176 26.5625,69.2331288 C26.5625,77.77604 41.9642857,79.0858896 41.9642857,79.0858896 L10.9375,79.0858896 C10.9375,79.0858896 5.84683802e-16,80.8133216 0,87.9789658 C0,95.14461 10.9375,97 10.9375,97 L250.782522,97 C250.782522,97 264.285714,95.5924628 264.285714,87.9789658 C264.285714,80.3654689 250.782522,79.0858896 250.782522,79.0858896 L227.331152,79.0858896 C227.331152,79.0858896 213.637423,78.3376034 213.392857,70.5766871 C213.148291,62.8157708 227.331152,61.363716 227.331152,61.363716 L254.545455,60.5 C254.545455,60.5 268.75,62.4194542 268.75,51.6389132 C268.75,40.8583723 255.681818,42.3619632 255.681818,42.3619632 L288.28125,42.4259422 C288.28125,42.4259422 300,41.7802657 300,33.404908 C300,25.0295503 288.28125,24 288.28125,24 L85.9375,24.4478528 Z\" id=\"Path-8\" opacity=\"0.1\" filter=\"url(#filter-1)\"></path>\\n                <path data-bind=\"lessColor: [{ color: feedbackColor, attr: \\'fill\\', func: \\'fadein\\', dimension: \\'10%\\' }]\" d=\"M216.405846,39.484982 C216.088518,39.8101473 215.943659,40.2786626 216.018645,40.7379796 L216.37108,42.8989795 L214.525398,41.8786865 C214.329411,41.7702184 214.11411,41.7162233 213.898923,41.7162233 C213.683735,41.7162233 213.468548,41.7704573 213.272447,41.8786865 L211.426766,42.8989795 L211.7792,40.7379796 C211.854187,40.2787821 211.709327,39.8102668 211.391999,39.484982 L209.898979,37.9547217 L211.962462,37.6393519 C212.400904,37.5724553 212.780038,37.282769 212.976139,36.8650235 L213.899036,34.8989795 L214.82182,36.8650235 C215.018034,37.282769 215.396942,37.5723358 215.835497,37.6393519 L217.898979,37.9547217 L216.405846,39.484982 Z\" id=\"Shape-Copy-5\" fill-rule=\"nonzero\" opacity=\"0.300000012\" transform=\"translate(213.898979, 38.898979) scale(-1, 1) rotate(-15.000000) translate(-213.898979, -38.898979) \"></path>\\n                <ellipse data-bind=\"lessColor: [{ color: textColor, attr: \\'fill\\' }]\" id=\"Oval-6\" opacity=\"0.1\" filter=\"url(#filter-2)\" cx=\"150\" cy=\"105\" rx=\"30\" ry=\"4\"></ellipse>\\n                <path data-bind=\"lessColor: [{ color: feedbackColor, attr: \\'fill\\', func: \\'fadein\\', dimension: \\'10%\\' }]\" d=\"M252,68 L252,65.9970301 C252,65.4530363 251.552285,65 251,65 C250.443865,65 250,65.4463856 250,65.9970301 L250,68 L247.99703,68 C247.453036,68 247,68.4477153 247,69 C247,69.5561352 247.446386,70 247.99703,70 L250,70 L250,72.0029699 C250,72.5469637 250.447715,73 251,73 C251.556135,73 252,72.5536144 252,72.0029699 L252,70 L254.00297,70 C254.546964,70 255,69.5522847 255,69 C255,68.4438648 254.553614,68 254.00297,68 L252,68 Z\" id=\"Combined-Shape\" opacity=\"0.300000012\"></path>\\n                <path data-bind=\"lessColor: [{ color: feedbackColor, attr: \\'fill\\', func: \\'fadein\\', dimension: \\'10%\\' }]\" d=\"M93,107 L93,104.99703 C93,104.453036 92.5522847,104 92,104 C91.4438648,104 91,104.446386 91,104.99703 L91,107 L88.9970301,107 C88.4530363,107 88,107.447715 88,108 C88,108.556135 88.4463856,109 88.9970301,109 L91,109 L91,111.00297 C91,111.546964 91.4477153,112 92,112 C92.5561352,112 93,111.553614 93,111.00297 L93,109 L95.0029699,109 C95.5469637,109 96,108.552285 96,108 C96,107.443865 95.5536144,107 95.0029699,107 L93,107 Z\" id=\"Combined-Shape-Copy-3\" opacity=\"0.300000012\"></path>\\n                <path data-bind=\"lessColor: [{ color: feedbackColor, attr: \\'fill\\', func: \\'fadein\\', dimension: \\'10%\\' }]\" d=\"M61,6 L61,3.99703014 C61,3.45303631 60.5522847,3 60,3 C59.4438648,3 59,3.4463856 59,3.99703014 L59,6 L56.9970301,6 C56.4530363,6 56,6.44771525 56,7 C56,7.55613518 56.4463856,8 56.9970301,8 L59,8 L59,10.0029699 C59,10.5469637 59.4477153,11 60,11 C60.5561352,11 61,10.5536144 61,10.0029699 L61,8 L63.0029699,8 C63.5469637,8 64,7.55228475 64,7 C64,6.44386482 63.5536144,6 63.0029699,6 L61,6 Z\" id=\"Combined-Shape-Copy\" opacity=\"0.300000012\"></path>\\n                <circle data-bind=\"lessColor: [{ color: feedbackColor, attr: \\'stroke\\', func: \\'fade\\', dimension: \\'40%\\'}]\" id=\"Oval-7\" stroke-width=\"2\" opacity=\"0.300000012\" cx=\"31\" cy=\"49\" r=\"3\"></circle>\\n                <circle data-bind=\"lessColor: [{ color: feedbackColor, attr: \\'stroke\\', func: \\'fade\\', dimension: \\'40%\\'}]\" id=\"Oval-7-Copy\" stroke-width=\"2\" opacity=\"0.300000012\" cx=\"234\" cy=\"4\" r=\"3\"></circle>\\n                <circle data-bind=\"lessColor: [{ color: feedbackColor, attr: \\'stroke\\', func: \\'fade\\', dimension: \\'40%\\'}]\" id=\"Oval-7-Copy-2\" stroke-width=\"2\" opacity=\"0.300000012\" cx=\"199\" cy=\"107\" r=\"3\"></circle>\\n                <circle data-bind=\"lessColor: [{ color: feedbackColor, attr: \\'stroke\\', func: \\'fade\\', dimension: \\'40%\\'}]\" id=\"Oval-7-Copy-3\" stroke-width=\"2\" opacity=\"0.300000012\" cx=\"78\" cy=\"73\" r=\"3\"></circle>\\n                <path data-bind=\"lessColor: [{ color: textColor, attr: \\'stroke\\' }]\" d=\"M147.5,79.5 L147.5,100 C147.5,101.380712 148.619288,102.5 150,102.5 C151.380712,102.5 152.5,101.380712 152.5,100 L152.5,79.5 L147.5,79.5 Z\" id=\"Rectangle-2-Copy\" opacity=\"0.3\"></path>\\n                <path data-bind=\"lessColor: [{ color: textColor, attr: \\'fill\\' }]\" d=\"M148,79 L152,79 L152,100 L152,100 C152,101.104569 151.104569,102 150,102 L150,102 L150,102 C148.895431,102 148,101.104569 148,100 L148,79 Z\" id=\"Rectangle-2-Copy-2\" opacity=\"0.2\"></path>\\n                <rect id=\"Rectangle-26\" data-bind=\"lessColor: [{ color: feedbackColor, attr: \\'fill\\' }]\" x=\"120\" y=\"20\" width=\"60\" height=\"60\" rx=\"5\"></rect>\\n                <rect id=\"Rectangle-26-Copy\" data-bind=\"lessColor: [{ color: feedbackColor, attr: \\'stroke\\', func: \\'shade\\', dimension: \\'10%\\'}]\"  stroke-width=\"2\" x=\"121\" y=\"21\" width=\"58\" height=\"58\" rx=\"5\"></rect>\\n                <text y=\"62\" transform=\"translate(100)\" id=\"8\" font-family=\"RobotoSlab-Regular, Roboto Slab\" font-size=\"32\" font-weight=\"normal\" fill=\"#FFFFFF\">\\n                     <tspan x=\"50\" text-anchor=\"middle\" data-bind=\"text: score\"></tspan>\\n                </text>\\n            </g>\\n        </g>\\n    </g>\\n</svg>';});\n\n","\ndefine('text!dialogs/nps/figures/rocket.html?v=1552304184357',[],function () { return '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<svg width=\"300px\" height=\"141px\" viewBox=\"0 0 300 141\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\\n    <!-- Generator: Sketch 44.1 (41455) - http://www.bohemiancoding.com/sketch -->\\n    <title>Group 2</title>\\n    <desc>Created with Sketch.</desc>\\n    <defs>\\n        <filter x=\"0.0%\" y=\"0.0%\" width=\"100.0%\" height=\"100.0%\" filterUnits=\"objectBoundingBox\" id=\"filter-1\">\\n            <feGaussianBlur stdDeviation=\"0\" in=\"SourceGraphic\"></feGaussianBlur>\\n        </filter>\\n        <filter x=\"0.0%\" y=\"0.0%\" width=\"100.0%\" height=\"100.0%\" filterUnits=\"objectBoundingBox\" id=\"filter-2\">\\n            <feGaussianBlur stdDeviation=\"0\" in=\"SourceGraphic\"></feGaussianBlur>\\n        </filter>\\n    </defs>\\n    <g id=\"Page-1\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\\n        <g id=\"thank-you-screen\" transform=\"translate(-570.000000, -213.000000)\">\\n            <g id=\"Group-2\" transform=\"translate(570.000000, 213.000000)\">\\n                <path data-bind=\"lessColor: [{ color: textColor, attr: \\'fill\\' }]\" d=\"M85.9375,47.4478528 L24.2138056,47.4478528 C24.2138056,47.4478528 13.3928571,48.5180635 13.3928571,56.404908 C13.3928571,64.2917525 24.2138056,65.3619632 24.2138056,65.3619632 L60.9375,65.4259422 C60.9375,65.4259422 69.53125,66.9614373 69.53125,73.8711656 C69.53125,80.780894 60.9375,82.8282209 60.9375,82.8282209 L41.9642857,82.8282209 C41.9642857,82.8282209 26.5625,83.6902176 26.5625,92.2331288 C26.5625,100.77604 41.9642857,102.08589 41.9642857,102.08589 L10.9375,102.08589 C10.9375,102.08589 5.84683802e-16,103.813322 0,110.978966 C0,118.14461 10.9375,120 10.9375,120 L250.782522,120 C250.782522,120 264.285714,118.592463 264.285714,110.978966 C264.285714,103.365469 250.782522,102.08589 250.782522,102.08589 L227.331152,102.08589 C227.331152,102.08589 213.637423,101.337603 213.392857,93.5766871 C213.148291,85.8157708 227.331152,84.363716 227.331152,84.363716 L254.545455,83.5 C254.545455,83.5 268.75,85.4194542 268.75,74.6389132 C268.75,63.8583723 255.681818,65.3619632 255.681818,65.3619632 L288.28125,65.4259422 C288.28125,65.4259422 300,64.7802657 300,56.404908 C300,48.0295503 288.28125,47 288.28125,47 L85.9375,47.4478528 Z\" id=\"Path-8\" opacity=\"0.05\" filter=\"url(#filter-1)\"></path>\\n                <g id=\"startup\" transform=\"translate(151.861436, 54.861436) scale(-1, 1) rotate(-330.000000) translate(-151.861436, -54.861436) translate(112.361436, 15.361436)\">\\n                    <g id=\"Layer_1\" transform=\"translate(-0.000000, 0.000000)\">\\n                        <path data-bind=\"lessColor: [{ color: mainColor, attr: \\'fill\\' }]\" d=\"M55.932,51.6565578 L51.6567151,51.4921056 L51.8211673,55.7673904 C51.9856195,62.8382052 57.9052689,68.7578546 64.9760837,68.9223068 L69.2513685,69.086759 L69.0869163,64.8114741 C68.9224641,57.7406594 63.0026574,51.82101 55.932,51.6565578 Z\" id=\"Shape\" fill-opacity=\"0.5\" fill-rule=\"nonzero\"></path>\\n                        <path data-bind=\"lessColor: [{ color: mainColor, attr: \\'fill\\' }]\" d=\"M78.9529462,47.8744721 C78.1308426,46.3945598 76.9796773,45.0790996 75.8286693,43.9279343 C72.8688446,40.9681096 69.2512112,38.9948406 65.3046733,38.0082849 C57.9051116,36.1994681 49.6832888,38.1727371 43.9279343,43.9279343 C38.1725797,49.6831315 36.1994681,57.9049542 38.0082849,65.3046733 C38.9948406,69.086759 40.9681096,72.8686873 43.9279343,75.828512 C45.0789422,76.9795199 46.5588546,78.1306853 47.8744721,78.9527888 C39.323745,79.2816932 30.4442709,76.1574163 23.8668127,69.5799582 C18.6048147,64.3179602 15.64499,57.9049542 14.6584343,51.1630438 C13.3429741,41.4613088 16.467251,31.4306693 23.8668127,24.0311076 C31.2663745,16.6315458 41.4614661,13.5072689 50.998749,14.8227291 C57.7406594,15.8092849 64.3181175,18.7692669 69.4156633,24.0311076 C76.1575737,30.4442709 79.2818506,39.3239024 78.9529462,47.8744721 Z\" id=\"Shape\" fill-rule=\"nonzero\" opacity=\"0.600000024\"></path>\\n                        <path data-bind=\"lessColor: [{ color: contentBodyColor, attr: \\'fill\\' }, { color: mainColor, attr: \\'stroke\\' }]\" d=\"M64.8114741,48.0389243 C60.2072849,19.9204323 36.0351733,-0.798498008 6.10770717,0.0236055777 L0.188057769,0.188057769 L0.0236055777,6.10770717 C-0.798498008,36.0351733 19.9204323,60.2072849 48.0389243,64.8114741 L64.8114741,48.0389243 Z\" id=\"Shape\" stroke-width=\"1.73333333\" fill-rule=\"nonzero\"></path>\\n                        <g id=\"Group\" transform=\"translate(-0.000000, 0.000000)\"></g>\\n                        <path data-bind=\"lessColor: [{ color: mainColor, attr: \\'fill\\' }]\" d=\"M48.0389243,64.8114741 C49.6832888,65.1403785 51.4921056,65.3048307 53.1364701,65.4692829 L65.3046733,53.3010797 C65.1402211,51.4922629 64.9757689,49.8478984 64.6468645,48.2035339 L48.0389243,64.8114741 Z\" id=\"Shape\" fill-rule=\"nonzero\"></path>\\n                        <circle data-bind=\"lessColor: [{ color: mainColor, attr: \\'fill\\' }]\" id=\"Oval\" fill-rule=\"nonzero\" cx=\"27.7496176\" cy=\"27.8199622\" r=\"11.7197802\" opacity=\"0.5\"></circle>\\n                        <circle data-bind=\"lessColor: [{ color: mainColor, attr: \\'fill\\' }]\" id=\"Oval\" fill-rule=\"nonzero\" cx=\"27.4635159\" cy=\"27.5338606\" r=\"8.8794741\" opacity=\"0.2\"></circle>\\n                        <path data-bind=\"lessColor: [{ color: mainColor, attr: \\'fill\\' }]\" d=\"M21.8937012,23.2091614 C25.0179781,20.0848845 29.9510717,20.0848845 33.0753486,23.2091614 C36.0351733,26.1689861 36.1996255,30.9376275 33.404253,34.0619044 C33.5687052,33.8974522 33.7331574,33.8974522 33.7331574,33.733 C37.1863386,30.2798187 37.1863386,24.6890737 33.7331574,21.2358924 C30.2799761,17.7827112 24.6892311,17.7827112 21.2360498,21.2358924 C17.7828685,24.6890737 17.7828685,30.2798187 21.2360498,33.733 C21.400502,33.8974522 21.5649542,33.8974522 21.5649542,34.0619044 C18.9338765,30.9376275 18.9338765,26.1689861 21.8937012,23.2091614 Z\" id=\"Shape\" fill=\"#ACDEDB\" fill-rule=\"nonzero\"></path>\\n                    </g>\\n                </g>\\n                <path data-bind=\"lessColor: [{ color: mainColor, attr: \\'fill\\' }]\" d=\"M216.405846,62.484982 C216.088518,62.8101473 215.943659,63.2786626 216.018645,63.7379796 L216.37108,65.8989795 L214.525398,64.8786865 C214.329411,64.7702184 214.11411,64.7162233 213.898923,64.7162233 C213.683735,64.7162233 213.468548,64.7704573 213.272447,64.8786865 L211.426766,65.8989795 L211.7792,63.7379796 C211.854187,63.2787821 211.709327,62.8102668 211.391999,62.484982 L209.898979,60.9547217 L211.962462,60.6393519 C212.400904,60.5724553 212.780038,60.282769 212.976139,59.8650235 L213.899036,57.8989795 L214.82182,59.8650235 C215.018034,60.282769 215.396942,60.5723358 215.835497,60.6393519 L217.898979,60.9547217 L216.405846,62.484982 Z\" id=\"Shape-Copy-5\" fill-rule=\"nonzero\" opacity=\"0.300000012\" transform=\"translate(213.898979, 61.898979) scale(-1, 1) rotate(-15.000000) translate(-213.898979, -61.898979) \"></path>\\n                <ellipse data-bind=\"lessColor: [{ color: textColor, attr: \\'fill\\' }]\" id=\"Oval-6\" opacity=\"0.100000001\" filter=\"url(#filter-2)\" cx=\"148\" cy=\"137\" rx=\"25\" ry=\"4\"></ellipse>\\n                <path data-bind=\"lessColor: [{ color: mainColor, attr: \\'fill\\' }]\" d=\"M252,91 L252,88.9970301 C252,88.4530363 251.552285,88 251,88 C250.443865,88 250,88.4463856 250,88.9970301 L250,91 L247.99703,91 C247.453036,91 247,91.4477153 247,92 C247,92.5561352 247.446386,93 247.99703,93 L250,93 L250,95.0029699 C250,95.5469637 250.447715,96 251,96 C251.556135,96 252,95.5536144 252,95.0029699 L252,93 L254.00297,93 C254.546964,93 255,92.5522847 255,92 C255,91.4438648 254.553614,91 254.00297,91 L252,91 Z\" id=\"Combined-Shape\" opacity=\"0.300000012\"></path>\\n                <path data-bind=\"lessColor: [{ color: mainColor, attr: \\'fill\\' }]\" d=\"M93,130 L93,127.99703 C93,127.453036 92.5522847,127 92,127 C91.4438648,127 91,127.446386 91,127.99703 L91,130 L88.9970301,130 C88.4530363,130 88,130.447715 88,131 C88,131.556135 88.4463856,132 88.9970301,132 L91,132 L91,134.00297 C91,134.546964 91.4477153,135 92,135 C92.5561352,135 93,134.553614 93,134.00297 L93,132 L95.0029699,132 C95.5469637,132 96,131.552285 96,131 C96,130.443865 95.5536144,130 95.0029699,130 L93,130 Z\" id=\"Combined-Shape-Copy-3\" opacity=\"0.300000012\"></path>\\n                <path data-bind=\"lessColor: [{ color: mainColor, attr: \\'fill\\' }]\" d=\"M61,29 L61,26.9970301 C61,26.4530363 60.5522847,26 60,26 C59.4438648,26 59,26.4463856 59,26.9970301 L59,29 L56.9970301,29 C56.4530363,29 56,29.4477153 56,30 C56,30.5561352 56.4463856,31 56.9970301,31 L59,31 L59,33.0029699 C59,33.5469637 59.4477153,34 60,34 C60.5561352,34 61,33.5536144 61,33.0029699 L61,31 L63.0029699,31 C63.5469637,31 64,30.5522847 64,30 C64,29.4438648 63.5536144,29 63.0029699,29 L61,29 Z\" id=\"Combined-Shape-Copy\" opacity=\"0.300000012\"></path>\\n                <circle data-bind=\"lessColor: [{ color: mainColor, attr: \\'stroke\\' }]\" id=\"Oval-7\" stroke-width=\"2\" opacity=\"0.300000012\" cx=\"31\" cy=\"72\" r=\"3\"></circle>\\n                <circle data-bind=\"lessColor: [{ color: mainColor, attr: \\'stroke\\' }]\" id=\"Oval-7-Copy\" stroke-width=\"2\" opacity=\"0.300000012\" cx=\"234\" cy=\"27\" r=\"3\"></circle>\\n                <circle data-bind=\"lessColor: [{ color: mainColor, attr: \\'stroke\\' }]\" id=\"Oval-7-Copy-2\" stroke-width=\"2\" opacity=\"0.300000012\" cx=\"199\" cy=\"130\" r=\"3\"></circle>\\n                <circle data-bind=\"lessColor: [{ color: mainColor, attr: \\'stroke\\' }]\" id=\"Oval-7-Copy-3\" stroke-width=\"2\" opacity=\"0.300000012\" cx=\"78\" cy=\"96\" r=\"3\"></circle>\\n            </g>\\n        </g>\\n    </g>\\n</svg>';});\n\n","\ndefine('text!dialogs/nps/nps.html?v=1552304184357',[],function () { return '<section class=\"fullscreen-popup-container\" data-bind=\"css: { attached: isCompositionComplete }\">\\n    <div class=\"fp-content-row\">\\n        <div class=\"fp-content-cell\">\\n            <div class=\"fp-content\">\\n                <div class=\"fp-content-step evaluation\" data-bind=\"css: { show: isEvaluationStep && isCompositionComplete, hide: !isEvaluationStep() }\">\\n                    <figure class=\"fp-image\">\\n                        <!-- ko compose: { model: \\'dialogs/nps/figures/evaluation\\' } -->\\n                        <!-- /ko -->\\n                    </figure>\\n                    <h1 class=\"fp-title\" data-bind=\"text: evaluationStepTitle\"></h1>\\n                    <h2 class=\"fp-subtitle\" data-translate-text=\"[rate your overall experience]\"></h2>\\n                    <div class=\"fp-rating-container\">\\n                        <div class=\"rating-control\" data-bind=\"if: isEvaluationStep, rating: { value: score, max: 10, onValueUpdated: goToFeedbackStep }\"></div>\\n                        <div class=\"fp-rating-tips\">\\n                            <span class=\"fp-rating-tip left\" data-translate-text=\"[poor]\"></span>\\n                            <span class=\"fp-rating-tip right\" data-translate-text=\"[excellent]\"></span>\\n                        </div>\\n                    </div>\\n                    <hr />\\n                </div>\\n                <div class=\"fp-content-step feedback\" data-bind=\"css: { show: isFeedbackStep, hide: !isFeedbackStep() }\">\\n                    <h1 class=\"fp-title\" data-translate-text=\"[you rated this course with]\"></h1>\\n                    <figure class=\"fp-image\">\\n                        <!-- ko compose: { model: \\'dialogs/nps/figures/feedback\\', activationData: score() } -->\\n                        <!-- /ko -->\\n                    </figure>\\n                    <h2 class=\"fp-subtitle\" data-translate-text=\"[course score reason]\"></h2>\\n                        <div class=\"fp-field\">\\n                            <div class=\"fp-field-input\" data-bind=\"hasFocus: isFeedbackEditing, editableText: { text: feedback, onEnterKeyPress: submit }, scrollbar: { checkDOMChanges: true }, attr: { contentEditable: isFeedbackStep }\"></div>\\n                        </div>\\n                        <div class=\"btn-submit-wrapper\">\\n                            <button href=\"#\" class=\"button small primary\" data-bind=\"click: submit, disable: isReporting() || !isFeedbackStep(), css: { progress: isReporting }\" data-translate-title=\"[submit]\">\\n                                <!-- ko if: isReporting -->\\n                                    <span class=\"button-caption-loader\"></span>\\n                                <!-- /ko -->\\n                                <!-- ko ifnot: isReporting -->\\n                                    <span class=\"button-caption\" data-translate-text=\"[submit]\"></span>\\n                                <!-- /ko -->\\n                            </button>\\n                        </div>\\n                        <hr />\\n                </div>\\n                <div class=\"fp-content-step last-step delay\" data-bind=\"css: { show: isLastStep, hide: !isEvaluationStep() && !isLastStep() }\">\\n                    <figure class=\"fp-image\">\\n                        <!-- ko compose: { model: \\'dialogs/nps/figures/rocket\\' } -->\\n                        <!-- /ko -->\\n                    </figure>\\n                    <h1 class=\"fp-title\" data-translate-text=\"[thank you for your feedback]\"></h1>\\n                    <!-- ko ifnot: isCourseEmbedded -->\\n                    <h2 class=\"fp-subtitle\" data-translate-text=\"[you can close the page now]\"></h2>\\n                    <!-- /ko -->\\n                    <hr />\\n                </div>\\n            </div>\\n        </div>\\n    </div>\\n</section>';});\n\n","\ndefine('text!dialogs/resultsResend/resultsResend.html?v=1552304184357',[],function () { return '<section class=\"fullscreen-popup-container resend-results\" data-bind=\"css: { attached: isCompositionComplete }, keyDown: { 27: { handler: hideDialog } }\">\\n    <div class=\"fp-content-row\">\\n        <div class=\"fp-content-cell\">\\n            <div class=\"fp-content\">\\n                <div class=\"fp-content-step send-error\" data-bind=\"css: { show: isCompositionComplete }\">\\n                    <h3 data-bind=\"text: resultsSendErrorTitleText\"></h3>\\n                    <div class=\"note\" data-bind=\"css: { shake: resendingFailed }\">\\n                        <p>\\n                            <span class=\"material-icons incorrect-color\">info</span>\\n                            <span data-translate-text=\"[try to submit again key]\"></span>\\n                        </p>\\n                        <p>\\n                            <span class=\"material-icons incorrect-color\">info</span>\\n                            <span data-translate-text=\"[contanct with author key]\"></span>\\n                        </p>\\n                        <p>\\n                            <span class=\"material-icons incorrect-color\">info</span>\\n                            <span data-translate-text=\"[general-message-key]\"></span>\\n                            <span class=\"error-message\" data-translate-text=\"[error-message-key]\"></span>\\n                        </p>\\n                    </div>\\n                    <div class=\"result-buttons\" data-bind=\"autofocus\">\\n                        <button class=\"button block cancel default\" data-bind=\"click: hideDialog, css: { disabled: isResendingResults }, disable: isResendingResults\" data-translate-text=\"[back]\" data-translate-title=\"[back]\"></button>\\n                        <button href=\"#\" class=\"button block primary autofocus submit\" data-bind=\"click: resendResults, disable: isResendingResults, css: { progress: isResendingResults }\"\\n                            data-translate-title=\"[resend-results-key]\">\\n                            <!-- ko if: isResendingResults -->\\n                            <span class=\"button-caption-loader\"></span>\\n                            <span>&nbsp;</span>\\n                            <!-- /ko -->\\n                            <!-- ko ifnot: isResendingResults -->\\n                            <span class=\"button-caption\" data-translate-text=\"[resend-results-key]\"></span>\\n                            <!-- /ko -->\\n                        </button>\\n                        <!-- ko if: retriesExceeded -->\\n                        <div class=\"link-container\">\\n                            <a class=\"button link\" data-bind=\"click: skipResultsSending, localize: { text: { key: \\'[close without reporting results]\\', replace: { endpointName: endpointNameText } } }\"></a>\\n                        </div>\\n                        <!-- /ko -->\\n                    </div>\\n                </div>\\n            </div>\\n            <div class=\"overlay-close-button\" data-bind=\"click: hideDialog\">\\n                <span class=\"overlay-close-button-icon material-icons\">clear</span>\\n                <div class=\"overlay-close-button-title\">esc</div>\\n            </div>\\n        </div>\\n    </div>\\n</section>';});\n\n","\ndefine('text!dialogs/startNewAttempt/startNewAttempt.html?v=1552304184357',[],function () { return '<section class=\"fullscreen-popup-container start-new-attempt\" data-bind=\"css: { attached: isCompositionComplete }, keyDown: { 27: { handler: hide } }\">\\n    <div class=\"fp-content-row\">\\n        <div class=\"fp-content-cell\">\\n            <div class=\"fp-content\">\\n                <div class=\"fp-content-step evaluation\" data-bind=\"css: { show: isCompositionComplete }\">\\n                    <h3 data-translate-text=\"[start new attempt dialog title]\"></h3>\\n                    <div class=\"note\">\\n                        <p><span class=\"material-icons text-main-color\">info</span> <span data-translate-text=\"[start new attempt dialog text]\"></span></p>\\n                    </div>\\n                    <div class=\"result-buttons\" data-bind=\"autofocus\">\\n                        <button class=\"button block cancel default\" data-bind=\"click: hide, css: { disabled: isStartingNewAttempt }, disable: isStartingNewAttempt\" data-translate-text=\"[back]\" data-translate-title=\"[back]\"></button>\\n                        <button href=\"#\" class=\"button block primary autofocus submit\" data-bind=\"click: startNewAttempt, disable: isStartingNewAttempt, css: { progress: isStartingNewAttempt }\"\\n                            data-translate-title=\"[start new attempt]\">\\n                            <!-- ko if: isStartingNewAttempt -->\\n                            <span class=\"button-caption-loader\"></span>\\n                            <span>&nbsp;</span>\\n                            <!-- /ko -->\\n                            <!-- ko ifnot: isStartingNewAttempt -->\\n                            <span class=\"button-caption\" data-translate-text=\"[start new attempt]\"></span>\\n                            <!-- /ko -->\\n                        </button>\\n                    </div>\\n                </div>\\n            </div>\\n            <div class=\"overlay-close-button\" data-bind=\"click: hide\">\\n                <span class=\"overlay-close-button-icon material-icons\">clear</span>\\n                <div class=\"overlay-close-button-title\">esc</div>\\n            </div>\\n        </div>\\n    </div>\\n</section>';});\n\n","\ndefine('text!header/header.html?v=1552304184357',[],function () { return '<section class=\"header clearfix\" data-bind=\"css: \\'module-\\' + cssName(), style: { height: (height() ? height() + \\'px\\' : \\'\\') }\">\\n    <div class=\"header-overlay\" data-bind=\"css: { fullscreen: !backgroundProps.isBodyEnabled }, style: { backgroundImage: \\'url(\\'+ backgroundProps.image.url +\\')\\', backgroundPosition: backgroundProps.image.backgroundPosition, backgroundSize: backgroundProps.image.backgroundSize, backgroundRepeat: backgroundProps.image.backgroundRepeat, backgroundColor: backgroundProps.color }\"></div>\\n    <!-- ko if: backgroundProps.brightness > 0 -->\\n    <div class=\"header-brightness-holder\" data-bind=\"css: { fullscreen: !backgroundProps.isBodyEnabled }, style: {backgroundColor: \\'white\\', opacity: backgroundProps.brightness }\"></div>\\n    <!-- /ko -->\\n    <!-- ko ifnot: backgroundProps.brightness > 0 -->\\n    <div class=\"header-brightness-holder\" data-bind=\"css: { fullscreen: !backgroundProps.isBodyEnabled }, style: {backgroundColor: \\'black\\', opacity: -backgroundProps.brightness }\"></div>\\n    <!-- /ko -->\\n    <section class=\"header-items-holder-wrapper\">\\n        <div class=\"header-items-holder\" data-bind=\"css: { \\'review-attempt\\' : viewSettings().isInReviewAttemptMode }\">\\n            <span class=\"logo-img\">\\n                <!-- ko if: viewSettings().rootLinkEnabled  -->\\n                <!-- ko if: logo.url -->\\n                <a href=\"#sections\">\\n                    <img alt=\"\" src=\"\" data-bind=\"attr: { src: logo.url }, style: { \\'max-width\\': logo.maxWidth, \\'max-height\\': logo.maxHeight }\">\\n                </a>\\n                <!-- /ko -->\\n                <!-- ko ifnot: logo.url -->\\n                <a href=\"#sections\">\\n                    <span class=\"default-logo\"></span>\\n                </a>\\n                <!-- /ko -->\\n                <!-- /ko -->\\n                <!-- ko ifnot: viewSettings().rootLinkEnabled -->\\n                <!-- ko if: logo.url -->\\n                <img alt=\"\" src=\"\" data-bind=\"attr: { src: logo.url }, style: { \\'max-width\\': logo.maxWidth, \\'max-height\\': logo.maxHeight }\">\\n                <!-- /ko -->\\n                <!-- ko ifnot: logo.url -->\\n                <span class=\"default-logo\"></span>\\n                <!-- /ko -->\\n                <!-- /ko -->\\n            </span>\\n\\n            <!-- ko if: pdfExportEnabled -->\\n            <div class=\"download-course-container\">\\n                <div class=\"download-course-wrapper default\" data-bind=\"downloadAsPdf: { title: title, serviceUrl: pdfServiceUrl, version: version }\">\\n                    <div class=\"download-as-pdf-button\" data-translate-title=\"[download course in pdf format]\"></div>\\n                    <div class=\"download-as-pdf-status-wrapper\">\\n                        <div class=\"download-as-pdf-status\">\\n                            <span class=\"default\" data-translate-text=\"[download as pdf]\"></span>\\n                            <span class=\"proggress\" data-translate-text=\"[download as pdf preparing]\"></span>\\n                            <span class=\"error\" data-translate-text=\"[download as pdf error]\"></span>\\n                            <span class=\"server-error\"></span>\\n                        </div>\\n                    </div>\\n                    <span class=\"disabled-tooltip-text\">This option doesn\\'t work in preview. Publish the course to use the PDF download option.</span>\\n                </div>\\n            </div>\\n            <!-- /ko -->\\n            <div class=\"summary-container\">\\n                <!-- ko if: viewSettings().exitButtonVisible -->\\n                <!-- ko compose: \\'viewmodels/exitCourse\\' -->\\n                <!-- /ko -->\\n                <!-- /ko -->\\n            </div>\\n        </div>\\n    </section>\\n</section>';});\n\n","\ndefine('text!questionContent/questionContent.html?v=1552304184357',[],function () { return '<div class=\"question-header\" data-bind=\"css: {\\'survey\\': isSurvey, \\'correct\\': isCorrectAnswered() && !isSurvey, \\'incorrect\\': !isCorrectAnswered() && !isSurvey}, attr: {\\'data-count\\': index}\">\\n    <span class=\"question-header-icon\" data-bind=\"css: {\\'icon-survey\\': isSurvey, \\'icon-correct_check\\': isCorrectAnswered() && !isSurvey, \\'icon-incorrect_cross\\': !isCorrectAnswered() && !isSurvey}\"></span>\\n    <div class=\"question-title\">\\n        <a class=\"question-title-link\" data-bind=\"text: title, attr: {href: navigationContext.currentQuestionUrl}\"></a>\\n    </div>\\n</div>\\n<div class=\"question-content\">\\n    <!-- ko compose: activeQuestionViewModel --><!-- /ko -->\\n</div>';});\n\n","\ndefine('text!resultPage/resultPage.html?v=1552304184357',[],function () { return '<section data-bind=\"blockBodyScroll: npsDialog.isVisible() || newAttemptDialog.isVisible() || resendResultsDialog.isVisible()\">\\r\\n    <div class=\"result-header\" data-bind=\"headerHeightDepender\">\\r\\n        <div class=\"course-title\">\\r\\n            <span class=\"course-caption\" data-bind=\\'text: title\\'>\"\"</span>\\r\\n        </div>\\r\\n        <div class=\"overall-progress-wrapper\">\\r\\n            <div class=\"overall-progress\">\\r\\n                <div class=\"overall-progress-progressbar-wrapper\">\\r\\n                    <div class=\"overall-progress-progressbar\" data-bind=\"css: { success: isCompleted, fail: !isCompleted }\">\\r\\n                        <canvas class=\"overall-progress-progressbar-canvas canvas-styles result\" width=\"159\" height=\"159\" data-bind=\"circleProgress: { progress: score(), lineWidth:2,radius:75, isMastered: isCompleted }\"></canvas>\\r\\n                        <div class=\"overall-progress-progressbar-text\">\\r\\n                            <div class=\"score\" data-bind=\"text: score()\">0</div>\\r\\n                            <!-- ko if: isCompleted -->\\r\\n                            <div class=\"status correct-color\" data-translate-text=\"[success]\"></div>\\r\\n                            <!-- /ko -->\\r\\n                            <!-- ko ifnot: isCompleted -->\\r\\n                            <div class=\"status incorrect-color\" data-translate-text=\"[failed]\"></div>\\r\\n                            <!-- /ko -->\\r\\n                        </div>\\r\\n                    </div>\\r\\n                </div>\\r\\n            </div>\\r\\n        </div>\\r\\n        <div class=\"result-buttons\">\\r\\n            <span class=\"button-wrapper\" data-bind=\"autofocus\">\\r\\n                <span class=\"button-wrapper\">\\r\\n                    <!-- ko ifnot: isInReviewAttemptMode -->\\r\\n                    <button class=\"button block default cancel\" data-bind=\"click: close\" data-translate-text=\"[continue course]\" data-translate-title=\"[continue course]\"></button>\\r\\n                    <!-- /ko -->\\r\\n                    <!-- ko if: isInReviewAttemptMode -->\\r\\n                    <button class=\"button block cancel\" data-bind=\"click: close, css: { primary: isCompleted, default: !isCompleted, autofocus: isCompleted }\" data-translate-text=\"[review attempt]\" data-translate-title=\"[review attempt]\"></button>\\r\\n                    <!-- /ko -->\\r\\n                </span>                \\r\\n                <!-- ko ifnot: isInReviewAttemptMode -->\\r\\n                    <!-- ko if: ((!xAPIEnabled && !crossDeviceEnabled) || scormEnabled) || ((xAPIEnabled || crossDeviceEnabled) && !scormEnabled) -->\\r\\n                        <!-- ko if: canDownloadCertificate -->\\r\\n                        <button class=\"button block primary autofocus submit\" data-bind=\"click: finish\" data-translate-text=\"[submit results and download certificate]\" data-translate-title=\"[submit results and download certificate]\"></button>\\r\\n                        <!-- /ko -->\\r\\n                        <!-- ko ifnot: canDownloadCertificate -->\\r\\n                        <button class=\"button block primary autofocus submit\" data-bind=\"click: finish\" data-translate-text=\"[finish course]\" data-translate-title=\"[finish course]\"></button>\\r\\n                        <!-- /ko -->\\r\\n                    <!-- /ko -->\\r\\n                <!-- /ko -->\\r\\n                <!-- ko if: isInReviewAttemptMode -->\\r\\n                <button class=\"button block submit\" data-bind=\"click: newAttemptDialog.show, css: { primary: !isCompleted, default: isCompleted, autofocus: !isCompleted }\" data-translate-text=\"[start new attempt]\" data-translate-title=\"[start new attempt]\"></button>\\r\\n                <!-- /ko -->\\r\\n            </span>\\r\\n        </div>\\r\\n        <!-- ko if: crossDeviceEnabled && !scormEnabled && !isInReviewAttemptMode -->\\r\\n        <button class=\"button check small mb10\" type=\"submit\" data-bind=\"click: toggleStayLoggedIn, css: { active: stayLoggedIn }\">\\r\\n            <span data-translate-text=\"[keep me logged-in for the next courses]\" data-translate-title=\"[keep me logged-in for the next courses]\"></span>\\r\\n        </button>\\r\\n        <!-- /ko -->\\r\\n    </div>\\r\\n    <!-- ko if: sections.length -->\\r\\n    <div class=\"results-summary-heading\">\\r\\n        <div class=\"section-wrapper\">\\r\\n            <h3 class=\"results-summary-caption\" data-translate-text=\"[detailed summary]\"></h3>\\r\\n            <!-- ko if: isInReviewAttemptMode -->\\r\\n            <!-- ko if: canDownloadCertificate -->\\r\\n            <button class=\"button default download-certificate\" data-bind=\"click: downloadCertificate, css: { disabled: isDownloadingCertificate }, disabled: isDownloadingCertificate\">\\r\\n                <!-- ko ifnot: isDownloadingCertificate -->\\r\\n                <span data-translate-text=\"[download certificate]\"></span>\\r\\n                <!-- /ko -->\\r\\n                <!-- ko if: isDownloadingCertificate -->\\r\\n                    <div class=\"pulsar-loader align-center secondary\">\\r\\n                        <div class=\"pulsar-loader-item\"></div>\\r\\n                        <div class=\"pulsar-loader-item\"></div>\\r\\n                        <div class=\"pulsar-loader-item\"></div>\\r\\n                    </div>\\r\\n                <!-- /ko -->\\r\\n            </button>\\r\\n            <!-- /ko -->\\r\\n            <!-- /ko -->\\r\\n        </div>\\r\\n    </div>\\r\\n    <!-- /ko -->\\r\\n    <div class=\"result-page-content\" data-bind=\"foreach: sections\">\\r\\n        <div class=\"section noselect\">\\r\\n            <div class=\"section-header\" data-bind=\"css: {correct: isCorrect, wrong: !isCorrect}\">\\r\\n                <div class=\"section-header-wrapper\">\\r\\n                    <div class=\"section-header-label\" data-translate-text=\"[section]\" data-bind=\"attr: {\\'data-index\\': \\' \\' + ($parent.sections.indexOf($data) + 1)}\"></div>\\r\\n                    <div class=\"section-header-title\" data-bind=\"text: title\"></div>\\r\\n                    <!-- ko if: amountOfQuestions || ($parent.allowContentPagesScoring && amountOfContents) -->\\r\\n                    <div class=\"section-header-analytic\">\\r\\n                        <span class=\"section-header-analytic-icon\" data-bind=\"css: {\\'icon-correct_check\\': isCorrect, \\'icon-incorrect_cross\\': !isCorrect}\"></span>\\r\\n                        <!-- ko if: amountOfQuestions -->\\r\\n                        <div class=\"section-header-correct\" data-bind=\"attr: {\\'data-count\\': correctQuestions + \\'/\\' + amountOfQuestions}\" data-translate-text=\"[questions correct]\"></div>\\r\\n                        <!-- /ko -->\\r\\n                        <!-- ko if: $parent.allowContentPagesScoring && amountOfContents -->\\r\\n                        <div class=\"section-header-content-readed\" data-bind=\"attr: {\\'data-count\\': readedContents + \\'/\\' + amountOfContents}\" data-translate-text=\"[contents readed]\"></div>\\r\\n                        <!-- /ko -->\\r\\n                    </div>\\r\\n                    <!-- /ko -->\\r\\n                </div>\\r\\n            </div>\\r\\n            <!-- ko if: questions.length -->\\r\\n            <div class=\"section-content\">\\r\\n                <!-- ko foreach: questions -->\\r\\n                <!-- ko compose: { model: \\'questionContent/questionContent\\', activationData: [ $parent.id, $data, ($parent.questions.indexOf($data) + 1), true ] } --><!-- /ko -->\\r\\n                <!-- /ko -->\\r\\n            </div>\\r\\n            <!-- /ko -->\\r\\n        </div>\\r\\n    </div>\\r\\n    <div class=\"result-page-go-top noselect icon-up_arrow\" data-bind=\"scrollTop: 1000\"></div>\\r\\n    <div class=\"finish-course-layout\" data-bind=\"visible: status() == statuses.sendingRequests || status() == statuses.preparingCertificate\">\\r\\n        <div class=\"finish-course-layout-block\"></div>\\r\\n        <div class=\"finish-course-layout-loader\">\\r\\n            <!-- ko if: status() == statuses.sendingRequests -->\\r\\n            <span class=\"finish-course-layout-loader-text\" data-translate-text=\"[tracking and tracing reporting progress]\"></span>\\r\\n            <!-- /ko -->\\r\\n             <!-- ko if: status() == statuses.preparingCertificate -->\\r\\n             <span class=\"finish-course-layout-loader-text\" data-translate-text=\"[preparing course certificate]\"></span>\\r\\n             <!-- /ko -->\\r\\n        </div>\\r\\n    </div>\\r\\n    <!-- ko if: npsDialog.isVisible -->\\r\\n    <!-- ko compose: { view: \\'dialogs/nps/nps\\', model: \\'dialogs/nps/nps\\', compositionComplete: npsDialog.compositionComplete, activationData: { close: npsDialog.hide, callbacks: npsDialog.callbacks } } --><!-- /ko -->\\r\\n    <!-- /ko -->\\r\\n    <!-- ko if: newAttemptDialog.isVisible -->\\r\\n    <!-- ko compose: { view: \\'dialogs/startNewAttempt/startNewAttempt\\', model: \\'dialogs/startNewAttempt/startNewAttempt\\', compositionComplete: newAttemptDialog.compositionComplete, activationData: { close: newAttemptDialog.hide, callbacks: newAttemptDialog.callbacks } } --><!-- /ko -->\\r\\n    <!-- /ko -->\\r\\n    <!-- ko if: resendResultsDialog.isVisible -->\\r\\n    <!-- ko compose: { view: \\'dialogs/resultsResend/resultsResend\\', model: \\'dialogs/resultsResend/resultsResend\\', compositionComplete: resendResultsDialog.compositionComplete, activationData: { close: resendResultsDialog.hide, callbacks: resendResultsDialog.callbacks, resultsSendErrorTitleKey: resendResultsDialog.resultsSendErrorTitleKey, endpointNameKey: resendResultsDialog.endpointNameKey } } --><!-- /ko -->\\r\\n    <!-- /ko -->\\r\\n</section>';});\n\n","\ndefine('text!treeOfContent/treeOfContent.html?v=1552304184357',[],function () { return '<section class=\"tree-of-content-panel unselectable\" data-bind=\"css: { expanded: isExpanded }, tabFocus\">\\n    <div tabindex=\"0\" class=\"tree-of-content-panel-tail\" data-bind=\"click: toggleIsExpanded.bind($data), localize: { title: isExpanded() ? \\'[collapse]\\' : \\'[expand]\\'}, submitOnEnter\">\\n        <i class=\"tree-of-content-panel-tail-icon material-icons\" data-bind=\"text: isExpanded() ? \\'&#xE314;\\' : \\'menu\\'\"></i>\\n    </div>\\n    <div class=\"tree-of-content-container\" data-bind=\"css: { expanded: isExpanded }, treeOfContentAnimations: { expanded: isExpanded }, attr: { \\'aria-hidden\\': !isExpanded() }\">\\n        <div class=\"tree-of-content\" data-bind=\"scrollbar: { checkDOMChanges: true }\">\\n            <header class=\"tree-of-content-header\">\\n                <button class=\"tree-of-content-header-btn menu\" data-bind=\"click: toggleIsExpanded.bind($data)\">\\n                    <i class=\"tree-of-content-header-btn-icon menu material-icons\">menu</i>\\n                </button>\\n                <div class=\"tree-of-content-header-title\" data-translate-text=\"[sections]\"></div>\\n                <button class=\"tree-of-content-header-btn close\" data-bind=\"click: toggleIsExpanded.bind($data)\">\\n                    <i class=\"tree-of-content-header-btn-icon close material-icons\">close</i>\\n                </button>\\n            </header>\\n            <ul class=\"tree-of-content-items\" data-bind=\"foreach: children\">\\n                <li class=\"tree-of-content-section-item\" data-bind=\"css:{ expanded : isExpanded, active: hasActiveQuestion }\">\\n                    <div class=\"tree-of-content-section-title-wrapper\" data-bind=\"click: toggleIsExpanded.bind($data), keyDown: { 13: { handler: toggleIsExpanded.bind($data) } }, attr: { tabindex: $parent.isExpanded() ? \\'0\\' : \\'-1\\' }\">\\n                        <i class=\"tree-of-content-section-title-icon material-icons\" data-bind=\"text: isExpanded() ? \\'&#xE313;\\' : \\'&#xE315;\\', localize: { title: isExpanded() ? \\'[collapse]\\' : \\'[expand]\\'}\"></i>\\n                        <div class=\"tree-of-content-section-title\" data-bind=\"limitedLengthText: { text: title, maxLength: 70 }, attr: { title: title }\"></div>\\n                    </div>\\n                    <!-- ko if: isExpanded -->\\n                    <div class=\"tree-of-content-questions-wrapper\" data-bind=\"visible: isExpanded\">\\n                        <!-- ko ifnot: hasChildren -->\\n                        <div class=\"tree-of-content-questions-empty\" data-translate-text=\"[no questions]\"></div>\\n                        <!-- /ko -->\\n                        <!-- ko if: hasChildren -->\\n                        <ul class=\"tree-of-content-questions\" data-bind=\"foreach: children\">\\n                            <li class=\"tree-of-content-question-item\" data-bind=\"css: { active: isActive }\">\\n                                <!-- ko if: canNavigate -->\\n                                <a class=\"tree-of-content-question-title-wrapper navigatable\" href=\"#\" data-bind=\"attr: { href: url, tabindex: $parent.isExpanded() && $root.isExpanded() ? \\'0\\' : \\'-1\\' }\">\\n                                    <i class=\"tree-of-content-question-title-icon material-icons\" data-bind=\"css: { question: !isInformationContent }, text: isInformationContent ? \\'info_outline\\' : \\'&#xE8FD;\\'\"></i>\\n                                    <span class=\"tree-of-content-question-title\" data-bind=\"text: title\"></span>\\n                                </a>\\n                                <!-- /ko -->\\n                                <!-- ko ifnot: canNavigate -->\\n                                <div class=\"tree-of-content-question-title-wrapper\">\\n                                    <i class=\"tree-of-content-question-title-icon material-icons\" data-bind=\"css: { question: !isInformationContent }, text: isInformationContent ? \\'info_outline\\' : \\'&#xE8FD;\\'\"></i>\\n                                    <span class=\"tree-of-content-question-title\" data-bind=\"text: title\"></span>\\n                                </div>\\n                                <!-- /ko -->\\n                            </li>\\n                        </ul>\\n                        <!-- /ko -->\\n                        <!-- /ko -->\\n                    </div>\\n                    <!-- /ko -->\\n                </li>\\n            </ul>\\n        </div>\\n    </div>\\n</section>';});\n\n","\ndefine('text!views/404.html?v=1552304184357',[],function () { return '<section id=\"errorPage404\" class=\"error error-404\">\\r\\n    <div class=\"error-content\">\\r\\n        <div class=\"text-404\">\\r\\n            <div class=\"title-404\">404</div>\\r\\n            <div class=\"page-404-hint\" data-translate-text=\"[page not found message]\"></div>\\r\\n            <a href=\"#\" data-bind=\"attr: { href: homeUrl }\" class=\"button primary medium\">\\r\\n                <span data-translate-text=\"[home]\"></span>\\r\\n            </a>\\r\\n        </div>\\r\\n    </div>\\r\\n</section>';});\n\n","\ndefine('text!views/exitCourse.html?v=1552304184357',[],function () { return '<section class=\"summary-wrapper\" data-bind=\"blockBodyScroll: continueLaterPopup.isVisible()\">\\r\\n    <!-- ko if: type() === \\'extended\\' -->\\r\\n    <section class=\"summary-extended-wrapper\">\\r\\n        <div class=\"summary-extended-background\"></div>\\r\\n        <div class=\"summary-extended\">\\r\\n            <div class=\"overall-progress-wrapper\">\\r\\n                <div class=\"overall-progress\">\\r\\n                    <div>\\r\\n                        <div class=\"overall-progress-label-wrapper\">\\r\\n                            <span class=\"overall-progress-label\" data-translate-text=\"[Overall progress]\"></span>\\r\\n                        </div>\\r\\n                        <div class=\"overall-progress-progressbar-wrapper\">\\r\\n                            <div class=\"overall-progress-progressbar\" data-bind=\"css: { success: isInReviewAttemptMode && isCompleted, fail: !isCompleted && isInReviewAttemptMode }\">\\r\\n                                <canvas class=\"overall-progress-progressbar-canvas canvas-styles\" width=\"80\" height=\"80\" data-bind=\"circleProgress: { progress: score(), lineWidth:2,radius:39, isMastered: isCompleted }\"></canvas>\\r\\n                                <div class=\"overall-progress-progressbar-text\" data-bind=\"text: score()\"></div>\\r\\n                            </div>\\r\\n                        </div>\\r\\n                    </div>\\r\\n                </div>\\r\\n            </div>\\r\\n            <!-- ko ifnot: hideFinishActionButtons -->\\r\\n            <div class=\"exit-course-wrapper\">\\r\\n                <div class=\"exit-course-container\">\\r\\n                    <!-- ko ifnot: isInReviewAttemptMode -->\\r\\n                    <!-- ko if: !xAPIEnabled && !scormEnabled -->\\r\\n                    <button class=\"button small primary exit-course-button\" data-translate-text=\"[finish course when tracking disabled]\" data-bind=\"click: finishAction, css: { disabled: isNavigationLocked }\"></button>\\r\\n                    <!-- /ko -->\\r\\n                    <!-- ko if: xAPIEnabled || scormEnabled -->\\r\\n                    <button class=\"button small primary exit-course-button\" data-translate-text=\"[finish course]\" data-bind=\"click: finishAction, css: { disabled: isNavigationLocked }\"></button>\\r\\n                    <!-- /ko -->\\r\\n                    <!-- /ko -->\\r\\n                    <!-- ko if: isInReviewAttemptMode -->\\r\\n                    <button class=\"button small primary exit-course-button finished\" data-translate-text=\"[go to results]\" data-bind=\"click: finishAction, css: { disabled: isNavigationLocked }\"></button>\\r\\n                    <!-- /ko -->\\r\\n                    <!-- ko ifnot: hideContinueLaterButton -->\\r\\n                    <div class=\"or-separator\">\\r\\n                        <span class=\"or-separator-text\" data-translate-text=\"[or]\"></span>\\r\\n                    </div>\\r\\n                    <!-- /ko -->\\r\\n                    <div class=\"exit-course-link-wrapper\">\\r\\n                        <!-- ko ifnot: isInReviewAttemptMode -->\\r\\n                        <!-- ko ifnot: hideContinueLaterButton -->\\r\\n                        <a class=\"exit-course-link\" href=\"#\" data-translate-title=\"[take a break and continue later]\" data-translate-text=\"[take a break and continue later]\" data-bind=\"click: takeABreakAction\"></a>\\r\\n                        <!-- /ko -->\\r\\n                        <!-- /ko -->\\r\\n                        <!-- ko if: isInReviewAttemptMode -->\\r\\n                        <a class=\"exit-course-link\" href=\"#\" data-translate-title=\"[close course]\" data-translate-text=\"[close course]\" data-bind=\"click: takeABreakAction\"></a>\\r\\n                        <!-- /ko -->\\r\\n                    </div>\\r\\n                </div>\\r\\n            </div>\\r\\n            <!-- /ko -->\\r\\n        </div>\\r\\n    </section>\\r\\n    <!-- /ko -->\\r\\n\\r\\n    <!-- ko ifnot: hideContinueLaterButton -->\\r\\n\\r\\n    <!-- ko ifnot: type() ===\\'extended\\' -->\\r\\n    <section class=\"summary-short\">\\r\\n        <button class=\"exit-course-button\" data-bind=\"click: takeABreakAction, css: { disabled: isNavigationLocked }\">\\r\\n            <span class=\"material-icons\">exit_to_app</span>\\r\\n            <!-- ko ifnot: isInReviewAttemptMode -->\\r\\n            <span data-translate-text=\"[take a brake]\"></span>\\r\\n            <!-- /ko -->\\r\\n            <!-- ko if: isInReviewAttemptMode -->\\r\\n            <span data-translate-text=\"[close course]\"></span>\\r\\n            <!-- /ko -->\\r\\n        </button>\\r\\n    </section>\\r\\n\\r\\n    <!-- /ko -->  \\r\\n    \\r\\n    <!-- /ko -->    \\r\\n    \\r\\n\\r\\n    <!-- ko if: continueLaterPopup.isVisible -->\\r\\n        <!-- ko compose: { view: \\'dialogs/continueLater\\', model: \\'dialogs/continueLater\\', compositionComplete: continueLaterPopup.compositionComplete, activationData: [ continueLaterPopup.actions, continueLaterPopup.isVisible ] } --><!-- /ko -->\\r\\n    <!-- /ko -->\\r\\n</section>';});\n\n","\ndefine('text!views/introduction.html?v=1552304184357',[],function () { return '<section id=\"introduction\" class=\"unselectable\" data-bind=\"autofocus\">\\r\\n    <div class=\"\">\\r\\n        <header class=\"page-header\">\\r\\n            <h1 class=\"course-title\" data-bind=\"css: {small: courseTitle.length>100}\">\\r\\n                <span class=\"course-caption\" data-bind=\"text: courseTitle, reviewable: {type: \\'course\\', property: \\'title\\'}\">\"course_name\"</span>\\r\\n            </h1>\\r\\n            <div class=\"course-action-block intro\">\\r\\n                <button class=\"button small primary autofocus\" href=\"#\" data-bind=\"click: startCourse, css: { disabled: isNavigationLocked }\" data-translate-text=\"[start course]\" data-translate-title=\"[start course]\">Start course</button>\\r\\n            </div>\\r\\n        </header>\\r\\n        <div class=\"course-intro-text styled-content content\">\\r\\n            <!-- ko if: allowAuthorsBio -->\\r\\n                <div class=\"author-information-wrapper\">\\r\\n                    <h3 class=\"cource-intro-title\" data-bind=\"text: \\'About the author\\'\"></h3>\\r\\n                    <div class=\"author-information-content\">\\r\\n                        <div class=\"author-information-image\">\\r\\n                            <!-- ko ifnot: authorAvatarUrl -->\\r\\n                                <span class=\"material-icons\">person</span>\\r\\n                            <!-- /ko -->\\r\\n                            <!-- ko if: authorAvatarUrl -->\\r\\n                                <img data-bind=\"attr: {src: (authorAvatarUrl + \\'?width=356&height=356&scaleBySmallerSide=true\\')}\" alt=\"\">\\r\\n                            <!-- /ko -->\\r\\n                        </div>\\r\\n                        <div class=\"author-information-text\">\\r\\n                            <h3 class=\"author-information-name\" data-bind=\"text: createdBy\"></h3>\\r\\n                            <!-- ko if: authorContactEmail || authorPersonalPhone -->\\r\\n                                <div class=\"author-information-contacts\">\\r\\n                                    <!-- ko if: authorContactEmail -->\\r\\n                                        <div class=\"author-information-email\">\\r\\n                                            <i class=\"material-icons\">drafts</i>\\r\\n                                            <span data-bind=\"text: authorContactEmail\"></span>\\r\\n                                        </div>\\r\\n                                    <!-- /ko -->\\r\\n                                    <!-- ko if: authorPersonalPhone -->\\r\\n                                        <div class=\"author-information-phone\">\\r\\n                                            <i class=\"material-icons\">call</i>\\r\\n                                            <span data-bind=\"text: authorPersonalPhone\"></span>\\r\\n                                        </div>\\r\\n                                    <!-- /ko -->\\r\\n                                </div>\\r\\n                            <!-- /ko -->\\r\\n                            <!-- ko if: authorShortBio -->\\r\\n                                <div class=\"author-information-bio\" data-bind=\"text: authorShortBio\"></div>\\r\\n                            <!-- /ko -->\\r\\n                        </div>\\r\\n                    </div>\\r\\n                </div>\\r\\n            <!-- /ko -->\\r\\n            <!-- ko if: content -->\\r\\n                <div data-bind=\"html: content,  elementsWrap: {}, reviewable: {type: \\'course\\', property: \\'introduction\\'}\"></div>\\r\\n            <!-- /ko -->\\r\\n            <!-- ko if: copyright --> \\r\\n            <div class=\"copyright-text\" data-bind=\"text: copyright\"></div>\\r\\n            <!-- /ko -->\\r\\n        </div>\\r\\n    </div>\\r\\n</section>\\r\\n';});\n\n","\ndefine('text!views/questions/content.html?v=1552304184357',[],function () { return '<section id=\"content\" class=\"question unselectable\" data-bind=\"keyDown: { 37: { handler: goPrevious }, 39: { handler: goNext } }\">\\r\\n    <div>\\r\\n        <header class=\"page-header\">\\r\\n            <div class=\"navigation-home-link-wrapper\" data-bind=\"click: backToSections\">\\r\\n                <div tabindex=\"0\" class=\"navigation-home-link material-icons\" data-bind=\"submitOnEnter: backToSections, css: { disabled: isNavigationLocked }\">home</div>\\r\\n            </div>\\r\\n            <div class=\"section-progress-wrapper\">\\r\\n                <div class=\"section-image-wrapper\" data-bind=\"style: { \\'background-image\\': \\'url(\\' + section.imageUrl + \\')\\' }, css: { \\'affect-progress\\': section.affectProgress }\">\\r\\n                    <!-- ko if: section.affectProgress -->\\r\\n                    <div class=\"sections-canvas-wrapper\">\\r\\n                        <canvas tabindex=\"0\" class=\"canvas-styles\" width=\"80\" height=\"80\" data-bind=\"circleProgress: { progress: section.score(), isMastered: isSectionMastered(), lineWidth: 2 },toolTip:{progress: section.score(), masteryScore:masteryScore}\"></canvas>\\r\\n                    </div>\\r\\n                    <span class=\"progress-text\" data-bind=\"text: section.score()\"></span>\\r\\n\\r\\n                    <!-- /ko -->\\r\\n                </div>\\r\\n            </div>\\r\\n            <div class=\"section-info\">\\r\\n                <span data-bind=\"text: section.title, reviewable: {type: \\'section\\', property: \\'title\\', id: section.id, title: section.title}\">section title</span>\\r\\n            </div>\\r\\n            <div class=\"questions-navigation-container\">\\r\\n                <div class=\"question-navigation-bar\">\\r\\n                    <a class=\"previous\" data-bind=\"attr: { href: previousQuestionUrl(), title: \\'previous\\'},css:{disabled : !isPreviousQuestionAvailable()}\" data-translate-title=\"[previous question]\">&nbsp;</a>\\r\\n                    <span class=\"navigation-progress\"><span data-bind=\"text: navigationContext.currentQuestionIndex + \\' \\'\"></span><span>/</span><span data-bind=\"text: \\' \\' + navigationContext.questionsCount\"></span></span>\\r\\n                    <a class=\"next\" data-bind=\"attr: { href: nextQuestionUrl(), title: \\'next\\' }, css:{disabled: !isNextQuestionAvailable() }\" data-translate-title=\"[next question]\">&nbsp;</a>\\r\\n                </div>\\r\\n            </div>\\r\\n        </header>\\r\\n        <!-- ko if: voiceOver -->\\r\\n        <div class=\"voiceOver\" data-bind=\"mediaPlayer: { embedCode: voiceOver}, reviewable: {type: question.isInformationContent ? \\'informationContent\\' : \\'question\\', property: \\'voiceOver\\', id: question.id, title: question.title}\"></div>\\r\\n        <!-- /ko -->\\r\\n        <!-- ko compose: { model: activeViewModel, activationData: [ section.id, question ] } --><!-- /ko -->\\r\\n    </div>\\r\\n    <div class=\"question-navigation-bar bottom\" style=\"float: right\">\\r\\n        <a class=\"previous\" data-bind=\"attr: { href: previousQuestionUrl(), title: \\'previous\\'},css:{disabled : !isPreviousQuestionAvailable()}\" data-translate-title=\"[previous question]\">&nbsp;</a>\\r\\n        <span class=\"navigation-progress\"><span data-bind=\"text: navigationContext.currentQuestionIndex + \\' \\'\"></span><span>/</span><span data-bind=\"text: \\' \\' + navigationContext.questionsCount\"></span></span>\\r\\n        <a class=\"next\" data-bind=\"attr: { href: nextQuestionUrl(), title: \\'next\\' }, css:{disabled: !isNextQuestionAvailable() }\" data-translate-title=\"[next question]\">&nbsp;</a>\\r\\n    </div>\\r\\n</section>';});\n\n","\ndefine('text!views/questions/dragAndDrop/dragAndDrop.html?v=1552304184357',[],function () { return '<section class=\"overlay-wrapper\">\\n    <!-- ko if: questionInstructions.length > 0 -->\\n    <section id=\"question-instructions\" class=\"question-instructions\" data-animate=\"\">\\n        <ul class=\"question-instruction-items unstyled\">\\n            <!-- ko foreach: questionInstructions-->\\n            <!-- ko ifnot: children.length -->\\n            <li class=\"question-instruction-item styled-content\" data-bind=\"contentBlock: content\"></li>\\n            <!-- /ko -->\\n            <!-- ko if: children.length -->\\n            <li class=\"question-instruction-item expandable-block-wrapper\" data-bind=\"compose: { model:\\'viewmodels/questions/expandableBlock\\', activationData: $data }\"></li>\\n            <!-- /ko -->\\n            <!-- /ko -->\\n        </ul>\\n    </section>\\n    <!-- /ko -->\\n    <section class=\"drag-and-drop-text\">\\n        <div>            \\n            <!-- ko if: !$root.isPreview() -->\\n            <div class=\"drag-and-drop-text-draggable-container\" data-bind=\"draggableTextContainer: {}, scope: question.id\">\\n                <div class=\"drag-and-drop-text-draggable-container-message\" data-translate-text=\"[drag and drop question all texts are placed]\">\\n                    All texts are placed\\n                </div>\\n                <!-- ko foreach: texts -->\\n                <div class=\"drag-and-drop-text-draggable\" data-bind=\"draggableText: {}, scope: $parent.question.id\">\\n                    <div data-bind=\"text: _.isObject(text) ? text.text : text, attr: {title: _.isObject(text) ? text.text : text}\">\\n                    </div>\\n                </div>\\n                <!-- /ko -->\\n            </div>            \\n            <!-- /ko -->\\n            <!-- ko if: $root.isPreview -->\\n            <div class=\"drag-and-drop-text-draggable-container\" data-bind=\"visible: false\">\\n                <!-- ko foreach: texts -->\\n                <div class=\"drag-and-drop-text-draggable\">\\n                    <div data-bind=\"text: _.isObject(text) ? text.text : text, attr: {title: _.isObject(text) ? text.text : text}\">\\n                    </div>\\n                </div>\\n                <!-- /ko -->\\n            </div>            \\n            <!-- /ko -->\\n            <div class=\"drag-and-drop-text-background-wrapper\">\\n                <div data-bind=\"background: question.background\" class=\"drag-and-drop-text-background\">\\n                    <!-- ko foreach: dropspots -->\\n                    <div class=\"drag-and-drop-text-dropspot\" data-bind=\"dropspot: $data, scope: $parent.question.id\">\\n                        <!-- ko ifnot: $root.isPreview() || $root.isAnswered() -->\\n                        <div class=\"drag-and-drop-text-dropspot-tooltip-image\">\\n                        </div>\\n                        <!-- /ko -->\\n                    </div>\\n                    <!-- /ko -->\\n                </div>\\n            </div>\\n\\n        </div>\\n    </section>\\n    <!-- ko if: isAnswered() && !$root.isPreview() -->\\n    <div class=\"question-overlay\"></div>\\n    <!-- /ko -->\\n</section>';});\n\n","\ndefine('text!views/questions/expandableBlock.html?v=1552304184357',[],function () { return '<section class=\"expandable-block\" data-bind=\"css: { collapsed: !isExpanded() }, toggleVisible: { isExpanded: isExpanded() }\">\\n    <div class=\"expandable-block-content\" data-bind=\"click: toggleExpand, submitOnEnter\">\\n        <div class=\"expandable-block-content-title\" data-bind=\"html: content\"></div>\\n        <button class=\"expand-button\" data-bind=\"css: { expand: !isExpanded() }\">\\n            <span class=\"material-icons expand-button-icon\" data-bind=\"css: { visible: isExpanded() }\">remove</span>\\n            <span class=\"material-icons expand-button-icon\" data-bind=\"css: { visible: !isExpanded() }\">add</span>\\n        </button>\\n    </div>\\n    <!-- ko if: children.length > 0 -->\\n    <ul class=\"expandable-block-children-items unstyled\" data-animate>\\n        <!-- ko foreach: children -->\\n        <li class=\"expandable-block-children styled-content\" data-bind=\"contentBlock: content\"></li>\\n        <!-- /ko -->\\n    </ul>\\n    <!-- /ko -->\\n</section>';});\n\n","\ndefine('text!views/questions/feedback.html?v=1552304184357',[],function () { return '<section id=\"feedback\" data-bind=\"scrollIntoView: isAnswered\">\\r\\n    <!-- ko if: isAnswered() -->\\r\\n    <!-- ko if: isCorrectAnswered() || (isWrongAnswered() && isSurvey) -->\\r\\n    <div class=\"result-block-wrapper\" data-bind=\"autofocus\">\\r\\n        <div class=\"question-result-block\" data-bind=\"text: feedbackResultText, title: feedbackResultText\"></div>\\r\\n        <div class=\"question-feedback-holder styled-content\" data-bind=\"visible: correctFeedback, html: correctFeedback, elementsWrap: {}\"></div>\\r\\n        <div class=\"result-btn-holder\">\\r\\n            <!-- ko if: navigationContext.nextQuestionUrl -->\\r\\n            <button class=\"button medium primary autofocus\" data-bind=\"click: navigateNext, css: { disabled: isNavigationLocked }\" data-translate-text=\"[next]\" data-translate-title=\"[next]\">Next</button>\\r\\n            <!-- /ko -->\\r\\n            <!-- ko if: isGoToNextSectionVisible() -->\\r\\n            <button class=\"button medium primary autofocus\" data-bind=\"click: goToNextSection, css: { disabled: isNavigationLocked }\" data-translate-text=\"[next section]\" data-translate-title=\"[next section]\">Next section</button>\\r\\n            <!-- /ko -->\\r\\n            <!-- ko if: isGoToResultsVisible -->\\r\\n            <button class=\"button medium autofocus\" data-bind=\"click: goToResults, css: { disabled: isNavigationLocked, default: navigationContext.nextQuestionUrl || isGoToNextSectionVisible(), primary: !navigationContext.nextQuestionUrl && !isGoToNextSectionVisible() }\" data-translate-text=\"[go to results]\" data-translate-title=\"[next section]\">Go to results</button>\\r\\n            <!-- /ko -->\\r\\n        </div>\\r\\n    </div>\\r\\n    <!-- /ko -->\\r\\n    <!-- ko if: isWrongAnswered() && !isSurvey -->\\r\\n    <div class=\"result-block-wrapper\" data-bind=\"autofocus\">\\r\\n        <div class=\"question-result-block incorrect\" data-bind=\"text: feedbackResultText, title: feedbackResultText\">\\r\\n        </div>\\r\\n        <div class=\"question-feedback-holder styled-content\" data-bind=\"visible: incorrectFeedback, html: incorrectFeedback, elementsWrap: {}\"></div>\\r\\n        <div class=\"result-btn-holder\">\\r\\n            \\r\\n            <!-- ko if: hideTryAgain -->\\r\\n            <!-- ko if: navigationContext.nextQuestionUrl -->\\r\\n            <button class=\"button medium primary autofocus\" data-bind=\"click: navigateNext, css: { disabled: isNavigationLocked }\" data-translate-text=\"[next]\" data-translate-title=\"[next]\">Next</button>\\r\\n            <!-- /ko -->\\r\\n            <!-- ko if: isGoToNextSectionVisible() -->\\r\\n            <button class=\"button medium primary autofocus\" data-bind=\"click: goToNextSection, css: { disabled: isNavigationLocked }\" data-translate-text=\"[next section]\" data-translate-title=\"[next section]\">Next section</button>\\r\\n            <!-- /ko -->\\r\\n            <!-- ko if: isGoToResultsVisible -->\\r\\n            <button class=\"button medium autofocus\" data-bind=\"click: goToResults, css: { disabled: isNavigationLocked, default: navigationContext.nextQuestionUrl || isGoToNextSectionVisible(), primary: !navigationContext.nextQuestionUrl && !isGoToNextSectionVisible() }\" data-translate-text=\"[go to results]\" data-translate-title=\"[next section]\">Go to results</button>\\r\\n            <!-- /ko -->\\r\\n            <!-- /ko -->\\r\\n\\r\\n            <!-- ko ifnot: hideTryAgain -->\\r\\n            <button class=\"button medium primary autofocus\" data-bind=\"click: tryAnswerAgain\" data-translate-text=\"[try again]\" data-translate-title=\"[try again]\">Try again</button>\\r\\n            <!-- ko if: navigationContext.nextQuestionUrl -->\\r\\n            <button class=\"button medium default\" data-bind=\"click: navigateNext, css: { disabled: isNavigationLocked }\" data-translate-text=\"[next]\" data-translate-title=\"[next]\">Next</button>\\r\\n            <!-- /ko -->\\r\\n            <!-- ko if: isGoToNextSectionVisible() -->\\r\\n            <button class=\"button medium default\" data-bind=\"click: goToNextSection, css: { disabled: isNavigationLocked }\" data-translate-text=\"[next section]\" data-translate-title=\"[next section]\">Next section</button>\\r\\n            <!-- /ko -->\\r\\n            <!-- ko if: isGoToResultsVisible -->\\r\\n            <button class=\"button medium default\" data-bind=\"click: goToResults, css: { disabled: isNavigationLocked }\" data-translate-text=\"[go to results]\" data-translate-title=\"[next section]\">Go to results</button>\\r\\n            <!-- /ko -->\\r\\n            <!-- /ko -->\\r\\n            \\r\\n        </div>\\r\\n    </div>\\r\\n    <!-- /ko -->\\r\\n    <!-- /ko -->\\r\\n</section>';});\n\n","\ndefine('text!views/questions/fillInTheBlank/fillInTheBlank.html?v=1552304184357',[],function () { return '<section class=\"overlay-wrapper\">\\n    <!-- ko if: content -->\\n    <div class=\"question-content-wrapper blank-content fill-in-the-blank\">\\n        <div class=\"question-content blank-answers styled-content\" data-bind=\"elementsWrap: {}, fillInTheBlankAnswers: { inputValues:inputValues, content:content, isAnswered: isAnswered() || isPreview() }\"></div>\\n    </div>\\n    <!-- /ko -->\\n    <!-- ko if: isAnswered() && !isPreview() -->\\n    <div class=\"question-overlay\"></div>\\n    <!-- /ko -->\\n</section>';});\n\n","\ndefine('text!views/questions/hotspot/hotspot.html?v=1552304184357',[],function () { return '<section class=\"overlay-wrapper\">\\n    <!-- ko if: questionInstructions.length > 0 -->\\n    <section id=\"question-instructions\" class=\"question-instructions\" data-animate=\"\">\\n        <ul class=\"question-instruction-items unstyled\">\\n            <!-- ko foreach: questionInstructions-->\\n            <!-- ko ifnot: children.length -->\\n            <li class=\"question-instruction-item styled-content\" data-bind=\"contentBlock: content\"></li>\\n            <!-- /ko -->\\n            <!-- ko if: children.length -->\\n            <li class=\"question-instruction-item expandable-block-wrapper\" data-bind=\"compose: { model:\\'viewmodels/questions/expandableBlock\\', activationData: $data }\"></li>\\n            <!-- /ko -->\\n            <!-- /ko -->\\n        </ul>\\n    </section>\\n    <!-- /ko -->\\n    <!-- ko ifnot: isPreview -->\\n    <div class=\"hotspot\">\\n        <div class=\"question-image-wrapper\">\\n            <div class=\"hotspot-background\" data-bind=\"area: { click: addMark }, background: background\">\\n                <ul data-bind=\"foreach: marks\">\\n                    <li class=\"pulsemark\" data-bind=\"style: { left: x + \\'px\\', top: y + \\'px\\' }, click: $parent.removeMark, clickBubble: !$parent.isMultiple, css: { \\'multiple\\': $parent.isMultiple }\">\\n                        <div class=\"pin\"></div>\\n                        <div class=\"mark\">\\n                            <span class=\"impulse\"></span>\\n                        </div>\\n                    </li>\\n                </ul>\\n            </div>\\n        </div>\\n        <!-- ko if: isAnswered() -->\\n        <div class=\"question-overlay\"></div>\\n        <!-- /ko -->\\n    </div>\\n    <!-- /ko -->\\n    <!-- ko if: isPreview -->\\n    <div class=\"hotspot\">\\n        <div class=\"question-image-wrapper\">\\n            <div class=\"hotspot-background\" data-bind=\"background: background\">\\n                <ul data-bind=\"foreach: marks\">\\n                    <li class=\"pulsemark\" data-bind=\"style: { left: x + \\'px\\', top: y + \\'px\\' }, css: { \\'multiple\\': $parent.isMultiple }\">\\n                        <div class=\"pin\"></div>\\n                        <div class=\"mark\">\\n                            <span class=\"impulse\"></span>\\n                        </div>\\n                    </li>\\n                </ul>\\n            </div>\\n        </div>\\n    </div>\\n    <!-- /ko -->\\n</section>';});\n\n","\ndefine('text!views/questions/informationContent.html?v=1552304184357',[],function () { return '<section id=\"informationContent\" class=\"content information-content\" data-bind=\"reviewable: {type: \\'informationContent\\', id: id, title: title}, autofocus\">\\n    <div class=\"learning-content-section\">\\n        <div tabindex=\"-1\" class=\"information-content-title autofocus\">\\n            <span data-bind=\"text: title\"></span>\\n        </div>\\n        <!-- ko if: learningContents.length > 0 -->\\n        <section id=\"learning-contents\" class=\"learning-contents\">\\n            <ul class=\"learning-content-items unstyled\">\\n                <!-- ko foreach: learningContents-->\\n                <!-- ko ifnot: children.length -->\\n                <li class=\"learning-content-item styled-content\" data-bind=\"contentBlock: content\"></li>\\n                <!-- /ko -->\\n                <!-- ko if: children.length -->\\n                <li class=\"learning-content-item expandable-block-wrapper\" data-bind=\"compose: { model:\\'viewmodels/questions/expandableBlock\\', activationData: $data }\"></li>\\n                <!-- /ko -->\\n                <!-- /ko -->\\n            </ul>\\n        </section>\\n        <!-- /ko -->\\n    </div>\\n    <div class=\"result-block\">\\n        <div class=\"result-btn-holder\">\\n            <!-- ko if: navigationContext.nextQuestionUrl -->\\n            <button class=\"button medium primary\" data-bind=\"click: navigateNext, css: { disabled: isNavigationLocked }\" data-translate-text=\"[next]\" data-translate-title=\"[next]\">Next</button>\\n            <!-- /ko -->\\n            <!-- ko if: isGoToNextSectionVisible() -->\\n            <button class=\"button medium primary\" data-bind=\"click: goToNextSection, css: { disabled: isNavigationLocked }\" data-translate-text=\"[next section]\" data-translate-title=\"[next section]\">Next section</button>\\n            <!-- /ko -->\\n            <!-- ko if: isGoToResultsVisible -->\\n            <button class=\"button medium default\" data-bind=\"click: goToResults, css: { disabled: isNavigationLocked, default: navigationContext.nextQuestionUrl || isGoToNextSectionVisible(), primary: !navigationContext.nextQuestionUrl && !isGoToNextSectionVisible() }\" data-translate-text=\"[go to results]\" data-translate-title=\"[next section]\">Go to results</button>\\n            <!-- /ko -->\\n        </div>\\n    </div>\\n    <!-- ko if: copyright --> \\n    <div class=\"copyright-text\" data-bind=\"text: copyright\"></div>\\n    <!-- /ko -->\\n</section>';});\n\n","\ndefine('text!views/questions/multipleSelect/multipleSelect.html?v=1552304184357',[],function () { return '<section class=\"overlay-wrapper\">\\r\\n    <!-- ko if: questionInstructions.length > 0 -->\\r\\n    <section id=\"question-instructions\" class=\"question-instructions\" data-animate=\"\">\\r\\n        <ul class=\"question-instruction-items unstyled\">\\r\\n            <!-- ko foreach: questionInstructions-->\\r\\n            <!-- ko ifnot: children.length -->\\r\\n            <li class=\"question-instruction-item styled-content\" data-bind=\"contentBlock: content\"></li>\\r\\n            <!-- /ko -->\\r\\n            <!-- ko if: children.length -->\\r\\n            <li class=\"question-instruction-item expandable-block-wrapper\" data-bind=\"compose: { model:\\'viewmodels/questions/expandableBlock\\', activationData: $data }\"></li>\\r\\n            <!-- /ko -->\\r\\n            <!-- /ko -->\\r\\n        </ul>\\r\\n    </section>\\r\\n    <!-- /ko -->\\r\\n    <!-- ko if: isSurveyModeEnabled -->\\r\\n    <!-- ko if: isAnswered() || isPreview() -->\\r\\n    <div class=\"text-matching-caption\" data-translate-text=\"[survey mode answered caption]\"></div>\\r\\n    <!-- /ko -->\\r\\n    <!-- ko ifnot: isAnswered() || isPreview() -->\\r\\n    <div class=\"text-matching-caption\" data-translate-text=\"[survey mode caption]\"></div>\\r\\n    <!-- /ko -->\\r\\n    <!-- /ko -->\\r\\n    <!-- ko ifnot: isPreview -->\\r\\n    <ul class=\"question-answers-list\" data-bind=\"foreach: answers\">\\r\\n        <li class=\"checkbox\" role=\"checkbox\" data-bind=\"click: $parent.checkItem.bind($parent), keyDown: { 32: { handler: $parent.checkItem.bind($parent) }, 13: { handler: $parent.checkItem.bind($parent) } },\\r\\n            css: { checked: isChecked(), enabled: !$parent.isAnswered()},\\r\\n            attr: { tabindex: $parent.isAnswered() ? \\'-1\\' : \\'0\\', \\'aria-checked\\': isChecked() ? \\'true\\' : \\'false\\' }\">\\r\\n            <span class=\"checkbox-icon-wrapper\" >\\r\\n                <button tabindex=\"-1\" class=\"checkbox-icon\" data-bind=\"css: { checked: isChecked() }\" ></button>\\r\\n            </span>\\r\\n            <label class=\"checkbox-text\" data-bind=\"text: text\"></label>\\r\\n        </li>\\r\\n    </ul>\\r\\n    <!-- /ko -->\\r\\n    <!-- ko if: isPreview -->\\r\\n    <ul class=\"question-answers-list\" data-bind=\"foreach: answers\">\\r\\n        <li class=\"checkbox\" data-bind=\"css: { checked: isChecked() }\">\\r\\n            <span class=\"checkbox-icon-wrapper\">\\r\\n                <button tabindex=\"-1\" class=\"checkbox-icon\" data-bind=\"css: { checked: isChecked() }\"></button>\\r\\n            </span>\\r\\n            <label class=\"checkbox-text\" data-bind=\"text: text\"></label>\\r\\n        </li>\\r\\n    </ul>\\r\\n    <!-- /ko -->\\r\\n    <!-- ko if: isAnswered() || isPreview() -->\\r\\n    <div class=\"question-overlay\"></div>\\r\\n    <!-- /ko -->\\r\\n</section>';});\n\n","\ndefine('text!views/questions/openQuestion/feedback.html?v=1552304184357',[],function () { return '<section id=\"feedback\" data-bind=\"scrollIntoView: isAnswered\">\\r\\n    <!-- ko if: isCorrectAnswered -->\\r\\n    <div class=\"result-block-wrapper\" data-bind=\"autofocus\">\\r\\n        <div class=\"question-result-block\" data-translate-text=\"[your answer was stored]\" data-translate-title=\"[your answer was stored]\">Your answer has been stored</div>\\r\\n        <div class=\"question-feedback-holder styled-content\" data-bind=\"visible: correctFeedback, html: correctFeedback, elementsWrap: {}\"></div>\\r\\n        <div class=\"result-btn-holder\">\\r\\n            <!-- ko if: navigationContext.nextQuestionUrl -->\\r\\n            <button class=\"button medium primary autofocus\" data-bind=\"click: navigateNext, css: { disabled: isNavigationLocked }\" data-translate-text=\"[next]\" data-translate-title=\"[next]\">Next</button>\\r\\n            <!-- /ko -->\\r\\n            <!-- ko if: isGoToNextSectionVisible() -->\\r\\n            <button class=\"button medium primary autofocus\" data-bind=\"click: goToNextSection, css: { disabled: isNavigationLocked }\" data-translate-text=\"[next section]\" data-translate-title=\"[next section]\">Next section</button>\\r\\n            <!-- /ko -->\\r\\n            <!-- ko if: isGoToResultsVisible -->\\r\\n            <button class=\"button medium autofocus\" data-bind=\"click: goToResults, css: { disabled: isNavigationLocked, default: navigationContext.nextQuestionUrl || isGoToNextSectionVisible(), primary: !navigationContext.nextQuestionUrl && !isGoToNextSectionVisible() }\" data-translate-text=\"[go to results]\" data-translate-title=\"[next section]\">Go to results</button>\\r\\n            <!-- /ko -->\\r\\n        </div>\\r\\n    </div>\\r\\n    <!-- /ko -->\\r\\n    <!-- ko if: isWrongAnswered -->\\r\\n    <div class=\"result-block-wrapper\" data-bind=\"autofocus\">\\r\\n        <div class=\"question-result-block incorrect\" data-translate-text=\"[your answer is empty and was not stored]\" data-translate-title=\"[your answer is empty and was not stored]\">Your answer is empty and was not stored</div>\\r\\n        <div class=\"question-feedback-holder styled-content\" data-bind=\"visible: incorrectFeedback, html: incorrectFeedback, elementsWrap: {}\"></div>\\r\\n        <div class=\"result-btn-holder\">\\r\\n            <!-- ko if: hideTryAgain -->\\r\\n            <!-- ko if: navigationContext.nextQuestionUrl -->\\r\\n            <button class=\"button medium primary autofocus\" data-bind=\"click: navigateNext, css: { disabled: isNavigationLocked }\" data-translate-text=\"[next]\" data-translate-title=\"[next]\">Next</button>\\r\\n            <!-- /ko -->\\r\\n            <!-- ko if: isGoToNextSectionVisible() -->\\r\\n            <button class=\"button medium primary autofocus\" data-bind=\"click: goToNextSection, css: { disabled: isNavigationLocked }\" data-translate-text=\"[next section]\" data-translate-title=\"[next section]\">Next section</button>\\r\\n            <!-- /ko -->\\r\\n            <!-- ko if: isGoToResultsVisible -->\\r\\n            <button class=\"button medium autofocus\" data-bind=\"click: goToResults, css: { disabled: isNavigationLocked, default: navigationContext.nextQuestionUrl || isGoToNextSectionVisible(), primary: !navigationContext.nextQuestionUrl && !isGoToNextSectionVisible() }\" data-translate-text=\"[go to results]\" data-translate-title=\"[next section]\">Go to results</button>\\r\\n            <!-- /ko -->\\r\\n            <!-- /ko -->\\r\\n\\r\\n            <!-- ko ifnot: hideTryAgain -->\\r\\n            <button class=\"button medium primary autofocus\" data-bind=\"click: tryAnswerAgain\" data-translate-text=\"[try again]\" data-translate-title=\"[try again]\">Try again</button>\\r\\n            <!-- ko if: navigationContext.nextQuestionUrl -->\\r\\n            <button class=\"button medium default\" data-bind=\"click: navigateNext, css: { disabled: isNavigationLocked }\" data-translate-text=\"[next]\" data-translate-title=\"[next]\">Next</button>\\r\\n            <!-- /ko -->\\r\\n            <!-- ko if: isGoToNextSectionVisible() -->\\r\\n            <button class=\"button medium default\" data-bind=\"click: goToNextSection, css: { disabled: isNavigationLocked }\" data-translate-text=\"[next section]\" data-translate-title=\"[next section]\">Next section</button>\\r\\n            <!-- /ko -->\\r\\n            <!-- ko if: isGoToResultsVisible -->\\r\\n            <button class=\"button medium default\" data-bind=\"click: goToResults, css: { disabled: isNavigationLocked }\" data-translate-text=\"[go to results]\" data-translate-title=\"[next section]\">Go to results</button>\\r\\n            <!-- /ko -->\\r\\n            <!-- /ko -->\\r\\n        </div>\\r\\n    </div>\\r\\n    <!-- /ko -->\\r\\n</section>\\r\\n';});\n\n","\ndefine('text!views/questions/openQuestion/openQuestion.html?v=1552304184357',[],function () { return '<section class=\"overlay-wrapper\">\\r\\n    <!-- ko if: questionInstructions.length > 0 -->\\r\\n    <section id=\"question-instructions\" class=\"question-instructions\" data-animate=\"\">\\r\\n        <ul class=\"question-instruction-items unstyled\">\\r\\n            <!-- ko foreach: questionInstructions-->\\r\\n            <!-- ko ifnot: children.length -->\\r\\n            <li class=\"question-instruction-item styled-content\" data-bind=\"contentBlock: content\"></li>\\r\\n            <!-- /ko -->\\r\\n            <!-- ko if: children.length -->\\r\\n            <li class=\"question-instruction-item expandable-block-wrapper\" data-bind=\"compose: { model:\\'viewmodels/questions/expandableBlock\\', activationData: $data }\"></li>\\r\\n            <!-- /ko -->\\r\\n            <!-- /ko -->\\r\\n        </ul>\\r\\n    </section>\\r\\n    <!-- /ko -->\\r\\n    <div class=\"edit-field-wrapper\">\\r\\n        <textarea class=\"open-question-edit-field edit-field selectable\" data-bind=\"textArea: answeredText, attr:{ disabled: isAnswered }, keyDown: {37: {preventDefault: false}, 39: {preventDefault: false}}\" data-translate-placeholder=\"[type your answer here]\"></textarea>\\r\\n    </div>\\r\\n    <!-- ko if: isAnswered() || isPreview() -->\\r\\n    <div class=\"question-overlay\"></div>\\r\\n    <!-- /ko -->\\r\\n</section>';});\n\n","\ndefine('text!views/questions/questionContent.html?v=1552304184357',[],function () { return '<section id=\"questionContent\" data-bind=\"autofocus\">\\r\\n    <!-- ko if: learningContents.length > 0 -->\\r\\n    <section class=\"content learning-content\" data-bind=\"css:{collapsed:!isExpanded()},toggleVisible:{isExpanded:isExpanded()}, reviewable: {type: \\'question\\', property: \\'learningContent\\', id: question.id, title: question.title}\">\\r\\n        <div tabindex=\"0\" class=\"toggle-expand-container\" data-bind=\"click: toggleExpand, submitOnEnter, css: { \\'autofocus\\': !isAnswered() }\">\\r\\n            <div class=\"learning-content-title\" >\\r\\n                <span class=\"material-icons\"> school</span>\\r\\n                <span data-translate-text=\"[learning content]\">Learning content</span>\\r\\n            </div>\\r\\n            <a class=\"expand-button\" data-bind=\"css:{expand:!isExpanded()}\"></a>\\r\\n        </div>\\r\\n            <section id=\"learning-contents\" class=\"learning-contents\" data-animate=\"\">\\r\\n                <ul class=\"learning-content-items unstyled\">\\r\\n                    <!-- ko foreach: learningContents-->\\r\\n                    <!-- ko ifnot: children.length -->\\r\\n                    <li class=\"learning-content-item styled-content\" data-bind=\"contentBlock: content\"></li>\\r\\n                    <!-- /ko -->\\r\\n                    <!-- ko if: children.length -->\\r\\n                    <li class=\"learning-content-item expandable-block-wrapper\" data-bind=\"compose: { model:\\'viewmodels/questions/expandableBlock\\', activationData: $data }\"></li>\\r\\n                    <!-- /ko -->\\r\\n                    <!-- /ko -->\\r\\n                </ul>\\r\\n            </section>\\r\\n    </section>\\r\\n    <!-- /ko -->\\r\\n    <section class=\"content learning-content\" data-bind=\"reviewable: {type: \\'question\\', id: question.id, title: question.title}\">\\r\\n        <div class=\"learning-content-title question-content-title\">\\r\\n            <span class=\"material-icons\"> help_outline</span>\\r\\n            <span data-translate-text=\"[question]\">question</span>\\r\\n        </div>\\r\\n        <div tabindex=\"-1\" class=\"question-title selectable\" data-bind=\"text: title, css: { \\'autofocus\\': !isAnswered() }\">\\r\\n            question title\\r\\n        </div>\\r\\n        <!-- ko compose: activeQuestionViewModel --><!-- /ko -->\\r\\n        <!-- ko compose: { view: feedbackView } --><!-- /ko -->\\r\\n        <!-- ko ifnot: isAnswered -->\\r\\n        <!-- ko ifnot: submitViewModel -->\\r\\n        <div class=\"btn-submit-wrapper\" data-bind=\"autofocus\">\\r\\n            <button href=\"#\" class=\"button medium primary autofocus\" data-bind=\"click: submit\" data-translate-text=\"[submit]\" data-translate-title=\"[submit]\">Submit</button>\\r\\n        </div>\\r\\n        <!-- /ko -->\\r\\n        <!-- ko if: submitViewModel -->\\r\\n        <!-- ko compose: { model: submitViewModel, activationData: { submit: submit.bind($root) } } --><!-- /ko-->\\r\\n        <!-- /ko -->\\r\\n        <!-- /ko -->\\r\\n        <!-- ko if: copyright --> \\r\\n        <div class=\"copyright-text\" data-bind=\"text: copyright\"></div>\\r\\n        <!-- /ko -->\\r\\n    </section>\\r\\n</section>';});\n\n","\ndefine('text!views/questions/rankingText/rankingText.html?v=1552304184357',[],function () { return '<section class=\"overlay-wrapper\">\\n    <!-- ko if: questionInstructions.length > 0 -->\\n    <section id=\"question-instructions\" class=\"question-instructions\" data-animate=\"\">\\n        <ul class=\"question-instruction-items unstyled\">\\n            <!-- ko foreach: questionInstructions-->\\n            <!-- ko ifnot: children.length -->\\n            <li class=\"question-instruction-item styled-content\" data-bind=\"contentBlock: content\"></li>\\n            <!-- /ko -->\\n            <!-- ko if: children.length -->\\n            <li class=\"question-instruction-item expandable-block-wrapper\" data-bind=\"compose: { model:\\'viewmodels/questions/expandableBlock\\', activationData: $data }\"></li>\\n            <!-- /ko -->\\n            <!-- /ko -->\\n        </ul>\\n    </section>\\n    <!-- /ko -->\\n    <!-- ko ifnot: isPreview -->\\n    <div data-bind=\"dragula: { data: rankingItems }\" class=\"gu-unselectable\">\\n        <div class=\"ranking-item gu-draggable\" data-bind=\"preventDefaultTouchEvent: true\">\\n            <span class=\"ranking-item-icon\"></span>\\n            <span class=\"ranking-item-text\" data-bind=\"text: text\"></span>\\n        </div>\\n    </div>\\n    <!-- /ko -->\\n    <!-- ko if: isPreview -->\\n    <div data-bind=\"foreach: { data: rankingItems }\" class=\"gu-unselectable\">\\n        <div class=\"ranking-item gu-draggable\">\\n            <span class=\"ranking-item-icon\"></span>\\n            <span class=\"ranking-item-text\" data-bind=\"text: text\"></span>\\n        </div>\\n    </div>\\n    <!-- /ko -->\\n    <!-- ko if: isAnswered() || isPreview() -->\\n    <div class=\"question-overlay\"></div>\\n    <!-- /ko -->\\n</section>';});\n\n","\ndefine('text!views/questions/scenarioQuestion/feedback.html?v=1552304184357',[],function () { return '<section id=\"feedback\">\\r\\n    <!-- ko if: isCorrectAnswered -->\\r\\n    <div class=\"result-block-wrapper\" data-bind=\"scrollIntoView: isAnswered, autofocus\">\\r\\n        <div class=\"question-result-block\" data-translate-text=\"[scenario has been passed successfully]\" data-translate-title=\"[scenario has been passed successfully]\">Scenario has been passed successfully</div>\\r\\n        <div class=\"question-feedback-holder styled-content\" data-bind=\"visible: correctFeedback, html: correctFeedback, elementsWrap: {}\"></div>\\r\\n        <div class=\"result-btn-holder\">\\r\\n            <!-- ko if: navigationContext.nextQuestionUrl -->\\r\\n            <button class=\"button medium primary autofocus\" data-bind=\"click: navigateNext, css: { disabled: isNavigationLocked }\" data-translate-text=\"[next]\" data-translate-title=\"[next]\">Next</button>\\r\\n            <!-- /ko -->\\r\\n            <!-- ko if: isGoToNextSectionVisible() -->\\r\\n            <button class=\"button medium primary autofocus\" data-bind=\"click: goToNextSection, css: { disabled: isNavigationLocked }\" data-translate-text=\"[next section]\" data-translate-title=\"[next section]\">Next section</button>\\r\\n            <!-- /ko -->\\r\\n            <!-- ko if: isGoToResultsVisible -->\\r\\n            <button class=\"button medium autofocus\" data-bind=\"click: goToResults, css: { disabled: isNavigationLocked, default: navigationContext.nextQuestionUrl || isGoToNextSectionVisible(), primary: !navigationContext.nextQuestionUrl && !isGoToNextSectionVisible() }\" data-translate-text=\"[go to results]\" data-translate-title=\"[next section]\">Go to results</button>\\r\\n            <!-- /ko -->\\r\\n        </div>\\r\\n    </div>\\r\\n    <!-- /ko -->\\r\\n    <!-- ko if: isWrongAnswered -->\\r\\n    <div class=\"result-block-wrapper\" data-bind=\"scrollIntoView: isAnswered, autofocus\">\\r\\n        <div class=\"question-result-block incorrect\" data-translate-text=\"[scenario has not been passed successfully]\" data-translate-title=\"[scenario has not been passed successfully]\">Scenario has NOT been passed successfully</div>\\r\\n        <div class=\"question-feedback-holder styled-content\" data-bind=\"visible: incorrectFeedback, html: incorrectFeedback, elementsWrap: {}\"></div>\\r\\n        <div class=\"result-btn-holder\">\\r\\n            <!-- ko if: hideTryAgain -->\\r\\n            <!-- ko if: navigationContext.nextQuestionUrl -->\\r\\n            <button class=\"button medium primary autofocus\" data-bind=\"click: navigateNext, css: { disabled: isNavigationLocked }\" data-translate-text=\"[next]\" data-translate-title=\"[next]\">Next</button>\\r\\n            <!-- /ko -->\\r\\n            <!-- ko if: isGoToNextSectionVisible() -->\\r\\n            <button class=\"button medium primary autofocus\" data-bind=\"click: goToNextSection, css: { disabled: isNavigationLocked }\" data-translate-text=\"[next section]\" data-translate-title=\"[next section]\">Next section</button>\\r\\n            <!-- /ko -->\\r\\n            <!-- ko if: isGoToResultsVisible -->\\r\\n            <button class=\"button medium autofocus\" data-bind=\"click: goToResults, css: { disabled: isNavigationLocked, default: navigationContext.nextQuestionUrl || isGoToNextSectionVisible(), primary: !navigationContext.nextQuestionUrl && !isGoToNextSectionVisible() }\" data-translate-text=\"[go to results]\" data-translate-title=\"[next section]\">Go to results</button>\\r\\n            <!-- /ko -->\\r\\n            <!-- /ko -->\\r\\n\\r\\n            <!-- ko ifnot: hideTryAgain -->\\r\\n            <button class=\"button medium primary autofocus\" data-bind=\"click: tryAnswerAgain\" data-translate-text=\"[try again]\" data-translate-title=\"[try again]\">Try again</button>\\r\\n            <!-- ko if: navigationContext.nextQuestionUrl -->\\r\\n            <button class=\"button medium default\" data-bind=\"click: navigateNext, css: { disabled: isNavigationLocked }\" data-translate-text=\"[next]\" data-translate-title=\"[next]\">Next</button>\\r\\n            <!-- /ko -->\\r\\n            <!-- ko if: isGoToNextSectionVisible() -->\\r\\n            <button class=\"button medium default\" data-bind=\"click: goToNextSection, css: { disabled: isNavigationLocked }\" data-translate-text=\"[next section]\" data-translate-title=\"[next section]\">Next section</button>\\r\\n            <!-- /ko -->\\r\\n            <!-- ko if: isGoToResultsVisible -->\\r\\n            <button class=\"button medium default\" data-bind=\"click: goToResults, css: { disabled: isNavigationLocked }\" data-translate-text=\"[go to results]\" data-translate-title=\"[next section]\">Go to results</button>\\r\\n            <!-- /ko -->\\r\\n            <!-- /ko -->\\r\\n        </div>\\r\\n    </div>\\r\\n    <!-- /ko -->\\r\\n</section>\\r\\n';});\n\n","\ndefine('text!views/questions/scenarioQuestion/scenarioQuestion.html?v=1552304184357',[],function () { return '<section class=\"overlay-wrapper\">\\n    <!-- ko if: questionInstructions.length > 0 -->\\n    <section id=\"question-instructions\" class=\"question-instructions\" data-animate=\"\">\\n        <ul class=\"question-instruction-items unstyled\">\\n            <!-- ko foreach: questionInstructions-->\\n            <!-- ko ifnot: children.length -->\\n            <li class=\"question-instruction-item styled-content\" data-bind=\"contentBlock: content\"></li>\\n            <!-- /ko -->\\n            <!-- ko if: children.length -->\\n            <li class=\"question-instruction-item expandable-block-wrapper\" data-bind=\"compose: { model:\\'viewmodels/questions/expandableBlock\\', activationData: $data }\"></li>\\n            <!-- /ko -->\\n            <!-- /ko -->\\n        </ul>\\n    </section>\\n    <!-- /ko -->\\n    <!-- ko ifnot: isPreview() -->\\n    <div class=\"scenario-question-container\">\\n        <!-- ko if: !isAnswered() -->\\n        <div class=\"scenario-question\" data-bind=\"html: embedCode\"></div>\\n        <!-- /ko -->\\n        <!-- ko if: isAnswered() -->\\n        <div class=\"scenario-question-overlay\">\\n            <div class=\"scenario-question-overlay-container\">\\n                <!-- ko if: isAnswered -->\\n                <span class=\"scenario-question-overlay-text\" data-translate-text=\"[scenario has been submitted]\" data-translate-title=\"[scenario has been submitted]\"></span>\\n                <!-- /ko --> \\n            </div>\\n        </div>\\n        <!-- /ko -->\\n    </div>\\n    <!-- /ko -->\\n    <!-- ko if: !isAnswered() && isPreview() -->\\n    <div class=\"question-result-block incorrect\" data-translate-text=\"[scenario has not been finished yet]\" data-translate-title=\"[scenario has not been finished yet]\">Scenario has NOT been finished yet</div>       \\n    <!-- /ko -->\\n    <!-- ko if: isAnswered() && isPreview() -->\\n    <!-- ko if: isCorrect -->\\n    <div class=\"question-result-block\" data-translate-text=\"[scenario has been passed successfully]\" data-translate-title=\"[scenario has been passed successfully]\">Scenario has been passed successfully</div>      \\n    <!-- /ko -->\\n    <!-- ko ifnot: isCorrect -->\\n    <div class=\"question-result-block incorrect\" data-translate-text=\"[scenario has not been passed successfully]\" data-translate-title=\"[scenario has not been passed successfully]\">Scenario has NOT been passed successfully</div>      \\n    <!-- /ko -->\\n    <!-- /ko -->\\n\\n    <!-- ko if: isAnswered() || isPreview() -->\\n    <div class=\"question-overlay\"></div>\\n    <!-- /ko -->\\n</section>';});\n\n","\ndefine('text!views/questions/scenarioQuestion/submitQuestion.html?v=1552304184357',[],function () { return '<div class=\"btn-submit-wrapper submit-question-tooltip-container\" data-bind=\"css: { show: !canBeSubmitted() }\">\\n    <button href=\"#\" class=\"button medium primary\" data-bind=\"click: submit, customFocus: {}\" data-translate-text=\"[submit]\" data-translate-title=\"[submit]\">Submit</button>\\n    <div class=\"submit-question-tooltip\" data-bind=\"visible: !canBeSubmitted()\" data-translate-text=\"[scenario has not been finished yet]\" data-translate-title=\"[scenario has not been finished yet]\">\\n    </div>\\n</div>';});\n\n","\ndefine('text!views/questions/singleSelectImage/singleSelectImage.html?v=1552304184357',[],function () { return '<section class=\"overlay-wrapper single-select-image-wrapper\">\\r\\n    <!-- ko if: questionInstructions.length > 0 -->\\r\\n    <section id=\"question-instructions\" class=\"question-instructions\" data-animate=\"\">\\r\\n        <ul class=\"question-instruction-items unstyled\">\\r\\n            <!-- ko foreach: questionInstructions-->\\r\\n            <!-- ko ifnot: children.length -->\\r\\n            <li class=\"question-instruction-item styled-content\" data-bind=\"contentBlock: content\"></li>\\r\\n            <!-- /ko -->\\r\\n            <!-- ko if: children.length -->\\r\\n            <li class=\"question-instruction-item expandable-block-wrapper\" data-bind=\"compose: { model:\\'viewmodels/questions/expandableBlock\\', activationData: $data }\"></li>\\r\\n            <!-- /ko -->\\r\\n            <!-- /ko -->\\r\\n        </ul>\\r\\n    </section>\\r\\n    <!-- /ko -->\\r\\n    <!-- ko ifnot: isPreview -->\\r\\n    <ul class=\"single-select-image\" data-bind=\"foreach: answers, css:{canHover:canHover}\">\\r\\n        <li class=\"select-image\" data-bind=\"css: { checked: id == $parent.checkedAnswerId(), enabled: !$parent.isAnswered() }\">\\r\\n            <div class=\"select-image-wrapper\">\\r\\n                <div tabindex=\"0\" class=\"preview-thumbnail\" data-bind=\"click: $parent.checkItem.bind($parent), keyDown: { 32: { handler: $parent.checkItem.bind($parent) }, 13: { handler: $parent.checkItem.bind($parent) } }, attr: { tabindex: $parent.isAnswered() ? \\'-1\\' : \\'0\\' }\">   \\r\\n                    <img class=\"thumbnail\" data-bind=\"attr:{\\'data-image\\': image, src: image + \\'?height=200&amp;width=250&amp;scaleBySmallerSide=true\\' }\">\\r\\n                </div>\\r\\n                <div class=\"preview-button-holder\">\\r\\n                    <button class=\"preview-button-wrapper material-icons\" data-bind=\"previewImage: $data, enable: !$parent.isAnswered(), attr: { id: id }\">zoom_in</button>\\r\\n                </div>\\r\\n            </div>\\r\\n        </li>\\r\\n    </ul>\\r\\n    <!-- /ko -->\\r\\n    <!-- ko if: isPreview -->\\r\\n    <ul class=\"single-select-image\" data-bind=\"foreach: answers\">\\r\\n        <li class=\"select-image\" data-bind=\"css: { checked: id == $parent.checkedAnswerId() }\">\\r\\n            <div class=\"select-image-wrapper\">\\r\\n                <div class=\"preview-thumbnail\">   \\r\\n                    <img class=\"thumbnail\" data-bind=\"attr:{\\'data-image\\': image, src: image + \\'?height=200&amp;width=250&amp;scaleBySmallerSide=true\\' }\">\\r\\n                </div>\\r\\n            </div>\\r\\n        </li>\\r\\n    </ul>\\r\\n    <!-- /ko -->\\r\\n    <!-- ko if: isAnswered() || isPreview() -->\\r\\n    <div class=\"question-overlay\"></div>\\r\\n    <!-- /ko -->\\r\\n</section>';});\n\n","\ndefine('text!views/questions/singleSelectText/singleSelectText.html?v=1552304184357',[],function () { return '<section class=\"overlay-wrapper\">\\r\\n    <!-- ko if: questionInstructions.length > 0 -->\\r\\n    <section id=\"question-instructions\" class=\"question-instructions\" data-animate=\"\">\\r\\n        <ul class=\"question-instruction-items unstyled\">\\r\\n            <!-- ko foreach: questionInstructions-->\\r\\n            <!-- ko ifnot: children.length -->\\r\\n            <li class=\"question-instruction-item styled-content\" data-bind=\"contentBlock: content\"></li>\\r\\n            <!-- /ko -->\\r\\n            <!-- ko if: children.length -->\\r\\n            <li class=\"question-instruction-item expandable-block-wrapper\" data-bind=\"compose: { model:\\'viewmodels/questions/expandableBlock\\', activationData: $data }\"></li>\\r\\n            <!-- /ko -->\\r\\n            <!-- /ko -->\\r\\n        </ul>\\r\\n    </section>\\r\\n    <!-- /ko -->\\r\\n\\r\\n    <!-- ko if: isSurveyModeEnabled -->\\r\\n    <!-- ko if: isAnswered() || isPreview() -->\\r\\n    <div class=\"text-matching-caption\" data-translate-text=\"[survey mode answered caption]\"></div>\\r\\n    <!-- /ko -->\\r\\n    <!-- ko ifnot: isAnswered() || isPreview() -->\\r\\n    <div class=\"text-matching-caption\" data-translate-text=\"[survey mode caption]\"></div>\\r\\n    <!-- /ko -->\\r\\n    <!-- /ko -->\\r\\n    <!-- ko ifnot: isPreview -->\\r\\n    <ul class=\"question-answers-list\" data-bind=\"foreach: answers\">\\r\\n        <li class=\"radio\" role=\"radio\" data-bind=\"click: $parent.checkItem.bind($parent), keyDown: { 32: { handler: $parent.checkItem.bind($parent) }, 13: { handler: $parent.checkItem.bind($parent) } },\\r\\n            css: { checked: isChecked(), enabled: !$parent.isAnswered() },\\r\\n            attr: { tabindex: $parent.isAnswered() ? \\'-1\\' : \\'0\\', \\'aria-checked\\': isChecked() ? \\'true\\' : \\'false\\' }\">\\r\\n            <span class=\"radio-icon-wrapper\">\\r\\n                <button tabindex=\"-1\" class=\"radio-icon\"></button>\\r\\n            </span>\\r\\n            <label class=\"radio-text\" data-bind=\"text: text\"></label>\\r\\n        </li>\\r\\n    </ul>\\r\\n    <!-- /ko -->\\r\\n    <!-- ko if: isPreview -->\\r\\n    <ul class=\"question-answers-list\" data-bind=\"foreach: answers\">\\r\\n        <li class=\"radio\" data-bind=\"css: { checked: isChecked() }\">\\r\\n            <span class=\"radio-icon-wrapper\">\\r\\n                <button tabindex=\"-1\" class=\"radio-icon\"></button>\\r\\n            </span>\\r\\n            <label class=\"radio-text\" data-bind=\"text: text\"></label>\\r\\n        </li>\\r\\n    </ul>\\r\\n    <!-- /ko -->\\r\\n    <!-- ko if: isAnswered() || isPreview() -->\\r\\n    <div class=\"question-overlay\"></div>\\r\\n    <!-- /ko -->\\r\\n</section>';});\n\n","\ndefine('text!views/questions/statement/statement.html?v=1552304184357',[],function () { return '\\r\\n<div class=\"statement-content\">\\r\\n    <!-- ko if: questionInstructions.length > 0 -->\\r\\n    <section id=\"question-instructions\" class=\"question-instructions\" data-animate=\"\">\\r\\n        <ul class=\"question-instruction-items unstyled\">\\r\\n            <!-- ko foreach: questionInstructions-->\\r\\n            <!-- ko ifnot: children.length -->\\r\\n            <li class=\"question-instruction-item styled-content\" data-bind=\"contentBlock: content\"></li>\\r\\n            <!-- /ko -->\\r\\n            <!-- ko if: children.length -->\\r\\n            <li class=\"question-instruction-item expandable-block-wrapper\" data-bind=\"compose: { model:\\'viewmodels/questions/expandableBlock\\', activationData: $data }\"></li>\\r\\n            <!-- /ko -->\\r\\n            <!-- /ko -->\\r\\n        </ul>\\r\\n    </section>\\r\\n    <!-- /ko -->\\r\\n    <!-- ko if: isSurveyModeEnabled -->\\r\\n    <!-- ko if: isAnswered() || isPreview() -->\\r\\n    <div class=\"text-matching-caption\" data-translate-text=\"[survey mode answered caption]\"></div>\\r\\n    <!-- /ko -->\\r\\n    <!-- ko ifnot: isAnswered() || isPreview() -->\\r\\n    <div class=\"text-matching-caption\" data-translate-text=\"[survey mode caption]\"></div>\\r\\n    <!-- /ko -->\\r\\n    <!-- /ko -->\\r\\n    <!-- ko if: statements.length -->\\r\\n    <ul class=\"statement\">\\r\\n        <li class=\"statement-headers-group\" aria-hidden=\"true\">\\r\\n            <div class=\"statement-option\" data-translate-text=\"[statement question true text]\" data-translate-title=\"[statement question true tooltip]\">\\r\\n                True\\r\\n            </div>\\r\\n            <div class=\"statement-option\" data-translate-text=\"[statement question false text]\" data-translate-title=\"[statement question false tooltip]\">\\r\\n                False\\r\\n            </div>\\r\\n        </li>\\r\\n        <!-- ko ifnot: isPreview() -->\\r\\n        <!-- ko foreach: statements -->\\r\\n        <li class=\"statement-item\" data-bind=\"css:{ enabled: !$parent.isAnswered(), checked: isTrueChecked() || isFalseChecked() }, attr: { \\'aria-labelledby\\': id, \\'aria-setsize\\': $parent.statements.length, \\'aria-posinset\\': $index() + 1 }\" role=\"radiogroup\" >\\r\\n            <span class=\"statement-option\" >\\r\\n                <span class=\"radio-icon-wrapper\">\\r\\n                    <button class=\"radio-icon\" data-bind=\"click:$parent.markStatementAsTrue.bind($parent), css: { checked: isTrueChecked() }, attr:{ \\'aria-checked\\': isTrueChecked() ? \\'true\\' : \\'false\\', disabled: $parent.isAnswered() }\" role=\"radio\" aria-setsize=\"2\" aria-posinset=\"1\">\\r\\n                        <span class=\"radio-label\" data-translate-text=\"[statement question true text]\"></span>\\r\\n                    </button>\\r\\n                </span>\\r\\n            </span>\\r\\n            <span class=\"statement-option-separator-wrapper\">\\r\\n                <span class=\"statement-option-separator\"></span>\\r\\n            </span>\\r\\n            <span class=\"statement-option\" >\\r\\n                <span class=\"radio-icon-wrapper\">\\r\\n                    <button class=\"radio-icon checked\" data-bind=\"click:$parent.markStatementAsFalse.bind($parent), css: { checked: isFalseChecked() }, attr:{ \\'aria-checked\\': isFalseChecked() ? \\'true\\' : \\'false\\', disabled: $parent.isAnswered() }\" role=\"radio\" aria-setsize=\"2\" aria-posinset=\"2\">\\r\\n                        <span class=\"radio-label\" data-translate-text=\"[statement question false text]\"></span>\\r\\n                    </button>\\r\\n                </span>\\r\\n            </span>\\r\\n            <span class=\"statement-label\" data-bind=\"text: text, attr: { id: id }\"></span>\\r\\n        </li>\\r\\n        <!-- /ko -->\\r\\n        <!-- /ko -->\\r\\n        <!-- ko if: isPreview() -->\\r\\n        <!-- ko foreach: statements -->\\r\\n        <li class=\"statement-item\" data-bind=\"css:{ checked: isTrueChecked() || isFalseChecked() }, attr: { \\'aria-labelledby\\': id, \\'aria-setsize\\': $parent.statements.length, \\'aria-posinset\\': $index() + 1 }\" role=\"radiogroup\">\\r\\n            <span class=\"statement-option\">\\r\\n                <span class=\"radio-icon-wrapper\">\\r\\n                    <button class=\"radio-icon\" data-bind=\"css: { checked: isTrueChecked() }, attr: { \\'aria-checked\\': isTrueChecked() ? \\'true\\' : \\'false\\' }\" disabled=\"disabled\" role=\"radio\" aria-setsize=\"2\" aria-posinset=\"1\">\\r\\n                        <span class=\"radio-label\" data-translate-text=\"[statement question true text]\"></span>\\r\\n                    </button>\\r\\n                </span>\\r\\n            </span>\\r\\n            <span class=\"statement-option-separator-wrapper\">\\r\\n                <span class=\"statement-option-separator\"></span>\\r\\n            </span>\\r\\n            <span class=\"statement-option\">\\r\\n                <span class=\"radio-icon-wrapper\">\\r\\n                    <button class=\"radio-icon checked\" data-bind=\"css: { checked: isFalseChecked() }, attr: { \\'aria-checked\\': isFalseChecked() ? \\'true\\' : \\'false\\' }\" disabled=\"disabled\" role=\"radio\" aria-setsize=\"2\" aria-posinset=\"2\">\\r\\n                        <span class=\"radio-label\" data-translate-text=\"[statement question false text]\"></span>\\r\\n                    </button>\\r\\n                </span>\\r\\n            </span>\\r\\n            <span class=\"statement-label\" data-bind=\"text: text, attr: { id: id }\"></span>\\r\\n        </li>\\r\\n        <!-- /ko -->\\r\\n        <!-- /ko -->\\r\\n    </ul>\\r\\n    <!-- /ko -->\\r\\n    <!-- ko if: isAnswered() || isPreview() -->\\r\\n    <div class=\"question-overlay\" data-bind=\"visible: isAnswered() || isPreview()\"></div>\\r\\n    <!-- /ko -->\\r\\n</div>';});\n\n","\ndefine('text!views/questions/textMatching/textMatching.html?v=1552304184357',[],function () { return '<section class=\"textmatching overlay-wrapper\">\\n    <!-- ko if: questionInstructions.length > 0 -->\\n    <section id=\"question-instructions\" class=\"question-instructions\" data-animate=\"\">\\n        <ul class=\"question-instruction-items unstyled\">\\n            <!-- ko foreach: questionInstructions-->\\n            <!-- ko ifnot: children.length -->\\n            <li class=\"question-instruction-item styled-content\" data-bind=\"contentBlock: content\"></li>\\n            <!-- /ko -->\\n            <!-- ko if: children.length -->\\n            <li class=\"question-instruction-item expandable-block-wrapper\" data-bind=\"compose: { model:\\'viewmodels/questions/expandableBlock\\', activationData: $data }\"></li>\\n            <!-- /ko -->\\n            <!-- /ko -->\\n        </ul>\\n    </section>\\n    <!-- /ko -->\\n    <!-- ko ifnot: isPreview-->\\n    <div data-bind=\"overlay: isAnswered, syncHeight: {}\">\\n        <div class=\"text-matching-caption\" data-translate-text=\"[text matching question hint]\">\\n            Drag items from right column to the left to match the pairs\\n        </div>\\n        <!-- ko foreach: sources-->\\n        <div class=\"text-matching-row\">\\n            <div class=\"text-matching-column\">\\n                <div class=\"text-matching-source-wrapper\">\\n                    <div class=\"text-matching-source\">\\n                        <div class=\"text-matching-source-text-wrapper\">\\n                            <div class=\"text-matchig-source-text\" data-bind=\"text: key\"></div>\\n                        </div>\\n                    </div>\\n                </div>\\n            </div>\\n            <div class=\"text-matching-column\">\\n                <div class=\"text-matching-target-placeholder-wrapper\" data-bind=\"droppable: $data, accept: 1, scope: $parent.id\">\\n                    <div class=\"text-matching-target-placeholder\">\\n                        <div class=\"text-matching-target-placeholder-text-wrapper\">\\n                            <div class=\"text-matching-target-placeholder-text\" data-translate-text=\"[text matching question drop here]\">Drop here</div>\\n                        </div>\\n                    </div>\\n                    <!-- ko if: value -->\\n                    <!-- ko with: value -->\\n                    <div class=\"text-matching-target\" data-bind=\"draggable: {}, scope: $parents[1].id\">\\n                        <div class=\"text-matching-target-text-wrapper\">\\n                            <div class=\"text-matching-target-text\" data-bind=\"text: $data\"></div>\\n                        </div>\\n                    </div>\\n                    <!-- /ko -->\\n                    <!-- /ko -->\\n                </div>\\n            </div>\\n            <div class=\"text-matching-column empty\">&nbsp;</div>\\n            <!-- ko with: $parent.targets()[$index()] -->\\n            <div class=\"text-matching-column\" data-bind=\"droppable: $data, accept: 1, scope: $parents[1].id\">\\n                <!-- ko if: value -->\\n                <!-- ko with: value -->\\n                <div class=\"text-matching-target-wrapper\">\\n                    <div class=\"text-matching-target\" data-bind=\"draggable: {}, scope: $parents[2].id\">\\n                        <div class=\"text-matching-target-text-wrapper\">\\n                            <div class=\"text-matching-target-text\" data-bind=\"text: $data\"></div>\\n                        </div>\\n                    </div>\\n                </div>\\n                <!-- /ko -->\\n                <!-- /ko -->\\n            </div>\\n            <!-- /ko -->\\n        </div>\\n        <!-- /ko -->\\n    </div>\\n    <!-- /ko -->\\n    <!-- ko if: isPreview-->\\n    <div data-bind=\"syncHeight: {}\">\\n        <!-- ko foreach: sources-->\\n        <div class=\"text-matching-row\">\\n            <div class=\"text-matching-column\">\\n                <div class=\"text-matching-source-wrapper\">\\n                    <div class=\"text-matching-source\">\\n                        <div class=\"text-matching-source-text-wrapper\">\\n                            <div class=\"text-matchig-source-text\" data-bind=\"text: key\"></div>\\n                        </div>\\n                    </div>\\n                </div>\\n            </div>\\n            <div class=\"text-matching-column\">\\n                <div class=\"text-matching-target-placeholder-wrapper\">\\n                    <div class=\"text-matching-target-placeholder\">\\n                    </div>\\n                    <!-- ko if: value -->\\n                    <!-- ko with: value -->\\n                    <div class=\"text-matching-target\">\\n                        <div class=\"text-matching-target-text-wrapper\">\\n                            <div class=\"text-matching-target-text\" data-bind=\"text: $data\"></div>\\n                        </div>\\n                    </div>\\n                    <!-- /ko -->\\n                    <!-- /ko -->\\n                </div>\\n            </div>\\n            <div class=\"text-matching-column empty\">&nbsp;</div>\\n            <!-- ko with: $parent.targets()[$index()] -->\\n            <div class=\"text-matching-column\">\\n                <!-- ko if: value -->\\n                <!-- ko with: value -->\\n                <div class=\"text-matching-target-wrapper\">\\n                    <div class=\"text-matching-target\">\\n                        <div class=\"text-matching-target-text-wrapper\">\\n                            <div class=\"text-matching-target-text\" data-bind=\"text: $data\"></div>\\n                        </div>\\n                    </div>\\n                </div>\\n                <!-- /ko -->\\n                <!-- /ko -->\\n            </div>\\n            <!-- /ko -->\\n        </div>\\n        <!-- /ko -->\\n    </div>\\n    <!-- /ko -->\\n    <!-- ko if: isAnswered() || isPreview() -->\\n    <div class=\"question-overlay\"></div>\\n    <!-- /ko -->\\n</section>';});\n\n","\ndefine('text!views/sections.html?v=1552304184357',[],function () { return '<section id=\"sectionsPage\" class=\"sections \" data-view=\"views/sections\" data-active-view=\"true\" style=\"\">\\r\\n    <header class=\"page-header\">\\r\\n        <h1 class=\"course-title\" data-bind=\"css: {small: courseTitle.length>100}\">\\r\\n            <span class=\"course-caption\" data-bind=\"text: courseTitle, reviewable: {type: \\'course\\', property: \\'title\\'}\">\"course_name\"</span>\\r\\n        </h1>\\r\\n        <div class=\"course-action-block\">\\r\\n            <!-- ko compose: { model: \\'viewmodels/exitCourse\\', activationData: [ \\'extended\\'] } -->\\r\\n            <!-- /ko -->\\r\\n        </div>\\r\\n    </header>\\r\\n    <!-- ko if: $root.sectionsLayout===\"List\" -->\\r\\n        <h1 class=\"sections-title-container\">\\r\\n            <span class=\"sections-title\" data-translate-text=\"[sections]\"></span>\\r\\n        </h1>\\r\\n    <!-- /ko -->\\r\\n    <ul class=\"sections-list autofocus\" data-bind=\"foreach: sections\">\\r\\n        <li tabindex=\"0\" class=\"sections-list-item\" data-bind=\"click: goToFirstQuestion, submitOnEnter, css: { disabled: $parent.isNavigationLocked }, css:$root.sectionsLayout, reviewable: {type: \\'section\\', property: \\'title\\', id: id, title: title}\">\\r\\n            <!-- ko if: $root.sectionsLayout===\"Tiles\" -->\\r\\n            <div class=\"section-image-holder\">\\r\\n                <div class=\"section-image\" data-bind=\"containImage: { imageUrl: imageUrl, imageWidth: imageWidth, imageHeight: imageHeight }\"></div>\\r\\n                <!-- ko ifnot: $root.isInReviewAttemptMode -->\\r\\n                <button tabindex=\"-1\" class=\"button small primary\" data-translate-text=\"[start]\" \\r\\n                    data-bind=\"css: { disabled: $parent.isNavigationLocked }, attr: { \\'aria-label\\': $parent.getSectionButtonAccessibilityLabel(\\'[start]\\', $data) }\"></button>\\r\\n                <!-- /ko -->\\r\\n                <!-- ko if: $root.isInReviewAttemptMode -->\\r\\n                <button tabindex=\"-1\" class=\"button small primary\" data-translate-text=\"[view]\"\\r\\n                    data-bind=\"css: { disabled: $parent.isNavigationLocked }, attr: { \\'aria-label\\': $parent.getSectionButtonAccessibilityLabel(\\'[view]\\', $data) }\"></button>\\r\\n                <!-- /ko -->\\r\\n            </div>\\r\\n            <!-- ko if: affectProgress -->\\r\\n            <div class=\"section-progress\" aria-hidden=\"true\">\\r\\n                <canvas class=\"canvas-styles\" width=\"48\" height=\"48\" data-bind=\"circleProgress: { progress: score, radius: 22, isMastered: isMastered, lineWidth:2 },toolTip:{progress: score, masteryScore:$parent.masteryScore}\"></canvas>\\r\\n                <span class=\"section-progress-text-wrapper\" data-bind=\"text:score\"></span>\\r\\n            </div>\\r\\n            <!-- /ko -->\\r\\n            <!-- ko ifnot: affectProgress -->\\r\\n            <div class=\"section-progress-no-questions\" data-translate-text=\"[there are no questions]\">No questions</div>\\r\\n            <!-- /ko -->\\r\\n            <div class=\"section-info\">\\r\\n                <span data-bind=\"text: title\" aria-hidden=\"true\">section title</span>\\r\\n            </div>\\r\\n            <!--/ko-->\\r\\n            <!-- ko if: $root.sectionsLayout===\"List\" -->\\r\\n            <div class=\"section-info\">\\r\\n                <div class=\"section-image-holder\">\\r\\n                    <div class=\"section-image\" data-bind=\"containImage: { imageUrl: imageUrl, imageWidth: imageWidth, imageHeight: imageHeight }\"></div>\\r\\n                </div>\\r\\n                <div class=\"section-info-holder\">\\r\\n                    <div class=\"section-info-title\" aria-hidden=\"true\" data-bind=\"text: title\"></div>\\r\\n                    <div class=\"section-info-title clamped\" aria-hidden=\"true\" data-bind=\"text: title\"></div>\\r\\n                    <!-- ko ifnot: affectProgress -->\\r\\n                    <span class=\"section-progress-no-questions\" data-translate-text=\"[there are no questions]\">No questions</span>\\r\\n                    <!-- /ko -->\\r\\n                    <!-- ko if: affectProgress -->\\r\\n                    <div class=\"section-progress\" aria-hidden=\"true\">\\r\\n                        <div class=\"progressbar-wrapper canvas-styles\">\\r\\n                            <div class=\\'progressbar\\'>\\r\\n                                <div class=\"progressbar-value\" data-bind=\"style: {width: score+\\'%\\'}, css:{mastered:score >= $parent.masteryScore}\"></div>\\r\\n                                <div class=\"mastered-score-tooltip\" data-bind=\"style: {left:$parent.masteryScore+\\'%\\'}, css:{mastered:score >= $parent.masteryScore}\">\\r\\n                                    <span class=\"material-icons\">done</span>\\r\\n                                    <span class=\"mastered-score-tooltip-text\">\\r\\n                                        <span data-bind=\"text: scoreTooltipText\"></span>\\r\\n                                    </span>\\r\\n                                </div>\\r\\n                            </div>\\r\\n                        </div>\\r\\n                        <span class=\"progress-value\" data-bind=\"text: score + \\'%\\'\"></span>\\r\\n                        <div class=\"progress-value-container\">\\r\\n                            <span class=\"progress-value\" data-bind=\"text: score + \\'%\\', css: { visible: score < $parent.masteryScore }\"></span>\\r\\n                            <span class=\"progress-value-text\" data-bind=\"css: { visible: score < $parent.masteryScore }\" data-translate-text=\"[to complete]\"></span>\\r\\n                            <span class=\"progress-value-text completed\" data-bind=\"css: { visible: score >= $parent.masteryScore }\">\\r\\n                                <span class=\"icon-correct_check\"></span>\\r\\n                                <span data-translate-text=\"[completed]\"></span>\\r\\n                            </span>\\r\\n                        </div>\\r\\n                    </div>\\r\\n                    <!-- /ko -->\\r\\n                </div>\\r\\n                <div class=\"section-start-button-holder\">\\r\\n                    <!-- ko ifnot: $root.isInReviewAttemptMode -->\\r\\n                    <button tabindex=\"-1\" class=\"button small primary\" data-translate-text=\"[start]\"\\r\\n                        data-bind=\"css: { disabled: $parent.isNavigationLocked }, attr: { \\'aria-label\\': $parent.getSectionButtonAccessibilityLabel(\\'[start]\\', $data) }\"></button>\\r\\n                    <!-- /ko -->\\r\\n                    <!-- ko if: $root.isInReviewAttemptMode -->\\r\\n                    <button tabindex=\"-1\" class=\"button small primary\" data-translate-text=\"[view]\"\\r\\n                        data-bind=\"css: { disabled: $parent.isNavigationLocked }, attr: { \\'aria-label\\': $parent.getSectionButtonAccessibilityLabel(\\'[view]\\', $data) }\"></button>\\r\\n                    <!-- /ko -->                    \\r\\n                </div>\\r\\n            </div>\\r\\n            <!--/ko-->\\r\\n        </li>\\r\\n    </ul>\\r\\n</section>';});\n\n","\ndefine('text!views/shell.html?v=1552304184357',[],function () { return '<section class=\"shell\">\\n    <!-- ko if: viewSettings().treeOfContentVisible -->\\n    <!-- ko compose: \\'treeOfContent/treeOfContent\\' -->\\n    <!-- /ko -->\\n    <!-- /ko -->\\n    <!-- ko compose: {model: \\'header/header\\', activationData: [viewSettings, pdfExportEnabled]} -->\\n    <!-- /ko -->\\n    <section class=\"content-container\" data-bind=\"css: { \\'review-mode\\' : isInReviewMode }, css: \\'module-\\' + cssName()\">\\n        <div id=\"content\" class=\"content-wrapper\">\\n            <!-- ko router: { cacheViews: false, transition: \\'entrance\\' } -->\\n            <!-- /ko -->\\n        </div>\\n    </section>\\n    <div class=\"blockout\" data-bind=\"css: { active: isClosed }\">\\n        <div class=\"blockout-text-wrapper\">\\n            <!-- ko if: inIframe -->\\n            <span class=\"blockout-text\" data-translate-text=\"[the course has been finished]\"></span>\\n            <!-- /ko -->\\n            <!-- ko ifnot: inIframe -->\\n            <span class=\"blockout-text\" data-translate-text=\"[please close the browser tab now]\"></span>\\n            <!-- /ko -->\\n        </div>\\n    </div>\\n    <div data-bind=\"widget: {kind:\\'imagePreview\\'}\"></div>\\n</section>\\n';});\n\n","\ndefine('text!widgets/imagePreview/view.html?v=1552304184357',[],function () { return '<div tabindex=\"0\" class=\"overlay-holder\" data-bind=\"fade: isVisible\">\\n    <div class=\"overlay\" data-bind=\"click:closePreview\"></div>\\n    <div class=\"center\">\\n        <div class=\"center-holder\">\\n            <div class=\"center-content\">\\n                <div class=\"image-holder\">\\n                    <div data-bind=\"imageLoader: { isLoaded: isLoaded, imageUrl: imageUrl}\">\\n                    </div>\\n                    <!--ko ifnot:isLoaded-->\\n                    <div class=\"loader-image\"></div>\\n                    <!--/ko-->\\n                </div>                \\n                <div class=\"overlay-close-button-holder\" data-bind=\"if: isLoaded\">\\n                    <a tabindex=\"0\" class=\"overlay-close-button material-icons\" data-bind=\"click: closePreview, hasFocus: isVisible, submitOnEnter, keyDown: { 27: { handler: closePreview } }\">clear</a>\\n                    <span class=\"overlay-close-button-subtext\">Esc</span>\\n                </div>\\n            </div>\\n        </div>\\n    </div>\\n</div>';});\n\n","\ndefine('text!xApi/views/xAPIError.html?v=1552304184357',[],function () { return '<section id=\"xapiError\" class=\"container xapi-error\">\\r\\n    <div class=\"error-content\">\\r\\n        <div class=\"xapi-error-container\">\\r\\n            <h1 data-translate-text=\"[tracking and tracing error]\">Something is wrong</h1>\\r\\n            <!-- ko if: allowToContinue() -->\\r\\n            <div class=\"xapi-error-container-description\" data-translate-text=\"[tracking and tracing error hint]\">If you continue without restarting, your learning progress will not be reported.</div>\\r\\n            <!-- /ko -->\\r\\n            <!-- ko ifnot: allowToContinue() -->\\r\\n            <div class=\"xapi-error-container-description\" data-translate-text=\"[tracking and tracing error hint without continue]\">Restart the course. Contact your course provider if the problem persists.</div>\\r\\n            <!-- /ko -->\\r\\n            <div class=\"xapi-error-container-buttons clearfix\">\\r\\n                <!-- ko if: allowToContinue() -->\\r\\n                <button class=\"button default large\" data-bind=\"click: continueLearning\" data-translate-text=\"[tracking and tracing continue anyway]\" data-translate-title=\"[tracking and tracing continue anyway]\">Continue anyway</button>\\r\\n                <button class=\"button primary large\" data-bind=\"click: restartCourse\" data-translate-text=\"[tracking and tracing restart course]\" data-translate-title=\"[tracking and tracing restart course]\">Restart course</button>\\r\\n\\r\\n                <!-- /ko -->\\r\\n                <!-- ko ifnot: allowToContinue() -->\\r\\n                <button class=\"button primary large\" data-bind=\"click: restartCourse\" data-translate-text=\"[tracking and tracing restart course]\" data-translate-title=\"[tracking and tracing restart course]\">Restart course</button>\\r\\n                <!-- /ko -->\\r\\n            </div>\\r\\n        </div>\\r\\n    </div>\\r\\n</section>';});\n\n"]}