/* Minification failed. Returning unminified contents.
(1941,37-38): run-time error JS1195: Expected expression: >
(1943,10-11): run-time error JS1195: Expected expression: )
(2253,83-84): run-time error JS1195: Expected expression: >
(2260,14-15): run-time error JS1195: Expected expression: )
(2261,9-10): run-time error JS1002: Syntax error: }
(2292,5-6): run-time error JS1002: Syntax error: }
(2296,49-50): run-time error JS1004: Expected ';': {
(2674,57-58): run-time error JS1195: Expected expression: .
(2674,69-70): run-time error JS1004: Expected ';': )
(2675,56-57): run-time error JS1195: Expected expression: .
(2675,67-68): run-time error JS1004: Expected ';': )
(2676,57-58): run-time error JS1195: Expected expression: .
(2676,69-70): run-time error JS1004: Expected ';': )
(2680,60-71): run-time error JS1197: Too many errors. The file might not be a JavaScript file: projectCode
(2388,9,2398,10): run-time error JS1018: 'return' statement outside of function: return {
            state: state,
            search: search,
            searching: searching,
            editCurrentBoothClick: editCurrentBoothClick,
            createNewBoothClick: createNewBoothClick,
            registration: self.registration,
            editingSelectedBooth: self.editingSelectedBooth,
            findBoothClick: findBoothClick,
            allowCreateBooth: allowCreateBooth
        }
(2284,9,2291,10): run-time error JS1018: 'return' statement outside of function: return {
            verificationCode: verificationCode,
            verifyingCode: verifyingCode,
            verifyCode: verifyCode,
            invalidCode: invalidCode,
            backToLoginClicked: backToLoginClicked,
            state: state
        }
 */
/*!
 * typeahead.js 0.11.1
 * https://github.com/twitter/typeahead.js
 * Copyright 2013-2015 Twitter, Inc. and other contributors; Licensed MIT
 */

!function(a,b){"function"==typeof define&&define.amd?define("typeahead.js",["jquery"],function(a){return b(a)}):"object"==typeof exports?module.exports=b(require("jquery")):b(jQuery)}(this,function(a){var b=function(){"use strict";return{isMsie:function(){return/(msie|trident)/i.test(navigator.userAgent)?navigator.userAgent.match(/(msie |rv:)(\d+(.\d+)?)/i)[2]:!1},isBlankString:function(a){return!a||/^\s*$/.test(a)},escapeRegExChars:function(a){return a.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")},isString:function(a){return"string"==typeof a},isNumber:function(a){return"number"==typeof a},isArray:a.isArray,isFunction:a.isFunction,isObject:a.isPlainObject,isUndefined:function(a){return"undefined"==typeof a},isElement:function(a){return!(!a||1!==a.nodeType)},isJQuery:function(b){return b instanceof a},toStr:function(a){return b.isUndefined(a)||null===a?"":a+""},bind:a.proxy,each:function(b,c){function d(a,b){return c(b,a)}a.each(b,d)},map:a.map,filter:a.grep,every:function(b,c){var d=!0;return b?(a.each(b,function(a,e){return(d=c.call(null,e,a,b))?void 0:!1}),!!d):d},some:function(b,c){var d=!1;return b?(a.each(b,function(a,e){return(d=c.call(null,e,a,b))?!1:void 0}),!!d):d},mixin:a.extend,identity:function(a){return a},clone:function(b){return a.extend(!0,{},b)},getIdGenerator:function(){var a=0;return function(){return a++}},templatify:function(b){function c(){return String(b)}return a.isFunction(b)?b:c},defer:function(a){setTimeout(a,0)},debounce:function(a,b,c){var d,e;return function(){var f,g,h=this,i=arguments;return f=function(){d=null,c||(e=a.apply(h,i))},g=c&&!d,clearTimeout(d),d=setTimeout(f,b),g&&(e=a.apply(h,i)),e}},throttle:function(a,b){var c,d,e,f,g,h;return g=0,h=function(){g=new Date,e=null,f=a.apply(c,d)},function(){var i=new Date,j=b-(i-g);return c=this,d=arguments,0>=j?(clearTimeout(e),e=null,g=i,f=a.apply(c,d)):e||(e=setTimeout(h,j)),f}},stringify:function(a){return b.isString(a)?a:JSON.stringify(a)},noop:function(){}}}(),c=function(){"use strict";function a(a){var g,h;return h=b.mixin({},f,a),g={css:e(),classes:h,html:c(h),selectors:d(h)},{css:g.css,html:g.html,classes:g.classes,selectors:g.selectors,mixin:function(a){b.mixin(a,g)}}}function c(a){return{wrapper:'<span class="'+a.wrapper+'"></span>',menu:'<div class="'+a.menu+'"></div>'}}function d(a){var c={};return b.each(a,function(a,b){c[b]="."+a}),c}function e(){var a={wrapper:{position:"relative",display:"inline-block"},hint:{position:"absolute",top:"0",left:"0",borderColor:"transparent",boxShadow:"none",opacity:"1"},input:{position:"relative",verticalAlign:"top",backgroundColor:"transparent"},inputWithNoHint:{position:"relative",verticalAlign:"top"},menu:{position:"absolute",top:"100%",left:"0",zIndex:"100",display:"none"},ltr:{left:"0",right:"auto"},rtl:{left:"auto",right:" 0"}};return b.isMsie()&&b.mixin(a.input,{backgroundImage:"url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)"}),a}var f={wrapper:"twitter-typeahead",input:"tt-input",hint:"tt-hint",menu:"tt-menu",dataset:"tt-dataset",suggestion:"tt-suggestion",selectable:"tt-selectable",empty:"tt-empty",open:"tt-open",cursor:"tt-cursor",highlight:"tt-highlight"};return a}(),d=function(){"use strict";function c(b){b&&b.el||a.error("EventBus initialized without el"),this.$el=a(b.el)}var d,e;return d="typeahead:",e={render:"rendered",cursorchange:"cursorchanged",select:"selected",autocomplete:"autocompleted"},b.mixin(c.prototype,{_trigger:function(b,c){var e;return e=a.Event(d+b),(c=c||[]).unshift(e),this.$el.trigger.apply(this.$el,c),e},before:function(a){var b,c;return b=[].slice.call(arguments,1),c=this._trigger("before"+a,b),c.isDefaultPrevented()},trigger:function(a){var b;this._trigger(a,[].slice.call(arguments,1)),(b=e[a])&&this._trigger(b,[].slice.call(arguments,1))}}),c}(),e=function(){"use strict";function a(a,b,c,d){var e;if(!c)return this;for(b=b.split(i),c=d?h(c,d):c,this._callbacks=this._callbacks||{};e=b.shift();)this._callbacks[e]=this._callbacks[e]||{sync:[],async:[]},this._callbacks[e][a].push(c);return this}function b(b,c,d){return a.call(this,"async",b,c,d)}function c(b,c,d){return a.call(this,"sync",b,c,d)}function d(a){var b;if(!this._callbacks)return this;for(a=a.split(i);b=a.shift();)delete this._callbacks[b];return this}function e(a){var b,c,d,e,g;if(!this._callbacks)return this;for(a=a.split(i),d=[].slice.call(arguments,1);(b=a.shift())&&(c=this._callbacks[b]);)e=f(c.sync,this,[b].concat(d)),g=f(c.async,this,[b].concat(d)),e()&&j(g);return this}function f(a,b,c){function d(){for(var d,e=0,f=a.length;!d&&f>e;e+=1)d=a[e].apply(b,c)===!1;return!d}return d}function g(){var a;return a=window.setImmediate?function(a){setImmediate(function(){a()})}:function(a){setTimeout(function(){a()},0)}}function h(a,b){return a.bind?a.bind(b):function(){a.apply(b,[].slice.call(arguments,0))}}var i=/\s+/,j=g();return{onSync:c,onAsync:b,off:d,trigger:e}}(),f=function(a){"use strict";function c(a,c,d){for(var e,f=[],g=0,h=a.length;h>g;g++)f.push(b.escapeRegExChars(a[g]));return e=d?"\\b("+f.join("|")+")\\b":"("+f.join("|")+")",c?new RegExp(e):new RegExp(e,"i")}var d={node:null,pattern:null,tagName:"strong",className:null,wordsOnly:!1,caseSensitive:!1};return function(e){function f(b){var c,d,f;return(c=h.exec(b.data))&&(f=a.createElement(e.tagName),e.className&&(f.className=e.className),d=b.splitText(c.index),d.splitText(c[0].length),f.appendChild(d.cloneNode(!0)),b.parentNode.replaceChild(f,d)),!!c}function g(a,b){for(var c,d=3,e=0;e<a.childNodes.length;e++)c=a.childNodes[e],c.nodeType===d?e+=b(c)?1:0:g(c,b)}var h;e=b.mixin({},d,e),e.node&&e.pattern&&(e.pattern=b.isArray(e.pattern)?e.pattern:[e.pattern],h=c(e.pattern,e.caseSensitive,e.wordsOnly),g(e.node,f))}}(window.document),g=function(){"use strict";function c(c,e){c=c||{},c.input||a.error("input is missing"),e.mixin(this),this.$hint=a(c.hint),this.$input=a(c.input),this.query=this.$input.val(),this.queryWhenFocused=this.hasFocus()?this.query:null,this.$overflowHelper=d(this.$input),this._checkLanguageDirection(),0===this.$hint.length&&(this.setHint=this.getHint=this.clearHint=this.clearHintIfInvalid=b.noop)}function d(b){return a('<pre aria-hidden="true"></pre>').css({position:"absolute",visibility:"hidden",whiteSpace:"pre",fontFamily:b.css("font-family"),fontSize:b.css("font-size"),fontStyle:b.css("font-style"),fontVariant:b.css("font-variant"),fontWeight:b.css("font-weight"),wordSpacing:b.css("word-spacing"),letterSpacing:b.css("letter-spacing"),textIndent:b.css("text-indent"),textRendering:b.css("text-rendering"),textTransform:b.css("text-transform")}).insertAfter(b)}function f(a,b){return c.normalizeQuery(a)===c.normalizeQuery(b)}function g(a){return a.altKey||a.ctrlKey||a.metaKey||a.shiftKey}var h;return h={9:"tab",27:"esc",37:"left",39:"right",13:"enter",38:"up",40:"down"},c.normalizeQuery=function(a){return b.toStr(a).replace(/^\s*/g,"").replace(/\s{2,}/g," ")},b.mixin(c.prototype,e,{_onBlur:function(){this.resetInputValue(),this.trigger("blurred")},_onFocus:function(){this.queryWhenFocused=this.query,this.trigger("focused")},_onKeydown:function(a){var b=h[a.which||a.keyCode];this._managePreventDefault(b,a),b&&this._shouldTrigger(b,a)&&this.trigger(b+"Keyed",a)},_onInput:function(){this._setQuery(this.getInputValue()),this.clearHintIfInvalid(),this._checkLanguageDirection()},_managePreventDefault:function(a,b){var c;switch(a){case"up":case"down":c=!g(b);break;default:c=!1}c&&b.preventDefault()},_shouldTrigger:function(a,b){var c;switch(a){case"tab":c=!g(b);break;default:c=!0}return c},_checkLanguageDirection:function(){var a=(this.$input.css("direction")||"ltr").toLowerCase();this.dir!==a&&(this.dir=a,this.$hint.attr("dir",a),this.trigger("langDirChanged",a))},_setQuery:function(a,b){var c,d;c=f(a,this.query),d=c?this.query.length!==a.length:!1,this.query=a,b||c?!b&&d&&this.trigger("whitespaceChanged",this.query):this.trigger("queryChanged",this.query)},bind:function(){var a,c,d,e,f=this;return a=b.bind(this._onBlur,this),c=b.bind(this._onFocus,this),d=b.bind(this._onKeydown,this),e=b.bind(this._onInput,this),this.$input.on("blur.tt",a).on("focus.tt",c).on("keydown.tt",d),!b.isMsie()||b.isMsie()>9?this.$input.on("input.tt",e):this.$input.on("keydown.tt keypress.tt cut.tt paste.tt",function(a){h[a.which||a.keyCode]||b.defer(b.bind(f._onInput,f,a))}),this},focus:function(){this.$input.focus()},blur:function(){this.$input.blur()},getLangDir:function(){return this.dir},getQuery:function(){return this.query||""},setQuery:function(a,b){this.setInputValue(a),this._setQuery(a,b)},hasQueryChangedSinceLastFocus:function(){return this.query!==this.queryWhenFocused},getInputValue:function(){return this.$input.val()},setInputValue:function(a){this.$input.val(a),this.clearHintIfInvalid(),this._checkLanguageDirection()},resetInputValue:function(){this.setInputValue(this.query)},getHint:function(){return this.$hint.val()},setHint:function(a){this.$hint.val(a)},clearHint:function(){this.setHint("")},clearHintIfInvalid:function(){var a,b,c,d;a=this.getInputValue(),b=this.getHint(),c=a!==b&&0===b.indexOf(a),d=""!==a&&c&&!this.hasOverflow(),!d&&this.clearHint()},hasFocus:function(){return this.$input.is(":focus")},hasOverflow:function(){var a=this.$input.width()-2;return this.$overflowHelper.text(this.getInputValue()),this.$overflowHelper.width()>=a},isCursorAtEnd:function(){var a,c,d;return a=this.$input.val().length,c=this.$input[0].selectionStart,b.isNumber(c)?c===a:document.selection?(d=document.selection.createRange(),d.moveStart("character",-a),a===d.text.length):!0},destroy:function(){this.$hint.off(".tt"),this.$input.off(".tt"),this.$overflowHelper.remove(),this.$hint=this.$input=this.$overflowHelper=a("<div>")}}),c}(),h=function(){"use strict";function c(c,e){c=c||{},c.templates=c.templates||{},c.templates.notFound=c.templates.notFound||c.templates.empty,c.source||a.error("missing source"),c.node||a.error("missing node"),c.name&&!h(c.name)&&a.error("invalid dataset name: "+c.name),e.mixin(this),this.highlight=!!c.highlight,this.name=c.name||j(),this.limit=c.limit||5,this.displayFn=d(c.display||c.displayKey),this.templates=g(c.templates,this.displayFn),this.source=c.source.__ttAdapter?c.source.__ttAdapter():c.source,this.async=b.isUndefined(c.async)?this.source.length>2:!!c.async,this._resetLastSuggestion(),this.$el=a(c.node).addClass(this.classes.dataset).addClass(this.classes.dataset+"-"+this.name)}function d(a){function c(b){return b[a]}return a=a||b.stringify,b.isFunction(a)?a:c}function g(c,d){function e(b){return a("<div>").text(d(b))}return{notFound:c.notFound&&b.templatify(c.notFound),pending:c.pending&&b.templatify(c.pending),header:c.header&&b.templatify(c.header),footer:c.footer&&b.templatify(c.footer),suggestion:c.suggestion||e}}function h(a){return/^[_a-zA-Z0-9-]+$/.test(a)}var i,j;return i={val:"tt-selectable-display",obj:"tt-selectable-object"},j=b.getIdGenerator(),c.extractData=function(b){var c=a(b);return c.data(i.obj)?{val:c.data(i.val)||"",obj:c.data(i.obj)||null}:null},b.mixin(c.prototype,e,{_overwrite:function(a,b){b=b||[],b.length?this._renderSuggestions(a,b):this.async&&this.templates.pending?this._renderPending(a):!this.async&&this.templates.notFound?this._renderNotFound(a):this._empty(),this.trigger("rendered",this.name,b,!1)},_append:function(a,b){b=b||[],b.length&&this.$lastSuggestion.length?this._appendSuggestions(a,b):b.length?this._renderSuggestions(a,b):!this.$lastSuggestion.length&&this.templates.notFound&&this._renderNotFound(a),this.trigger("rendered",this.name,b,!0)},_renderSuggestions:function(a,b){var c;c=this._getSuggestionsFragment(a,b),this.$lastSuggestion=c.children().last(),this.$el.html(c).prepend(this._getHeader(a,b)).append(this._getFooter(a,b))},_appendSuggestions:function(a,b){var c,d;c=this._getSuggestionsFragment(a,b),d=c.children().last(),this.$lastSuggestion.after(c),this.$lastSuggestion=d},_renderPending:function(a){var b=this.templates.pending;this._resetLastSuggestion(),b&&this.$el.html(b({query:a,dataset:this.name}))},_renderNotFound:function(a){var b=this.templates.notFound;this._resetLastSuggestion(),b&&this.$el.html(b({query:a,dataset:this.name}))},_empty:function(){this.$el.empty(),this._resetLastSuggestion()},_getSuggestionsFragment:function(c,d){var e,g=this;return e=document.createDocumentFragment(),b.each(d,function(b){var d,f;f=g._injectQuery(c,b),d=a(g.templates.suggestion(f)).data(i.obj,b).data(i.val,g.displayFn(b)).addClass(g.classes.suggestion+" "+g.classes.selectable),e.appendChild(d[0])}),this.highlight&&f({className:this.classes.highlight,node:e,pattern:c}),a(e)},_getFooter:function(a,b){return this.templates.footer?this.templates.footer({query:a,suggestions:b,dataset:this.name}):null},_getHeader:function(a,b){return this.templates.header?this.templates.header({query:a,suggestions:b,dataset:this.name}):null},_resetLastSuggestion:function(){this.$lastSuggestion=a()},_injectQuery:function(a,c){return b.isObject(c)?b.mixin({_query:a},c):c},update:function(b){function c(a){g||(g=!0,a=(a||[]).slice(0,e.limit),h=a.length,e._overwrite(b,a),h<e.limit&&e.async&&e.trigger("asyncRequested",b))}function d(c){c=c||[],!f&&h<e.limit&&(e.cancel=a.noop,h+=c.length,e._append(b,c.slice(0,e.limit-h)),e.async&&e.trigger("asyncReceived",b))}var e=this,f=!1,g=!1,h=0;this.cancel(),this.cancel=function(){f=!0,e.cancel=a.noop,e.async&&e.trigger("asyncCanceled",b)},this.source(b,c,d),!g&&c([])},cancel:a.noop,clear:function(){this._empty(),this.cancel(),this.trigger("cleared")},isEmpty:function(){return this.$el.is(":empty")},destroy:function(){this.$el=a("<div>")}}),c}(),i=function(){"use strict";function c(c,d){function e(b){var c=f.$node.find(b.node).first();return b.node=c.length?c:a("<div>").appendTo(f.$node),new h(b,d)}var f=this;c=c||{},c.node||a.error("node is required"),d.mixin(this),this.$node=a(c.node),this.query=null,this.datasets=b.map(c.datasets,e)}return b.mixin(c.prototype,e,{_onSelectableClick:function(b){this.trigger("selectableClicked",a(b.currentTarget))},_onRendered:function(a,b,c,d){this.$node.toggleClass(this.classes.empty,this._allDatasetsEmpty()),this.trigger("datasetRendered",b,c,d)},_onCleared:function(){this.$node.toggleClass(this.classes.empty,this._allDatasetsEmpty()),this.trigger("datasetCleared")},_propagate:function(){this.trigger.apply(this,arguments)},_allDatasetsEmpty:function(){function a(a){return a.isEmpty()}return b.every(this.datasets,a)},_getSelectables:function(){return this.$node.find(this.selectors.selectable)},_removeCursor:function(){var a=this.getActiveSelectable();a&&a.removeClass(this.classes.cursor)},_ensureVisible:function(a){var b,c,d,e;b=a.position().top,c=b+a.outerHeight(!0),d=this.$node.scrollTop(),e=this.$node.height()+parseInt(this.$node.css("paddingTop"),10)+parseInt(this.$node.css("paddingBottom"),10),0>b?this.$node.scrollTop(d+b):c>e&&this.$node.scrollTop(d+(c-e))},bind:function(){var a,c=this;return a=b.bind(this._onSelectableClick,this),this.$node.on("click.tt",this.selectors.selectable,a),b.each(this.datasets,function(a){a.onSync("asyncRequested",c._propagate,c).onSync("asyncCanceled",c._propagate,c).onSync("asyncReceived",c._propagate,c).onSync("rendered",c._onRendered,c).onSync("cleared",c._onCleared,c)}),this},isOpen:function(){return this.$node.hasClass(this.classes.open)},open:function(){this.$node.addClass(this.classes.open)},close:function(){this.$node.removeClass(this.classes.open),this._removeCursor()},setLanguageDirection:function(a){this.$node.attr("dir",a)},selectableRelativeToCursor:function(a){var b,c,d,e;return c=this.getActiveSelectable(),b=this._getSelectables(),d=c?b.index(c):-1,e=d+a,e=(e+1)%(b.length+1)-1,e=-1>e?b.length-1:e,-1===e?null:b.eq(e)},setCursor:function(a){this._removeCursor(),(a=a&&a.first())&&(a.addClass(this.classes.cursor),this._ensureVisible(a))},getSelectableData:function(a){return a&&a.length?h.extractData(a):null},getActiveSelectable:function(){var a=this._getSelectables().filter(this.selectors.cursor).first();return a.length?a:null},getTopSelectable:function(){var a=this._getSelectables().first();return a.length?a:null},update:function(a){function c(b){b.update(a)}var d=a!==this.query;return d&&(this.query=a,b.each(this.datasets,c)),d},empty:function(){function a(a){a.clear()}b.each(this.datasets,a),this.query=null,this.$node.addClass(this.classes.empty)},destroy:function(){function c(a){a.destroy()}this.$node.off(".tt"),this.$node=a("<div>"),b.each(this.datasets,c)}}),c}(),j=function(){"use strict";function a(){i.apply(this,[].slice.call(arguments,0))}var c=i.prototype;return b.mixin(a.prototype,i.prototype,{open:function(){return!this._allDatasetsEmpty()&&this._show(),c.open.apply(this,[].slice.call(arguments,0))},close:function(){return this._hide(),c.close.apply(this,[].slice.call(arguments,0))},_onRendered:function(){return this._allDatasetsEmpty()?this._hide():this.isOpen()&&this._show(),c._onRendered.apply(this,[].slice.call(arguments,0))},_onCleared:function(){return this._allDatasetsEmpty()?this._hide():this.isOpen()&&this._show(),c._onCleared.apply(this,[].slice.call(arguments,0))},setLanguageDirection:function(a){return this.$node.css("ltr"===a?this.css.ltr:this.css.rtl),c.setLanguageDirection.apply(this,[].slice.call(arguments,0))},_hide:function(){this.$node.hide()},_show:function(){this.$node.css("display","block")}}),a}(),k=function(){"use strict";function c(c,e){var f,g,h,i,j,k,l,m,n,o,p;c=c||{},c.input||a.error("missing input"),c.menu||a.error("missing menu"),c.eventBus||a.error("missing event bus"),e.mixin(this),this.eventBus=c.eventBus,this.minLength=b.isNumber(c.minLength)?c.minLength:1,this.input=c.input,this.menu=c.menu,this.enabled=!0,this.active=!1,this.input.hasFocus()&&this.activate(),this.dir=this.input.getLangDir(),this._hacks(),this.menu.bind().onSync("selectableClicked",this._onSelectableClicked,this).onSync("asyncRequested",this._onAsyncRequested,this).onSync("asyncCanceled",this._onAsyncCanceled,this).onSync("asyncReceived",this._onAsyncReceived,this).onSync("datasetRendered",this._onDatasetRendered,this).onSync("datasetCleared",this._onDatasetCleared,this),f=d(this,"activate","open","_onFocused"),g=d(this,"deactivate","_onBlurred"),h=d(this,"isActive","isOpen","_onEnterKeyed"),i=d(this,"isActive","isOpen","_onTabKeyed"),j=d(this,"isActive","_onEscKeyed"),k=d(this,"isActive","open","_onUpKeyed"),l=d(this,"isActive","open","_onDownKeyed"),m=d(this,"isActive","isOpen","_onLeftKeyed"),n=d(this,"isActive","isOpen","_onRightKeyed"),o=d(this,"_openIfActive","_onQueryChanged"),p=d(this,"_openIfActive","_onWhitespaceChanged"),this.input.bind().onSync("focused",f,this).onSync("blurred",g,this).onSync("enterKeyed",h,this).onSync("tabKeyed",i,this).onSync("escKeyed",j,this).onSync("upKeyed",k,this).onSync("downKeyed",l,this).onSync("leftKeyed",m,this).onSync("rightKeyed",n,this).onSync("queryChanged",o,this).onSync("whitespaceChanged",p,this).onSync("langDirChanged",this._onLangDirChanged,this)}function d(a){var c=[].slice.call(arguments,1);return function(){var d=[].slice.call(arguments);b.each(c,function(b){return a[b].apply(a,d)})}}return b.mixin(c.prototype,{_hacks:function(){var c,d;c=this.input.$input||a("<div>"),d=this.menu.$node||a("<div>"),c.on("blur.tt",function(a){var e,f,g;e=document.activeElement,f=d.is(e),g=d.has(e).length>0,b.isMsie()&&(f||g)&&(a.preventDefault(),a.stopImmediatePropagation(),b.defer(function(){c.focus()}))}),d.on("mousedown.tt",function(a){a.preventDefault()})},_onSelectableClicked:function(a,b){this.select(b)},_onDatasetCleared:function(){this._updateHint()},_onDatasetRendered:function(a,b,c,d){this._updateHint(),this.eventBus.trigger("render",c,d,b)},_onAsyncRequested:function(a,b,c){this.eventBus.trigger("asyncrequest",c,b)},_onAsyncCanceled:function(a,b,c){this.eventBus.trigger("asynccancel",c,b)},_onAsyncReceived:function(a,b,c){this.eventBus.trigger("asyncreceive",c,b)},_onFocused:function(){this._minLengthMet()&&this.menu.update(this.input.getQuery())},_onBlurred:function(){this.input.hasQueryChangedSinceLastFocus()&&this.eventBus.trigger("change",this.input.getQuery())},_onEnterKeyed:function(a,b){var c;(c=this.menu.getActiveSelectable())&&this.select(c)&&b.preventDefault()},_onTabKeyed:function(a,b){var c;(c=this.menu.getActiveSelectable())?this.select(c)&&b.preventDefault():(c=this.menu.getTopSelectable())&&this.autocomplete(c)&&b.preventDefault()},_onEscKeyed:function(){this.close()},_onUpKeyed:function(){this.moveCursor(-1)},_onDownKeyed:function(){this.moveCursor(1)},_onLeftKeyed:function(){"rtl"===this.dir&&this.input.isCursorAtEnd()&&this.autocomplete(this.menu.getTopSelectable())},_onRightKeyed:function(){"ltr"===this.dir&&this.input.isCursorAtEnd()&&this.autocomplete(this.menu.getTopSelectable())},_onQueryChanged:function(a,b){this._minLengthMet(b)?this.menu.update(b):this.menu.empty()},_onWhitespaceChanged:function(){this._updateHint()},_onLangDirChanged:function(a,b){this.dir!==b&&(this.dir=b,this.menu.setLanguageDirection(b))},_openIfActive:function(){this.isActive()&&this.open()},_minLengthMet:function(a){return a=b.isString(a)?a:this.input.getQuery()||"",a.length>=this.minLength},_updateHint:function(){var a,c,d,e,f,h,i;a=this.menu.getTopSelectable(),c=this.menu.getSelectableData(a),d=this.input.getInputValue(),!c||b.isBlankString(d)||this.input.hasOverflow()?this.input.clearHint():(e=g.normalizeQuery(d),f=b.escapeRegExChars(e),h=new RegExp("^(?:"+f+")(.+$)","i"),i=h.exec(c.val),i&&this.input.setHint(d+i[1]))},isEnabled:function(){return this.enabled},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},isActive:function(){return this.active},activate:function(){return this.isActive()?!0:!this.isEnabled()||this.eventBus.before("active")?!1:(this.active=!0,this.eventBus.trigger("active"),!0)},deactivate:function(){return this.isActive()?this.eventBus.before("idle")?!1:(this.active=!1,this.close(),this.eventBus.trigger("idle"),!0):!0},isOpen:function(){return this.menu.isOpen()},open:function(){return this.isOpen()||this.eventBus.before("open")||(this.menu.open(),this._updateHint(),this.eventBus.trigger("open")),this.isOpen()},close:function(){return this.isOpen()&&!this.eventBus.before("close")&&(this.menu.close(),this.input.clearHint(),this.input.resetInputValue(),this.eventBus.trigger("close")),!this.isOpen()},setVal:function(a){this.input.setQuery(b.toStr(a))},getVal:function(){return this.input.getQuery()},select:function(a){var b=this.menu.getSelectableData(a);return b&&!this.eventBus.before("select",b.obj)?(this.input.setQuery(b.val,!0),this.eventBus.trigger("select",b.obj),this.close(),!0):!1},autocomplete:function(a){var b,c,d;return b=this.input.getQuery(),c=this.menu.getSelectableData(a),d=c&&b!==c.val,d&&!this.eventBus.before("autocomplete",c.obj)?(this.input.setQuery(c.val),this.eventBus.trigger("autocomplete",c.obj),!0):!1},moveCursor:function(a){var b,c,d,e,f;return b=this.input.getQuery(),c=this.menu.selectableRelativeToCursor(a),d=this.menu.getSelectableData(c),e=d?d.obj:null,f=this._minLengthMet()&&this.menu.update(b),f||this.eventBus.before("cursorchange",e)?!1:(this.menu.setCursor(c),d?this.input.setInputValue(d.val):(this.input.resetInputValue(),this._updateHint()),this.eventBus.trigger("cursorchange",e),!0)},destroy:function(){this.input.destroy(),this.menu.destroy()}}),c}();!function(){"use strict";function e(b,c){b.each(function(){var b,d=a(this);(b=d.data(p.typeahead))&&c(b,d)})}function f(a,b){return a.clone().addClass(b.classes.hint).removeData().css(b.css.hint).css(l(a)).prop("readonly",!0).removeAttr("id name placeholder required").attr({autocomplete:"off",spellcheck:"false",tabindex:-1})}function h(a,b){a.data(p.attrs,{dir:a.attr("dir"),autocomplete:a.attr("autocomplete"),spellcheck:a.attr("spellcheck"),style:a.attr("style")}),a.addClass(b.classes.input).attr({autocomplete:"off",spellcheck:!1});try{!a.attr("dir")&&a.attr("dir","auto")}catch(c){}return a}function l(a){return{backgroundAttachment:a.css("background-attachment"),backgroundClip:a.css("background-clip"),backgroundColor:a.css("background-color"),backgroundImage:a.css("background-image"),backgroundOrigin:a.css("background-origin"),backgroundPosition:a.css("background-position"),backgroundRepeat:a.css("background-repeat"),backgroundSize:a.css("background-size")}}function m(a){var c,d;c=a.data(p.www),d=a.parent().filter(c.selectors.wrapper),b.each(a.data(p.attrs),function(c,d){b.isUndefined(c)?a.removeAttr(d):a.attr(d,c)}),a.removeData(p.typeahead).removeData(p.www).removeData(p.attr).removeClass(c.classes.input),d.length&&(a.detach().insertAfter(d),d.remove())}function n(c){var d,e;return d=b.isJQuery(c)||b.isElement(c),e=d?a(c).first():[],e.length?e:null}var o,p,q;o=a.fn.typeahead,p={www:"tt-www",attrs:"tt-attrs",typeahead:"tt-typeahead"},q={initialize:function(e,l){function m(){var c,m,q,r,s,t,u,v,w,x,y;b.each(l,function(a){a.highlight=!!e.highlight}),c=a(this),m=a(o.html.wrapper),q=n(e.hint),r=n(e.menu),s=e.hint!==!1&&!q,t=e.menu!==!1&&!r,s&&(q=f(c,o)),t&&(r=a(o.html.menu).css(o.css.menu)),q&&q.val(""),c=h(c,o),(s||t)&&(m.css(o.css.wrapper),c.css(s?o.css.input:o.css.inputWithNoHint),c.wrap(m).parent().prepend(s?q:null).append(t?r:null)),y=t?j:i,u=new d({el:c}),v=new g({hint:q,input:c},o),w=new y({node:r,datasets:l},o),x=new k({input:v,menu:w,eventBus:u,minLength:e.minLength},o),c.data(p.www,o),c.data(p.typeahead,x)}var o;return l=b.isArray(l)?l:[].slice.call(arguments,1),e=e||{},o=c(e.classNames),this.each(m)},isEnabled:function(){var a;return e(this.first(),function(b){a=b.isEnabled()}),a},enable:function(){return e(this,function(a){a.enable()}),this},disable:function(){return e(this,function(a){a.disable()}),this},isActive:function(){var a;return e(this.first(),function(b){a=b.isActive()}),a},activate:function(){return e(this,function(a){a.activate()}),this},deactivate:function(){return e(this,function(a){a.deactivate()}),this},isOpen:function(){var a;return e(this.first(),function(b){a=b.isOpen()}),a},open:function(){return e(this,function(a){a.open()}),this},close:function(){return e(this,function(a){a.close()}),this},select:function(b){var c=!1,d=a(b);return e(this.first(),function(a){c=a.select(d)}),c},autocomplete:function(b){var c=!1,d=a(b);return e(this.first(),function(a){c=a.autocomplete(d)}),c},moveCursor:function(a){var b=!1;return e(this.first(),function(c){b=c.moveCursor(a)}),b},val:function(a){var b;return arguments.length?(e(this,function(b){b.setVal(a)}),this):(e(this.first(),function(a){b=a.getVal()}),b)},destroy:function(){return e(this,function(a,b){m(b),a.destroy()}),this}},a.fn.typeahead=function(a){return q[a]?q[a].apply(this,[].slice.call(arguments,1)):q.initialize.apply(this,arguments)},a.fn.typeahead.noConflict=function(){return a.fn.typeahead=o,this}}()});;
var companyService = (function () {
    function getShowInstanceCompany(showInstanceId, onSuccess) {
        $.ajax({
            url: "/api/companies/getShowInstanceCompany",
            data: {
                showInstanceId: showInstanceId
            },
            dataType: 'json',
            type: 'get',
            cache: false,
            success: onSuccess,
            error: function (request, status, thrown) {
                console.log(thrown);
            }
        });
    }

    function getNonExclusiveCompanies(onSuccess) {
        $.ajax({
            url: "/api/companies/GetNonExclusive",
            dataType: 'json',
            type: 'get',
            cache: false,
            success: onSuccess,
            error: function (request, status, thrown) {
                console.log(thrown);
            }
        });
    }

    function getActiveCompany(onSuccess) {
        $.ajax({
            url: "/api/companies/active",
            dataType: 'json',
            type: 'get',
            cache: false,
            success: onSuccess,
            error: function (request, status, thrown) {
                console.log(thrown);
            }
        });
    }

    return {
        getActiveCompany: getActiveCompany,
        getNonExclusiveCompanies: getNonExclusiveCompanies,
        getShowInstanceCompany: getShowInstanceCompany
    };
})();;
var fileLibraryService = (function () {

    function uploadUserFile(showInstanceId, boothNumber, description, fileCategoryId, fileTypeId, file, callback) {
        var data = new FormData();
        data.append("file", file);
        data.append("fileName", file.name);
        data.append("showInstanceId", showInstanceId);
        data.append("boothNumber", boothNumber);
        data.append("description", description);
        data.append("categoryId", fileCategoryId);
        data.append("typeId", fileTypeId);

        $.ajax({
            url: "/api/fileLibrary/UploadUserFile",
            type: "POST",
            enctype: 'multipart/form-data',
            data: data,
            processData: false,
            contentType: false,
            cache: false,
            timeout: 600000,
            success: callback,
            error: function (request, status, thrown) {
                console.log(thrown);
            }
        });
    }

    function getLookups(projectCode, callback) {
        $.ajax({
            url: "/api/fileLibrary/Lookups",
            data: {
                projectCode: projectCode
            },
            dataType: 'json',
            type: 'get',
            cache: false,
            success: callback,
            error: function (request, status, thrown) {
                console.log(thrown);
            }
        });
    }

    function saveUserFileHistoryChanges(modifiedUserFiles, callback) {
        $.ajax({
            url: "/api/fileLibrary/SaveUserFileHistoryChanges",
            data: {
                ModifiedUserFiles: modifiedUserFiles
            },
            dataType: 'json',
            type: 'post',
            cache: false,
            success: callback,
            error: function (request, status, thrown) {
                console.log(thrown);
            }
        });
    }

    return {
        saveUserFileHistoryChanges: saveUserFileHistoryChanges,
        uploadUserFile: uploadUserFile,
        getLookups: getLookups
    };
})();
;
var showInstanceService = (function () {

    function getActiveShowInstance(onSuccess) {
        var pathName = $(location).attr('pathname');
        var pathNameArr = pathName.split('/');
        var projectCode = pathNameArr[1];
    
        if (pathNameArr.length >= 4) {
            if (pathNameArr[2] == "thankyou")
                projectCode = pathNameArr[3] == "Error" ? null : pathNameArr[3];
        }

        //No need to call back to the server if on the dashboard or company specific dashboard (ie no project code or the first argument is a 'c', ie c/US, c/UK etc..
        if (projectCode && projectCode != 'c') {
            $.ajax({
                url: "/api/showinstances/GetShowInstanceByProjectCode",
                data: {
                    projectCode: projectCode
                },
                dataType: 'json',
                type: 'get',
                cache: false,
                success: onSuccess,
                error: function (request, status, thrown) {
                    console.log(thrown);
                }
            });
        } else {
            //No project code deteced from the browser, just report the show instance is undefined
            onSuccess(undefined);
        }
    }

    function getActiveShowContent(onSuccess) {
        var pathName = $(location).attr('pathname');
        var pathNameArr = pathName.split('/');
        var projectCode = pathNameArr[1];

        $.ajax({
            url: "/api/showinstances/GetContent",
            data: {
                projectCode: projectCode,
                contentType: 1
            },
            dataType: 'json',
            type: 'get',
        })
        .done(onSuccess)
        .fail(function (request, status, thrown) {
            console.log(thrown);
        });
    }

    function getShowsByCompany(companyId, includePastShows, onSuccess) {
        $.ajax({
            url: "/api/shows/ShowsByCompany",
            data: {
                companyId: companyId,
                includePast: includePastShows
            },
            dataType: 'json',
            type: 'get',
        })
        .done(onSuccess)
        .fail(function (request, status, thrown) {
            console.log(thrown);
        });
    }

    return {
        getActiveShowInstance: getActiveShowInstance,
        getActiveShowContent: getActiveShowContent,
        getShowsByCompany: getShowsByCompany
    };
})();
;
var userService = (function () {
    function getCurrentUser(onSuccess) {
        var pathName = $(location).attr('pathname');
        var pathNameArr = pathName.split('/');
        var projectCode = pathNameArr[1];

        $.ajax({
            url: "/api/userinformation/GetCurrentUser",
            dataType: 'json',
            type: 'get',
            cache: false,
            success: onSuccess,
            error: function (request, status, thrown) {
                console.log(thrown);
            }
        });
    }

    function login(username, password, projectCode, onSuccess) {
        $.ajax({
            url: '/api/Accounts/Authenticate',
            dataType: 'json',
            type: 'post',
            data: {
                Username: username,
                Password: password,
                ProjectCode: projectCode
            },
            success: onSuccess,
            error: function (request, status, thrown) {
                window.alert(formatAjaxError(request, status, thrown));
            },
            done: function () {
            }
        });
    }

    function userMustChangePassword(username, onSuccess) {
        $.ajax({
            url: '/api/UserInformation/UserMustChangePassword',
            dataType: 'json',
            type: 'get',
            data: {
                username: username,
                
            },
            success: onSuccess,
            error: function (request, status, thrown) {
                console.log(formatAjaxError(request, status, thrown));
            },
            done: function () {
            }
        });
    }

    function verifyCode(username, code, onSuccess) {
        $.ajax({
            url: '/api/Accounts/VerifyCode',
            dataType: 'json',
            type: 'put',
            data: {
                username: username,
                code: code
            },
            success: onSuccess,
            error: function (request, status, thrown) {
                console.log(formatAjaxError(request, status, thrown));
            },
            done: function () {
            }
        });
    }

    function sendMultiFactorAuthenticationCode(username, projectCode, onSuccess) {
        $.ajax({
            url: '/api/Accounts/sendMultiFactorAuthenticationCode',
            dataType: 'json',
            type: 'post',
            data: {
                username: username,
                projectCode: projectCode
            },
            success: onSuccess,
            error: function (request, status, thrown) {
                console.log(formatAjaxError(request, status, thrown));
            },
            done: function () {
            }
        });
    }

    function getDelegateUserEmail(registrationChecklistTaskId, onSuccess) {
        $.ajax({
            url: '/api/UserInformation/getDelegateUserEmail',
            dataType: 'json',
            type: 'get',
            data: {
                registrationChecklistTaskId: registrationChecklistTaskId
            }
        })
        .done(onSuccess)
    }

    function createAccount(username, password, email, phone, mfaOptIn, onSuccess) {
        $.ajax({
            url: '/api/Accounts/RegisterNewAccount',
            dataType: 'json',
            type: 'post',
            data: {
                UserLogonName: username,
                Password: password,
                EmailAddress: email,
                CompanyPhone: phone,
                ContactPhone: phone,
                MFAOptIn: mfaOptIn
            },
            success: function (data) {
                onSuccess(data);
            },
            error: function (request, status, thrown) {
            }
        });
    }

    function resetPassword(email, onSuccess) {
        $.ajax({
            url: '/api/Accounts/RequestPasswordReset',
            dataType: 'json',
            type: 'get',
            data: {
                EmailAddress: email
            },
            success: function (data) {
                onSuccess(data);
            },
            error: function (request, status, thrown) {
            }
        });
    }

    function sendEmailConfirmationLink(username, email, onSuccess) {
        $.ajax({
            url: '/api/accounts/SendEmailConfirmationLink',
            dataType: 'json',
            type: 'get',
            data: {
                username: username,
                email: email
            },
            success: function (data) {
                onSuccess(data);
            },
            error: function (request, status, thrown) {
            }
        });
    }

    function searchUsers(criteria, onSuccess) {
        $.ajax({
            url: '/Account/SearchForUser',
            dataType: 'json',
            type: 'get',
            data: {
                criteria: criteria
            },
            success: function (data) {
                onSuccess(data);
            },
            error: function (request, status, thrown) {
            }
        });
    }

    function impersonate(username, onSuccess) {
        $.ajax({
            url: '/Account/Impersonate',
            dataType: 'json',
            type: 'post',
            data: {
                ImpersonateUserName: username
            },
            success: function (data) {
                onSuccess(data);
            },
            error: function (request, status, thrown) {
            }
        });
    }


    return {
        login: login,
        getCurrentUser: getCurrentUser,
        userMustChangePassword: userMustChangePassword,
        createAccount: createAccount,
        resetPassword: resetPassword,
        getDelegateUserEmail: getDelegateUserEmail,
        sendEmailConfirmationLink: sendEmailConfirmationLink,
        searchUsers: searchUsers,
        impersonate: impersonate,
        sendMultiFactorAuthenticationCode: sendMultiFactorAuthenticationCode,
        verifyCode: verifyCode
    };
})();;
/*!
 * Knockout JavaScript library v3.5.1
 * (c) The Knockout.js team - http://knockoutjs.com/
 * License: MIT (http://www.opensource.org/licenses/mit-license.php)
 */

(function() {(function(n){var A=this||(0,eval)("this"),w=A.document,R=A.navigator,v=A.jQuery,H=A.JSON;v||"undefined"===typeof jQuery||(v=jQuery);(function(n){"function"===typeof define&&define.amd?define(["exports","require"],n):"object"===typeof exports&&"object"===typeof module?n(module.exports||exports):n(A.ko={})})(function(S,T){function K(a,c){return null===a||typeof a in W?a===c:!1}function X(b,c){var d;return function(){d||(d=a.a.setTimeout(function(){d=n;b()},c))}}function Y(b,c){var d;return function(){clearTimeout(d);
d=a.a.setTimeout(b,c)}}function Z(a,c){c&&"change"!==c?"beforeChange"===c?this.pc(a):this.gb(a,c):this.qc(a)}function aa(a,c){null!==c&&c.s&&c.s()}function ba(a,c){var d=this.qd,e=d[r];e.ra||(this.Qb&&this.mb[c]?(d.uc(c,a,this.mb[c]),this.mb[c]=null,--this.Qb):e.I[c]||d.uc(c,a,e.J?{da:a}:d.$c(a)),a.Ja&&a.gd())}var a="undefined"!==typeof S?S:{};a.b=function(b,c){for(var d=b.split("."),e=a,f=0;f<d.length-1;f++)e=e[d[f]];e[d[d.length-1]]=c};a.L=function(a,c,d){a[c]=d};a.version="3.5.1";a.b("version",
a.version);a.options={deferUpdates:!1,useOnlyNativeEvents:!1,foreachHidesDestroyed:!1};a.a=function(){function b(a,b){for(var c in a)f.call(a,c)&&b(c,a[c])}function c(a,b){if(b)for(var c in b)f.call(b,c)&&(a[c]=b[c]);return a}function d(a,b){a.__proto__=b;return a}function e(b,c,d,e){var l=b[c].match(q)||[];a.a.D(d.match(q),function(b){a.a.Na(l,b,e)});b[c]=l.join(" ")}var f=Object.prototype.hasOwnProperty,g={__proto__:[]}instanceof Array,h="function"===typeof Symbol,m={},k={};m[R&&/Firefox\/2/i.test(R.userAgent)?
"KeyboardEvent":"UIEvents"]=["keyup","keydown","keypress"];m.MouseEvents="click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave".split(" ");b(m,function(a,b){if(b.length)for(var c=0,d=b.length;c<d;c++)k[b[c]]=a});var l={propertychange:!0},p=w&&function(){for(var a=3,b=w.createElement("div"),c=b.getElementsByTagName("i");b.innerHTML="\x3c!--[if gt IE "+ ++a+"]><i></i><![endif]--\x3e",c[0];);return 4<a?a:n}(),q=/\S+/g,t;return{Jc:["authenticity_token",/^__RequestVerificationToken(_.*)?$/],
D:function(a,b,c){for(var d=0,e=a.length;d<e;d++)b.call(c,a[d],d,a)},A:"function"==typeof Array.prototype.indexOf?function(a,b){return Array.prototype.indexOf.call(a,b)}:function(a,b){for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return c;return-1},Lb:function(a,b,c){for(var d=0,e=a.length;d<e;d++)if(b.call(c,a[d],d,a))return a[d];return n},Pa:function(b,c){var d=a.a.A(b,c);0<d?b.splice(d,1):0===d&&b.shift()},wc:function(b){var c=[];b&&a.a.D(b,function(b){0>a.a.A(c,b)&&c.push(b)});return c},Mb:function(a,
b,c){var d=[];if(a)for(var e=0,l=a.length;e<l;e++)d.push(b.call(c,a[e],e));return d},jb:function(a,b,c){var d=[];if(a)for(var e=0,l=a.length;e<l;e++)b.call(c,a[e],e)&&d.push(a[e]);return d},Nb:function(a,b){if(b instanceof Array)a.push.apply(a,b);else for(var c=0,d=b.length;c<d;c++)a.push(b[c]);return a},Na:function(b,c,d){var e=a.a.A(a.a.bc(b),c);0>e?d&&b.push(c):d||b.splice(e,1)},Ba:g,extend:c,setPrototypeOf:d,Ab:g?d:c,P:b,Ga:function(a,b,c){if(!a)return a;var d={},e;for(e in a)f.call(a,e)&&(d[e]=
b.call(c,a[e],e,a));return d},Tb:function(b){for(;b.firstChild;)a.removeNode(b.firstChild)},Yb:function(b){b=a.a.la(b);for(var c=(b[0]&&b[0].ownerDocument||w).createElement("div"),d=0,e=b.length;d<e;d++)c.appendChild(a.oa(b[d]));return c},Ca:function(b,c){for(var d=0,e=b.length,l=[];d<e;d++){var k=b[d].cloneNode(!0);l.push(c?a.oa(k):k)}return l},va:function(b,c){a.a.Tb(b);if(c)for(var d=0,e=c.length;d<e;d++)b.appendChild(c[d])},Xc:function(b,c){var d=b.nodeType?[b]:b;if(0<d.length){for(var e=d[0],
l=e.parentNode,k=0,f=c.length;k<f;k++)l.insertBefore(c[k],e);k=0;for(f=d.length;k<f;k++)a.removeNode(d[k])}},Ua:function(a,b){if(a.length){for(b=8===b.nodeType&&b.parentNode||b;a.length&&a[0].parentNode!==b;)a.splice(0,1);for(;1<a.length&&a[a.length-1].parentNode!==b;)a.length--;if(1<a.length){var c=a[0],d=a[a.length-1];for(a.length=0;c!==d;)a.push(c),c=c.nextSibling;a.push(d)}}return a},Zc:function(a,b){7>p?a.setAttribute("selected",b):a.selected=b},Db:function(a){return null===a||a===n?"":a.trim?
a.trim():a.toString().replace(/^[\s\xa0]+|[\s\xa0]+$/g,"")},Ud:function(a,b){a=a||"";return b.length>a.length?!1:a.substring(0,b.length)===b},vd:function(a,b){if(a===b)return!0;if(11===a.nodeType)return!1;if(b.contains)return b.contains(1!==a.nodeType?a.parentNode:a);if(b.compareDocumentPosition)return 16==(b.compareDocumentPosition(a)&16);for(;a&&a!=b;)a=a.parentNode;return!!a},Sb:function(b){return a.a.vd(b,b.ownerDocument.documentElement)},kd:function(b){return!!a.a.Lb(b,a.a.Sb)},R:function(a){return a&&
a.tagName&&a.tagName.toLowerCase()},Ac:function(b){return a.onError?function(){try{return b.apply(this,arguments)}catch(c){throw a.onError&&a.onError(c),c;}}:b},setTimeout:function(b,c){return setTimeout(a.a.Ac(b),c)},Gc:function(b){setTimeout(function(){a.onError&&a.onError(b);throw b;},0)},B:function(b,c,d){var e=a.a.Ac(d);d=l[c];if(a.options.useOnlyNativeEvents||d||!v)if(d||"function"!=typeof b.addEventListener)if("undefined"!=typeof b.attachEvent){var k=function(a){e.call(b,a)},f="on"+c;b.attachEvent(f,
k);a.a.K.za(b,function(){b.detachEvent(f,k)})}else throw Error("Browser doesn't support addEventListener or attachEvent");else b.addEventListener(c,e,!1);else t||(t="function"==typeof v(b).on?"on":"bind"),v(b)[t](c,e)},Fb:function(b,c){if(!b||!b.nodeType)throw Error("element must be a DOM node when calling triggerEvent");var d;"input"===a.a.R(b)&&b.type&&"click"==c.toLowerCase()?(d=b.type,d="checkbox"==d||"radio"==d):d=!1;if(a.options.useOnlyNativeEvents||!v||d)if("function"==typeof w.createEvent)if("function"==
typeof b.dispatchEvent)d=w.createEvent(k[c]||"HTMLEvents"),d.initEvent(c,!0,!0,A,0,0,0,0,0,!1,!1,!1,!1,0,b),b.dispatchEvent(d);else throw Error("The supplied element doesn't support dispatchEvent");else if(d&&b.click)b.click();else if("undefined"!=typeof b.fireEvent)b.fireEvent("on"+c);else throw Error("Browser doesn't support triggering events");else v(b).trigger(c)},f:function(b){return a.O(b)?b():b},bc:function(b){return a.O(b)?b.v():b},Eb:function(b,c,d){var l;c&&("object"===typeof b.classList?
(l=b.classList[d?"add":"remove"],a.a.D(c.match(q),function(a){l.call(b.classList,a)})):"string"===typeof b.className.baseVal?e(b.className,"baseVal",c,d):e(b,"className",c,d))},Bb:function(b,c){var d=a.a.f(c);if(null===d||d===n)d="";var e=a.h.firstChild(b);!e||3!=e.nodeType||a.h.nextSibling(e)?a.h.va(b,[b.ownerDocument.createTextNode(d)]):e.data=d;a.a.Ad(b)},Yc:function(a,b){a.name=b;if(7>=p)try{var c=a.name.replace(/[&<>'"]/g,function(a){return"&#"+a.charCodeAt(0)+";"});a.mergeAttributes(w.createElement("<input name='"+
c+"'/>"),!1)}catch(d){}},Ad:function(a){9<=p&&(a=1==a.nodeType?a:a.parentNode,a.style&&(a.style.zoom=a.style.zoom))},wd:function(a){if(p){var b=a.style.width;a.style.width=0;a.style.width=b}},Pd:function(b,c){b=a.a.f(b);c=a.a.f(c);for(var d=[],e=b;e<=c;e++)d.push(e);return d},la:function(a){for(var b=[],c=0,d=a.length;c<d;c++)b.push(a[c]);return b},Da:function(a){return h?Symbol(a):a},Zd:6===p,$d:7===p,W:p,Lc:function(b,c){for(var d=a.a.la(b.getElementsByTagName("input")).concat(a.a.la(b.getElementsByTagName("textarea"))),
e="string"==typeof c?function(a){return a.name===c}:function(a){return c.test(a.name)},l=[],k=d.length-1;0<=k;k--)e(d[k])&&l.push(d[k]);return l},Nd:function(b){return"string"==typeof b&&(b=a.a.Db(b))?H&&H.parse?H.parse(b):(new Function("return "+b))():null},hc:function(b,c,d){if(!H||!H.stringify)throw Error("Cannot find JSON.stringify(). Some browsers (e.g., IE < 8) don't support it natively, but you can overcome this by adding a script reference to json2.js, downloadable from http://www.json.org/json2.js");
return H.stringify(a.a.f(b),c,d)},Od:function(c,d,e){e=e||{};var l=e.params||{},k=e.includeFields||this.Jc,f=c;if("object"==typeof c&&"form"===a.a.R(c))for(var f=c.action,h=k.length-1;0<=h;h--)for(var g=a.a.Lc(c,k[h]),m=g.length-1;0<=m;m--)l[g[m].name]=g[m].value;d=a.a.f(d);var p=w.createElement("form");p.style.display="none";p.action=f;p.method="post";for(var q in d)c=w.createElement("input"),c.type="hidden",c.name=q,c.value=a.a.hc(a.a.f(d[q])),p.appendChild(c);b(l,function(a,b){var c=w.createElement("input");
c.type="hidden";c.name=a;c.value=b;p.appendChild(c)});w.body.appendChild(p);e.submitter?e.submitter(p):p.submit();setTimeout(function(){p.parentNode.removeChild(p)},0)}}}();a.b("utils",a.a);a.b("utils.arrayForEach",a.a.D);a.b("utils.arrayFirst",a.a.Lb);a.b("utils.arrayFilter",a.a.jb);a.b("utils.arrayGetDistinctValues",a.a.wc);a.b("utils.arrayIndexOf",a.a.A);a.b("utils.arrayMap",a.a.Mb);a.b("utils.arrayPushAll",a.a.Nb);a.b("utils.arrayRemoveItem",a.a.Pa);a.b("utils.cloneNodes",a.a.Ca);a.b("utils.createSymbolOrString",
a.a.Da);a.b("utils.extend",a.a.extend);a.b("utils.fieldsIncludedWithJsonPost",a.a.Jc);a.b("utils.getFormFields",a.a.Lc);a.b("utils.objectMap",a.a.Ga);a.b("utils.peekObservable",a.a.bc);a.b("utils.postJson",a.a.Od);a.b("utils.parseJson",a.a.Nd);a.b("utils.registerEventHandler",a.a.B);a.b("utils.stringifyJson",a.a.hc);a.b("utils.range",a.a.Pd);a.b("utils.toggleDomNodeCssClass",a.a.Eb);a.b("utils.triggerEvent",a.a.Fb);a.b("utils.unwrapObservable",a.a.f);a.b("utils.objectForEach",a.a.P);a.b("utils.addOrRemoveItem",
a.a.Na);a.b("utils.setTextContent",a.a.Bb);a.b("unwrap",a.a.f);Function.prototype.bind||(Function.prototype.bind=function(a){var c=this;if(1===arguments.length)return function(){return c.apply(a,arguments)};var d=Array.prototype.slice.call(arguments,1);return function(){var e=d.slice(0);e.push.apply(e,arguments);return c.apply(a,e)}});a.a.g=new function(){var b=0,c="__ko__"+(new Date).getTime(),d={},e,f;a.a.W?(e=function(a,e){var f=a[c];if(!f||"null"===f||!d[f]){if(!e)return n;f=a[c]="ko"+b++;d[f]=
{}}return d[f]},f=function(a){var b=a[c];return b?(delete d[b],a[c]=null,!0):!1}):(e=function(a,b){var d=a[c];!d&&b&&(d=a[c]={});return d},f=function(a){return a[c]?(delete a[c],!0):!1});return{get:function(a,b){var c=e(a,!1);return c&&c[b]},set:function(a,b,c){(a=e(a,c!==n))&&(a[b]=c)},Ub:function(a,b,c){a=e(a,!0);return a[b]||(a[b]=c)},clear:f,Z:function(){return b++ +c}}};a.b("utils.domData",a.a.g);a.b("utils.domData.clear",a.a.g.clear);a.a.K=new function(){function b(b,c){var d=a.a.g.get(b,e);
d===n&&c&&(d=[],a.a.g.set(b,e,d));return d}function c(c){var e=b(c,!1);if(e)for(var e=e.slice(0),k=0;k<e.length;k++)e[k](c);a.a.g.clear(c);a.a.K.cleanExternalData(c);g[c.nodeType]&&d(c.childNodes,!0)}function d(b,d){for(var e=[],l,f=0;f<b.length;f++)if(!d||8===b[f].nodeType)if(c(e[e.length]=l=b[f]),b[f]!==l)for(;f--&&-1==a.a.A(e,b[f]););}var e=a.a.g.Z(),f={1:!0,8:!0,9:!0},g={1:!0,9:!0};return{za:function(a,c){if("function"!=typeof c)throw Error("Callback must be a function");b(a,!0).push(c)},yb:function(c,
d){var f=b(c,!1);f&&(a.a.Pa(f,d),0==f.length&&a.a.g.set(c,e,n))},oa:function(b){a.u.G(function(){f[b.nodeType]&&(c(b),g[b.nodeType]&&d(b.getElementsByTagName("*")))});return b},removeNode:function(b){a.oa(b);b.parentNode&&b.parentNode.removeChild(b)},cleanExternalData:function(a){v&&"function"==typeof v.cleanData&&v.cleanData([a])}}};a.oa=a.a.K.oa;a.removeNode=a.a.K.removeNode;a.b("cleanNode",a.oa);a.b("removeNode",a.removeNode);a.b("utils.domNodeDisposal",a.a.K);a.b("utils.domNodeDisposal.addDisposeCallback",
a.a.K.za);a.b("utils.domNodeDisposal.removeDisposeCallback",a.a.K.yb);(function(){var b=[0,"",""],c=[1,"<table>","</table>"],d=[3,"<table><tbody><tr>","</tr></tbody></table>"],e=[1,"<select multiple='multiple'>","</select>"],f={thead:c,tbody:c,tfoot:c,tr:[2,"<table><tbody>","</tbody></table>"],td:d,th:d,option:e,optgroup:e},g=8>=a.a.W;a.a.ua=function(c,d){var e;if(v)if(v.parseHTML)e=v.parseHTML(c,d)||[];else{if((e=v.clean([c],d))&&e[0]){for(var l=e[0];l.parentNode&&11!==l.parentNode.nodeType;)l=l.parentNode;
l.parentNode&&l.parentNode.removeChild(l)}}else{(e=d)||(e=w);var l=e.parentWindow||e.defaultView||A,p=a.a.Db(c).toLowerCase(),q=e.createElement("div"),t;t=(p=p.match(/^(?:\x3c!--.*?--\x3e\s*?)*?<([a-z]+)[\s>]/))&&f[p[1]]||b;p=t[0];t="ignored<div>"+t[1]+c+t[2]+"</div>";"function"==typeof l.innerShiv?q.appendChild(l.innerShiv(t)):(g&&e.body.appendChild(q),q.innerHTML=t,g&&q.parentNode.removeChild(q));for(;p--;)q=q.lastChild;e=a.a.la(q.lastChild.childNodes)}return e};a.a.Md=function(b,c){var d=a.a.ua(b,
c);return d.length&&d[0].parentElement||a.a.Yb(d)};a.a.fc=function(b,c){a.a.Tb(b);c=a.a.f(c);if(null!==c&&c!==n)if("string"!=typeof c&&(c=c.toString()),v)v(b).html(c);else for(var d=a.a.ua(c,b.ownerDocument),e=0;e<d.length;e++)b.appendChild(d[e])}})();a.b("utils.parseHtmlFragment",a.a.ua);a.b("utils.setHtml",a.a.fc);a.aa=function(){function b(c,e){if(c)if(8==c.nodeType){var f=a.aa.Uc(c.nodeValue);null!=f&&e.push({ud:c,Kd:f})}else if(1==c.nodeType)for(var f=0,g=c.childNodes,h=g.length;f<h;f++)b(g[f],
e)}var c={};return{Xb:function(a){if("function"!=typeof a)throw Error("You can only pass a function to ko.memoization.memoize()");var b=(4294967296*(1+Math.random())|0).toString(16).substring(1)+(4294967296*(1+Math.random())|0).toString(16).substring(1);c[b]=a;return"\x3c!--[ko_memo:"+b+"]--\x3e"},bd:function(a,b){var f=c[a];if(f===n)throw Error("Couldn't find any memo with ID "+a+". Perhaps it's already been unmemoized.");try{return f.apply(null,b||[]),!0}finally{delete c[a]}},cd:function(c,e){var f=
[];b(c,f);for(var g=0,h=f.length;g<h;g++){var m=f[g].ud,k=[m];e&&a.a.Nb(k,e);a.aa.bd(f[g].Kd,k);m.nodeValue="";m.parentNode&&m.parentNode.removeChild(m)}},Uc:function(a){return(a=a.match(/^\[ko_memo\:(.*?)\]$/))?a[1]:null}}}();a.b("memoization",a.aa);a.b("memoization.memoize",a.aa.Xb);a.b("memoization.unmemoize",a.aa.bd);a.b("memoization.parseMemoText",a.aa.Uc);a.b("memoization.unmemoizeDomNodeAndDescendants",a.aa.cd);a.na=function(){function b(){if(f)for(var b=f,c=0,d;h<f;)if(d=e[h++]){if(h>b){if(5E3<=
++c){h=f;a.a.Gc(Error("'Too much recursion' after processing "+c+" task groups."));break}b=f}try{d()}catch(p){a.a.Gc(p)}}}function c(){b();h=f=e.length=0}var d,e=[],f=0,g=1,h=0;A.MutationObserver?d=function(a){var b=w.createElement("div");(new MutationObserver(a)).observe(b,{attributes:!0});return function(){b.classList.toggle("foo")}}(c):d=w&&"onreadystatechange"in w.createElement("script")?function(a){var b=w.createElement("script");b.onreadystatechange=function(){b.onreadystatechange=null;w.documentElement.removeChild(b);
b=null;a()};w.documentElement.appendChild(b)}:function(a){setTimeout(a,0)};return{scheduler:d,zb:function(b){f||a.na.scheduler(c);e[f++]=b;return g++},cancel:function(a){a=a-(g-f);a>=h&&a<f&&(e[a]=null)},resetForTesting:function(){var a=f-h;h=f=e.length=0;return a},Sd:b}}();a.b("tasks",a.na);a.b("tasks.schedule",a.na.zb);a.b("tasks.runEarly",a.na.Sd);a.Ta={throttle:function(b,c){b.throttleEvaluation=c;var d=null;return a.$({read:b,write:function(e){clearTimeout(d);d=a.a.setTimeout(function(){b(e)},
c)}})},rateLimit:function(a,c){var d,e,f;"number"==typeof c?d=c:(d=c.timeout,e=c.method);a.Hb=!1;f="function"==typeof e?e:"notifyWhenChangesStop"==e?Y:X;a.ub(function(a){return f(a,d,c)})},deferred:function(b,c){if(!0!==c)throw Error("The 'deferred' extender only accepts the value 'true', because it is not supported to turn deferral off once enabled.");b.Hb||(b.Hb=!0,b.ub(function(c){var e,f=!1;return function(){if(!f){a.na.cancel(e);e=a.na.zb(c);try{f=!0,b.notifySubscribers(n,"dirty")}finally{f=
!1}}}}))},notify:function(a,c){a.equalityComparer="always"==c?null:K}};var W={undefined:1,"boolean":1,number:1,string:1};a.b("extenders",a.Ta);a.ic=function(b,c,d){this.da=b;this.lc=c;this.mc=d;this.Ib=!1;this.fb=this.Jb=null;a.L(this,"dispose",this.s);a.L(this,"disposeWhenNodeIsRemoved",this.l)};a.ic.prototype.s=function(){this.Ib||(this.fb&&a.a.K.yb(this.Jb,this.fb),this.Ib=!0,this.mc(),this.da=this.lc=this.mc=this.Jb=this.fb=null)};a.ic.prototype.l=function(b){this.Jb=b;a.a.K.za(b,this.fb=this.s.bind(this))};
a.T=function(){a.a.Ab(this,D);D.qb(this)};var D={qb:function(a){a.U={change:[]};a.sc=1},subscribe:function(b,c,d){var e=this;d=d||"change";var f=new a.ic(e,c?b.bind(c):b,function(){a.a.Pa(e.U[d],f);e.hb&&e.hb(d)});e.Qa&&e.Qa(d);e.U[d]||(e.U[d]=[]);e.U[d].push(f);return f},notifySubscribers:function(b,c){c=c||"change";"change"===c&&this.Gb();if(this.Wa(c)){var d="change"===c&&this.ed||this.U[c].slice(0);try{a.u.xc();for(var e=0,f;f=d[e];++e)f.Ib||f.lc(b)}finally{a.u.end()}}},ob:function(){return this.sc},
Dd:function(a){return this.ob()!==a},Gb:function(){++this.sc},ub:function(b){var c=this,d=a.O(c),e,f,g,h,m;c.gb||(c.gb=c.notifySubscribers,c.notifySubscribers=Z);var k=b(function(){c.Ja=!1;d&&h===c&&(h=c.nc?c.nc():c());var a=f||m&&c.sb(g,h);m=f=e=!1;a&&c.gb(g=h)});c.qc=function(a,b){b&&c.Ja||(m=!b);c.ed=c.U.change.slice(0);c.Ja=e=!0;h=a;k()};c.pc=function(a){e||(g=a,c.gb(a,"beforeChange"))};c.rc=function(){m=!0};c.gd=function(){c.sb(g,c.v(!0))&&(f=!0)}},Wa:function(a){return this.U[a]&&this.U[a].length},
Bd:function(b){if(b)return this.U[b]&&this.U[b].length||0;var c=0;a.a.P(this.U,function(a,b){"dirty"!==a&&(c+=b.length)});return c},sb:function(a,c){return!this.equalityComparer||!this.equalityComparer(a,c)},toString:function(){return"[object Object]"},extend:function(b){var c=this;b&&a.a.P(b,function(b,e){var f=a.Ta[b];"function"==typeof f&&(c=f(c,e)||c)});return c}};a.L(D,"init",D.qb);a.L(D,"subscribe",D.subscribe);a.L(D,"extend",D.extend);a.L(D,"getSubscriptionsCount",D.Bd);a.a.Ba&&a.a.setPrototypeOf(D,
Function.prototype);a.T.fn=D;a.Qc=function(a){return null!=a&&"function"==typeof a.subscribe&&"function"==typeof a.notifySubscribers};a.b("subscribable",a.T);a.b("isSubscribable",a.Qc);a.S=a.u=function(){function b(a){d.push(e);e=a}function c(){e=d.pop()}var d=[],e,f=0;return{xc:b,end:c,cc:function(b){if(e){if(!a.Qc(b))throw Error("Only subscribable things can act as dependencies");e.od.call(e.pd,b,b.fd||(b.fd=++f))}},G:function(a,d,e){try{return b(),a.apply(d,e||[])}finally{c()}},qa:function(){if(e)return e.o.qa()},
Va:function(){if(e)return e.o.Va()},Ya:function(){if(e)return e.Ya},o:function(){if(e)return e.o}}}();a.b("computedContext",a.S);a.b("computedContext.getDependenciesCount",a.S.qa);a.b("computedContext.getDependencies",a.S.Va);a.b("computedContext.isInitial",a.S.Ya);a.b("computedContext.registerDependency",a.S.cc);a.b("ignoreDependencies",a.Yd=a.u.G);var I=a.a.Da("_latestValue");a.ta=function(b){function c(){if(0<arguments.length)return c.sb(c[I],arguments[0])&&(c.ya(),c[I]=arguments[0],c.xa()),this;
a.u.cc(c);return c[I]}c[I]=b;a.a.Ba||a.a.extend(c,a.T.fn);a.T.fn.qb(c);a.a.Ab(c,F);a.options.deferUpdates&&a.Ta.deferred(c,!0);return c};var F={equalityComparer:K,v:function(){return this[I]},xa:function(){this.notifySubscribers(this[I],"spectate");this.notifySubscribers(this[I])},ya:function(){this.notifySubscribers(this[I],"beforeChange")}};a.a.Ba&&a.a.setPrototypeOf(F,a.T.fn);var G=a.ta.Ma="__ko_proto__";F[G]=a.ta;a.O=function(b){if((b="function"==typeof b&&b[G])&&b!==F[G]&&b!==a.o.fn[G])throw Error("Invalid object that looks like an observable; possibly from another Knockout instance");
return!!b};a.Za=function(b){return"function"==typeof b&&(b[G]===F[G]||b[G]===a.o.fn[G]&&b.Nc)};a.b("observable",a.ta);a.b("isObservable",a.O);a.b("isWriteableObservable",a.Za);a.b("isWritableObservable",a.Za);a.b("observable.fn",F);a.L(F,"peek",F.v);a.L(F,"valueHasMutated",F.xa);a.L(F,"valueWillMutate",F.ya);a.Ha=function(b){b=b||[];if("object"!=typeof b||!("length"in b))throw Error("The argument passed when initializing an observable array must be an array, or null, or undefined.");b=a.ta(b);a.a.Ab(b,
a.Ha.fn);return b.extend({trackArrayChanges:!0})};a.Ha.fn={remove:function(b){for(var c=this.v(),d=[],e="function"!=typeof b||a.O(b)?function(a){return a===b}:b,f=0;f<c.length;f++){var g=c[f];if(e(g)){0===d.length&&this.ya();if(c[f]!==g)throw Error("Array modified during remove; cannot remove item");d.push(g);c.splice(f,1);f--}}d.length&&this.xa();return d},removeAll:function(b){if(b===n){var c=this.v(),d=c.slice(0);this.ya();c.splice(0,c.length);this.xa();return d}return b?this.remove(function(c){return 0<=
a.a.A(b,c)}):[]},destroy:function(b){var c=this.v(),d="function"!=typeof b||a.O(b)?function(a){return a===b}:b;this.ya();for(var e=c.length-1;0<=e;e--){var f=c[e];d(f)&&(f._destroy=!0)}this.xa()},destroyAll:function(b){return b===n?this.destroy(function(){return!0}):b?this.destroy(function(c){return 0<=a.a.A(b,c)}):[]},indexOf:function(b){var c=this();return a.a.A(c,b)},replace:function(a,c){var d=this.indexOf(a);0<=d&&(this.ya(),this.v()[d]=c,this.xa())},sorted:function(a){var c=this().slice(0);
return a?c.sort(a):c.sort()},reversed:function(){return this().slice(0).reverse()}};a.a.Ba&&a.a.setPrototypeOf(a.Ha.fn,a.ta.fn);a.a.D("pop push reverse shift sort splice unshift".split(" "),function(b){a.Ha.fn[b]=function(){var a=this.v();this.ya();this.zc(a,b,arguments);var d=a[b].apply(a,arguments);this.xa();return d===a?this:d}});a.a.D(["slice"],function(b){a.Ha.fn[b]=function(){var a=this();return a[b].apply(a,arguments)}});a.Pc=function(b){return a.O(b)&&"function"==typeof b.remove&&"function"==
typeof b.push};a.b("observableArray",a.Ha);a.b("isObservableArray",a.Pc);a.Ta.trackArrayChanges=function(b,c){function d(){function c(){if(m){var d=[].concat(b.v()||[]),e;if(b.Wa("arrayChange")){if(!f||1<m)f=a.a.Pb(k,d,b.Ob);e=f}k=d;f=null;m=0;e&&e.length&&b.notifySubscribers(e,"arrayChange")}}e?c():(e=!0,h=b.subscribe(function(){++m},null,"spectate"),k=[].concat(b.v()||[]),f=null,g=b.subscribe(c))}b.Ob={};c&&"object"==typeof c&&a.a.extend(b.Ob,c);b.Ob.sparse=!0;if(!b.zc){var e=!1,f=null,g,h,m=0,
k,l=b.Qa,p=b.hb;b.Qa=function(a){l&&l.call(b,a);"arrayChange"===a&&d()};b.hb=function(a){p&&p.call(b,a);"arrayChange"!==a||b.Wa("arrayChange")||(g&&g.s(),h&&h.s(),h=g=null,e=!1,k=n)};b.zc=function(b,c,d){function l(a,b,c){return k[k.length]={status:a,value:b,index:c}}if(e&&!m){var k=[],p=b.length,g=d.length,h=0;switch(c){case "push":h=p;case "unshift":for(c=0;c<g;c++)l("added",d[c],h+c);break;case "pop":h=p-1;case "shift":p&&l("deleted",b[h],h);break;case "splice":c=Math.min(Math.max(0,0>d[0]?p+d[0]:
d[0]),p);for(var p=1===g?p:Math.min(c+(d[1]||0),p),g=c+g-2,h=Math.max(p,g),U=[],L=[],n=2;c<h;++c,++n)c<p&&L.push(l("deleted",b[c],c)),c<g&&U.push(l("added",d[n],c));a.a.Kc(L,U);break;default:return}f=k}}}};var r=a.a.Da("_state");a.o=a.$=function(b,c,d){function e(){if(0<arguments.length){if("function"===typeof f)f.apply(g.nb,arguments);else throw Error("Cannot write a value to a ko.computed unless you specify a 'write' option. If you wish to read the current value, don't pass any parameters.");return this}g.ra||
a.u.cc(e);(g.ka||g.J&&e.Xa())&&e.ha();return g.X}"object"===typeof b?d=b:(d=d||{},b&&(d.read=b));if("function"!=typeof d.read)throw Error("Pass a function that returns the value of the ko.computed");var f=d.write,g={X:n,sa:!0,ka:!0,rb:!1,jc:!1,ra:!1,wb:!1,J:!1,Wc:d.read,nb:c||d.owner,l:d.disposeWhenNodeIsRemoved||d.l||null,Sa:d.disposeWhen||d.Sa,Rb:null,I:{},V:0,Ic:null};e[r]=g;e.Nc="function"===typeof f;a.a.Ba||a.a.extend(e,a.T.fn);a.T.fn.qb(e);a.a.Ab(e,C);d.pure?(g.wb=!0,g.J=!0,a.a.extend(e,da)):
d.deferEvaluation&&a.a.extend(e,ea);a.options.deferUpdates&&a.Ta.deferred(e,!0);g.l&&(g.jc=!0,g.l.nodeType||(g.l=null));g.J||d.deferEvaluation||e.ha();g.l&&e.ja()&&a.a.K.za(g.l,g.Rb=function(){e.s()});return e};var C={equalityComparer:K,qa:function(){return this[r].V},Va:function(){var b=[];a.a.P(this[r].I,function(a,d){b[d.Ka]=d.da});return b},Vb:function(b){if(!this[r].V)return!1;var c=this.Va();return-1!==a.a.A(c,b)?!0:!!a.a.Lb(c,function(a){return a.Vb&&a.Vb(b)})},uc:function(a,c,d){if(this[r].wb&&
c===this)throw Error("A 'pure' computed must not be called recursively");this[r].I[a]=d;d.Ka=this[r].V++;d.La=c.ob()},Xa:function(){var a,c,d=this[r].I;for(a in d)if(Object.prototype.hasOwnProperty.call(d,a)&&(c=d[a],this.Ia&&c.da.Ja||c.da.Dd(c.La)))return!0},Jd:function(){this.Ia&&!this[r].rb&&this.Ia(!1)},ja:function(){var a=this[r];return a.ka||0<a.V},Rd:function(){this.Ja?this[r].ka&&(this[r].sa=!0):this.Hc()},$c:function(a){if(a.Hb){var c=a.subscribe(this.Jd,this,"dirty"),d=a.subscribe(this.Rd,
this);return{da:a,s:function(){c.s();d.s()}}}return a.subscribe(this.Hc,this)},Hc:function(){var b=this,c=b.throttleEvaluation;c&&0<=c?(clearTimeout(this[r].Ic),this[r].Ic=a.a.setTimeout(function(){b.ha(!0)},c)):b.Ia?b.Ia(!0):b.ha(!0)},ha:function(b){var c=this[r],d=c.Sa,e=!1;if(!c.rb&&!c.ra){if(c.l&&!a.a.Sb(c.l)||d&&d()){if(!c.jc){this.s();return}}else c.jc=!1;c.rb=!0;try{e=this.zd(b)}finally{c.rb=!1}return e}},zd:function(b){var c=this[r],d=!1,e=c.wb?n:!c.V,d={qd:this,mb:c.I,Qb:c.V};a.u.xc({pd:d,
od:ba,o:this,Ya:e});c.I={};c.V=0;var f=this.yd(c,d);c.V?d=this.sb(c.X,f):(this.s(),d=!0);d&&(c.J?this.Gb():this.notifySubscribers(c.X,"beforeChange"),c.X=f,this.notifySubscribers(c.X,"spectate"),!c.J&&b&&this.notifySubscribers(c.X),this.rc&&this.rc());e&&this.notifySubscribers(c.X,"awake");return d},yd:function(b,c){try{var d=b.Wc;return b.nb?d.call(b.nb):d()}finally{a.u.end(),c.Qb&&!b.J&&a.a.P(c.mb,aa),b.sa=b.ka=!1}},v:function(a){var c=this[r];(c.ka&&(a||!c.V)||c.J&&this.Xa())&&this.ha();return c.X},
ub:function(b){a.T.fn.ub.call(this,b);this.nc=function(){this[r].J||(this[r].sa?this.ha():this[r].ka=!1);return this[r].X};this.Ia=function(a){this.pc(this[r].X);this[r].ka=!0;a&&(this[r].sa=!0);this.qc(this,!a)}},s:function(){var b=this[r];!b.J&&b.I&&a.a.P(b.I,function(a,b){b.s&&b.s()});b.l&&b.Rb&&a.a.K.yb(b.l,b.Rb);b.I=n;b.V=0;b.ra=!0;b.sa=!1;b.ka=!1;b.J=!1;b.l=n;b.Sa=n;b.Wc=n;this.Nc||(b.nb=n)}},da={Qa:function(b){var c=this,d=c[r];if(!d.ra&&d.J&&"change"==b){d.J=!1;if(d.sa||c.Xa())d.I=null,d.V=
0,c.ha()&&c.Gb();else{var e=[];a.a.P(d.I,function(a,b){e[b.Ka]=a});a.a.D(e,function(a,b){var e=d.I[a],m=c.$c(e.da);m.Ka=b;m.La=e.La;d.I[a]=m});c.Xa()&&c.ha()&&c.Gb()}d.ra||c.notifySubscribers(d.X,"awake")}},hb:function(b){var c=this[r];c.ra||"change"!=b||this.Wa("change")||(a.a.P(c.I,function(a,b){b.s&&(c.I[a]={da:b.da,Ka:b.Ka,La:b.La},b.s())}),c.J=!0,this.notifySubscribers(n,"asleep"))},ob:function(){var b=this[r];b.J&&(b.sa||this.Xa())&&this.ha();return a.T.fn.ob.call(this)}},ea={Qa:function(a){"change"!=
a&&"beforeChange"!=a||this.v()}};a.a.Ba&&a.a.setPrototypeOf(C,a.T.fn);var N=a.ta.Ma;C[N]=a.o;a.Oc=function(a){return"function"==typeof a&&a[N]===C[N]};a.Fd=function(b){return a.Oc(b)&&b[r]&&b[r].wb};a.b("computed",a.o);a.b("dependentObservable",a.o);a.b("isComputed",a.Oc);a.b("isPureComputed",a.Fd);a.b("computed.fn",C);a.L(C,"peek",C.v);a.L(C,"dispose",C.s);a.L(C,"isActive",C.ja);a.L(C,"getDependenciesCount",C.qa);a.L(C,"getDependencies",C.Va);a.xb=function(b,c){if("function"===typeof b)return a.o(b,
c,{pure:!0});b=a.a.extend({},b);b.pure=!0;return a.o(b,c)};a.b("pureComputed",a.xb);(function(){function b(a,f,g){g=g||new d;a=f(a);if("object"!=typeof a||null===a||a===n||a instanceof RegExp||a instanceof Date||a instanceof String||a instanceof Number||a instanceof Boolean)return a;var h=a instanceof Array?[]:{};g.save(a,h);c(a,function(c){var d=f(a[c]);switch(typeof d){case "boolean":case "number":case "string":case "function":h[c]=d;break;case "object":case "undefined":var l=g.get(d);h[c]=l!==
n?l:b(d,f,g)}});return h}function c(a,b){if(a instanceof Array){for(var c=0;c<a.length;c++)b(c);"function"==typeof a.toJSON&&b("toJSON")}else for(c in a)b(c)}function d(){this.keys=[];this.values=[]}a.ad=function(c){if(0==arguments.length)throw Error("When calling ko.toJS, pass the object you want to convert.");return b(c,function(b){for(var c=0;a.O(b)&&10>c;c++)b=b();return b})};a.toJSON=function(b,c,d){b=a.ad(b);return a.a.hc(b,c,d)};d.prototype={constructor:d,save:function(b,c){var d=a.a.A(this.keys,
b);0<=d?this.values[d]=c:(this.keys.push(b),this.values.push(c))},get:function(b){b=a.a.A(this.keys,b);return 0<=b?this.values[b]:n}}})();a.b("toJS",a.ad);a.b("toJSON",a.toJSON);a.Wd=function(b,c,d){function e(c){var e=a.xb(b,d).extend({ma:"always"}),h=e.subscribe(function(a){a&&(h.s(),c(a))});e.notifySubscribers(e.v());return h}return"function"!==typeof Promise||c?e(c.bind(d)):new Promise(e)};a.b("when",a.Wd);(function(){a.w={M:function(b){switch(a.a.R(b)){case "option":return!0===b.__ko__hasDomDataOptionValue__?
a.a.g.get(b,a.c.options.$b):7>=a.a.W?b.getAttributeNode("value")&&b.getAttributeNode("value").specified?b.value:b.text:b.value;case "select":return 0<=b.selectedIndex?a.w.M(b.options[b.selectedIndex]):n;default:return b.value}},cb:function(b,c,d){switch(a.a.R(b)){case "option":"string"===typeof c?(a.a.g.set(b,a.c.options.$b,n),"__ko__hasDomDataOptionValue__"in b&&delete b.__ko__hasDomDataOptionValue__,b.value=c):(a.a.g.set(b,a.c.options.$b,c),b.__ko__hasDomDataOptionValue__=!0,b.value="number"===
typeof c?c:"");break;case "select":if(""===c||null===c)c=n;for(var e=-1,f=0,g=b.options.length,h;f<g;++f)if(h=a.w.M(b.options[f]),h==c||""===h&&c===n){e=f;break}if(d||0<=e||c===n&&1<b.size)b.selectedIndex=e,6===a.a.W&&a.a.setTimeout(function(){b.selectedIndex=e},0);break;default:if(null===c||c===n)c="";b.value=c}}}})();a.b("selectExtensions",a.w);a.b("selectExtensions.readValue",a.w.M);a.b("selectExtensions.writeValue",a.w.cb);a.m=function(){function b(b){b=a.a.Db(b);123===b.charCodeAt(0)&&(b=b.slice(1,
-1));b+="\n,";var c=[],d=b.match(e),p,q=[],h=0;if(1<d.length){for(var x=0,B;B=d[x];++x){var u=B.charCodeAt(0);if(44===u){if(0>=h){c.push(p&&q.length?{key:p,value:q.join("")}:{unknown:p||q.join("")});p=h=0;q=[];continue}}else if(58===u){if(!h&&!p&&1===q.length){p=q.pop();continue}}else if(47===u&&1<B.length&&(47===B.charCodeAt(1)||42===B.charCodeAt(1)))continue;else 47===u&&x&&1<B.length?(u=d[x-1].match(f))&&!g[u[0]]&&(b=b.substr(b.indexOf(B)+1),d=b.match(e),x=-1,B="/"):40===u||123===u||91===u?++h:
41===u||125===u||93===u?--h:p||q.length||34!==u&&39!==u||(B=B.slice(1,-1));q.push(B)}if(0<h)throw Error("Unbalanced parentheses, braces, or brackets");}return c}var c=["true","false","null","undefined"],d=/^(?:[$_a-z][$\w]*|(.+)(\.\s*[$_a-z][$\w]*|\[.+\]))$/i,e=RegExp("\"(?:\\\\.|[^\"])*\"|'(?:\\\\.|[^'])*'|`(?:\\\\.|[^`])*`|/\\*(?:[^*]|\\*+[^*/])*\\*+/|//.*\n|/(?:\\\\.|[^/])+/w*|[^\\s:,/][^,\"'`{}()/:[\\]]*[^\\s,\"'`{}()/:[\\]]|[^\\s]","g"),f=/[\])"'A-Za-z0-9_$]+$/,g={"in":1,"return":1,"typeof":1},
h={};return{Ra:[],wa:h,ac:b,vb:function(e,f){function l(b,e){var f;if(!x){var k=a.getBindingHandler(b);if(k&&k.preprocess&&!(e=k.preprocess(e,b,l)))return;if(k=h[b])f=e,0<=a.a.A(c,f)?f=!1:(k=f.match(d),f=null===k?!1:k[1]?"Object("+k[1]+")"+k[2]:f),k=f;k&&q.push("'"+("string"==typeof h[b]?h[b]:b)+"':function(_z){"+f+"=_z}")}g&&(e="function(){return "+e+" }");p.push("'"+b+"':"+e)}f=f||{};var p=[],q=[],g=f.valueAccessors,x=f.bindingParams,B="string"===typeof e?b(e):e;a.a.D(B,function(a){l(a.key||a.unknown,
a.value)});q.length&&l("_ko_property_writers","{"+q.join(",")+" }");return p.join(",")},Id:function(a,b){for(var c=0;c<a.length;c++)if(a[c].key==b)return!0;return!1},eb:function(b,c,d,e,f){if(b&&a.O(b))!a.Za(b)||f&&b.v()===e||b(e);else if((b=c.get("_ko_property_writers"))&&b[d])b[d](e)}}}();a.b("expressionRewriting",a.m);a.b("expressionRewriting.bindingRewriteValidators",a.m.Ra);a.b("expressionRewriting.parseObjectLiteral",a.m.ac);a.b("expressionRewriting.preProcessBindings",a.m.vb);a.b("expressionRewriting._twoWayBindings",
a.m.wa);a.b("jsonExpressionRewriting",a.m);a.b("jsonExpressionRewriting.insertPropertyAccessorsIntoJson",a.m.vb);(function(){function b(a){return 8==a.nodeType&&g.test(f?a.text:a.nodeValue)}function c(a){return 8==a.nodeType&&h.test(f?a.text:a.nodeValue)}function d(d,e){for(var f=d,h=1,g=[];f=f.nextSibling;){if(c(f)&&(a.a.g.set(f,k,!0),h--,0===h))return g;g.push(f);b(f)&&h++}if(!e)throw Error("Cannot find closing comment tag to match: "+d.nodeValue);return null}function e(a,b){var c=d(a,b);return c?
0<c.length?c[c.length-1].nextSibling:a.nextSibling:null}var f=w&&"\x3c!--test--\x3e"===w.createComment("test").text,g=f?/^\x3c!--\s*ko(?:\s+([\s\S]+))?\s*--\x3e$/:/^\s*ko(?:\s+([\s\S]+))?\s*$/,h=f?/^\x3c!--\s*\/ko\s*--\x3e$/:/^\s*\/ko\s*$/,m={ul:!0,ol:!0},k="__ko_matchedEndComment__";a.h={ea:{},childNodes:function(a){return b(a)?d(a):a.childNodes},Ea:function(c){if(b(c)){c=a.h.childNodes(c);for(var d=0,e=c.length;d<e;d++)a.removeNode(c[d])}else a.a.Tb(c)},va:function(c,d){if(b(c)){a.h.Ea(c);for(var e=
c.nextSibling,f=0,k=d.length;f<k;f++)e.parentNode.insertBefore(d[f],e)}else a.a.va(c,d)},Vc:function(a,c){var d;b(a)?(d=a.nextSibling,a=a.parentNode):d=a.firstChild;d?c!==d&&a.insertBefore(c,d):a.appendChild(c)},Wb:function(c,d,e){e?(e=e.nextSibling,b(c)&&(c=c.parentNode),e?d!==e&&c.insertBefore(d,e):c.appendChild(d)):a.h.Vc(c,d)},firstChild:function(a){if(b(a))return!a.nextSibling||c(a.nextSibling)?null:a.nextSibling;if(a.firstChild&&c(a.firstChild))throw Error("Found invalid end comment, as the first child of "+
a);return a.firstChild},nextSibling:function(d){b(d)&&(d=e(d));if(d.nextSibling&&c(d.nextSibling)){var f=d.nextSibling;if(c(f)&&!a.a.g.get(f,k))throw Error("Found end comment without a matching opening comment, as child of "+d);return null}return d.nextSibling},Cd:b,Vd:function(a){return(a=(f?a.text:a.nodeValue).match(g))?a[1]:null},Sc:function(d){if(m[a.a.R(d)]){var f=d.firstChild;if(f){do if(1===f.nodeType){var k;k=f.firstChild;var h=null;if(k){do if(h)h.push(k);else if(b(k)){var g=e(k,!0);g?k=
g:h=[k]}else c(k)&&(h=[k]);while(k=k.nextSibling)}if(k=h)for(h=f.nextSibling,g=0;g<k.length;g++)h?d.insertBefore(k[g],h):d.appendChild(k[g])}while(f=f.nextSibling)}}}}})();a.b("virtualElements",a.h);a.b("virtualElements.allowedBindings",a.h.ea);a.b("virtualElements.emptyNode",a.h.Ea);a.b("virtualElements.insertAfter",a.h.Wb);a.b("virtualElements.prepend",a.h.Vc);a.b("virtualElements.setDomNodeChildren",a.h.va);(function(){a.ga=function(){this.nd={}};a.a.extend(a.ga.prototype,{nodeHasBindings:function(b){switch(b.nodeType){case 1:return null!=
b.getAttribute("data-bind")||a.j.getComponentNameForNode(b);case 8:return a.h.Cd(b);default:return!1}},getBindings:function(b,c){var d=this.getBindingsString(b,c),d=d?this.parseBindingsString(d,c,b):null;return a.j.tc(d,b,c,!1)},getBindingAccessors:function(b,c){var d=this.getBindingsString(b,c),d=d?this.parseBindingsString(d,c,b,{valueAccessors:!0}):null;return a.j.tc(d,b,c,!0)},getBindingsString:function(b){switch(b.nodeType){case 1:return b.getAttribute("data-bind");case 8:return a.h.Vd(b);default:return null}},
parseBindingsString:function(b,c,d,e){try{var f=this.nd,g=b+(e&&e.valueAccessors||""),h;if(!(h=f[g])){var m,k="with($context){with($data||{}){return{"+a.m.vb(b,e)+"}}}";m=new Function("$context","$element",k);h=f[g]=m}return h(c,d)}catch(l){throw l.message="Unable to parse bindings.\nBindings value: "+b+"\nMessage: "+l.message,l;}}});a.ga.instance=new a.ga})();a.b("bindingProvider",a.ga);(function(){function b(b){var c=(b=a.a.g.get(b,z))&&b.N;c&&(b.N=null,c.Tc())}function c(c,d,e){this.node=c;this.yc=
d;this.kb=[];this.H=!1;d.N||a.a.K.za(c,b);e&&e.N&&(e.N.kb.push(c),this.Kb=e)}function d(a){return function(){return a}}function e(a){return a()}function f(b){return a.a.Ga(a.u.G(b),function(a,c){return function(){return b()[c]}})}function g(b,c,e){return"function"===typeof b?f(b.bind(null,c,e)):a.a.Ga(b,d)}function h(a,b){return f(this.getBindings.bind(this,a,b))}function m(b,c){var d=a.h.firstChild(c);if(d){var e,f=a.ga.instance,l=f.preprocessNode;if(l){for(;e=d;)d=a.h.nextSibling(e),l.call(f,e);
d=a.h.firstChild(c)}for(;e=d;)d=a.h.nextSibling(e),k(b,e)}a.i.ma(c,a.i.H)}function k(b,c){var d=b,e=1===c.nodeType;e&&a.h.Sc(c);if(e||a.ga.instance.nodeHasBindings(c))d=p(c,null,b).bindingContextForDescendants;d&&!u[a.a.R(c)]&&m(d,c)}function l(b){var c=[],d={},e=[];a.a.P(b,function ca(f){if(!d[f]){var k=a.getBindingHandler(f);k&&(k.after&&(e.push(f),a.a.D(k.after,function(c){if(b[c]){if(-1!==a.a.A(e,c))throw Error("Cannot combine the following bindings, because they have a cyclic dependency: "+e.join(", "));
ca(c)}}),e.length--),c.push({key:f,Mc:k}));d[f]=!0}});return c}function p(b,c,d){var f=a.a.g.Ub(b,z,{}),k=f.hd;if(!c){if(k)throw Error("You cannot apply bindings multiple times to the same element.");f.hd=!0}k||(f.context=d);f.Zb||(f.Zb={});var g;if(c&&"function"!==typeof c)g=c;else{var p=a.ga.instance,q=p.getBindingAccessors||h,m=a.$(function(){if(g=c?c(d,b):q.call(p,b,d)){if(d[t])d[t]();if(d[B])d[B]()}return g},null,{l:b});g&&m.ja()||(m=null)}var x=d,u;if(g){var J=function(){return a.a.Ga(m?m():
g,e)},r=m?function(a){return function(){return e(m()[a])}}:function(a){return g[a]};J.get=function(a){return g[a]&&e(r(a))};J.has=function(a){return a in g};a.i.H in g&&a.i.subscribe(b,a.i.H,function(){var c=(0,g[a.i.H])();if(c){var d=a.h.childNodes(b);d.length&&c(d,a.Ec(d[0]))}});a.i.pa in g&&(x=a.i.Cb(b,d),a.i.subscribe(b,a.i.pa,function(){var c=(0,g[a.i.pa])();c&&a.h.firstChild(b)&&c(b)}));f=l(g);a.a.D(f,function(c){var d=c.Mc.init,e=c.Mc.update,f=c.key;if(8===b.nodeType&&!a.h.ea[f])throw Error("The binding '"+
f+"' cannot be used with virtual elements");try{"function"==typeof d&&a.u.G(function(){var a=d(b,r(f),J,x.$data,x);if(a&&a.controlsDescendantBindings){if(u!==n)throw Error("Multiple bindings ("+u+" and "+f+") are trying to control descendant bindings of the same element. You cannot use these bindings together on the same element.");u=f}}),"function"==typeof e&&a.$(function(){e(b,r(f),J,x.$data,x)},null,{l:b})}catch(k){throw k.message='Unable to process binding "'+f+": "+g[f]+'"\nMessage: '+k.message,
k;}})}f=u===n;return{shouldBindDescendants:f,bindingContextForDescendants:f&&x}}function q(b,c){return b&&b instanceof a.fa?b:new a.fa(b,n,n,c)}var t=a.a.Da("_subscribable"),x=a.a.Da("_ancestorBindingInfo"),B=a.a.Da("_dataDependency");a.c={};var u={script:!0,textarea:!0,template:!0};a.getBindingHandler=function(b){return a.c[b]};var J={};a.fa=function(b,c,d,e,f){function k(){var b=p?h():h,f=a.a.f(b);c?(a.a.extend(l,c),x in c&&(l[x]=c[x])):(l.$parents=[],l.$root=f,l.ko=a);l[t]=q;g?f=l.$data:(l.$rawData=
b,l.$data=f);d&&(l[d]=f);e&&e(l,c,f);if(c&&c[t]&&!a.S.o().Vb(c[t]))c[t]();m&&(l[B]=m);return l.$data}var l=this,g=b===J,h=g?n:b,p="function"==typeof h&&!a.O(h),q,m=f&&f.dataDependency;f&&f.exportDependencies?k():(q=a.xb(k),q.v(),q.ja()?q.equalityComparer=null:l[t]=n)};a.fa.prototype.createChildContext=function(b,c,d,e){!e&&c&&"object"==typeof c&&(e=c,c=e.as,d=e.extend);if(c&&e&&e.noChildContext){var f="function"==typeof b&&!a.O(b);return new a.fa(J,this,null,function(a){d&&d(a);a[c]=f?b():b},e)}return new a.fa(b,
this,c,function(a,b){a.$parentContext=b;a.$parent=b.$data;a.$parents=(b.$parents||[]).slice(0);a.$parents.unshift(a.$parent);d&&d(a)},e)};a.fa.prototype.extend=function(b,c){return new a.fa(J,this,null,function(c){a.a.extend(c,"function"==typeof b?b(c):b)},c)};var z=a.a.g.Z();c.prototype.Tc=function(){this.Kb&&this.Kb.N&&this.Kb.N.sd(this.node)};c.prototype.sd=function(b){a.a.Pa(this.kb,b);!this.kb.length&&this.H&&this.Cc()};c.prototype.Cc=function(){this.H=!0;this.yc.N&&!this.kb.length&&(this.yc.N=
null,a.a.K.yb(this.node,b),a.i.ma(this.node,a.i.pa),this.Tc())};a.i={H:"childrenComplete",pa:"descendantsComplete",subscribe:function(b,c,d,e,f){var k=a.a.g.Ub(b,z,{});k.Fa||(k.Fa=new a.T);f&&f.notifyImmediately&&k.Zb[c]&&a.u.G(d,e,[b]);return k.Fa.subscribe(d,e,c)},ma:function(b,c){var d=a.a.g.get(b,z);if(d&&(d.Zb[c]=!0,d.Fa&&d.Fa.notifySubscribers(b,c),c==a.i.H))if(d.N)d.N.Cc();else if(d.N===n&&d.Fa&&d.Fa.Wa(a.i.pa))throw Error("descendantsComplete event not supported for bindings on this node");
},Cb:function(b,d){var e=a.a.g.Ub(b,z,{});e.N||(e.N=new c(b,e,d[x]));return d[x]==e?d:d.extend(function(a){a[x]=e})}};a.Td=function(b){return(b=a.a.g.get(b,z))&&b.context};a.ib=function(b,c,d){1===b.nodeType&&a.h.Sc(b);return p(b,c,q(d))};a.ld=function(b,c,d){d=q(d);return a.ib(b,g(c,d,b),d)};a.Oa=function(a,b){1!==b.nodeType&&8!==b.nodeType||m(q(a),b)};a.vc=function(a,b,c){!v&&A.jQuery&&(v=A.jQuery);if(2>arguments.length){if(b=w.body,!b)throw Error("ko.applyBindings: could not find document.body; has the document been loaded?");
}else if(!b||1!==b.nodeType&&8!==b.nodeType)throw Error("ko.applyBindings: first parameter should be your view model; second parameter should be a DOM node");k(q(a,c),b)};a.Dc=function(b){return!b||1!==b.nodeType&&8!==b.nodeType?n:a.Td(b)};a.Ec=function(b){return(b=a.Dc(b))?b.$data:n};a.b("bindingHandlers",a.c);a.b("bindingEvent",a.i);a.b("bindingEvent.subscribe",a.i.subscribe);a.b("bindingEvent.startPossiblyAsyncContentBinding",a.i.Cb);a.b("applyBindings",a.vc);a.b("applyBindingsToDescendants",a.Oa);
a.b("applyBindingAccessorsToNode",a.ib);a.b("applyBindingsToNode",a.ld);a.b("contextFor",a.Dc);a.b("dataFor",a.Ec)})();(function(b){function c(c,e){var k=Object.prototype.hasOwnProperty.call(f,c)?f[c]:b,l;k?k.subscribe(e):(k=f[c]=new a.T,k.subscribe(e),d(c,function(b,d){var e=!(!d||!d.synchronous);g[c]={definition:b,Gd:e};delete f[c];l||e?k.notifySubscribers(b):a.na.zb(function(){k.notifySubscribers(b)})}),l=!0)}function d(a,b){e("getConfig",[a],function(c){c?e("loadComponent",[a,c],function(a){b(a,
c)}):b(null,null)})}function e(c,d,f,l){l||(l=a.j.loaders.slice(0));var g=l.shift();if(g){var q=g[c];if(q){var t=!1;if(q.apply(g,d.concat(function(a){t?f(null):null!==a?f(a):e(c,d,f,l)}))!==b&&(t=!0,!g.suppressLoaderExceptions))throw Error("Component loaders must supply values by invoking the callback, not by returning values synchronously.");}else e(c,d,f,l)}else f(null)}var f={},g={};a.j={get:function(d,e){var f=Object.prototype.hasOwnProperty.call(g,d)?g[d]:b;f?f.Gd?a.u.G(function(){e(f.definition)}):
a.na.zb(function(){e(f.definition)}):c(d,e)},Bc:function(a){delete g[a]},oc:e};a.j.loaders=[];a.b("components",a.j);a.b("components.get",a.j.get);a.b("components.clearCachedDefinition",a.j.Bc)})();(function(){function b(b,c,d,e){function g(){0===--B&&e(h)}var h={},B=2,u=d.template;d=d.viewModel;u?f(c,u,function(c){a.j.oc("loadTemplate",[b,c],function(a){h.template=a;g()})}):g();d?f(c,d,function(c){a.j.oc("loadViewModel",[b,c],function(a){h[m]=a;g()})}):g()}function c(a,b,d){if("function"===typeof b)d(function(a){return new b(a)});
else if("function"===typeof b[m])d(b[m]);else if("instance"in b){var e=b.instance;d(function(){return e})}else"viewModel"in b?c(a,b.viewModel,d):a("Unknown viewModel value: "+b)}function d(b){switch(a.a.R(b)){case "script":return a.a.ua(b.text);case "textarea":return a.a.ua(b.value);case "template":if(e(b.content))return a.a.Ca(b.content.childNodes)}return a.a.Ca(b.childNodes)}function e(a){return A.DocumentFragment?a instanceof DocumentFragment:a&&11===a.nodeType}function f(a,b,c){"string"===typeof b.require?
T||A.require?(T||A.require)([b.require],function(a){a&&"object"===typeof a&&a.Xd&&a["default"]&&(a=a["default"]);c(a)}):a("Uses require, but no AMD loader is present"):c(b)}function g(a){return function(b){throw Error("Component '"+a+"': "+b);}}var h={};a.j.register=function(b,c){if(!c)throw Error("Invalid configuration for "+b);if(a.j.tb(b))throw Error("Component "+b+" is already registered");h[b]=c};a.j.tb=function(a){return Object.prototype.hasOwnProperty.call(h,a)};a.j.unregister=function(b){delete h[b];
a.j.Bc(b)};a.j.Fc={getConfig:function(b,c){c(a.j.tb(b)?h[b]:null)},loadComponent:function(a,c,d){var e=g(a);f(e,c,function(c){b(a,e,c,d)})},loadTemplate:function(b,c,f){b=g(b);if("string"===typeof c)f(a.a.ua(c));else if(c instanceof Array)f(c);else if(e(c))f(a.a.la(c.childNodes));else if(c.element)if(c=c.element,A.HTMLElement?c instanceof HTMLElement:c&&c.tagName&&1===c.nodeType)f(d(c));else if("string"===typeof c){var h=w.getElementById(c);h?f(d(h)):b("Cannot find element with ID "+c)}else b("Unknown element type: "+
c);else b("Unknown template value: "+c)},loadViewModel:function(a,b,d){c(g(a),b,d)}};var m="createViewModel";a.b("components.register",a.j.register);a.b("components.isRegistered",a.j.tb);a.b("components.unregister",a.j.unregister);a.b("components.defaultLoader",a.j.Fc);a.j.loaders.push(a.j.Fc);a.j.dd=h})();(function(){function b(b,e){var f=b.getAttribute("params");if(f){var f=c.parseBindingsString(f,e,b,{valueAccessors:!0,bindingParams:!0}),f=a.a.Ga(f,function(c){return a.o(c,null,{l:b})}),g=a.a.Ga(f,
function(c){var e=c.v();return c.ja()?a.o({read:function(){return a.a.f(c())},write:a.Za(e)&&function(a){c()(a)},l:b}):e});Object.prototype.hasOwnProperty.call(g,"$raw")||(g.$raw=f);return g}return{$raw:{}}}a.j.getComponentNameForNode=function(b){var c=a.a.R(b);if(a.j.tb(c)&&(-1!=c.indexOf("-")||"[object HTMLUnknownElement]"==""+b||8>=a.a.W&&b.tagName===c))return c};a.j.tc=function(c,e,f,g){if(1===e.nodeType){var h=a.j.getComponentNameForNode(e);if(h){c=c||{};if(c.component)throw Error('Cannot use the "component" binding on a custom element matching a component');
var m={name:h,params:b(e,f)};c.component=g?function(){return m}:m}}return c};var c=new a.ga;9>a.a.W&&(a.j.register=function(a){return function(b){return a.apply(this,arguments)}}(a.j.register),w.createDocumentFragment=function(b){return function(){var c=b(),f=a.j.dd,g;for(g in f);return c}}(w.createDocumentFragment))})();(function(){function b(b,c,d){c=c.template;if(!c)throw Error("Component '"+b+"' has no template");b=a.a.Ca(c);a.h.va(d,b)}function c(a,b,c){var d=a.createViewModel;return d?d.call(a,
b,c):b}var d=0;a.c.component={init:function(e,f,g,h,m){function k(){var a=l&&l.dispose;"function"===typeof a&&a.call(l);q&&q.s();p=l=q=null}var l,p,q,t=a.a.la(a.h.childNodes(e));a.h.Ea(e);a.a.K.za(e,k);a.o(function(){var g=a.a.f(f()),h,u;"string"===typeof g?h=g:(h=a.a.f(g.name),u=a.a.f(g.params));if(!h)throw Error("No component name specified");var n=a.i.Cb(e,m),z=p=++d;a.j.get(h,function(d){if(p===z){k();if(!d)throw Error("Unknown component '"+h+"'");b(h,d,e);var f=c(d,u,{element:e,templateNodes:t});
d=n.createChildContext(f,{extend:function(a){a.$component=f;a.$componentTemplateNodes=t}});f&&f.koDescendantsComplete&&(q=a.i.subscribe(e,a.i.pa,f.koDescendantsComplete,f));l=f;a.Oa(d,e)}})},null,{l:e});return{controlsDescendantBindings:!0}}};a.h.ea.component=!0})();var V={"class":"className","for":"htmlFor"};a.c.attr={update:function(b,c){var d=a.a.f(c())||{};a.a.P(d,function(c,d){d=a.a.f(d);var g=c.indexOf(":"),g="lookupNamespaceURI"in b&&0<g&&b.lookupNamespaceURI(c.substr(0,g)),h=!1===d||null===
d||d===n;h?g?b.removeAttributeNS(g,c):b.removeAttribute(c):d=d.toString();8>=a.a.W&&c in V?(c=V[c],h?b.removeAttribute(c):b[c]=d):h||(g?b.setAttributeNS(g,c,d):b.setAttribute(c,d));"name"===c&&a.a.Yc(b,h?"":d)})}};(function(){a.c.checked={after:["value","attr"],init:function(b,c,d){function e(){var e=b.checked,f=g();if(!a.S.Ya()&&(e||!m&&!a.S.qa())){var k=a.u.G(c);if(l){var q=p?k.v():k,z=t;t=f;z!==f?e&&(a.a.Na(q,f,!0),a.a.Na(q,z,!1)):a.a.Na(q,f,e);p&&a.Za(k)&&k(q)}else h&&(f===n?f=e:e||(f=n)),a.m.eb(k,
d,"checked",f,!0)}}function f(){var d=a.a.f(c()),e=g();l?(b.checked=0<=a.a.A(d,e),t=e):b.checked=h&&e===n?!!d:g()===d}var g=a.xb(function(){if(d.has("checkedValue"))return a.a.f(d.get("checkedValue"));if(q)return d.has("value")?a.a.f(d.get("value")):b.value}),h="checkbox"==b.type,m="radio"==b.type;if(h||m){var k=c(),l=h&&a.a.f(k)instanceof Array,p=!(l&&k.push&&k.splice),q=m||l,t=l?g():n;m&&!b.name&&a.c.uniqueName.init(b,function(){return!0});a.o(e,null,{l:b});a.a.B(b,"click",e);a.o(f,null,{l:b});
k=n}}};a.m.wa.checked=!0;a.c.checkedValue={update:function(b,c){b.value=a.a.f(c())}}})();a.c["class"]={update:function(b,c){var d=a.a.Db(a.a.f(c()));a.a.Eb(b,b.__ko__cssValue,!1);b.__ko__cssValue=d;a.a.Eb(b,d,!0)}};a.c.css={update:function(b,c){var d=a.a.f(c());null!==d&&"object"==typeof d?a.a.P(d,function(c,d){d=a.a.f(d);a.a.Eb(b,c,d)}):a.c["class"].update(b,c)}};a.c.enable={update:function(b,c){var d=a.a.f(c());d&&b.disabled?b.removeAttribute("disabled"):d||b.disabled||(b.disabled=!0)}};a.c.disable=
{update:function(b,c){a.c.enable.update(b,function(){return!a.a.f(c())})}};a.c.event={init:function(b,c,d,e,f){var g=c()||{};a.a.P(g,function(g){"string"==typeof g&&a.a.B(b,g,function(b){var k,l=c()[g];if(l){try{var p=a.a.la(arguments);e=f.$data;p.unshift(e);k=l.apply(e,p)}finally{!0!==k&&(b.preventDefault?b.preventDefault():b.returnValue=!1)}!1===d.get(g+"Bubble")&&(b.cancelBubble=!0,b.stopPropagation&&b.stopPropagation())}})})}};a.c.foreach={Rc:function(b){return function(){var c=b(),d=a.a.bc(c);
if(!d||"number"==typeof d.length)return{foreach:c,templateEngine:a.ba.Ma};a.a.f(c);return{foreach:d.data,as:d.as,noChildContext:d.noChildContext,includeDestroyed:d.includeDestroyed,afterAdd:d.afterAdd,beforeRemove:d.beforeRemove,afterRender:d.afterRender,beforeMove:d.beforeMove,afterMove:d.afterMove,templateEngine:a.ba.Ma}}},init:function(b,c){return a.c.template.init(b,a.c.foreach.Rc(c))},update:function(b,c,d,e,f){return a.c.template.update(b,a.c.foreach.Rc(c),d,e,f)}};a.m.Ra.foreach=!1;a.h.ea.foreach=
!0;a.c.hasfocus={init:function(b,c,d){function e(e){b.__ko_hasfocusUpdating=!0;var f=b.ownerDocument;if("activeElement"in f){var g;try{g=f.activeElement}catch(l){g=f.body}e=g===b}f=c();a.m.eb(f,d,"hasfocus",e,!0);b.__ko_hasfocusLastValue=e;b.__ko_hasfocusUpdating=!1}var f=e.bind(null,!0),g=e.bind(null,!1);a.a.B(b,"focus",f);a.a.B(b,"focusin",f);a.a.B(b,"blur",g);a.a.B(b,"focusout",g);b.__ko_hasfocusLastValue=!1},update:function(b,c){var d=!!a.a.f(c());b.__ko_hasfocusUpdating||b.__ko_hasfocusLastValue===
d||(d?b.focus():b.blur(),!d&&b.__ko_hasfocusLastValue&&b.ownerDocument.body.focus(),a.u.G(a.a.Fb,null,[b,d?"focusin":"focusout"]))}};a.m.wa.hasfocus=!0;a.c.hasFocus=a.c.hasfocus;a.m.wa.hasFocus="hasfocus";a.c.html={init:function(){return{controlsDescendantBindings:!0}},update:function(b,c){a.a.fc(b,c())}};(function(){function b(b,d,e){a.c[b]={init:function(b,c,h,m,k){var l,p,q={},t,x,n;if(d){m=h.get("as");var u=h.get("noChildContext");n=!(m&&u);q={as:m,noChildContext:u,exportDependencies:n}}x=(t=
"render"==h.get("completeOn"))||h.has(a.i.pa);a.o(function(){var h=a.a.f(c()),m=!e!==!h,u=!p,r;if(n||m!==l){x&&(k=a.i.Cb(b,k));if(m){if(!d||n)q.dataDependency=a.S.o();r=d?k.createChildContext("function"==typeof h?h:c,q):a.S.qa()?k.extend(null,q):k}u&&a.S.qa()&&(p=a.a.Ca(a.h.childNodes(b),!0));m?(u||a.h.va(b,a.a.Ca(p)),a.Oa(r,b)):(a.h.Ea(b),t||a.i.ma(b,a.i.H));l=m}},null,{l:b});return{controlsDescendantBindings:!0}}};a.m.Ra[b]=!1;a.h.ea[b]=!0}b("if");b("ifnot",!1,!0);b("with",!0)})();a.c.let={init:function(b,
c,d,e,f){c=f.extend(c);a.Oa(c,b);return{controlsDescendantBindings:!0}}};a.h.ea.let=!0;var Q={};a.c.options={init:function(b){if("select"!==a.a.R(b))throw Error("options binding applies only to SELECT elements");for(;0<b.length;)b.remove(0);return{controlsDescendantBindings:!0}},update:function(b,c,d){function e(){return a.a.jb(b.options,function(a){return a.selected})}function f(a,b,c){var d=typeof b;return"function"==d?b(a):"string"==d?a[b]:c}function g(c,d){if(x&&l)a.i.ma(b,a.i.H);else if(t.length){var e=
0<=a.a.A(t,a.w.M(d[0]));a.a.Zc(d[0],e);x&&!e&&a.u.G(a.a.Fb,null,[b,"change"])}}var h=b.multiple,m=0!=b.length&&h?b.scrollTop:null,k=a.a.f(c()),l=d.get("valueAllowUnset")&&d.has("value"),p=d.get("optionsIncludeDestroyed");c={};var q,t=[];l||(h?t=a.a.Mb(e(),a.w.M):0<=b.selectedIndex&&t.push(a.w.M(b.options[b.selectedIndex])));k&&("undefined"==typeof k.length&&(k=[k]),q=a.a.jb(k,function(b){return p||b===n||null===b||!a.a.f(b._destroy)}),d.has("optionsCaption")&&(k=a.a.f(d.get("optionsCaption")),null!==
k&&k!==n&&q.unshift(Q)));var x=!1;c.beforeRemove=function(a){b.removeChild(a)};k=g;d.has("optionsAfterRender")&&"function"==typeof d.get("optionsAfterRender")&&(k=function(b,c){g(0,c);a.u.G(d.get("optionsAfterRender"),null,[c[0],b!==Q?b:n])});a.a.ec(b,q,function(c,e,g){g.length&&(t=!l&&g[0].selected?[a.w.M(g[0])]:[],x=!0);e=b.ownerDocument.createElement("option");c===Q?(a.a.Bb(e,d.get("optionsCaption")),a.w.cb(e,n)):(g=f(c,d.get("optionsValue"),c),a.w.cb(e,a.a.f(g)),c=f(c,d.get("optionsText"),g),
a.a.Bb(e,c));return[e]},c,k);if(!l){var B;h?B=t.length&&e().length<t.length:B=t.length&&0<=b.selectedIndex?a.w.M(b.options[b.selectedIndex])!==t[0]:t.length||0<=b.selectedIndex;B&&a.u.G(a.a.Fb,null,[b,"change"])}(l||a.S.Ya())&&a.i.ma(b,a.i.H);a.a.wd(b);m&&20<Math.abs(m-b.scrollTop)&&(b.scrollTop=m)}};a.c.options.$b=a.a.g.Z();a.c.selectedOptions={init:function(b,c,d){function e(){var e=c(),f=[];a.a.D(b.getElementsByTagName("option"),function(b){b.selected&&f.push(a.w.M(b))});a.m.eb(e,d,"selectedOptions",
f)}function f(){var d=a.a.f(c()),e=b.scrollTop;d&&"number"==typeof d.length&&a.a.D(b.getElementsByTagName("option"),function(b){var c=0<=a.a.A(d,a.w.M(b));b.selected!=c&&a.a.Zc(b,c)});b.scrollTop=e}if("select"!=a.a.R(b))throw Error("selectedOptions binding applies only to SELECT elements");var g;a.i.subscribe(b,a.i.H,function(){g?e():(a.a.B(b,"change",e),g=a.o(f,null,{l:b}))},null,{notifyImmediately:!0})},update:function(){}};a.m.wa.selectedOptions=!0;a.c.style={update:function(b,c){var d=a.a.f(c()||
{});a.a.P(d,function(c,d){d=a.a.f(d);if(null===d||d===n||!1===d)d="";if(v)v(b).css(c,d);else if(/^--/.test(c))b.style.setProperty(c,d);else{c=c.replace(/-(\w)/g,function(a,b){return b.toUpperCase()});var g=b.style[c];b.style[c]=d;d===g||b.style[c]!=g||isNaN(d)||(b.style[c]=d+"px")}})}};a.c.submit={init:function(b,c,d,e,f){if("function"!=typeof c())throw Error("The value for a submit binding must be a function");a.a.B(b,"submit",function(a){var d,e=c();try{d=e.call(f.$data,b)}finally{!0!==d&&(a.preventDefault?
a.preventDefault():a.returnValue=!1)}})}};a.c.text={init:function(){return{controlsDescendantBindings:!0}},update:function(b,c){a.a.Bb(b,c())}};a.h.ea.text=!0;(function(){if(A&&A.navigator){var b=function(a){if(a)return parseFloat(a[1])},c=A.navigator.userAgent,d,e,f,g,h;(d=A.opera&&A.opera.version&&parseInt(A.opera.version()))||(h=b(c.match(/Edge\/([^ ]+)$/)))||b(c.match(/Chrome\/([^ ]+)/))||(e=b(c.match(/Version\/([^ ]+) Safari/)))||(f=b(c.match(/Firefox\/([^ ]+)/)))||(g=a.a.W||b(c.match(/MSIE ([^ ]+)/)))||
(g=b(c.match(/rv:([^ )]+)/)))}if(8<=g&&10>g)var m=a.a.g.Z(),k=a.a.g.Z(),l=function(b){var c=this.activeElement;(c=c&&a.a.g.get(c,k))&&c(b)},p=function(b,c){var d=b.ownerDocument;a.a.g.get(d,m)||(a.a.g.set(d,m,!0),a.a.B(d,"selectionchange",l));a.a.g.set(b,k,c)};a.c.textInput={init:function(b,c,k){function l(c,d){a.a.B(b,c,d)}function m(){var d=a.a.f(c());if(null===d||d===n)d="";L!==n&&d===L?a.a.setTimeout(m,4):b.value!==d&&(y=!0,b.value=d,y=!1,v=b.value)}function r(){w||(L=b.value,w=a.a.setTimeout(z,
4))}function z(){clearTimeout(w);L=w=n;var d=b.value;v!==d&&(v=d,a.m.eb(c(),k,"textInput",d))}var v=b.value,w,L,A=9==a.a.W?r:z,y=!1;g&&l("keypress",z);11>g&&l("propertychange",function(a){y||"value"!==a.propertyName||A(a)});8==g&&(l("keyup",z),l("keydown",z));p&&(p(b,A),l("dragend",r));(!g||9<=g)&&l("input",A);5>e&&"textarea"===a.a.R(b)?(l("keydown",r),l("paste",r),l("cut",r)):11>d?l("keydown",r):4>f?(l("DOMAutoComplete",z),l("dragdrop",z),l("drop",z)):h&&"number"===b.type&&l("keydown",r);l("change",
z);l("blur",z);a.o(m,null,{l:b})}};a.m.wa.textInput=!0;a.c.textinput={preprocess:function(a,b,c){c("textInput",a)}}})();a.c.uniqueName={init:function(b,c){if(c()){var d="ko_unique_"+ ++a.c.uniqueName.rd;a.a.Yc(b,d)}}};a.c.uniqueName.rd=0;a.c.using={init:function(b,c,d,e,f){var g;d.has("as")&&(g={as:d.get("as"),noChildContext:d.get("noChildContext")});c=f.createChildContext(c,g);a.Oa(c,b);return{controlsDescendantBindings:!0}}};a.h.ea.using=!0;a.c.value={init:function(b,c,d){var e=a.a.R(b),f="input"==
e;if(!f||"checkbox"!=b.type&&"radio"!=b.type){var g=[],h=d.get("valueUpdate"),m=!1,k=null;h&&("string"==typeof h?g=[h]:g=a.a.wc(h),a.a.Pa(g,"change"));var l=function(){k=null;m=!1;var e=c(),f=a.w.M(b);a.m.eb(e,d,"value",f)};!a.a.W||!f||"text"!=b.type||"off"==b.autocomplete||b.form&&"off"==b.form.autocomplete||-1!=a.a.A(g,"propertychange")||(a.a.B(b,"propertychange",function(){m=!0}),a.a.B(b,"focus",function(){m=!1}),a.a.B(b,"blur",function(){m&&l()}));a.a.D(g,function(c){var d=l;a.a.Ud(c,"after")&&
(d=function(){k=a.w.M(b);a.a.setTimeout(l,0)},c=c.substring(5));a.a.B(b,c,d)});var p;p=f&&"file"==b.type?function(){var d=a.a.f(c());null===d||d===n||""===d?b.value="":a.u.G(l)}:function(){var f=a.a.f(c()),g=a.w.M(b);if(null!==k&&f===k)a.a.setTimeout(p,0);else if(f!==g||g===n)"select"===e?(g=d.get("valueAllowUnset"),a.w.cb(b,f,g),g||f===a.w.M(b)||a.u.G(l)):a.w.cb(b,f)};if("select"===e){var q;a.i.subscribe(b,a.i.H,function(){q?d.get("valueAllowUnset")?p():l():(a.a.B(b,"change",l),q=a.o(p,null,{l:b}))},
null,{notifyImmediately:!0})}else a.a.B(b,"change",l),a.o(p,null,{l:b})}else a.ib(b,{checkedValue:c})},update:function(){}};a.m.wa.value=!0;a.c.visible={update:function(b,c){var d=a.a.f(c()),e="none"!=b.style.display;d&&!e?b.style.display="":!d&&e&&(b.style.display="none")}};a.c.hidden={update:function(b,c){a.c.visible.update(b,function(){return!a.a.f(c())})}};(function(b){a.c[b]={init:function(c,d,e,f,g){return a.c.event.init.call(this,c,function(){var a={};a[b]=d();return a},e,f,g)}}})("click");
a.ca=function(){};a.ca.prototype.renderTemplateSource=function(){throw Error("Override renderTemplateSource");};a.ca.prototype.createJavaScriptEvaluatorBlock=function(){throw Error("Override createJavaScriptEvaluatorBlock");};a.ca.prototype.makeTemplateSource=function(b,c){if("string"==typeof b){c=c||w;var d=c.getElementById(b);if(!d)throw Error("Cannot find template with ID "+b);return new a.C.F(d)}if(1==b.nodeType||8==b.nodeType)return new a.C.ia(b);throw Error("Unknown template type: "+b);};a.ca.prototype.renderTemplate=
function(a,c,d,e){a=this.makeTemplateSource(a,e);return this.renderTemplateSource(a,c,d,e)};a.ca.prototype.isTemplateRewritten=function(a,c){return!1===this.allowTemplateRewriting?!0:this.makeTemplateSource(a,c).data("isRewritten")};a.ca.prototype.rewriteTemplate=function(a,c,d){a=this.makeTemplateSource(a,d);c=c(a.text());a.text(c);a.data("isRewritten",!0)};a.b("templateEngine",a.ca);a.kc=function(){function b(b,c,d,h){b=a.m.ac(b);for(var m=a.m.Ra,k=0;k<b.length;k++){var l=b[k].key;if(Object.prototype.hasOwnProperty.call(m,
l)){var p=m[l];if("function"===typeof p){if(l=p(b[k].value))throw Error(l);}else if(!p)throw Error("This template engine does not support the '"+l+"' binding within its templates");}}d="ko.__tr_ambtns(function($context,$element){return(function(){return{ "+a.m.vb(b,{valueAccessors:!0})+" } })()},'"+d.toLowerCase()+"')";return h.createJavaScriptEvaluatorBlock(d)+c}var c=/(<([a-z]+\d*)(?:\s+(?!data-bind\s*=\s*)[a-z0-9\-]+(?:=(?:\"[^\"]*\"|\'[^\']*\'|[^>]*))?)*\s+)data-bind\s*=\s*(["'])([\s\S]*?)\3/gi,
d=/\x3c!--\s*ko\b\s*([\s\S]*?)\s*--\x3e/g;return{xd:function(b,c,d){c.isTemplateRewritten(b,d)||c.rewriteTemplate(b,function(b){return a.kc.Ld(b,c)},d)},Ld:function(a,f){return a.replace(c,function(a,c,d,e,l){return b(l,c,d,f)}).replace(d,function(a,c){return b(c,"\x3c!-- ko --\x3e","#comment",f)})},md:function(b,c){return a.aa.Xb(function(d,h){var m=d.nextSibling;m&&m.nodeName.toLowerCase()===c&&a.ib(m,b,h)})}}}();a.b("__tr_ambtns",a.kc.md);(function(){a.C={};a.C.F=function(b){if(this.F=b){var c=
a.a.R(b);this.ab="script"===c?1:"textarea"===c?2:"template"==c&&b.content&&11===b.content.nodeType?3:4}};a.C.F.prototype.text=function(){var b=1===this.ab?"text":2===this.ab?"value":"innerHTML";if(0==arguments.length)return this.F[b];var c=arguments[0];"innerHTML"===b?a.a.fc(this.F,c):this.F[b]=c};var b=a.a.g.Z()+"_";a.C.F.prototype.data=function(c){if(1===arguments.length)return a.a.g.get(this.F,b+c);a.a.g.set(this.F,b+c,arguments[1])};var c=a.a.g.Z();a.C.F.prototype.nodes=function(){var b=this.F;
if(0==arguments.length){var e=a.a.g.get(b,c)||{},f=e.lb||(3===this.ab?b.content:4===this.ab?b:n);if(!f||e.jd){var g=this.text();g&&g!==e.bb&&(f=a.a.Md(g,b.ownerDocument),a.a.g.set(b,c,{lb:f,bb:g,jd:!0}))}return f}e=arguments[0];this.ab!==n&&this.text("");a.a.g.set(b,c,{lb:e})};a.C.ia=function(a){this.F=a};a.C.ia.prototype=new a.C.F;a.C.ia.prototype.constructor=a.C.ia;a.C.ia.prototype.text=function(){if(0==arguments.length){var b=a.a.g.get(this.F,c)||{};b.bb===n&&b.lb&&(b.bb=b.lb.innerHTML);return b.bb}a.a.g.set(this.F,
c,{bb:arguments[0]})};a.b("templateSources",a.C);a.b("templateSources.domElement",a.C.F);a.b("templateSources.anonymousTemplate",a.C.ia)})();(function(){function b(b,c,d){var e;for(c=a.h.nextSibling(c);b&&(e=b)!==c;)b=a.h.nextSibling(e),d(e,b)}function c(c,d){if(c.length){var e=c[0],f=c[c.length-1],g=e.parentNode,h=a.ga.instance,m=h.preprocessNode;if(m){b(e,f,function(a,b){var c=a.previousSibling,d=m.call(h,a);d&&(a===e&&(e=d[0]||b),a===f&&(f=d[d.length-1]||c))});c.length=0;if(!e)return;e===f?c.push(e):
(c.push(e,f),a.a.Ua(c,g))}b(e,f,function(b){1!==b.nodeType&&8!==b.nodeType||a.vc(d,b)});b(e,f,function(b){1!==b.nodeType&&8!==b.nodeType||a.aa.cd(b,[d])});a.a.Ua(c,g)}}function d(a){return a.nodeType?a:0<a.length?a[0]:null}function e(b,e,f,h,m){m=m||{};var n=(b&&d(b)||f||{}).ownerDocument,B=m.templateEngine||g;a.kc.xd(f,B,n);f=B.renderTemplate(f,h,m,n);if("number"!=typeof f.length||0<f.length&&"number"!=typeof f[0].nodeType)throw Error("Template engine must return an array of DOM nodes");n=!1;switch(e){case "replaceChildren":a.h.va(b,
f);n=!0;break;case "replaceNode":a.a.Xc(b,f);n=!0;break;case "ignoreTargetNode":break;default:throw Error("Unknown renderMode: "+e);}n&&(c(f,h),m.afterRender&&a.u.G(m.afterRender,null,[f,h[m.as||"$data"]]),"replaceChildren"==e&&a.i.ma(b,a.i.H));return f}function f(b,c,d){return a.O(b)?b():"function"===typeof b?b(c,d):b}var g;a.gc=function(b){if(b!=n&&!(b instanceof a.ca))throw Error("templateEngine must inherit from ko.templateEngine");g=b};a.dc=function(b,c,h,m,t){h=h||{};if((h.templateEngine||g)==
n)throw Error("Set a template engine before calling renderTemplate");t=t||"replaceChildren";if(m){var x=d(m);return a.$(function(){var g=c&&c instanceof a.fa?c:new a.fa(c,null,null,null,{exportDependencies:!0}),n=f(b,g.$data,g),g=e(m,t,n,g,h);"replaceNode"==t&&(m=g,x=d(m))},null,{Sa:function(){return!x||!a.a.Sb(x)},l:x&&"replaceNode"==t?x.parentNode:x})}return a.aa.Xb(function(d){a.dc(b,c,h,d,"replaceNode")})};a.Qd=function(b,d,g,h,m){function x(b,c){a.u.G(a.a.ec,null,[h,b,u,g,r,c]);a.i.ma(h,a.i.H)}
function r(a,b){c(b,v);g.afterRender&&g.afterRender(b,a);v=null}function u(a,c){v=m.createChildContext(a,{as:z,noChildContext:g.noChildContext,extend:function(a){a.$index=c;z&&(a[z+"Index"]=c)}});var d=f(b,a,v);return e(h,"ignoreTargetNode",d,v,g)}var v,z=g.as,w=!1===g.includeDestroyed||a.options.foreachHidesDestroyed&&!g.includeDestroyed;if(w||g.beforeRemove||!a.Pc(d))return a.$(function(){var b=a.a.f(d)||[];"undefined"==typeof b.length&&(b=[b]);w&&(b=a.a.jb(b,function(b){return b===n||null===b||
!a.a.f(b._destroy)}));x(b)},null,{l:h});x(d.v());var A=d.subscribe(function(a){x(d(),a)},null,"arrayChange");A.l(h);return A};var h=a.a.g.Z(),m=a.a.g.Z();a.c.template={init:function(b,c){var d=a.a.f(c());if("string"==typeof d||"name"in d)a.h.Ea(b);else if("nodes"in d){d=d.nodes||[];if(a.O(d))throw Error('The "nodes" option must be a plain, non-observable array.');var e=d[0]&&d[0].parentNode;e&&a.a.g.get(e,m)||(e=a.a.Yb(d),a.a.g.set(e,m,!0));(new a.C.ia(b)).nodes(e)}else if(d=a.h.childNodes(b),0<d.length)e=
a.a.Yb(d),(new a.C.ia(b)).nodes(e);else throw Error("Anonymous template defined, but no template content was provided");return{controlsDescendantBindings:!0}},update:function(b,c,d,e,f){var g=c();c=a.a.f(g);d=!0;e=null;"string"==typeof c?c={}:(g="name"in c?c.name:b,"if"in c&&(d=a.a.f(c["if"])),d&&"ifnot"in c&&(d=!a.a.f(c.ifnot)),d&&!g&&(d=!1));"foreach"in c?e=a.Qd(g,d&&c.foreach||[],c,b,f):d?(d=f,"data"in c&&(d=f.createChildContext(c.data,{as:c.as,noChildContext:c.noChildContext,exportDependencies:!0})),
e=a.dc(g,d,c,b)):a.h.Ea(b);f=e;(c=a.a.g.get(b,h))&&"function"==typeof c.s&&c.s();a.a.g.set(b,h,!f||f.ja&&!f.ja()?n:f)}};a.m.Ra.template=function(b){b=a.m.ac(b);return 1==b.length&&b[0].unknown||a.m.Id(b,"name")?null:"This template engine does not support anonymous templates nested within its templates"};a.h.ea.template=!0})();a.b("setTemplateEngine",a.gc);a.b("renderTemplate",a.dc);a.a.Kc=function(a,c,d){if(a.length&&c.length){var e,f,g,h,m;for(e=f=0;(!d||e<d)&&(h=a[f]);++f){for(g=0;m=c[g];++g)if(h.value===
m.value){h.moved=m.index;m.moved=h.index;c.splice(g,1);e=g=0;break}e+=g}}};a.a.Pb=function(){function b(b,d,e,f,g){var h=Math.min,m=Math.max,k=[],l,p=b.length,q,n=d.length,r=n-p||1,v=p+n+1,u,w,z;for(l=0;l<=p;l++)for(w=u,k.push(u=[]),z=h(n,l+r),q=m(0,l-1);q<=z;q++)u[q]=q?l?b[l-1]===d[q-1]?w[q-1]:h(w[q]||v,u[q-1]||v)+1:q+1:l+1;h=[];m=[];r=[];l=p;for(q=n;l||q;)n=k[l][q]-1,q&&n===k[l][q-1]?m.push(h[h.length]={status:e,value:d[--q],index:q}):l&&n===k[l-1][q]?r.push(h[h.length]={status:f,value:b[--l],index:l}):
(--q,--l,g.sparse||h.push({status:"retained",value:d[q]}));a.a.Kc(r,m,!g.dontLimitMoves&&10*p);return h.reverse()}return function(a,d,e){e="boolean"===typeof e?{dontLimitMoves:e}:e||{};a=a||[];d=d||[];return a.length<d.length?b(a,d,"added","deleted",e):b(d,a,"deleted","added",e)}}();a.b("utils.compareArrays",a.a.Pb);(function(){function b(b,c,d,h,m){var k=[],l=a.$(function(){var l=c(d,m,a.a.Ua(k,b))||[];0<k.length&&(a.a.Xc(k,l),h&&a.u.G(h,null,[d,l,m]));k.length=0;a.a.Nb(k,l)},null,{l:b,Sa:function(){return!a.a.kd(k)}});
return{Y:k,$:l.ja()?l:n}}var c=a.a.g.Z(),d=a.a.g.Z();a.a.ec=function(e,f,g,h,m,k){function l(b){y={Aa:b,pb:a.ta(w++)};v.push(y);r||F.push(y)}function p(b){y=t[b];w!==y.pb.v()&&D.push(y);y.pb(w++);a.a.Ua(y.Y,e);v.push(y)}function q(b,c){if(b)for(var d=0,e=c.length;d<e;d++)a.a.D(c[d].Y,function(a){b(a,d,c[d].Aa)})}f=f||[];"undefined"==typeof f.length&&(f=[f]);h=h||{};var t=a.a.g.get(e,c),r=!t,v=[],u=0,w=0,z=[],A=[],C=[],D=[],F=[],y,I=0;if(r)a.a.D(f,l);else{if(!k||t&&t._countWaitingForRemove){var E=
a.a.Mb(t,function(a){return a.Aa});k=a.a.Pb(E,f,{dontLimitMoves:h.dontLimitMoves,sparse:!0})}for(var E=0,G,H,K;G=k[E];E++)switch(H=G.moved,K=G.index,G.status){case "deleted":for(;u<K;)p(u++);H===n&&(y=t[u],y.$&&(y.$.s(),y.$=n),a.a.Ua(y.Y,e).length&&(h.beforeRemove&&(v.push(y),I++,y.Aa===d?y=null:C.push(y)),y&&z.push.apply(z,y.Y)));u++;break;case "added":for(;w<K;)p(u++);H!==n?(A.push(v.length),p(H)):l(G.value)}for(;w<f.length;)p(u++);v._countWaitingForRemove=I}a.a.g.set(e,c,v);q(h.beforeMove,D);a.a.D(z,
h.beforeRemove?a.oa:a.removeNode);var M,O,P;try{P=e.ownerDocument.activeElement}catch(N){}if(A.length)for(;(E=A.shift())!=n;){y=v[E];for(M=n;E;)if((O=v[--E].Y)&&O.length){M=O[O.length-1];break}for(f=0;u=y.Y[f];M=u,f++)a.h.Wb(e,u,M)}for(E=0;y=v[E];E++){y.Y||a.a.extend(y,b(e,g,y.Aa,m,y.pb));for(f=0;u=y.Y[f];M=u,f++)a.h.Wb(e,u,M);!y.Ed&&m&&(m(y.Aa,y.Y,y.pb),y.Ed=!0,M=y.Y[y.Y.length-1])}P&&e.ownerDocument.activeElement!=P&&P.focus();q(h.beforeRemove,C);for(E=0;E<C.length;++E)C[E].Aa=d;q(h.afterMove,D);
q(h.afterAdd,F)}})();a.b("utils.setDomNodeChildrenFromArrayMapping",a.a.ec);a.ba=function(){this.allowTemplateRewriting=!1};a.ba.prototype=new a.ca;a.ba.prototype.constructor=a.ba;a.ba.prototype.renderTemplateSource=function(b,c,d,e){if(c=(9>a.a.W?0:b.nodes)?b.nodes():null)return a.a.la(c.cloneNode(!0).childNodes);b=b.text();return a.a.ua(b,e)};a.ba.Ma=new a.ba;a.gc(a.ba.Ma);a.b("nativeTemplateEngine",a.ba);(function(){a.$a=function(){var a=this.Hd=function(){if(!v||!v.tmpl)return 0;try{if(0<=v.tmpl.tag.tmpl.open.toString().indexOf("__"))return 2}catch(a){}return 1}();
this.renderTemplateSource=function(b,e,f,g){g=g||w;f=f||{};if(2>a)throw Error("Your version of jQuery.tmpl is too old. Please upgrade to jQuery.tmpl 1.0.0pre or later.");var h=b.data("precompiled");h||(h=b.text()||"",h=v.template(null,"{{ko_with $item.koBindingContext}}"+h+"{{/ko_with}}"),b.data("precompiled",h));b=[e.$data];e=v.extend({koBindingContext:e},f.templateOptions);e=v.tmpl(h,b,e);e.appendTo(g.createElement("div"));v.fragments={};return e};this.createJavaScriptEvaluatorBlock=function(a){return"{{ko_code ((function() { return "+
a+" })()) }}"};this.addTemplate=function(a,b){w.write("<script type='text/html' id='"+a+"'>"+b+"\x3c/script>")};0<a&&(v.tmpl.tag.ko_code={open:"__.push($1 || '');"},v.tmpl.tag.ko_with={open:"with($1) {",close:"} "})};a.$a.prototype=new a.ca;a.$a.prototype.constructor=a.$a;var b=new a.$a;0<b.Hd&&a.gc(b);a.b("jqueryTmplTemplateEngine",a.$a)})()})})();})();
;
/*=============================================================================
	Author:			Eric M. Barnard - @ericmbarnard								
	License:		MIT (http://opensource.org/licenses/mit-license.php)		
																				
	Description:	Validation Library for KnockoutJS							
	Version:		2.0.4											
===============================================================================
*/

!function(e){"function"==typeof require&&"object"==typeof exports&&"object"==typeof module?e(require("knockout"),exports):"function"==typeof define&&define.amd?define(["knockout","exports"],e):e(ko,ko.validation={})}(function(f,e){if(void 0===f)throw new Error("Knockout is required, please ensure it is loaded before loading this validation plug-in");f.validation=e;var t,i,a,c=f.validation,o=f.utils,p=o.unwrapObservable,n=o.arrayForEach,u=o.extend,r={registerExtenders:!0,messagesOnModified:!0,errorsAsTitle:!0,errorsAsTitleOnModified:!1,messageTemplate:null,insertMessages:!0,parseInputAttributes:!1,writeInputAttributes:!1,decorateInputElement:!1,decorateElementOnModified:!0,errorClass:null,errorElementClass:"validationElement",errorMessageClass:"validationMessage",allowHtmlMessages:!1,grouping:{deep:!1,observable:!0,live:!1},validate:{}},s=u({},r);s.html5Attributes=["required","pattern","min","max","step"],s.html5InputTypes=["email","number","date"],s.reset=function(){u(s,r)},c.configuration=s,c.utils=(t=(new Date).getTime(),i={},a="__ko_validation__",{isArray:function(e){return e.isArray||"[object Array]"===Object.prototype.toString.call(e)},isObject:function(e){return null!==e&&"object"==typeof e},isNumber:function(e){return!isNaN(e)},isObservableArray:function(e){return!!e&&"function"==typeof e.remove&&"function"==typeof e.removeAll&&"function"==typeof e.destroy&&"function"==typeof e.destroyAll&&"function"==typeof e.indexOf&&"function"==typeof e.replace},values:function(e){var t=[];for(var r in e)e.hasOwnProperty(r)&&t.push(e[r]);return t},getValue:function(e){return"function"==typeof e?e():e},hasAttribute:function(e,t){return null!==e.getAttribute(t)},getAttribute:function(e,t){return e.getAttribute(t)},setAttribute:function(e,t,r){return e.setAttribute(t,r)},isValidatable:function(e){return!!(e&&e.rules&&e.isValid&&e.isModified)},insertAfter:function(e,t){e.parentNode.insertBefore(t,e.nextSibling)},newId:function(){return t+=1},getConfigOptions:function(e){return c.utils.contextFor(e)||c.configuration},setDomData:function(e,t){var r=e[a];r||(e[a]=r=c.utils.newId()),i[r]=t},getDomData:function(e){var t=e[a];if(t)return i[t]},contextFor:function(e){switch(e.nodeType){case 1:case 8:var t=c.utils.getDomData(e);if(t)return t;if(e.parentNode)return c.utils.contextFor(e.parentNode)}},isEmptyVal:function(e){return null==e||""===e},getOriginalElementTitle:function(e){var t=c.utils.getAttribute(e,"data-orig-title"),r=e.title;return c.utils.hasAttribute(e,"data-orig-title")?t:r},async:function(e){window.setImmediate?window.setImmediate(e):window.setTimeout(e,0)},forEach:function(e,t){if(c.utils.isArray(e))return n(e,t);for(var r in e)e.hasOwnProperty(r)&&t(e[r],r)}});var l,d,v,g=(l=0,d=c.configuration,v=c.utils,{init:function(e,t){0<l&&!t||((e=e||{}).errorElementClass=e.errorElementClass||e.errorClass||d.errorElementClass,e.errorMessageClass=e.errorMessageClass||e.errorClass||d.errorMessageClass,u(d,e),d.registerExtenders&&c.registerExtenders(),l=1)},reset:c.configuration.reset,group:function(t,r){var i={options:r=u(u({},d.grouping),r),graphMonitor:f.observable(),flagged:[],subscriptions:[],validatables:[]},a=null;return(a=r.observable?f.computed(function(){return i.graphMonitor(),b(t,i),F(i.validatables)}):function(){return b(t,i),F(i.validatables)}).showAllMessages=function(t){void 0===t&&(t=!0),a.forEach(function(e){v.isValidatable(e)&&e.isModified(t)})},a.isAnyMessageShown=function(){return!!a.find(function(e){return v.isValidatable(e)&&!e.isValid()&&e.isModified()})},a.filter=function(e){return e=e||function(){return!0},a(),o.arrayFilter(i.validatables,e)},a.find=function(e){return e=e||function(){return!0},a(),o.arrayFirst(i.validatables,e)},a.forEach=function(e){e=e||function(){},a(),n(i.validatables,e)},a.map=function(e){return e=e||function(e){return e},a(),o.arrayMap(i.validatables,e)},a._updateState=function(e){if(!v.isObject(e))throw new Error("An object is required.");if(t=e,!r.observable)return b(e,i),F(i.validatables);i.graphMonitor.valueHasMutated()},a},formatMessage:function(e,t,r){if(v.isObject(t)&&t.typeAttr&&(t=t.value),"function"==typeof e)return e(t,r);var i=p(t);return null==i&&(i=[]),v.isArray(i)||(i=[i]),e.replace(/{(\d+)}/gi,function(e,t){return void 0!==i[t]?i[t]:e})},addRule:function(e,t){return e.extend({validatable:!0}),o.arrayFirst(e.rules(),function(e){return e.rule&&e.rule===t.rule})||e.rules.push(t),e},addAnonymousRule:function(e,t){void 0===t.message&&(t.message="Error"),t.onlyIf&&(t.condition=t.onlyIf),c.addRule(e,t)},addExtender:function(r){f.extenders[r]=function(e,t){return t&&(t.message||t.onlyIf)?c.addRule(e,{rule:r,message:t.message,params:!!v.isEmptyVal(t.params)||t.params,condition:t.onlyIf}):c.addRule(e,{rule:r,params:t})}},registerExtenders:function(){if(d.registerExtenders)for(var e in c.rules)c.rules.hasOwnProperty(e)&&(f.extenders[e]||c.addExtender(e))},insertValidationMessage:function(e){var t=document.createElement("SPAN");return t.className=v.getConfigOptions(e).errorMessageClass,v.insertAfter(e,t),t},parseInputValidationAttributes:function(i,a){n(c.configuration.html5Attributes,function(e){if(v.hasAttribute(i,e)){var t=i.getAttribute(e)||!0;if("min"===e||"max"===e){var r=i.getAttribute("type");void 0!==r&&r||(r="text"),t={typeAttr:r,value:t}}c.addRule(a(),{rule:e,params:t})}});var t=i.getAttribute("type");n(c.configuration.html5InputTypes,function(e){e===t&&c.addRule(a(),{rule:"date"===e?"dateISO":e,params:!0})})},writeInputValidationAttributes:function(i,e){var t=e();if(t&&t.rules){var a=t.rules();n(c.configuration.html5Attributes,function(t){var r=o.arrayFirst(a,function(e){return e.rule&&e.rule.toLowerCase()===t.toLowerCase()});r&&f.computed({read:function(){var e=f.unwrap(r.params);"pattern"===r.rule&&e instanceof RegExp&&(e=e.source),i.setAttribute(t,e)},disposeWhenNodeIsRemoved:i})}),a=null}},makeBindingHandlerValidatable:function(e){var n=f.bindingHandlers[e].init;f.bindingHandlers[e].init=function(e,t,r,i,a){return n(e,t,r,i,a),f.bindingHandlers.validationCore.init(e,t,r,i,a)}},setRules:function(e,t){var d=function(e,t){if(e&&t)for(var r in t)if(t.hasOwnProperty(r)){var i=t[r];if(e[r]){var a=e[r],n=p(a),s={},u={};for(var l in i)i.hasOwnProperty(l)&&(c.rules[l]?s[l]=i[l]:u[l]=i[l]);if(f.isObservable(a)&&a.extend(s),n&&v.isArray(n))for(var o=0;o<n.length;o++)d(n[o],u);else d(n,u)}}};d(e,t)}});function m(e){n(e.subscriptions,function(e){e.dispose()}),e.subscriptions=[]}function b(e,t){t.validatables=[],m(t),function t(e,r,i){var a=[],n=e.peek?e.peek():e;!0!==e.__kv_traversed&&(r.options.deep&&(e.__kv_traversed=!0,r.flagged.push(e)),i=void 0!==i?i:r.options.deep?1:-1,f.isObservable(e)&&(e.errors||v.isValidatable(e)||e.extend({validatable:!0}),r.validatables.push(e),r.options.live&&v.isObservableArray(e)&&r.subscriptions.push(e.subscribe(function(){r.graphMonitor.valueHasMutated()}))),n&&!n._destroy&&(v.isArray(n)?a=n:v.isObject(n)&&(a=v.values(n))),0!==i&&v.forEach(a,function(e){!e||e.nodeType||f.isComputed(e)&&!e.rules||t(e,r,i+1)}))}(e,t),function(e){e.options.deep&&(n(e.flagged,function(e){delete e.__kv_traversed}),e.flagged.length=0),e.options.live||m(e)}(t)}function F(e){var t=[];return n(e,function(e){v.isValidatable(e)&&!e.isValid()&&t.push(e.error.peek())}),t}function y(u){var l="max"===u;return function(e,t){if(c.utils.isEmptyVal(e))return!0;var r,i,a,n,s;switch(r=void 0===t.typeAttr?(i="text",t):(i=t.typeAttr,t.value),isNaN(r)||r instanceof Date||(i="number"),i.toLowerCase()){case"week":if(a=/^(\d{4})-W(\d{2})$/,null===(n=e.match(a)))throw new Error("Invalid value for "+u+" attribute for week input.  Should look like '2000-W33' http://www.w3.org/TR/html-markup/input.week.html#input.week.attrs.min");return!!(s=r.match(a))&&(l?n[1]<s[1]||n[1]===s[1]&&n[2]<=s[2]:n[1]>s[1]||n[1]===s[1]&&n[2]>=s[2]);case"month":if(a=/^(\d{4})-(\d{2})$/,null===(n=e.match(a)))throw new Error("Invalid value for "+u+" attribute for month input.  Should look like '2000-03' http://www.w3.org/TR/html-markup/input.month.html#input.month.attrs.min");return!!(s=r.match(a))&&(l?n[1]<s[1]||n[1]===s[1]&&n[2]<=s[2]:n[1]>s[1]||n[1]===s[1]&&n[2]>=s[2]);case"number":case"range":return l?!isNaN(e)&&parseFloat(e)<=parseFloat(r):!isNaN(e)&&parseFloat(e)>=parseFloat(r);default:return l?e<=r:r<=e}}}function h(i,a,n){i.isValidating(!0);function e(e){var t=!1,r="";i.__valid__()&&(e.message?(t=e.isValid,r=e.message):t=e,t||(i.error(c.formatMessage(r||n.message||a.message,p(n.params),i)),i.__valid__(t))),i.isValidating(!1)}c.utils.async(function(){a.validator(i(),void 0===n.params||p(n.params),e)})}u(f.validation,g),c.rules={},c.rules.required={validator:function(e,t){var r;return null==e?!t:("string"==typeof(r=e)&&(r=String.prototype.trim?e.trim():e.replace(/^\s+|\s+$/g,"")),!t||0<(r+"").length)},message:"This field is required."},c.rules.min={validator:y("min"),message:"Please enter a value greater than or equal to {0}."},c.rules.max={validator:y("max"),message:"Please enter a value less than or equal to {0}."},c.rules.minLength={validator:function(e,t){return!!c.utils.isEmptyVal(e)||(c.utils.isNumber(e)?""+e:e).length>=t},message:"Please enter at least {0} characters."},c.rules.maxLength={validator:function(e,t){return!!c.utils.isEmptyVal(e)||(c.utils.isNumber(e)?""+e:e).length<=t},message:"Please enter no more than {0} characters."},c.rules.pattern={validator:function(e,t){return c.utils.isEmptyVal(e)||null!==e.toString().match(t)},message:"Please check this value."},c.rules.step={validator:function(e,t){if(c.utils.isEmptyVal(e)||"any"===t)return!0;var r=100*e%(100*t);return Math.abs(r)<1e-5||Math.abs(1-r)<1e-5},message:"The value must increment by {0}."},c.rules.email={validator:function(e,t){return!t||(c.utils.isEmptyVal(e)||t&&/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i.test(e))},message:"Please enter a proper email address."},c.rules.date={validator:function(e,t){return!t||(c.utils.isEmptyVal(e)||t&&!/Invalid|NaN/.test(new Date(e)))},message:"Please enter a proper date."},c.rules.dateISO={validator:function(e,t){return!t||(c.utils.isEmptyVal(e)||t&&/^\d{4}[-/](?:0?[1-9]|1[012])[-/](?:0?[1-9]|[12][0-9]|3[01])$/.test(e))},message:"Please enter a proper date."},c.rules.number={validator:function(e,t){return!t||(c.utils.isEmptyVal(e)||t&&/^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(e))},message:"Please enter a number."},c.rules.digit={validator:function(e,t){return!t||(c.utils.isEmptyVal(e)||t&&/^\d+$/.test(e))},message:"Please enter a digit."},c.rules.phoneUS={validator:function(e,t){return!t||(!!c.utils.isEmptyVal(e)||"string"==typeof e&&(e=e.replace(/\s+/g,""),t&&9<e.length&&e.match(/^(1-?)?(\([2-9]\d{2}\)|[2-9]\d{2})-?[2-9]\d{2}-?\d{4}$/)))},message:"Please specify a valid phone number."},c.rules.equal={validator:function(e,t){var r=t;return e===c.utils.getValue(r)},message:"Values must equal."},c.rules.notEqual={validator:function(e,t){var r=t;return e!==c.utils.getValue(r)},message:"Please choose another value."},c.rules.unique={validator:function(t,r){var e=c.utils.getValue(r.collection),i=c.utils.getValue(r.externalValue),a=0;return!t||!e||(o.arrayFilter(e,function(e){t===(r.valueAccessor?r.valueAccessor(e):e)&&a++}),a<(i?1:2))},message:"Please make sure the value is unique."},c.registerExtenders(),f.bindingHandlers.validationCore={init:function(e,t,r,i,a){var n=c.utils.getConfigOptions(e),s=t();if(n.parseInputAttributes&&c.utils.async(function(){c.parseInputValidationAttributes(e,t)}),n.insertMessages&&c.utils.isValidatable(s)){var u=c.insertValidationMessage(e);n.messageTemplate?f.renderTemplate(n.messageTemplate,{field:s},null,u,"replaceNode"):f.applyBindingsToNode(u,{validationMessage:s})}n.writeInputAttributes&&c.utils.isValidatable(s)&&c.writeInputValidationAttributes(e,t),n.decorateInputElement&&c.utils.isValidatable(s)&&f.applyBindingsToNode(e,{validationElement:s})}},c.makeBindingHandlerValidatable("value"),c.makeBindingHandlerValidatable("checked"),f.bindingHandlers.textInput&&c.makeBindingHandlerValidatable("textInput"),c.makeBindingHandlerValidatable("selectedOptions"),f.bindingHandlers.validationMessage={update:function(e,t){var r,i,a=t(),n=c.utils.getConfigOptions(e);p(a);if(null==a)throw new Error("Cannot bind validationMessage to undefined value. data-bind expression: "+e.getAttribute("data-bind"));r=a.isModified&&a.isModified(),i=a.isValid&&a.isValid();var s=null;n.messagesOnModified&&!r||(s=i?null:a.error);var u=!(n.messagesOnModified&&!r)&&!i,l="none"!==e.style.display;n.allowHtmlMessages?o.setHtml(e,s):f.bindingHandlers.text.update(e,function(){return s}),l&&!u?e.style.display="none":!l&&u&&(e.style.display="")}},f.bindingHandlers.validationElement={update:function(r,e,t){var i,a,n=e(),s=c.utils.getConfigOptions(r);p(n);if(null==n)throw new Error("Cannot bind validationElement to undefined value. data-bind expression: "+r.getAttribute("data-bind"));i=n.isModified&&n.isModified(),a=n.isValid&&n.isValid();f.bindingHandlers.css.update(r,function(){var e={},t=!(s.decorateElementOnModified&&!i)&&!a;return e[s.errorElementClass]=t,e},t),s.errorsAsTitle&&f.bindingHandlers.attr.update(r,function(){var e=!s.errorsAsTitleOnModified||i,t=c.utils.getOriginalElementTitle(r);return e&&!a?{title:n.error,"data-orig-title":t}:!e||a?{title:t,"data-orig-title":null}:void 0})}},f.bindingHandlers.validationOptions={init:function(e,t,r,i,a){var n=p(t());if(n){var s=u({},c.configuration);u(s,n),c.utils.setDomData(e,s)}}},f.extenders.validation=function(t,e){return n(c.utils.isArray(e)?e:[e],function(e){c.addAnonymousRule(t,e)}),t},f.extenders.validatable=function(i,e){if(c.utils.isObject(e)||(e={enable:e}),"enable"in e||(e.enable=!0),e.enable&&!c.utils.isValidatable(i)){var t=c.configuration.validate||{},r={throttleEvaluation:e.throttle||t.throttle};i.error=f.observable(null),i.rules=f.observableArray(),i.isValidating=f.observable(!1),i.__valid__=f.observable(!0),i.isModified=f.observable(!1),i.isValid=f.computed(i.__valid__),i.setError=function(e){var t=i.error.peek(),r=i.__valid__.peek();i.error(e),i.__valid__(!1),t===e||r||i.isValid.notifySubscribers()},i.clearError=function(){return i.error(null),i.__valid__(!0),i};var a=i.subscribe(function(){i.isModified(!0)}),n=f.computed(u({read:function(){i(),i.rules();return c.validateObservable(i),!0}},r));u(n,r),i._disposeValidation=function(){i.isValid.dispose(),i.rules.removeAll(),a.dispose(),n.dispose(),delete i.rules,delete i.error,delete i.isValid,delete i.isValidating,delete i.__valid__,delete i.isModified,delete i.setError,delete i.clearError,delete i._disposeValidation}}else!1===e.enable&&i._disposeValidation&&i._disposeValidation();return i},c.validateObservable=function(e){for(var t,r,i,a,n,s=0,u=e.rules(),l=u.length;s<l;s++)if(!(r=u[s]).condition||r.condition())if((t=r.rule?c.rules[r.rule]:r).async||r.async)h(e,t,r);else if(i=e,n=r,!(a=t).validator(i(),void 0===n.params||p(n.params))&&(i.setError(c.formatMessage(n.message||a.message,p(n.params),i)),1))return!1;return e.clearError(),!0};var x,E={};c.defineLocale=function(e,t){return e&&t?E[e.toLowerCase()]=t:null},c.locale=function(e){if(e){if(e=e.toLowerCase(),!E.hasOwnProperty(e))throw new Error("Localization "+e+" has not been loaded.");c.localize(E[e]),x=e}return x},c.localize=function(e){var t=c.rules;for(var r in e)t.hasOwnProperty(r)&&(t[r].message=e[r])},function(){var e={},t=c.rules;for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r].message);c.defineLocale("en-us",e)}(),x="en-us",f.applyBindingsWithValidation=function(e,t,r){var i,a=document.body;i=t&&t.nodeType?(a=t,r):t,c.init(),i&&(i=u(u({},c.configuration),i),c.utils.setDomData(a,i)),f.applyBindings(e,a)};var A=f.applyBindings;f.applyBindings=function(){c.init(),A.apply(this,arguments)},f.validatedObservable=function(e,t){if(!t&&!c.utils.isObject(e))return f.observable(e).extend({validatable:!0});var r=f.observable(e);return r.errors=c.group(c.utils.isObject(e)?e:{},t),r.isValid=f.observable(0===r.errors().length),f.isObservable(r.errors)?r.errors.subscribe(function(e){r.isValid(0===e.length)}):f.computed(r.errors).subscribe(function(e){r.isValid(0===e.length)}),r.subscribe(function(e){c.utils.isObject(e)||(e={}),r.errors._updateState(e),r.isValid(0===r.errors().length)}),r}});
//# sourceMappingURL=knockout.validation.min.js.map;
ko.wrapObservable = function (object, wrapParent, wrapChildren) {
    if (typeof wrapParent === "undefined") wrapParent = true;
    if (typeof wrapChildren === "undefined") wrapChildren = true;    

    var makeChildrenObservables = function (object, isParent) {

        if (!isParent && !ko.isObservable(object)) return;

        var unwrappedObject = typeof (object) === "function" ? object() : object;

        // Loop through its children
        for (var child in unwrappedObject) {
            if (unwrappedObject.hasOwnProperty(child) && !ko.isObservable(unwrappedObject[child])) {
                unwrappedObject[child] = ko.observable(unwrappedObject[child]);
            }
            makeChildrenObservables(unwrappedObject[child], false);
        }

        return object;
    };

    var observable = object;

    if (wrapChildren) {
        observable = makeChildrenObservables(object, true);
    }

    if (wrapParent && !ko.isObservable(observable)) {
        observable = ko.observable(observable);
    }


	return observable;
};
ko.bindingHandlers.idleCommit = {
    init: function (element, valueAccessor, bindingAccessor) {

        var options = valueAccessor();
        var idleTime = options.idleTime ? options.idleTime : 1500;
        var valueObservable = options.value;

        var timeoutId;
        element.addEventListener("keydown", function () {
            //Stop timeout
            clearTimeout(timeoutId);

            timeoutId = setTimeout(function () {
                //Set the observable value
                valueObservable(element.value);
            }, idleTime);

            return true;
        });
    }
};;
(function () {
    //show modal handler
    ko.bindingHandlers.showModal = {
        init: function (element, valueAccessor) {
            var value = valueAccessor();

            //For some reason, this will not work for some observables
            if (ko.isObservable(value) || typeof value === "function") {

                $(element).on('hidden.bs.modal', function () {
                    try {
                        value(undefined);
                    }
                    catch (ex) {
                        //do nothing
                    }
                });

                value.subscribe(function () {
                    if (value()) {
                        $(element).modal('show');
                        // this is to focus input field inside dialog
                        $("input", element).focus();
                    }
                    else {
                        $(element).modal('hide');
                        //$('body').removeClass('modal-open');
                        //$('.modal-backdrop').remove();
                    }
                });
            }
        }
    };
})();;
var urlTemplateLoader = {
    loadTemplate: function(name, templateConfig, callback) {
        if (templateConfig.fromUrl) {
            // Uses jQuery's ajax facility to load the markup from a file
            var fullUrl = templateConfig.fromUrl + '?cacheAge=' + templateConfig.maxCacheAge;
            $.get(fullUrl, function(markupString) {
                // We need an array of DOM nodes, not a string.
                // We can use the default loader to convert to the
                // required format.
                ko.components.defaultLoader.loadTemplate(name, markupString, callback);
            });
        } else {
            // Unrecognized config format. Let another loader handle it.
            callback(null);
        }
    } 
};

ko.components.loaders.unshift(urlTemplateLoader);;
ko.bindingHandlers.datepicker = {
    init: function (element, valueAccessor, allBindingsAccessor) {
        //initialize datepicker with some optional options
        var options = valueAccessor();
        var allowedDates = options.allowedDates;
        var buttonClicked = options.buttonClicked;
        var altFieldId = options.altFieldId;
        var altFormat = options.altFormat;
        var dateFormat = options.dateFormat;
        var datePickerParameters = options.datePickerParameters || {};
        $el = $(element);

        //scrub allowed dates
        if (allowedDates().length) {
            allowedDates().forEach(function (allowedDate) {
                allowedDate.setHours(0, 0, 0, 0);
            });
        }
        else {
            let defaultDateSub = allowedDates.subscribe(function () {
                if (allowedDates().length) {
                    $(element).datepicker("option", "defaultDate", allowedDates()[0]);
                    if (!options.actualDate()) {
                        options.actualDate(allowedDates()[0]);
                    }
                    defaultDateSub.dispose();
                }
            });
        }

        options.actualDate.subscribe(function () {
            $(element).datepicker("setDate", new Date(options.actualDate()));
        });


        //create date picker parameters
        datePickerParameters.beforeShowDay = validateDate;
        datePickerParameters.altField = "#" + altFieldId;
        datePickerParameters.altFormat = typeof (altFormat) === "function" && altFormat() ? altFormat() : "m/d/yy";
        if (allowedDates() && allowedDates().length > 0) {
            datePickerParameters.defaultDate = allowedDates()[0];
        }

        if (datePickerParameters.defaultDate) {
            //subscribe to allowedDates
            let defaultDateSub = allowedDates.subscribe(function () {

                defaultDateSub.dispose();
            });
        }

        if (typeof (dateFormat) === "function") {
            if (dateFormat()) {
                datePickerParameters.dateFormat = dateFormat();
                $(element).datepicker(datePickerParameters);
                if (options.actualDate()) {
                    $(element).datepicker("setDate", new Date(options.actualDate()));
                }
            }
            else {
                dateFormat.subscribe(function (format) {
                    datePickerParameters.dateFormat = format;
                    $(element).datepicker(datePickerParameters);
                    if (options.actualDate()) {
                        $(element).datepicker("setDate", new Date(options.actualDate()));
                    }
                });
            }
        }
        else {
            $(element).datepicker(datePickerParameters);
            if (options.actualDate()) {
                $(element).datepicker("setDate", new Date(options.actualDate()));
            }
        }

        //Set dates allowed
        function validateDate(date) {
            if (!allowedDates()) {
                return [true, ""];
            }

            for (i in allowedDates()) {
                if (allowedDates()[i] && typeof (allowedDates()[i].getTime) == "function" && date.getTime() == allowedDates()[i].getTime())
                    return [true, ""];
            }

            return [false, ""];
        }

        //Subscribe to the button click
        buttonClicked.subscribe(function (item, event) {
            $(element).datepicker("show");
        });

        //handle the field changing by registering datepicker's changeDate event
        ko.utils.registerEventHandler(element, "changeDate", function () {
        });

        //handle disposal (if KO removes by the template binding)
        ko.utils.domNodeDisposal.addDisposeCallback(element, function () {
            $(element).datepicker("destroy");
        });
    },
    update: function (element, valueAccessor, allBindingsAccessor) {
        var displayDate = valueAccessor().displayDate();  //This needs to be referenced in order for this function to be executed
        var date = $(element).datepicker("getDate");

        if (date) {
            valueAccessor().actualDate(date);
        }    }
};

ko.components.register('date-widget', {
    viewModel: function (params) {
        /*
        params: {
            dateLabel: ,
            dateValue: ,
            allowedDates:,
            disable:,
            showButton:,
            css: {
                widgetContainerCssClass:,
                dateOuterContainerCssClass:,
                dateInnerContainerCssClass:,
                dateLabelCssClass:,
                dateControlCssClass:
            }
        }
        */
        ko.validation.init({
            registerExtenders: true,
            messagesOnModified: true,
            insertMessages: false,
            parseInputAttributes: true,
            messageTemplate: null
        }, true);

        var self = {};
        self.css = params.css != null ? params.css : {};
        self.dateValue = params.dateValue;

        if (params.allowedDates) {
            if (typeof (params.allowedDates) === "function") {
                self.allowedDates = params.allowedDates;
            }
            else {
                self.allowedDates = ko.observable(params.allowedDates);
            }
        }
        else {
            self.allowedDates = ko.observable();
        }

        self.disable = params.disable ? params.disable : ko.observable(false);
        self.showButton = params.showButton ? params.showButton : ko.observable(true);
        self.buttonClicked = ko.observable();
        self.format = params.format;
        self.uniqueId = "altField" + new Date().getTime();


        self.data = ko.validatedObservable({
            displayDate: ko.observable(),
            date: params.enableValidation ?
                params.dateValue.extend({
                    required: {
                        params: true,
                        message: translations.C660
                    },
                    date: true
                })
                : params.dateValue
        });

        return self;
    },
    template:
    '\
        <div class="input-group">\
            <input class="typeahead" type="text" data-bind="css: typeof(css.dateControlCssClass) != \'undefined\' ? css.dateControlCssClass : \'form-control\', value: data().displayDate, disable: disable, datepicker: { altFieldId: uniqueId, actualDate: data().date, displayDate: data().displayDate, dateFormat: format, allowedDates: allowedDates, buttonClicked: buttonClicked }">\
            <input type="hidden" data-bind="attr: { \'id\': uniqueId }, value: data().date" />\
            <!-- ko if: showButton -->\
                <span class="input-group-btn" style="top: -2px">\
                    <button class="btn btn-primary" data-bind="click: buttonClicked"><span class="glyphicon glyphicon-calendar"></span></button>\
                </span>\
            <!-- /ko -->\
        </div>\
        '
});;
ko.components.register('time-widget', {
    viewModel: function (params) {
        /*
        dependencies:  moment.js
        params: {
            timeValue:,
            dateValue:,
            startTime:,
            endTime:,
            timeFrames: [ { startTime, endTime }  ]
            disable:,
            interval:,
            css: {
                widgetContainerCssClass:,
                dateOuterContainerCssClass:,
                dateInnerContainerCssClass:,
                dateLabelCssClass:,
                dateControlCssClass:
            }
        }
        */
        ko.validation.init({
            registerExtenders: true,
            messagesOnModified: true,
            insertMessages: false,
            parseInputAttributes: true,
            messageTemplate: null
        }, true);

        var self = {};
        self.timeValue = ko.wrapObservable(params.timeValue);
        self.dateValue = ko.wrapObservable(params.dateValue);
        self.startTime = ko.wrapObservable(params.startTime);
        self.endTime = ko.wrapObservable(params.endTime);
        self.timeFrames = ko.wrapObservable(params.timeFrames);
        self.interval = ko.wrapObservable(params.interval ? params.interval : 15);
        self.disable = ko.wrapObservable(params.disable);

        self.timeValue.subscribe(function () {
            if (self.timeValue()) {
                var date = moment(self.dateValue());

                var dateTime = moment(date.format("YY/MM/DD ") + self.timeValue(), "YYYY-MM-DD hh:mm:ss A");

                if (self.dateValue() !== dateTime.format("YYYY-MM-DDTHH:mm:ss")) {
                    self.dateValue(dateTime.format("YYYY-MM-DDTHH:mm:ss"));
                }
            }
        });
        self.dateValue.subscribe(getTimeFromDateValue);


        function getTimeFromDateValue() {
            if (self.dateValue()) {
                var date = moment(self.dateValue());

                var time = date.format("hh:mm A");

                if (time !== self.timeValue()) {
                    self.timeValue(time);
                }
            }
            else {
                self.timeValue(undefined);
            }
        }



        self.css = params.css !== null ? params.css : {};


        self.times = ko.computed(function () {

            var times = [undefined];
            var date = moment(self.dateValue()).startOf("day");

            if (self.timeFrames() && self.timeFrames().length > 0) {
                self.timeFrames().forEach(function (timeFrame) {
                    var timeFrameObject = ko.toJS(timeFrame); 

                    getTimes(date, timeFrameObject.startTime, timeFrameObject.endTime, self.interval()).forEach(function (time) {
                        times.push(time);
                    }); 
                });
            }
            else {
                getTimes(date, self.startTime(), self.endTime(), self.interval()).forEach(function (time) {
                    times.push(time);
                });
            }

            return times;
        });

        function getTimes(date, startTime, endTime, interval) {
            var times = [];

            startTime = startTime || "12:00 AM";
            var startDate = moment(date.format("YY/MM/DD ") + startTime, "YY/MM/DD hh:mm A");

            endTime = endTime || "11:59 PM";
            var endDate = moment(date.format("YY/MM/DD ") + endTime, "YY/MM/DD hh:mm A");

            var day = date.day();
            while (date.day() === day) {
                if (date.isSameOrAfter(startDate) && date.isSameOrBefore(endDate)) {
                    times.push(date.format("hh:mm A"));
                }

                date = moment(date).add(interval, "minutes");
            }

            //If the picker would be empty, prefer the start time
            if (times.length === 0) {
                times.push(date.format("hh:mm A"));
            }

            return times;
        }

        //Initialize
        getTimeFromDateValue();

        return self;
    },
    template:
        '\
    <select data-bind="disable: disable, css: \'form-control\',\
        value: timeValue,\
        options: times,"></select>\
    '
});;
ko.components.register('file-upload-widget', {
    viewModel: function (params) {
        /*
        params: {
            fileLinkValue: observable,
            fileDescription: observable,
            uploadFileFunction: ko.observable(function),
            availableFileCategoryNames,
            availableFileTypeNames
            css: {
            }
        }
        */
        ko.validation.init({
            registerExtenders: true,
            messagesOnModified: true,
            insertMessages: false,
            parseInputAttributes: true,
            messageTemplate: null
        }, true);

        var self = {};
        self.uniqueComponentId = ko.observable();
        self.css = params.css ? params.css : {};
        self.fileIdValue = ko.wrapObservable(params.fileIdValue);
        self.fileLinkValue = ko.wrapObservable(params.fileLinkValue);
        self.fileDescription = ko.wrapObservable(params.fileDescription);
        self.boothNumber = ko.observable();
        self.allowSelection = ko.wrapObservable(params.allowSelection);
        self.hideFileDescription = ko.wrapObservable(params.hideFileDescription);
        self.hideBoothNumber = ko.wrapObservable(params.hideBoothNumber);

        if (params.availableFileCategoryNames) {
            if (typeof (params.availableFileCategoryNames) === "function") {
                self.availableFileCategoryNames = params.availableFileCategoryNames;
            }
            else {
                self.availableFileCategoryNames = ko.observable(params.availableFileCategoryNames);
            }
        }
        else {
            //Defaulted to a commonly used GES US value
            self.availableFileCategoryNames = ko.observable(['Graphics Depot']);
        }

        if (params.availableFileTypeNames) {
            if (typeof (params.availableFileTypeNames) === "function") {
                self.availableFileTypeNames = params.availableFileTypeNames;
            }
            else {
                self.availableFileTypeNames = ko.observable(params.availableFileTypeNames);
            }
        }
        else {
            //Defaulted to a commonly used GES US value
            self.availableFileTypeNames = ko.observable(['Expresso Signs']);
        }

        //Text content
        self.boothNumberLabel = ko.wrapObservable(params.boothNumberLabel);
        self.fileDescriptionLabel = ko.wrapObservable(params.fileDescriptionLabel);
        self.fileCategoryLabel = ko.wrapObservable(params.fileCategoryLabel);
        self.fileTypeLabel = ko.wrapObservable(params.fileTypeLabel);
        self.fileUploadLabel = ko.wrapObservable(params.fileUploadLabel);
        self.browseButtonLabel = ko.wrapObservable(params.browseButtonLabel);
        self.fileUploadAlert = ko.wrapObservable(params.lblFileFailedToUploadMessage);
        //Lookups
        self.fileCategories = ko.observableArray();
        self.fileTypes = ko.observableArray();
        self.fileCategoryId = ko.wrapObservable(params.fileCategoryId);
        self.fileTypeId = ko.wrapObservable(params.fileTypeId);
        self.categoryFileTypes = ko.computed(function () {
            if (self.fileCategories() && self.fileCategoryId() && self.fileTypes()) {
                var fileTypes = self.fileTypes().filter(function (fileType) {
                    return fileType.category_id == self.fileCategoryId();
                });

                return fileTypes;
            }
        });
        self.userFiles = ko.observable();
        self.typedUserFiles = ko.computed(function () {
            if (self.fileTypeId() && self.userFiles()) {
                var userFiles = self.userFiles().filter(function (userFile) {
                    return userFile.type_id == self.fileTypeId()
                });

                return userFiles;
            }
        });

        self.fileName = ko.observable();
        self.successfulUpload = ko.observable();
        self.failedUpload = ko.observable();
        self.uploadErrorMessages = ko.observable();
        self.fileToUpload = ko.observable();
        self.uploading = ko.observable();
        self.disabled = params.disabled ? params.disabled : ko.observable(false);
        self.showButton = params.showButton ? params.showButton : ko.observable(true);
        self.showInstanceId = ko.observable();

        userContext.subscribeOnInitialized(function () {
            if (userContext.selectedRegistration() != null) {
                self.boothNumber(userContext.selectedRegistration().BoothNumber);
                getFileLookups();

            }
        });

        function getFileLookups(callback) {
            self.showInstanceId(userContext.selectedRegistration().ShowInstanceID);

            var projectCode = location.pathname.split('/')[1];

            //Get lookups
            fileLibraryService.getLookups(projectCode, function (lookups) {
                self.uniqueComponentId('fileUpload' + (new Date().getDate()));
                if (self.availableFileCategoryNames && self.availableFileCategoryNames()) {
                    var availableFileCategories = lookups.FileCategories.filter(function (fileCategory) {
                        return self.availableFileCategoryNames().indexOf(fileCategory.name) > -1;
                    });

                    self.fileCategories(availableFileCategories);
                }
                else {
                    self.fileCategories(lookups.FileCategories);
                }

                if (!self.fileCategoryId()) {
                    self.fileCategoryId(self.fileCategories()[0].id);
                }

                if (self.availableFileTypeNames && self.availableFileTypeNames()) {
                    var availableFileTypes = lookups.FileTypes.filter(function (fileType) {
                        return self.availableFileTypeNames().indexOf(fileType.name) > -1;
                    });

                    self.fileTypes(availableFileTypes);
                }
                else {
                    self.fileTypes(lookups.FileTypes);
                }

                if (!self.fileTypeId()) {
                    self.fileTypeId(self.fileTypes()[0].id);
                }

                self.userFiles(lookups.UserFiles);

                if (typeof (callback) === "function") {
                    callback();
                }
            });
        }

        //load the upload function into the provided observable
        if (typeof (params.uploadFileFunction) === "function") {
            params.uploadFileFunction(uploadFile);
        }

        function checkUserFileSize() {
            return true;
        };

        self.fileChosen = function (observableData, e) {
            self.fileUploadAlert(params.lblFileFailedToUploadMessage);
            var fileData = e.target.files[0];
            var fileExtension = params.fileExtension.toLowerCase().trim().split(',');
            var fileExt = getFileExtension(fileData.name);
            if (fileExtension.includes(fileExt.toLowerCase())) {
                self.fileName(fileData.name);
                self.uploading(true);

                //Upload the file, then get the lookups
                fileLibraryService.uploadUserFile(self.showInstanceId(), self.boothNumber(), self.fileDescription(), self.fileCategoryId(), self.fileTypeId(), fileData,
                    function (data) {

                        //Check for errors
                        if (data.ErrorResults && data.ErrorResults.length > 0) {
                            var errorMessages = [];

                            data.ErrorResults.forEach(function (errorResult) {
                                errorMessages.push(errorResult.ErrorMessage);
                            });
                            self.fileName(undefined);

                            self.uploadErrorMessages(errorMessages);
                            self.failedUpload(true);
                            setTimeout(function () {
                                self.failedUpload(undefined);
                            }, 10000);
                        }
                        else {
                            self.successfulUpload(true);
                            setTimeout(function () {
                                self.successfulUpload(undefined);
                            }, 5000);

                            var existingFiles = self.userFiles();

                            data.NewFiles.forEach(function (newFile) {
                                //self.fileIdValue(newFile.NewUUID);
                                self.fileName(undefined);
                                self.fileLinkValue(document.location.origin + '/FileLibrary/RetrieveFile/' + newFile.NewUUID);
                                var userFiles = self.userFiles();
                                userFiles.push(newFile.UserFile);
                                self.userFiles(userFiles);
                            });
                        }
                    });
            } else {
                self.fileUploadAlert(params.lblErrorMessageLabel);
                self.failedUpload(true);
                setTimeout(function () {
                    self.failedUpload(undefined);
                }, 10000);
                this.value = '';                
            }

        }

        function uploadFile() {
        }

        function getFileExtension(filename) {
            return filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2);
        }

        return self;
    },
    template:
        '\
    <!-- ko if: !hideBoothNumber() -->\
    <div class="row">\
        <div class="col-xs-12">\
            <label data-bind="text: boothNumberLabel"></label>\
        </div>\
    </div>\
    <div class="row">\
        <div class="col-xs-3">\
            <input type="text" class="form-control" data-bind="value: boothNumber">\
        </div>\
    </div>\
    <!-- /ko -->\
    <!-- ko if: !hideFileDescription() -->\
    <div class="row">\
        <div class="col-xs-12">\
            <label data-bind="text: fileDescriptionLabel"></label>\
        </div>\
    </div>\
    <div class="row">\
        <div class="col-xs-12">\
            <textarea class="form-control" data-bind="value: fileDescription"></textarea>\
        </div>\
    </div>\
    <!-- /ko -->\
    <div class="row">\
        <div data-bind="css: { \'show\': successfulUpload }" class="col-xs-12 alert alert-success uploadNotice" role="alert">\
            <strong>Success!</strong>\
            <span>Your File Has Been Uploaded.</span>\
        </div>\
        <div data-bind="css: { \'show\': failedUpload }" class="col-xs-12 alert alert-danger uploadNotice" role="alert">\
            <strong data-bind="text: fileUploadAlert"></strong>\
            <ul data-bind=\'foreach: uploadErrorMessages\'>\
                <li data-bind=\'text: $data\'></li>\
            </ul>\
        </div>\
        <!-- ko if: fileUploadLabel -->\
        <div class="col-xs-12">\
            <label data-bind="text: fileUploadLabel"></label>\
        </div>\
        <!-- /ko -->\
        <!-- ko if: allowSelection -->\
        <div class="col-xs-1">\
            <input type="radio" style="margin-top: 10px;" data-bind="attr: { id: \'newFile\', name: uniqueComponentId  }, checkedValue: undefined, checked: fileLinkValue">\
        </div>\
        <!-- /ko -->\
        <div data-bind="class: allowSelection() ? \'col-xs-11\' : \'col-xs-12\'">\
            <div class="row" data-bind="if: fileCategories() && fileCategories().length > 1 && fileTypes() && fileTypes().length > 1">\
                <div class="form-group col-xs-6">\
                    <label data-bind="text: fileCategoryLabel">:</label>\
                    <select data-bind="css: \'form-control\',\
                        value: fileCategoryId,\
                        options: fileCategories,\
                        optionsText: \'name\',\
                        optionsValue: \'id\'"></select>\
                </div>\
                <div class="form-group  col-xs-6">\
                    <label data-bind="text: fileTypeLabel">:</label>\
                    <select data-bind="css: \'form-control\',\
                        value: fileTypeId,\
                        options: fileTypes,\
                        optionsText: \'name\',\
                        optionsValue: \'id\'"></select>\
                </div>\
            </div>\
            <div class="input-group">\
                <span class="input-group-btn" style="top: -2px">\
                    <label class="btn btn-default">\
                        <span data-bind="text: browseButtonLabel"></span> <input data-bind="event: { change: fileChosen }, disabled: uploading" type="file" class="hidden">\
                    </label >\
                </span>\
                <input class="form-control" disabled data-bind="value: fileName" />\
            </div>\
        </div>\
    </div>\
    <!-- ko if: allowSelection -->\
    <div data-bind="foreach: typedUserFiles">\
        <div class="row">\
            <div class="col-xs-1">\
                <input type="radio" style="margin-top: 10px;" data-bind="attr: { id: \'file\' + id, name: $root.uniqueComponentId }, checkedValue: document.location.origin+\'/FileLibrary/RetrieveFile/\' +uuid, checked: $parent.fileLinkValue">\
            </div>\
            <div class="col-xs-11">\
                <div class="row">\
                    <div class="col-xs-6">\
                        <a data-bind="attr: { href: \'/FileLibrary/RetrieveFile/\' + uuid  }"><span data-bind="text: file_name.split(\'\/\')[file_name.split(\'\/\').length - 1]"></span></a>\
                    </div>\
                    <div class="col-xs-6">\
                        <span data-bind="text: description"></span>\
                    </div>\
                </div>\
            </div>\
        </div>\
    </div>\
    <!-- /ko -->\
'
});;
ko.bindingHandlers.scrollIntoView = {
    init: function (element, valueAccessor, allBindingsAccessor) {
        //initialize datepicker with some optional options

        element.addEventListener("click", function () {
            var scrollElement = document.getElementById(valueAccessor()).scrollIntoView(true);
            return true;
        });
    }
};
;
ko.bindingHandlers.slideDown = {
    init: function (element, valueAccessor) {
        // Initially set the element to be instantly visible/hidden depending on the value
        var params = valueAccessor();
        var value;
        if (typeof (params) === "function") {
            value = params;
        }
        else if (typeof (params.value) === "function") {
            value = params.value;
        }
        else {
            value = params;
        }
        $(element).toggle(ko.utils.unwrapObservable(value)); // Use "unwrapObservable" so we can handle values that may or may not be observable
    },
    update: function (element, valueAccessor) {
        // Whenever the value subsequently changes, slowly slide the element in or out
        var params = valueAccessor();
        var value;
        var duration = 600;
        if (typeof (params) === "function") {
            value = params;
        }
        else if (typeof (params.value) === "function") {
            value = params.value;
            duration = params.duration ? params.duration : duration;
        }
        else {
            value = params;
        }

        ko.utils.unwrapObservable(value) ? $(element).slideDown(duration) : $(element).slideUp(duration);
    }
};;
ko.bindingHandlers.fadeIn = {
    init: function (element, valueAccessor) {
        // Initially set the element to be instantly visible/hidden depending on the value
        var params = valueAccessor();
        var value;
        if (typeof (params) === "function") {
            value = params;
        }
        else if (typeof (params.value) === "function") { 
            value = params.value;
        }

        $(element).toggle(ko.utils.unwrapObservable(value)); // Use "unwrapObservable" so we can handle values that may or may not be observable

    },
    update: function (element, valueAccessor) {
        // Whenever the value subsequently changes, slowly fade the element in or out
        var params = valueAccessor();
        var value;
        var duration = 600;
        if (typeof (params) === "function") {
            value = params;
        }
        else if (typeof (params.value) === "function") {
            value = params.value;
            duration = params.duration ? params.duration : duration;
        }

        ko.utils.unwrapObservable(value) ? $(element).fadeIn(duration) : $(element).fadeOut(duration);
    }
};;
function knockoutFiniteStateMachine(parameters) {
    var self = {};
    self.states = parameters.states || [];
    self.startStateName = parameters.startStateName || parameters.states[0].name || "";
    self.stop = stop;
    self.start = start;
    self.active = false;

    var conditionSubscriptions = [];

    var endState = null;
    var stateChangeSubscribers = [];

    self.subscribeOnChange = function (onChangeCallback) {
        if (typeof (onChangeCallback) === "function") {
            stateChangeSubscribers.push(onChangeCallback);
        }
    }

    //transition to another state
    function changeState (stateName) {
        if (self.currentState) {
            if (self.currentState.transitions.filter(function (transition) { return (typeof(transition.stateName) == "function" ? transition.stateName() : transition.stateName) == stateName }).length == 0) {
                throw "error in finite state machine\r\n[Attempt to transition to state '" + stateName + "' from state '" + self.currentState.name + "', but no such transition was found.]"
            }

            //unsub from all transitions
            conditionSubscriptions.forEach(function (subscription) {
                subscription.dispose();
            });
            conditionSubscriptions = [];

            //deactivate the currentState
            if (typeof (self.currentState.exit) === "function") {
                self.currentState.exit(stateName);
            }

        }

        //set the currentState
        var previousStateName = self.currentState ? self.currentState.stateName : undefined;
        self.currentState = getState(stateName);

        if (self.currentState == null) {
            throw "State '" + stateName + "' does not exist in the state machine";
        }
        stateChangeSubscribers.forEach(function (subscriberCallback) {
            subscriberCallback(stateName);
        });
        
        if (self.currentState.transitions) {
            self.currentState.transitions.forEach(function (transition) {
                if (!ko.isPureComputed(transition.condition)) {
                    conditionSubscriptions.push(
                        ko.pureComputed(transition.condition)
                        .extend({ notify: "always" })
                        .subscribe(function (conditionResult) {
                            if (conditionResult) {
                                changeState((typeof (transition.stateName) == "function" ? transition.stateName() : transition.stateName));
                            }
                        })
                    );
                }
            });
        }

        //activate the currentState
        if (typeof (self.currentState.enter) === "function") {
            self.currentState.enter(previousStateName);
        }
        
    }

    //helper function to get the state from the states array by its name
    function getState(stateName) {
        var states = self.states.filter(function (state) {
            return state.name == stateName;
        });

        if (states.length > 1) {
            throw "error in finite state machine\r\n[Duplicate state names found when searching for " + stateName + "]\r\n";
        }
        return states[0];
    }

    //set current state
    self.currentState = null;

    function start() {
        //validate();
        //initialize states
        self.states.forEach(function (state) {
            if (typeof (state.initialize) === "function") {
                state.initialize();
            }
        });

        changeState(self.startStateName || self.states[0].name);
        self.active = true;
    }

    function stop() {
        if (self.currentState && typeof (self.currentState.exit) === "function") {
            self.currentState.exit();
        }
        self.currentState = null;
        self.active = false;
        conditionSubscriptions = [];
    }

    function validate() {
        //TODO:  validate states (ensure all members are properly defined)
        var errorText = "";

        if (self.states.filter(function (state) { return !state.transitions || state.transitions.length == 0 }).length > 1) {
            errorText += "[More than one state found with no transitions.  States without transitions are considered end states.]\r\n"
        }

        self.states.forEach(function (validatedState) {
            if (self.states.filter(function (state) { return state.name == validatedState.name; }).length > 1) {
                errorText += "[Duplicate state found for state name '" + validatedState.name + "']\r\n"
            }
            if (validatedState.transitions && validatedState.transitions.length > 0) {
                validatedState.transitions.forEach(function (transition) {
                    if (self.states.filter(function (state) { return state.name == (typeof (transition.stateName) == "function" ? transition.stateName() : transition.stateName) }).length == 0) {
                        errorText += "[A transition was found referencing state name '" + (typeof (transition.stateName) == "function" ? transition.stateName() : transition.stateName) + "' in state '" + validatedState.name + "']\r\n"
                    }
                });
            }
        });

        if (errorText.length > 0) {
            throw "error in finite state machine\r\n" + errorText;
        }
    }

    return self;
};
var expressoEvent = function () {
    var self = {};
    self.subscribers = [];

    self.publish = function (message, data) {
        notifySubscribers = self.subscribers.filter(function (subscriber) {
            if (subscriber.message == message) {
                return subscriber;
            }
        });

        notifySubscribers.forEach(function (subscriber) {
            if (typeof (subscriber.callback) == 'function') {
                subscriber.callback(data);
            }
        });
    }

    self.subscribe = function (message, callback) {

        var foundSubscription = self.subscribers.some(function (subscriber) {
            if (subscriber.message == message && subscriber.callback == callback) {
                return true;
            }
        });

        if (!foundSubscription) {
            self.subscribers.push({
                callingFunction: arguments.callee.caller,
                message: message,
                callback: callback
            });
        }
    }

    return self;
}();;
ko.observableArray.fn.uninitialized = function () {
    var self = this;
    //Check if we have added the 'valuesInitialized' observable to this array yet
    if (!self.valuesInitialized) {
        //Give this array an observable which detects if it has been initialiezed yet
        //Default the value to 'true' if it already has items in it
        self.valuesInitialized = new ko.observable(self().length > 0);

        //Listen to changes to this array
        self.subscribe(function () {
            //Any change means that it has been initialized, even if that value is to an 'empty' array
            self.valuesInitialized(true);
        }, self, 'beforeChange')
    }

    //Return a computed based on the 'valuesInitialized' property which we added
    return ko.pureComputed(function () {
        return !self.valuesInitialized();
    }, self);

};
var userContext = (function () {

    /*******************Private Variables******************************/
    var _selectedRegistration = null;
    var _onSwitchSubscribers = [];
    var _onInitializedSubscribers = [];
    var _onReadyCallbacks = [];
    var _currentUser = null;
    var unloadingState = false;
    var _suppressRefresh = false;
    var _initialized = false;

    var pathName = $(location).attr('pathname');
    var pathNameArr = pathName.split('/');
    var projectCode = pathNameArr[1] == "Error" ? null : pathNameArr[1];
    if (pathNameArr.length >= 4) {
        if (pathNameArr[2] == "thankyou")
            projectCode = pathNameArr[3] == "Error" ? null : pathNameArr[3];
    }
    function reloadActiveRegistration(callback) {
        $.ajax({
            url: "/api/registration/getActiveRegistration",
            data: {
                projectCode: projectCode
            },
            dataType: 'json',
            type: 'get'
        })
        .done(function (data) {
            _selectedRegistration = data;
            if (typeof (callback) === "function") {
                callback(data);
            }
        })
        .fail(function (request, status, thrown) {
            console.log(thrown);
            _selectedRegistration = null;
        });

    }

    //Get the active registration
    reloadActiveRegistration(function (data) {
        _initialized = true;

        for (var i = 0; i < _onInitializedSubscribers.length; i++) {
            var subscriber = _onInitializedSubscribers[i];
            if ($.isFunction(subscriber)) {
                subscriber(_selectedRegistration ? _selectedRegistration.UUID : null);
            }
        }
        //Make sure any of the 'Your booth is' fields on the screen are populated
        populateBoothDataFields();
    });    

    /****************Private Functions********************************/
    function initializeBoothControl() {
        $("a[data-boothcontrol-role='registrationCheckout']").on('click', onCheckoutClick);
        $("a[data-boothControl-role='registrationSwitch']").on('click', onSwitchBoothClick);
        $("a[data-boothControl-role='registrationSwitchAndCheckout']").on('click', onSwitchAndCheckoutClick);
        $('.boothCallout').on('click', calloutBoothSelector);

        $(window).bind("beforeunload", function () {
            unloadingState = true;
        });

        //Make sure any of the 'Your booth is' fields on
        populateBoothDataFields();
    };

    function setActiveRegistration(newRegistrationUUID) {
        try {
            ShowWaitDialog();

            //Get an updated booth selector
            $.ajax({
                url: "/Show/SetSelectedBooth",
                data: {
                    registrationUUID: newRegistrationUUID
                },
                type: 'post',
                cache: false,
                dataType: 'json',
                //Block until the registration comes back if not refreshing
                async: !_suppressRefresh,
                success: function (result) {
                    if (!_suppressRefresh) {
                        window.location.reload(true);
                    } else {
                        _selectedRegistration = result;
                        HideWaitDialog();
                    }

                },
                error: function (request, status, thrown) {
                    HideWaitDialog();
                    //when navigating away from a page mid-call plus we are sending an empty return back from the show controller (as of jquery 1.9, this is an invalid response).
                    //if we're reloading the page, don't show the empty error getting thrown in an alert.
                    if (!unloadingState) {
                        console.log(thrown);
                    }
                }
            });
        }
        catch (e) {
            console.log(e.message ? e.message : e);
        }
    }

    function checkout() {
        document.location.href = "/" + projectCode + "/Checkout";
    }

    function populateBoothDataFields() {
        if (_selectedRegistration) {
            //Update any data-boothdata attributes on the screen
            $("[data-boothdata='boothnumber']").text(_selectedRegistration.BoothNumber);
        }
    }

    function calloutBoothSelector() {
        //TODO Have Nathan hide this image initially and have it have an id
        var newBoothImage = $("#boothselectorimg");
        if (newBoothImage) {
            //Show the booth selector image and then have it fade away in 8 seconds
            newBoothImage.show();
            newBoothImage.hide(8000);
        }
    }

    /*************Event Handlers************************************/
    function onCheckoutClick() {
        //Since we will do a full postback, show a wait dialog.  When postback completes the dialog will be disposed as a result.
        ShowWaitDialog();

        checkout();
    }

    function onSwitchBoothClick() {
        ShowWaitDialog();
        //Get the registration of the booth that we just clicked on
        var newRegistrationUUID = $(this).data('boothcontrolRegistrationid');
        switchBooth(newRegistrationUUID);
        HideWaitDialog();
    }

    function onSwitchAndCheckoutClick() {
        //Since we will do a full postback, show a wait dialog.  When postback completes the dialog will be disposed as a result.
        ShowWaitDialog();

        //Get the registration of the booth that we just clicked on
        var newRegistrationUUID = $(this).data('boothcontrolRegistrationid');
        setActiveRegistration(newRegistrationUUID);
    }

    /*************Public Functions********************************/
    function ready() {
        //Initialize the booth selector control if it is on the page
        if ($(".boothControl").length > 0) {
            initializeBoothControl();
        }

        reloadCurrentUser();
    }

    function selectedRegistration() {
        return _selectedRegistration;
    }

    function currentUser() {
        if (_currentUser != null) {
            _currentUser.isInRole = function (roleName) {
                var roleFound = false;
                if (_currentUser != null) {
                    _currentUser.Roles.forEach(function (element) {
                        if (element.Name == roleName) {
                            roleFound = true;

                        }

                    });
                }
                return roleFound;
            }
        }

        return _currentUser;

    }

    function reloadCurrentUser(callback) {
        userInformationService.getCurrentUser(function (data) {
            _currentUser = data;
            if (typeof (callback) == 'function') {
                callback(data);
            }
        });
    }

    function selectedRegistrationId() {
        if (_selectedRegistration == null ||
            _selectedRegistration === undefined ||
            _selectedRegistration.UUID.length == 0) {
            return null;
        }

        return _selectedRegistration.UUID;
    }

    function registrationSelected() {
        return selectedRegistrationId() != null;
    }

    function switchBooth(newRegistrationUUID) {
        if (_selectedRegistration == null || _selectedRegistration.UUID.toLowerCase() != newRegistrationUUID.toLowerCase()) {
            setActiveRegistration(newRegistrationUUID);
        }
    }

    function reloadSelectedBooth() {
        setActiveRegistration(_selectedRegistration.UUID);
    }

    function subscribeOnInitialized(onInitialized) {
        if (_initialized) {
            onInitialized();
        }
        else {
            //Ensure that this function is not in the array yet
            for (var i = 0; i < _onInitializedSubscribers.length; i++) {
                if (_onInitializedSubscribers[i] === onInitialized) {
                    //A match was found, return without adding it to the array
                    return;
                }
            }

            //The function passed in is not in the array yet, add it the end
            _onInitializedSubscribers.push(onInitialized);
        }
    }

    function suppressRefresh(suppressRefreshing) {
        _suppressRefresh = suppressRefreshing;
    }

    return {
        ready: ready,
        selectedRegistration: selectedRegistration,
        selectedRegistrationId: selectedRegistrationId,
        registrationSelected: registrationSelected,
        reloadSelectedBooth: reloadSelectedBooth,
        switchBooth: switchBooth,
        subscribeOnInitialized: subscribeOnInitialized,
        currentUser: currentUser,
        reloadCurrentUser: reloadCurrentUser,
        suppressRefresh: suppressRefresh,
        reloadActiveRegistration: reloadActiveRegistration
    };
})();;
var userIdentification = function () {
    var self = {};

    self.ready = ko.observable();
    self.projectCode = ko.observable();
    self.editing = ko.observable();
    self.registration = ko.observable();
    self.userName = ko.observable();
    self.editingSelectedBooth = ko.computed(function () {
        return self.editing() && self.registration() && self.registration().ExternalCustomerBoothID;

    });

    self.logoff = function () {
        showSpinner(true);
        $.ajax({
            url: '/Account/EndSession',
            dataType: 'json',
            type: 'post',
            success: function (data) {
                try {
                    logged_on = false;
                    $('#UserAuth').hide();
                    $('#UserUnauth').show();
                    $('.Checkout').hide();
                    $('.NoCheckout').show();
                    $('.booth_selection').empty();
                    var url = window.location.href.toLowerCase();
                    var redirect = false;
                    var reloadOnLogoff = true;
                    if (typeof (contents) !== 'undefined' && contents !== null) {
                        var redirect_contents = ['shell_schemes'];
                        var contentTags = $.grep(contents, function (content) { return (content.ContentID === currentContentID && $.inArray(content.Tag, redirect_contents) > -1); });
                        if (contentTags.length > 0) {
                            reloadOnLogoff = redirect = true;
                        }
                    }

                    if (reloadOnLogoff) {
                        redirect = redirect || url.indexOf('/logon') !== -1 || url.indexOf('/orders') !== -1;
                        redirect = redirect || url.indexOf('/thankyou') !== -1 || url.indexOf('/revieworder') !== -1;
                        redirect = redirect || url.indexOf('/checkout') !== -1 || url.indexOf('/registerbooth') !== -1;
                        redirect = redirect || url.indexOf('/manage') !== -1;
                        if (redirect)
                            window.location = '/';
                        else
                            window.location.reload();
                    } else {
                        showSpinner(false);
                    }
                } catch (e) {
                    showSpinner(false);
                    window.location = '/';
                    // ShowMessageBox(e.message ? e.message : e);
                }
            },
            error: function (request, status, thrown) {
                showSpinner(false);
                window.location = '/';
                // ShowMessageBox(request.responseText, translations.C357);
            }
        });
    };

    self.passwordChangeRequired = ko.observable();

    //get the show instance
    showInstanceService.getActiveShowInstance(function (data) {
        if (data) {
            expressoEvent.publish("userIdentification.activeShowInstanceRetrieved", data);
        }
    });

    //TODO: figure out how to track projectCode even userContext does not have a booth yet
    var pathName = $(location).attr('pathname');
    var pathNameArr = pathName.split('/');
    if (pathNameArr.length > 0) {
        self.projectCode(pathNameArr[1]);
    }
    self.currentState = ko.observable();

    //create login viewmodel
    self.loginVM = function () {
        var username = ko.observable();
        var password = ko.observable();
        var userFound = ko.observable();
        var emailVerified = ko.observable();
        var createAccountClicked = ko.observable();
        var forgotPasswordClicked = ko.observable();
        var loggingIn = ko.observable();
        var focusUsername = ko.observable(false);
        var linkSent = ko.observable();
        var userNotAuthorized = ko.observable(false);
        var codeVerificationRequired = ko.observable();
        var showAccountNotFoundMessage = ko.observable();

        username.subscribe((value) => {
            self.userName(value);
        });

        function login() {
            loggingIn(true);

            //TODO:  Refactor into login results
            userService.userMustChangePassword(username(), function (changePassword) {
                self.passwordChangeRequired(changePassword);
                if (!self.passwordChangeRequired()) {
                    userService.login(username(), password(), self.projectCode(), function (data) {
                        if (data === 1) { //Success
                            self.forceLogin(undefined);
                            expressoEvent.publish("userIdentification.UserLoggedIn");
                            userContext.reloadCurrentUser(function () {
                                userContext.reloadActiveRegistration(function () {
                                    userFound(true);
                                    codeVerificationRequired(false);
                                });
                            });
                        }
                        else {
                            userFound(true);
                            showAccountNotFoundMessage(false);
                            if (data === 0) { //Not Authorized
                                userNotAuthorized(true);
                            }
                            else if (data === 3) { //Email Verification Required
                                emailVerified(false);
                            }
                            else if (data === 5) { //Code Required
                                //Send the verification code
                                codeVerificationRequired(true);
                                userService.sendMultiFactorAuthenticationCode(username(), self.projectCode());
                            }
                            else {
                                userFound(false);
                                showAccountNotFoundMessage(true);
                            }
                            loggingIn(false);
                        }

                        
                    });
                }
            });
        }

        function resendConfirmationEmail() {
            userService.sendEmailConfirmationLink(username(), null, function (data) {
                linkSent(true);
            });
        }

        var state = {
            name: "login",
            enter: function () {
                username(null);
                password(null);
                userFound(null);
                loggingIn(null);
                codeVerificationRequired(null);
                createAccountClicked(self.startAtCreateAccount);
                setTimeout(function () { focusUsername(true); }, 200); //compensating for visibility change; not ideal, but unfortunately necessary
                self.passwordChangeRequired(false);
            },
            exit: function () {
                focusUsername(false);
            },
            transitions: [{
                stateName: "checkUserStatus",
                condition: function () {
                    return userFound() === true && codeVerificationRequired() == false;
                }
            }, {
                stateName: "createAccount",
                condition: createAccountClicked
            }, {
                stateName: "resetPassword",
                condition: forgotPasswordClicked
            }, {
                stateName: "resetPassword",
                condition: self.passwordChangeRequired
            }, {
                stateName: "verifyCode",
                condition: codeVerificationRequired
            }]

        };

        return {
            login: login,
            username: username,
            password: password,
            focusUsername: focusUsername,
            userFound: userFound,
            emailVerified: emailVerified,
            linkSent: linkSent,
            userNotAuthorized: userNotAuthorized,
            state: state,
            createAccountClicked: createAccountClicked,
            forgotPasswordClicked: forgotPasswordClicked,
            loggingIn: loggingIn,
            resendConfirmationEmail: resendConfirmationEmail,
            showAccountNotFoundMessage: showAccountNotFoundMessage
        };
    }();

    //create new account viewmodel
    self.createAccountVM = function () {
        var backToLoginClicked = ko.observable();
        var creatingAccount = ko.observable();
        var showResendEmail = ko.observable();
        var resendingEmail = ko.observable();

        var createAccountClicked = function () {
            if (newAccount.errors().length > 0) {
                newAccount.errors.showAllMessages(true);
                return false;
            }

            creatingAccount(true);

            userService.createAccount(newAccount().username(), newAccount().password(), newAccount().email(), newAccount().phone(), newAccount().mfaOptIn(), function (data) {
                if (!data.Error) {
                    expressoEvent.publish("userIdentification.UserLoggedIn");
                    userContext.reloadCurrentUser(function () {
                        userContext.reloadActiveRegistration(function () {
                            accountCreated(true);
                            creatingAccount(false);
                            window.location.replace(window.location.origin + "/" + "Account/ConfirmationEmailSent");
                        });
                    });
                }
                else {
                    errorText(data.ErrorMessage);
                    showResendEmail(data.AllowEmailConfirmationResend);
                    creatingAccount(false);
                }
            });
        };

        function resendEmail() {
            resendingEmail(true);
            userService.sendEmailConfirmationLink(null, newAccount().email(), function () {
                resendingEmail(false);
                errorText(translations.VerificationEmailSentMessage);
            });
        }

        var newAccount = ko.validatedObservable({
            username: ko.observable().extend({
                required: {
                    params: true,
                    message: translations.C72
                },
                pattern: {
                    message: translations.ValidUserNames,
                    params: /^[a-zA-Z0-9-_]+$/
                },
                minLength: {
                    message: translations.ValidUserNames,
                    params: 6
                },
                maxLength: {
                    message: translations.ValidUserNames,
                    params: 20
                }
            }),
            password: ko.observable().extend({
                required: {
                    params: true,
                    message: translations.C72
                },
                pattern: {
                    message: translations.C362a,
                    params: /^((?=.*\d)(?=.*[a-z])(?=.*[A-Z])|(?=.*\d)(?=.*[a-zA-Z])(?=.*[\W_])|(?=.*[a-z])(?=.*[A-Z])(?=.*[\W_])){3}.*$/
                },
                minLength: {
                    params: 8,
                    message: translations.C362
                }
            }),
            confirmPassword: ko.observable().extend({
                required: {
                    params: true,
                    message: translations.C72
                },
                equal: {
                    params: function () { return newAccount().password() },
                    message: translations.C361
                }
            }),
            email: ko.observable().extend({
                required: {
                    params: true,
                    message: translations.C72
                },
                email: {
                    params: true,
                    message: translations.C658
                },

                validation: {
                    validator: function (userVal, paramsVal) {

                        return userVal.toLowerCase() !== paramsVal.toLowerCase();
                    },
                    message: translations.C658,
                    params: 'none@none.com'
                }

            }),
            phone: ko.observable().extend({
                pattern: {
                    message: translations.C13,
                    params: /^(?:\+\d{1,3}|0\d{1,3}|00\d{1,2})?(?:\s?\(\d+\))?(?:[-\/\s.]|\d)+$/
                }
            }),
            mfaOptIn: ko.observable(false)
        }, { deep: true, observable: false });
        var errorText = ko.observable();
        var accountCreated = ko.observable();

        var state = {
            name: "createAccount",
            enter: function () {
                for (var field in newAccount()) {
                    newAccount()[field](null);
                    newAccount()[field].isModified(null);
                }

                showResendEmail(null);
                resendingEmail(null);
                accountCreated(null);
                errorText(null);
                creatingAccount(null);

            },
            transitions: [{
                stateName: "login",
                condition: backToLoginClicked
            }, {
                stateName: "checkUserStatus",
                condition: function () {
                    return accountCreated();
                }
            }]
        };

        return {
            showResendEmail: showResendEmail,
            resendEmail: resendEmail,
            resendingEmail: resendingEmail,
            creatingAccount: creatingAccount,
            newAccount: newAccount,
            errorText: errorText,
            state: state,
            backToLoginClicked: backToLoginClicked,
            createAccountClicked: createAccountClicked
        };
    }();

    //create reset password viewmodel
    self.resetPasswordVM = function () {
        var backToLoginClicked = ko.observable();
        var resetPasswordEmailSent = ko.observable();
        var email = ko.observable();
        var errorText = ko.observable();

        function resetPasswordClicked() {
            userService.resetPassword(email, function (data) {
                resetPasswordEmailSent(true);
                errorText(null)
            });
        }

        var state = {
            name: "resetPassword",
            enter: function () {
                resetPasswordEmailSent(null)
                email(null);
                errorText(null);
            },
            transitions: [{
                stateName: "login",
                condition: backToLoginClicked
            }]

        };

        return {
            state: state,
            email: email,
            errorText: errorText,
            resetPasswordEmailSent: resetPasswordEmailSent,
            passwordChangeRequired: self.passwordChangeRequired,
            resetPasswordClicked: resetPasswordClicked,
            backToLoginClicked: backToLoginClicked,
        };
    }();

    self.verifyCodeVM = function (projectCode) {
        var backToLoginClicked = ko.observable();
        var verificationCode = ko.observable();
        var verifyingCode = ko.observable();
        var codeVerified = ko.observable(null);
        var invalidCode = ko.observable(null);

        function verifyCode() {
            verifyingCode(true);
            userService.verifyCode(self.userName(), verificationCode(), (result) => {
                codeVerified(result);
                invalidCode(!result);
                verifyingCode(false);
                if (result) {
                    expressoEvent.publish("userIdentification.UserLoggedIn");
                }
            });
        }

        var state = {
            name: "verifyCode",
            enter: function () {
                codeVerified(null);
                invalidCode(null);
                verifyingCode(false);
                verificationCode(null);
                backToLoginClicked(null);
            },
            transitions: [
                {
                    stateName: "login",
                    condition: backToLoginClicked
                },
                {
                stateName: "checkUserStatus",
                    condition: codeVerified
                }
            ]

        };
        return {
            verificationCode: verificationCode,
            verifyingCode: verifyingCode,
            verifyCode: verifyCode,
            invalidCode: invalidCode,
            backToLoginClicked: backToLoginClicked,
            state: state
        };
    }(self.projectCode());

    //create booth search viewmodel
    //TODO request the project code from a different module instead of injecting it
    self.searchBoothVM = function (projectCode) {
        var createNewBoothClick = ko.observable(false);
        var editExistingBooth = ko.observable(false);
        var searching = ko.observable();
        var allowCreateBooth = ko.observable();
       
        var search = ko.validatedObservable({
            findBoothCriteria: ko.observable().extend({
                required: {
                    params: true,
                    message: translations.C72
                }
            })
        }, { deep: true, observable: true });

        var searchAttempted = ko.observable();

        function editCurrentBoothClick() {
            editExistingBooth(false);
            var selectedBooth = {
                Booth: {
                    BoothNumber: self.registration().BoothNumber,
                    BoothWidth: self.registration().BoothWidth,
                    BoothLength: self.registration().BoothLength
                },
                Exhibitor: {
                    CustomerName:  self.registration().ExhibitorCompanyName
                },
                IsEditMode : true
            }

            expressoEvent.publish("userIdentification.BoothSelected", selectedBooth);
            editExistingBooth(true);
            event.stopPropagation();
            event.preventDefault();
        }

        //get the show instance
        expressoEvent.subscribe("userIdentification.activeShowInstanceRetrieved", function (showInstance) {
            allowCreateBooth(showInstance.AllowManualBoothAdds);

        });

        function findBoothClick() {
            search.errors.showAllMessages(false);

            if (search.errors().length > 0) {
                search.errors.showAllMessages(true);
                return false;
            }

            searching(true);

            //Show the wait dialog while searching
            ShowWaitDialog();

            //Initiate the search based on the criteria passed in, close the wait dialog when complete
            exhibitorBoothService.searchBooths(
                projectCode, search().findBoothCriteria(), function (data) {
                    if (data) {
                        expressoEvent.publish("userIdentification.BoothSearchResultsFound", { searchCriteria: search().findBoothCriteria(), results: data });
                    }
                    searchAttempted(true);
                    searching(false);
                }, HideWaitDialog);
        }

        var state = {
            name: "searchBooth",
            enter: function () {
                search().findBoothCriteria(null);
                searchAttempted(null);
                search.errors.showAllMessages(false);
                searching(null);
            },
            transitions: [
                {
                    stateName: "chooseBooth",
                    condition: function () { return searchAttempted(); }
                },
                {
                    stateName: "createBooth",
                    condition: createNewBoothClick
                },
                {
                    stateName: "createBooth",
                    condition: editExistingBooth
                }
            ]

        };

        return {
            state: state,
            search: search,
            searching: searching,
            editCurrentBoothClick: editCurrentBoothClick,
            createNewBoothClick: createNewBoothClick,
            registration: self.registration,
            editingSelectedBooth: self.editingSelectedBooth,
            findBoothClick: findBoothClick,
            allowCreateBooth: allowCreateBooth
        };
    }(self.projectCode());

    //create booth search viewmodel
    self.chooseBoothVM = function () {
        var findBoothCriteria = ko.observable();
        var backToSearchClick = ko.observable();
        var createNewBoothClick = ko.observable();
        var boothSearchResults = ko.observable();
        var userSelectedBooth = ko.observable();
        var hasValidDimensions = ko.observable();
        var allowCreateBooth = ko.observable();
        var manualBoothNotFoundMessage = ko.observable();

        //get the show instance
        expressoEvent.subscribe("userIdentification.activeShowInstanceRetrieved", function (showInstance) {
            allowCreateBooth(showInstance.AllowManualBoothAdds);
             
            if (!allowCreateBooth()) {
                facilityService.getShowOrganizerFacilityByProjectCode(function (data) {
                    if (data) {
                        manualBoothNotFoundMessage(translations.BoothNotFoundNoManualBoothAdds
                            .replace("{0}", data.Name)
                            .replace("{1}", !data.Phone ? "" : data.Phone)
                            .replace(" or ", !data.Phone ? " " : data.Phone) //need to remove the "or" if there is no phone number
                            .replace("{2}", data.Email)
                            .replace("{2}", data.Email));
                    }
                });
            }
        });

        //subscribe to the booth search
        expressoEvent.subscribe("userIdentification.BoothSearchResultsFound", function (data) {
            findBoothCriteria(data.searchCriteria);
            boothSearchResults(data.results);
        });

        //User selected their booth, set it as the selected booth
        var chooseBoothClick = function () {
            expressoEvent.publish("userIdentification.BoothSelected", this);
            userSelectedBooth(true);
        }

        var state = {
            name: "chooseBooth",
            enter: function () {
                userSelectedBooth(null);
            },
            transitions: [
                {
                    stateName: "confirmBooth",
                    condition: function () { return userSelectedBooth(); }
                },
                {
                    stateName: "searchBooth",
                    condition: backToSearchClick
                },
                {
                    stateName: "createBooth",
                    condition: createNewBoothClick
                }
            ]
        };

        return {
            state: state,
            boothSearchResults: boothSearchResults,
            chooseBoothClick: chooseBoothClick,
            createNewBoothClick: createNewBoothClick,
            backToSearchClick: backToSearchClick,
            findBoothCriteria: findBoothCriteria,
            allowCreateBooth: allowCreateBooth,
            manualBoothNotFoundMessage: manualBoothNotFoundMessage
        };
    }();

    //choose locked booth viewmodel
    self.chooseLockedBoothVM = function () {
        //Bound to the responsible party name text box
        var responsiblePartyName = ko.observable().extend({
            required: {
                params: true,
                message: "Required"
            }
        });
        //Bound to list of booths the user can choose from
        var lockedBoothsList = ko.observableArray();

        //Bound to each booth listed for the user to set at this booth
        var chooseBoothClick = function () {
            //Check if there are any required fields not populated
            var errors = ko.validation.group(responsiblePartyName)
            if (errors().length > 0) {
                errors.showAllMessages(true);
                return;
            }

            //The user required fields are supplied, set 3rd party fields and publish that it is ready to be saved
            this.IsExhibitor = false;
            this.Exhibitor.ThirdPartyCompanyName = responsiblePartyName();
            this.CopyExhibitorQuestionnaires = true;
            expressoEvent.publish("userIdentification.BoothSelected", this);

            //Trigger a state change to submitBooth
            userSelectedBooth(true);
        }

        //Internal vm signal to trigger a state transition to submitBooth
        var userSelectedBooth = ko.observable();

        var state = {
            name: "chooseLockedBooth",
            enter: function () {
                userSelectedBooth(null);
                //Load up the exhibitor booths for this user at this show
                exhibitorBoothService.getUserBooths(userContext.selectedRegistration().UserLoginName, userContext.selectedRegistration().ShowInstanceID,
                    function (data) {
                        //Set the data to be listed on the front end
                        lockedBoothsList(data);
                    });
            },
            transitions: [
                {
                    //Go to the submitBooth state in order to save this booth to the server when they make their selection
                    stateName: "submitBooth",
                    condition: function () {
                        return userSelectedBooth();
                    }
                }
            ]
        };

        return {
            state: state,

            //Fields bound to the view
            responsiblePartyName: responsiblePartyName,
            lockedBoothsList: lockedBoothsList,
            chooseBoothClick: chooseBoothClick
        };
    }();

    //create booth viewmodel
    self.createBoothVM = function () {
        var backToBoothSearch = ko.observable();
        var chooseRegistrationType = ko.observable();
        var boothInfoPublish = ko.observable();
        var boothNumber = ko.observable();
        var boothNumberIsChecked = ko.observable(false);
        var boothNumberText = ko.observable("");
        var stateIsStartState = ko.observable();
        var boothUom = ko.observable();
        var allowBoothSelection = ko.observable();

        var projectCode = $(location).attr('pathname').split("/")[1];

        //Check if this is a 'company' home page where the first argument is a 'c', ie c/US, c/UK etc.. 
        if (projectCode === 'c' || projectCode === 'Error') {
            //This is actually not a real project code, just a directed homepage, clear the notion of being within a project
            projectCode = undefined;
        }

        expressoEvent.subscribe('userIdentification.PostLoginStartState', function (data) {
            if (data === "createBooth") {
                stateIsStartState(true);
            }
        });

        //subscribe to retrieving the show instance
        expressoEvent.subscribe("userIdentification.activeShowInstanceRetrieved", function (showInstance) {
            allowBoothSelection(showInstance.AllowBoothSelection);
        });

        var booth = ko.validatedObservable({
            companyName: ko.observable().extend({
                required: {
                    params: true,
                    message: "This field is required."
                }
            }),
            boothNumber: ko.pureComputed({
                read: boothNumberText,
                write: function (value) {
                    boothNumberText(value);
                }
            }).extend({
                required: {
                    params: true,
                    message: translations.ValidateBoothNumber
                }
            }),
            boothWidth: ko.observable().extend({
                required: {
                    params: true,
                    message: translations.C736
                },
                pattern: {
                    params: /^\d+[\.]?\d{0,2}$/g,
                    message: translations.MustBeNumber
                },
                min: {
                    params: 1,
                    message: translations.C736
                }
            }),
            boothLength: ko.observable().extend({
                required: {
                    params: true,
                    message: translations.C737
                },
                pattern: {
                    params: /^\d+[\.]?\d{0,2}$/g,
                    message: translations.MustBeNumber
                },
                min: {
                    params: 1,
                    message: translations.C737
                }
            })
        }, { deep: true, observable: true });

        number: ko.observable();

        var boothNotKnown = ko.pureComputed({
            read: boothNumberIsChecked,
            write: function (value) {
                if (!boothNumberIsChecked() && value) {
                    boothNumberText(translations.C633);
                }
                if (boothNumberIsChecked() && !value) {
                    boothNumberText("");
                    booth.errors.showAllMessages(false);
                }
                boothNumberIsChecked(value);
            }
        });

        function createBooth() {

            booth.errors.showAllMessages(false);

            if (booth.errors().length > 0) {
                booth.errors.showAllMessages(true);
                return false;
            }

            if (boothNotKnown() === true) {
                boothNumber(translations.C633);
            }

            var selectedBooth = {
                Booth: {
                    BoothNumber: booth().boothNumber(),
                    BoothWidth: booth().boothWidth(),
                    BoothLength: booth().boothLength()
                },
                Exhibitor: {
                    ExhibitorName: booth().companyName()
                }
            }
            expressoEvent.publish('userIdentification.BoothSelected', selectedBooth);
            boothInfoPublish(true);
        }

        function backToSearch() {
            backToBoothSearch(true);
        }

        var state = {
            name: "createBooth",
            enter: function () {
                boothInfoPublish(null);
                boothNotKnown(false);
                backToBoothSearch(null);
                boothUom(null);
                booth().boothNumber(self.registration()?.BoothNumber);
                booth().boothWidth(self.registration()?.BoothWidth);
                booth().boothLength(self.registration()?.BoothLength);
                booth().companyName(self.registration()?.ExhibitorCompanyName);
                booth.errors.showAllMessages(false);

                exhibitorBoothService.getExhibitorBoothUom(projectCode, function (data) {
                    if (data) {
                        boothUom("(" + data + ")");
                    }
                });
            },
            transitions: [{
                stateName: "searchBooth",
                condition: backToBoothSearch
            },
            {
                stateName: "validateSelectedBooth",
                condition: function () { return boothInfoPublish() && !self.registration(); }
            },
            {
                stateName: "confirmBooth",
                condition: function () { return boothInfoPublish() && self.registration(); }
            },
            ]
        };

        return {
            createBooth: createBooth,
            backToSearch: backToSearch,
            state: state,
            backToBoothSearch: backToBoothSearch,
            chooseRegistrationType: chooseRegistrationType,
            booth: booth,
            boothNotKnown: boothNotKnown,
            isBackButtonVisible: ko.computed(function () { return !stateIsStartState() && allowBoothSelection(); }),
            boothUom: boothUom,
            registration: self.registration
        };
    }();

    //create booth confirmation viewmodel
    self.confirmBoothVM = function () {
        var selectedBooth = ko.observable();
        var userUpdatedBooth = ko.observable();
        var backToBoothSearch = ko.observable();
        var boothUom = ko.observable();
        var createNewBoothClick = ko.observable();
        var editBoothDimensions = ko.observable();
        var userMustSelectRegistrationType = ko.observable();
        var allowCreateBooth = ko.observable();

        //subscribe to retrieving the show instance
        expressoEvent.subscribe("userIdentification.activeShowInstanceRetrieved", function (showInstance) {
            allowCreateBooth(showInstance.AllowManualBoothAdds);
        });

        // create validated observable for boothWidth and boothLength
        var boothDimensions = ko.validatedObservable({
            boothWidth: ko.observable().extend({
                required: {
                    params: true,
                    message: translations.C736
                },
                pattern: {
                    params: /^\d+[\.]?\d{0,2}$/g,
                    message: translations.MustBeNumber
                },
                min: {
                    params: 1,
                    message: translations.C736
                }
            }),
            boothLength: ko.observable().extend({
                required: {
                    params: true,
                    message: translations.C737
                },
                pattern: {
                    params: /^\d+[\.]?\d{0,2}$/g,
                    message: translations.MustBeNumber
                },
                min: {
                    params: 1,
                    message: translations.C737
                }
            })
        }, { deep: true, observable: true });;

        // create validated observable for boothWidth and boothLength
        var booth = ko.validatedObservable({
            companyName: ko.observable().extend({
                required: {
                    params: true,
                    message: "This field is required."
                }
            }),
            boothNumber: ko.observable().extend({
                required: {
                    params: true,
                    message: translations.ValidateBoothNumber
                }
            }),
            boothWidth: ko.observable().extend({
                required: {
                    params: true,
                    message: translations.C736
                },
                pattern: {
                    params: /^\d+[\.]?\d{0,2}$/g,
                    message: translations.MustBeNumber
                },
                min: {
                    params: 1,
                    message: translations.C736
                }
            }),
            boothLength: ko.observable().extend({
                required: {
                    params: true,
                    message: translations.C737
                },
                pattern: {
                    params: /^\d+[\.]?\d{0,2}$/g,
                    message: translations.MustBeNumber
                },
                min: {
                    params: 1,
                    message: translations.C737
                }
            })
        }, { deep: true, observable: true });

        //subscribe to booth object
        expressoEvent.subscribe('userIdentification.BoothSelected', function (data) {
            selectedBooth(data);

            //populate boothWidth and boothLength from selectedBooth
            boothDimensions().boothWidth(selectedBooth().Booth.BoothWidth);
            boothDimensions().boothLength(selectedBooth().Booth.BoothLength);

            editBoothDimensions(!(boothDimensions().boothWidth() * boothDimensions().boothLength()));

        });

        function confirmBooth() {

            boothDimensions.errors.showAllMessages(false);

            if (boothDimensions.errors().length > 0) {
                boothDimensions.errors.showAllMessages(true);
                return false;
            }

            boothDimensions.errors.showAllMessages(false);
            //populate Booth objects width and length
            selectedBooth().Booth.BoothWidth = boothDimensions().boothWidth();
            selectedBooth().Booth.BoothLength = boothDimensions().boothLength();

            //publish new booth info
            expressoEvent.publish('userIdentification.BoothSelected', selectedBooth());

            userUpdatedBooth(true);
        };

        function backToSearch() {
            backToBoothSearch(true);
        }

        var state = {
            name: "confirmBooth",
            enter: function () {
                userUpdatedBooth(null);
                backToBoothSearch(null);
                boothUom(null);
                boothDimensions.errors.showAllMessages(false);
                userMustSelectRegistrationType(null);

                exhibitorBoothService.getExhibitorBoothUom(projectCode, function (data) {
                    if (data) {
                        boothUom("(" + data + ")");
                    }
                });

                thirdPartyService.getThirdPartyServicesByProjectCode(projectCode, function (data) {
                    if (data.length > 0) {
                        userMustSelectRegistrationType(true);
                    }
                    else {
                        userMustSelectRegistrationType(false);
                    }
                })
                
            },
            transitions: [
                {
                    stateName: "chooseRegistrationType",
                    condition: function () {
                        return userUpdatedBooth() && userMustSelectRegistrationType() === true
                    }
                },
                {
                    stateName: "submitBooth",
                    condition: function () {
                        return userUpdatedBooth() && userMustSelectRegistrationType() === false
                    }
                },
                {
                    stateName: "searchBooth",
                    condition: backToBoothSearch
                },
                {
                    stateName:"createBooth",
                    condition: createNewBoothClick
                },
            ]
        };

        return {
            state: state,
            selectedBooth: selectedBooth,
            boothDimensions: boothDimensions,
            editBoothDimensions: editBoothDimensions,
            backToSearch: backToSearch,
            boothUom: boothUom,
            confirmBooth: confirmBooth,
            createNewBoothClick: createNewBoothClick,
            booth: booth,
            allowCreateBooth: allowCreateBooth
        };
    }();

    self.chooseRegistrationTypeVM = function () {
        var submitTheBooth = ko.observable();
        var selectedBooth = ko.observable();
        var backToBoothSearch = ko.observable();
        var backToCreateBooth = ko.observable();
        var startedState = ko.observable();
        var allowCreateBooth = ko.observable();
        var allowBoothSelection = ko.observable();
        var radioIsExhibitorValid = ko.validatedObservable({
            radioIsExhibitor: ko.observable().extend({
                required: {
                    params: true,
                    message: "Please Choose An Option"
                }
            })
        });

        //get the show instance
        expressoEvent.subscribe("userIdentification.activeShowInstanceRetrieved", function (showInstance) {
            allowCreateBooth(showInstance.AllowManualBoothAdds);
            allowBoothSelection(showInstance.AllowBoothSelection);
        });


        expressoEvent.subscribe("userIdentification.BoothSelected", function (data) {
            selectedBooth(data);
        });

        expressoEvent.subscribe('userIdentification.PostLoginStartState', function (data) {
            startedState(data);
        });

        function registerBooth() {
            radioIsExhibitorValid.errors.showAllMessages(false);

            if (radioIsExhibitorValid.errors().length > 0) {
                radioIsExhibitorValid.errors.showAllMessages(true);
                submitTheBooth(false);
                return false;
            }

            selectedBooth()["IsExhibitor"] = radioIsExhibitorValid().radioIsExhibitor();
            expressoEvent.publish('userIdentification.BoothSelected', selectedBooth());
            submitTheBooth(true);
        }

        function backToSearch() {
            if (startedState() === "searchBooth" && allowBoothSelection()) {
                backToBoothSearch(true);
            }

            if (startedState() === "createBooth" || !(allowBoothSelection())) {
                backToCreateBooth(true);
            }
        }

        var state = {
            name: "chooseRegistrationType",
            enter: function () {
                radioIsExhibitorValid().radioIsExhibitor(null);
                backToBoothSearch(null);
                backToCreateBooth(null);
                submitTheBooth(null);
                radioIsExhibitorValid.errors.showAllMessages(false);
            },
            transitions: [
                {
                    stateName: "searchBooth",
                    condition: backToBoothSearch
                }, {
                    stateName: "createBooth",
                    condition: backToCreateBooth
                },
                {
                    stateName: "submitBooth",
                    condition: function () {
                        return submitTheBooth() === true;
                    }
                }]

        };

        return {
            state: state,
            backToSearch: backToSearch,
            registerBooth: registerBooth,
            radioIsExhibitorValid: radioIsExhibitorValid,
            allowCreateBooth: allowCreateBooth
        };
    }();

    //instantiate state machine
    self.stateMachine = knockoutFiniteStateMachine({
        startStateName: "checkUserStatus"
    });

    self.stateMachine.subscribeOnChange(function (newStateName) {
        self.currentState(newStateName);
    });

    //
    //Add states
    //

    //create login status check state
    self.stateMachine.states.push(function () {
        var contextChecked = ko.observable();
        var lockedBoothsChecked = ko.observable();
        var userLoggedIn = ko.observable();
        var userHasRegistration = ko.observable();
        var createNewBooth = ko.observable();
        var boothsLocked = ko.observable();
        var allowCreateBooth = ko.observable();
        var allowBoothSelection = ko.observable();
        var allowBoothDeletion = ko.observable();

        //subscribe to retrieving the show instance
        expressoEvent.subscribe("userIdentification.activeShowInstanceRetrieved", function (showInstance) {
            allowCreateBooth(showInstance.AllowManualBoothAdds);
            allowBoothSelection(showInstance.AllowBoothSelection);
            allowBoothDeletion(showInstance.AllowBoothDeletion);
           
        });

      
        var projectCode = $(location).attr('pathname').split("/")[1];

        //Check if this is a 'company' home page where the first argument is a 'c', ie c/US, c/UK etc.. 
        if (projectCode === 'c' || projectCode === 'Error') {
            //This is actually not a real project code, just a directed homepage, clear the notion of being within a project
            projectCode = undefined;
        }
        return {
            name: "checkUserStatus",
            enter: function () {
                lockedBoothsChecked(false);
                userContext.subscribeOnInitialized(function () {
                    userContext.reloadCurrentUser(() => {
                        if (userContext.currentUser()) {
                            if (userContext.selectedRegistration() && !self.editing()) {
                                userHasRegistration(true);

                                //check the single sign on status of this show
                                singleSignOnProviderService.getByShowInstance(userContext.selectedRegistration().ShowInstanceID, function (data) {
                                    if (data) {
                                        boothsLocked(data.LockBooths);
                                    }
                                    lockedBoothsChecked(true);
                                })

                                expressoEvent.publish("userIdentification.RegistrationConfirmed");

                            } else {
                                //No need to check for locked booths if they do not have a registration
                                lockedBoothsChecked(true);
                            }

                            //GET COUNT OF EXHIBITOR BOOTHS
                            exhibitorBoothService.getExhibitorBoothCount(projectCode, function (data) {
                                if (data === 0) {
                                    expressoEvent.publish("userIdentification.PostLoginStartState", "createBooth");
                                    createNewBooth(true);
                                }
                                else {
                                    expressoEvent.publish("userIdentification.PostLoginStartState", "searchBooth");
                                    createNewBooth(false)
                                }
                            });

                            userLoggedIn(true);
                            contextChecked(true);
                        }
                        else {
                        userLoggedIn(false);
                        contextChecked(true);
                        //No need to check for locked booths if they are not logged in
                        lockedBoothsChecked(true);
                        }
                    });
                });
            },
            exit: function () {
                userLoggedIn(null);
                userHasRegistration(null);
                contextChecked(null);
                createNewBooth(null);
                boothsLocked(null);
                lockedBoothsChecked(null);
            },
            transitions: [
                {
                    stateName: "login",
                    condition: function () {
                        return contextChecked() && (userLoggedIn() !== true || self.forceLogin());
                    }
                },
                {
                    stateName: "searchBooth",
                    condition: function () {
                        return contextChecked() && allowBoothSelection() && userLoggedIn() && projectCode && createNewBooth() === false && lockedBoothsChecked() && !boothsLocked() && (!userHasRegistration() || self.forceSelectNewBooth);
                    }
                },
                {
                    stateName: "createBooth",
                    condition: function () {
                        return allowCreateBooth() && contextChecked() && userLoggedIn() && projectCode && (createNewBooth() === true || !allowBoothSelection()) && lockedBoothsChecked() && !boothsLocked() && (!userHasRegistration() || self.forceSelectNewBooth);
                    }
                },
                {
                    stateName: "chooseLockedBooth",
                    condition: function () {
                        return lockedBoothsChecked() && boothsLocked();
                    }
                },
                {
                    stateName: "end",
                    condition: function () {
                        //for some reason, we need to pile this conditional into a value before returning it, or it won't register in the state machine
                        var value =
                            contextChecked()
                            && userLoggedIn()
                            && (typeof projectCode === "undefined" || projectCode.length < 1 || self.loginOnly || (typeof projectCode !== "undefined" && projectCode.length > 0 && userHasRegistration() && !self.forceSelectNewBooth && typeof (allowCreateBooth()) !== "undefined"))
                            && lockedBoothsChecked()
                            && !boothsLocked();
                        return value;
                    }
                }
            ]
        };
    }());

    //create booth validation check state
    self.stateMachine.states.push(function (projectCode) {
        var userMustSelectRegistrationType = ko.observable();
        var selectedBooth = ko.observable();
        var duplicateBooth = ko.observable();

        expressoEvent.subscribe("userIdentification.BoothSelected", function (data) {
            selectedBooth(data);
        });

        return {
            name: "validateSelectedBooth",
            enter: function () {

                userMustSelectRegistrationType(null);

                if (selectedBooth().Booth.BoothNumber != null) {
                    ShowWaitDialog();
                    $.ajax({
                        url: "/Registration/ValidateBoothNumber",
                        data: {
                            projectCode: projectCode,
                            boothNumber: selectedBooth().Booth.BoothNumber,
                            exbName: selectedBooth().Exhibitor.ExhibitorName
                        },
                        dataType: 'json',
                        type: 'get',
                        success: function (result) {
                            HideWaitDialog();
                            try {
                                if (result === true) {
                                    duplicateBooth(false);
                                }
                                else {
                                    duplicateBooth(true);
                                }
                            } catch (e) {
                                window.location.reload();
                            }
                        },
                        error: function (thrown) {
                            
                            console.log(thrown);
                            window.location.reload();
                            
                        }
                    });
                }
            },
            transitions: [
                {
                    stateName: "createBooth",
                    condition: function () {
                        return duplicateBooth() === true;
                    }
                },
                {
                    stateName: "confirmBooth",
                    condition: function () {
                        return duplicateBooth() === false;
                    }
                },

            ]
        };
    }(self.projectCode()));

    //create submit booth state
    self.stateMachine.states.push(function (projectCode) {
        var selectedBooth = ko.observable();
        var registrationSuccessful = ko.observable();

        expressoEvent.subscribe("userIdentification.BoothSelected", function (data) {
            selectedBooth(data);
        });

        return {
            name: "submitBooth",
            enter: function () {
                exhibitorBoothService.createBooth(
                    projectCode,
                    self.editing() ? self.registration().ID : null,
                    selectedBooth().ID,
                    selectedBooth().Booth.BoothNumber,
                    selectedBooth().Booth.BoothWidth,
                    selectedBooth().Booth.BoothLength,
                    selectedBooth().Exhibitor.ExhibitorName,
                    selectedBooth().IsExhibitor,
                    selectedBooth().ExternalId,
                    selectedBooth().Exhibitor.ThirdPartyCompanyName,
                    selectedBooth().CopyExhibitorQuestionnaires,
                    function (data) {
                        if (data && data.ProjectCode === projectCode) {
                            userContext.reloadCurrentUser(function () {
                                userContext.reloadActiveRegistration(function () {
                                    expressoEvent.publish("userIdentification.RegistrationCreated");
                                    registrationSuccessful(true);
                                    window.location = "/" + data.ProjectCode;
                                });
                            });
                        }
                        else if (data) {
                            window.location = "/" + data.ProjectCode;
                        }
                    });                
            },
            transitions: [
                {
                    stateName: "end",
                    condition: function () {
                        return registrationSuccessful();
                    }
                }]
        }
    }(self.projectCode()));

    self.stateMachine.states.push(function () {
        return {
            name: "end",
            enter: function () {
                expressoEvent.publish("userIdentification.ProcessEnded");
                self.stateMachine.stop();
            }
        };
    }());

    self.stateMachine.states.push(self.loginVM.state);
    self.stateMachine.states.push(self.createAccountVM.state);
    self.stateMachine.states.push(self.resetPasswordVM.state);
    self.stateMachine.states.push(self.verifyCodeVM.state);
    self.stateMachine.states.push(self.searchBoothVM.state);
    self.stateMachine.states.push(self.chooseBoothVM.state);
    self.stateMachine.states.push(self.chooseLockedBoothVM.state);
    self.stateMachine.states.push(self.createBoothVM.state);
    self.stateMachine.states.push(self.confirmBoothVM.state);
    self.stateMachine.states.push(self.chooseRegistrationTypeVM.state);

    var userLoggedIn = false;
    //defined initialization function
    self.show = function (params) {
        userLoggedIn = false;
        if (typeof params.onLogin === "function") {
            self.onLogin = params.onLogin;
        }
        if (typeof params.onCreateRegistration === "function") {
            self.onCreateRegistration = params.onCreateRegistration;
        }
        if (typeof params.onRegistrationConfirmed === "function") {
            self.onRegistrationConfirmed = params.onRegistrationConfirmed;
        }
        if (typeof params.onDismiss === "function") {
            self.onDismiss = params.onDismiss;
        }
        self.editing(false);
        if (params.registrationId) {
            self.editing(true);
            registrationService.getRegistration(params.registrationId, (registration) => {
                self.registration(registration);
            });
        }
        else {
            self.registration(null);
        }
        self.refreshAfterLoginAndDismiss = params.refreshAfterLoginAndDismiss;
        self.forceLogin = ko.observable(params.forceLogin);
        self.startAtCreateAccount = params.startAtCreateAccount;
        self.loginOnly = params.loginOnly;
        self.forceSelectNewBooth = params.forceSelectNewBooth;
        self.projectCode(params.projectCode);
        self.ready(true);
        self.ready.subscribe(function () {
            if (!self.ready()) {
                expressoEvent.publish("userIdentification.ProcessEnded");
            }
        });
        self.stateMachine.start();

    }

    //subscribe to messages so we can execute consumer-provided functions
    expressoEvent.subscribe("userIdentification.UserLoggedIn", function () {
        if (typeof self.onLogin === "function") { self.onLogin(); }
        userLoggedIn = true;
    });

    expressoEvent.subscribe("userIdentification.RegistrationCreated", function () {
        if (typeof self.onCreateRegistration === "function") { self.onCreateRegistration(); }
    });

    expressoEvent.subscribe("userIdentification.RegistrationConfirmed", function () {
        if (typeof self.onRegistrationConfirmed === "function") { self.onRegistrationConfirmed(); }
    });

    expressoEvent.subscribe("userIdentification.ProcessEnded", function () {
        if (typeof self.onDismiss === "function") { self.onDismiss(); }
        self.ready(false);

        if (self.refreshAfterLoginAndDismiss && userLoggedIn) {
            ShowWaitDialog();
            if (self.projectCode()) {
                checklistService.checkForceOverdueMandatoryForms(self.projectCode(), function (overdueFormsFound) {
                    if (overdueFormsFound) {
                        window.location.href = window.location.origin + "/" + self.projectCode() + "/checklist";
                    }
                    else {
                        window.location.reload();
                    }
                });
            }
            else {
                window.location.reload();
            }

        }
    });



    $(document).ready(function () {
        //apply bindings
        var node = document.getElementById("userIdentification");

        if (node && !ko.dataFor(node)) {

            ko.applyBindings(self, node);
            ko.validation.init({ insertMessages: false }); //init validation
            self.ready.subscribe(function () {
                if (!self.ready()) {
                    //report outside-of-process termination
                    if (self.currentState() !== "end") {
                        expressoEvent.publish("userIdentification.ProcessEnded");
                        self.stateMachine.stop();
                    }
                }
            });
        }
    });

    return self;
}();



;
ko.components.register('show-search-widget', {
    viewModel: function (params) {

        ko.validation.init({
            insertMessages: false,
            grouping: {
                deep: true,
                live: true,
                observable: true
            }

        }, true);

        function getShowsByCompany(companyId, includePastShows) {
            ShowWaitDialog();
            showInstanceService.getShowsByCompany(companyId, includePastShows, (shows) => {
                self.shows(shows);
                HideWaitDialog();
            });
        }

        let self = {
            includePastShows: ko.observable(),
            searchText: ko.observable(),
            selectedCompany: ko.observable(),
            currentPage: ko.observable(1),
            itemsPerPage: ko.observable(10),
            nonExclusiveCompanies: ko.observableArray(),
            shows: ko.observableArray(),
            itemsPerPageOptions: [10, 25, 50, 100],
            sortField: ko.observable("StartDate"),
            sortDirection: ko.observable("asc")
        };

        self.selectShow = (show) => {
            //Show busy
            ShowWaitDialog();
            return true;
        };
        self.filteredShows = ko.computed(() => {

            let searchText = self.searchText()?.toLowerCase();
            let shows = self.shows().filter((show) => {
                return !searchText
                    || show.Name?.toLowerCase().includes(searchText)
                    || show.Keywords?.toLowerCase().includes(searchText)
                    || show.Location?.toLowerCase().includes(searchText)
                    || isSameDay(show, searchText);
            });

            //Sort
            switch (self.sortField()) {
                case "Name":
                    shows.sort((a, b) => a.Name.localeCompare(b.Name))
                    break;
                case "StartDate":
                    let s = shows.sort((a, b) => new Date(a.StartDate) - new Date(b.StartDate))
                    break;
                case "Location":
                    shows.sort((a, b) => a.Location.localeCompare(b.Location))
                    break;
            }
            if (self.sortDirection() == "desc") {
                shows.reverse();
            }

            return shows;
        });

        //Paginate
        self.selectedShows = ko.computed(() => {
            let startIndex = (self.currentPage() - 1) * self.itemsPerPage();
            return self.filteredShows().slice(startIndex, startIndex + self.itemsPerPage());
        });

        self.totalPages = ko.computed(() => {
            return Math.max(Math.ceil(self.filteredShows().length / self.itemsPerPage()), 1);
        });

        self.changeSorting = function (fieldName) {
            if (self.sortField() === fieldName) {
                if (self.sortDirection() == "asc") {
                    self.sortDirection("desc");
                }
                else {
                    self.sortDirection("asc");
                }
            }
            else {
                self.sortDirection("asc");
            }
            self.sortField(fieldName);

        };
        self.changePage = (pageNumber) => {
            self.currentPage(pageNumber);
        };

        self.paginationOptions = ko.computed(() => {

            const visiblePages = 5;
            const totalPages = self.totalPages();

            //handle fewer pages than the desired amount
            if (totalPages <= visiblePages) {
                return Array.from({ length: totalPages }, (_, index) => index + 1)
            }

            let pages = [];

            //start and end
            let startPage = self.currentPage() - 2;
            let endPage = self.currentPage() + 2;

            if (startPage < 1) {
                startPage = 1;
                endPage = visiblePages;
            }

            if (endPage > totalPages) {
                endPage = totalPages;
                startPage = totalPages - (visiblePages - 1)
            }

            //middle pages
            for (let i = startPage; i <= endPage; i++) {
                pages.push(i);
            }

            return pages;
        });

        //Initialize with data
        companyService.getActiveCompany((company) => {
            if (company.Exclusive) {
                setCookie("dashboardCompany", JSON.stringify(company));
                subscribeToObservables();
                self.selectedCompany(company);
            }
            else {
                companyService.getNonExclusiveCompanies((companies) => {
                    self.nonExclusiveCompanies(companies);

                    //Get the selected company
                    let selectedCompanyCookie = getCookie("dashboardCompany");
                    subscribeToObservables();

                    let companyId = undefined;
                    if (selectedCompanyCookie?.value === undefined) {
                        companyService.getActiveCompany((company) => {
                            companyId = company.ID;
                            self.nonExclusiveCompanies().forEach((company) => {
                                if (companyId === company.ID) {
                                    self.selectedCompany(company);
                                }
                            });
                        });
                    }
                    else {
                        companyId = JSON.parse(selectedCompanyCookie.value).ID;
                        self.nonExclusiveCompanies().forEach((company) => {
                            if (companyId === company.ID) {
                                self.selectedCompany(company);
                            }
                        });
                    }
                });
            }
        })

        function subscribeToObservables() {
            //Keep the current page relevant
            self.totalPages.subscribe((newValue) => {
                self.currentPage(Math.min(self.currentPage(), newValue));
            });

            //Trigger show searching and cookie updates
            self.includePastShows.subscribe((newValue) => { getShowsByCompany(self.selectedCompany().ID, newValue); });
            self.selectedCompany.subscribe((newValue) => {
                if (newValue) {
                    getShowsByCompany(newValue.ID, self.includePastShows());
                    setCookie("dashboardCompany", JSON.stringify(newValue));
                }

                return true;
            });
        }


        function setCookie(name, value, days) {
            var expires = "";
            if (days) {
                var date = new Date();
                date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
                expires = "; expires=" + date.toUTCString();
            }
            document.cookie = name + "=" + (value || "") + expires + "; path=/";
        }

        function getCookie(name) {
            var nameEQ = name + "=";
            var ca = document.cookie.split(';');
            for (var i = 0; i < ca.length; i++) {
                var c = ca[i];
                while (c.charAt(0) == ' ') c = c.substring(1, c.length);
                if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
            }
            return null;
        }

        function isSameDay(show, searchText) {
            let dateParts = searchText.split("/");

            //early out
            if (dateParts.length == 1) {
                dateParts = searchText.split("-");
                if (dateParts.length == 1) {
                    return false;
                }
            }

            let d1 = new Date(show.StartDate);
            let d2 = getDateFromText(searchText);
            let d3 = new Date();
            try {
                d3 = getDateFromTextLocalized(searchText);
            }
            catch { }
            if (dateParts.length == 2) {
                return (d1.getDate() === d2.getDate() &&
                    d1.getMonth() === d2.getMonth())
                    || (d1.getDate() == d3.getDate() &&  //attempted localization
                    d1.getMonth() == d3.getMonth());
            }
            else if (dateParts.length == 3) {
                return (d1.getFullYear() === d2.getFullYear() &&
                    d1.getMonth() === d2.getMonth() &&
                    d1.getDate() === d2.getDate())
                    || (d1.getFullYear() === d3.getFullYear() && //attempted localization
                    d1.getMonth() === d3.getMonth() &&
                    d1.getDate() === d3.getDate());
            }

            return false
        }

        function getDateFromText(dateString) {
            let parts = dateString.split("/");
            if (parts.length == 1) {
                parts = dateString.split("-");
            }

            if (parts.length === 2) {
                // dd/mm format
                const month = parseInt(parts[0], 10) - 1; // JavaScript months are 0-indexed
                const day = parseInt(parts[1], 10);
                return new Date(0, month, day);
            } else if (parts.length === 3) {
                // mm/dd/yyyy format
                const month = parseInt(parts[0], 10) - 1;
                const day = parseInt(parts[1], 10);
                const year = parseInt(parts[2], 10);
                const fullYear = year < 100 ? 2000 + year : year;
                return new Date(fullYear, month, day);
            } else {
                return new Date(dateString);
            }
        }

        function getDateFromTextLocalized(dateString) {
            let parts = dateString.split("/");
            if (parts.length == 1) {
                parts = dateString.split("-");
            }

            if (parts.length === 2) {
                // dd/mm format
                const month = parseInt(parts[1], 10) - 1; // JavaScript months are 0-indexed
                const day = parseInt(parts[0], 10);
                return new Date(0, month, day);
            } else if (parts.length === 3) {
                // mm/dd/yyyy format
                const month = parseInt(parts[1], 10) - 1;
                const day = parseInt(parts[0], 10);
                const year = parseInt(parts[2], 10);
                const fullYear = year < 100 ? 2000 + year : year;
                return new Date(fullYear, month, day);
            } else {
                return new Date(dateString);
            }
        }


        return self;
    },
    template:
        { fromUrl: '/Home/DashboardShowSearchTemplate', maxCacheAge: 10 }
});;
//Typeahead binding
//options {
//  source: Observable containing an array of searchable items.  Each item must have a text and a search criteria value
//  allowFreeType: If true, user can receive no results in the selected item
//  minLength:  Minimum length of the search string
//  limit:  Maximum results displayed
//  typeaheadObservable:  Observable that will be provided with a function to trigger typeahead
//}

ko.bindingHandlers.typeahead = {
    init: function (element, valueAccessor, bindingAccessor) {
        var $e = $(element);

        var options = valueAccessor();

        $e.parent().addClass('scrollable-dropdown-menu');

        valueAccessor().chosenElement.subscribe(function () {
            if (valueAccessor().chosenElement()) {
                bindingAccessor().value(valueAccessor().chosenElement().text);
                $e.typeahead('val', valueAccessor().chosenElement().text);
            }
        });

        if (typeof options.typeaheadObservable === "function") {
            options.typeaheadObservable(() => {
                $e.focus();
                $e.typeahead('open');
            });
        }

        options.source.subscribe((newValues) => {
            $e.off('blur');

            //$e.typeahead('destroy');  // Clean up old instance if needed
            setTypeahead();           // Call your init function again
            $e.on('blur', setSelectedValue);

        });

        if (valueAccessor().chosenElement()) {
            bindingAccessor().value(valueAccessor().chosenElement().text);
            $e.typeahead('val', valueAccessor().chosenElement().text);
        }


        function findMatches(q) {
            var matches;

            // an array that will be populated with substring matches
            matches = [];

            // iterate through the pool of strings and for any string that
            // contains the substring `q`, add it to the `matches` array
            $.each(options.source(), function (i, source) {

                //check search criteria
                source.searchCriteria.forEach(function (criterion) {
                    if (criterion && matches.indexOf(source) === -1) {
                        if (criterion.toLowerCase().indexOf(q.toLowerCase()) === 0) {
                            matches.push(source);
                        }
                    }
                });
            });

            return matches;
        }

        var substringMatcher = function (strs) {
            return function wrapMatches(q, cb) {
                var matches = findMatches(q);
                var options = [];
                matches.forEach(function (match) {
                    options.push(match.text);
                });
                cb(options);
            };
        };
        var previousValue = "";

        // passing in `null` for the `options` arguments will result in the default
        // options being used
        var typeaheadIntervalId = setInterval(function () {
            if ($e.typeahead) {

                setTypeahead();
                clearInterval(typeaheadIntervalId);
            }

        }, 100);


        function setSelectedValue() {  //Validate onblur
            var value = this.value;
            if (value) {
                var matches = findMatches(value);
                var newValue;
                if (matches.length === 0) {
                    //If we are allowed to free type, set the values appropriately
                    if (options.allowFreeType) {
                        previousValue = undefined;
                        valueAccessor().chosenElement(undefined);
                        return;
                    }
                    else {
                        //revert to previous value (?)
                        newValue = previousValue;
                    }
                }
                else {
                    exactMatch = matches.filter(function (match) {
                        return match.searchCriteria.indexOf(value) > -1;
                    })[0];
                    if (exactMatch) {
                        newValue = exactMatch;
                    }
                    else {
                        //If we are allowed to free type, set the values appropriately
                        if (options.allowFreeType) {
                            previousValue = undefined;
                            valueAccessor().chosenElement(undefined);
                            return;
                        }
                        else {
                            newValue = matches[0];
                        }
                    }
                }

                previousValue = newValue;
                $e.typeahead('val', newValue.text);
                bindingAccessor().value(newValue.text);
                valueAccessor().chosenElement(newValue);
            }
            else {
                previousValue = undefined;
                bindingAccessor().value(undefined);
                valueAccessor().chosenElement(undefined);
            }

            return true;
        }

        function setTypeahead() {
            $e.typeahead({
                hint: true,
                highlight: true,
                minLength: options.minLength ? options.minLength : 3
            }, {
                source: substringMatcher(options.source()),
                limit: options.limit ? options.limit : 200
            }).on('typeahead:selected', setSelectedValue);

        }

        $e.on('blur', setSelectedValue);
    }
};
;
ko.components.register('impersonate-widget', {
    viewModel: function (params) {

        ko.validation.init({
            insertMessages: false,
            grouping: {
                deep: true,
                live: true,
                observable: true
            }

        }, true);

        let self = {
            searchCriteria: ko.observable(),
            users: ko.observableArray(),
            lastSearchCriteria: ko.observable(),
            selectedUser: ko.observable(),
            searching: ko.observable(),
            manualTypeAheadFunction: ko.observable()
        };

        self.searchCriteria.subscribe((newValue) => {
            if (newValue && newValue.length > 2 && (!self.lastSearchCriteria() || !newValue.includes(self.lastSearchCriteria()))) {
                //Search for users
                self.lastSearchCriteria(newValue);
                self.searching(true);
                userService.searchUsers(newValue, (users) => {
                    users.forEach((user) => {
                        user.text = user.UserLoginName + " (" + user.ContactEmail + ")";
                        user.searchCriteria = [user.UserLoginName, user.ContactEmail, user.text];
                    });
                    self.users(users);
                    self.searching(false);
                    self.manualTypeAheadFunction()();
                });
            }
        });

        self.launchImpersonation = () => {
            userService.impersonate(self.selectedUser().UserLoginName, () => {
                ShowWaitDialog();
                location.reload();
            });
        };



        return self;
    },
    template:
        { fromUrl: '/Home/ImpersonateTemplate', maxCacheAge: 10 }
});;
ko.components.register('user-file-history-widget', {
    viewModel: function (params) {

        ko.validation.init({
            insertMessages: false,
            grouping: {
                deep: true,
                live: true,
                observable: true
            }

        }, true);

        let self = {
            hideFilterControls: ko.wrapObservable(params.hideFilterControls),
            hideHeader: ko.wrapObservable(params.hideHeader),
            fileCategories: ko.observableArray(),
            fileTypes: ko.observableArray(),
            includePastShows: ko.wrapObservable(params.includePastShows),
            userFiles: ko.observableArray(),
            selectedFileCategory: ko.wrapObservable(params.selectedFileCategory),
            selectedFileType: ko.wrapObservable(params.selectedFileType),
            formatFileName: function (path) { return (path || '').replace(/^.*[\\\/]/, ''); },
            formatDateTime: function (date) {
                return new Date(date).toLocaleDateString()
            },
            allowDelete: function (userFile) {
                return !userFile.is_deleted && (!userFile.end_user_id || (userFile.user_id == userFile.end_user_id));
            },
            delete: function (userFile) {
                userFile.isDeleted(true);
                userFile.is_deleted = true;
            },
            copy: function (userFile) {

            },
            undoDelete: function (userFile) {
                userFile.isDeleted(false);
                userFile.is_deleted = false;
            },
            activeProjectCode: ko.observable()
        };

        self.saveChanges = () => {
            fileLibraryService.saveUserFileHistoryChanges(self.modifiedUserFiles(), () => {
                self.initialize();
                toastr.success(translations.C447);
            });
        };

        self.filteredUserFiles = ko.computed(() => {
            return self.userFiles().filter((userFile) => {
                return (!self.selectedFileCategory()?.id || self.selectedFileCategory().id == userFile.category_id)
                    && (!self.selectedFileType()?.id || self.selectedFileType().id == userFile.type_id)
                    && (self.includePastShows() || new Date(userFile.ShowInstanceSummary.StartDate) > new Date());

            });
        });

        self.modifiedUserFiles = ko.computed(() => {
            return self.userFiles().filter((userFile) => {
                return userFile.isDeleted() || userFile.isCopy();
            });
        });

        //Initialize
        self.initialize = () => {
            fileLibraryService.getLookups(undefined, (lookups) => {
                lookups.FileCategories.splice(0, 0, { name: translations.AllCategories });
                lookups.FileTypes.splice(0, 0, { name: translations.AllTypes });
                lookups.UserFiles.forEach((userFile) => {
                    userFile.isDeleted = ko.observable();
                    userFile.isCopy = ko.observable();
                });

                self.fileCategories(lookups.FileCategories);
                self.fileTypes(lookups.FileTypes);
                self.userFiles(lookups.UserFiles);
            });
        };

        self.initialize();



        return self;
    },
    template:
        { fromUrl: '/FileLibrary/UserFileHistoryTemplate', maxCacheAge: 10 }
});;
