{"version":3,"sources":["jquery-migrate-1.3.0.min.js","globalize.js","underscore-min.js","knockout.mapping.js","knockout_bindings.js","knockout_stopbindings.js","jog.js","jquery.ui.selectmenu.js","Utypia.js","jquery.loading.min.js","jquery.blockUI.js","jquery.timers-1.0.0.js","jquery.ba-bbq.min.js","jquery.ddslick.js","jquery.hoverIntent.minified.js","tooltip.js","Translate.js","cookieEnabled.js","jquery.dump.js","UB4next.util.js","utils.js","GlobalHandlers.js"],"names":[],"mappings":"AAAA;AACA;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACljDA;AACA;AACA;AACA;AACA;AACA;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACzEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACnTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvmBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACzlBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACnGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5mBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC9IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AClVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACpFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACxGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACrKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACjSA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC9aA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"lib.js","sourcesContent":["/*! jQuery Migrate v1.3.0 | (c) jQuery Foundation and other contributors | jquery.org/license */\n\"undefined\"==typeof jQuery.migrateMute&&(jQuery.migrateMute=!0),function(a,b,c){function d(c){var d=b.console;f[c]||(f[c]=!0,a.migrateWarnings.push(c),d&&d.warn&&!a.migrateMute&&(d.warn(\"JQMIGRATE: \"+c),a.migrateTrace&&d.trace&&d.trace()))}function e(b,c,e,f){if(Object.defineProperty)try{return void Object.defineProperty(b,c,{configurable:!0,enumerable:!0,get:function(){return d(f),e},set:function(a){d(f),e=a}})}catch(g){}a._definePropertyBroken=!0,b[c]=e}a.migrateVersion=\"1.3.0\";var f={};a.migrateWarnings=[],!a.migrateMute&&b.console&&b.console.log&&b.console.log(\"JQMIGRATE: Logging is active\"),a.migrateTrace===c&&(a.migrateTrace=!0),a.migrateReset=function(){f={},a.migrateWarnings.length=0},\"BackCompat\"===document.compatMode&&d(\"jQuery is not compatible with Quirks Mode\");var g=a(\"<input/>\",{size:1}).attr(\"size\")&&a.attrFn,h=a.attr,i=a.attrHooks.value&&a.attrHooks.value.get||function(){return null},j=a.attrHooks.value&&a.attrHooks.value.set||function(){return c},k=/^(?:input|button)$/i,l=/^[238]$/,m=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,n=/^(?:checked|selected)$/i;e(a,\"attrFn\",g||{},\"jQuery.attrFn is deprecated\"),a.attr=function(b,e,f,i){var j=e.toLowerCase(),o=b&&b.nodeType;return i&&(h.length<4&&d(\"jQuery.fn.attr( props, pass ) is deprecated\"),b&&!l.test(o)&&(g?e in g:a.isFunction(a.fn[e])))?a(b)[e](f):(\"type\"===e&&f!==c&&k.test(b.nodeName)&&b.parentNode&&d(\"Can't change the 'type' of an input or button in IE 6/7/8\"),!a.attrHooks[j]&&m.test(j)&&(a.attrHooks[j]={get:function(b,d){var e,f=a.prop(b,d);return f===!0||\"boolean\"!=typeof f&&(e=b.getAttributeNode(d))&&e.nodeValue!==!1?d.toLowerCase():c},set:function(b,c,d){var e;return c===!1?a.removeAttr(b,d):(e=a.propFix[d]||d,e in b&&(b[e]=!0),b.setAttribute(d,d.toLowerCase())),d}},n.test(j)&&d(\"jQuery.fn.attr('\"+j+\"') might use property instead of attribute\")),h.call(a,b,e,f))},a.attrHooks.value={get:function(a,b){var c=(a.nodeName||\"\").toLowerCase();return\"button\"===c?i.apply(this,arguments):(\"input\"!==c&&\"option\"!==c&&d(\"jQuery.fn.attr('value') no longer gets properties\"),b in a?a.value:null)},set:function(a,b){var c=(a.nodeName||\"\").toLowerCase();return\"button\"===c?j.apply(this,arguments):(\"input\"!==c&&\"option\"!==c&&d(\"jQuery.fn.attr('value', val) no longer sets properties\"),void(a.value=b))}};var o,p,q=a.fn.init,r=a.parseJSON,s=/^\\s*</,t=/^([^<]*)(<[\\w\\W]+>)([^>]*)$/;a.fn.init=function(b,e,f){var g,h;return b&&\"string\"==typeof b&&!a.isPlainObject(e)&&(g=t.exec(a.trim(b)))&&g[0]&&(s.test(b)||d(\"$(html) HTML strings must start with '<' character\"),g[3]&&d(\"$(html) HTML text after last tag is ignored\"),\"#\"===g[0].charAt(0)&&(d(\"HTML string cannot start with a '#' character\"),a.error(\"JQMIGRATE: Invalid selector string (XSS)\")),e&&e.context&&(e=e.context),a.parseHTML)?q.call(this,a.parseHTML(g[2],e&&e.ownerDocument||e||document,!0),e,f):(\"#\"===b&&(d(\"jQuery( '#' ) is not a valid selector\"),b=[]),h=q.apply(this,arguments),b&&b.selector!==c?(h.selector=b.selector,h.context=b.context):(h.selector=\"string\"==typeof b?b:\"\",b&&(h.context=b.nodeType?b:e||document)),h)},a.fn.init.prototype=a.fn,a.parseJSON=function(a){return a?r.apply(this,arguments):(d(\"jQuery.parseJSON requires a valid JSON string\"),null)},a.uaMatch=function(a){a=a.toLowerCase();var b=/(chrome)[ \\/]([\\w.]+)/.exec(a)||/(webkit)[ \\/]([\\w.]+)/.exec(a)||/(opera)(?:.*version|)[ \\/]([\\w.]+)/.exec(a)||/(msie) ([\\w.]+)/.exec(a)||a.indexOf(\"compatible\")<0&&/(mozilla)(?:.*? rv:([\\w.]+)|)/.exec(a)||[];return{browser:b[1]||\"\",version:b[2]||\"0\"}},a.browser||(o=a.uaMatch(navigator.userAgent),p={},o.browser&&(p[o.browser]=!0,p.version=o.version),p.chrome?p.webkit=!0:p.webkit&&(p.safari=!0),a.browser=p),e(a,\"browser\",a.browser,\"jQuery.browser is deprecated\"),a.boxModel=a.support.boxModel=\"CSS1Compat\"===document.compatMode,e(a,\"boxModel\",a.boxModel,\"jQuery.boxModel is deprecated\"),e(a.support,\"boxModel\",a.support.boxModel,\"jQuery.support.boxModel is deprecated\"),a.sub=function(){function b(a,c){return new b.fn.init(a,c)}a.extend(!0,b,this),b.superclass=this,b.fn=b.prototype=this(),b.fn.constructor=b,b.sub=this.sub,b.fn.init=function(d,e){var f=a.fn.init.call(this,d,e,c);return f instanceof b?f:b(f)},b.fn.init.prototype=b.fn;var c=b(document);return d(\"jQuery.sub() is deprecated\"),b},a.fn.size=function(){return d(\"jQuery.fn.size() is deprecated; use the .length property\"),this.length};var u=!1;a.swap&&a.each([\"height\",\"width\",\"reliableMarginRight\"],function(b,c){var d=a.cssHooks[c]&&a.cssHooks[c].get;d&&(a.cssHooks[c].get=function(){var a;return u=!0,a=d.apply(this,arguments),u=!1,a})}),a.swap=function(a,b,c,e){var f,g,h={};u||d(\"jQuery.swap() is undocumented and deprecated\");for(g in b)h[g]=a.style[g],a.style[g]=b[g];f=c.apply(a,e||[]);for(g in b)a.style[g]=h[g];return f},a.ajaxSetup({converters:{\"text json\":a.parseJSON}});var v=a.fn.data;a.fn.data=function(b){var e,f,g=this[0];return!g||\"events\"!==b||1!==arguments.length||(e=a.data(g,b),f=a._data(g,b),e!==c&&e!==f||f===c)?v.apply(this,arguments):(d(\"Use of jQuery.fn.data('events') is deprecated\"),f)};var w=/\\/(java|ecma)script/i;a.clean||(a.clean=function(b,c,e,f){c=c||document,c=!c.nodeType&&c[0]||c,c=c.ownerDocument||c,d(\"jQuery.clean() is deprecated\");var g,h,i,j,k=[];if(a.merge(k,a.buildFragment(b,c).childNodes),e)for(i=function(a){return!a.type||w.test(a.type)?f?f.push(a.parentNode?a.parentNode.removeChild(a):a):e.appendChild(a):void 0},g=0;null!=(h=k[g]);g++)a.nodeName(h,\"script\")&&i(h)||(e.appendChild(h),\"undefined\"!=typeof h.getElementsByTagName&&(j=a.grep(a.merge([],h.getElementsByTagName(\"script\")),i),k.splice.apply(k,[g+1,0].concat(j)),g+=j.length));return k});var x=a.event.add,y=a.event.remove,z=a.event.trigger,A=a.fn.toggle,B=a.fn.live,C=a.fn.die,D=a.fn.load,E=\"ajaxStart|ajaxStop|ajaxSend|ajaxComplete|ajaxError|ajaxSuccess\",F=new RegExp(\"\\\\b(?:\"+E+\")\\\\b\"),G=/(?:^|\\s)hover(\\.\\S+|)\\b/,H=function(b){return\"string\"!=typeof b||a.event.special.hover?b:(G.test(b)&&d(\"'hover' pseudo-event is deprecated, use 'mouseenter mouseleave'\"),b&&b.replace(G,\"mouseenter$1 mouseleave$1\"))};a.event.props&&\"attrChange\"!==a.event.props[0]&&a.event.props.unshift(\"attrChange\",\"attrName\",\"relatedNode\",\"srcElement\"),a.event.dispatch&&e(a.event,\"handle\",a.event.dispatch,\"jQuery.event.handle is undocumented and deprecated\"),a.event.add=function(a,b,c,e,f){a!==document&&F.test(b)&&d(\"AJAX events should be attached to document: \"+b),x.call(this,a,H(b||\"\"),c,e,f)},a.event.remove=function(a,b,c,d,e){y.call(this,a,H(b)||\"\",c,d,e)},a.each([\"load\",\"unload\",\"error\"],function(b,c){a.fn[c]=function(){var a=Array.prototype.slice.call(arguments,0);return d(\"jQuery.fn.\"+c+\"() is deprecated\"),\"load\"===c&&\"string\"==typeof arguments[0]?D.apply(this,arguments):(a.splice(0,0,c),arguments.length?this.bind.apply(this,a):(this.triggerHandler.apply(this,a),this))}}),a.fn.toggle=function(b,c){if(!a.isFunction(b)||!a.isFunction(c))return A.apply(this,arguments);d(\"jQuery.fn.toggle(handler, handler...) is deprecated\");var e=arguments,f=b.guid||a.guid++,g=0,h=function(c){var d=(a._data(this,\"lastToggle\"+b.guid)||0)%g;return a._data(this,\"lastToggle\"+b.guid,d+1),c.preventDefault(),e[d].apply(this,arguments)||!1};for(h.guid=f;g<e.length;)e[g++].guid=f;return this.click(h)},a.fn.live=function(b,c,e){return d(\"jQuery.fn.live() is deprecated\"),B?B.apply(this,arguments):(a(this.context).on(b,this.selector,c,e),this)},a.fn.die=function(b,c){return d(\"jQuery.fn.die() is deprecated\"),C?C.apply(this,arguments):(a(this.context).off(b,this.selector||\"**\",c),this)},a.event.trigger=function(a,b,c,e){return c||F.test(a)||d(\"Global events are undocumented and deprecated\"),z.call(this,a,b,c||document,e)},a.each(E.split(\"|\"),function(b,c){a.event.special[c]={setup:function(){var b=this;return b!==document&&(a.event.add(document,c+\".\"+a.guid,function(){a.event.trigger(c,Array.prototype.slice.call(arguments,1),b,!0)}),a._data(this,c,a.guid++)),!1},teardown:function(){return this!==document&&a.event.remove(document,c+\".\"+a._data(this,c)),!1}}}),a.event.special.ready={setup:function(){d(\"'ready' event is deprecated\")}};var I=a.fn.andSelf||a.fn.addBack,J=a.fn.find;if(a.fn.andSelf=function(){return d(\"jQuery.fn.andSelf() replaced by jQuery.fn.addBack()\"),I.apply(this,arguments)},a.fn.find=function(a){var b=J.apply(this,arguments);return b.context=this.context,b.selector=this.selector?this.selector+\" \"+a:a,b},a.Callbacks){var K=a.Deferred,L=[[\"resolve\",\"done\",a.Callbacks(\"once memory\"),a.Callbacks(\"once memory\"),\"resolved\"],[\"reject\",\"fail\",a.Callbacks(\"once memory\"),a.Callbacks(\"once memory\"),\"rejected\"],[\"notify\",\"progress\",a.Callbacks(\"memory\"),a.Callbacks(\"memory\")]];a.Deferred=function(b){var c=K(),e=c.promise();return c.pipe=e.pipe=function(){var b=arguments;return d(\"deferred.pipe() is deprecated\"),a.Deferred(function(d){a.each(L,function(f,g){var h=a.isFunction(b[f])&&b[f];c[g[1]](function(){var b=h&&h.apply(this,arguments);b&&a.isFunction(b.promise)?b.promise().done(d.resolve).fail(d.reject).progress(d.notify):d[g[0]+\"With\"](this===e?d.promise():this,h?[b]:arguments)})}),b=null}).promise()},c.isResolved=function(){return d(\"deferred.isResolved is deprecated\"),\"resolved\"===c.state()},c.isRejected=function(){return d(\"deferred.isRejected is deprecated\"),\"rejected\"===c.state()},b&&b.call(c,c),c}}}(jQuery,window);","/*!\n * Globalize\n *\n * http://github.com/jquery/globalize\n *\n * Copyright Software Freedom Conservancy, Inc.\n * Dual licensed under the MIT or GPL Version 2 licenses.\n * http://jquery.org/license\n */\n\n(function( window, undefined ) {\n\nvar Globalize,\n\t// private variables\n\tregexHex,\n\tregexInfinity,\n\tregexParseFloat,\n\tregexTrim,\n\t// private JavaScript utility functions\n\tarrayIndexOf,\n\tendsWith,\n\textend,\n\tisArray,\n\tisFunction,\n\tisObject,\n\tstartsWith,\n\ttrim,\n\ttruncate,\n\tzeroPad,\n\t// private Globalization utility functions\n\tappendPreOrPostMatch,\n\texpandFormat,\n\tformatDate,\n\tformatNumber,\n\tgetTokenRegExp,\n\tgetEra,\n\tgetEraYear,\n\tparseExact,\n\tparseNegativePattern;\n\n// Global variable (Globalize) or CommonJS module (globalize)\nGlobalize = function( cultureSelector ) {\n\treturn new Globalize.prototype.init( cultureSelector );\n};\n\nif ( typeof require !== \"undefined\" &&\n\ttypeof exports !== \"undefined\" &&\n\ttypeof module !== \"undefined\" ) {\n\t// Assume CommonJS\n\tmodule.exports = Globalize;\n} else {\n\t// Export as global variable\n\twindow.Globalize = Globalize;\n}\n\nGlobalize.cultures = {};\n\nGlobalize.prototype = {\n\tconstructor: Globalize,\n\tinit: function( cultureSelector ) {\n\t\tthis.cultures = Globalize.cultures;\n\t\tthis.cultureSelector = cultureSelector;\n\n\t\treturn this;\n\t}\n};\nGlobalize.prototype.init.prototype = Globalize.prototype;\n\n// 1. When defining a culture, all fields are required except the ones stated as optional.\n// 2. Each culture should have a \".calendars\" object with at least one calendar named \"standard\"\n//    which serves as the default calendar in use by that culture.\n// 3. Each culture should have a \".calendar\" object which is the current calendar being used,\n//    it may be dynamically changed at any time to one of the calendars in \".calendars\".\nGlobalize.cultures[ \"default\" ] = {\n\t// A unique name for the culture in the form <language code>-<country/region code>\n\tname: \"en\",\n\t// the name of the culture in the english language\n\tenglishName: \"English\",\n\t// the name of the culture in its own language\n\tnativeName: \"English\",\n\t// whether the culture uses right-to-left text\n\tisRTL: false,\n\t// \"language\" is used for so-called \"specific\" cultures.\n\t// For example, the culture \"es-CL\" means \"Spanish, in Chili\".\n\t// It represents the Spanish-speaking culture as it is in Chili,\n\t// which might have different formatting rules or even translations\n\t// than Spanish in Spain. A \"neutral\" culture is one that is not\n\t// specific to a region. For example, the culture \"es\" is the generic\n\t// Spanish culture, which may be a more generalized version of the language\n\t// that may or may not be what a specific culture expects.\n\t// For a specific culture like \"es-CL\", the \"language\" field refers to the\n\t// neutral, generic culture information for the language it is using.\n\t// This is not always a simple matter of the string before the dash.\n\t// For example, the \"zh-Hans\" culture is netural (Simplified Chinese).\n\t// And the \"zh-SG\" culture is Simplified Chinese in Singapore, whose lanugage\n\t// field is \"zh-CHS\", not \"zh\".\n\t// This field should be used to navigate from a specific culture to it's\n\t// more general, neutral culture. If a culture is already as general as it\n\t// can get, the language may refer to itself.\n\tlanguage: \"en\",\n\t// numberFormat defines general number formatting rules, like the digits in\n\t// each grouping, the group separator, and how negative numbers are displayed.\n\tnumberFormat: {\n\t\t// [negativePattern]\n\t\t// Note, numberFormat.pattern has no \"positivePattern\" unlike percent and currency,\n\t\t// but is still defined as an array for consistency with them.\n\t\t//   negativePattern: one of \"(n)|-n|- n|n-|n -\"\n\t\tpattern: [ \"-n\" ],\n\t\t// number of decimal places normally shown\n\t\tdecimals: 2,\n\t\t// string that separates number groups, as in 1,000,000\n\t\t\",\": \",\",\n\t\t// string that separates a number from the fractional portion, as in 1.99\n\t\t\".\": \".\",\n\t\t// array of numbers indicating the size of each number group.\n\t\t// TODO: more detailed description and example\n\t\tgroupSizes: [ 3 ],\n\t\t// symbol used for positive numbers\n\t\t\"+\": \"+\",\n\t\t// symbol used for negative numbers\n\t\t\"-\": \"-\",\n\t\t// symbol used for NaN (Not-A-Number)\n\t\t\"NaN\": \"NaN\",\n\t\t// symbol used for Negative Infinity\n\t\tnegativeInfinity: \"-Infinity\",\n\t\t// symbol used for Positive Infinity\n\t\tpositiveInfinity: \"Infinity\",\n\t\tpercent: {\n\t\t\t// [negativePattern, positivePattern]\n\t\t\t//   negativePattern: one of \"-n %|-n%|-%n|%-n|%n-|n-%|n%-|-% n|n %-|% n-|% -n|n- %\"\n\t\t\t//   positivePattern: one of \"n %|n%|%n|% n\"\n\t\t\tpattern: [ \"-n %\", \"n %\" ],\n\t\t\t// number of decimal places normally shown\n\t\t\tdecimals: 2,\n\t\t\t// array of numbers indicating the size of each number group.\n\t\t\t// TODO: more detailed description and example\n\t\t\tgroupSizes: [ 3 ],\n\t\t\t// string that separates number groups, as in 1,000,000\n\t\t\t\",\": \",\",\n\t\t\t// string that separates a number from the fractional portion, as in 1.99\n\t\t\t\".\": \".\",\n\t\t\t// symbol used to represent a percentage\n\t\t\tsymbol: \"%\"\n\t\t},\n\t\tcurrency: {\n\t\t\t// [negativePattern, positivePattern]\n\t\t\t//   negativePattern: one of \"($n)|-$n|$-n|$n-|(n$)|-n$|n-$|n$-|-n $|-$ n|n $-|$ n-|$ -n|n- $|($ n)|(n $)\"\n\t\t\t//   positivePattern: one of \"$n|n$|$ n|n $\"\n\t\t\tpattern: [ \"($n)\", \"$n\" ],\n\t\t\t// number of decimal places normally shown\n\t\t\tdecimals: 2,\n\t\t\t// array of numbers indicating the size of each number group.\n\t\t\t// TODO: more detailed description and example\n\t\t\tgroupSizes: [ 3 ],\n\t\t\t// string that separates number groups, as in 1,000,000\n\t\t\t\",\": \",\",\n\t\t\t// string that separates a number from the fractional portion, as in 1.99\n\t\t\t\".\": \".\",\n\t\t\t// symbol used to represent currency\n\t\t\tsymbol: \"$\"\n\t\t}\n\t},\n\t// calendars defines all the possible calendars used by this culture.\n\t// There should be at least one defined with name \"standard\", and is the default\n\t// calendar used by the culture.\n\t// A calendar contains information about how dates are formatted, information about\n\t// the calendar's eras, a standard set of the date formats,\n\t// translations for day and month names, and if the calendar is not based on the Gregorian\n\t// calendar, conversion functions to and from the Gregorian calendar.\n\tcalendars: {\n\t\tstandard: {\n\t\t\t// name that identifies the type of calendar this is\n\t\t\tname: \"Gregorian_USEnglish\",\n\t\t\t// separator of parts of a date (e.g. \"/\" in 11/05/1955)\n\t\t\t\"/\": \"/\",\n\t\t\t// separator of parts of a time (e.g. \":\" in 05:44 PM)\n\t\t\t\":\": \":\",\n\t\t\t// the first day of the week (0 = Sunday, 1 = Monday, etc)\n\t\t\tfirstDay: 0,\n\t\t\tdays: {\n\t\t\t\t// full day names\n\t\t\t\tnames: [ \"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\" ],\n\t\t\t\t// abbreviated day names\n\t\t\t\tnamesAbbr: [ \"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\" ],\n\t\t\t\t// shortest day names\n\t\t\t\tnamesShort: [ \"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\" ]\n\t\t\t},\n\t\t\tmonths: {\n\t\t\t\t// full month names (13 months for lunar calendards -- 13th month should be \"\" if not lunar)\n\t\t\t\tnames: [ \"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\", \"\" ],\n\t\t\t\t// abbreviated month names\n\t\t\t\tnamesAbbr: [ \"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\", \"\" ]\n\t\t\t},\n\t\t\t// AM and PM designators in one of these forms:\n\t\t\t// The usual view, and the upper and lower case versions\n\t\t\t//   [ standard, lowercase, uppercase ]\n\t\t\t// The culture does not use AM or PM (likely all standard date formats use 24 hour time)\n\t\t\t//   null\n\t\t\tAM: [ \"AM\", \"am\", \"AM\" ],\n\t\t\tPM: [ \"PM\", \"pm\", \"PM\" ],\n\t\t\teras: [\n\t\t\t\t// eras in reverse chronological order.\n\t\t\t\t// name: the name of the era in this culture (e.g. A.D., C.E.)\n\t\t\t\t// start: when the era starts in ticks (gregorian, gmt), null if it is the earliest supported era.\n\t\t\t\t// offset: offset in years from gregorian calendar\n\t\t\t\t{\n\t\t\t\t\t\"name\": \"A.D.\",\n\t\t\t\t\t\"start\": null,\n\t\t\t\t\t\"offset\": 0\n\t\t\t\t}\n\t\t\t],\n\t\t\t// when a two digit year is given, it will never be parsed as a four digit\n\t\t\t// year greater than this year (in the appropriate era for the culture)\n\t\t\t// Set it as a full year (e.g. 2029) or use an offset format starting from\n\t\t\t// the current year: \"+19\" would correspond to 2029 if the current year 2010.\n\t\t\ttwoDigitYearMax: 2029,\n\t\t\t// set of predefined date and time patterns used by the culture\n\t\t\t// these represent the format someone in this culture would expect\n\t\t\t// to see given the portions of the date that are shown.\n\t\t\tpatterns: {\n\t\t\t\t// short date pattern\n\t\t\t\td: \"M/d/yyyy\",\n\t\t\t\t// long date pattern\n\t\t\t\tD: \"dddd, MMMM dd, yyyy\",\n\t\t\t\t// short time pattern\n\t\t\t\tt: \"h:mm tt\",\n\t\t\t\t// long time pattern\n\t\t\t\tT: \"h:mm:ss tt\",\n\t\t\t\t// long date, short time pattern\n\t\t\t\tf: \"dddd, MMMM dd, yyyy h:mm tt\",\n\t\t\t\t// long date, long time pattern\n\t\t\t\tF: \"dddd, MMMM dd, yyyy h:mm:ss tt\",\n\t\t\t\t// month/day pattern\n\t\t\t\tM: \"MMMM dd\",\n\t\t\t\t// month/year pattern\n\t\t\t\tY: \"yyyy MMMM\",\n\t\t\t\t// S is a sortable format that does not vary by culture\n\t\t\t\tS: \"yyyy\\u0027-\\u0027MM\\u0027-\\u0027dd\\u0027T\\u0027HH\\u0027:\\u0027mm\\u0027:\\u0027ss\"\n\t\t\t}\n\t\t\t// optional fields for each calendar:\n\t\t\t/*\n\t\t\tmonthsGenitive:\n\t\t\t\tSame as months but used when the day preceeds the month.\n\t\t\t\tOmit if the culture has no genitive distinction in month names.\n\t\t\t\tFor an explaination of genitive months, see http://blogs.msdn.com/michkap/archive/2004/12/25/332259.aspx\n\t\t\tconvert:\n\t\t\t\tAllows for the support of non-gregorian based calendars. This convert object is used to\n\t\t\t\tto convert a date to and from a gregorian calendar date to handle parsing and formatting.\n\t\t\t\tThe two functions:\n\t\t\t\t\tfromGregorian( date )\n\t\t\t\t\t\tGiven the date as a parameter, return an array with parts [ year, month, day ]\n\t\t\t\t\t\tcorresponding to the non-gregorian based year, month, and day for the calendar.\n\t\t\t\t\ttoGregorian( year, month, day )\n\t\t\t\t\t\tGiven the non-gregorian year, month, and day, return a new Date() object\n\t\t\t\t\t\tset to the corresponding date in the gregorian calendar.\n\t\t\t*/\n\t\t}\n\t},\n\t// For localized strings\n\tmessages: {}\n};\n\nGlobalize.cultures[ \"default\" ].calendar = Globalize.cultures[ \"default\" ].calendars.standard;\n\nGlobalize.cultures.en = Globalize.cultures[ \"default\" ];\n\nGlobalize.cultureSelector = \"en\";\n\n//\n// private variables\n//\n\nregexHex = /^0x[a-f0-9]+$/i;\nregexInfinity = /^[+\\-]?infinity$/i;\nregexParseFloat = /^[+\\-]?\\d*\\.?\\d*(e[+\\-]?\\d+)?$/;\nregexTrim = /^\\s+|\\s+$/g;\n\n//\n// private JavaScript utility functions\n//\n\narrayIndexOf = function( array, item ) {\n\tif ( array.indexOf ) {\n\t\treturn array.indexOf( item );\n\t}\n\tfor ( var i = 0, length = array.length; i < length; i++ ) {\n\t\tif ( array[i] === item ) {\n\t\t\treturn i;\n\t\t}\n\t}\n\treturn -1;\n};\n\nendsWith = function( value, pattern ) {\n\treturn value.substr( value.length - pattern.length ) === pattern;\n};\n\nextend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[0] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\t\ttarget = arguments[1] || {};\n\t\t// skip the boolean and the target\n\t\ti = 2;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !isFunction(target) ) {\n\t\ttarget = {};\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\t\t// Only deal with non-null/undefined values\n\t\tif ( (options = arguments[ i ]) != null ) {\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tsrc = target[ name ];\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( isObject(copy) || (copyIsArray = isArray(copy)) ) ) {\n\t\t\t\t\tif ( copyIsArray ) {\n\t\t\t\t\t\tcopyIsArray = false;\n\t\t\t\t\t\tclone = src && isArray(src) ? src : [];\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src && isObject(src) ? src : {};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\nisArray = Array.isArray || function( obj ) {\n\treturn Object.prototype.toString.call( obj ) === \"[object Array]\";\n};\n\nisFunction = function( obj ) {\n\treturn Object.prototype.toString.call( obj ) === \"[object Function]\";\n};\n\nisObject = function( obj ) {\n\treturn Object.prototype.toString.call( obj ) === \"[object Object]\";\n};\n\nstartsWith = function( value, pattern ) {\n\treturn value.indexOf( pattern ) === 0;\n};\n\ntrim = function( value ) {\n\treturn ( value + \"\" ).replace( regexTrim, \"\" );\n};\n\ntruncate = function( value ) {\n\tif ( isNaN( value ) ) {\n\t\treturn NaN;\n\t}\n\treturn Math[ value < 0 ? \"ceil\" : \"floor\" ]( value );\n};\n\nzeroPad = function( str, count, left ) {\n\tvar l;\n\tfor ( l = str.length; l < count; l += 1 ) {\n\t\tstr = ( left ? (\"0\" + str) : (str + \"0\") );\n\t}\n\treturn str;\n};\n\n//\n// private Globalization utility functions\n//\n\nappendPreOrPostMatch = function( preMatch, strings ) {\n\t// appends pre- and post- token match strings while removing escaped characters.\n\t// Returns a single quote count which is used to determine if the token occurs\n\t// in a string literal.\n\tvar quoteCount = 0,\n\t\tescaped = false;\n\tfor ( var i = 0, il = preMatch.length; i < il; i++ ) {\n\t\tvar c = preMatch.charAt( i );\n\t\tswitch ( c ) {\n\t\t\tcase \"\\'\":\n\t\t\t\tif ( escaped ) {\n\t\t\t\t\tstrings.push( \"\\'\" );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tquoteCount++;\n\t\t\t\t}\n\t\t\t\tescaped = false;\n\t\t\t\tbreak;\n\t\t\tcase \"\\\\\":\n\t\t\t\tif ( escaped ) {\n\t\t\t\t\tstrings.push( \"\\\\\" );\n\t\t\t\t}\n\t\t\t\tescaped = !escaped;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tstrings.push( c );\n\t\t\t\tescaped = false;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\treturn quoteCount;\n};\n\nexpandFormat = function( cal, format ) {\n\t// expands unspecified or single character date formats into the full pattern.\n\tformat = format || \"F\";\n\tvar pattern,\n\t\tpatterns = cal.patterns,\n\t\tlen = format.length;\n\tif ( len === 1 ) {\n\t\tpattern = patterns[ format ];\n\t\tif ( !pattern ) {\n\t\t\tthrow \"Invalid date format string \\'\" + format + \"\\'.\";\n\t\t}\n\t\tformat = pattern;\n\t}\n\telse if ( len === 2 && format.charAt(0) === \"%\" ) {\n\t\t// %X escape format -- intended as a custom format string that is only one character, not a built-in format.\n\t\tformat = format.charAt( 1 );\n\t}\n\treturn format;\n};\n\nformatDate = function( value, format, culture ) {\n\tvar cal = culture.calendar,\n\t\tconvert = cal.convert,\n\t\tret;\n\n\tif ( !format || !format.length || format === \"i\" ) {\n\t\tif ( culture && culture.name.length ) {\n\t\t\tif ( convert ) {\n\t\t\t\t// non-gregorian calendar, so we cannot use built-in toLocaleString()\n\t\t\t\tret = formatDate( value, cal.patterns.F, culture );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tvar eraDate = new Date( value.getTime() ),\n\t\t\t\t\tera = getEra( value, cal.eras );\n\t\t\t\teraDate.setFullYear( getEraYear(value, cal, era) );\n\t\t\t\tret = eraDate.toLocaleString();\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tret = value.toString();\n\t\t}\n\t\treturn ret;\n\t}\n\n\tvar eras = cal.eras,\n\t\tsortable = format === \"s\";\n\tformat = expandFormat( cal, format );\n\n\t// Start with an empty string\n\tret = [];\n\tvar hour,\n\t\tzeros = [ \"0\", \"00\", \"000\" ],\n\t\tfoundDay,\n\t\tcheckedDay,\n\t\tdayPartRegExp = /([^d]|^)(d|dd)([^d]|$)/g,\n\t\tquoteCount = 0,\n\t\ttokenRegExp = getTokenRegExp(),\n\t\tconverted;\n\n\tfunction padZeros( num, c ) {\n\t\tvar r, s = num + \"\";\n\t\tif ( c > 1 && s.length < c ) {\n\t\t\tr = ( zeros[c - 2] + s);\n\t\t\treturn r.substr( r.length - c, c );\n\t\t}\n\t\telse {\n\t\t\tr = s;\n\t\t}\n\t\treturn r;\n\t}\n\n\tfunction hasDay() {\n\t\tif ( foundDay || checkedDay ) {\n\t\t\treturn foundDay;\n\t\t}\n\t\tfoundDay = dayPartRegExp.test( format );\n\t\tcheckedDay = true;\n\t\treturn foundDay;\n\t}\n\n\tfunction getPart( date, part ) {\n\t\tif ( converted ) {\n\t\t\treturn converted[ part ];\n\t\t}\n\t\tswitch ( part ) {\n\t\t\tcase 0:\n\t\t\t\treturn date.getFullYear();\n\t\t\tcase 1:\n\t\t\t\treturn date.getMonth();\n\t\t\tcase 2:\n\t\t\t\treturn date.getDate();\n\t\t\tdefault:\n\t\t\t\tthrow \"Invalid part value \" + part;\n\t\t}\n\t}\n\n\tif ( !sortable && convert ) {\n\t\tconverted = convert.fromGregorian( value );\n\t}\n\n\tfor ( ; ; ) {\n\t\t// Save the current index\n\t\tvar index = tokenRegExp.lastIndex,\n\t\t\t// Look for the next pattern\n\t\t\tar = tokenRegExp.exec( format );\n\n\t\t// Append the text before the pattern (or the end of the string if not found)\n\t\tvar preMatch = format.slice( index, ar ? ar.index : format.length );\n\t\tquoteCount += appendPreOrPostMatch( preMatch, ret );\n\n\t\tif ( !ar ) {\n\t\t\tbreak;\n\t\t}\n\n\t\t// do not replace any matches that occur inside a string literal.\n\t\tif ( quoteCount % 2 ) {\n\t\t\tret.push( ar[0] );\n\t\t\tcontinue;\n\t\t}\n\n\t\tvar current = ar[ 0 ],\n\t\t\tclength = current.length;\n\n\t\tswitch ( current ) {\n\t\t\tcase \"ddd\":\n\t\t\t\t//Day of the week, as a three-letter abbreviation\n\t\t\tcase \"dddd\":\n\t\t\t\t// Day of the week, using the full name\n\t\t\t\tvar names = ( clength === 3 ) ? cal.days.namesAbbr : cal.days.names;\n\t\t\t\tret.push( names[value.getDay()] );\n\t\t\t\tbreak;\n\t\t\tcase \"d\":\n\t\t\t\t// Day of month, without leading zero for single-digit days\n\t\t\tcase \"dd\":\n\t\t\t\t// Day of month, with leading zero for single-digit days\n\t\t\t\tfoundDay = true;\n\t\t\t\tret.push(\n\t\t\t\t\tpadZeros( getPart(value, 2), clength )\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase \"MMM\":\n\t\t\t\t// Month, as a three-letter abbreviation\n\t\t\tcase \"MMMM\":\n\t\t\t\t// Month, using the full name\n\t\t\t\tvar part = getPart( value, 1 );\n\t\t\t\tret.push(\n\t\t\t\t\t( cal.monthsGenitive && hasDay() ) ?\n\t\t\t\t\t( cal.monthsGenitive[ clength === 3 ? \"namesAbbr\" : \"names\" ][ part ] ) :\n\t\t\t\t\t( cal.months[ clength === 3 ? \"namesAbbr\" : \"names\" ][ part ] )\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase \"M\":\n\t\t\t\t// Month, as digits, with no leading zero for single-digit months\n\t\t\tcase \"MM\":\n\t\t\t\t// Month, as digits, with leading zero for single-digit months\n\t\t\t\tret.push(\n\t\t\t\t\tpadZeros( getPart(value, 1) + 1, clength )\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase \"y\":\n\t\t\t\t// Year, as two digits, but with no leading zero for years less than 10\n\t\t\tcase \"yy\":\n\t\t\t\t// Year, as two digits, with leading zero for years less than 10\n\t\t\tcase \"yyyy\":\n\t\t\t\t// Year represented by four full digits\n\t\t\t\tpart = converted ? converted[ 0 ] : getEraYear( value, cal, getEra(value, eras), sortable );\n\t\t\t\tif ( clength < 4 ) {\n\t\t\t\t\tpart = part % 100;\n\t\t\t\t}\n\t\t\t\tret.push(\n\t\t\t\t\tpadZeros( part, clength )\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase \"h\":\n\t\t\t\t// Hours with no leading zero for single-digit hours, using 12-hour clock\n\t\t\tcase \"hh\":\n\t\t\t\t// Hours with leading zero for single-digit hours, using 12-hour clock\n\t\t\t\thour = value.getHours() % 12;\n\t\t\t\tif ( hour === 0 ) hour = 12;\n\t\t\t\tret.push(\n\t\t\t\t\tpadZeros( hour, clength )\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase \"H\":\n\t\t\t\t// Hours with no leading zero for single-digit hours, using 24-hour clock\n\t\t\tcase \"HH\":\n\t\t\t\t// Hours with leading zero for single-digit hours, using 24-hour clock\n\t\t\t\tret.push(\n\t\t\t\t\tpadZeros( value.getHours(), clength )\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase \"m\":\n\t\t\t\t// Minutes with no leading zero for single-digit minutes\n\t\t\tcase \"mm\":\n\t\t\t\t// Minutes with leading zero for single-digit minutes\n\t\t\t\tret.push(\n\t\t\t\t\tpadZeros( value.getMinutes(), clength )\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase \"s\":\n\t\t\t\t// Seconds with no leading zero for single-digit seconds\n\t\t\tcase \"ss\":\n\t\t\t\t// Seconds with leading zero for single-digit seconds\n\t\t\t\tret.push(\n\t\t\t\t\tpadZeros( value.getSeconds(), clength )\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase \"t\":\n\t\t\t\t// One character am/pm indicator (\"a\" or \"p\")\n\t\t\tcase \"tt\":\n\t\t\t\t// Multicharacter am/pm indicator\n\t\t\t\tpart = value.getHours() < 12 ? ( cal.AM ? cal.AM[0] : \" \" ) : ( cal.PM ? cal.PM[0] : \" \" );\n\t\t\t\tret.push( clength === 1 ? part.charAt(0) : part );\n\t\t\t\tbreak;\n\t\t\tcase \"f\":\n\t\t\t\t// Deciseconds\n\t\t\tcase \"ff\":\n\t\t\t\t// Centiseconds\n\t\t\tcase \"fff\":\n\t\t\t\t// Milliseconds\n\t\t\t\tret.push(\n\t\t\t\t\tpadZeros( value.getMilliseconds(), 3 ).substr( 0, clength )\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase \"z\":\n\t\t\t\t// Time zone offset, no leading zero\n\t\t\tcase \"zz\":\n\t\t\t\t// Time zone offset with leading zero\n\t\t\t\thour = value.getTimezoneOffset() / 60;\n\t\t\t\tret.push(\n\t\t\t\t\t( hour <= 0 ? \"+\" : \"-\" ) + padZeros( Math.floor(Math.abs(hour)), clength )\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase \"zzz\":\n\t\t\t\t// Time zone offset with leading zero\n\t\t\t\thour = value.getTimezoneOffset() / 60;\n\t\t\t\tret.push(\n\t\t\t\t\t( hour <= 0 ? \"+\" : \"-\" ) + padZeros( Math.floor(Math.abs(hour)), 2 ) +\n\t\t\t\t\t// Hard coded \":\" separator, rather than using cal.TimeSeparator\n\t\t\t\t\t// Repeated here for consistency, plus \":\" was already assumed in date parsing.\n\t\t\t\t\t\":\" + padZeros( Math.abs(value.getTimezoneOffset() % 60), 2 )\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase \"g\":\n\t\t\tcase \"gg\":\n\t\t\t\tif ( cal.eras ) {\n\t\t\t\t\tret.push(\n\t\t\t\t\t\tcal.eras[ getEra(value, eras) ].name\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\tcase \"/\":\n\t\t\tret.push( cal[\"/\"] );\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tthrow \"Invalid date format pattern \\'\" + current + \"\\'.\";\n\t\t}\n\t}\n\treturn ret.join( \"\" );\n};\n\n// formatNumber\n(function() {\n\tvar expandNumber;\n\n\texpandNumber = function( number, precision, formatInfo ) {\n\t\tvar groupSizes = formatInfo.groupSizes,\n\t\t\tcurSize = groupSizes[ 0 ],\n\t\t\tcurGroupIndex = 1,\n\t\t\tfactor = Math.pow( 10, precision ),\n\t\t\trounded = Math.round( number * factor ) / factor;\n\n\t\tif ( !isFinite(rounded) ) {\n\t\t\trounded = number;\n\t\t}\n\t\tnumber = rounded;\n\n\t\tvar numberString = number+\"\",\n\t\t\tright = \"\",\n\t\t\tsplit = numberString.split( /e/i ),\n\t\t\texponent = split.length > 1 ? parseInt( split[1], 10 ) : 0;\n\t\tnumberString = split[ 0 ];\n\t\tsplit = numberString.split( \".\" );\n\t\tnumberString = split[ 0 ];\n\t\tright = split.length > 1 ? split[ 1 ] : \"\";\n\n\t\tvar l;\n\t\tif ( exponent > 0 ) {\n\t\t\tright = zeroPad( right, exponent, false );\n\t\t\tnumberString += right.slice( 0, exponent );\n\t\t\tright = right.substr( exponent );\n\t\t}\n\t\telse if ( exponent < 0 ) {\n\t\t\texponent = -exponent;\n\t\t\tnumberString = zeroPad( numberString, exponent + 1, true );\n\t\t\tright = numberString.slice( -exponent, numberString.length ) + right;\n\t\t\tnumberString = numberString.slice( 0, -exponent );\n\t\t}\n\n\t\tif ( precision > 0 ) {\n\t\t\tright = formatInfo[ \".\" ] +\n\t\t\t\t( (right.length > precision) ? right.slice(0, precision) : zeroPad(right, precision) );\n\t\t}\n\t\telse {\n\t\t\tright = \"\";\n\t\t}\n\n\t\tvar stringIndex = numberString.length - 1,\n\t\t\tsep = formatInfo[ \",\" ],\n\t\t\tret = \"\";\n\n\t\twhile ( stringIndex >= 0 ) {\n\t\t\tif ( curSize === 0 || curSize > stringIndex ) {\n\t\t\t\treturn numberString.slice( 0, stringIndex + 1 ) + ( ret.length ? (sep + ret + right) : right );\n\t\t\t}\n\t\t\tret = numberString.slice( stringIndex - curSize + 1, stringIndex + 1 ) + ( ret.length ? (sep + ret) : \"\" );\n\n\t\t\tstringIndex -= curSize;\n\n\t\t\tif ( curGroupIndex < groupSizes.length ) {\n\t\t\t\tcurSize = groupSizes[ curGroupIndex ];\n\t\t\t\tcurGroupIndex++;\n\t\t\t}\n\t\t}\n\n\t\treturn numberString.slice( 0, stringIndex + 1 ) + sep + ret + right;\n\t};\n\n\tformatNumber = function( value, format, culture ) {\n\t\tif ( !isFinite(value) ) {\n\t\t\tif ( value === Infinity ) {\n\t\t\t\treturn culture.numberFormat.positiveInfinity;\n\t\t\t}\n\t\t\tif ( value === -Infinity ) {\n\t\t\t\treturn culture.numberFormat.negativeInfinity;\n\t\t\t}\n\t\t\treturn culture.numberFormat[ \"NaN\" ];\n\t\t}\n\t\tif ( !format || format === \"i\" ) {\n\t\t\treturn culture.name.length ? value.toLocaleString() : value.toString();\n\t\t}\n\t\tformat = format || \"D\";\n\n\t\tvar nf = culture.numberFormat,\n\t\t\tnumber = Math.abs( value ),\n\t\t\tprecision = -1,\n\t\t\tpattern;\n\t\tif ( format.length > 1 ) precision = parseInt( format.slice(1), 10 );\n\n\t\tvar current = format.charAt( 0 ).toUpperCase(),\n\t\t\tformatInfo;\n\n\t\tswitch ( current ) {\n\t\t\tcase \"D\":\n\t\t\t\tpattern = \"n\";\n\t\t\t\tnumber = truncate( number );\n\t\t\t\tif ( precision !== -1 ) {\n\t\t\t\t\tnumber = zeroPad( \"\" + number, precision, true );\n\t\t\t\t}\n\t\t\t\tif ( value < 0 ) number = \"-\" + number;\n\t\t\t\tbreak;\n\t\t\tcase \"N\":\n\t\t\t\tformatInfo = nf;\n\t\t\t\t/* falls through */\n\t\t\tcase \"C\":\n\t\t\t\tformatInfo = formatInfo || nf.currency;\n\t\t\t\t/* falls through */\n\t\t\tcase \"P\":\n\t\t\t\tformatInfo = formatInfo || nf.percent;\n\t\t\t\tpattern = value < 0 ? formatInfo.pattern[ 0 ] : ( formatInfo.pattern[1] || \"n\" );\n\t\t\t\tif ( precision === -1 ) precision = formatInfo.decimals;\n\t\t\t\tnumber = expandNumber( number * (current === \"P\" ? 100 : 1), precision, formatInfo );\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthrow \"Bad number format specifier: \" + current;\n\t\t}\n\n\t\tvar patternParts = /n|\\$|-|%/g,\n\t\t\tret = \"\";\n\t\tfor ( ; ; ) {\n\t\t\tvar index = patternParts.lastIndex,\n\t\t\t\tar = patternParts.exec( pattern );\n\n\t\t\tret += pattern.slice( index, ar ? ar.index : pattern.length );\n\n\t\t\tif ( !ar ) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tswitch ( ar[0] ) {\n\t\t\t\tcase \"n\":\n\t\t\t\t\tret += number;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"$\":\n\t\t\t\t\tret += nf.currency.symbol;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"-\":\n\t\t\t\t\t// don't make 0 negative\n\t\t\t\t\tif ( /[1-9]/.test(number) ) {\n\t\t\t\t\t\tret += nf[ \"-\" ];\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"%\":\n\t\t\t\t\tret += nf.percent.symbol;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t};\n\n}());\n\ngetTokenRegExp = function() {\n\t// regular expression for matching date and time tokens in format strings.\n\treturn (/\\/|dddd|ddd|dd|d|MMMM|MMM|MM|M|yyyy|yy|y|hh|h|HH|H|mm|m|ss|s|tt|t|fff|ff|f|zzz|zz|z|gg|g/g);\n};\n\ngetEra = function( date, eras ) {\n\tif ( !eras ) return 0;\n\tvar start, ticks = date.getTime();\n\tfor ( var i = 0, l = eras.length; i < l; i++ ) {\n\t\tstart = eras[ i ].start;\n\t\tif ( start === null || ticks >= start ) {\n\t\t\treturn i;\n\t\t}\n\t}\n\treturn 0;\n};\n\ngetEraYear = function( date, cal, era, sortable ) {\n\tvar year = date.getFullYear();\n\tif ( !sortable && cal.eras ) {\n\t\t// convert normal gregorian year to era-shifted gregorian\n\t\t// year by subtracting the era offset\n\t\tyear -= cal.eras[ era ].offset;\n\t}\n\treturn year;\n};\n\n// parseExact\n(function() {\n\tvar expandYear,\n\t\tgetDayIndex,\n\t\tgetMonthIndex,\n\t\tgetParseRegExp,\n\t\toutOfRange,\n\t\ttoUpper,\n\t\ttoUpperArray;\n\n\texpandYear = function( cal, year ) {\n\t\t// expands 2-digit year into 4 digits.\n\t\tif ( year < 100 ) {\n\t\t\tvar now = new Date(),\n\t\t\t\tera = getEra( now ),\n\t\t\t\tcurr = getEraYear( now, cal, era ),\n\t\t\t\ttwoDigitYearMax = cal.twoDigitYearMax;\n\t\t\ttwoDigitYearMax = typeof twoDigitYearMax === \"string\" ? new Date().getFullYear() % 100 + parseInt( twoDigitYearMax, 10 ) : twoDigitYearMax;\n\t\t\tyear += curr - ( curr % 100 );\n\t\t\tif ( year > twoDigitYearMax ) {\n\t\t\t\tyear -= 100;\n\t\t\t}\n\t\t}\n\t\treturn year;\n\t};\n\n\tgetDayIndex = function\t( cal, value, abbr ) {\n\t\tvar ret,\n\t\t\tdays = cal.days,\n\t\t\tupperDays = cal._upperDays;\n\t\tif ( !upperDays ) {\n\t\t\tcal._upperDays = upperDays = [\n\t\t\t\ttoUpperArray( days.names ),\n\t\t\t\ttoUpperArray( days.namesAbbr ),\n\t\t\t\ttoUpperArray( days.namesShort )\n\t\t\t];\n\t\t}\n\t\tvalue = toUpper( value );\n\t\tif ( abbr ) {\n\t\t\tret = arrayIndexOf( upperDays[1], value );\n\t\t\tif ( ret === -1 ) {\n\t\t\t\tret = arrayIndexOf( upperDays[2], value );\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tret = arrayIndexOf( upperDays[0], value );\n\t\t}\n\t\treturn ret;\n\t};\n\n\tgetMonthIndex = function( cal, value, abbr ) {\n\t\tvar months = cal.months,\n\t\t\tmonthsGen = cal.monthsGenitive || cal.months,\n\t\t\tupperMonths = cal._upperMonths,\n\t\t\tupperMonthsGen = cal._upperMonthsGen;\n\t\tif ( !upperMonths ) {\n\t\t\tcal._upperMonths = upperMonths = [\n\t\t\t\ttoUpperArray( months.names ),\n\t\t\t\ttoUpperArray( months.namesAbbr )\n\t\t\t];\n\t\t\tcal._upperMonthsGen = upperMonthsGen = [\n\t\t\t\ttoUpperArray( monthsGen.names ),\n\t\t\t\ttoUpperArray( monthsGen.namesAbbr )\n\t\t\t];\n\t\t}\n\t\tvalue = toUpper( value );\n\t\tvar i = arrayIndexOf( abbr ? upperMonths[1] : upperMonths[0], value );\n\t\tif ( i < 0 ) {\n\t\t\ti = arrayIndexOf( abbr ? upperMonthsGen[1] : upperMonthsGen[0], value );\n\t\t}\n\t\treturn i;\n\t};\n\n\tgetParseRegExp = function( cal, format ) {\n\t\t// converts a format string into a regular expression with groups that\n\t\t// can be used to extract date fields from a date string.\n\t\t// check for a cached parse regex.\n\t\tvar re = cal._parseRegExp;\n\t\tif ( !re ) {\n\t\t\tcal._parseRegExp = re = {};\n\t\t}\n\t\telse {\n\t\t\tvar reFormat = re[ format ];\n\t\t\tif ( reFormat ) {\n\t\t\t\treturn reFormat;\n\t\t\t}\n\t\t}\n\n\t\t// expand single digit formats, then escape regular expression characters.\n\t\tvar expFormat = expandFormat( cal, format ).replace( /([\\^\\$\\.\\*\\+\\?\\|\\[\\]\\(\\)\\{\\}])/g, \"\\\\\\\\$1\" ),\n\t\t\tregexp = [ \"^\" ],\n\t\t\tgroups = [],\n\t\t\tindex = 0,\n\t\t\tquoteCount = 0,\n\t\t\ttokenRegExp = getTokenRegExp(),\n\t\t\tmatch;\n\n\t\t// iterate through each date token found.\n\t\twhile ( (match = tokenRegExp.exec(expFormat)) !== null ) {\n\t\t\tvar preMatch = expFormat.slice( index, match.index );\n\t\t\tindex = tokenRegExp.lastIndex;\n\n\t\t\t// don't replace any matches that occur inside a string literal.\n\t\t\tquoteCount += appendPreOrPostMatch( preMatch, regexp );\n\t\t\tif ( quoteCount % 2 ) {\n\t\t\t\tregexp.push( match[0] );\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// add a regex group for the token.\n\t\t\tvar m = match[ 0 ],\n\t\t\t\tlen = m.length,\n\t\t\t\tadd;\n\t\t\tswitch ( m ) {\n\t\t\t\tcase \"dddd\": case \"ddd\":\n\t\t\t\tcase \"MMMM\": case \"MMM\":\n\t\t\t\tcase \"gg\": case \"g\":\n\t\t\t\t\tadd = \"(\\\\D+)\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"tt\": case \"t\":\n\t\t\t\t\tadd = \"(\\\\D*)\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"yyyy\":\n\t\t\t\tcase \"fff\":\n\t\t\t\tcase \"ff\":\n\t\t\t\tcase \"f\":\n\t\t\t\t\tadd = \"(\\\\d{\" + len + \"})\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"dd\": case \"d\":\n\t\t\t\tcase \"MM\": case \"M\":\n\t\t\t\tcase \"yy\": case \"y\":\n\t\t\t\tcase \"HH\": case \"H\":\n\t\t\t\tcase \"hh\": case \"h\":\n\t\t\t\tcase \"mm\": case \"m\":\n\t\t\t\tcase \"ss\": case \"s\":\n\t\t\t\t\tadd = \"(\\\\d\\\\d?)\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"zzz\":\n\t\t\t\t\tadd = \"([+-]?\\\\d\\\\d?:\\\\d{2})\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"zz\": case \"z\":\n\t\t\t\t\tadd = \"([+-]?\\\\d\\\\d?)\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"/\":\n\t\t\t\t\tadd = \"(\\\\/)\";\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow \"Invalid date format pattern \\'\" + m + \"\\'.\";\n\t\t\t}\n\t\t\tif ( add ) {\n\t\t\t\tregexp.push( add );\n\t\t\t}\n\t\t\tgroups.push( match[0] );\n\t\t}\n\t\tappendPreOrPostMatch( expFormat.slice(index), regexp );\n\t\tregexp.push( \"$\" );\n\n\t\t// allow whitespace to differ when matching formats.\n\t\tvar regexpStr = regexp.join( \"\" ).replace( /\\s+/g, \"\\\\s+\" ),\n\t\t\tparseRegExp = { \"regExp\": regexpStr, \"groups\": groups };\n\n\t\t// cache the regex for this format.\n\t\treturn re[ format ] = parseRegExp;\n\t};\n\n\toutOfRange = function( value, low, high ) {\n\t\treturn value < low || value > high;\n\t};\n\n\ttoUpper = function( value ) {\n\t\t// \"he-IL\" has non-breaking space in weekday names.\n\t\treturn value.split( \"\\u00A0\" ).join( \" \" ).toUpperCase();\n\t};\n\n\ttoUpperArray = function( arr ) {\n\t\tvar results = [];\n\t\tfor ( var i = 0, l = arr.length; i < l; i++ ) {\n\t\t\tresults[ i ] = toUpper( arr[i] );\n\t\t}\n\t\treturn results;\n\t};\n\n\tparseExact = function( value, format, culture ) {\n\t\t// try to parse the date string by matching against the format string\n\t\t// while using the specified culture for date field names.\n\t\tvalue = trim( value );\n\t\tvar cal = culture.calendar,\n\t\t\t// convert date formats into regular expressions with groupings.\n\t\t\t// use the regexp to determine the input format and extract the date fields.\n\t\t\tparseInfo = getParseRegExp( cal, format ),\n\t\t\tmatch = new RegExp( parseInfo.regExp ).exec( value );\n\t\tif ( match === null ) {\n\t\t\treturn null;\n\t\t}\n\t\t// found a date format that matches the input.\n\t\tvar groups = parseInfo.groups,\n\t\t\tera = null, year = null, month = null, date = null, weekDay = null,\n\t\t\thour = 0, hourOffset, min = 0, sec = 0, msec = 0, tzMinOffset = null,\n\t\t\tpmHour = false;\n\t\t// iterate the format groups to extract and set the date fields.\n\t\tfor ( var j = 0, jl = groups.length; j < jl; j++ ) {\n\t\t\tvar matchGroup = match[ j + 1 ];\n\t\t\tif ( matchGroup ) {\n\t\t\t\tvar current = groups[ j ],\n\t\t\t\t\tclength = current.length,\n\t\t\t\t\tmatchInt = parseInt( matchGroup, 10 );\n\t\t\t\tswitch ( current ) {\n\t\t\t\t\tcase \"dd\": case \"d\":\n\t\t\t\t\t\t// Day of month.\n\t\t\t\t\t\tdate = matchInt;\n\t\t\t\t\t\t// check that date is generally in valid range, also checking overflow below.\n\t\t\t\t\t\tif ( outOfRange(date, 1, 31) ) return null;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"MMM\": case \"MMMM\":\n\t\t\t\t\t\tmonth = getMonthIndex( cal, matchGroup, clength === 3 );\n\t\t\t\t\t\tif ( outOfRange(month, 0, 11) ) return null;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"M\": case \"MM\":\n\t\t\t\t\t\t// Month.\n\t\t\t\t\t\tmonth = matchInt - 1;\n\t\t\t\t\t\tif ( outOfRange(month, 0, 11) ) return null;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"y\": case \"yy\":\n\t\t\t\t\tcase \"yyyy\":\n\t\t\t\t\t\tyear = clength < 4 ? expandYear( cal, matchInt ) : matchInt;\n\t\t\t\t\t\tif ( outOfRange(year, 0, 9999) ) return null;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"h\": case \"hh\":\n\t\t\t\t\t\t// Hours (12-hour clock).\n\t\t\t\t\t\thour = matchInt;\n\t\t\t\t\t\tif ( hour === 12 ) hour = 0;\n\t\t\t\t\t\tif ( outOfRange(hour, 0, 11) ) return null;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"H\": case \"HH\":\n\t\t\t\t\t\t// Hours (24-hour clock).\n\t\t\t\t\t\thour = matchInt;\n\t\t\t\t\t\tif ( outOfRange(hour, 0, 23) ) return null;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"m\": case \"mm\":\n\t\t\t\t\t\t// Minutes.\n\t\t\t\t\t\tmin = matchInt;\n\t\t\t\t\t\tif ( outOfRange(min, 0, 59) ) return null;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"s\": case \"ss\":\n\t\t\t\t\t\t// Seconds.\n\t\t\t\t\t\tsec = matchInt;\n\t\t\t\t\t\tif ( outOfRange(sec, 0, 59) ) return null;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"tt\": case \"t\":\n\t\t\t\t\t\t// AM/PM designator.\n\t\t\t\t\t\t// see if it is standard, upper, or lower case PM. If not, ensure it is at least one of\n\t\t\t\t\t\t// the AM tokens. If not, fail the parse for this format.\n\t\t\t\t\t\tpmHour = cal.PM && ( matchGroup === cal.PM[0] || matchGroup === cal.PM[1] || matchGroup === cal.PM[2] );\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t!pmHour && (\n\t\t\t\t\t\t\t\t!cal.AM || ( matchGroup !== cal.AM[0] && matchGroup !== cal.AM[1] && matchGroup !== cal.AM[2] )\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t) return null;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"f\":\n\t\t\t\t\t\t// Deciseconds.\n\t\t\t\t\tcase \"ff\":\n\t\t\t\t\t\t// Centiseconds.\n\t\t\t\t\tcase \"fff\":\n\t\t\t\t\t\t// Milliseconds.\n\t\t\t\t\t\tmsec = matchInt * Math.pow( 10, 3 - clength );\n\t\t\t\t\t\tif ( outOfRange(msec, 0, 999) ) return null;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"ddd\":\n\t\t\t\t\t\t// Day of week.\n\t\t\t\t\tcase \"dddd\":\n\t\t\t\t\t\t// Day of week.\n\t\t\t\t\t\tweekDay = getDayIndex( cal, matchGroup, clength === 3 );\n\t\t\t\t\t\tif ( outOfRange(weekDay, 0, 6) ) return null;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"zzz\":\n\t\t\t\t\t\t// Time zone offset in +/- hours:min.\n\t\t\t\t\t\tvar offsets = matchGroup.split( /:/ );\n\t\t\t\t\t\tif ( offsets.length !== 2 ) return null;\n\t\t\t\t\t\thourOffset = parseInt( offsets[0], 10 );\n\t\t\t\t\t\tif ( outOfRange(hourOffset, -12, 13) ) return null;\n\t\t\t\t\t\tvar minOffset = parseInt( offsets[1], 10 );\n\t\t\t\t\t\tif ( outOfRange(minOffset, 0, 59) ) return null;\n\t\t\t\t\t\ttzMinOffset = ( hourOffset * 60 ) + ( startsWith(matchGroup, \"-\") ? -minOffset : minOffset );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"z\": case \"zz\":\n\t\t\t\t\t\t// Time zone offset in +/- hours.\n\t\t\t\t\t\thourOffset = matchInt;\n\t\t\t\t\t\tif ( outOfRange(hourOffset, -12, 13) ) return null;\n\t\t\t\t\t\ttzMinOffset = hourOffset * 60;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"g\": case \"gg\":\n\t\t\t\t\t\tvar eraName = matchGroup;\n\t\t\t\t\t\tif ( !eraName || !cal.eras ) return null;\n\t\t\t\t\t\teraName = trim( eraName.toLowerCase() );\n\t\t\t\t\t\tfor ( var i = 0, l = cal.eras.length; i < l; i++ ) {\n\t\t\t\t\t\t\tif ( eraName === cal.eras[i].name.toLowerCase() ) {\n\t\t\t\t\t\t\t\tera = i;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// could not find an era with that name\n\t\t\t\t\t\tif ( era === null ) return null;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tvar result = new Date(), defaultYear, convert = cal.convert;\n\t\tdefaultYear = convert ? convert.fromGregorian( result )[ 0 ] : result.getFullYear();\n\t\tif ( year === null ) {\n\t\t\tyear = defaultYear;\n\t\t}\n\t\telse if ( cal.eras ) {\n\t\t\t// year must be shifted to normal gregorian year\n\t\t\t// but not if year was not specified, its already normal gregorian\n\t\t\t// per the main if clause above.\n\t\t\tyear += cal.eras[( era || 0 )].offset;\n\t\t}\n\t\t// set default day and month to 1 and January, so if unspecified, these are the defaults\n\t\t// instead of the current day/month.\n\t\tif ( month === null ) {\n\t\t\tmonth = 0;\n\t\t}\n\t\tif ( date === null ) {\n\t\t\tdate = 1;\n\t\t}\n\t\t// now have year, month, and date, but in the culture's calendar.\n\t\t// convert to gregorian if necessary\n\t\tif ( convert ) {\n\t\t\tresult = convert.toGregorian( year, month, date );\n\t\t\t// conversion failed, must be an invalid match\n\t\t\tif ( result === null ) return null;\n\t\t}\n\t\telse {\n\t\t\t// have to set year, month and date together to avoid overflow based on current date.\n\t\t\tresult.setFullYear( year, month, date );\n\t\t\t// check to see if date overflowed for specified month (only checked 1-31 above).\n\t\t\tif ( result.getDate() !== date ) return null;\n\t\t\t// invalid day of week.\n\t\t\tif ( weekDay !== null && result.getDay() !== weekDay ) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\t\t// if pm designator token was found make sure the hours fit the 24-hour clock.\n\t\tif ( pmHour && hour < 12 ) {\n\t\t\thour += 12;\n\t\t}\n\t\tresult.setHours( hour, min, sec, msec );\n\t\tif ( tzMinOffset !== null ) {\n\t\t\t// adjust timezone to utc before applying local offset.\n\t\t\tvar adjustedMin = result.getMinutes() - ( tzMinOffset + result.getTimezoneOffset() );\n\t\t\t// Safari limits hours and minutes to the range of -127 to 127.  We need to use setHours\n\t\t\t// to ensure both these fields will not exceed this range.\tadjustedMin will range\n\t\t\t// somewhere between -1440 and 1500, so we only need to split this into hours.\n\t\t\tresult.setHours( result.getHours() + parseInt(adjustedMin / 60, 10), adjustedMin % 60 );\n\t\t}\n\t\treturn result;\n\t};\n}());\n\nparseNegativePattern = function( value, nf, negativePattern ) {\n\tvar neg = nf[ \"-\" ],\n\t\tpos = nf[ \"+\" ],\n\t\tret;\n\tswitch ( negativePattern ) {\n\t\tcase \"n -\":\n\t\t\tneg = \" \" + neg;\n\t\t\tpos = \" \" + pos;\n\t\t\t/* falls through */\n\t\tcase \"n-\":\n\t\t\tif ( endsWith(value, neg) ) {\n\t\t\t\tret = [ \"-\", value.substr(0, value.length - neg.length) ];\n\t\t\t}\n\t\t\telse if ( endsWith(value, pos) ) {\n\t\t\t\tret = [ \"+\", value.substr(0, value.length - pos.length) ];\n\t\t\t}\n\t\t\tbreak;\n\t\tcase \"- n\":\n\t\t\tneg += \" \";\n\t\t\tpos += \" \";\n\t\t\t/* falls through */\n\t\tcase \"-n\":\n\t\t\tif ( startsWith(value, neg) ) {\n\t\t\t\tret = [ \"-\", value.substr(neg.length) ];\n\t\t\t}\n\t\t\telse if ( startsWith(value, pos) ) {\n\t\t\t\tret = [ \"+\", value.substr(pos.length) ];\n\t\t\t}\n\t\t\tbreak;\n\t\tcase \"(n)\":\n\t\t\tif ( startsWith(value, \"(\") && endsWith(value, \")\") ) {\n\t\t\t\tret = [ \"-\", value.substr(1, value.length - 2) ];\n\t\t\t}\n\t\t\tbreak;\n\t}\n\treturn ret || [ \"\", value ];\n};\n\n//\n// public instance functions\n//\n\nGlobalize.prototype.findClosestCulture = function( cultureSelector ) {\n\treturn Globalize.findClosestCulture.call( this, cultureSelector );\n};\n\nGlobalize.prototype.format = function( value, format, cultureSelector ) {\n\treturn Globalize.format.call( this, value, format, cultureSelector );\n};\n\nGlobalize.prototype.localize = function( key, cultureSelector ) {\n\treturn Globalize.localize.call( this, key, cultureSelector );\n};\n\nGlobalize.prototype.parseInt = function( value, radix, cultureSelector ) {\n\treturn Globalize.parseInt.call( this, value, radix, cultureSelector );\n};\n\nGlobalize.prototype.parseFloat = function( value, radix, cultureSelector ) {\n\treturn Globalize.parseFloat.call( this, value, radix, cultureSelector );\n};\n\nGlobalize.prototype.culture = function( cultureSelector ) {\n\treturn Globalize.culture.call( this, cultureSelector );\n};\n\n//\n// public singleton functions\n//\n\nGlobalize.addCultureInfo = function( cultureName, baseCultureName, info ) {\n\n\tvar base = {},\n\t\tisNew = false;\n\n\tif ( typeof cultureName !== \"string\" ) {\n\t\t// cultureName argument is optional string. If not specified, assume info is first\n\t\t// and only argument. Specified info deep-extends current culture.\n\t\tinfo = cultureName;\n\t\tcultureName = this.culture().name;\n\t\tbase = this.cultures[ cultureName ];\n\t} else if ( typeof baseCultureName !== \"string\" ) {\n\t\t// baseCultureName argument is optional string. If not specified, assume info is second\n\t\t// argument. Specified info deep-extends specified culture.\n\t\t// If specified culture does not exist, create by deep-extending default\n\t\tinfo = baseCultureName;\n\t\tisNew = ( this.cultures[ cultureName ] == null );\n\t\tbase = this.cultures[ cultureName ] || this.cultures[ \"default\" ];\n\t} else {\n\t\t// cultureName and baseCultureName specified. Assume a new culture is being created\n\t\t// by deep-extending an specified base culture\n\t\tisNew = true;\n\t\tbase = this.cultures[ baseCultureName ];\n\t}\n\n\tthis.cultures[ cultureName ] = extend(true, {},\n\t\tbase,\n\t\tinfo\n\t);\n\t// Make the standard calendar the current culture if it's a new culture\n\tif ( isNew ) {\n\t\tthis.cultures[ cultureName ].calendar = this.cultures[ cultureName ].calendars.standard;\n\t}\n};\n\nGlobalize.findClosestCulture = function( name ) {\n\tvar match;\n\tif ( !name ) {\n\t\treturn this.findClosestCulture( this.cultureSelector ) || this.cultures[ \"default\" ];\n\t}\n\tif ( typeof name === \"string\" ) {\n\t\tname = name.split( \",\" );\n\t}\n\tif ( isArray(name) ) {\n\t\tvar lang,\n\t\t\tcultures = this.cultures,\n\t\t\tlist = name,\n\t\t\ti, l = list.length,\n\t\t\tprioritized = [];\n\t\tfor ( i = 0; i < l; i++ ) {\n\t\t\tname = trim( list[i] );\n\t\t\tvar pri, parts = name.split( \";\" );\n\t\t\tlang = trim( parts[0] );\n\t\t\tif ( parts.length === 1 ) {\n\t\t\t\tpri = 1;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tname = trim( parts[1] );\n\t\t\t\tif ( name.indexOf(\"q=\") === 0 ) {\n\t\t\t\t\tname = name.substr( 2 );\n\t\t\t\t\tpri = parseFloat( name );\n\t\t\t\t\tpri = isNaN( pri ) ? 0 : pri;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tpri = 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\tprioritized.push({ lang: lang, pri: pri });\n\t\t}\n\t\tprioritized.sort(function( a, b ) {\n\t\t\tif ( a.pri < b.pri ) {\n\t\t\t\treturn 1;\n\t\t\t} else if ( a.pri > b.pri ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\treturn 0;\n\t\t});\n\t\t// exact match\n\t\tfor ( i = 0; i < l; i++ ) {\n\t\t\tlang = prioritized[ i ].lang;\n\t\t\tmatch = cultures[ lang ];\n\t\t\tif ( match ) {\n\t\t\t\treturn match;\n\t\t\t}\n\t\t}\n\n\t\t// neutral language match\n\t\tfor ( i = 0; i < l; i++ ) {\n\t\t\tlang = prioritized[ i ].lang;\n\t\t\tdo {\n\t\t\t\tvar index = lang.lastIndexOf( \"-\" );\n\t\t\t\tif ( index === -1 ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t// strip off the last part. e.g. en-US => en\n\t\t\t\tlang = lang.substr( 0, index );\n\t\t\t\tmatch = cultures[ lang ];\n\t\t\t\tif ( match ) {\n\t\t\t\t\treturn match;\n\t\t\t\t}\n\t\t\t}\n\t\t\twhile ( 1 );\n\t\t}\n\n\t\t// last resort: match first culture using that language\n\t\tfor ( i = 0; i < l; i++ ) {\n\t\t\tlang = prioritized[ i ].lang;\n\t\t\tfor ( var cultureKey in cultures ) {\n\t\t\t\tvar culture = cultures[ cultureKey ];\n\t\t\t\tif ( culture.language == lang ) {\n\t\t\t\t\treturn culture;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse if ( typeof name === \"object\" ) {\n\t\treturn name;\n\t}\n\treturn match || null;\n};\n\nGlobalize.format = function( value, format, cultureSelector ) {\n\tvar culture = this.findClosestCulture( cultureSelector );\n\tif ( value instanceof Date ) {\n\t\tvalue = formatDate( value, format, culture );\n\t}\n\telse if ( typeof value === \"number\" ) {\n\t\tvalue = formatNumber( value, format, culture );\n\t}\n\treturn value;\n};\n\nGlobalize.localize = function( key, cultureSelector ) {\n\treturn this.findClosestCulture( cultureSelector ).messages[ key ] ||\n\t\tthis.cultures[ \"default\" ].messages[ key ];\n};\n\nGlobalize.parseDate = function( value, formats, culture ) {\n\tculture = this.findClosestCulture( culture );\n\n\tvar date, prop, patterns;\n\tif ( formats ) {\n\t\tif ( typeof formats === \"string\" ) {\n\t\t\tformats = [ formats ];\n\t\t}\n\t\tif ( formats.length ) {\n\t\t\tfor ( var i = 0, l = formats.length; i < l; i++ ) {\n\t\t\t\tvar format = formats[ i ];\n\t\t\t\tif ( format ) {\n\t\t\t\t\tdate = parseExact( value, format, culture );\n\t\t\t\t\tif ( date ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else {\n\t\tpatterns = culture.calendar.patterns;\n\t\tfor ( prop in patterns ) {\n\t\t\tdate = parseExact( value, patterns[prop], culture );\n\t\t\tif ( date ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn date || null;\n};\n\nGlobalize.parseInt = function( value, radix, cultureSelector ) {\n\treturn truncate( Globalize.parseFloat(value, radix, cultureSelector) );\n};\n\nGlobalize.parseFloat = function( value, radix, cultureSelector ) {\n\t// radix argument is optional\n\tif ( typeof radix !== \"number\" ) {\n\t\tcultureSelector = radix;\n\t\tradix = 10;\n\t}\n\n\tvar culture = this.findClosestCulture( cultureSelector );\n\tvar ret = NaN,\n\t\tnf = culture.numberFormat;\n\n\tif ( value.indexOf(culture.numberFormat.currency.symbol) > -1 ) {\n\t\t// remove currency symbol\n\t\tvalue = value.replace( culture.numberFormat.currency.symbol, \"\" );\n\t\t// replace decimal seperator\n\t\tvalue = value.replace( culture.numberFormat.currency[\".\"], culture.numberFormat[\".\"] );\n\t}\n\n\t//Remove percentage character from number string before parsing\n\tif ( value.indexOf(culture.numberFormat.percent.symbol) > -1){\n\t\tvalue = value.replace( culture.numberFormat.percent.symbol, \"\" );\n\t}\n\n\t// remove spaces: leading, trailing and between - and number. Used for negative currency pt-BR\n\tvalue = value.replace( / /g, \"\" );\n\n\t// allow infinity or hexidecimal\n\tif ( regexInfinity.test(value) ) {\n\t\tret = parseFloat( value );\n\t}\n\telse if ( !radix && regexHex.test(value) ) {\n\t\tret = parseInt( value, 16 );\n\t}\n\telse {\n\n\t\t// determine sign and number\n\t\tvar signInfo = parseNegativePattern( value, nf, nf.pattern[0] ),\n\t\t\tsign = signInfo[ 0 ],\n\t\t\tnum = signInfo[ 1 ];\n\n\t\t// #44 - try parsing as \"(n)\"\n\t\tif ( sign === \"\" && nf.pattern[0] !== \"(n)\" ) {\n\t\t\tsignInfo = parseNegativePattern( value, nf, \"(n)\" );\n\t\t\tsign = signInfo[ 0 ];\n\t\t\tnum = signInfo[ 1 ];\n\t\t}\n\n\t\t// try parsing as \"-n\"\n\t\tif ( sign === \"\" && nf.pattern[0] !== \"-n\" ) {\n\t\t\tsignInfo = parseNegativePattern( value, nf, \"-n\" );\n\t\t\tsign = signInfo[ 0 ];\n\t\t\tnum = signInfo[ 1 ];\n\t\t}\n\n\t\tsign = sign || \"+\";\n\n\t\t// determine exponent and number\n\t\tvar exponent,\n\t\t\tintAndFraction,\n\t\t\texponentPos = num.indexOf( \"e\" );\n\t\tif ( exponentPos < 0 ) exponentPos = num.indexOf( \"E\" );\n\t\tif ( exponentPos < 0 ) {\n\t\t\tintAndFraction = num;\n\t\t\texponent = null;\n\t\t}\n\t\telse {\n\t\t\tintAndFraction = num.substr( 0, exponentPos );\n\t\t\texponent = num.substr( exponentPos + 1 );\n\t\t}\n\t\t// determine decimal position\n\t\tvar integer,\n\t\t\tfraction,\n\t\t\tdecSep = nf[ \".\" ],\n\t\t\tdecimalPos = intAndFraction.indexOf( decSep );\n\t\tif ( decimalPos < 0 ) {\n\t\t\tinteger = intAndFraction;\n\t\t\tfraction = null;\n\t\t}\n\t\telse {\n\t\t\tinteger = intAndFraction.substr( 0, decimalPos );\n\t\t\tfraction = intAndFraction.substr( decimalPos + decSep.length );\n\t\t}\n\t\t// handle groups (e.g. 1,000,000)\n\t\tvar groupSep = nf[ \",\" ];\n\t\tinteger = integer.split( groupSep ).join( \"\" );\n\t\tvar altGroupSep = groupSep.replace( /\\u00A0/g, \" \" );\n\t\tif ( groupSep !== altGroupSep ) {\n\t\t\tinteger = integer.split( altGroupSep ).join( \"\" );\n\t\t}\n\t\t// build a natively parsable number string\n\t\tvar p = sign + integer;\n\t\tif ( fraction !== null ) {\n\t\t\tp += \".\" + fraction;\n\t\t}\n\t\tif ( exponent !== null ) {\n\t\t\t// exponent itself may have a number patternd\n\t\t\tvar expSignInfo = parseNegativePattern( exponent, nf, \"-n\" );\n\t\t\tp += \"e\" + ( expSignInfo[0] || \"+\" ) + expSignInfo[ 1 ];\n\t\t}\n\t\tif ( regexParseFloat.test(p) ) {\n\t\t\tret = parseFloat( p );\n\t\t}\n\t}\n\treturn ret;\n};\n\nGlobalize.culture = function( cultureSelector ) {\n\t// setter\n\tif ( typeof cultureSelector !== \"undefined\" ) {\n\t\tthis.cultureSelector = cultureSelector;\n\t}\n\t// getter\n\treturn this.findClosestCulture( cultureSelector ) || this.cultures[ \"default\" ];\n};\n\n}( this ));\n","//     Underscore.js 1.8.2\r\n//     http://underscorejs.org\r\n//     (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\r\n//     Underscore may be freely distributed under the MIT license.\r\n(function () { function n(n) { function t(t, r, e, u, i, o) { for (; i >= 0 && o > i; i += n) { var a = u ? u[i] : i; e = r(e, t[a], a, t) } return e } return function (r, e, u, i) { e = d(e, i, 4); var o = !w(r) && m.keys(r), a = (o || r).length, c = n > 0 ? 0 : a - 1; return arguments.length < 3 && (u = r[o ? o[c] : c], c += n), t(r, e, u, o, c, a) } } function t(n) { return function (t, r, e) { r = b(r, e); for (var u = null != t && t.length, i = n > 0 ? 0 : u - 1; i >= 0 && u > i; i += n) if (r(t[i], i, t)) return i; return -1 } } function r(n, t) { var r = S.length, e = n.constructor, u = m.isFunction(e) && e.prototype || o, i = \"constructor\"; for (m.has(n, i) && !m.contains(t, i) && t.push(i) ; r--;) i = S[r], i in n && n[i] !== u[i] && !m.contains(t, i) && t.push(i) } var e = this, u = e._, i = Array.prototype, o = Object.prototype, a = Function.prototype, c = i.push, l = i.slice, f = o.toString, s = o.hasOwnProperty, p = Array.isArray, h = Object.keys, v = a.bind, g = Object.create, y = function () { }, m = function (n) { return n instanceof m ? n : this instanceof m ? void (this._wrapped = n) : new m(n) }; \"undefined\" != typeof exports ? (\"undefined\" != typeof module && module.exports && (exports = module.exports = m), exports._ = m) : e._ = m, m.VERSION = \"1.8.2\"; var d = function (n, t, r) { if (t === void 0) return n; switch (null == r ? 3 : r) { case 1: return function (r) { return n.call(t, r) }; case 2: return function (r, e) { return n.call(t, r, e) }; case 3: return function (r, e, u) { return n.call(t, r, e, u) }; case 4: return function (r, e, u, i) { return n.call(t, r, e, u, i) } } return function () { return n.apply(t, arguments) } }, b = function (n, t, r) { return null == n ? m.identity : m.isFunction(n) ? d(n, t, r) : m.isObject(n) ? m.matcher(n) : m.property(n) }; m.iteratee = function (n, t) { return b(n, t, 1 / 0) }; var x = function (n, t) { return function (r) { var e = arguments.length; if (2 > e || null == r) return r; for (var u = 1; e > u; u++) for (var i = arguments[u], o = n(i), a = o.length, c = 0; a > c; c++) { var l = o[c]; t && r[l] !== void 0 || (r[l] = i[l]) } return r } }, _ = function (n) { if (!m.isObject(n)) return {}; if (g) return g(n); y.prototype = n; var t = new y; return y.prototype = null, t }, j = Math.pow(2, 53) - 1, w = function (n) { var t = n && n.length; return \"number\" == typeof t && t >= 0 && j >= t }; m.each = m.forEach = function (n, t, r) { t = d(t, r); var e, u; if (w(n)) for (e = 0, u = n.length; u > e; e++) t(n[e], e, n); else { var i = m.keys(n); for (e = 0, u = i.length; u > e; e++) t(n[i[e]], i[e], n) } return n }, m.map = m.collect = function (n, t, r) { t = b(t, r); for (var e = !w(n) && m.keys(n), u = (e || n).length, i = Array(u), o = 0; u > o; o++) { var a = e ? e[o] : o; i[o] = t(n[a], a, n) } return i }, m.reduce = m.foldl = m.inject = n(1), m.reduceRight = m.foldr = n(-1), m.find = m.detect = function (n, t, r) { var e; return e = w(n) ? m.findIndex(n, t, r) : m.findKey(n, t, r), e !== void 0 && e !== -1 ? n[e] : void 0 }, m.filter = m.select = function (n, t, r) { var e = []; return t = b(t, r), m.each(n, function (n, r, u) { t(n, r, u) && e.push(n) }), e }, m.reject = function (n, t, r) { return m.filter(n, m.negate(b(t)), r) }, m.every = m.all = function (n, t, r) { t = b(t, r); for (var e = !w(n) && m.keys(n), u = (e || n).length, i = 0; u > i; i++) { var o = e ? e[i] : i; if (!t(n[o], o, n)) return !1 } return !0 }, m.some = m.any = function (n, t, r) { t = b(t, r); for (var e = !w(n) && m.keys(n), u = (e || n).length, i = 0; u > i; i++) { var o = e ? e[i] : i; if (t(n[o], o, n)) return !0 } return !1 }, m.contains = m.includes = m.include = function (n, t, r) { return w(n) || (n = m.values(n)), m.indexOf(n, t, \"number\" == typeof r && r) >= 0 }, m.invoke = function (n, t) { var r = l.call(arguments, 2), e = m.isFunction(t); return m.map(n, function (n) { var u = e ? t : n[t]; return null == u ? u : u.apply(n, r) }) }, m.pluck = function (n, t) { return m.map(n, m.property(t)) }, m.where = function (n, t) { return m.filter(n, m.matcher(t)) }, m.findWhere = function (n, t) { return m.find(n, m.matcher(t)) }, m.max = function (n, t, r) { var e, u, i = -1 / 0, o = -1 / 0; if (null == t && null != n) { n = w(n) ? n : m.values(n); for (var a = 0, c = n.length; c > a; a++) e = n[a], e > i && (i = e) } else t = b(t, r), m.each(n, function (n, r, e) { u = t(n, r, e), (u > o || u === -1 / 0 && i === -1 / 0) && (i = n, o = u) }); return i }, m.min = function (n, t, r) { var e, u, i = 1 / 0, o = 1 / 0; if (null == t && null != n) { n = w(n) ? n : m.values(n); for (var a = 0, c = n.length; c > a; a++) e = n[a], i > e && (i = e) } else t = b(t, r), m.each(n, function (n, r, e) { u = t(n, r, e), (o > u || 1 / 0 === u && 1 / 0 === i) && (i = n, o = u) }); return i }, m.shuffle = function (n) { for (var t, r = w(n) ? n : m.values(n), e = r.length, u = Array(e), i = 0; e > i; i++) t = m.random(0, i), t !== i && (u[i] = u[t]), u[t] = r[i]; return u }, m.sample = function (n, t, r) { return null == t || r ? (w(n) || (n = m.values(n)), n[m.random(n.length - 1)]) : m.shuffle(n).slice(0, Math.max(0, t)) }, m.sortBy = function (n, t, r) { return t = b(t, r), m.pluck(m.map(n, function (n, r, e) { return { value: n, index: r, criteria: t(n, r, e) } }).sort(function (n, t) { var r = n.criteria, e = t.criteria; if (r !== e) { if (r > e || r === void 0) return 1; if (e > r || e === void 0) return -1 } return n.index - t.index }), \"value\") }; var A = function (n) { return function (t, r, e) { var u = {}; return r = b(r, e), m.each(t, function (e, i) { var o = r(e, i, t); n(u, e, o) }), u } }; m.groupBy = A(function (n, t, r) { m.has(n, r) ? n[r].push(t) : n[r] = [t] }), m.indexBy = A(function (n, t, r) { n[r] = t }), m.countBy = A(function (n, t, r) { m.has(n, r) ? n[r]++ : n[r] = 1 }), m.toArray = function (n) { return n ? m.isArray(n) ? l.call(n) : w(n) ? m.map(n, m.identity) : m.values(n) : [] }, m.size = function (n) { return null == n ? 0 : w(n) ? n.length : m.keys(n).length }, m.partition = function (n, t, r) { t = b(t, r); var e = [], u = []; return m.each(n, function (n, r, i) { (t(n, r, i) ? e : u).push(n) }), [e, u] }, m.first = m.head = m.take = function (n, t, r) { return null == n ? void 0 : null == t || r ? n[0] : m.initial(n, n.length - t) }, m.initial = function (n, t, r) { return l.call(n, 0, Math.max(0, n.length - (null == t || r ? 1 : t))) }, m.last = function (n, t, r) { return null == n ? void 0 : null == t || r ? n[n.length - 1] : m.rest(n, Math.max(0, n.length - t)) }, m.rest = m.tail = m.drop = function (n, t, r) { return l.call(n, null == t || r ? 1 : t) }, m.compact = function (n) { return m.filter(n, m.identity) }; var k = function (n, t, r, e) { for (var u = [], i = 0, o = e || 0, a = n && n.length; a > o; o++) { var c = n[o]; if (w(c) && (m.isArray(c) || m.isArguments(c))) { t || (c = k(c, t, r)); var l = 0, f = c.length; for (u.length += f; f > l;) u[i++] = c[l++] } else r || (u[i++] = c) } return u }; m.flatten = function (n, t) { return k(n, t, !1) }, m.without = function (n) { return m.difference(n, l.call(arguments, 1)) }, m.uniq = m.unique = function (n, t, r, e) { if (null == n) return []; m.isBoolean(t) || (e = r, r = t, t = !1), null != r && (r = b(r, e)); for (var u = [], i = [], o = 0, a = n.length; a > o; o++) { var c = n[o], l = r ? r(c, o, n) : c; t ? (o && i === l || u.push(c), i = l) : r ? m.contains(i, l) || (i.push(l), u.push(c)) : m.contains(u, c) || u.push(c) } return u }, m.union = function () { return m.uniq(k(arguments, !0, !0)) }, m.intersection = function (n) { if (null == n) return []; for (var t = [], r = arguments.length, e = 0, u = n.length; u > e; e++) { var i = n[e]; if (!m.contains(t, i)) { for (var o = 1; r > o && m.contains(arguments[o], i) ; o++); o === r && t.push(i) } } return t }, m.difference = function (n) { var t = k(arguments, !0, !0, 1); return m.filter(n, function (n) { return !m.contains(t, n) }) }, m.zip = function () { return m.unzip(arguments) }, m.unzip = function (n) { for (var t = n && m.max(n, \"length\").length || 0, r = Array(t), e = 0; t > e; e++) r[e] = m.pluck(n, e); return r }, m.object = function (n, t) { for (var r = {}, e = 0, u = n && n.length; u > e; e++) t ? r[n[e]] = t[e] : r[n[e][0]] = n[e][1]; return r }, m.indexOf = function (n, t, r) { var e = 0, u = n && n.length; if (\"number\" == typeof r) e = 0 > r ? Math.max(0, u + r) : r; else if (r && u) return e = m.sortedIndex(n, t), n[e] === t ? e : -1; if (t !== t) return m.findIndex(l.call(n, e), m.isNaN); for (; u > e; e++) if (n[e] === t) return e; return -1 }, m.lastIndexOf = function (n, t, r) { var e = n ? n.length : 0; if (\"number\" == typeof r && (e = 0 > r ? e + r + 1 : Math.min(e, r + 1)), t !== t) return m.findLastIndex(l.call(n, 0, e), m.isNaN); for (; --e >= 0;) if (n[e] === t) return e; return -1 }, m.findIndex = t(1), m.findLastIndex = t(-1), m.sortedIndex = function (n, t, r, e) { r = b(r, e, 1); for (var u = r(t), i = 0, o = n.length; o > i;) { var a = Math.floor((i + o) / 2); r(n[a]) < u ? i = a + 1 : o = a } return i }, m.range = function (n, t, r) { arguments.length <= 1 && (t = n || 0, n = 0), r = r || 1; for (var e = Math.max(Math.ceil((t - n) / r), 0), u = Array(e), i = 0; e > i; i++, n += r) u[i] = n; return u }; var O = function (n, t, r, e, u) { if (!(e instanceof t)) return n.apply(r, u); var i = _(n.prototype), o = n.apply(i, u); return m.isObject(o) ? o : i }; m.bind = function (n, t) { if (v && n.bind === v) return v.apply(n, l.call(arguments, 1)); if (!m.isFunction(n)) throw new TypeError(\"Bind must be called on a function\"); var r = l.call(arguments, 2), e = function () { return O(n, e, t, this, r.concat(l.call(arguments))) }; return e }, m.partial = function (n) { var t = l.call(arguments, 1), r = function () { for (var e = 0, u = t.length, i = Array(u), o = 0; u > o; o++) i[o] = t[o] === m ? arguments[e++] : t[o]; for (; e < arguments.length;) i.push(arguments[e++]); return O(n, r, this, this, i) }; return r }, m.bindAll = function (n) { var t, r, e = arguments.length; if (1 >= e) throw new Error(\"bindAll must be passed function names\"); for (t = 1; e > t; t++) r = arguments[t], n[r] = m.bind(n[r], n); return n }, m.memoize = function (n, t) { var r = function (e) { var u = r.cache, i = \"\" + (t ? t.apply(this, arguments) : e); return m.has(u, i) || (u[i] = n.apply(this, arguments)), u[i] }; return r.cache = {}, r }, m.delay = function (n, t) { var r = l.call(arguments, 2); return setTimeout(function () { return n.apply(null, r) }, t) }, m.defer = m.partial(m.delay, m, 1), m.throttle = function (n, t, r) { var e, u, i, o = null, a = 0; r || (r = {}); var c = function () { a = r.leading === !1 ? 0 : m.now(), o = null, i = n.apply(e, u), o || (e = u = null) }; return function () { var l = m.now(); a || r.leading !== !1 || (a = l); var f = t - (l - a); return e = this, u = arguments, 0 >= f || f > t ? (o && (clearTimeout(o), o = null), a = l, i = n.apply(e, u), o || (e = u = null)) : o || r.trailing === !1 || (o = setTimeout(c, f)), i } }, m.debounce = function (n, t, r) { var e, u, i, o, a, c = function () { var l = m.now() - o; t > l && l >= 0 ? e = setTimeout(c, t - l) : (e = null, r || (a = n.apply(i, u), e || (i = u = null))) }; return function () { i = this, u = arguments, o = m.now(); var l = r && !e; return e || (e = setTimeout(c, t)), l && (a = n.apply(i, u), i = u = null), a } }, m.wrap = function (n, t) { return m.partial(t, n) }, m.negate = function (n) { return function () { return !n.apply(this, arguments) } }, m.compose = function () { var n = arguments, t = n.length - 1; return function () { for (var r = t, e = n[t].apply(this, arguments) ; r--;) e = n[r].call(this, e); return e } }, m.after = function (n, t) { return function () { return --n < 1 ? t.apply(this, arguments) : void 0 } }, m.before = function (n, t) { var r; return function () { return --n > 0 && (r = t.apply(this, arguments)), 1 >= n && (t = null), r } }, m.once = m.partial(m.before, 2); var F = !{ toString: null }.propertyIsEnumerable(\"toString\"), S = [\"valueOf\", \"isPrototypeOf\", \"toString\", \"propertyIsEnumerable\", \"hasOwnProperty\", \"toLocaleString\"]; m.keys = function (n) { if (!m.isObject(n)) return []; if (h) return h(n); var t = []; for (var e in n) m.has(n, e) && t.push(e); return F && r(n, t), t }, m.allKeys = function (n) { if (!m.isObject(n)) return []; var t = []; for (var e in n) t.push(e); return F && r(n, t), t }, m.values = function (n) { for (var t = m.keys(n), r = t.length, e = Array(r), u = 0; r > u; u++) e[u] = n[t[u]]; return e }, m.mapObject = function (n, t, r) { t = b(t, r); for (var e, u = m.keys(n), i = u.length, o = {}, a = 0; i > a; a++) e = u[a], o[e] = t(n[e], e, n); return o }, m.pairs = function (n) { for (var t = m.keys(n), r = t.length, e = Array(r), u = 0; r > u; u++) e[u] = [t[u], n[t[u]]]; return e }, m.invert = function (n) { for (var t = {}, r = m.keys(n), e = 0, u = r.length; u > e; e++) t[n[r[e]]] = r[e]; return t }, m.functions = m.methods = function (n) { var t = []; for (var r in n) m.isFunction(n[r]) && t.push(r); return t.sort() }, m.extend = x(m.allKeys), m.extendOwn = m.assign = x(m.keys), m.findKey = function (n, t, r) { t = b(t, r); for (var e, u = m.keys(n), i = 0, o = u.length; o > i; i++) if (e = u[i], t(n[e], e, n)) return e }, m.pick = function (n, t, r) { var e, u, i = {}, o = n; if (null == o) return i; m.isFunction(t) ? (u = m.allKeys(o), e = d(t, r)) : (u = k(arguments, !1, !1, 1), e = function (n, t, r) { return t in r }, o = Object(o)); for (var a = 0, c = u.length; c > a; a++) { var l = u[a], f = o[l]; e(f, l, o) && (i[l] = f) } return i }, m.omit = function (n, t, r) { if (m.isFunction(t)) t = m.negate(t); else { var e = m.map(k(arguments, !1, !1, 1), String); t = function (n, t) { return !m.contains(e, t) } } return m.pick(n, t, r) }, m.defaults = x(m.allKeys, !0), m.clone = function (n) { return m.isObject(n) ? m.isArray(n) ? n.slice() : m.extend({}, n) : n }, m.tap = function (n, t) { return t(n), n }, m.isMatch = function (n, t) { var r = m.keys(t), e = r.length; if (null == n) return !e; for (var u = Object(n), i = 0; e > i; i++) { var o = r[i]; if (t[o] !== u[o] || !(o in u)) return !1 } return !0 }; var E = function (n, t, r, e) { if (n === t) return 0 !== n || 1 / n === 1 / t; if (null == n || null == t) return n === t; n instanceof m && (n = n._wrapped), t instanceof m && (t = t._wrapped); var u = f.call(n); if (u !== f.call(t)) return !1; switch (u) { case \"[object RegExp]\": case \"[object String]\": return \"\" + n == \"\" + t; case \"[object Number]\": return +n !== +n ? +t !== +t : 0 === +n ? 1 / +n === 1 / t : +n === +t; case \"[object Date]\": case \"[object Boolean]\": return +n === +t } var i = \"[object Array]\" === u; if (!i) { if (\"object\" != typeof n || \"object\" != typeof t) return !1; var o = n.constructor, a = t.constructor; if (o !== a && !(m.isFunction(o) && o instanceof o && m.isFunction(a) && a instanceof a) && \"constructor\" in n && \"constructor\" in t) return !1 } r = r || [], e = e || []; for (var c = r.length; c--;) if (r[c] === n) return e[c] === t; if (r.push(n), e.push(t), i) { if (c = n.length, c !== t.length) return !1; for (; c--;) if (!E(n[c], t[c], r, e)) return !1 } else { var l, s = m.keys(n); if (c = s.length, m.keys(t).length !== c) return !1; for (; c--;) if (l = s[c], !m.has(t, l) || !E(n[l], t[l], r, e)) return !1 } return r.pop(), e.pop(), !0 }; m.isEqual = function (n, t) { return E(n, t) }, m.isEmpty = function (n) { return null == n ? !0 : w(n) && (m.isArray(n) || m.isString(n) || m.isArguments(n)) ? 0 === n.length : 0 === m.keys(n).length }, m.isElement = function (n) { return !(!n || 1 !== n.nodeType) }, m.isArray = p || function (n) { return \"[object Array]\" === f.call(n) }, m.isObject = function (n) { var t = typeof n; return \"function\" === t || \"object\" === t && !!n }, m.each([\"Arguments\", \"Function\", \"String\", \"Number\", \"Date\", \"RegExp\", \"Error\"], function (n) { m[\"is\" + n] = function (t) { return f.call(t) === \"[object \" + n + \"]\" } }), m.isArguments(arguments) || (m.isArguments = function (n) { return m.has(n, \"callee\") }), \"function\" != typeof /./ && \"object\" != typeof Int8Array && (m.isFunction = function (n) { return \"function\" == typeof n || !1 }), m.isFinite = function (n) { return isFinite(n) && !isNaN(parseFloat(n)) }, m.isNaN = function (n) { return m.isNumber(n) && n !== +n }, m.isBoolean = function (n) { return n === !0 || n === !1 || \"[object Boolean]\" === f.call(n) }, m.isNull = function (n) { return null === n }, m.isUndefined = function (n) { return n === void 0 }, m.has = function (n, t) { return null != n && s.call(n, t) }, m.noConflict = function () { return e._ = u, this }, m.identity = function (n) { return n }, m.constant = function (n) { return function () { return n } }, m.noop = function () { }, m.property = function (n) { return function (t) { return null == t ? void 0 : t[n] } }, m.propertyOf = function (n) { return null == n ? function () { } : function (t) { return n[t] } }, m.matcher = m.matches = function (n) { return n = m.extendOwn({}, n), function (t) { return m.isMatch(t, n) } }, m.times = function (n, t, r) { var e = Array(Math.max(0, n)); t = d(t, r, 1); for (var u = 0; n > u; u++) e[u] = t(u); return e }, m.random = function (n, t) { return null == t && (t = n, n = 0), n + Math.floor(Math.random() * (t - n + 1)) }, m.now = Date.now || function () { return (new Date).getTime() }; var M = { \"&\": \"&amp;\", \"<\": \"&lt;\", \">\": \"&gt;\", '\"': \"&quot;\", \"'\": \"&#x27;\", \"`\": \"&#x60;\" }, N = m.invert(M), I = function (n) { var t = function (t) { return n[t] }, r = \"(?:\" + m.keys(n).join(\"|\") + \")\", e = RegExp(r), u = RegExp(r, \"g\"); return function (n) { return n = null == n ? \"\" : \"\" + n, e.test(n) ? n.replace(u, t) : n } }; m.escape = I(M), m.unescape = I(N), m.result = function (n, t, r) { var e = null == n ? void 0 : n[t]; return e === void 0 && (e = r), m.isFunction(e) ? e.call(n) : e }; var B = 0; m.uniqueId = function (n) { var t = ++B + \"\"; return n ? n + t : t }, m.templateSettings = { evaluate: /<%([\\s\\S]+?)%>/g, interpolate: /<%=([\\s\\S]+?)%>/g, escape: /<%-([\\s\\S]+?)%>/g }; var T = /(.)^/, R = { \"'\": \"'\", \"\\\\\": \"\\\\\", \"\\r\": \"r\", \"\\n\": \"n\", \"\\u2028\": \"u2028\", \"\\u2029\": \"u2029\" }, q = /\\\\|'|\\r|\\n|\\u2028|\\u2029/g, K = function (n) { return \"\\\\\" + R[n] }; m.template = function (n, t, r) { !t && r && (t = r), t = m.defaults({}, t, m.templateSettings); var e = RegExp([(t.escape || T).source, (t.interpolate || T).source, (t.evaluate || T).source].join(\"|\") + \"|$\", \"g\"), u = 0, i = \"__p+='\"; n.replace(e, function (t, r, e, o, a) { return i += n.slice(u, a).replace(q, K), u = a + t.length, r ? i += \"'+\\n((__t=(\" + r + \"))==null?'':_.escape(__t))+\\n'\" : e ? i += \"'+\\n((__t=(\" + e + \"))==null?'':__t)+\\n'\" : o && (i += \"';\\n\" + o + \"\\n__p+='\"), t }), i += \"';\\n\", t.variable || (i = \"with(obj||{}){\\n\" + i + \"}\\n\"), i = \"var __t,__p='',__j=Array.prototype.join,\" + \"print=function(){__p+=__j.call(arguments,'');};\\n\" + i + \"return __p;\\n\"; try { var o = new Function(t.variable || \"obj\", \"_\", i) } catch (a) { throw a.source = i, a } var c = function (n) { return o.call(this, n, m) }, l = t.variable || \"obj\"; return c.source = \"function(\" + l + \"){\\n\" + i + \"}\", c }, m.chain = function (n) { var t = m(n); return t._chain = !0, t }; var z = function (n, t) { return n._chain ? m(t).chain() : t }; m.mixin = function (n) { m.each(m.functions(n), function (t) { var r = m[t] = n[t]; m.prototype[t] = function () { var n = [this._wrapped]; return c.apply(n, arguments), z(this, r.apply(m, n)) } }) }, m.mixin(m), m.each([\"pop\", \"push\", \"reverse\", \"shift\", \"sort\", \"splice\", \"unshift\"], function (n) { var t = i[n]; m.prototype[n] = function () { var r = this._wrapped; return t.apply(r, arguments), \"shift\" !== n && \"splice\" !== n || 0 !== r.length || delete r[0], z(this, r) } }), m.each([\"concat\", \"join\", \"slice\"], function (n) { var t = i[n]; m.prototype[n] = function () { return z(this, t.apply(this._wrapped, arguments)) } }), m.prototype.value = function () { return this._wrapped }, m.prototype.valueOf = m.prototype.toJSON = m.prototype.value, m.prototype.toString = function () { return \"\" + this._wrapped }, \"function\" == typeof define && define.amd && define(\"underscore\", [], function () { return m }) }).call(this);\r\n//# sourceMappingURL=underscore-min.map","/// Knockout Mapping plugin v2.3.5\r\n/// (c) 2012 Steven Sanderson, Roy Jacobs - http://knockoutjs.com/\r\n/// License: MIT (http://www.opensource.org/licenses/mit-license.php)\r\n(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.mapping = {}) })(function (e, f) {\r\n    function x(b, c) {\r\n        var a, d; for (d in c) if (c.hasOwnProperty(d) && c[d]) if (a = f.getType(b[d]), d && b[d] && \"array\" !== a && \"string\" !== a) x(b[d], c[d]); else if (\"array\" === f.getType(b[d]) && \"array\" === f.getType(c[d])) {\r\n            a = b; for (var e = d, k = b[d], m = c[d], s = {}, g = k.length - 1; 0 <= g; --g) s[k[g]] = k[g]; for (g =\r\nm.length - 1; 0 <= g; --g) s[m[g]] = m[g]; k = []; m = void 0; for (m in s) k.push(s[m]); a[e] = k\r\n        } else b[d] = c[d]\r\n    } function D(b, c) { var a = {}; x(a, b); x(a, c); return a } function y(b, c) {\r\n        for (var a = D({}, b), e = K.length - 1; 0 <= e; e--) { var f = K[e]; a[f] && (a[\"\"] instanceof Object || (a[\"\"] = {}), a[\"\"][f] = a[f], delete a[f]) } c && (a.ignore = h(c.ignore, a.ignore), a.include = h(c.include, a.include), a.copy = h(c.copy, a.copy), a.observe = h(c.observe, a.observe)); a.ignore = h(a.ignore, i.ignore); a.include = h(a.include, i.include); a.copy = h(a.copy, i.copy); a.observe = h(a.observe,\r\ni.observe); a.mappedProperties = a.mappedProperties || {}; a.copiedProperties = a.copiedProperties || {}; return a\r\n    } function h(b, c) { \"array\" !== f.getType(b) && (b = \"undefined\" === f.getType(b) ? [] : [b]); \"array\" !== f.getType(c) && (c = \"undefined\" === f.getType(c) ? [] : [c]); return e.utils.arrayGetDistinctValues(b.concat(c)) } function E(b, c, a, d, j, k, m) {\r\n        var s = \"array\" === f.getType(e.utils.unwrapObservable(c)), k = k || \"\"; if (f.isMapped(b)) var g = e.utils.unwrapObservable(b)[n], a = D(g, a); var i = m || j, h = function () {\r\n            return a[d] && a[d].create instanceof\r\nFunction\r\n        }, w = function (b) {\r\n            var f = F, g = e.dependentObservable; e.dependentObservable = function (a, b, c) { c = c || {}; a && \"object\" == typeof a && (c = a); var d = c.deferEvaluation, L = !1; c.deferEvaluation = !0; a = new G(a, b, c); if (!d) { var g = a, d = e.dependentObservable; e.dependentObservable = G; a = e.isWriteableObservable(g); e.dependentObservable = d; a = G({ read: function () { L || (e.utils.arrayRemoveItem(f, g), L = !0); return g.apply(g, arguments) }, write: a && function (a) { return g(a) }, deferEvaluation: !0 }); f.push(a) } return a }; e.dependentObservable.fn =\r\nG.fn; e.computed = e.dependentObservable; b = e.utils.unwrapObservable(j) instanceof Array ? a[d].create({ data: b || c, parent: i, skip: M }) : a[d].create({ data: b || c, parent: i }); e.dependentObservable = g; e.computed = e.dependentObservable; return b\r\n        }, t = function () { return a[d] && a[d].update instanceof Function }, u = function (b, f) { var g = { data: f || c, parent: i, target: e.utils.unwrapObservable(b) }; e.isWriteableObservable(b) && (g.observable = b); return a[d].update(g) }; if (m = H.get(c)) return m; d = d || \"\"; if (s) {\r\n            var s = [], r = !1, l = function (a) { return a };\r\n            a[d] && a[d].key && (l = a[d].key, r = !0); e.isObservable(b) || (b = e.observableArray([]), b.mappedRemove = function (a) { var c = \"function\" == typeof a ? a : function (b) { return b === l(a) }; return b.remove(function (a) { return c(l(a)) }) }, b.mappedRemoveAll = function (a) { var c = B(a, l); return b.remove(function (a) { return -1 != e.utils.arrayIndexOf(c, l(a)) }) }, b.mappedDestroy = function (a) { var c = \"function\" == typeof a ? a : function (b) { return b === l(a) }; return b.destroy(function (a) { return c(l(a)) }) }, b.mappedDestroyAll = function (a) {\r\n                var c = B(a, l); return b.destroy(function (a) {\r\n                    return -1 !=\r\ne.utils.arrayIndexOf(c, l(a))\r\n                })\r\n            }, b.mappedIndexOf = function (a) { var c = B(b(), l), a = l(a); return e.utils.arrayIndexOf(c, a) }, b.mappedCreate = function (a) { if (-1 !== b.mappedIndexOf(a)) throw Error(\"There already is an object with the key that you specified.\"); var c = h() ? w(a) : a; t() && (a = u(c, a), e.isWriteableObservable(c) ? c(a) : c = a); b.push(c); return c }); m = B(e.utils.unwrapObservable(b), l).sort(); g = B(c, l); r && g.sort(); var r = e.utils.compareArrays(m, g), m = {}, I, z = e.utils.unwrapObservable(c), x = {}, y = !0, g = 0; for (I = z.length; g < I; g++) {\r\n                var q =\r\nl(z[g]); if (void 0 === q || q instanceof Object) { y = !1; break } x[q] = z[g]\r\n            } var z = [], A = 0, g = 0; for (I = r.length; g < I; g++) {\r\n                var q = r[g], p, v = k + \"[\" + g + \"]\"; switch (q.status) {\r\n                    case \"added\": var C = y ? x[q.value] : J(e.utils.unwrapObservable(c), q.value, l); p = E(void 0, C, a, d, b, v, j); h() || (p = e.utils.unwrapObservable(p)); v = N(e.utils.unwrapObservable(c), C, m); p === M ? A++ : z[v - A] = p; m[v] = !0; break; case \"retained\": C = y ? x[q.value] : J(e.utils.unwrapObservable(c), q.value, l); p = J(b, q.value, l); E(p, C, a, d, b, v, j); v = N(e.utils.unwrapObservable(c), C, m); z[v] =\r\np; m[v] = !0; break; case \"deleted\": p = J(b, q.value, l)\r\n                } s.push({ event: q.status, item: p })\r\n            } b(z); a[d] && a[d].arrayChanged && e.utils.arrayForEach(s, function (b) { a[d].arrayChanged(b.event, b.item) })\r\n        } else if (O(c)) {\r\n            b = e.utils.unwrapObservable(b); if (!b) { if (h()) return r = w(), t() && (r = u(r)), r; if (t()) return u(r); b = {} } t() && (b = u(b)); H.save(c, b); if (t()) return b; P(c, function (d) {\r\n                var f = k.length ? k + \".\" + d : d; if (-1 == e.utils.arrayIndexOf(a.ignore, f)) if (-1 != e.utils.arrayIndexOf(a.copy, f)) b[d] = c[d]; else if (\"object\" != typeof c[d] && \"array\" !=\r\ntypeof c[d] && 0 < a.observe.length && -1 == e.utils.arrayIndexOf(a.observe, f)) b[d] = c[d], a.copiedProperties[f] = !0; else { var g = H.get(c[d]), j = E(b[d], c[d], a, d, b, f, b), g = g || j; if (0 < a.observe.length && -1 == e.utils.arrayIndexOf(a.observe, f)) b[d] = g(), a.copiedProperties[f] = !0; else { if (e.isWriteableObservable(b[d])) b[d](e.utils.unwrapObservable(g)); else g = void 0 === b[d] ? g : e.utils.unwrapObservable(g), b[d] = g; a.mappedProperties[f] = !0 } } \r\n            })\r\n        } else switch (f.getType(c)) {\r\n            case \"function\": t() ? e.isWriteableObservable(c) ? (c(u(c)), b = c) :\r\nb = u(c) : b = c; break; default: if (e.isWriteableObservable(b)) return p = t() ? u(b) : e.utils.unwrapObservable(c), b(p), p; h() || t(); b = h() ? w() : e.observable(e.utils.unwrapObservable(c)); t() && b(u(b))\r\n        } return b\r\n    } function N(b, c, a) { for (var d = 0, e = b.length; d < e; d++) if (!0 !== a[d] && b[d] === c) return d; return null } function Q(b, c) { var a; c && (a = c(b)); \"undefined\" === f.getType(a) && (a = b); return e.utils.unwrapObservable(a) } function J(b, c, a) {\r\n        for (var b = e.utils.unwrapObservable(b), d = 0, f = b.length; d < f; d++) { var k = b[d]; if (Q(k, a) === c) return k } throw Error(\"When calling ko.update*, the key '\" +\r\nc + \"' was not found!\");\r\n    } function B(b, c) { return e.utils.arrayMap(e.utils.unwrapObservable(b), function (a) { return c ? Q(a, c) : a }) } function P(b, c) { if (\"array\" === f.getType(b)) for (var a = 0; a < b.length; a++) c(a); else for (a in b) c(a) } function O(b) { var c = f.getType(b); return (\"object\" === c || \"array\" === c) && null !== b } function S() { var b = [], c = []; this.save = function (a, d) { var f = e.utils.arrayIndexOf(b, a); 0 <= f ? c[f] = d : (b.push(a), c.push(d)) }; this.get = function (a) { a = e.utils.arrayIndexOf(b, a); return 0 <= a ? c[a] : void 0 } } function R() {\r\n        var b =\r\n{}, c = function (a) { var c; try { c = a } catch (e) { c = \"$$$\" } a = b[c]; void 0 === a && (a = new S, b[c] = a); return a }; this.save = function (a, b) { c(a).save(a, b) }; this.get = function (a) { return c(a).get(a) } \r\n    } var n = \"__ko_mapping__\", G = e.dependentObservable, A = 0, F, H, K = [\"create\", \"update\", \"key\", \"arrayChanged\"], M = {}, w = { include: [\"_destroy\"], ignore: [], copy: [], observe: [] }, i = w; f.isMapped = function (b) { return (b = e.utils.unwrapObservable(b)) && b[n] }; f.fromJS = function (b) {\r\n        if (0 == arguments.length) throw Error(\"When calling ko.fromJS, pass the object you want to convert.\");\r\n        window.setTimeout(function () { A = 0 }, 0); A++ || (F = [], H = new R); var c, a; 2 == arguments.length && (arguments[1][n] ? a = arguments[1] : c = arguments[1]); 3 == arguments.length && (c = arguments[1], a = arguments[2]); a && (c = D(c, a[n])); c = y(c); var d = E(a, b, c); a && (d = a); --A || window.setTimeout(function () { for (; F.length; ) { var a = F.pop(); a && a() } }, 0); d[n] = D(d[n], c); return d\r\n    }; f.fromJSON = function (b) { var c = e.utils.parseJson(b); arguments[0] = c; return f.fromJS.apply(this, arguments) }; f.updateFromJS = function () {\r\n        throw Error(\"ko.mapping.updateFromJS, use ko.mapping.fromJS instead. Please note that the order of parameters is different!\");\r\n    }; f.updateFromJSON = function () { throw Error(\"ko.mapping.updateFromJSON, use ko.mapping.fromJSON instead. Please note that the order of parameters is different!\"); }; f.toJS = function (b, c) {\r\n        i || f.resetDefaultOptions(); if (0 == arguments.length) throw Error(\"When calling ko.mapping.toJS, pass the object you want to convert.\"); if (\"array\" !== f.getType(i.ignore)) throw Error(\"ko.mapping.defaultOptions().ignore should be an array.\"); if (\"array\" !== f.getType(i.include)) throw Error(\"ko.mapping.defaultOptions().include should be an array.\");\r\n        if (\"array\" !== f.getType(i.copy)) throw Error(\"ko.mapping.defaultOptions().copy should be an array.\"); c = y(c, b[n]); return f.visitModel(b, function (a) { return e.utils.unwrapObservable(a) }, c)\r\n    }; f.toJSON = function (b, c) { var a = f.toJS(b, c); return e.utils.stringifyJson(a) }; f.defaultOptions = function () { if (0 < arguments.length) i = arguments[0]; else return i }; f.resetDefaultOptions = function () { i = { include: w.include.slice(0), ignore: w.ignore.slice(0), copy: w.copy.slice(0)} }; f.getType = function (b) {\r\n        if (b && \"object\" === typeof b) {\r\n            if (b.constructor ==\r\n(new Date).constructor) return \"date\"; if (\"[object Array]\" === Object.prototype.toString.call(b)) return \"array\"\r\n        } return typeof b\r\n    }; f.visitModel = function (b, c, a) {\r\n        a = a || {}; a.visitedObjects = a.visitedObjects || new R; var d, j = e.utils.unwrapObservable(b); if (O(j)) a = y(a, j[n]), c(b, a.parentName), d = \"array\" === f.getType(j) ? [] : {}; else return c(b, a.parentName); a.visitedObjects.save(b, d); var k = a.parentName; P(j, function (b) {\r\n            if (!(a.ignore && -1 != e.utils.arrayIndexOf(a.ignore, b))) {\r\n                var i = j[b], g = a, h = k || \"\"; \"array\" === f.getType(j) ? k &&\r\n(h += \"[\" + b + \"]\") : (k && (h += \".\"), h += b); g.parentName = h; if (!(-1 === e.utils.arrayIndexOf(a.copy, b) && -1 === e.utils.arrayIndexOf(a.include, b) && j[n] && j[n].mappedProperties && !j[n].mappedProperties[b] && j[n].copiedProperties && !j[n].copiedProperties[b] && \"array\" !== f.getType(j))) switch (f.getType(e.utils.unwrapObservable(i))) { case \"object\": case \"array\": case \"undefined\": g = a.visitedObjects.get(i); d[b] = \"undefined\" !== f.getType(g) ? g : f.visitModel(i, c, a); break; default: d[b] = c(i, a.parentName) } \r\n            } \r\n        }); return d\r\n    } \r\n});\r\n\r\n","ko.bindingHandlers.numericValue = {\r\n    init: function (element, valueAccessor, allBindingsAccessor) {\r\n        var underlyingObservable = valueAccessor();\r\n        var interceptor = ko.dependentObservable({\r\n            read: underlyingObservable,\r\n            write: function (value) {\r\n                if (!isNaN(value)) {\r\n                    underlyingObservable(parseFloat(value));\r\n                }\r\n            }\r\n        });\r\n        ko.bindingHandlers.value.init(element, function () { return interceptor }, allBindingsAccessor);\r\n    },\r\n    update: ko.bindingHandlers.value.update\r\n};\r\n\r\n\r\n/** Binding for inline validation - jQuery Validation Plugin\r\n*  http://bassistance.de/jquery-plugins/jquery-plugin-validation/\r\n*/\r\nko.bindingHandlers.valueWithAutoValidation = {\r\n    init: ko.bindingHandlers.value.init,\r\n    update: function (element, valueAccessor, allBindingsAccessor) {\r\n        ko.bindingHandlers.value.update.apply(this, arguments);\r\n        $(element).valid();\r\n        var form = $(element.form);\r\n        form.trigger('invalid-form.validate', [form.data(\"validator\")]);\r\n    }\r\n};\r\n\r\n/** Binding for form validation - jQuery Validation Plugin\r\n*  http://bassistance.de/jquery-plugins/jquery-plugin-validation/\r\n*/\r\nko.bindingHandlers.jqValidate = {\r\n    init: function (element, valueAccessor) {\r\n        var options = valueAccessor();\r\n        $(element).validate(options);\r\n    }\r\n};\r\n\r\nko.bindingHandlers.masked = {\r\n    init: function (element, valueAccessor, allBindingsAccessor) {\r\n        var mask = allBindingsAccessor().mask || {};\r\n        var placeholder = allBindingsAccessor().placeholder;\r\n        if (placeholder) {\r\n            $(element).mask(mask, { placeholder: placeholder });\r\n        } else {\r\n            $(element).mask(mask);\r\n        }\r\n        ko.utils.registerEventHandler(element, \"blur\", function () {\r\n            var observable = valueAccessor();\r\n            observable($(element).val());\r\n        });\r\n    },\r\n    update: function (element, valueAccessor) {\r\n        var value = ko.utils.unwrapObservable(valueAccessor());\r\n        $(element).val(value);\r\n    }\r\n};\r\n  \r\n\r\n/** Binding to make content appear with 'fade' effect */\r\nko.bindingHandlers['fadeIn'] = {\r\n    'update': function (element, valueAccessor) {\r\n        var options = valueAccessor();\r\n        if (options() === true)\r\n            $(element).fadeIn('slow');\r\n    }\r\n};\r\n/** Binding to make content disappear with 'fade' effect */\r\nko.bindingHandlers['fadeOut'] = {\r\n    'update': function (element, valueAccessor) {\r\n        var options = valueAccessor();\r\n        if (options() === true)\r\n            $(element).fadeOut('slow');\r\n    }\r\n};\r\n\r\n/** Binding for stylized buttons - jQuery UI Button Widget\r\n*  http://jqueryui.com/demos/button/\r\n*/\r\nko.bindingHandlers.jqButton = {\r\n    init: function (element, valueAccessor) {\r\n        var options = valueAccessor();\r\n        $(element).button(options);\r\n    }\r\n};\r\n\r\n/**\r\n* Binding for jQuery Datatables\r\n* http://datatables.net\r\n*/\r\nko.bindingHandlers.dataTable = {\r\n    init: function (element, valueAccessor) {\r\n        var options = valueAccessor();\r\n        var defaults = {\r\n            \"aaData\": options[\"data\"](),\r\n            \"bJQueryUI\": true,\r\n            \"bFilter\": true,\r\n            \"bAutoWidth\": false,\r\n            \"bLengthChange\": false,\r\n            \"bRetrieve\": true,\r\n            \"bSortClasses\": false,\r\n            \"fnRowCallback\": function (nRow, aData, iDisplayIndex) {\r\n                $(nRow).mouseover(function () {\r\n                    $(nRow).attr(\"style\", \"background-color:yellow !important;\");\r\n                });\r\n                $(nRow).mouseout(function () {\r\n                    $(nRow).removeAttr(\"style\");\r\n                });\r\n                if (typeof options[\"rowClick\"] === \"function\") {\r\n                    $(nRow).unbind('click').click(function () {\r\n                        options[\"rowClick\"](aData);\r\n                    });\r\n                }\r\n                return nRow;\r\n            },\r\n            \"oLanguage\": TABLE_LANGUAGE\r\n        }\r\n        var tableOptions = $.extend(defaults, options[\"options\"]);\r\n        options[\"object\"]($(element).dataTable(tableOptions).css(\"width\", \"99.5%\"));\r\n    },\r\n    update: function (element, valueAccessor) {\r\n        var options = valueAccessor();\r\n        options[\"object\"]().fnClearTable();\r\n        options[\"object\"]().fnAddData(options[\"data\"](), true);\r\n    }\r\n};\r\n\r\n/** Binding for stylized tabs - jQuery UI Tabs Widget\r\n*  http://jqueryui.com/demos/tabs/\r\n*/\r\nko.bindingHandlers.jqTabs = {\r\n    init: function (element, valueAccessor) {\r\n        var options = valueAccessor();\r\n        $(element).tabs(ko.utils.unwrapObservable(options));\r\n    },\r\n    update: function (element, valueAccessor) {\r\n        var options = valueAccessor();\r\n        $(element).tabs('option', ko.utils.unwrapObservable(options));\r\n    }\r\n};\r\n\r\n/** Binding for strict MVVM use, associating an observable with the jQuery object of the element */\r\nko.bindingHandlers.jqElement = {\r\n    init: function (element, valueAccessor) {\r\n        var options = valueAccessor();\r\n        options($(element));\r\n    }\r\n}\r\n\r\n/** Binding for accordion widget - jQuery UI Accordion Widget\r\n*  http://jqueryui.com/demos/accordion/\r\n*/\r\nko.bindingHandlers.jqAccordion = {\r\n    init: function (element, valueAccessor) {\r\n        var options = valueAccessor();\r\n        var jqElement = $(element);\r\n        jqElement.accordion(options);\r\n        jqElement.bind(\"valueChanged\", function () {\r\n            ko.bindingHandlers.jqAccordion.update(element, valueAccessor);\r\n        });\r\n    },\r\n    update: function (element, valueAccessor) {\r\n        var options = valueAccessor();\r\n        $(element).accordion('destroy').accordion(options);\r\n    }\r\n};\r\n\r\n/** Binding for adding stylized and rich multiselect - jQuery UI MultiSelect Widget\r\n*  http://www.erichynds.com/jquery/jquery-ui-multiselect-widget/\r\n*/\r\nko.bindingHandlers.jqMultiSelect = {\r\n    init: function (element, valueAccessor, allBindingsAccessor, viewModel) {\r\n        var defaults = {\r\n            click: function (event, ui) {\r\n                var selected_options = $.map($(element).multiselect(\"getChecked\"), function (a) { return $(a).val() });\r\n                allBindingsAccessor()['selectedOptions'](selected_options);\r\n            }\r\n        };\r\n        var options = $.extend(defaults, valueAccessor());\r\n        allBindingsAccessor()['options'].subscribe(function (value) {\r\n            ko.bindingHandlers.jqMultiSelect.regenerateMultiselect(element, options, viewModel);\r\n        });\r\n        allBindingsAccessor()['selectedOptions'].subscribe(function (value) {\r\n            ko.bindingHandlers.jqMultiSelect.regenerateMultiselect(element, options, viewModel);\r\n        });\r\n    },\r\n    regenerateMultiselect: function (element, options, viewModel) {\r\n        if ($(element).next().hasClass(\"ui-multiselect\")) {\r\n            setTimeout(function () {\r\n                return $(element).multiselect(\"refresh\").multiselectfilter({\r\n                    label: options['filterLabel'] || \"Search: \"\r\n                }); ;\r\n            }, 0);\r\n        } else {\r\n            setTimeout(function () {\r\n                if (options['filter'] === true) {\r\n                    $(element).multiselect(options).multiselectfilter({\r\n                        label: options['filterLabel'] || \"Search: \"\r\n                    });\r\n                } else {\r\n                    $(element).multiselect(options);\r\n                }\r\n                if (options['noChecks'] === true) {\r\n                    $(element).next().next().find(\".ui-helper-reset:first\").remove();\r\n                }\r\n            }, 0);\r\n        }\r\n    }\r\n};\r\n\r\n/** Binding for window dialogs - jQuery UI Dialog Widget\r\n*  http://jqueryui.com/demos/dialog/\r\n*/\r\nko.bindingHandlers.jqDialog = {\r\n    init: function (element, valueAccessor) {\r\n        var defaults = {\r\n            modal: true,\r\n            autoOpen: false,\r\n            closeOnEscape: false\r\n        }\r\n        var options = $.extend(defaults, valueAccessor());\r\n        $(element).dialog(options);\r\n    }\r\n};\r\n\r\n/** jqueryui datepicker\r\n*   http://stackoverflow.com/questions/6612705/jquery-ui-datepicker-change-event-not-caught-by-knockoutjs\r\n*/\r\nko.bindingHandlers.datepicker = {\r\n    init: function (element, valueAccessor, allBindingsAccessor) {\r\n        //initialize datepicker with some optional options\r\n        var options = allBindingsAccessor().datepickerOptions || {},\r\n            $el = $(element);\r\n\r\n        $el.datepicker(options);\r\n\r\n        //handle the field changing\r\n        ko.utils.registerEventHandler(element, \"change\", function () {\r\n            var observable = valueAccessor();\r\n            observable($el.datepicker(\"getDate\"));\r\n        });\r\n\r\n        //handle disposal (if KO removes by the template binding)\r\n        ko.utils.domNodeDisposal.addDisposeCallback(element, function () {\r\n            $el.datepicker(\"destroy\");\r\n        });\r\n\r\n    },\r\n    update: function (element, valueAccessor) {\r\n        var value = ko.utils.unwrapObservable(valueAccessor()),\r\n            $el = $(element);\r\n\r\n        //handle date data coming via json from Microsoft\r\n        if (String(value).indexOf('/Date(') == 0) {\r\n            value = new Date(parseInt(value.replace(/\\/Date\\((.*?)\\)\\//gi, \"$1\")));\r\n        }\r\n\r\n        var current = $el.datepicker(\"getDate\");\r\n\r\n        if (value - current !== 0) {\r\n            $el.datepicker(\"setDate\", value);\r\n        }\r\n    }\r\n};\r\n\r\nko.bindingHandlers.enterkey = {\r\n    init: function (element, valueAccessor, allBindings, viewModel) {\r\n        var callback = valueAccessor();\r\n        $(element).keypress(function (event) {\r\n            var keyCode = (event.which ? event.which : event.keyCode);\r\n            if (keyCode === 13) {\r\n                callback.call(viewModel);\r\n                return false;\r\n            }\r\n            return true;\r\n        });\r\n    }\r\n};\r\n\r\n/** Binding for delayed value update - only fired if user does not hit any key for 300ms.\r\n*  \r\n*/\r\nko.bindingHandlers.debounceValue = {\r\n    init: function (element, valueAccessor, allBindingsAccessor) {\r\n        var currel = element;\r\n        var underlyingObservable = valueAccessor();\r\n        var interceptor = ko.pureComputed({\r\n            read: underlyingObservable,\r\n            write: function (value) {\r\n                clearTimeout(interceptor.timerHandle);\r\n                interceptor.timerHandle = setTimeout(function () {\r\n                    var oldval = underlyingObservable();\r\n                    var currval = currel.value;\r\n                    if (oldval != value && oldval != currval) {\r\n                        underlyingObservable(currval);//currval is the very current value of the input element.\r\n                        //if (console)\r\n                        //    console.log('oldval: ' + oldval + '; currval: ' + currval + '; value: ' + value);\r\n                    }\r\n                }, 300);\r\n            }\r\n        });\r\n        ko.bindingHandlers.value.init(element, function () { return interceptor }, allBindingsAccessor);\r\n    },\r\n    update: ko.bindingHandlers.value.update\r\n};\r\n","//let KO know that we will take care of managing the bindings of our children\r\nko.bindingHandlers.stopBindings = {\r\n    init: function () {\r\n        return { controlsDescendantBindings: true };\r\n    }\r\n};\r\n\r\n//KO 2.1, now allows you to add containerless support for custom bindings\r\nko.virtualElements.allowedBindings.stopBindings = true;","/*\r\n * The MIT License\r\n *\r\n * Copyright (c) 2011 Ken Arnold\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n * THE SOFTWARE.\r\n */\r\n\r\n(function($) {\r\n  $.jog = jog;\r\n\r\n  var n = 0;\r\n  //noinspection JSUnusedGlobalSymbols\r\n  var levels = {\r\n    Fine: n++,\r\n    Debug: n++,\r\n    Info: n++,\r\n    Config:n++,\r\n    Warning:n++,\r\n    Severe: n++,\r\n    Alert: n++,\r\n    Off: n++\r\n  };\r\n  $.extend($.jog, levels);  // create $.jog.Info, etc.\r\n  $.jog.levels = levels;    // create $.jog.levels.Info, etc.\r\n\r\n  var levelNameToNum = {};\r\n  var levelNumToName = {};\r\n\r\n  var uniqueIdSequence = 0;\r\n\r\n  function newUniqueId(name) {\r\n    var time = new Date().getTime();\r\n    var random = Math.random().toPrecision(21);\r\n    var sequence = uniqueIdSequence++;\r\n    return name + ':' + time + ':' + random + ':' + sequence;\r\n  }\r\n\r\n  /**\r\n   * The handler base class. Takes care of the config() method and settings\r\n   * field.\r\n   */\r\n  function Handler(name) {\r\n    this.name = name;\r\n\r\n    this._handlerId = newUniqueId(name);\r\n    this._settings = {};\r\n\r\n    // The method that modifies the configuration fields \r\n    this.config = function(properties, replace) {\r\n      replace = replace != undefined ? replace : false;\r\n      if (properties) {\r\n        if (replace) {\r\n          this._settings = {};\r\n        }\r\n        $.extend(this._settings, properties);\r\n      }\r\n      return $.extend({}, this._settings);\r\n    };\r\n\r\n    this.copy = function(name) {\r\n      name = name || this.name + 'Copy';\r\n      var dup = $.extend(true, {}, this);\r\n      dup._handlerId = newUniqueId(name);\r\n      if (this.copyCleanup) {\r\n        this.copyCleanup(dup);\r\n      }\r\n      return dup;\r\n    };\r\n\r\n    this.level = function(level) {\r\n      if (level != undefined) this._settings.level = level;\r\n      return this._settings.level;\r\n    }\r\n  }\r\n\r\n  function newHandler(name, properties) {\r\n    if (!name) return undefined;\r\n    var handler = new Handler(name);\r\n    if (!properties) {\r\n      throw new Error(\"Property object must be specified\");\r\n    }\r\n    if (typeof(properties.publish) != 'function') {\r\n      throw new Error(\"Handler must have a publish() method\");\r\n    }\r\n    $.extend(handler, properties);\r\n    return handler;\r\n  }\r\n\r\n  $.jog.newHandler = newHandler;\r\n\r\n  // The popup handler needs the location of this jog.js file so it can find the\r\n  // companion logPopup.html file. The following code is borrowed from\r\n  // http://stackoverflow.com/questions/984510/what-is-my-script-src-url/3865126#3865126\r\n  var scriptDir = (function() {\r\n    var scripts = document.getElementsByTagName('script'),\r\n        script = scripts[scripts.length - 1];\r\n\r\n    return script.getAttribute('src', 2).replace('/\\/+[^/]*\\/*$/', '/');\r\n    //this works in all browser even in FF/Chrome/Safari\r\n  }());\r\n\r\n  // The function used by default to insert a container for the log table\r\n  function defaultInsertHtml() {\r\n    var top = $('<div/>');\r\n    $(document.body).append(top);\r\n    return top;\r\n  }\r\n\r\n  var knownHandlers = {\r\n    html: newHandler(\"html\", {\r\n      _settings: {\r\n        idPrefix: 'jog',\r\n        classPrefix: 'jog',\r\n        htmlId: undefined, // by default this is generated from idPrefix\r\n        insertHtml: defaultInsertHtml\r\n      },\r\n      publish: function(area, levelNum, levelName, when, message) {\r\n        this._ensureTable();\r\n        var clsPrefix = this._settings.classPrefix;\r\n\r\n        var levelClass = clsPrefix + '-level-' + levelName;\r\n        var row = $('<tr/>').addClass(levelClass);\r\n        var areaParts = area.split('.');\r\n        var lineage = '';\r\n        for (var i = 0; i < areaParts.length; i++) {\r\n          lineage += '-' + areaParts[i];\r\n          var areaClass = clsPrefix + '-area' + lineage;\r\n          row.addClass(areaClass);\r\n        }\r\n        row.append($('<td class=\"' + clsPrefix + '-area\"/>').text(area));\r\n        row.append($('<td class=\"' + clsPrefix + '-level\"/>').text(levelName));\r\n        row.append($('<td class=\"' + clsPrefix + '-when\"/>').text(when));\r\n        row.append($('<td class=\"' + clsPrefix + '-message\"/>').html(message));\r\n        this._tableBody.prepend(row);\r\n      },\r\n      // Ensure that the table exists, adding it if needed\r\n      _ensureTable: function() {\r\n        if (this._tableBody) return this._tableBody;\r\n\r\n        var idPrefix = this._settings.idPrefix;\r\n        var classPrefix = this._settings.classPrefix;\r\n\r\n        var htmlId = this._settings.htmlId;\r\n        if (!htmlId) {\r\n          htmlId = idPrefix + '-html';\r\n        }\r\n\r\n        // If the top does not exist, create it and add it\r\n        var top = $('#' + htmlId);\r\n        if (!top || top.length == 0) {\r\n          top = this._settings.insertHtml();\r\n          if (top) {\r\n            top = $(top); // make sure it's JQuery-able\r\n          }\r\n          if (!top || top.length == 0) {\r\n            throw Error(\"insertHtml for '\" + htmlId + \"' returns no node\");\r\n          }\r\n          top.attr('id', htmlId);\r\n          this._addedTop = top;\r\n        }\r\n        top.addClass(classPrefix + \"-html\");\r\n\r\n        // If the table already exists, then use it. This typically would only\r\n        // happen if two differently-configured html publishers were writing to\r\n        // the same table; if so, the second one would see the table already\r\n        // existing. I don't recommend that people build pages with this already\r\n        // set up themselves, so I don't document this behavior -- it's internal\r\n        // and subject to change.\r\n        var tableId = idPrefix + '-' + 'table';\r\n        var table = $('#' + tableId);\r\n        if (!table || table.length == 0) {\r\n          // common code for some nodes\r\n          function setup(node, suffix) {\r\n            node.addClass(classPrefix + '-' + suffix);\r\n            node.attr('id', idPrefix + '-' + suffix);\r\n            return node;\r\n          }\r\n\r\n          table = setup($('<table/>'), 'table');\r\n          var header = setup($('<tr/>'), 'header');\r\n\r\n          function headerCell(colName) {\r\n            var cell = $('<th/>');\r\n            cell.text(colName);\r\n            cell.attr('id', idPrefix + '-' + colName.toLowerCase());\r\n            header.append(cell);\r\n          }\r\n\r\n          headerCell('Area');\r\n          headerCell('Level');\r\n          headerCell('When');\r\n          headerCell('Message');\r\n\r\n          top.append(table);\r\n          table.append(header);\r\n          if (!this._addedTop) {\r\n            // If we didn't add the top, the top-most thing added is the table\r\n            this._addedTop = table;\r\n          }\r\n        }\r\n        this._tableBody = top.find('table > tbody');\r\n      },\r\n      destroy: function() {\r\n        if (!this._addedTop) return;\r\n        this._addedTop.remove();\r\n        this.cleanupCopy();\r\n        delete this._addedTop;\r\n        delete this._tableBody;\r\n      },\r\n      cleanupCopy: function() {\r\n        delete this._addedTop;\r\n        delete this._tableBody;\r\n      }\r\n    }),\r\n    popup: newHandler(\"popup\", {\r\n      _settings: {\r\n        title: 'Log Messages',\r\n        css: 'jog.css'\r\n      },\r\n      publish: function(area, levelNum, levelName, when, message) {\r\n        // The message record for sending logs to the popup window\r\n        var logRecord = {\r\n          area: area,\r\n          levelNum: levelNum,\r\n          levelName: levelName,\r\n          when: when,\r\n          message: message\r\n        };\r\n\r\n        // If the window is already up and ready, send it the new log\r\n        if (this._windowReady) {\r\n          this._sendLog(logRecord);\r\n        } else {\r\n          // If the \"pending\" list doesn't exist, this is the first log, so\r\n          // we want to get the popup window started. this.pending holds all log\r\n          // messages that arrive before the popup window is ready to take them.\r\n          if (!this._pending) {\r\n            this._pending = [];\r\n            var self = this;\r\n            var popup;\r\n            // Listen for 'readyMessage' event the popup uses to say it's ready\r\n            $.pm.bind('readyMessage.jog', function() {\r\n              self._popup = popup;\r\n              // When the popup has said it's ready, send the settings ...\r\n              $.pm({\r\n                target: popup,\r\n                type: \"logOptions.jog\",\r\n                data: self._settings\r\n              });\r\n              // ... and then send all pending messages\r\n              self._consumePending();\r\n            });\r\n            // Now that we're ready to receive the 'ready' message, pop it up\r\n            popup = window.open(scriptDir + \"jogPopup.html\", \"Log\");\r\n          }\r\n          // Put the log message in the pending queue until the popup is ready\r\n          this._pending.push(logRecord);\r\n        }\r\n      },\r\n      _consumePending: function() {\r\n        this._windowReady = true;\r\n        while (this._pending.length > 0) {\r\n          var logRecord = this._pending.shift();\r\n          this._sendLog(logRecord);\r\n        }\r\n      },\r\n      _sendLog: function(logRecord) {\r\n        // send a log message to the popup for it to display\r\n        $.pm({\r\n          target: this._popup,\r\n          type: \"logRecord.jog\",\r\n          data: logRecord\r\n        });\r\n      },\r\n      destroy: function() {\r\n        if (!this._popup) return;\r\n        this._popup.close();\r\n        $.pm.unbind('.jog');\r\n        delete this._popup;\r\n        delete this._windowReady;\r\n        delete this._pending;\r\n      },\r\n      cleanupCopy: function() {\r\n        throw Error(\"Popup handler not ready (yet) for multiple copies\");\r\n      }\r\n    }),\r\n    console: newHandler(\"console\", {\r\n      _settings: {\r\n        prefix: '',\r\n        separator: ' - '\r\n      },\r\n      publish: function(area, levelNum, levelName, when, message) {\r\n        if (typeof console === 'undefined'){\r\n            return;\r\n        }\r\n        if (!this._levelMethod) {\r\n          this._levelMethod = [];\r\n          this._levelMethod[levels.Fine] = \"debug\";\r\n          this._levelMethod[levels.Debug] = \"debug\";\r\n          this._levelMethod[levels.Info] = \"info\";\r\n          this._levelMethod[levels.Warning] = \"warn\";\r\n          this._levelMethod[levels.Config] = \"warn\";\r\n          this._levelMethod[levels.Severe] = \"error\";\r\n          this._levelMethod[levels.Alert] = \"error\";\r\n        }\r\n        var prefix = this._settings.prefix;\r\n        if (!prefix) prefix = '';\r\n        if (prefix.length > 0) prefix += ':';\r\n        message = messageText(message);\r\n        var sep = this._settings.separator;\r\n        var method = this._levelMethod[levelNum];\r\n        if (!method || !console[method]) {\r\n          method = \"log\";\r\n        }\r\n        //console[method](prefix + area + sep + levelName + sep + when + sep +\r\n        //    message);\r\n      }\r\n    }),\r\n    alert: newHandler(\"alert\", {\r\n      _settings: {\r\n        level: levels.Alert\r\n      },\r\n      publish: function(area, levelNum, levelName, when, message) {\r\n        message = messageText(message);\r\n        alert(\"Area: \" + area + \"\\n\" + \"Level: \" + levelName + \"\\n\" + \"When: \" +\r\n            when + \"\\n\" + \"Message: \" + message + \"\\n\");\r\n      }\r\n    })\r\n  };\r\n  $.jog.knownHandlers = knownHandlers;\r\n\r\n  // Convert a message to just its text\r\n  function messageText(message) {\r\n    // If it's HTML, extract the text part\r\n    return $('<span>' + message + '</span>').text();\r\n  }\r\n\r\n  // The default time format\r\n  function defaultTimeFormat(when) {\r\n    return when.toLocaleTimeString();\r\n  }\r\n\r\n  // Create the name-to-number and number-to-name maps\r\n  for (var levelName in levels) {\r\n    var levelNum = levels[levelName];\r\n\r\n    levelNumToName[levelNum] = levelName;\r\n\r\n    var ch = levelName.charAt(0);\r\n    levelNameToNum[levelName] = levelNum;\r\n    levelNameToNum[levelName.toUpperCase()] = levelNum;\r\n    levelNameToNum[levelName.toLowerCase()] = levelNum;\r\n    levelNameToNum[ch.toUpperCase()] = levelNum;\r\n    levelNameToNum[ch.toLowerCase()] = levelNum;\r\n  }\r\n\r\n  // Set up the root of all areas, and thereby the default area settings\r\n  var areas = {};\r\n  var areaRoot = new Area('');\r\n  areaRoot.level(levels.Info);\r\n  areaRoot.handlers(knownHandlers.console, knownHandlers.alert);\r\n  areaRoot.toTimeString = defaultTimeFormat;\r\n\r\n  // Reliably convert any string or number to its level number, if it has one\r\n  function toLevelNum(level) {\r\n    if (typeof(level) == 'number') {\r\n      if (level >= levels.Fine && level <= levels.Off) {\r\n        return level;\r\n      }\r\n      throw new Error(\"Level out of range Fine..Off (\" + levels.Fine + \"..\" +\r\n          levels.Off + \")\");\r\n    }\r\n\r\n    // Undefined is sometimes a reasonable value (and we'll accept null)\r\n    if (!level) return undefined;\r\n\r\n    if (typeof(level) == 'object') {\r\n      level = level.toString();\r\n    }\r\n\r\n    if (typeof(level) == 'string') {\r\n      // See if it's \"3\", etc.\r\n      var num = parseInt(level);\r\n      if (!isNaN(num)) {\r\n        // This enforces the validity check for numbers\r\n        return toLevelNum(num);\r\n      }\r\n      num = levelNameToNum[level.charAt(0)];\r\n      if (num == undefined) {\r\n        throw new Error(\"Invalid level name: '\" + level + \"'\");\r\n      }\r\n      return num;\r\n    }\r\n    throw Error(\"Invalid level specifier type: \" + typeof(level));\r\n  }\r\n\r\n  // Reliably convert any string or number to its level name, if it has one\r\n  function toLevelName(level) {\r\n    var levelNum = toLevelNum(level);\r\n    return levelNumToName[levelNum];\r\n  }\r\n\r\n  $.jog.levelName = toLevelName;\r\n\r\n  // Return the object that represents an area\r\n  function jog(area) {\r\n    if (!area)\r\n      return areaRoot;\r\n\r\n    var areaInfo = areas[area];\r\n    if (!areaInfo) {\r\n      areaInfo = new Area(area);\r\n      areas[area] = areaInfo;\r\n    }\r\n    return areaInfo;\r\n  }\r\n\r\n  // The area object represents the behavior of a given area. They are stored\r\n  // for each area, and jog() returns a temporary version that has the current\r\n  // values for an area, including the inherited ones. The methods of this\r\n  // object can be invoked by users directly, so method should be exposed with\r\n  // careful consideration.\r\n  function Area(name) {\r\n    var self = this;\r\n\r\n    this.name = name;\r\n    this._handlers = {}; // the handlers set specifically on this area\r\n    this._useParentHandlers = true;\r\n    this._lineage = []; // the cumulative area names from root to me (see below)\r\n\r\n    function notDerived() {\r\n      if (self._isDerived) throw Error(\"Operation not allowed on derived area\");\r\n    }\r\n\r\n    this.useParentHandlers = function(value) {\r\n      if (value != undefined) {\r\n        notDerived();\r\n        this._useParentHandlers = value;\r\n      }\r\n      return this._useParentHandlers;\r\n    };\r\n\r\n    // Calculate this area's lineage (except for root, which is\r\n    // implicit). This sets the _lineage field to a series of names, from\r\n    // the top down through this area. For example, for the area \"x.y.z\",\r\n    // _lineage would have [\"x\", \"x.y\", \"x.y.z\"].\r\n    (function() {\r\n      var parts = name.split(/\\./);\r\n      for (var i = 0; i < parts.length; i++) {\r\n        if (i == 0) {\r\n          self._lineage.push(parts[i]);\r\n        } else {\r\n          self._lineage.push(self._lineage[i - 1] + '.' + parts[i]);\r\n        }\r\n      }\r\n    })();\r\n\r\n    // Build up the current settings for the area by extending values from\r\n    // ancestors.\r\n    //\r\n    // This is done on the fly for each log message. It could be calculated\r\n    // only if there has been an ancestor changed. That would be faster, but\r\n    // maybe not worth the complexity. (something like how swing components\r\n    // invalidate their layout and those of their descendants if they are\r\n    // changed, and then are recalculated if they are needed but invalid.)\r\n    this.derive = function() {\r\n      // We start at the top (root), and then merge in more and more specific\r\n      // values.\r\n      var info = $.extend(true, {}, areaRoot);\r\n      info._isDerived = true;\r\n\r\n      for (var i = 0; i < this._lineage.length; i++) {\r\n        var areaName = this._lineage[i];\r\n        var areaInfo = areas[areaName];\r\n        if (areaInfo) {\r\n          // If this area cuts off its parent, use only its own handlers\r\n          if (!areaInfo._useParentHandlers) {\r\n            info._handlers = {};\r\n          }\r\n          $.extend(true, info, areaInfo);\r\n        }\r\n      }\r\n      return info;\r\n    };\r\n\r\n    // The actual logging function\r\n    this.log = function(level, message) {\r\n      var levelNum = toLevelNum(level);\r\n\r\n      // Special case, and not just for speed -- An Off shouldn't be shown\r\n      if (levelNum == levels.Off) return false;\r\n\r\n      var derived = (this._isDerived ? this : this.derive());\r\n      if (levelNum < derived._level) return false;\r\n\r\n      // This is how the user can check if a certain level would be logged\r\n      if (!message) return true;\r\n\r\n      notDerived();\r\n      \r\n      // Resolve the message into a simple string so we do it exactly once\r\n      if (typeof(message) == 'function') {\r\n        message = message();\r\n      }\r\n      if (typeof(message) == 'object') {\r\n        message = message.toString();\r\n      }\r\n\r\n      // Generate the messages\r\n      var levelName = levelNumToName[levelNum];\r\n      var when = derived.toTimeString(new Date());\r\n      for (var id in derived._handlers) {\r\n        var handler = derived._handlers[id];\r\n        var handlerLevel = handler._settings.level;\r\n        if (!handlerLevel || handlerLevel <= levelNum) {\r\n          handler.publish(this.name, levelNum, levelName, when, message);\r\n        }\r\n      }\r\n      return true;\r\n    };\r\n\r\n    this.level = function(level) {\r\n      // we check with \"arguments.length\" because \"undefined\" is a valid value\r\n      if (arguments.length == 1) {\r\n        notDerived();\r\n        this._level = toLevelNum(level);\r\n      }\r\n      return this._level;\r\n    };\r\n\r\n    this.addHandlers = function() {\r\n      notDerived();\r\n      for (var i = 0; i < arguments.length; i++) {\r\n        var handler = arguments[i];\r\n        this._handlers[handler._handlerId] = handler;\r\n      }\r\n    };\r\n\r\n    this.removeHandlers = function() {\r\n      notDerived();\r\n      for (var i = 0; i < arguments.length; i++) {\r\n        var handler = arguments[i];\r\n        delete this._handlers[handler._handlerId];\r\n      }\r\n    };\r\n\r\n    this.handlers = function() {\r\n      if (arguments.length != 0) {\r\n        notDerived();\r\n        // set the list of handlers\r\n        this._handlers = {};\r\n        this.addHandlers.apply(this, arguments);\r\n      }\r\n      var current = [];\r\n      for (var id in this._handlers) {\r\n        current.push(this._handlers[id]);\r\n      }\r\n      return current;\r\n    };\r\n\r\n    // Function to implement error(), info(), etc.\r\n    function levelNameFunction(levelNum) {\r\n      return function(message) {\r\n        return this.log(levelNum, message);\r\n      }\r\n    }\r\n\r\n    // Add functions for levels, (area.error(), area.info(), ...).\r\n    for (levelName in levels) {\r\n      // Don't create off() function\r\n      if (levelName == 'Off') continue;\r\n      var functionName = levelName.toLowerCase();\r\n      var levelNum = levelNameToNum[levelName];\r\n      this[functionName] = levelNameFunction(levelNum);\r\n    }\r\n\r\n    this.destroy = function() {\r\n      notDerived();\r\n      for (var id in this._handlers) {\r\n        var handler = this._handlers[id];\r\n        if (handler.destroy) {\r\n          handler.destroy();\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  function destroy() {\r\n    for (var areaName in areas) {\r\n      var areaInfo = areas[areaName];\r\n      areaInfo.destroy();\r\n    }\r\n    areaRoot.destroy();\r\n  }\r\n\r\n  $.jog.destroy = destroy;\r\n\r\n})(jQuery);\r\n"," /*\r\n * jQuery UI selectmenu\r\n *\r\n * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)\r\n * Dual licensed under the MIT (MIT-LICENSE.txt)\r\n * and GPL (GPL-LICENSE.txt) licenses.\r\n *\r\n * http://docs.jquery.com/UI\r\n */\r\n\r\n(function ($) {\r\n\r\n    $.widget(\"ui.selectmenu\", {\r\n        getter: \"value\",\r\n        version: \"1.8\",\r\n        eventPrefix: \"selectmenu\",\r\n        options: {\r\n            transferClasses: true,\r\n            style: 'popup',\r\n            width: null,\r\n            menuWidth: null,\r\n            handleWidth: 26,\r\n            maxHeight: null,\r\n            icons: null,\r\n            format: null\r\n        },\r\n\r\n        _create: function () {\r\n            var self = this, o = this.options;\r\n\r\n            //quick array of button and menu id's\r\n            this.ids = [this.element.attr('id') + '-' + 'button', this.element.attr('id') + '-' + 'menu'];\r\n\r\n            //define safe mouseup for future toggling\r\n            this._safemouseup = true;\r\n\r\n            //create menu button wrapper\r\n            this.newelement = $('<a class=\"' + this.widgetFullName + ' ui-widget utypiaColorDD ui-state-default ui-corner-all\" style=\"' + this.element.attr('style') + '\" id=\"' + this.ids[0] + '\" role=\"button\" href=\"#\" aria-haspopup=\"true\" aria-owns=\"' + this.ids[1] + '\"></a>')\r\n\t\t\t.insertAfter(this.element);\r\n\r\n            //transfer tabindex\r\n            var tabindex = this.element.attr('tabindex');\r\n            if (tabindex) { this.newelement.attr('tabindex', tabindex); }\r\n\r\n            //save reference to select in data for ease in calling methods\r\n            this.newelement.data('selectelement', this.element);\r\n\r\n            //menu icon\r\n            this.selectmenuIcon = $('<span class=\"' + this.widgetFullName + '-icon ui-icon\"><span class=\"ui-arrow\"></span></span>')\r\n\t\t\t.prependTo(this.newelement)\r\n\t\t\t.addClass((o.style == \"popup\") ? 'ui-icon-triangle-2-n-s' : 'ui-icon-triangle-1-s');\r\n\r\n\r\n            //make associated form label trigger focus\r\n            $('label[for=' + this.element.attr('id') + ']')\r\n\t\t\t.attr('for', this.ids[0])\r\n\t\t\t.bind('click', function () {\r\n\t\t\t    self.newelement[0].focus();\r\n\t\t\t    return false;\r\n\t\t\t});\r\n\r\n            //click toggle for menu visibility\r\n            this.newelement\r\n\t\t\t.bind('mousedown', function (event) {\r\n\t\t\t    self._toggle(event);\r\n\t\t\t    //make sure a click won't open/close instantly\r\n\t\t\t    //if (o.style == \"popup\") {\r\n\t\t\t        self._safemouseup = false;\r\n\t\t\t        setTimeout(function () { self._safemouseup = true;  }, 300);\r\n\t\t\t    //}\r\n\t\t\t    return false;\r\n\t\t\t})\r\n\t\t\t.bind('click', function () {\r\n\t\t\t    return false;\r\n\t\t\t})\r\n\t\t\t.keydown(function (event) {\r\n\t\t\t    var ret = true;\r\n\t\t\t    switch (event.keyCode) {\r\n\t\t\t        case $.ui.keyCode.ENTER:\r\n\t\t\t            ret = true;\r\n\t\t\t            break;\r\n\t\t\t        case $.ui.keyCode.SPACE:\r\n\t\t\t            ret = false;\r\n\t\t\t            self._toggle(event);\r\n\t\t\t            break;\r\n\t\t\t        case $.ui.keyCode.UP:\r\n\t\t\t        case $.ui.keyCode.LEFT:\r\n\t\t\t            ret = false;\r\n\t\t\t            self._moveSelection(-1);\r\n\t\t\t            break;\r\n\t\t\t        case $.ui.keyCode.DOWN:\r\n\t\t\t        case $.ui.keyCode.RIGHT:\r\n\t\t\t            ret = false;\r\n\t\t\t            self._moveSelection(1);\r\n\t\t\t            break;\r\n\t\t\t        case $.ui.keyCode.TAB:\r\n\t\t\t            ret = true;\r\n\t\t\t            break;\r\n\t\t\t        default:\r\n\t\t\t            ret = false;\r\n\t\t\t            self._typeAhead(event.keyCode, 'mouseup');\r\n\t\t\t            break;\r\n\t\t\t    }\r\n\t\t\t    return ret;\r\n\t\t\t})\r\n\t\t\t.bind('mouseover focus', function () {\r\n\t\t\t    $(this).addClass(self.widgetFullName + '-focus ui-state-hover');\r\n\t\t\t})\r\n\t\t\t.bind('mouseout blur', function () {\r\n\t\t\t    $(this).removeClass(self.widgetFullName + '-focus ui-state-hover');\r\n\t\t\t});\r\n\r\n            //document click closes menu\r\n            $(document).mousedown(function (event) {\r\n                self.close(event);\r\n            });\r\n\r\n            //change event on original selectmenu\r\n            this.element\r\n\t\t\t.click(function () { this._refreshValue(); })\r\n            // newelement can be null under unclear circumstances in IE8 \r\n\t\t\t.focus(function () { if (this.newelement) { this.newelement[0].focus(); } });\r\n\r\n            //create menu portion, append to body\r\n            var cornerClass = (o.style == \"dropdown\") ? \" ui-corner-bottom\" : \" ui-corner-all\";\r\n            this.list = $('<ul class=\"' + self.widgetFullName + '-menu ui-widget ui-widget-content' + cornerClass + '\" aria-hidden=\"true\" role=\"listbox\" aria-labelledby=\"' + this.ids[0] + '\" id=\"' + this.ids[1] + '\"></ul>').appendTo('body');\r\n\r\n            //serialize selectmenu element options\t\r\n            var selectOptionData = [];\r\n            this.element\r\n\t\t\t.find('option')\r\n\t\t\t.each(function () {\r\n\t\t\t    selectOptionData.push({\r\n\t\t\t        value: $(this).attr('value'),\r\n\t\t\t        text: self._formatText(jQuery(this).text(), this),\r\n\t\t\t        selected: $(this).attr('selected'),\r\n\t\t\t        classes: $(this).attr('class'),\r\n\t\t\t        styles: $(this).attr('style'),\r\n\t\t\t        parentOptGroup: $(this).parent('optgroup').attr('label'),\r\n\t\t\t        title: $(this).attr('title')\r\n\t\t\t    });\r\n\t\t\t});\r\n\r\n            //active state class is only used in popup style\r\n            var activeClass = (self.options.style == \"popup\") ? \" ui-state-active\" : \"\";\r\n\r\n            //write li's\r\n            for (var i = 0; i < selectOptionData.length; i++) {\r\n                var thisLi = $('<li role=\"presentation\"><a href=\"#\" tabindex=\"-1\" role=\"option\" aria-selected=\"false\" style=\"' + selectOptionData[i].styles + '\">' + selectOptionData[i].text + '</a></li>')\r\n\t\t\t\t.data('index', i)\r\n\t\t\t\t.addClass(selectOptionData[i].classes)\r\n\t\t\t\t.data('optionClasses', selectOptionData[i].classes || '')\r\n\t\t\t\t.mouseup(function (event) {\r\n\t\t\t\t    if (self._safemouseup) {\r\n\t\t\t\t        var changed = $(this).data('index') != self._selectedIndex();\r\n\t\t\t\t        self.value($(this).data('index'));\r\n\t\t\t\t        self.select(event);\r\n\t\t\t\t        if (changed) { self.change(event); }\r\n\t\t\t\t        self.close(event, true);\r\n\t\t\t\t    }\t\t\t\t    \r\n\t\t\t\t    return false;\r\n\t\t\t\t})\r\n\t\t\t\t.click(function () {\r\n\t\t\t\t    return false;\r\n\t\t\t\t})\r\n\t\t\t\t.bind('mouseover focus', function () {\r\n\t\t\t\t    self._selectedOptionLi().addClass(activeClass);\r\n\t\t\t\t    self._focusedOptionLi().removeClass(self.widgetFullName + '-item-focus ui-state-hover');\r\n\t\t\t\t    $(this).removeClass('ui-state-active').addClass(self.widgetFullName + '-item-focus ui-state-hover');\r\n\t\t\t\t})\r\n\t\t\t\t.bind('mouseout blur', function () {\r\n\t\t\t\t    if ($(this).is(self._selectedOptionLi())) { $(this).addClass(activeClass); }\r\n\t\t\t\t    $(this).removeClass(self.widgetFullName + '-item-focus ui-state-hover');\r\n\t\t\t\t});\r\n\r\n                //optgroup or not...\r\n                if (selectOptionData[i].parentOptGroup) {\r\n                    // whitespace in the optgroupname must be replaced, otherwise the li of existing optgroups are never found\r\n                    var optGroupName = self.widgetFullName + '-group-' + selectOptionData[i].parentOptGroup.replace(/[^a-zA-Z0-9]/g, \"\");\r\n                    if (this.list.find('li.' + optGroupName).size()) {\r\n                        this.list.find('li.' + optGroupName + ':last ul').append(thisLi);\r\n                    }\r\n                    else {\r\n                        $('<li role=\"presentation\" class=\"' + self.widgetFullName + '-group ' + optGroupName + '\" style=\"' + selectOptionData[i].styles + '\"><span class=\"' + self.widgetFullName + '-group-label\">' + selectOptionData[i].parentOptGroup + '</span><ul></ul></li>')\r\n\t\t\t\t\t\t.appendTo(this.list)\r\n\t\t\t\t\t\t.find('ul')\r\n\t\t\t\t\t\t.append(thisLi);\r\n                    }\r\n                }\r\n                else {\r\n                    thisLi.appendTo(this.list);\r\n                }\r\n\r\n                //this allows for using the scrollbar in an overflowed list\r\n                this.list.bind('mousedown mouseup', function () { return false; });\r\n\r\n                //append icon if option is specified\r\n                if (o.icons) {\r\n                    for (var j in o.icons) {\r\n                        if (thisLi.is(o.icons[j].find)) {\r\n                            thisLi\r\n\t\t\t\t\t\t\t.data('optionClasses', selectOptionData[i].classes + ' ' + self.widgetFullName + '-hasIcon')\r\n\t\t\t\t\t\t\t.addClass(self.widgetFullName + '-hasIcon');\r\n                            var iconClass = o.icons[j].icon || \"\";\r\n\r\n                            thisLi\r\n\t\t\t\t\t\t\t.find('a:eq(0)')\r\n                            //\t\t\t\t\t\t\t.prepend('<span class=\"' + self.widgetFullName + '-item-icon ui-icon ' + iconClass + '\"></span>');\r\n\r\n                            // TODO: Should make using value in title as an image URL an optional feature.\r\n                            // If option has a title attribute, assumes it is a URL to an image. \r\n                            if (selectOptionData[i].title) {\r\n                                //                                thisLi.find(\"span\").css(\"background-image\", \"url(\"+selectOptionData[i].title+\")\");\r\n                                thisLi.find(\"a\").empty().append(\"<img src='\" + selectOptionData[i].title + \"'/>\");\r\n\r\n                                //                                    thisLi.prepend(\"<img src='\" + selectOptionData[i].title + \"'/>\");\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n\r\n            //set dynamic width to fix IE7 bug\r\n            var maxwidth = 0;\r\n            this.list.find('li a').each(function () {\r\n                var currwidth = $(this).width() + 10;\r\n                if (currwidth > maxwidth) maxwidth = currwidth;\r\n            });\r\n            this.newelement.css(\"display\", \"block\");\r\n            var pl = this.newelement.css(\"padding-left\");\r\n            var pr = this.newelement.css(\"padding-right\");\r\n            if ((this.newelement.width() - 10) > maxwidth) maxwidth = this.newelement.width() - 10; //the menu must be at least as long as the status row itself\r\n            this.list.find('li a').width(maxwidth);\r\n\r\n            //add corners to top and bottom menu items\r\n            this.list.find('li:last').addClass(\"ui-corner-bottom\");\r\n            if (o.style == 'popup') { this.list.find('li:first').addClass(\"ui-corner-top\"); }\r\n\r\n            //transfer classes to selectmenu and list\r\n            if (o.transferClasses) {\r\n                var transferClasses = this.element.attr('class') || '';\r\n                this.newelement.add(this.list).addClass(transferClasses);\r\n            }\r\n\r\n            //original selectmenu width\r\n            var selectWidth = this.element.width();\r\n\r\n            //set menu button width\r\n            this.newelement.width((o.width) ? o.width : selectWidth);\r\n\r\n            //set menu width to either menuWidth option value, width option value, or select width \r\n            if (o.style == 'dropdown') { this.list.width((o.menuWidth) ? o.menuWidth : ((o.width) ? o.width : selectWidth)); }\r\n            else { this.list.width((o.menuWidth) ? o.menuWidth : ((o.width) ? o.width - o.handleWidth : selectWidth - o.handleWidth)); }\r\n\r\n            //set max height from option \r\n            if (o.maxHeight && o.maxHeight < this.list.height()) { this.list.height(o.maxHeight); }\r\n\r\n            //save reference to actionable li's (not group label li's)\r\n            this._optionLis = this.list.find('li:not(.' + self.widgetFullName + '-group)');\r\n\r\n            //transfer menu click to menu button\r\n            this.list\r\n\t\t\t.keydown(function (event) {\r\n\t\t\t    var ret = true;\r\n\t\t\t    switch (event.keyCode) {\r\n\t\t\t        // this needs to be fixed as _moveFocus doesnt work correctly           \r\n\t\t\t        /*\r\n\t\t\t        case $.ui.keyCode.UP:\r\n\t\t\t        case $.ui.keyCode.LEFT:\r\n\t\t\t        ret = false;\r\n\t\t\t        self._moveFocus(-1);\r\n\t\t\t        break;\r\n\t\t\t        case $.ui.keyCode.DOWN:\r\n\t\t\t        case $.ui.keyCode.RIGHT:\r\n\t\t\t        ret = false;\r\n\t\t\t        self._moveFocus(1);\r\n\t\t\t        break;\t\r\n\t\t\t        */ \r\n\t\t\t        case $.ui.keyCode.HOME:\r\n\t\t\t            ret = false;\r\n\t\t\t            self._moveFocus(':first');\r\n\t\t\t            break;\r\n\t\t\t        case $.ui.keyCode.PAGE_UP:\r\n\t\t\t            ret = false;\r\n\t\t\t            self._scrollPage('up');\r\n\t\t\t            break;\r\n\t\t\t        case $.ui.keyCode.PAGE_DOWN:\r\n\t\t\t            ret = false;\r\n\t\t\t            self._scrollPage('down');\r\n\t\t\t            break;\r\n\t\t\t        case $.ui.keyCode.END:\r\n\t\t\t            ret = false;\r\n\t\t\t            self._moveFocus(':last');\r\n\t\t\t            break;\r\n\t\t\t        case $.ui.keyCode.ENTER:\r\n\t\t\t        case $.ui.keyCode.SPACE:\r\n\t\t\t            ret = false;\r\n\t\t\t            self.close(event, true);\r\n\t\t\t            $(event.target).parents('li:eq(0)').trigger('mouseup');\r\n\t\t\t            break;\r\n\t\t\t        case $.ui.keyCode.TAB:\r\n\t\t\t            ret = true;\r\n\t\t\t            self.close(event, true);\r\n\t\t\t            break;\r\n\t\t\t        case $.ui.keyCode.ESCAPE:\r\n\t\t\t            ret = false;\r\n\t\t\t            self.close(event, true);\r\n\t\t\t            break;\r\n\t\t\t        default:\r\n\t\t\t            ret = false;\r\n\t\t\t            self._typeAhead(event.keyCode, 'focus');\r\n\t\t\t            break;\r\n\t\t\t    }\r\n\t\t\t    return ret;\r\n\t\t\t});\r\n\r\n            //selectmenu style\r\n            if (o.style == 'dropdown') {\r\n                this.newelement\r\n\t\t\t\t.addClass(self.widgetFullName + \"-dropdown\");\r\n                this.list\r\n\t\t\t\t.addClass(self.widgetFullName + \"-menu-dropdown\");\r\n            }\r\n            else {\r\n                this.newelement\r\n\t\t\t\t.addClass(self.widgetFullName + \"-popup\");\r\n                this.list\r\n\t\t\t\t.addClass(self.widgetFullName + \"-menu-popup\");\r\n            }\r\n\r\n            //append status span to button\r\n            this.newelement.prepend('<span class=\"' + self.widgetFullName + '-status\">' + selectOptionData[this._selectedIndex()].text + '</span>');\r\n\r\n            //hide original selectmenu element\r\n            this.element.hide();\r\n\r\n            //transfer disabled state\r\n            if (this.element.attr('disabled') == true) { this.disable(); }\r\n\r\n            //update value\r\n            this.value(this._selectedIndex());\r\n\r\n            // needed when window is resized\r\n            $(window).resize(function () {\r\n                self._refreshPosition();\r\n            });\r\n        },\r\n        destroy: function () {\r\n            this.element.removeData(this.widgetName)\r\n\t\t\t.removeClass(this.widgetFullName + '-disabled' + ' ' + this.namespace + '-state-disabled')\r\n\t\t\t.removeAttr('aria-disabled')\r\n\t\t\t.unbind(\"click\");\r\n\r\n            //unbind click on label, reset its for attr\r\n            $('label[for=' + this.newelement.attr('id') + ']')\r\n\t\t\t.attr('for', this.element.attr('id'))\r\n\t\t\t.unbind('click');\r\n            this.newelement.remove();\r\n            this.list.remove();\r\n            this.element.show();\r\n\r\n            // call widget destroy function\r\n            $.Widget.prototype.destroy.apply(this, arguments);\r\n        },\r\n        _typeAhead: function (code, eventType) {\r\n            var self = this;\r\n            //define self._prevChar if needed\r\n            if (!self._prevChar) { self._prevChar = ['', 0]; }\r\n            var C = String.fromCharCode(code);\r\n            c = C.toLowerCase();\r\n            var focusFound = false;\r\n            function focusOpt(elem, ind) {\r\n                focusFound = true;\r\n                $(elem).trigger(eventType);\r\n                self._prevChar[1] = ind;\r\n            }\r\n            this.list.find('li a').each(function (i) {\r\n                if (!focusFound) {\r\n                    var thisText = $(this).text();\r\n                    if (thisText.indexOf(C) == 0 || thisText.indexOf(c) == 0) {\r\n                        if (self._prevChar[0] == C) {\r\n                            if (self._prevChar[1] < i) { focusOpt(this, i); }\r\n                        }\r\n                        else { focusOpt(this, i); }\r\n                    }\r\n                }\r\n            });\r\n            this._prevChar[0] = C;\r\n        },\r\n        _uiHash: function () {\r\n            var index = this.value();\r\n            return {\r\n                index: index,\r\n                option: $(\"option\", this.element).get(index),\r\n                value: this.element[0].value\r\n            };\r\n        },\r\n        open: function (event) {\r\n            var self = this;\r\n            var disabledStatus = this.newelement.attr(\"aria-disabled\");\r\n            if (disabledStatus != 'true') {\r\n                this._refreshPosition();\r\n                this._closeOthers(event);\r\n                this.newelement\r\n\t\t\t\t.addClass('ui-state-active');\r\n\r\n                this.list\r\n\t\t\t\t.appendTo('body')\r\n\t\t\t\t.addClass(self.widgetFullName + '-open')\r\n\t\t\t\t.attr('aria-hidden', false)\r\n\t\t\t\t.find('li:not(.' + self.widgetFullName + '-group):eq(' + this._selectedIndex() + ') a')[0].focus();\r\n                if (this.options.style == \"dropdown\") { this.newelement.removeClass('ui-corner-all').addClass('ui-corner-top'); }\r\n                this._refreshPosition();\r\n                this._trigger(\"open\", event, this._uiHash());\r\n            }\r\n        },\r\n        close: function (event, retainFocus) {\r\n            if (this.newelement.is('.ui-state-active')) {\r\n                this.newelement\r\n\t\t\t\t.removeClass('ui-state-active');\r\n                this.list\r\n\t\t\t\t.attr('aria-hidden', true)\r\n\t\t\t\t.removeClass(this.widgetFullName + '-open');\r\n                if (this.options.style == \"dropdown\") { this.newelement.removeClass('ui-corner-top').addClass('ui-corner-all'); }\r\n                if (retainFocus) { this.newelement[0].focus(); }\r\n                this._trigger(\"close\", event, this._uiHash());\r\n            }\r\n        },\r\n        change: function (event) {\r\n            this.element.trigger('change');\r\n            this._trigger(\"change\", event, this._uiHash());\r\n        },\r\n        select: function (event) {\r\n            this._trigger(\"select\", event, this._uiHash());\r\n        },\r\n        _closeOthers: function (event) {\r\n            $('.' + this.widgetFullName + '.ui-state-active').not(this.newelement).each(function () {\r\n                if (($(this).data !== 'undefined') && ($(this).data('selectelement') != null))\r\n                    $(this).data('selectelement').selectmenu('close', event);\r\n            });\r\n            $('.' + this.widgetFullName + '.ui-state-hover').trigger('mouseout');\r\n        },\r\n        _toggle: function (event, retainFocus) {\r\n            if (this.list.is('.' + this.widgetFullName + '-open')) { this.close(event, retainFocus); }\r\n            else { this.open(event); }\r\n        },\r\n        _formatText: function (text, el) {\r\n            return this.options.format ? this.options.format(text, el) : text;\r\n        },\r\n        _selectedIndex: function () {\r\n            return this.element[0].selectedIndex;\r\n        },\r\n        _selectedOptionLi: function () {\r\n            return this._optionLis.eq(this._selectedIndex());\r\n        },\r\n        _focusedOptionLi: function () {\r\n            return this.list.find('.' + this.widgetFullName + '-item-focus');\r\n        },\r\n        _moveSelection: function (amt) {\r\n            var currIndex = parseInt(this._selectedOptionLi().data('index'), 10);\r\n            var newIndex = currIndex + amt;\r\n            return this._optionLis.eq(newIndex).trigger('mouseup');\r\n        },\r\n        _moveFocus: function (amt) {\r\n            if (!isNaN(amt)) {\r\n                var currIndex = parseInt(this._focusedOptionLi().data('index'), 10);\r\n                var newIndex = currIndex + amt;\r\n            }\r\n            else { var newIndex = parseInt(this._optionLis.filter(amt).data('index'), 10); }\r\n\r\n            if (newIndex < 0) { newIndex = 0; }\r\n            if (newIndex > this._optionLis.size() - 1) {\r\n                newIndex = this._optionLis.size() - 1;\r\n            }\r\n            var activeID = this.widgetFullName + '-item-' + Math.round(Math.random() * 1000);\r\n\r\n            this._focusedOptionLi().find('a:eq(0)').attr('id', '');\r\n            this._optionLis.eq(newIndex).find('a:eq(0)').attr('id', activeID)[0].focus();\r\n            this.list.attr('aria-activedescendant', activeID);\r\n        },\r\n        _scrollPage: function (direction) {\r\n            var numPerPage = Math.floor(this.list.outerHeight() / this.list.find('li:first').outerHeight());\r\n            numPerPage = (direction == 'up') ? -numPerPage : numPerPage;\r\n            this._moveFocus(numPerPage);\r\n        },\r\n        _setOption: function (key, value) {\r\n            this.options[key] = value;\r\n            if (key == 'disabled') {\r\n                this.close();\r\n                this.element\r\n\t\t\t\t.add(this.newelement)\r\n\t\t\t\t.add(this.list)\r\n\t\t\t\t\t[value ? 'addClass' : 'removeClass'](\r\n\t\t\t\t\t\tthis.widgetFullName + '-disabled' + ' ' +\r\n\t\t\t\t\t\tthis.namespace + '-state-disabled')\r\n\t\t\t\t\t.attr(\"aria-disabled\", value);\r\n            }\r\n        },\r\n        value: function (newValue) {\r\n            if (arguments.length) {\r\n                this.element[0].selectedIndex = newValue;\r\n                this._refreshValue();\r\n                this._refreshPosition();\r\n            }\r\n            return this.element[0].selectedIndex;\r\n        },\r\n        _refreshValue: function () {\r\n            var activeClass = (this.options.style == \"popup\") ? \" ui-state-active\" : \"\";\r\n            var activeID = this.widgetFullName + '-item-' + Math.round(Math.random() * 1000);\r\n            //deselect previous\r\n            this.list\r\n\t\t\t.find('.' + this.widgetFullName + '-item-selected')\r\n\t\t\t.removeClass(this.widgetFullName + \"-item-selected\" + activeClass)\r\n\t\t\t.find('a')\r\n\t\t\t.attr('aria-selected', 'false')\r\n\t\t\t.attr('id', '');\r\n            //select new\r\n            this._selectedOptionLi()\r\n\t\t\t.addClass(this.widgetFullName + \"-item-selected\" + activeClass)\r\n\t\t\t.find('a')\r\n\t\t\t.attr('aria-selected', 'true')\r\n\t\t\t.attr('id', activeID);\r\n\r\n            //toggle any class brought in from option\r\n            var currentOptionClasses = this.newelement.data('optionClasses') ? this.newelement.data('optionClasses') : \"\";\r\n            var newOptionClasses = this._selectedOptionLi().data('optionClasses') ? this._selectedOptionLi().data('optionClasses') : \"\";\r\n            var optionStyles = '';\r\n            if (('' + this._selectedOptionLi().find('a').attr('style')).length > 0 && this._selectedOptionLi().find('a').attr('style') != undefined)\r\n                optionStyles = 'background:none;' + this._selectedOptionLi().find('a').attr('style');\r\n            \r\n            //ensure no width-style is propagated to the status element\r\n            var tmpoptionstyles = optionStyles.split(\";\");\r\n            var tosi = 0;\r\n            optionStyles = '';\r\n            for (tosi = 0; tosi < tmpoptionstyles.length; tosi++) {\r\n                var curroptst = tmpoptionstyles[tosi];\r\n                if (curroptst != null && curroptst.toLowerCase().indexOf(\"width\") < 0) {\r\n                    optionStyles = optionStyles + curroptst + \";\"\r\n                }\r\n            }\r\n\r\n            this.newelement\r\n\t\t\t.removeClass(currentOptionClasses)\r\n\t\t\t.data('optionClasses', newOptionClasses)\r\n\t\t\t.addClass(newOptionClasses)\r\n            .attr('style', optionStyles)\r\n\t\t\t.find('.' + this.widgetFullName + '-status')\r\n            .attr('style', optionStyles)\r\n\t\t\t.html(\r\n\t\t\t\tthis._selectedOptionLi()\r\n\t\t\t\t\t.find('a:eq(0)')\r\n\t\t\t\t\t.html()\r\n\t\t\t);\r\n\r\n            this.list.attr('aria-activedescendant', activeID);\r\n\r\n        },\r\n        _refreshPosition: function () {\r\n            var self = this, o = this.options;\r\n\r\n            // get some vars\r\n            var pageScroll = self._pageScroll();\r\n            var menuTop = this.newelement.offset().top;\r\n            var viewportHeight = $(window).height();\r\n            var listHeight = $(this.list[0]).outerHeight();\r\n\r\n            // check if there's enough room to expand to the bottom\r\n            if ((menuTop + listHeight) > (viewportHeight + pageScroll)) {\r\n                menuTop -= listHeight;\r\n            } else {\r\n                if (this.newelement.is('.' + this.widgetFullName + '-popup')) {\r\n                    var scrolledAmt = this.list[0].scrollTop;\r\n                    this.list.find('li:lt(' + this._selectedIndex() + ')').each(function () {\r\n                        scrolledAmt -= $(this).outerHeight();\r\n                    });\r\n                    menuTop += scrolledAmt;\r\n                } else {\r\n                    menuTop += this.newelement.height();\r\n                }\r\n            }\r\n            // set values\r\n            this.list.css({\r\n                top: menuTop,\r\n                left: this.newelement.offset().left\r\n            });\r\n        },\r\n        _pageScroll: function () {\r\n            var yScroll;\r\n            if (self.pageYOffset) {\r\n                yScroll = self.pageYOffset;\r\n                // Explorer 6 Strict\r\n            } else if (document.documentElement && document.documentElement.scrollTop) {\r\n                yScroll = document.documentElement.scrollTop;\r\n                // all other Explorers\r\n            } else if (document.body) {\r\n                yScroll = document.body.scrollTop;\r\n            }\r\n            return yScroll;\r\n        }\r\n    });\r\n})(jQuery);","/*############################################################################*/\r\n/*\r\nJS STARTUP\r\n*/\r\n/*############################################################################*/\r\n\r\n$(document).ready(function () {\r\n    //Initialize Dropdowns\r\n    Log_Initialize();\r\n    DropDown_Initialize();\r\n    \r\n    Responsive_Initialize();\r\n});\r\n\r\n//init Responsive Actions\r\nResponsive_Initialize = function () {\r\n    $('#hamburger').each(function () {\r\n        $(this).click(function (e) {\r\n            $(this).parent().toggleClass(\"eat\");\r\n        });\r\n    });\r\n};\r\n\r\n// init the jog plugin\r\nLog_Initialize = function() {\r\n    //if enabled in appsettings\r\n    $.jog().removeHandlers(\"console\");\r\n\r\n    if (enableLogView) {\r\n        $.jog.knownHandlers.html.config({ htmlId: 'logView', insertHtml: Log_InsertHtml() });\r\n        $.jog().handlers($.jog.knownHandlers.html);\r\n\r\n        //postition logview window\r\n        $(\"#logView\").dialog({ position: ['right', 'top'], width: 450, height: 800, maxHeight: 1024 });\r\n    }\r\n};\r\n\r\nLog_InsertHtml = function() {\r\n    var top = $(\"<div id='logView' title='LogView'></div>\");\r\n    $(document.body).append(top);\r\n    return top;\r\n};\r\n\r\nDropDown_Initialize = function () {\r\n    var theQueue = $({});\r\n\r\n    $.theQueue = function(dropDown) {\r\n        theQueue.queue(function() {\r\n            try {\r\n                dropDown.selectmenu({\r\n                    style: 'dropdown',\r\n                    maxHeight: 400,\r\n                    icons: [\r\n                        { find: '.fontOption' }\r\n                    ]\r\n                });\r\n\r\n            } catch(e) {\r\n                alert(e.message);\r\n            }\r\n            $(this).dequeue();\r\n        });\r\n    };\r\n\r\n    $(\"select.smdd\").each(function (idx) {\r\n        $.theQueue($(this));\r\n    });\r\n};\r\n\r\n/**\r\n    * Adds a new parameter to url. \r\n    * Decides how to join the parameter to the url (? vs &).\r\n    *\r\n    * @param url\r\n    * @param param e.g. 'q=test'\r\n    */\r\naddParameterToUrl = function (url, param) {\r\n    _url = url;\r\n    _url += (_url.split('?')[1] ? '&' : '?') + param;\r\n    return _url;\r\n}\r\n\r\n\r\n/** \r\n* Returns true if the user hit Esc or navigated away from the\r\n* current page before an AJAX call was done. (The response\r\n* headers will be null or empty, depending on the browser.) \r\n* \r\n* NOTE: this function is only meaningful when called from \r\n* inside an AJAX \"error\" callback! \r\n* \r\n* The 'xhr' param is an XMLHttpRequest instance. \r\n*/\r\nfunction userAborted(xhr) {\r\n    if (typeof xhr.getAllResponseHeaders === \"function\") {\r\n        return !xhr.getAllResponseHeaders();\r\n\r\n    }\r\n}\r\n",";(function($){var L=$.loading=function(show,opts){return $('body').loading(show,opts,true);};$.fn.loading=function(show,opts,page){opts=toOpts(show,opts);var base=page?$.extend(true,{},L,L.pageOptions):L;return this.each(function(){var $el=$(this),l=$.extend(true,{},base,$.metadata?$el.metadata():null,opts);if(typeof l.onAjax==\"boolean\"){L.setAjax.call($el,l);}else{L.toggle.call($el,l);}});};var fixed={position:$.browser.msie?'absolute':'fixed'};$.extend(L,{version:\"1.5\",align:'top-left',pulse:'working error',mask:false,img:null,element:null,text:'Loading...',onAjax:undefined,delay:0,classname:'loading',imgClass:'loading-img',elementClass:'loading-element',maskClass:'loading-mask',css:{position:'absolute',whiteSpace:'nowrap',zIndex:1001},maskCss:{position:'absolute',opacity:.15,background:'#333',zIndex:101,display:'block',cursor:'wait'},cloneEvents:true,pageOptions:{page:true,align:'top-center',css:fixed,maskCss:fixed},html:'<div></div>',maskHtml:'<div></div>',maskedClass:'loading-masked',maskEvents:'mousedown mouseup keydown keypress',resizeEvents:'resize',working:{time:10000,text:'Still working...',run:function(l){var w=l.working,self=this;w.timeout=setTimeout(function(){self.height('auto').width('auto').text(l.text=w.text);l.place.call(self,l);},w.time);}},error:{time:100000,text:'Task may have failed...',classname:'loading-error',run:function(l){var e=l.error,self=this;e.timeout=setTimeout(function(){self.height('auto').width('auto').text(l.text=e.text).addClass(e.classname);l.place.call(self,l);},e.time);}},fade:{time:800,speed:'slow',run:function(l){var f=l.fade,s=f.speed,self=this;f.interval=setInterval(function(){self.fadeOut(s).fadeIn(s);},f.time);}},ellipsis:{time:300,run:function(l){var e=l.ellipsis,self=this;e.interval=setInterval(function(){var et=self.text(),t=l.text,i=dotIndex(t);self.text((et.length-i)<3?et+'.':t.substring(0,i));},e.time);function dotIndex(t){var x=t.indexOf('.');return x<0?t.length:x;}}},type:{time:100,run:function(l){var t=l.type,self=this;t.interval=setInterval(function(){var e=self.text(),el=e.length,txt=l.text;self.text(el==txt.length?txt.charAt(0):txt.substring(0,el+1));},t.time);}},toggle:function(l){var old=this.data('loading');if(old){if(l.show!==true)old.off.call(this,old,l);}else{if(l.show!==false)l.on.call(this,l);}},setAjax:function(l){if(l.onAjax){var self=this,A=l.ajax={start:function(){l.on.call(self,l);},stop:function(){l.off.call(self,l,l);}};this.bind('ajaxStart.loading',A.start).bind('ajaxStop.loading',A.stop);}else{this.unbind('ajaxStart.loading ajaxStop.loading');}},on:function(l,force){if(l.delay&&!run){var self=this;return l.timeout=setTimeout(function(){l.on.call(self,l,force);delete l.timeout;},l.delay);}\r\nl.parent=this;if(l.mask)l.mask=l.createMask.call(this,l);l.display=l.create.call(this,l);if(l.img){l.initImg.call(this,l);}else if(l.element){l.initElement.call(this,l);}else{l.init.call(this,l);}\r\nthis.trigger('loadingStart',[l]);},initImg:function(l){var self=this;l.img=$('<img src=\"'+l.img+'\"/>').bind('load',function(){l.init.call(self,l);});l.display.addClass(l.imgClass).append(l.img);},initElement:function(l){l.element=$(l.element).clone(l.cloneEvents).show();l.display.addClass(l.elementClass).append(l.element);l.init.call(this,l);},init:function(l){l.place.call(l.display,l);this.data('loading',l);if(l.pulse)l.initPulse.call(this,l);},initPulse:function(l){$.each(l.pulse.split(' '),function(){l[this].run.call(l.display,l);});},create:function(l){var el=$(l.html).addClass(l.classname).css(l.css).appendTo(this);if(l.text&&!l.img&&!l.element)el.text(l.text);$(window).bind(l.resizeEvents,l.resizer=function(){l.resize(l);});return el;},resize:function(l){l.parent.box=null;if(l.mask)l.mask.hide();l.place.call(l.display.hide(),l);if(l.mask)l.mask.show().css(l.parent.box);},createMask:function(l){var box=l.measure.call(this.addClass(l.maskedClass),l);l.handler=function(e){return l.maskHandler(e,l);};$(document).bind(l.maskEvents,l.handler);return $(l.maskHtml).addClass(l.maskClass).css(box).css(l.maskCss).appendTo(this);},maskHandler:function(e,l){var $els=$(e.target).parents().andSelf();if($els.filter('.'+l.classname).length!=0)return true;return!l.page&&$els.filter('.'+l.maskedClass).length==0;},place:function(l){var box=l.align,v='top',h='left';if(typeof box==\"object\"){box=$.extend(l.calc.call(this,v,h,l),box);}else{if(box!='top-left'){var s=box.split('-');if(s.length==1){v=h=s[0];}else{v=s[0];h=s[1];}}\r\nif(!this.hasClass(v))this.addClass(v);if(!this.hasClass(h))this.addClass(h);box=l.calc.call(this,v,h,l);}\r\nthis.show().css(l.box=box);},calc:function(v,h,l){var box=$.extend({},l.measure.call(l.parent,l)),H=$.boxModel?this.height():this.innerHeight(),W=$.boxModel?this.width():this.innerWidth();if(v!='top'){var d=box.height-H;if(v=='center'){d/=2;}else if(v!='bottom'){d=0;}else if($.boxModel){d-=css(this,'paddingTop')+css(this,'paddingBottom');}\r\nbox.top+=d;}\r\nif(h!='left'){var d=box.width-W;if(h=='center'){d/=2;}else if(h!='right'){d=0;}else if($.boxModel){d-=css(this,'paddingLeft')+css(this,'paddingRight');}\r\nbox.left+=d;}\r\nbox.height=H;box.width=W;return box;},measure:function(l){return this.box||(this.box=l.page?l.pageBox(l):l.elementBox(this,l));},elementBox:function(e,l){var box=e.position();box.top+=css(e,'marginTop');box.left+=css(e,'marginLeft');box.height=e.outerHeight();box.width=e.outerWidth();return box;},pageBox:function(l){var d=document,b=d.body,full=$.boxModel&&l.css.position!='fixed',h=full?$(d).height():b.clientHeight,w=full?$(d).width():b.clientWidth;return{top:0,left:0,height:h,width:w};},off:function(old,l){if(old.timeout)return clearTimeout(old.timeout);this.data('loading',null);if(old.pulse)old.stopPulse.call(this,old,l);if(old.mask)old.stopMask.call(this,old,l);$(window).unbind(old.resizeEvents,old.resizer);if(old.display)old.display.remove();if(old.parent)old.parent.trigger('loadingEnd',[old]);},stopPulse:function(old,l){$.each(old.pulse.split(' '),function(){var p=old[this];if(p.end)p.end.call(l.display,old,l);if(p.interval)clearInterval(p.interval);if(p.timeout)clearTimeout(p.timeout);});},stopMask:function(old,l){this.removeClass(l.maskedClass);$(document).unbind(old.maskEvents,old.handler);old.mask.remove();}});L.onAjax=function(opts){$.loading($.extend({onAjax:true},opts));};function toOpts(s,l){if(l===undefined){l=(typeof s==\"boolean\")?{show:s}:s;}else{l.show=s;}\r\nif(l&&(l.img||l.element)&&!l.pulse)l.pulse=false;if(l&&l.onAjax!==undefined&&l.show===undefined)l.show=false;return l;}\r\nfunction css(el,prop){var val=el.css(prop);return val=='auto'?0:parseFloat(val,10);}})(jQuery);","/*!\r\n* jQuery blockUI plugin\r\n* Version 2.65.0-2013.09.02\r\n* Requires jQuery v1.7 or later\r\n*\r\n* Examples at: http://malsup.com/jquery/block/\r\n* Copyright (c) 2007-2013 M. Alsup\r\n* Dual licensed under the MIT and GPL licenses:\r\n* http://www.opensource.org/licenses/mit-license.php\r\n* http://www.gnu.org/licenses/gpl.html\r\n*\r\n* Thanks to Amir-Hossein Sobhi for some excellent contributions!\r\n*/\r\n\r\n; (function () {\r\n    /*jshint eqeqeq:false curly:false latedef:false */\r\n    \"use strict\";\r\n\r\n    function setup($) {\r\n        $.fn._fadeIn = $.fn.fadeIn;\r\n\r\n        var noOp = $.noop || function () { };\r\n\r\n        // this bit is to ensure we don't call setExpression when we shouldn't (with extra muscle to handle\r\n        // confusing userAgent strings on Vista)\r\n        var msie = /MSIE/.test(navigator.userAgent);\r\n        var ie6 = /MSIE 6.0/.test(navigator.userAgent) && !/MSIE 8.0/.test(navigator.userAgent);\r\n        var mode = document.documentMode || 0;\r\n        var setExpr = $.isFunction(document.createElement('div').style.setExpression);\r\n\r\n        // global $ methods for blocking/unblocking the entire page\r\n        $.blockUI = function (opts) { install(window, opts); };\r\n        $.unblockUI = function (opts) { remove(window, opts); };\r\n\r\n        // convenience method for quick growl-like notifications  (http://www.google.com/search?q=growl)\r\n        $.growlUI = function (title, message, timeout, onClose) {\r\n            var $m = $('<div class=\"growlUI\"></div>');\r\n            if (title) $m.append('<h1>' + title + '</h1>');\r\n            if (message) $m.append('<h2>' + message + '</h2>');\r\n            if (timeout === undefined) timeout = 3000;\r\n\r\n            // Added by konapun: Set timeout to 30 seconds if this growl is moused over, like normal toast notifications\r\n            var callBlock = function (opts) {\r\n                opts = opts || {};\r\n\r\n                $.blockUI({\r\n                    message: $m,\r\n                    fadeIn: typeof opts.fadeIn !== 'undefined' ? opts.fadeIn : 700,\r\n                    fadeOut: typeof opts.fadeOut !== 'undefined' ? opts.fadeOut : 1000,\r\n                    timeout: typeof opts.timeout !== 'undefined' ? opts.timeout : timeout,\r\n                    centerY: false,\r\n                    showOverlay: false,\r\n                    onUnblock: onClose,\r\n                    css: $.blockUI.defaults.growlCSS\r\n                });\r\n            };\r\n\r\n            callBlock();\r\n            var nonmousedOpacity = $m.css('opacity');\r\n            $m.mouseover(function () {\r\n                callBlock({\r\n                    fadeIn: 0,\r\n                    timeout: 30000\r\n                });\r\n\r\n                var displayBlock = $('.blockMsg');\r\n                displayBlock.stop(); // cancel fadeout if it has started\r\n                displayBlock.fadeTo(300, 1); // make it easier to read the message by removing transparency\r\n            }).mouseout(function () {\r\n                $('.blockMsg').fadeOut(1000);\r\n            });\r\n            // End konapun additions\r\n        };\r\n\r\n        // plugin method for blocking element content\r\n        $.fn.block = function (opts) {\r\n            if (this[0] === window) {\r\n                $.blockUI(opts);\r\n                return this;\r\n            }\r\n            var fullOpts = $.extend({}, $.blockUI.defaults, opts || {});\r\n            this.each(function () {\r\n                var $el = $(this);\r\n                if (fullOpts.ignoreIfBlocked && $el.data('blockUI.isBlocked'))\r\n                    return;\r\n                $el.unblock({ fadeOut: 0 });\r\n            });\r\n\r\n            return this.each(function () {\r\n                if ($.css(this, 'position') == 'static') {\r\n                    this.style.position = 'relative';\r\n                    $(this).data('blockUI.static', true);\r\n                }\r\n                this.style.zoom = 1; // force 'hasLayout' in ie\r\n                install(this, opts);\r\n            });\r\n        };\r\n\r\n        // plugin method for unblocking element content\r\n        $.fn.unblock = function (opts) {\r\n            if (this[0] === window) {\r\n                $.unblockUI(opts);\r\n                return this;\r\n            }\r\n            return this.each(function () {\r\n                remove(this, opts);\r\n            });\r\n        };\r\n\r\n        $.blockUI.version = 2.65; // 2nd generation blocking at no extra cost!\r\n\r\n        // override these in your code to change the default behavior and style\r\n        $.blockUI.defaults = {\r\n            // message displayed when blocking (use null for no message)\r\n            message: '<h1>Please wait...</h1>',\r\n\r\n            title: null, \t// title string; only used when theme == true\r\n            draggable: true, // only used when theme == true (requires jquery-ui.js to be loaded)\r\n\r\n            theme: false, // set to true to use with jQuery UI themes\r\n\r\n            // styles for the message when blocking; if you wish to disable\r\n            // these and use an external stylesheet then do this in your code:\r\n            // $.blockUI.defaults.css = {};\r\n            css: {\r\n                padding: 0,\r\n                margin: 0,\r\n                width: '30%',\r\n                top: '40%',\r\n                left: '35%',\r\n                textAlign: 'center',\r\n                color: '#000',\r\n                border: '3px solid #aaa',\r\n                backgroundColor: '#fff',\r\n                cursor: 'wait'\r\n            },\r\n\r\n            // minimal style set used when themes are used\r\n            themedCSS: {\r\n                width: '30%',\r\n                top: '40%',\r\n                left: '35%'\r\n            },\r\n\r\n            // styles for the overlay\r\n            overlayCSS: {\r\n                backgroundColor: '#000',\r\n                opacity: 0.6,\r\n                cursor: 'wait'\r\n            },\r\n\r\n            // style to replace wait cursor before unblocking to correct issue\r\n            // of lingering wait cursor\r\n            cursorReset: 'default',\r\n\r\n            // styles applied when using $.growlUI\r\n            growlCSS: {\r\n                width: '350px',\r\n                top: '10px',\r\n                left: '',\r\n                right: '10px',\r\n                border: 'none',\r\n                padding: '5px',\r\n                opacity: 0.6,\r\n                cursor: 'default',\r\n                color: '#fff',\r\n                backgroundColor: '#000',\r\n                '-webkit-border-radius': '10px',\r\n                '-moz-border-radius': '10px',\r\n                'border-radius': '10px'\r\n            },\r\n\r\n            // IE issues: 'about:blank' fails on HTTPS and javascript:false is s-l-o-w\r\n            // (hat tip to Jorge H. N. de Vasconcelos)\r\n            /*jshint scripturl:true */\r\n            iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank',\r\n\r\n            // force usage of iframe in non-IE browsers (handy for blocking applets)\r\n            forceIframe: false,\r\n\r\n            // z-index for the blocking overlay\r\n            baseZ: 1000,\r\n\r\n            // set these to true to have the message automatically centered\r\n            centerX: true, // <-- only effects element blocking (page block controlled via css above)\r\n            centerY: true,\r\n\r\n            // allow body element to be stetched in ie6; this makes blocking look better\r\n            // on \"short\" pages.  disable if you wish to prevent changes to the body height\r\n            allowBodyStretch: true,\r\n\r\n            // enable if you want key and mouse events to be disabled for content that is blocked\r\n            bindEvents: true,\r\n\r\n            // be default blockUI will supress tab navigation from leaving blocking content\r\n            // (if bindEvents is true)\r\n            constrainTabKey: true,\r\n\r\n            // fadeIn time in millis; set to 0 to disable fadeIn on block\r\n            fadeIn: 200,\r\n\r\n            // fadeOut time in millis; set to 0 to disable fadeOut on unblock\r\n            fadeOut: 400,\r\n\r\n            // time in millis to wait before auto-unblocking; set to 0 to disable auto-unblock\r\n            timeout: 0,\r\n\r\n            // disable if you don't want to show the overlay\r\n            showOverlay: true,\r\n\r\n            // if true, focus will be placed in the first available input field when\r\n            // page blocking\r\n            focusInput: true,\r\n\r\n            // elements that can receive focus\r\n            focusableElements: ':input:enabled:visible',\r\n\r\n            // suppresses the use of overlay styles on FF/Linux (due to performance issues with opacity)\r\n            // no longer needed in 2012\r\n            // applyPlatformOpacityRules: true,\r\n\r\n            // callback method invoked when fadeIn has completed and blocking message is visible\r\n            onBlock: null,\r\n\r\n            // callback method invoked when unblocking has completed; the callback is\r\n            // passed the element that has been unblocked (which is the window object for page\r\n            // blocks) and the options that were passed to the unblock call:\r\n            //\tonUnblock(element, options)\r\n            onUnblock: null,\r\n\r\n            // callback method invoked when the overlay area is clicked.\r\n            // setting this will turn the cursor to a pointer, otherwise cursor defined in overlayCss will be used.\r\n            onOverlayClick: null,\r\n\r\n            // don't ask; if you really must know: http://groups.google.com/group/jquery-en/browse_thread/thread/36640a8730503595/2f6a79a77a78e493#2f6a79a77a78e493\r\n            quirksmodeOffsetHack: 4,\r\n\r\n            // class name of the message block\r\n            blockMsgClass: 'blockMsg',\r\n\r\n            // if it is already blocked, then ignore it (don't unblock and reblock)\r\n            ignoreIfBlocked: false\r\n        };\r\n\r\n        // private data and functions follow...\r\n\r\n        var pageBlock = null;\r\n        var pageBlockEls = [];\r\n\r\n        function install(el, opts) {\r\n            var css, themedCSS;\r\n            var full = (el == window);\r\n            var msg = (opts && opts.message !== undefined ? opts.message : undefined);\r\n            opts = $.extend({}, $.blockUI.defaults, opts || {});\r\n\r\n            if (opts.ignoreIfBlocked && $(el).data('blockUI.isBlocked'))\r\n                return;\r\n\r\n            opts.overlayCSS = $.extend({}, $.blockUI.defaults.overlayCSS, opts.overlayCSS || {});\r\n            css = $.extend({}, $.blockUI.defaults.css, opts.css || {});\r\n            if (opts.onOverlayClick)\r\n                opts.overlayCSS.cursor = 'pointer';\r\n\r\n            themedCSS = $.extend({}, $.blockUI.defaults.themedCSS, opts.themedCSS || {});\r\n            msg = msg === undefined ? opts.message : msg;\r\n\r\n            // remove the current block (if there is one)\r\n            if (full && pageBlock)\r\n                remove(window, { fadeOut: 0 });\r\n\r\n            // if an existing element is being used as the blocking content then we capture\r\n            // its current place in the DOM (and current display style) so we can restore\r\n            // it when we unblock\r\n            if (msg && typeof msg != 'string' && (msg.parentNode || msg.jquery)) {\r\n                var node = msg.jquery ? msg[0] : msg;\r\n                var data = {};\r\n                $(el).data('blockUI.history', data);\r\n                data.el = node;\r\n                data.parent = node.parentNode;\r\n                data.display = node.style.display;\r\n                data.position = node.style.position;\r\n                if (data.parent)\r\n                    data.parent.removeChild(node);\r\n            }\r\n\r\n            $(el).data('blockUI.onUnblock', opts.onUnblock);\r\n            var z = opts.baseZ;\r\n\r\n            // blockUI uses 3 layers for blocking, for simplicity they are all used on every platform;\r\n            // layer1 is the iframe layer which is used to supress bleed through of underlying content\r\n            // layer2 is the overlay layer which has opacity and a wait cursor (by default)\r\n            // layer3 is the message content that is displayed while blocking\r\n            var lyr1, lyr2, lyr3, s;\r\n            if (msie || opts.forceIframe)\r\n                lyr1 = $('<iframe class=\"blockUI\" style=\"z-index:' + (z++) + ';display:none;border:none;margin:0;padding:0;position:absolute;width:100%;height:100%;top:0;left:0\" src=\"' + opts.iframeSrc + '\"></iframe>');\r\n            else\r\n                lyr1 = $('<div class=\"blockUI\" style=\"display:none\"></div>');\r\n\r\n            if (opts.theme)\r\n                lyr2 = $('<div class=\"blockUI blockOverlay ui-widget-overlay\" style=\"z-index:' + (z++) + ';display:none\"></div>');\r\n            else\r\n                lyr2 = $('<div class=\"blockUI blockOverlay\" style=\"z-index:' + (z++) + ';display:none;border:none;margin:0;padding:0;width:100%;height:100%;top:0;left:0\"></div>');\r\n\r\n            if (opts.theme && full) {\r\n                s = '<div class=\"blockUI ' + opts.blockMsgClass + ' blockPage ui-dialog ui-widget ui-corner-all\" style=\"z-index:' + (z + 10) + ';display:none;position:fixed\">';\r\n                if (opts.title) {\r\n                    s += '<div class=\"ui-widget-header ui-dialog-titlebar ui-corner-all blockTitle\">' + (opts.title || '&nbsp;') + '</div>';\r\n                }\r\n                s += '<div class=\"ui-widget-content ui-dialog-content\"></div>';\r\n                s += '</div>';\r\n            }\r\n            else if (opts.theme) {\r\n                s = '<div class=\"blockUI ' + opts.blockMsgClass + ' blockElement ui-dialog ui-widget ui-corner-all\" style=\"z-index:' + (z + 10) + ';display:none;position:absolute\">';\r\n                if (opts.title) {\r\n                    s += '<div class=\"ui-widget-header ui-dialog-titlebar ui-corner-all blockTitle\">' + (opts.title || '&nbsp;') + '</div>';\r\n                }\r\n                s += '<div class=\"ui-widget-content ui-dialog-content\"></div>';\r\n                s += '</div>';\r\n            }\r\n            else if (full) {\r\n                s = '<div class=\"blockUI ' + opts.blockMsgClass + ' blockPage\" style=\"z-index:' + (z + 10) + ';display:none;position:fixed\"></div>';\r\n            }\r\n            else {\r\n                s = '<div class=\"blockUI ' + opts.blockMsgClass + ' blockElement\" style=\"z-index:' + (z + 10) + ';display:none;position:absolute\"></div>';\r\n            }\r\n            lyr3 = $(s);\r\n\r\n            // if we have a message, style it\r\n            if (msg) {\r\n                if (opts.theme) {\r\n                    lyr3.css(themedCSS);\r\n                    lyr3.addClass('ui-widget-content');\r\n                }\r\n                else\r\n                    lyr3.css(css);\r\n            }\r\n\r\n            // style the overlay\r\n            if (!opts.theme /*&& (!opts.applyPlatformOpacityRules)*/)\r\n                lyr2.css(opts.overlayCSS);\r\n            lyr2.css('position', full ? 'fixed' : 'absolute');\r\n\r\n            // make iframe layer transparent in IE\r\n            if (msie || opts.forceIframe)\r\n                lyr1.css('opacity', 0.0);\r\n\r\n            //$([lyr1[0],lyr2[0],lyr3[0]]).appendTo(full ? 'body' : el);\r\n            var layers = [lyr1, lyr2, lyr3], $par = full ? $('body') : $(el);\r\n            $.each(layers, function () {\r\n                this.appendTo($par);\r\n            });\r\n\r\n            if (opts.theme && opts.draggable && $.fn.draggable) {\r\n                lyr3.draggable({\r\n                    handle: '.ui-dialog-titlebar',\r\n                    cancel: 'li'\r\n                });\r\n            }\r\n\r\n            // ie7 must use absolute positioning in quirks mode and to account for activex issues (when scrolling)\r\n            var expr = setExpr && (!$.support.boxModel || $('object,embed', full ? null : el).length > 0);\r\n            if (ie6 || expr) {\r\n                // give body 100% height\r\n                if (full && opts.allowBodyStretch && $.support.boxModel)\r\n                    $('html,body').css('height', '100%');\r\n\r\n                // fix ie6 issue when blocked element has a border width\r\n                if ((ie6 || !$.support.boxModel) && !full) {\r\n                    var t = sz(el, 'borderTopWidth'), l = sz(el, 'borderLeftWidth');\r\n                    var fixT = t ? '(0 - ' + t + ')' : 0;\r\n                    var fixL = l ? '(0 - ' + l + ')' : 0;\r\n                }\r\n\r\n                // simulate fixed position\r\n                $.each(layers, function (i, o) {\r\n                    var s = o[0].style;\r\n                    s.position = 'absolute';\r\n                    if (i < 2) {\r\n                        if (full)\r\n                            s.setExpression('height', 'Math.max(document.body.scrollHeight, document.body.offsetHeight) - (jQuery.support.boxModel?0:' + opts.quirksmodeOffsetHack + ') + \"px\"');\r\n                        else\r\n                            s.setExpression('height', 'this.parentNode.offsetHeight + \"px\"');\r\n                        if (full)\r\n                            s.setExpression('width', 'jQuery.support.boxModel && document.documentElement.clientWidth || document.body.clientWidth + \"px\"');\r\n                        else\r\n                            s.setExpression('width', 'this.parentNode.offsetWidth + \"px\"');\r\n                        if (fixL) s.setExpression('left', fixL);\r\n                        if (fixT) s.setExpression('top', fixT);\r\n                    }\r\n                    else if (opts.centerY) {\r\n                        if (full) s.setExpression('top', '(document.documentElement.clientHeight || document.body.clientHeight) / 2 - (this.offsetHeight / 2) + (blah = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + \"px\"');\r\n                        s.marginTop = 0;\r\n                    }\r\n                    else if (!opts.centerY && full) {\r\n                        var top = (opts.css && opts.css.top) ? parseInt(opts.css.top, 10) : 0;\r\n                        var expression = '((document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + ' + top + ') + \"px\"';\r\n                        s.setExpression('top', expression);\r\n                    }\r\n                });\r\n            }\r\n\r\n            // show the message\r\n            if (msg) {\r\n                if (opts.theme)\r\n                    lyr3.find('.ui-widget-content').append(msg);\r\n                else\r\n                    lyr3.append(msg);\r\n                if (msg.jquery || msg.nodeType)\r\n                    $(msg).show();\r\n            }\r\n\r\n            if ((msie || opts.forceIframe) && opts.showOverlay)\r\n                lyr1.show(); // opacity is zero\r\n            if (opts.fadeIn) {\r\n                var cb = opts.onBlock ? opts.onBlock : noOp;\r\n                var cb1 = (opts.showOverlay && !msg) ? cb : noOp;\r\n                var cb2 = msg ? cb : noOp;\r\n                if (opts.showOverlay)\r\n                    lyr2._fadeIn(opts.fadeIn, cb1);\r\n                if (msg)\r\n                    lyr3._fadeIn(opts.fadeIn, cb2);\r\n            }\r\n            else {\r\n                if (opts.showOverlay)\r\n                    lyr2.show();\r\n                if (msg)\r\n                    lyr3.show();\r\n                if (opts.onBlock)\r\n                    opts.onBlock();\r\n            }\r\n\r\n            // bind key and mouse events\r\n            bind(1, el, opts);\r\n\r\n            if (full) {\r\n                pageBlock = lyr3[0];\r\n                pageBlockEls = $(opts.focusableElements, pageBlock);\r\n                if (opts.focusInput)\r\n                    setTimeout(focus, 20);\r\n            }\r\n            else\r\n                center(lyr3[0], opts.centerX, opts.centerY);\r\n\r\n            if (opts.timeout) {\r\n                // auto-unblock\r\n                var to = setTimeout(function () {\r\n                    if (full)\r\n                        $.unblockUI(opts);\r\n                    else\r\n                        $(el).unblock(opts);\r\n                }, opts.timeout);\r\n                $(el).data('blockUI.timeout', to);\r\n            }\r\n        }\r\n\r\n        // remove the block\r\n        function remove(el, opts) {\r\n            var count;\r\n            var full = (el == window);\r\n            var $el = $(el);\r\n            var data = $el.data('blockUI.history');\r\n            var to = $el.data('blockUI.timeout');\r\n            if (to) {\r\n                clearTimeout(to);\r\n                $el.removeData('blockUI.timeout');\r\n            }\r\n            opts = $.extend({}, $.blockUI.defaults, opts || {});\r\n            bind(0, el, opts); // unbind events\r\n\r\n            if (opts.onUnblock === null) {\r\n                opts.onUnblock = $el.data('blockUI.onUnblock');\r\n                $el.removeData('blockUI.onUnblock');\r\n            }\r\n\r\n            var els;\r\n            if (full) // crazy selector to handle odd field errors in ie6/7\r\n                els = $('body').children().filter('.blockUI').add('body > .blockUI');\r\n            else\r\n                els = $el.find('>.blockUI');\r\n\r\n            // fix cursor issue\r\n            if (opts.cursorReset) {\r\n                if (els.length > 1)\r\n                    els[1].style.cursor = opts.cursorReset;\r\n                if (els.length > 2)\r\n                    els[2].style.cursor = opts.cursorReset;\r\n            }\r\n\r\n            if (full)\r\n                pageBlock = pageBlockEls = null;\r\n\r\n            if (opts.fadeOut) {\r\n                count = els.length;\r\n                els.stop().fadeOut(opts.fadeOut, function () {\r\n                    if (--count === 0)\r\n                        reset(els, data, opts, el);\r\n                });\r\n            }\r\n            else\r\n                reset(els, data, opts, el);\r\n        }\r\n\r\n        // move blocking element back into the DOM where it started\r\n        function reset(els, data, opts, el) {\r\n            var $el = $(el);\r\n            if ($el.data('blockUI.isBlocked'))\r\n                return;\r\n\r\n            els.each(function (i, o) {\r\n                // remove via DOM calls so we don't lose event handlers\r\n                if (this.parentNode)\r\n                    this.parentNode.removeChild(this);\r\n            });\r\n\r\n            if (data && data.el) {\r\n                data.el.style.display = data.display;\r\n                data.el.style.position = data.position;\r\n                if (data.parent)\r\n                    data.parent.appendChild(data.el);\r\n                $el.removeData('blockUI.history');\r\n            }\r\n\r\n            if ($el.data('blockUI.static')) {\r\n                $el.css('position', 'static'); // #22\r\n            }\r\n\r\n            if (typeof opts.onUnblock == 'function')\r\n                opts.onUnblock(el, opts);\r\n\r\n            // fix issue in Safari 6 where block artifacts remain until reflow\r\n            var body = $(document.body), w = body.width(), cssW = body[0].style.width;\r\n            body.width(w - 1).width(w);\r\n            body[0].style.width = cssW;\r\n        }\r\n\r\n        // bind/unbind the handler\r\n        function bind(b, el, opts) {\r\n            var full = el == window, $el = $(el);\r\n\r\n            // don't bother unbinding if there is nothing to unbind\r\n            if (!b && (full && !pageBlock || !full && !$el.data('blockUI.isBlocked')))\r\n                return;\r\n\r\n            $el.data('blockUI.isBlocked', b);\r\n\r\n            // don't bind events when overlay is not in use or if bindEvents is false\r\n            if (!full || !opts.bindEvents || (b && !opts.showOverlay))\r\n                return;\r\n\r\n            // bind anchors and inputs for mouse and key events\r\n            var events = 'mousedown mouseup keydown keypress keyup touchstart touchend touchmove';\r\n            if (b)\r\n                $(document).bind(events, opts, handler);\r\n            else\r\n                $(document).unbind(events, handler);\r\n\r\n            // former impl...\r\n            //\t\tvar $e = $('a,:input');\r\n            //\t\tb ? $e.bind(events, opts, handler) : $e.unbind(events, handler);\r\n        }\r\n\r\n        // event handler to suppress keyboard/mouse events when blocking\r\n        function handler(e) {\r\n            // allow tab navigation (conditionally)\r\n            if (e.type === 'keydown' && e.keyCode && e.keyCode == 9) {\r\n                if (pageBlock && e.data.constrainTabKey) {\r\n                    var els = pageBlockEls;\r\n                    var fwd = !e.shiftKey && e.target === els[els.length - 1];\r\n                    var back = e.shiftKey && e.target === els[0];\r\n                    if (fwd || back) {\r\n                        setTimeout(function () { focus(back); }, 10);\r\n                        return false;\r\n                    }\r\n                }\r\n            }\r\n            var opts = e.data;\r\n            var target = $(e.target);\r\n            if (target.hasClass('blockOverlay') && opts.onOverlayClick)\r\n                opts.onOverlayClick();\r\n\r\n            // allow events within the message content\r\n            if (target.parents('div.' + opts.blockMsgClass).length > 0)\r\n                return true;\r\n\r\n            // allow events for content that is not being blocked\r\n            return target.parents().children().filter('div.blockUI').length === 0;\r\n        }\r\n\r\n        function focus(back) {\r\n            if (!pageBlockEls)\r\n                return;\r\n            var e = pageBlockEls[back === true ? pageBlockEls.length - 1 : 0];\r\n            if (e)\r\n                e.focus();\r\n        }\r\n\r\n        function center(el, x, y) {\r\n            var p = el.parentNode, s = el.style;\r\n            var l = ((p.offsetWidth - el.offsetWidth) / 2) - sz(p, 'borderLeftWidth');\r\n            var t = ((p.offsetHeight - el.offsetHeight) / 2) - sz(p, 'borderTopWidth');\r\n            if (x) s.left = l > 0 ? (l + 'px') : '0';\r\n            if (y) s.top = t > 0 ? (t + 'px') : '0';\r\n        }\r\n\r\n        function sz(el, p) {\r\n            return parseInt($.css(el, p), 10) || 0;\r\n        }\r\n\r\n    }\r\n\r\n\r\n    /*global define:true */\r\n    if (typeof define === 'function' && define.amd && define.amd.jQuery) {\r\n        define(['jquery'], setup);\r\n    } else {\r\n        setup(jQuery);\r\n    }\r\n\r\n})();\r\n\r\n","jQuery.fn.extend({\r\n\teveryTime: function(interval, label, fn, times, belay) {\r\n\t\treturn this.each(function() {\r\n\t\t\tjQuery.timer.add(this, interval, label, fn, times, belay);\r\n\t\t});\r\n\t},\r\n\toneTime: function(interval, label, fn) {\r\n\t\treturn this.each(function() {\r\n\t\t\tjQuery.timer.add(this, interval, label, fn, 1);\r\n\t\t});\r\n\t},\r\n\tstopTime: function(label, fn) {\r\n\t\treturn this.each(function() {\r\n\t\t\tjQuery.timer.remove(this, label, fn);\r\n\t\t});\r\n\t}\r\n});\r\n\r\njQuery.extend({\r\n\ttimer: {\r\n\t\tguid: 1,\r\n\t\tglobal: {},\r\n\t\tregex: /^([0-9]+)\\s*(.*s)?$/,\r\n\t\tpowers: {\r\n\t\t\t// Yeah this is major overkill...\r\n\t\t\t'ms': 1,\r\n\t\t\t'cs': 10,\r\n\t\t\t'ds': 100,\r\n\t\t\t's': 1000,\r\n\t\t\t'das': 10000,\r\n\t\t\t'hs': 100000,\r\n\t\t\t'ks': 1000000\r\n\t\t},\r\n\t\ttimeParse: function(value) {\r\n\t\t\tif (value == undefined || value == null)\r\n\t\t\t\treturn null;\r\n\t\t\tvar result = this.regex.exec(jQuery.trim(value.toString()));\r\n\t\t\tif (result[2]) {\r\n\t\t\t\tvar num = parseInt(result[1], 10);\r\n\t\t\t\tvar mult = this.powers[result[2]] || 1;\r\n\t\t\t\treturn num * mult;\r\n\t\t\t} else {\r\n\t\t\t\treturn value;\r\n\t\t\t}\r\n\t\t},\r\n\t\tadd: function(element, interval, label, fn, times, belay) {\r\n\t\t\tvar counter = 0;\r\n\t\t\t\r\n\t\t\tif (jQuery.isFunction(label)) {\r\n\t\t\t\tif (!times) \r\n\t\t\t\t\ttimes = fn;\r\n\t\t\t\tfn = label;\r\n\t\t\t\tlabel = interval;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tinterval = jQuery.timer.timeParse(interval);\r\n\r\n\t\t\tif (typeof interval != 'number' || isNaN(interval) || interval <= 0)\r\n\t\t\t\treturn;\r\n\r\n\t\t\tif (times && times.constructor != Number) {\r\n\t\t\t\tbelay = !!times;\r\n\t\t\t\ttimes = 0;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\ttimes = times || 0;\r\n\t\t\tbelay = belay || false;\r\n\t\t\t\r\n\t\t\tif (!element.$timers) \r\n\t\t\t\telement.$timers = {};\r\n\t\t\t\r\n\t\t\tif (!element.$timers[label])\r\n\t\t\t\telement.$timers[label] = {};\r\n\t\t\t\r\n\t\t\tfn.$timerID = fn.$timerID || this.guid++;\r\n\t\t\t\r\n\t\t\tvar handler = function() {\r\n\t\t\t\tif (belay && this.inProgress) \r\n\t\t\t\t\treturn;\r\n\t\t\t\tthis.inProgress = true;\r\n\t\t\t\tif ((++counter > times && times !== 0) || fn.call(element, counter) === false)\r\n\t\t\t\t\tjQuery.timer.remove(element, label, fn);\r\n\t\t\t\tthis.inProgress = false;\r\n\t\t\t};\r\n\t\t\t\r\n\t\t\thandler.$timerID = fn.$timerID;\r\n\t\t\t\r\n\t\t\tif (!element.$timers[label][fn.$timerID]) \r\n\t\t\t\telement.$timers[label][fn.$timerID] = window.setInterval(handler,interval);\r\n\t\t\t\r\n\t\t\tif ( !this.global[label] )\r\n\t\t\t\tthis.global[label] = [];\r\n\t\t\tthis.global[label].push( element );\r\n\t\t\t\r\n\t\t},\r\n\t\tremove: function(element, label, fn) {\r\n\t\t\tvar timers = element.$timers, ret;\r\n\t\t\t\r\n\t\t\tif ( timers ) {\r\n\t\t\t\t\r\n\t\t\t\tif (!label) {\r\n\t\t\t\t\tfor ( label in timers )\r\n\t\t\t\t\t\tthis.remove(element, label, fn);\r\n\t\t\t\t} else if ( timers[label] ) {\r\n\t\t\t\t\tif ( fn ) {\r\n\t\t\t\t\t\tif ( fn.$timerID ) {\r\n\t\t\t\t\t\t\twindow.clearInterval(timers[label][fn.$timerID]);\r\n\t\t\t\t\t\t\tdelete timers[label][fn.$timerID];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tfor ( var fn in timers[label] ) {\r\n\t\t\t\t\t\t\twindow.clearInterval(timers[label][fn]);\r\n\t\t\t\t\t\t\tdelete timers[label][fn];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t\tfor ( ret in timers[label] ) break;\r\n\t\t\t\t\tif ( !ret ) {\r\n\t\t\t\t\t\tret = null;\r\n\t\t\t\t\t\tdelete timers[label];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tfor ( ret in timers ) break;\r\n\t\t\t\tif ( !ret ) \r\n\t\t\t\t\telement.$timers = null;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n});\r\n\r\nif (jQuery.browser.msie)\r\n\tjQuery(window).one(\"unload\", function() {\r\n\t\tvar global = jQuery.timer.global;\r\n\t\tfor ( var label in global ) {\r\n\t\t\tvar els = global[label], i = els.length;\r\n\t\t\twhile ( --i )\r\n\t\t\t\tjQuery.timer.remove(els[i], label);\r\n\t\t}\r\n\t});\r\n\r\n\r\n","/*\r\n * jQuery BBQ: Back Button & Query Library - v1.2.1 - 2/17/2010\r\n * http://benalman.com/projects/jquery-bbq-plugin/\r\n * \r\n * Copyright (c) 2010 \"Cowboy\" Ben Alman\r\n * Dual licensed under the MIT and GPL licenses.\r\n * http://benalman.com/about/license/\r\n */\r\n(function($,p){var i,m=Array.prototype.slice,r=decodeURIComponent,a=$.param,c,l,v,b=$.bbq=$.bbq||{},q,u,j,e=$.event.special,d=\"hashchange\",A=\"querystring\",D=\"fragment\",y=\"elemUrlAttr\",g=\"location\",k=\"href\",t=\"src\",x=/^.*\\?|#.*$/g,w=/^.*\\#/,h,C={};function E(F){return typeof F===\"string\"}function B(G){var F=m.call(arguments,1);return function(){return G.apply(this,F.concat(m.call(arguments)))}}function n(F){return F.replace(/^[^#]*#?(.*)$/,\"$1\")}function o(F){return F.replace(/(?:^[^?#]*\\?([^#]*).*$)?.*/,\"$1\")}function f(H,M,F,I,G){var O,L,K,N,J;if(I!==i){K=F.match(H?/^([^#]*)\\#?(.*)$/:/^([^#?]*)\\??([^#]*)(#?.*)/);J=K[3]||\"\";if(G===2&&E(I)){L=I.replace(H?w:x,\"\")}else{N=l(K[2]);I=E(I)?l[H?D:A](I):I;L=G===2?I:G===1?$.extend({},I,N):$.extend({},N,I);L=a(L);if(H){L=L.replace(h,r)}}O=K[1]+(H?\"#\":L||!K[1]?\"?\":\"\")+L+J}else{O=M(F!==i?F:p[g][k])}return O}a[A]=B(f,0,o);a[D]=c=B(f,1,n);c.noEscape=function(G){G=G||\"\";var F=$.map(G.split(\"\"),encodeURIComponent);h=new RegExp(F.join(\"|\"),\"g\")};c.noEscape(\",/\");$.deparam=l=function(I,F){var H={},G={\"true\":!0,\"false\":!1,\"null\":null};$.each(I.replace(/\\+/g,\" \").split(\"&\"),function(L,Q){var K=Q.split(\"=\"),P=r(K[0]),J,O=H,M=0,R=P.split(\"][\"),N=R.length-1;if(/\\[/.test(R[0])&&/\\]$/.test(R[N])){R[N]=R[N].replace(/\\]$/,\"\");R=R.shift().split(\"[\").concat(R);N=R.length-1}else{N=0}if(K.length===2){J=r(K[1]);if(F){J=J&&!isNaN(J)?+J:J===\"undefined\"?i:G[J]!==i?G[J]:J}if(N){for(;M<=N;M++){P=R[M]===\"\"?O.length:R[M];O=O[P]=M<N?O[P]||(R[M+1]&&isNaN(R[M+1])?{}:[]):J}}else{if($.isArray(H[P])){H[P].push(J)}else{if(H[P]!==i){H[P]=[H[P],J]}else{H[P]=J}}}}else{if(P){H[P]=F?i:\"\"}}});return H};function z(H,F,G){if(F===i||typeof F===\"boolean\"){G=F;F=a[H?D:A]()}else{F=E(F)?F.replace(H?w:x,\"\"):F}return l(F,G)}l[A]=B(z,0);l[D]=v=B(z,1);$[y]||($[y]=function(F){return $.extend(C,F)})({a:k,base:k,iframe:t,img:t,input:t,form:\"action\",link:k,script:t});j=$[y];function s(I,G,H,F){if(!E(H)&&typeof H!==\"object\"){F=H;H=G;G=i}return this.each(function(){var L=$(this),J=G||j()[(this.nodeName||\"\").toLowerCase()]||\"\",K=J&&L.attr(J)||\"\";L.attr(J,a[I](K,H,F))})}$.fn[A]=B(s,A);$.fn[D]=B(s,D);b.pushState=q=function(I,F){if(E(I)&&/^#/.test(I)&&F===i){F=2}var H=I!==i,G=c(p[g][k],H?I:{},H?F:2);p[g][k]=G+(/#/.test(G)?\"\":\"#\")};b.getState=u=function(F,G){return F===i||typeof F===\"boolean\"?v(F):v(G)[F]};b.removeState=function(F){var G={};if(F!==i){G=u();$.each($.isArray(F)?F:arguments,function(I,H){delete G[H]})}q(G,2)};e[d]=$.extend(e[d],{add:function(F){var H;function G(J){var I=J[D]=c();J.getState=function(K,L){return K===i||typeof K===\"boolean\"?l(I,K):l(I,L)[K]};H.apply(this,arguments)}if($.isFunction(F)){H=F;return G}else{H=F.handler;F.handler=G}}})})(jQuery,this);\r\n/*\r\n * jQuery hashchange event - v1.2 - 2/11/2010\r\n * http://benalman.com/projects/jquery-hashchange-plugin/\r\n * \r\n * Copyright (c) 2010 \"Cowboy\" Ben Alman\r\n * Dual licensed under the MIT and GPL licenses.\r\n * http://benalman.com/about/license/\r\n */\r\n(function($,i,b){var j,k=$.event.special,c=\"location\",d=\"hashchange\",l=\"href\",f=$.browser,g=document.documentMode,h=f.msie&&(g===b||g<8),e=\"on\"+d in i&&!h;function a(m){m=m||i[c][l];return m.replace(/^[^#]*#?(.*)$/,\"$1\")}$[d+\"Delay\"]=100;k[d]=$.extend(k[d],{setup:function(){if(e){return false}$(j.start)},teardown:function(){if(e){return false}$(j.stop)}});j=(function(){var m={},r,n,o,q;function p(){o=q=function(s){return s};if(h){n=$('<iframe src=\"javascript:0\"/>').hide().insertAfter(\"body\")[0].contentWindow;q=function(){return a(n.document[c][l])};o=function(u,s){if(u!==s){var t=n.document;t.open().close();t[c].hash=\"#\"+u}};o(a())}}m.start=function(){if(r){return}var t=a();o||p();(function s(){var v=a(),u=q(t);if(v!==t){o(t=v,u);$(i).trigger(d)}else{if(u!==t){i[c][l]=i[c][l].replace(/#.*/,\"\")+\"#\"+u}}r=setTimeout(s,$[d+\"Delay\"])})()};m.stop=function(){if(!n){r&&clearTimeout(r);r=0}};return m})()})(jQuery,this);","//Title: Custom DropDown plugin by PC\r\n//Documentation: http://designwithpc.com/Plugins/ddslick\r\n//Author: PC \r\n//Website: http://designwithpc.com\r\n//Twitter: http://twitter.com/chaudharyp\r\n\r\n(function ($) {\r\n\r\n    $.fn.ddslick = function (method) {\r\n        if (methods[method]) {\r\n            return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));\r\n        } else if (typeof method === 'object' || !method) {\r\n            return methods.init.apply(this, arguments);\r\n        } else {\r\n            $.error('Method ' + method + ' does not exists.');\r\n        }\r\n    };\r\n\r\n    var methods = {},\r\n\r\n    //Set defauls for the control\r\n    defaults = {\r\n        data: [],\r\n        keepJSONItemsOnTop: false,\r\n        width: 260,\r\n        height: null,\r\n        background: \"#eee\",\r\n        selectText: \"\",\r\n        defaultSelectedIndex: null,\r\n        truncateDescription: true,\r\n        imagePosition: \"left\",\r\n        showSelectedHTML: true,\r\n        clickOffToClose: true,\r\n        onSelected: function () { }\r\n    },\r\n\r\n    ddSelectHtml = '<div class=\"dd-select\"><input class=\"dd-selected-value\" type=\"hidden\" /><a class=\"dd-selected\"></a><span class=\"dd-pointer dd-pointer-down\"></span></div>',\r\n    ddOptionsHtml = '<ul class=\"dd-options\"></ul>';\r\n\r\n    //CSS for ddSlick\r\n    //    ddslickCSS = '<style id=\"css-ddslick\" type=\"text/css\">' +\r\n    //                '.dd-select{ border-radius:2px; border:solid 1px #ccc; position:relative; cursor:pointer;}' +\r\n    //                '.dd-desc { color:#aaa; display:block; overflow: hidden; font-weight:normal; line-height: 1.4em; }' +\r\n    //                '.dd-selected{ overflow:hidden; display:block; padding: 4px 10px 4px 10px; font-weight:bold;}' +\r\n    //                '.dd-pointer{ width:0; height:0; position:absolute; right:10px; top:50%; margin-top:-3px;}' +\r\n    //                '.dd-pointer-down{ border:solid 5px transparent; border-top:solid 5px #000; }' +\r\n    //                '.dd-pointer-up{border:solid 5px transparent !important; border-bottom:solid 5px #000 !important; margin-top:-8px;}' +\r\n    //                '.dd-options{ border:solid 1px #ccc; border-top:none; list-style:none; box-shadow:0px 1px 5px #ddd; display:none; position:absolute; z-index:2000; margin:0; padding:0;background:#fff; overflow:auto;}' +\r\n    //                '.dd-option{ padding: 4px 10px 4px 10px; display:block; border-bottom:solid 1px #ddd; overflow:hidden; text-decoration:none; color:#333; cursor:pointer;-webkit-transition: all 0.25s ease-in-out; -moz-transition: all 0.25s ease-in-out;-o-transition: all 0.25s ease-in-out;-ms-transition: all 0.25s ease-in-out; }' +\r\n    //                '.dd-options > li:last-child > .dd-option{ border-bottom:none;}' +\r\n    //                '.dd-option:hover{ background:#f3f3f3; color:#000;}' +\r\n    //                '.dd-selected-description-truncated { text-overflow: ellipsis; white-space:nowrap; }' +\r\n    //                '.dd-option-selected { background:#f6f6f6; }' +\r\n    //                '.dd-option-image, .dd-selected-image { vertical-align:middle; float:left; margin-right:5px; max-width:100px }' +\r\n    //                '.dd-image-right { float:right; margin-right:15px; margin-left:5px;}' +\r\n    //                '.dd-container{ position:relative;}​ .dd-selected-text { font-weight:bold}​</style>';\r\n\r\n    //CSS styles are only added once.\r\n    //    if ($('#css-ddslick').length <= 0) {\r\n    //        $(ddslickCSS).appendTo('head');\r\n    //    }\r\n\r\n    //Public methods \r\n    methods.init = function (options) {\r\n        //Preserve the original defaults by passing an empty object as the target\r\n        var options = $.extend({}, defaults, options);\r\n\r\n        //Apply on all selected elements\r\n        return this.each(function () {\r\n            var obj = $(this),\r\n                data = obj.data('ddslick');\r\n            //If the plugin has not been initialized yet\r\n            if (!data) {\r\n\r\n                var ddSelect = [], ddJson = options.data;\r\n\r\n                //Get data from HTML select options\r\n                obj.find('option').each(function () {\r\n                    var $this = $(this), thisData = $this.data();\r\n                    ddSelect.push({\r\n                        text: $.trim($this.text()),\r\n                        value: $this.val(),\r\n                        selected: $this.is(':selected'),\r\n                        description: thisData.description,\r\n                        imageSrc: thisData.imagesrc //keep it lowercase for HTML5 data-attributes\r\n                    });\r\n                });\r\n\r\n                //Update Plugin data merging both HTML select data and JSON data for the dropdown\r\n                if (options.keepJSONItemsOnTop)\r\n                    $.merge(options.data, ddSelect);\r\n                else options.data = $.merge(ddSelect, options.data);\r\n\r\n                //Replace HTML select with empty placeholder, keep the original\r\n                var original = obj, placeholder = $('<div id=\"' + obj.attr('id') + '\"></div>');\r\n                obj.replaceWith(placeholder);\r\n                obj = placeholder;\r\n\r\n                //Add classes and append ddSelectHtml & ddOptionsHtml to the container\r\n                //                obj.addClass('dd-container').append(ddSelectHtml).append(ddOptionsHtml);\r\n                obj.addClass('dd-container').append(ddSelectHtml).after(ddOptionsHtml);\r\n\r\n                //Get newly created ddOptions and ddSelect to manipulate\r\n                var ddSelect = obj.find('.dd-select'),\r\n                //                    ddOptions = obj.find('.dd-options');\r\n                ddOptions = obj.parent().find('.dd-options');\r\n\r\n                //Set widths\r\n                //                ddOptions.css({ width: options.width });\r\n                //                ddSelect.css({ width: options.width, background: options.background });\r\n                //                obj.css({ width: options.width });\r\n                ddSelect.css({ background: options.background });\r\n\r\n                //Set height\r\n                if (options.height != null)\r\n                    ddOptions.css({ height: options.height, overflow: 'auto' });\r\n\r\n                //Add ddOptions to the container. Replace with template engine later.\r\n                $.each(options.data, function (index, item) {\r\n                    if (item.selected) options.defaultSelectedIndex = index;\r\n                    ddOptions.append('<li>' +\r\n                        '<a class=\"dd-option\">' +\r\n                            (item.value ? ' <input class=\"dd-option-value\" type=\"hidden\" value=\"' + item.value + '\" />' : '') +\r\n                            (item.imageSrc ? ' <img class=\"dd-option-image' + (options.imagePosition == \"right\" ? ' dd-image-right' : '') + '\" src=\"' + item.imageSrc + '\" />' : '') +\r\n                            (item.text ? ' <label class=\"dd-option-text\">' + item.text + '</label>' : '') +\r\n                            (item.description ? ' <small class=\"dd-option-description dd-desc\">' + item.description + '</small>' : '') +\r\n                        '</a>' +\r\n                    '</li>');\r\n                });\r\n\r\n                //Save plugin data.\r\n                var pluginData = {\r\n                    settings: options,\r\n                    original: original,\r\n                    selectedIndex: -1,\r\n                    selectedItem: null,\r\n                    selectedData: null\r\n                }\r\n                obj.data('ddslick', pluginData);\r\n\r\n                //Check if needs to show the select text, otherwise show selected or default selection\r\n                if (options.selectText.length > 0 && options.defaultSelectedIndex == null) {\r\n                    obj.find('.dd-selected').html(options.selectText);\r\n                }\r\n                else {\r\n                    var index = (options.defaultSelectedIndex != null && options.defaultSelectedIndex >= 0 && options.defaultSelectedIndex < options.data.length)\r\n                                ? options.defaultSelectedIndex\r\n                                : 0;\r\n                    selectIndex(obj, index);\r\n                }\r\n\r\n                //EVENTS\r\n                //Displaying options\r\n                obj.find('.dd-select').on('click.ddslick', function () {\r\n                    open(obj);\r\n                });\r\n\r\n                //Selecting an option\r\n                obj.parent().find('.dd-option').on('click.ddslick', function () {\r\n                    selectIndex(obj, $(this).closest('li').index());\r\n                });\r\n\r\n                //Click anywhere to close\r\n                if (options.clickOffToClose) {\r\n                    ddOptions.addClass('dd-click-off-close');\r\n                    obj.on('click.ddslick', function (e) { e.stopPropagation(); });\r\n                    $('body').on('click', function () {\r\n                        $('.dd-click-off-close').slideUp(50).siblings('.dd-select').find('.dd-pointer').removeClass('dd-pointer-up');\r\n                    });\r\n                }\r\n            }\r\n        });\r\n    };\r\n\r\n    //Public method to select an option by its index\r\n    methods.select = function (options) {\r\n        return this.each(function () {\r\n            if (options.index)\r\n                selectIndex($(this), options.index);\r\n        });\r\n    }\r\n\r\n    //Public method to open drop down\r\n    methods.open = function () {\r\n        return this.each(function () {\r\n            var $this = $(this),\r\n                pluginData = $this.data('ddslick');\r\n\r\n            //Check if plugin is initialized\r\n            if (pluginData)\r\n                open($this);\r\n        });\r\n    };\r\n\r\n    //Public method to close drop down\r\n    methods.close = function () {\r\n        return this.each(function () {\r\n            var $this = $(this),\r\n                pluginData = $this.data('ddslick');\r\n\r\n            //Check if plugin is initialized\r\n            if (pluginData)\r\n                close($this);\r\n        });\r\n    };\r\n\r\n    //Public method to destroy. Unbind all events and restore the original Html select/options\r\n    methods.destroy = function () {\r\n        return this.each(function () {\r\n            var $this = $(this),\r\n                pluginData = $this.data('ddslick');\r\n\r\n            //Check if already destroyed\r\n            if (pluginData) {\r\n                var originalElement = pluginData.original;\r\n                $this.next().remove();\r\n                $this.removeData('ddslick').unbind('.ddslick').replaceWith(originalElement);\r\n            }\r\n        });\r\n    }\r\n\r\n    //Private: Select index\r\n    function selectIndex(obj, index) {\r\n\r\n        //Get plugin data\r\n        var pluginData = obj.data('ddslick');\r\n\r\n        //Get required elements\r\n        var ddSelected = obj.find('.dd-selected');\r\n        var ddSelectedValue = ddSelected.siblings('.dd-selected-value');\r\n        var ddOptions = obj.parent().find('.dd-options');\r\n        var ddPointer = ddSelected.siblings('.dd-pointer');\r\n        var selectedOption = obj.parent().find('.dd-option').eq(index);\r\n        var selectedLiItem = selectedOption.closest('li');\r\n        var settings = pluginData.settings;\r\n        var selectedData = pluginData.settings.data[index];\r\n\r\n        //Highlight selected option\r\n        obj.parent().find('.dd-option').removeClass('dd-option-selected');\r\n        selectedOption.addClass('dd-option-selected');\r\n\r\n        //Update or Set plugin data with new selection\r\n        pluginData.selectedIndex = index;\r\n        pluginData.selectedItem = selectedLiItem;\r\n        pluginData.selectedData = selectedData;\r\n\r\n        //Callback function on selection\r\n        if (typeof settings.onSelected == 'function') {\r\n            settings.onSelected.call(this, pluginData);\r\n        }\r\n\r\n        //If set to display to full html, add html\r\n        if (settings.showSelectedHTML) {\r\n            ddSelected.html(\r\n                    (selectedData.imageSrc ? '<img class=\"dd-selected-image' + (settings.imagePosition == \"right\" ? ' dd-image-right' : '') + '\" src=\"' + selectedData.imageSrc + '\" />' : '') +\r\n                    (selectedData.text ? '<label class=\"dd-selected-text\">' + selectedData.text + '</label>' : '') +\r\n                    (selectedData.description ? '<small class=\"dd-selected-description dd-desc' + (settings.truncateDescription ? ' dd-selected-description-truncated' : '') + '\" >' + selectedData.description + '</small>' : '')\r\n                );\r\n\r\n        }\r\n        //Else only display text as selection\r\n        else ddSelected.html(selectedData.text);\r\n\r\n        //Updating selected option value\r\n        ddSelectedValue.val(selectedData.value);\r\n\r\n        //BONUS! Update the original element attribute with the new selection\r\n        pluginData.original.val(selectedData.value);\r\n        obj.data('ddslick', pluginData);\r\n\r\n        //Close options on selection\r\n        close(obj);\r\n\r\n        //Adjust appearence for selected option\r\n        adjustSelectedHeight(obj);\r\n\r\n        \r\n    }\r\n\r\n    //Private: Close the drop down options\r\n    function open(obj) {\r\n\r\n        var $this = obj.find('.dd-select'),\r\n            ddOptions = $this.parent().siblings('.dd-options'),\r\n            ddPointer = $this.find('.dd-pointer'),\r\n            wasOpen = ddOptions.is(':visible');\r\n\r\n        //Close all open options (multiple plugins) on the page\r\n        $('.dd-click-off-close').not(ddOptions).slideUp(50);\r\n        $('.dd-pointer').removeClass('dd-pointer-up');\r\n\r\n        if (wasOpen) {\r\n            ddOptions.slideUp('fast');\r\n            ddPointer.removeClass('dd-pointer-up');\r\n        }\r\n        else {\r\n            ddOptions.slideDown('fast');\r\n            ddPointer.addClass('dd-pointer-up');\r\n        }\r\n\r\n        //Fix text height (i.e. display title in center), if there is no description\r\n        adjustOptionsHeight(obj);\r\n    }\r\n\r\n    //Private: Close the drop down options\r\n    function close(obj) {\r\n        //Close drop down and adjust pointer direction\r\n        obj.parent().find('.dd-options').slideUp(50);\r\n        obj.find('.dd-pointer').removeClass('dd-pointer-up').removeClass('dd-pointer-up');\r\n    }\r\n\r\n    //Private: Adjust appearence for selected option (move title to middle), when no desripction\r\n    function adjustSelectedHeight(obj) {\r\n\r\n        //Get height of dd-selected\r\n        var lSHeight = obj.find('.dd-select').css('height');\r\n\r\n        //Check if there is selected description\r\n        var descriptionSelected = obj.find('.dd-selected-description');\r\n        var imgSelected = obj.find('.dd-selected-image');\r\n        if (descriptionSelected.length <= 0 && imgSelected.length > 0) {\r\n            obj.find('.dd-selected-text').css('lineHeight', lSHeight);\r\n        }\r\n    }\r\n\r\n    //Private: Adjust appearence for drop down options (move title to middle), when no desripction\r\n    function adjustOptionsHeight(obj) {\r\n        obj.parent().find('.dd-option').each(function () {\r\n            var $this = $(this);\r\n            var lOHeight = $this.css('height');\r\n            var descriptionOption = $this.find('.dd-option-description');\r\n            var imgOption = obj.parent().find('.dd-option-image');\r\n            if (descriptionOption.length <= 0 && imgOption.length > 0) {\r\n                $this.find('.dd-option-text').css('lineHeight', lOHeight);\r\n            }\r\n        });\r\n    }\r\n\r\n})(jQuery);","/**\r\n* hoverIntent r6 // 2011.02.26 // jQuery 1.5.1+\r\n* <http://cherne.net/brian/resources/jquery.hoverIntent.html>\r\n* \r\n* @param  f  onMouseOver function || An object with configuration options\r\n* @param  g  onMouseOut function  || Nothing (use configuration options object)\r\n* @author    Brian Cherne brian(at)cherne(dot)net\r\n*/\r\n(function($){$.fn.hoverIntent=function(f,g){var cfg={sensitivity:7,interval:100,timeout:0};cfg=$.extend(cfg,g?{over:f,out:g}:f);var cX,cY,pX,pY;var track=function(ev){cX=ev.pageX;cY=ev.pageY};var compare=function(ev,ob){ob.hoverIntent_t=clearTimeout(ob.hoverIntent_t);if((Math.abs(pX-cX)+Math.abs(pY-cY))<cfg.sensitivity){$(ob).unbind(\"mousemove\",track);ob.hoverIntent_s=1;return cfg.over.apply(ob,[ev])}else{pX=cX;pY=cY;ob.hoverIntent_t=setTimeout(function(){compare(ev,ob)},cfg.interval)}};var delay=function(ev,ob){ob.hoverIntent_t=clearTimeout(ob.hoverIntent_t);ob.hoverIntent_s=0;return cfg.out.apply(ob,[ev])};var handleHover=function(e){var ev=jQuery.extend({},e);var ob=this;if(ob.hoverIntent_t){ob.hoverIntent_t=clearTimeout(ob.hoverIntent_t)}if(e.type==\"mouseenter\"){pX=ev.pageX;pY=ev.pageY;$(ob).bind(\"mousemove\",track);if(ob.hoverIntent_s!=1){ob.hoverIntent_t=setTimeout(function(){compare(ev,ob)},cfg.interval)}}else{$(ob).unbind(\"mousemove\",track);if(ob.hoverIntent_s==1){ob.hoverIntent_t=setTimeout(function(){delay(ev,ob)},cfg.timeout)}}};return this.bind('mouseenter',handleHover).bind('mouseleave',handleHover)}})(jQuery);","/**\r\n * @license \r\n * jQuery Tools 1.2.5 Tooltip - UI essentials\r\n * \r\n * NO COPYRIGHTS OR LICENSES. DO WHAT YOU LIKE.\r\n * \r\n * http://flowplayer.org/tools/tooltip/\r\n *\r\n * Since: November 2008\r\n * Date:    Wed Sep 22 06:02:10 2010 +0000 \r\n */\r\n(function ($) {\r\n    // static constructs\r\n    $.tools = $.tools || { version: '1.2.5' };\r\n\r\n    $.tools.tooltip = {\r\n\r\n        conf: {\r\n\r\n            // default effect variables\r\n            effect: 'toggle',\r\n            fadeOutSpeed: \"fast\",\r\n            predelay: 0,\r\n            delay: 30,\r\n            opacity: 1,\r\n            tip: 0,\r\n\r\n            // 'top', 'bottom', 'right', 'left', 'center'\r\n            position: ['top', 'center'],\r\n            offset: [0, 0],\r\n            relative: false,\r\n            cancelDefault: true,\r\n\r\n            // type to event mapping \r\n            events: {\r\n                def: \"mouseenter,mouseleave\",\r\n                input: \"focus,blur\",\r\n                widget: \"focus mouseenter,blur mouseleave\",\r\n                tooltip: \"mouseenter,mouseleave\"\r\n            },\r\n\r\n            // 1.2\r\n            layout: '<div/>',\r\n            tipClass: 'tooltip'\r\n        },\r\n\r\n        addEffect: function (name, loadFn, hideFn) {\r\n            effects[name] = [loadFn, hideFn];\r\n        }\r\n    };\r\n\r\n\r\n    var effects = {\r\n        toggle: [\r\n\t\t\tfunction (done) {\r\n\t\t\t    var conf = this.getConf(), tip = this.getTip(), o = conf.opacity;\r\n\t\t\t    if (o < 1) { tip.css({ opacity: o }); }\r\n\t\t\t    tip.show();\r\n\t\t\t    done.call();\r\n\t\t\t},\r\n\r\n\t\t\tfunction (done) {\r\n\t\t\t    this.getTip().hide();\r\n\t\t\t    done.call();\r\n\t\t\t}\r\n\t\t],\r\n\r\n        fade: [\r\n\t\t\tfunction (done) {\r\n\t\t\t    var conf = this.getConf();\r\n\t\t\t    this.getTip().fadeTo(conf.fadeInSpeed, conf.opacity, done);\r\n\t\t\t},\r\n\t\t\tfunction (done) {\r\n\t\t\t    this.getTip().fadeOut(this.getConf().fadeOutSpeed, done);\r\n\t\t\t}\r\n\t\t]\r\n    };\r\n\r\n\r\n    /* calculate tip position relative to the trigger */\r\n    function getPosition(trigger, tip, conf) {\r\n\r\n\r\n        // get origin top/left position \r\n        var top = conf.relative ? trigger.position().top : trigger.offset().top,\r\n\t\t\t left = conf.relative ? trigger.position().left : trigger.offset().left,\r\n\t\t\t pos = conf.position[0];\r\n\r\n        top -= tip.outerHeight() - conf.offset[0];\r\n        left += trigger.outerWidth() + conf.offset[1];\r\n\r\n        // iPad position fix\r\n        if (/iPad/i.test(navigator.userAgent)) {\r\n            top -= $(window).scrollTop();\r\n        }\r\n\r\n        // adjust Y\t\t\r\n        var height = tip.outerHeight() + trigger.outerHeight();\r\n        if (pos == 'center') { top += height / 2; }\r\n        if (pos == 'bottom') { top += height; }\r\n\r\n\r\n        // adjust X\r\n        pos = conf.position[1];\r\n        var width = tip.outerWidth() + trigger.outerWidth();\r\n        if (pos == 'center') { left -= width / 2; }\r\n        if (pos == 'left') { left -= width; }\r\n\r\n        return { top: top, left: left };\r\n    }\r\n\r\n\r\n\r\n    function Tooltip(trigger, conf) {\r\n\r\n        var self = this,\r\n\t\t\t fire = trigger.add(self),\r\n\t\t\t tip,\r\n\t\t\t timer = 0,\r\n\t\t\t pretimer = 0,\r\n\t\t\t title = trigger.attr(\"title\"),\r\n\t\t\t tipAttr = trigger.attr(\"data-tooltip\"),\r\n\t\t\t effect = effects[conf.effect],\r\n\t\t\t shown,\r\n\r\n        // get show/hide configuration\r\n\t\t\t isInput = trigger.is(\":input\"),\r\n\t\t\t isWidget = isInput && trigger.is(\":checkbox, :radio, select, :button, :submit\"),\r\n\t\t\t type = trigger.attr(\"type\"),\r\n\t\t\t evt = conf.events[type] || conf.events[isInput ? (isWidget ? 'widget' : 'input') : 'def'];\r\n\r\n\r\n        // check that configuration is sane\r\n        if (!effect) { throw \"Nonexistent effect \\\"\" + conf.effect + \"\\\"\"; }\r\n\r\n        evt = evt.split(/,\\s*/);\r\n        if (evt.length != 2) { throw \"Tooltip: bad events configuration for \" + type; }\r\n\r\n\r\n        // trigger --> show  \r\n        trigger.bind(evt[0], function (e) {\r\n\r\n            clearTimeout(timer);\r\n            if (conf.predelay) {\r\n                pretimer = setTimeout(function () { self.show(e); }, conf.predelay);\r\n\r\n            } else {\r\n                self.show(e);\r\n            }\r\n\r\n            // trigger --> hide\r\n        }).bind(evt[1], function (e) {\r\n            clearTimeout(pretimer);\r\n            if (conf.delay) {\r\n                timer = setTimeout(function () { self.hide(e); }, conf.delay);\r\n\r\n            } else {\r\n                self.hide(e);\r\n            }\r\n\r\n        });\r\n\r\n\r\n        // remove default title\r\n        if (title && conf.cancelDefault) {\r\n            trigger.removeAttr(\"title\");\r\n            trigger.data(\"title\", title);\r\n        }\r\n\r\n        $.extend(self, {\r\n\r\n            show: function (e) {\r\n\r\n                // tip not initialized yet\r\n                if (!tip) {\r\n\r\n                    // data-tooltip \r\n                    if (tipAttr) {\r\n                        tip = $(tipAttr);\r\n\r\n                        // single tip element for all\r\n                    } else if (conf.tip) {\r\n                        tip = $(conf.tip).eq(0);\r\n\r\n                        // autogenerated tooltip\r\n                    } else if (title) {\r\n                        tip = $(conf.layout).addClass(conf.tipClass).appendTo(document.body)\r\n\t\t\t\t\t\t\t.hide().append(title);\r\n\r\n                        // manual tooltip\r\n                    } else {\r\n                        tip = trigger.next();\r\n                        if (!tip.length) { tip = trigger.parent().next(); }\r\n                    }\r\n\r\n                    if (!tip.length) { throw \"Cannot find tooltip for \" + trigger; }\r\n                }\r\n\r\n                if (self.isShown()) { return self; }\r\n\r\n                // stop previous animation\r\n                tip.stop(true, true);\r\n\r\n                // get position\r\n                var pos = getPosition(trigger, tip, conf);\r\n\r\n                // restore title for single tooltip element\r\n                if (conf.tip) {\r\n                    tip.find(\".tpmain\").html(trigger.data(\"title\"));\r\n                }\r\n\r\n                // onBeforeShow\r\n                e = e || $.Event();\r\n                e.type = \"onBeforeShow\";\r\n                fire.trigger(e, [pos]);\r\n                if (e.isDefaultPrevented()) { return self; }\r\n\r\n\r\n                // onBeforeShow may have altered the configuration\r\n                pos = getPosition(trigger, tip, conf);\r\n\r\n                // set position\r\n                tip.css({ position: 'absolute', top: pos.top, left: pos.left });\r\n\r\n                shown = true;\r\n\r\n                // invoke effect \r\n                effect[0].call(self, function () {\r\n                    e.type = \"onShow\";\r\n                    shown = 'full';\r\n                    fire.trigger(e);\r\n                });\r\n\r\n\r\n                // tooltip events       \r\n                var event = conf.events.tooltip.split(/,\\s*/);\r\n\r\n                if (!tip.data(\"__set\")) {\r\n\r\n                    tip.bind(event[0], function () {\r\n                        clearTimeout(timer);\r\n                        clearTimeout(pretimer);\r\n                    });\r\n\r\n                    if (event[1] && !trigger.is(\"input:not(:checkbox, :radio), textarea\")) {\r\n                        tip.bind(event[1], function (e) {\r\n\r\n                            // being moved to the trigger element\r\n                            if (e.relatedTarget != trigger[0]) {\r\n                                trigger.trigger(evt[1].split(\" \")[0]);\r\n                            }\r\n                        });\r\n                    }\r\n\r\n                    tip.data(\"__set\", true);\r\n                }\r\n\r\n                return self;\r\n            },\r\n\r\n            hide: function (e) {\r\n\r\n                if (!tip || !self.isShown()) { return self; }\r\n\r\n                // onBeforeHide\r\n                e = e || $.Event();\r\n                e.type = \"onBeforeHide\";\r\n                fire.trigger(e);\r\n                if (e.isDefaultPrevented()) { return; }\r\n\r\n                shown = false;\r\n\r\n                effects[conf.effect][1].call(self, function () {\r\n                    e.type = \"onHide\";\r\n                    fire.trigger(e);\r\n                });\r\n\r\n                return self;\r\n            },\r\n\r\n            isShown: function (fully) {\r\n                return fully ? shown == 'full' : shown;\r\n            },\r\n\r\n            getConf: function () {\r\n                return conf;\r\n            },\r\n\r\n            getTip: function () {\r\n                return tip;\r\n            },\r\n\r\n            getTrigger: function () {\r\n                return trigger;\r\n            }\r\n\r\n        });\r\n\r\n        // callbacks\t\r\n        $.each(\"onHide,onBeforeShow,onShow,onBeforeHide\".split(\",\"), function (i, name) {\r\n\r\n            // configuration\r\n            if ($.isFunction(conf[name])) {\r\n                $(self).bind(name, conf[name]);\r\n            }\r\n\r\n            // API\r\n            self[name] = function (fn) {\r\n                if (fn) { $(self).bind(name, fn); }\r\n                return self;\r\n            };\r\n        });\r\n\r\n    }\r\n\r\n\r\n    // jQuery plugin implementation\r\n    $.fn.tooltip = function (conf) {\r\n\r\n        // return existing instance\r\n        var api = this.data(\"tooltip\");\r\n        if (api) { return api; }\r\n\r\n        conf = $.extend(true, {}, $.tools.tooltip.conf, conf);\r\n\r\n        // position can also be given as string\r\n        if (typeof conf.position == 'string') {\r\n            conf.position = conf.position.split(/,?\\s/);\r\n        }\r\n\r\n        // install tooltip for each entry in jQuery object\r\n        this.each(function () {\r\n            api = new Tooltip($(this), conf);\r\n            $(this).data(\"tooltip\", api);\r\n        });\r\n\r\n        return conf.api ? api : this;\r\n    };\r\n\r\n})(jQuery);\r\n\r\n\t\t\r\n\r\n","/// <reference path=\"../../../Scripts/jquery-1.10.2.min.js\" />\r\n/// <reference path=\"../ui.core.js\" />\r\n/// <reference path=\"../jquery-ui-1.10.4.min.js\" />\r\n/// <reference path=\"../jquery.blockUI.js\" />\r\n\r\n//function Apple(type) {\r\n//    this.type = type;\r\n//    this.color = \"red\";\r\n//    this.getInfo = function () {\r\n//        return this.color + ' ' + this.type + ' apple';\r\n//    };\r\n//}\r\n\r\n$(document).ready(function () {\r\n    Translate_InitDialog();\r\n});\r\n\r\nTranslate_InitDialog = function () {\r\n    var $dialog = $('<div></div>');\r\n    $('.translateDialog a').click(function () {\r\n        var $link = $(this);\r\n        $dialog\r\n\t\t\t\t.empty()\r\n\t\t\t\t.append($loading.clone())\r\n\t\t\t\t.dialog({\r\n\t\t\t\t    title: $link.attr('title'),\r\n\t\t\t\t    modal: true,\r\n                    position: top,\r\n\t\t\t\t    buttons: {\r\n\t\t\t\t        'Update': function () { Translate_Update($(this).find('form'), $dialog); },\r\n\t\t\t\t        'Close': function () { $(this).dialog('close'); }\r\n\t\t\t\t    },\r\n\t\t\t\t    close: function () { $(this).closest(); },\r\n\t\t\t\t    width: '800px',\r\n                    height: 600\r\n\t\t\t\t});\r\n\r\n\t\t\t\t$dialog\r\n\t\t\t\t\t.load($link.attr('href'), function (response, status, xhr) {\r\n\t\t\t\t\t    if (status == \"error\") {\r\n\t\t\t\t\t        $.blockUI({\r\n\t\t\t\t\t            message: xhr.status + ' ' + xhr.statusText + '\\n\\n' + response,\r\n\t\t\t\t\t            centerY: false,\r\n\t\t\t\t\t            centerX: false\r\n\t\t\t\t\t        });\r\n\t\t\t\t\t    }\r\n\t\t\t\t\t    else {\r\n\t\t\t\t\t        // It seems jQuery 1.4.1 & 1.4.2 has a problem in IE with .text() on script nodes… so do the loop ourselves…\r\n\t\t\t\t\t        // execute the js that was loadad by ajax\r\n\t\t\t\t\t        var scripts = $dialog.find(\"script\");\r\n\t\t\t\t\t        var allScriptText = \"\";\r\n\t\t\t\t\t        for (var i = 0; i < scripts.length; i++) {\r\n\t\t\t\t\t            allScriptText += scripts[i].text;\r\n\t\t\t\t\t        }\r\n\t\t\t\t\t        jQuery.globalEval(allScriptText);\r\n\t\t\t\t\t        $(this).dialog('option', 'position', 'center') //recenter the dialog\r\n\t\t\t\t\t    }\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.dialog('open');\r\n\t\t\t\treturn false;\r\n    });\r\n}\r\n\r\nTranslate_Update = function (form, dialog) {\r\n    form = $(form);\r\n    $.ajax({\r\n        url: form.attr('action'),\r\n        data: form.serialize(),\r\n        type: (form.attr('method')),\r\n        success: function (data, message) {\r\n            dialog.dialog('close');\r\n            $.blockUI({ message: '<h1>Changes saved!\\n<br>Page is reloading, please wait!</h1>' });\r\n            setTimeout(function () { location.reload(); }, 1000);\r\n        },\r\n        error: function (data) {\r\n            $.blockUI({\r\n                message: data.ResponseText,\r\n                centerY: false,\r\n                centerX: false\r\n            });\r\n        },\r\n        dataType: 'json'\r\n    });\r\n    return false;\r\n}","//first we must set a cookie to check if it's possible writing there\r\nfunction Set_Cookie(name, value, expires, path, domain, secure) {\r\n    // set time, it's in milliseconds\r\n    var today = new Date();\r\n    today.setTime(today.getTime());\r\n    // if the expires variable is set, make the correct expires time, the\r\n    // current script below will set it for x number of days, to make it\r\n    // for hours, delete * 24, for minutes, delete * 60 * 24\r\n    if (expires) {\r\n        expires = expires * 1000 * 60 * 60 * 24;\r\n    }\r\n    //alert( 'today ' + today.toGMTString() );// this is for testing purpose only\r\n    var expires_date = new Date(today.getTime() + (expires));\r\n    //alert('expires ' + expires_date.toGMTString());// this is for testing purposes only\r\n\r\n    document.cookie = name + \"=\" + escape(value) +\r\n\t\t((expires) ? \";expires=\" + expires_date.toGMTString() : \"\") + //expires.toGMTString()\r\n\t\t((path) ? \";path=\" + path : \"\") +\r\n\t\t((domain) ? \";domain=\" + domain : \"\") +\r\n\t\t((secure) ? \";secure\" : \"\");\r\n}\r\n\r\n// to use, simple do: Get_Cookie('cookie_name'); \r\n// replace cookie_name with the real cookie name, '' are required\r\nfunction Get_Cookie(check_name) {\r\n    // first we'll split this cookie up into name/value pairs\r\n    // note: document.cookie only returns name=value, not the other components\r\n    var a_all_cookies = document.cookie.split(';');\r\n    var a_temp_cookie = '';\r\n    var cookie_name = '';\r\n    var cookie_value = '';\r\n    var b_cookie_found = false; // set boolean t/f default f\r\n    var i = '';\r\n\r\n    for (i = 0; i < a_all_cookies.length; i++) {\r\n        // now we'll split apart each name=value pair\r\n        a_temp_cookie = a_all_cookies[i].split('=');\r\n\r\n\r\n        // and trim left/right whitespace while we're at it\r\n        cookie_name = a_temp_cookie[0].replace(/^\\s+|\\s+$/g, '');\r\n\r\n        // if the extracted name matches passed check_name\r\n        if (cookie_name == check_name) {\r\n            b_cookie_found = true;\r\n            // we need to handle case where cookie has no value but exists (no = sign, that is):\r\n            if (a_temp_cookie.length > 1) {\r\n                cookie_value = unescape(a_temp_cookie[1].replace(/^\\s+|\\s+$/g, ''));\r\n            }\r\n            // note that in cases where cookie is initialized but no value, null is returned\r\n            return cookie_value;\r\n            break;\r\n        }\r\n        a_temp_cookie = null;\r\n        cookie_name = '';\r\n    }\r\n    if (!b_cookie_found) {\r\n        return null;\r\n    }\r\n}\r\n\r\n// this deletes the cookie when called\r\nfunction Delete_Cookie(name, path, domain) {\r\n    if (Get_Cookie(name)) document.cookie = name + \"=\" +\r\n\t\t\t((path) ? \";path=\" + path : \"\") +\r\n\t\t\t((domain) ? \";domain=\" + domain : \"\") +\r\n\t\t\t\";expires=Thu, 01-Jan-1970 00:00:01 GMT\";\r\n}\r\n\r\n//set info dialog\r\nfunction SetDialog(_title, content) {\r\n    $('<div>' +  content + '</div>').dialog({\r\n        resizable: false,\r\n        title: _title,\r\n        width: 400,\r\n        modal: true,\r\n        buttons: {\r\n            \"OK\": function () {\r\n                $(this).block();\r\n                $(this).dialog(\"close\");\r\n                }\r\n            }\r\n        });\r\n}\r\n\r\n//call cookie Check\r\nfunction DoCookieCheck() {\r\n    Set_Cookie('test', 'none', '', '/', '', '');\r\n    // if Get_Cookie succeeds, cookies are enabled, since\r\n    if (!Get_Cookie('test')) {\r\n        cookie_set = false;\r\n        //open a window\r\n        var title = UIHeaderTitleCookieCheck;\r\n        var content = UIContentCookieCheck; \r\n        SetDialog(title, content);\r\n    }\r\n    else {\r\n        cookie_set = true;\r\n        Delete_Cookie('test', '/', '');\r\n    }\r\n}\r\n\r\n\r\n\r\n","/**\r\n* jquery.dump.js\r\n* @author Torkild Dyvik Olsen\r\n* @version 1.0\r\n* \r\n* A simple debug function to gather information about an object.\r\n* Returns a nested tree with information.\r\n* \r\n*/\r\n(function($) {\r\n\r\n    $.fn.dump = function() {\r\n        return $.dump(this);\r\n    }\r\n\r\n    $.dump = function(object) {\r\n        var recursion = function(obj, level) {\r\n            if (!level) level = 0;\r\n            var dump = '', p = '';\r\n            for (i = 0; i < level; i++) p += \"\\t\";\r\n\r\n            t = type(obj);\r\n            switch (t) {\r\n                case \"string\":\r\n                    return '\"' + obj + '\"';\r\n                    break;\r\n                case \"number\":\r\n                    return obj.toString();\r\n                    break;\r\n                case \"boolean\":\r\n                    return obj ? 'true' : 'false';\r\n                case \"date\":\r\n                    return \"Date: \" + obj.toLocaleString();\r\n                case \"array\":\r\n                    dump += 'Array ( \\n';\r\n                    $.each(obj, function(k, v) {\r\n                        dump += p + '\\t' + k + ' => ' + recursion(v, level + 1) + '\\n';\r\n                    });\r\n                    dump += p + ')';\r\n                    break;\r\n                case \"object\":\r\n                    dump += 'Object { \\n';\r\n                    $.each(obj, function(k, v) {\r\n                        dump += p + '\\t' + k + ': ' + recursion(v, level + 1) + '\\n';\r\n                    });\r\n                    dump += p + '}';\r\n                    break;\r\n                case \"jquery\":\r\n                    dump += 'jQuery Object { \\n';\r\n                    $.each(obj, function(k, v) {\r\n                        dump += p + '\\t' + k + ' = ' + recursion(v, level + 1) + '\\n';\r\n                    });\r\n                    dump += p + '}';\r\n                    break;\r\n                case \"regexp\":\r\n                    return \"RegExp: \" + obj.toString();\r\n                case \"error\":\r\n                    return obj.toString();\r\n                case \"document\":\r\n                case \"domelement\":\r\n                    dump += 'DOMElement [ \\n'\r\n                  + p + '\\tnodeName: ' + obj.nodeName + '\\n'\r\n                  + p + '\\tnodeValue: ' + obj.nodeValue + '\\n'\r\n                  + p + '\\tinnerHTML: [ \\n';\r\n                    $.each(obj.childNodes, function(k, v) {\r\n                        if (k < 1) var r = 0;\r\n                        if (type(v) == \"string\") {\r\n                            if (v.textContent.match(/[^\\s]/)) {\r\n                                dump += p + '\\t\\t' + (k - (r || 0)) + ' = String: ' + trim(v.textContent) + '\\n';\r\n                            } else {\r\n                                r--;\r\n                            }\r\n                        } else {\r\n                            dump += p + '\\t\\t' + (k - (r || 0)) + ' = ' + recursion(v, level + 2) + '\\n';\r\n                        }\r\n                    });\r\n                    dump += p + '\\t]\\n'\r\n                  + p + ']';\r\n                    break;\r\n                case \"function\":\r\n                    var match = obj.toString().match(/^(.*)\\(([^\\)]*)\\)/im);\r\n                    match[1] = trim(match[1].replace(new RegExp(\"[\\\\s]+\", \"g\"), \" \"));\r\n                    match[2] = trim(match[2].replace(new RegExp(\"[\\\\s]+\", \"g\"), \" \"));\r\n                    return match[1] + \"(\" + match[2] + \")\";\r\n                case \"window\":\r\n                default:\r\n                    dump += 'N/A: ' + t;\r\n                    break;\r\n            }\r\n\r\n            return dump;\r\n        }\r\n\r\n        var type = function(obj) {\r\n            var type = typeof (obj);\r\n\r\n            if (type != \"object\") {\r\n                return type;\r\n            }\r\n\r\n            switch (obj) {\r\n                case null:\r\n                    return 'null';\r\n                case window:\r\n                    return 'window';\r\n                case document:\r\n                    return 'document';\r\n                case window.event:\r\n                    return 'event';\r\n                default:\r\n                    break;\r\n            }\r\n\r\n            if (obj.jquery) {\r\n                return 'jquery';\r\n            }\r\n\r\n            switch (obj.constructor) {\r\n                case Array:\r\n                    return 'array';\r\n                case Boolean:\r\n                    return 'boolean';\r\n                case Date:\r\n                    return 'date';\r\n                case Object:\r\n                    return 'object';\r\n                case RegExp:\r\n                    return 'regexp';\r\n                case ReferenceError:\r\n                case Error:\r\n                    return 'error';\r\n                case null:\r\n                default:\r\n                    break;\r\n            }\r\n\r\n            switch (obj.nodeType) {\r\n                case 1:\r\n                    return 'domelement';\r\n                case 3:\r\n                    return 'string';\r\n                case null:\r\n                default:\r\n                    break;\r\n            }\r\n\r\n            return 'Unknown';\r\n        }\r\n\r\n        return recursion(object);\r\n    }\r\n\r\n    function trim(str) {\r\n        return ltrim(rtrim(str));\r\n    }\r\n\r\n    function ltrim(str) {\r\n        return str.replace(new RegExp(\"^[\\\\s]+\", \"g\"), \"\");\r\n    }\r\n\r\n    function rtrim(str) {\r\n        return str.replace(new RegExp(\"[\\\\s]+$\", \"g\"), \"\");\r\n    }\r\n\r\n})(jQuery);\r\n","$(document).ready(function () {\r\n    util.init();\r\n});\r\n\r\n\r\nvar isIpad = navigator.userAgent.match(/iPad/i) != null;\r\nvar isIphone = navigator.userAgent.match(/iPhone/i) != null;\r\nvar isIE = navigator.userAgent.match(/msie/i) != null;\r\nvar isIE7 = (navigator.appVersion.indexOf(\"MSIE 7.\") != -1) /*($.browser.msie && parseInt($.browser.version, 10) == 7)*/;\r\nvar isIE9 = (navigator.appVersion.indexOf(\"MSIE 9.\") != -1) /*($.browser.msie && parseInt($.browser.version, 10) == 9)*/;\r\n\r\n\r\nfunction isTouchDevice() {\r\n    return \"ontouchstart\" in window;\r\n}\r\n\r\nvar hasTouch = isTouchDevice();\r\n\r\n\r\n/*******************************************************************************\r\nutil\r\n*******************************************************************************/\r\n\r\nvar utilFired = false;\r\n\r\nfunction util() {\r\n\r\n    var self = this;\r\n\r\n    this.init = function () {\r\n\r\n        if (utilFired === false) {\r\n\r\n            utilFired = true;\r\n\r\n            try {\r\n\r\n                for (u in this) {\r\n\r\n                    if (u != 'init' && self[u]['init'])\r\n                        eval('util.' + u + '.init();');\r\n                }\r\n\r\n            }\r\n\r\n            catch (e) {\r\n\r\n            }\r\n        }\r\n\r\n\r\n        /* ensure top menu click events in ie7 */\r\n        if ($.browser.msie && $.browser.version == \"7.0\") {\r\n            $('#mainNav img.icon').click(function (e) {\r\n                e.preventDefault();\r\n                var anc = $(this).parent().parent();\r\n                //perform redirect only if SetConfirm is undefined\r\n                if (typeof(SetConfirm) != 'function') {\r\n                    $(window.location).attr('href', anc.attr('href'));\r\n                }\r\n            });\r\n        }\r\n\r\n    };\r\n\r\n};\r\n\r\n\r\n/*****************************\r\n*     AUTO-LOAD CLASSES\r\n*****************************/\r\n\r\nutil.prototype.autoLoadClasses = {\r\n\r\n    init: function () {\r\n\r\n        if (isIE9) {\r\n            $('.button').wrap('<div class=\"buttonMask\" />');\r\n\r\n            $('.buttonMask').each(function () {\r\n\r\n                var button = $(this).find('.button');\r\n\r\n                $(this).css({\r\n                    'marginTop': button.css('margin-top'),\r\n                    'marginBottom': button.css('margin-Bottom'),\r\n                    'marginLeft': button.css('margin-left'),\r\n                    'marginRight': button.css('margin-right'),\r\n                    'float': button.css('float'),\r\n                    'display': button.css('display')\r\n                });\r\n\r\n                button.css({\r\n                    'marginTop': 0,\r\n                    'marginBottom': 0,\r\n                    'marginLeft': 0,\r\n                    'marginRight': 0,\r\n                    'float': 'none'\r\n                });\r\n            });\r\n        }\r\n\r\n    }\r\n};\r\n\r\n/*****************************\r\n*     ADJUST ORDERBOX INPUT\r\n*****************************/\r\n\r\nutil.prototype.adjustOrderbox = {\r\n\r\n    init: function () {\r\n        if ($('.orderBox').length > 0) {\r\n\r\n            $('.orderBox').each(function () {\r\n                var totalWidth = $(this).find('label').width();\r\n                var textWidth = $(this).find('label span').width();\r\n                var inputWidth = totalWidth - textWidth - 45; //2*15 px margin, 2*5px padding, 2*1px border, 3px puffer\r\n\r\n                $(this).find('.textfield').css('width', inputWidth + 'px');\r\n\r\n            });\r\n\r\n        }\r\n\r\n    }\r\n};\r\n\r\n\r\n/*****************************\r\n*     ADJUST TextBox HEIGHTS\r\n*****************************/\r\nutil.prototype.adjustTextboxHeight = function () {\r\n    $(\".autoHeightOnLoad\").each(function () {\r\n        var el = $(this);\r\n        if ($(el)[0].scrollHeight > $(el).height() && $(el).is(\":visible\")) {\r\n            $(el).height($(el)[0].scrollHeight);\r\n        }\r\n    })\r\n}\r\n\r\n/*****************************\r\n*     ADJUST TEASER HEIGHTS\r\n*****************************/\r\n\r\nutil.prototype.adjustTeaser = {\r\n\r\n    init: function () {\r\n\r\n        if ($('.teaserRow').length > 0) {\r\n\r\n            $(window).load(function () {\r\n                $('.teaserRow').each(function () {\r\n                    //only adjust height of teasers if the current teaser row is not hidden; otherwise height would be 0px\r\n                    if (!$(this).hasClass('additionalHidden') && $(this).is(\":visible\")) {\r\n                        var maxHeight = 0;\r\n                        var teaser = $(this).find('.contentBox');\r\n\r\n                        teaser.each(function () {\r\n                            var height = $(this).height();\r\n                            if (height > maxHeight) maxHeight = height;\r\n                        });\r\n\r\n                        teaser.each(function () {\r\n                            $(this).css('height', maxHeight + 'px');\r\n                        });\r\n                    }\r\n                });\r\n\r\n            });\r\n\r\n        }\r\n    },\r\n\r\n    redo: function () {\r\n\r\n        if ($('.teaserRow').length > 0) {\r\n\r\n            $('.teaserRow').each(function () {\r\n                //only adjust height of teasers if the current teaser row is not hidden; otherwise height would be 0px\r\n                if (!$(this).hasClass('additionalHidden')) {\r\n                    var maxHeight = 0;\r\n                    var teaser = $(this).find('.contentBox');\r\n\r\n                    teaser.each(function () {\r\n                        var height = $(this).height();\r\n                        if (height > maxHeight) maxHeight = height;\r\n                    });\r\n\r\n                    teaser.each(function () {\r\n                        $(this).css('height', maxHeight + 'px');\r\n                    });\r\n                }\r\n            });\r\n\r\n        }\r\n    }\r\n\r\n};\r\n\r\n/*****************************\r\n*     ADJUST MAINNAV HEIGHTS\r\n*****************************/\r\n\r\nutil.prototype.adjustMainnav = {\r\n\r\n    init: function () {\r\n\r\n        if ($('#mainNav').length > 0) {\r\n            var maxHeight = 0;\r\n\r\n            var link = $('#mainNav li a');\r\n\r\n            link.each(function () {\r\n                var height = $(this).height();\r\n                if (height > maxHeight) maxHeight = height;\r\n            });\r\n\r\n            link.each(function () {\r\n                $(this).css('height', maxHeight + 'px');\r\n            });\r\n\r\n        }\r\n    }\r\n};\r\n\r\n/*******************************************************************************\r\ntab box\r\n*******************************************************************************/\r\n\r\n//util.prototype.tabBox = {\r\n\r\n//    init: function () {\r\n\r\n//        if ($('.tabbox').length > 0) {\r\n\r\n//            $('.tabbox').find('.tab').hide();\r\n//            $('.tabbox').find('.tab.active').show();\r\n\r\n//            $('.tabLink').each(function () {\r\n//                var twoLine = false;\r\n//                var content = $(this).html();\r\n\r\n//                if ($(this).find('br').length > 0 || content.length > 14) {\r\n//                    $(this).addClass('twoliner');\r\n//                }\r\n\r\n//            });\r\n\r\n//            $('.tabLink').click(function () {\r\n\r\n//                if (!$(this).hasClass('active')) {\r\n//                    var tabBox = $(this).parents('.tabbox');\r\n//                    var tabID = $(this).attr('href');\r\n\r\n//                    tabBox.find('.tabLink.active').removeClass('active');\r\n//                    $(this).addClass('active');\r\n\r\n//                    tabBox.find('.tab.active').hide().removeClass('active');\r\n\r\n//                    $(tabID).show().addClass('active');\r\n//                }\r\n\r\n//                return false;\r\n//            });\r\n//        }\r\n\r\n//    }\r\n\r\n//};\r\n\r\nvar util = new util();\r\n\r\n\r\n\r\n\r\n/** \r\n* Returns true if the user hit Esc or navigated away from the\r\n* current page before an AJAX call was done. (The response\r\n* headers will be null or empty, depending on the browser.) \r\n* \r\n* NOTE: this function is only meaningful when called from \r\n* inside an AJAX \"error\" callback! \r\n* \r\n* The 'xhr' param is an XMLHttpRequest instance. \r\n*/\r\n//function userAborted(xhr) {\r\n//    return !xhr.getAllResponseHeaders();\r\n//}\r\n","function existy(x) { return x != null };\r\n\r\nfunction cat() {\r\n    var head = _.first(arguments);\r\n    if (existy(head))\r\n        return head.concat.apply(head, _.rest(arguments));\r\n    else\r\n        return [];\r\n}\r\n\r\nfunction checker(/* validators */) {\r\n    var validators = _.toArray(arguments);\r\n\r\n    return function (obj) {\r\n        return _.reduce(validators, function (errs, check) {\r\n            if (check(obj))\r\n                return errs\r\n            else\r\n                return _.chain(errs).push(check.message).value();\r\n        }, []);\r\n    };\r\n}\r\n\r\nfunction validator(message, fun) {\r\n    var f = function (/* args */) {\r\n        return fun.apply(fun, arguments);\r\n    };\r\n\r\n    f['message'] = message;\r\n    return f;\r\n}\r\n\r\nfunction aMap(obj) {\r\n    return _.isObject(obj);\r\n}\r\n\r\nfunction anArray(obj) {\r\n    return _.isArray(obj);\r\n}\r\n\r\nfunction aFunction(obj) {\r\n    return _.isFunction(obj);\r\n}\r\n\r\nfunction anObservable(obj) {\r\n    return ko.isObservable(obj);\r\n}\r\n\r\nfunction hasKeys() {\r\n    var KEYS = _.toArray(arguments);\r\n\r\n    var fun = function (obj) {\r\n        return _.every(KEYS, function (k) {\r\n            return _.has(obj, k);\r\n        });\r\n    };\r\n\r\n    fun.message = cat([\"Must have values for keys:\"], KEYS).join(\" \");\r\n    return fun;\r\n}\r\n\r\nfunction must(/*data, cmd*/) {\r\n    var ps = _.toArray(arguments),\r\n\t\tdata = ps[0],\r\n\t\tcmd = checker.apply(checker, _(ps).rest(1)),\r\n\t\terrors = cmd(data);\r\n\r\n    if (!_.isEmpty(errors)) {\r\n        throw errors.join(\". \");\r\n    }\r\n}\r\n\r\n/**\r\n * Mixin Funktionalität.\r\n */\r\nfunction mixin(to, from) {\r\n    from.call(to.prototype);\r\n}\r\n\r\nfunction showAlertDialog(data) {\r\n    var dummyElement = document.createElement(\"div\");\r\n    var $dialog = $(dummyElement)\r\n        .html(\"<div>\" + ((data.message + '')) + \"</div>\")\r\n        .dialog({\r\n            open: function (event, ui) { $(\".ui-dialog-titlebar-close\", ui.dialog).hide(); },\r\n            autoOpen: false,\r\n            modal: true,\r\n            width: 400,\r\n            height: \"auto\",\r\n            title: data.title || '',\r\n            buttons: [\r\n                {\r\n                    text: culture ? dialogMLlocales[culture.slice(0,2)].OK : dialogMLlocales['en'].OK,\r\n                    click: function () {\r\n                        $(this).dialog(\"close\");\r\n                    }\r\n                }\r\n            ]\r\n        });\r\n\r\n    if (!data.title) {\r\n        $(dummyElement).parent().find('.ui-dialog-titlebar').css('display', 'none');\r\n    }\r\n\r\n    $dialog.dialog('open');\r\n};\r\n\r\nfunction showConfirmDialog(data, okCallback, cancelCallback) {\r\n    var dummyElement = document.createElement(\"div\");\r\n\r\n    var buttons = [\r\n        {\r\n            text: culture ? dialogMLlocales[culture.slice(0, 2)].OK : dialogMLlocales['en'].OK,\r\n            click: function () {\r\n                $(this).dialog(\"close\");\r\n                if (okCallback) okCallback();\r\n            }\r\n        }\r\n    ];\r\n\r\n    if (cancelCallback != null) {\r\n        buttons.push({\r\n            text: culture ? dialogMLlocales[culture.slice(0, 2)].CANCEL : dialogMLlocales['en'].CANCEL,\r\n            click: function () {\r\n                cancelCallback();\r\n                $(this).dialog(\"close\");\r\n            }\r\n        });\r\n    }\r\n\r\n\r\n    var $dialog = $(dummyElement)\r\n        .html(\"<div>\" + ((data.message + '')) + \"</div>\")\r\n        .dialog({\r\n            open: function (event, ui) { $(\".ui-dialog-titlebar-close\", ui.dialog).hide(); },\r\n            autoOpen: false,\r\n            modal: true,\r\n            width: 400,\r\n            height: \"auto\",\r\n            dialogClass: 'noTitleStuff',\r\n            title: data.title || '',\r\n            buttons: buttons\r\n        });\r\n\r\n    if (!data.title) {\r\n        $(dummyElement).parent().find('.ui-dialog-titlebar').css('display', 'none');\r\n    }\r\n    $dialog.dialog('open');\r\n   \r\n}\r\n\r\n/**\r\n * standard locales. Please add more according to ISO 639-1 standard. Multiple language variants are\r\n * unlikely to be required. If this gets too large it can be split out into separate JS files.\r\n */\r\nvar dialogMLlocales = {\r\n    ar: {\r\n        OK: \"موافق\",\r\n        CANCEL: \"الغاء\",\r\n        CONFIRM: \"تأكيد\"\r\n    },\r\n    az: {\r\n        OK: \"OK\",\r\n        CANCEL: \"İmtina et\",\r\n        CONFIRM: \"Təsdiq et\"\r\n    },\r\n    br: {\r\n        OK: \"OK\",\r\n        CANCEL: \"Cancelar\",\r\n        CONFIRM: \"Sim\"\r\n    },\r\n    cs: {\r\n        OK: \"OK\",\r\n        CANCEL: \"Zrušit\",\r\n        CONFIRM: \"Potvrdit\"\r\n    },\r\n    da: {\r\n        OK: \"OK\",\r\n        CANCEL: \"Annuller\",\r\n        CONFIRM: \"Accepter\"\r\n    },\r\n    de: {\r\n        OK: \"OK\",\r\n        CANCEL: \"Abbrechen\",\r\n        CONFIRM: \"Akzeptieren\"\r\n    },\r\n    el: {\r\n        OK: \"Εντάξει\",\r\n        CANCEL: \"Ακύρωση\",\r\n        CONFIRM: \"Επιβεβαίωση\"\r\n    },\r\n    en: {\r\n        OK: \"OK\",\r\n        CANCEL: \"Cancel\",\r\n        CONFIRM: \"OK\"\r\n    },\r\n    es: {\r\n        OK: \"OK\",\r\n        CANCEL: \"Cancelar\",\r\n        CONFIRM: \"Aceptar\"\r\n    },\r\n    eu: {\r\n        OK: \"OK\",\r\n        CANCEL: \"Ezeztatu\",\r\n        CONFIRM: \"Onartu\"\r\n    },\r\n    et: {\r\n        OK: \"OK\",\r\n        CANCEL: \"Katkesta\",\r\n        CONFIRM: \"OK\"\r\n    },\r\n    fa: {\r\n        OK: \"قبول\",\r\n        CANCEL: \"لغو\",\r\n        CONFIRM: \"تایید\"\r\n    },\r\n    fi: {\r\n        OK: \"OK\",\r\n        CANCEL: \"Peruuta\",\r\n        CONFIRM: \"OK\"\r\n    },\r\n    fr: {\r\n        OK: \"OK\",\r\n        CANCEL: \"Annuler\",\r\n        CONFIRM: \"Confirmer\"\r\n    },\r\n    he: {\r\n        OK: \"אישור\",\r\n        CANCEL: \"ביטול\",\r\n        CONFIRM: \"אישור\"\r\n    },\r\n    hu: {\r\n        OK: \"OK\",\r\n        CANCEL: \"Mégsem\",\r\n        CONFIRM: \"Megerősít\"\r\n    },\r\n    hr: {\r\n        OK: \"OK\",\r\n        CANCEL: \"Odustani\",\r\n        CONFIRM: \"Potvrdi\"\r\n    },\r\n    id: {\r\n        OK: \"OK\",\r\n        CANCEL: \"Batal\",\r\n        CONFIRM: \"OK\"\r\n    },\r\n    it: {\r\n        OK: \"OK\",\r\n        CANCEL: \"Annulla\",\r\n        CONFIRM: \"Conferma\"\r\n    },\r\n    ja: {\r\n        OK: \"OK\",\r\n        CANCEL: \"キャンセル\",\r\n        CONFIRM: \"確認\"\r\n    },\r\n    ko: {\r\n        OK: \"OK\",\r\n        CANCEL: \"취소\",\r\n        CONFIRM: \"확인\"\r\n    },\r\n    lt: {\r\n        OK: \"Gerai\",\r\n        CANCEL: \"Atšaukti\",\r\n        CONFIRM: \"Patvirtinti\"\r\n    },\r\n    lv: {\r\n        OK: \"Labi\",\r\n        CANCEL: \"Atcelt\",\r\n        CONFIRM: \"Apstiprināt\"\r\n    },\r\n    nl: {\r\n        OK: \"OK\",\r\n        CANCEL: \"Annuleren\",\r\n        CONFIRM: \"Accepteren\"\r\n    },\r\n    no: {\r\n        OK: \"OK\",\r\n        CANCEL: \"Avbryt\",\r\n        CONFIRM: \"OK\"\r\n    },\r\n    pl: {\r\n        OK: \"OK\",\r\n        CANCEL: \"Anuluj\",\r\n        CONFIRM: \"Potwierdź\"\r\n    },\r\n    pt: {\r\n        OK: \"OK\",\r\n        CANCEL: \"Cancelar\",\r\n        CONFIRM: \"Confirmar\"\r\n    },\r\n    ru: {\r\n        OK: \"OK\",\r\n        CANCEL: \"Отмена\",\r\n        CONFIRM: \"Применить\"\r\n    },\r\n    sk: {\r\n        OK: \"OK\",\r\n        CANCEL: \"Zrušiť\",\r\n        CONFIRM: \"Potvrdiť\"\r\n    },\r\n    sl: {\r\n        OK: \"OK\",\r\n        CANCEL: \"Prekliči\",\r\n        CONFIRM: \"Potrdi\"\r\n    },\r\n    sq: {\r\n        OK: \"OK\",\r\n        CANCEL: \"Anulo\",\r\n        CONFIRM: \"Prano\"\r\n    },\r\n    sv: {\r\n        OK: \"OK\",\r\n        CANCEL: \"Avbryt\",\r\n        CONFIRM: \"OK\"\r\n    },\r\n    th: {\r\n        OK: \"ตกลง\",\r\n        CANCEL: \"ยกเลิก\",\r\n        CONFIRM: \"ยืนยัน\"\r\n    },\r\n    tr: {\r\n        OK: \"Tamam\",\r\n        CANCEL: \"İptal\",\r\n        CONFIRM: \"Onayla\"\r\n    },\r\n    uk: {\r\n        OK: \"OK\",\r\n        CANCEL: \"Відміна\",\r\n        CONFIRM: \"Прийняти\"\r\n    }\r\n};\r\n\r\n(function () {\r\n    /**\r\n\t\tPerforms a jQuery ajax request with type \"METHOD\" and \"cache: false\". \r\n\t\r\n\t\t@param {string} url The url for the request \r\n        @param {object} options Add options to $.ajax()\r\n\t*/\r\n    $.postJSON = function (url, data, options) {\r\n        function sanitize(d) {\r\n            return _(d).mapObject(function (val, key) {\r\n                return _(val).isFunction()\r\n                    ? val()\r\n                    : val;\r\n            });\r\n        }\r\n\r\n        var settings = $.extend(options || {}, {\r\n            type: 'POST',\r\n            contentType: \"application/json; charset=utf-8\",\r\n            url: url,\r\n            dataType: \"json\",\r\n            data: JSON.stringify(sanitize(data))\r\n        });\r\n\r\n        return $.ajax(settings);\r\n    }\r\n\r\n    /// UUUAAAHHHH: Nach Weihnachten fixen!\r\n    $.nonSanitizedPostJSON = function (url, data, options) {\r\n        var settings = $.extend(options || {}, {\r\n            type: 'POST',\r\n            contentType: \"application/json; charset=utf-8\",\r\n            url: url,\r\n            dataType: \"json\",\r\n            data: data\r\n        });\r\n\r\n        return $.ajax(settings);\r\n    }\r\n\r\n\r\n    /**\r\n\t\tPerforms a jQuery ajax json request with global set to false. \r\n\t\r\n\t\t@param {string} url The url for the request \r\n        @param {object} options Add options to $.ajax()\r\n\t*/\r\n    $.silentGetJSON = function (url, data, options) {\r\n        var settings = $.extend(options || {}, {\r\n            type: 'GET',\r\n            contentType: \"application/json; charset=utf-8\",\r\n            url: url,\r\n            dataType: \"json\",\r\n            data: data,\r\n            global: false\r\n        });\r\n\r\n        return $.ajax(settings);\r\n    }\r\n\r\n    /**\r\n\t\tPerforms a jQuery ajax json request with global set to false. \r\n\t\r\n\t\t@param {string} url The url for the request \r\n        @param {object} options Add options to $.ajax()\r\n\t*/\r\n    $.silentPostJSON = function (url, data, options) {\r\n        var settings = $.extend(options || {}, {\r\n            type: 'POST',\r\n            contentType: \"application/json; charset=utf-8\",\r\n            url: url,\r\n            dataType: \"json\",\r\n            data: data,\r\n            global: false\r\n        });\r\n\r\n        return $.ajax(settings);\r\n    }\r\n\r\n    /**\r\n     * Add number of days to date\r\n     */\r\n    Date.prototype.addDays = function (days) {\r\n        var dat = new Date(this.valueOf());\r\n        dat.setDate(dat.getDate() + days);\r\n        return dat;\r\n    }\r\n\r\n    Date.prototype.yyyymmdd = function () {\r\n        var mm = this.getMonth() + 1; // getMonth() is zero-based\r\n        var dd = this.getDate();\r\n\r\n        return [this.getFullYear(),\r\n                (mm > 9 ? '' : '0') + mm,\r\n                (dd > 9 ? '' : '0') + dd\r\n        ].join('');\r\n    };\r\n})();","\r\n//$(document).ajaxError(function (event, jqxhr, settings, exception) {\r\n//    if (jqxhr.status == 403) {\r\n//        window.location.href = \"/UI\";\r\n//    } else {\r\n//        if (!userAborted(jqxhr)) {\r\n//            alert('' + jqxhr.statusText);\r\n//        }\r\n//    }\r\n//});\r\n\r\n$.ajaxSetup({\r\n    error: function (xhr, status, err) {\r\n        var code = xhr.status;\r\n\r\n        //check for 403 (forbidden on session expired)\r\n        if (code == 403) {\r\n            try {\r\n                //normally we get an url from server where to redirect.\r\n                var data = JSON.parse(xhr.responseText);\r\n                if ((data) && (data.SessionExpiredReturnUrl)) {\r\n                    window.location = data.SessionExpiredReturnUrl;\r\n                }\r\n            } catch (e) {\r\n                alert(e.message);\r\n            }\r\n        } else {\r\n            if (!userAborted(xhr)) {\r\n                //alert('' + xhr.statusText);\r\n            }\r\n        }\r\n    }\r\n});\r\n\r\n//register some global handlers\r\n$().ready(function () {\r\n    //register the script for checking logout (e.g. deleting basket items on logout)\r\n    $(\".warnOnLogout\").click(function (event) {\r\n        event.preventDefault();\r\n        var logoutVm = new LogOutViewModel();\r\n        logoutVm.LogOutUrl = $(this).attr('href');\r\n        \r\n        //get the logout infos\r\n        $.when(logoutVm.GetLogoutInfosAjaxUrl())\r\n        .then(function (data) {\r\n\r\n            //if we have items in basket show the dialog, else logout the user\r\n            if (data.ShowDialog) {\r\n                logoutVm.ShowDialog(data);\r\n            }\r\n            else {\r\n                window.location = logoutVm.LogOutUrl;\r\n            } \r\n        });\r\n    });\r\n})\r\n\r\n\r\nvar LogOutViewModel = function () {\r\n    var self = this;\r\n\r\n    self.GetLogoutInfosAjaxUrl = function () {\r\n        var data = {};\r\n\r\n        return $.ajax({\r\n            type: 'POST',\r\n            url: getLogoutInfosAjaxUrl,\r\n            data: null, //ko.mapping.toJSON(data),\r\n            contentType: \"application/json\",\r\n            dataType: 'json'\r\n        });\r\n    };\r\n\r\n    self.DeleteBasket = function (url) {\r\n        var data = {};\r\n\r\n        return $.ajax({\r\n            type: 'POST',\r\n            url: url,\r\n            data: null, //ko.mapping.toJSON(data),\r\n            contentType: \"application/json\",\r\n            dataType: 'json'\r\n        });\r\n    };\r\n\r\n    self.ShowDialog = function (data) {\r\n        var $dialog = $('<div id=\"logOutDialog\"></div>')\r\n            .html(\"<div class='logOutDialogText'>\" + ((data.Message + '')) + \"</div>\")\r\n            .dialog({\r\n                open: function (event, ui) { $(\".ui-dialog-titlebar-close\", ui.dialog).hide(); },\r\n                autoOpen: false,\r\n                modal: true,\r\n                width: 400,\r\n                height: \"auto\",\r\n                title: '',\r\n                buttons: [\r\n                    {\r\n                        text: data.Ok,\r\n                        click: function () {\r\n                            $(this).dialog(\"close\");\r\n                            window.location = self.LogOutUrl;\r\n                        }\r\n                    },\r\n                    {\r\n                        text: data.Cancel,\r\n                        click: function () {\r\n                            $.when(self.DeleteBasket(data.DeleteUrl))\r\n                                .then(function () {\r\n                                    //$(this).dialog(\"close\");\r\n                                    window.location = self.LogOutUrl;\r\n                                });\r\n                        }\r\n                    }\r\n                ]\r\n            });       \r\n        $dialog.dialog('open');\r\n    };\r\n}\r\n"]}