openc3-cosmos-tool-docs 6.5.0 → 6.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. checksums.yaml +4 -4
  2. data/tools/staticdocs/404.html +1 -1
  3. data/tools/staticdocs/assets/js/0f5d161c.e43dd7c9.js +1 -0
  4. data/tools/staticdocs/assets/js/103cc3be.3f08893f.js +1 -0
  5. data/tools/staticdocs/assets/js/{13196248.e1f20841.js → 13196248.68e92816.js} +1 -1
  6. data/tools/staticdocs/assets/js/{13c1b4e4.58a03be2.js → 13c1b4e4.b83f8041.js} +1 -1
  7. data/tools/staticdocs/assets/js/1e02e6a3.7cea97a5.js +1 -0
  8. data/tools/staticdocs/assets/js/{2047b354.58bf5de8.js → 2047b354.573199a8.js} +1 -1
  9. data/tools/staticdocs/assets/js/3687.0a024e4c.js +101 -0
  10. data/tools/staticdocs/assets/js/40365d27.4fe19af4.js +1 -0
  11. data/tools/staticdocs/assets/js/54d0d530.97fd90e6.js +1 -0
  12. data/tools/staticdocs/assets/js/{6b65133b.c431a22a.js → 6b65133b.c36fb840.js} +1 -1
  13. data/tools/staticdocs/assets/js/75e64983.2bd986ec.js +1 -0
  14. data/tools/staticdocs/assets/js/{7719.d199daa3.js → 7719.dfa27269.js} +1 -1
  15. data/tools/staticdocs/assets/js/80c97f38.997e4e37.js +1 -0
  16. data/tools/staticdocs/assets/js/89e76475.4d439119.js +1 -0
  17. data/tools/staticdocs/assets/js/b4596165.7dc1e14d.js +1 -0
  18. data/tools/staticdocs/assets/js/cb8c3f08.7688d6b1.js +1 -0
  19. data/tools/staticdocs/assets/js/cd879be4.1aff15e7.js +1 -0
  20. data/tools/staticdocs/assets/js/d5d77c37.51a1f08e.js +1 -0
  21. data/tools/staticdocs/assets/js/dbe31111.a7be0442.js +1 -0
  22. data/tools/staticdocs/assets/js/main.54699355.js +38 -0
  23. data/tools/staticdocs/assets/js/runtime~main.2a93017a.js +1 -0
  24. data/tools/staticdocs/docs/configuration/accessors.html +1 -1
  25. data/tools/staticdocs/docs/configuration/command.html +1 -1
  26. data/tools/staticdocs/docs/configuration/conversions.html +1 -1
  27. data/tools/staticdocs/docs/configuration/format.html +1 -1
  28. data/tools/staticdocs/docs/configuration/interfaces.html +1 -1
  29. data/tools/staticdocs/docs/configuration/limits-response.html +1 -1
  30. data/tools/staticdocs/docs/configuration/plugins.html +1 -1
  31. data/tools/staticdocs/docs/configuration/processors.html +1 -1
  32. data/tools/staticdocs/docs/configuration/protocols.html +1 -1
  33. data/tools/staticdocs/docs/configuration/ssl-tls.html +1 -1
  34. data/tools/staticdocs/docs/configuration/table.html +1 -1
  35. data/tools/staticdocs/docs/configuration/target.html +1 -1
  36. data/tools/staticdocs/docs/configuration/telemetry-screens.html +1 -1
  37. data/tools/staticdocs/docs/configuration/telemetry.html +1 -1
  38. data/tools/staticdocs/docs/configuration.html +1 -1
  39. data/tools/staticdocs/docs/development/curl.html +1 -1
  40. data/tools/staticdocs/docs/development/developing.html +1 -1
  41. data/tools/staticdocs/docs/development/json-api.html +1 -1
  42. data/tools/staticdocs/docs/development/log-structure.html +1 -1
  43. data/tools/staticdocs/docs/development/roadmap.html +1 -1
  44. data/tools/staticdocs/docs/development/streaming-api.html +1 -1
  45. data/tools/staticdocs/docs/development/testing.html +1 -1
  46. data/tools/staticdocs/docs/development.html +1 -1
  47. data/tools/staticdocs/docs/getting-started/cli.html +1 -1
  48. data/tools/staticdocs/docs/getting-started/generators.html +1 -1
  49. data/tools/staticdocs/docs/getting-started/gettingstarted.html +1 -1
  50. data/tools/staticdocs/docs/getting-started/installation.html +1 -1
  51. data/tools/staticdocs/docs/getting-started/key-concepts.html +1 -1
  52. data/tools/staticdocs/docs/getting-started/podman.html +1 -1
  53. data/tools/staticdocs/docs/getting-started/requirements.html +1 -1
  54. data/tools/staticdocs/docs/getting-started/upgrading.html +4 -4
  55. data/tools/staticdocs/docs/getting-started.html +1 -1
  56. data/tools/staticdocs/docs/guides/bridges.html +1 -1
  57. data/tools/staticdocs/docs/guides/cfs.html +1 -1
  58. data/tools/staticdocs/docs/guides/custom-widgets.html +1 -1
  59. data/tools/staticdocs/docs/guides/dynamic-packets.html +1 -1
  60. data/tools/staticdocs/docs/guides/exposing-microservices.html +1 -1
  61. data/tools/staticdocs/docs/guides/little-endian-bitfields.html +1 -1
  62. data/tools/staticdocs/docs/guides/local-mode.html +1 -1
  63. data/tools/staticdocs/docs/guides/logging.html +1 -1
  64. data/tools/staticdocs/docs/guides/monitoring.html +1 -1
  65. data/tools/staticdocs/docs/guides/performance.html +1 -1
  66. data/tools/staticdocs/docs/guides/raspberrypi.html +1 -1
  67. data/tools/staticdocs/docs/guides/reference-architectures.html +1 -1
  68. data/tools/staticdocs/docs/guides/script-writing.html +1 -1
  69. data/tools/staticdocs/docs/guides/scripting-api.html +1 -1
  70. data/tools/staticdocs/docs/guides.html +1 -1
  71. data/tools/staticdocs/docs/meta/contributing.html +1 -1
  72. data/tools/staticdocs/docs/meta/licenses.html +1 -1
  73. data/tools/staticdocs/docs/meta/philosophy.html +1 -1
  74. data/tools/staticdocs/docs/meta/xtce.html +1 -1
  75. data/tools/staticdocs/docs/meta.html +1 -1
  76. data/tools/staticdocs/docs/privacy.html +1 -1
  77. data/tools/staticdocs/docs/tools/admin.html +1 -1
  78. data/tools/staticdocs/docs/tools/autonomic.html +1 -1
  79. data/tools/staticdocs/docs/tools/bucket-explorer.html +1 -1
  80. data/tools/staticdocs/docs/tools/calendar.html +1 -1
  81. data/tools/staticdocs/docs/tools/cmd-sender.html +1 -1
  82. data/tools/staticdocs/docs/tools/cmd-tlm-server.html +1 -1
  83. data/tools/staticdocs/docs/tools/command_history.html +1 -1
  84. data/tools/staticdocs/docs/tools/data-extractor.html +1 -1
  85. data/tools/staticdocs/docs/tools/data-viewer.html +1 -1
  86. data/tools/staticdocs/docs/tools/handbooks.html +1 -1
  87. data/tools/staticdocs/docs/tools/limits-monitor.html +1 -1
  88. data/tools/staticdocs/docs/tools/packet-viewer.html +1 -1
  89. data/tools/staticdocs/docs/tools/script-runner.html +1 -1
  90. data/tools/staticdocs/docs/tools/systemhealth.html +1 -1
  91. data/tools/staticdocs/docs/tools/table-manager.html +1 -1
  92. data/tools/staticdocs/docs/tools/tlm-grapher.html +1 -1
  93. data/tools/staticdocs/docs/tools/tlm-viewer.html +1 -1
  94. data/tools/staticdocs/docs/tools.html +2 -2
  95. data/tools/staticdocs/docs.html +1 -1
  96. data/tools/staticdocs/index.html +1 -1
  97. data/tools/staticdocs/lunr-index-1751323751078.json +1 -0
  98. data/tools/staticdocs/lunr-index.json +1 -1
  99. data/tools/staticdocs/markdown-page.html +1 -1
  100. data/tools/staticdocs/search-doc-1751323751078.json +1 -0
  101. data/tools/staticdocs/search-doc.json +1 -1
  102. metadata +24 -24
  103. data/tools/staticdocs/assets/js/0f5d161c.bc74590c.js +0 -1
  104. data/tools/staticdocs/assets/js/103cc3be.b15ac140.js +0 -1
  105. data/tools/staticdocs/assets/js/1e02e6a3.68a73184.js +0 -1
  106. data/tools/staticdocs/assets/js/3687.062fee32.js +0 -101
  107. data/tools/staticdocs/assets/js/40365d27.cdd0a061.js +0 -1
  108. data/tools/staticdocs/assets/js/54d0d530.9fccf082.js +0 -1
  109. data/tools/staticdocs/assets/js/75e64983.31d1e579.js +0 -1
  110. data/tools/staticdocs/assets/js/80c97f38.4f6a5637.js +0 -1
  111. data/tools/staticdocs/assets/js/89e76475.a0353bb2.js +0 -1
  112. data/tools/staticdocs/assets/js/b4596165.a2357781.js +0 -1
  113. data/tools/staticdocs/assets/js/cb8c3f08.0de82997.js +0 -1
  114. data/tools/staticdocs/assets/js/cd879be4.d650ab29.js +0 -1
  115. data/tools/staticdocs/assets/js/d5d77c37.a1299467.js +0 -1
  116. data/tools/staticdocs/assets/js/dbe31111.8f1677f3.js +0 -1
  117. data/tools/staticdocs/assets/js/main.8c741ee1.js +0 -38
  118. data/tools/staticdocs/assets/js/runtime~main.7674b06d.js +0 -1
  119. data/tools/staticdocs/lunr-index-1749788530521.json +0 -1
  120. data/tools/staticdocs/search-doc-1749788530521.json +0 -1
@@ -0,0 +1,101 @@
1
+ (self.webpackChunkdocs_openc3_com=self.webpackChunkdocs_openc3_com||[]).push([["3687"],{282:function(e,t,n){"use strict";e.exports=n(8694)},8928:function(e,t,n){"use strict";var i=n(488),r={wrapper:{position:"relative",display:"inline-block"},hint:{position:"absolute",top:"0",left:"0",borderColor:"transparent",boxShadow:"none",opacity:"1"},input:{position:"relative",verticalAlign:"top",backgroundColor:"transparent"},inputWithNoHint:{position:"relative",verticalAlign:"top"},dropdown:{position:"absolute",top:"100%",left:"0",zIndex:"100",display:"none"},suggestions:{display:"block"},suggestion:{whiteSpace:"nowrap",cursor:"pointer"},suggestionChild:{whiteSpace:"normal"},ltr:{left:"0",right:"auto"},rtl:{left:"auto",right:"0"},defaultClasses:{root:"algolia-autocomplete",prefix:"aa",noPrefix:!1,dropdownMenu:"dropdown-menu",input:"input",hint:"hint",suggestions:"suggestions",suggestion:"suggestion",cursor:"cursor",dataset:"dataset",empty:"empty"},appendTo:{wrapper:{position:"absolute",zIndex:"100",display:"none"},input:{},inputWithNoHint:{},dropdown:{display:"block"}}};i.isMsie()&&i.mixin(r.input,{backgroundImage:"url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)"}),i.isMsie()&&7>=i.isMsie()&&i.mixin(r.input,{marginTop:"-1px"}),e.exports=r},4371:function(e,t,n){"use strict";var i="aaDataset",r="aaValue",s="aaDatum",o=n(488),a=n(4548),u=n(4570),c=n(8928),l=n(9953);function h(e){(e=e||{}).templates=e.templates||{},e.source||o.error("missing source"),e.name&&(t=e.name,!/^[_a-zA-Z0-9-]+$/.test(t))&&o.error("invalid dataset name: "+e.name),this.query=null,this._isEmpty=!0,this.highlight=!!e.highlight,this.name=void 0===e.name||null===e.name?o.getUniqueId():e.name,this.source=e.source,this.displayFn=(n=(n=e.display||e.displayKey)||"value",o.isFunction(n)?n:function(e){return e[n]}),this.debounce=e.debounce,this.cache=!1!==e.cache,this.templates=(i=e.templates,r=this.displayFn,{empty:i.empty&&o.templatify(i.empty),header:i.header&&o.templatify(i.header),footer:i.footer&&o.templatify(i.footer),suggestion:i.suggestion||function(e){return"<p>"+r(e)+"</p>"}}),this.css=o.mixin({},c,e.appendTo?c.appendTo:{}),this.cssClasses=e.cssClasses=o.mixin({},c.defaultClasses,e.cssClasses||{}),this.cssClasses.prefix=e.cssClasses.formattedPrefix||o.formatPrefix(this.cssClasses.prefix,this.cssClasses.noPrefix);var t,n,i,r,s=o.className(this.cssClasses.prefix,this.cssClasses.dataset);this.$el=e.$menu&&e.$menu.find(s+"-"+this.name).length>0?a.element(e.$menu.find(s+"-"+this.name)[0]):a.element(u.dataset.replace("%CLASS%",this.name).replace("%PREFIX%",this.cssClasses.prefix).replace("%DATASET%",this.cssClasses.dataset)),this.$menu=e.$menu,this.clearCachedSuggestions()}h.extractDatasetName=function(e){return a.element(e).data(i)},h.extractValue=function(e){return a.element(e).data(r)},h.extractDatum=function(e){var t=a.element(e).data(s);return"string"==typeof t&&(t=JSON.parse(t)),t},o.mixin(h.prototype,l,{_render:function(e,t){if(this.$el){var n,c=this,l=[].slice.call(arguments,2);if(this.$el.empty(),n=t&&t.length,this._isEmpty=!n,!n&&this.templates.empty)this.$el.html((function(){var t=[].slice.call(arguments,0);return t=[{query:e,isEmpty:!0}].concat(t),c.templates.empty.apply(this,t)}).apply(this,l)).prepend(c.templates.header?h.apply(this,l):null).append(c.templates.footer?p.apply(this,l):null);else if(n)this.$el.html((function(){var e,n,l=[].slice.call(arguments,0),h=this,p=u.suggestions.replace("%PREFIX%",this.cssClasses.prefix).replace("%SUGGESTIONS%",this.cssClasses.suggestions);return e=a.element(p).css(this.css.suggestions),n=o.map(t,function(e){var t,n=u.suggestion.replace("%PREFIX%",h.cssClasses.prefix).replace("%SUGGESTION%",h.cssClasses.suggestion);return(t=a.element(n).attr({role:"option",id:["option",Math.floor(1e8*Math.random())].join("-")}).append(c.templates.suggestion.apply(this,[e].concat(l)))).data(i,c.name),t.data(r,c.displayFn(e)||void 0),t.data(s,JSON.stringify(e)),t.children().each(function(){a.element(this).css(h.css.suggestionChild)}),t}),e.append.apply(e,n),e}).apply(this,l)).prepend(c.templates.header?h.apply(this,l):null).append(c.templates.footer?p.apply(this,l):null);else if(t&&!Array.isArray(t))throw TypeError("suggestions must be an array");this.$menu&&this.$menu.addClass(this.cssClasses.prefix+(n?"with":"without")+"-"+this.name).removeClass(this.cssClasses.prefix+(n?"without":"with")+"-"+this.name),this.trigger("rendered",e)}function h(){var t=[].slice.call(arguments,0);return t=[{query:e,isEmpty:!n}].concat(t),c.templates.header.apply(this,t)}function p(){var t=[].slice.call(arguments,0);return t=[{query:e,isEmpty:!n}].concat(t),c.templates.footer.apply(this,t)}},getRoot:function(){return this.$el},update:function(e){function t(t){if(!this.canceled&&e===this.query){var n=[].slice.call(arguments,1);this.cacheSuggestions(e,t,n),this._render.apply(this,[e,t].concat(n))}}if(this.query=e,this.canceled=!1,this.shouldFetchFromCache(e))t.apply(this,[this.cachedSuggestions].concat(this.cachedRenderExtraArgs));else{var n=this,i=function(){n.canceled||n.source(e,t.bind(n))};this.debounce?(clearTimeout(this.debounceTimeout),this.debounceTimeout=setTimeout(function(){n.debounceTimeout=null,i()},this.debounce)):i()}},cacheSuggestions:function(e,t,n){this.cachedQuery=e,this.cachedSuggestions=t,this.cachedRenderExtraArgs=n},shouldFetchFromCache:function(e){return this.cache&&this.cachedQuery===e&&this.cachedSuggestions&&this.cachedSuggestions.length},clearCachedSuggestions:function(){delete this.cachedQuery,delete this.cachedSuggestions,delete this.cachedRenderExtraArgs},cancel:function(){this.canceled=!0},clear:function(){this.$el&&(this.cancel(),this.$el.empty(),this.trigger("rendered",""))},isEmpty:function(){return this._isEmpty},destroy:function(){this.clearCachedSuggestions(),this.$el=null}}),e.exports=h},2034:function(e,t,n){"use strict";var i=n(488),r=n(4548),s=n(9953),o=n(4371),a=n(8928);function u(e){var t,n,s,o=this;(e=e||{}).menu||i.error("menu is required"),i.isArray(e.datasets)||i.isObject(e.datasets)||i.error("1 or more datasets required"),e.datasets||i.error("datasets is required"),this.isOpen=!1,this.isEmpty=!0,this.minLength=e.minLength||0,this.templates={},this.appendTo=e.appendTo||!1,this.css=i.mixin({},a,e.appendTo?a.appendTo:{}),this.cssClasses=e.cssClasses=i.mixin({},a.defaultClasses,e.cssClasses||{}),this.cssClasses.prefix=e.cssClasses.formattedPrefix||i.formatPrefix(this.cssClasses.prefix,this.cssClasses.noPrefix),t=i.bind(this._onSuggestionClick,this),n=i.bind(this._onSuggestionMouseEnter,this),s=i.bind(this._onSuggestionMouseLeave,this);var c=i.className(this.cssClasses.prefix,this.cssClasses.suggestion);this.$menu=r.element(e.menu).on("mouseenter.aa",c,n).on("mouseleave.aa",c,s).on("click.aa",c,t),this.$container=e.appendTo?e.wrapper:this.$menu,e.templates&&e.templates.header&&(this.templates.header=i.templatify(e.templates.header),this.$menu.prepend(this.templates.header())),e.templates&&e.templates.empty&&(this.templates.empty=i.templatify(e.templates.empty),this.$empty=r.element('<div class="'+i.className(this.cssClasses.prefix,this.cssClasses.empty,!0)+'"></div>'),this.$menu.append(this.$empty),this.$empty.hide()),this.datasets=i.map(e.datasets,function(t){var n,r,s;return n=o.$menu,r=t,s=e.cssClasses,new u.Dataset(i.mixin({$menu:n,cssClasses:s},r))}),i.each(this.datasets,function(e){var t=e.getRoot();t&&0===t.parent().length&&o.$menu.append(t),e.onSync("rendered",o._onRendered,o)}),e.templates&&e.templates.footer&&(this.templates.footer=i.templatify(e.templates.footer),this.$menu.append(this.templates.footer()));var l=this;r.element(window).resize(function(){l._redraw()})}i.mixin(u.prototype,s,{_onSuggestionClick:function(e){this.trigger("suggestionClicked",r.element(e.currentTarget))},_onSuggestionMouseEnter:function(e){var t=r.element(e.currentTarget);if(!t.hasClass(i.className(this.cssClasses.prefix,this.cssClasses.cursor,!0))){this._removeCursor();var n=this;setTimeout(function(){n._setCursor(t,!1)},0)}},_onSuggestionMouseLeave:function(e){e.relatedTarget&&r.element(e.relatedTarget).closest("."+i.className(this.cssClasses.prefix,this.cssClasses.cursor,!0)).length>0||(this._removeCursor(),this.trigger("cursorRemoved"))},_onRendered:function(e,t){if(this.isEmpty=i.every(this.datasets,function(e){return e.isEmpty()}),this.isEmpty)if(t.length>=this.minLength&&this.trigger("empty"),this.$empty)if(t.length<this.minLength)this._hide();else{var n=this.templates.empty({query:this.datasets[0]&&this.datasets[0].query});this.$empty.html(n),this.$empty.show(),this._show()}else i.any(this.datasets,function(e){return e.templates&&e.templates.empty})?t.length<this.minLength?this._hide():this._show():this._hide();else this.isOpen&&(this.$empty&&(this.$empty.empty(),this.$empty.hide()),t.length>=this.minLength?this._show():this._hide());this.trigger("datasetRendered")},_hide:function(){this.$container.hide()},_show:function(){this.$container.css("display","block"),this._redraw(),this.trigger("shown")},_redraw:function(){this.isOpen&&this.appendTo&&this.trigger("redrawn")},_getSuggestions:function(){return this.$menu.find(i.className(this.cssClasses.prefix,this.cssClasses.suggestion))},_getCursor:function(){return this.$menu.find(i.className(this.cssClasses.prefix,this.cssClasses.cursor)).first()},_setCursor:function(e,t){e.first().addClass(i.className(this.cssClasses.prefix,this.cssClasses.cursor,!0)).attr("aria-selected","true"),this.trigger("cursorMoved",t)},_removeCursor:function(){this._getCursor().removeClass(i.className(this.cssClasses.prefix,this.cssClasses.cursor,!0)).removeAttr("aria-selected")},_moveCursor:function(e){var t,n,i,r;if(this.isOpen){if(n=this._getCursor(),t=this._getSuggestions(),this._removeCursor(),-1==(i=((i=t.index(n)+e)+1)%(t.length+1)-1))return void this.trigger("cursorRemoved");i<-1&&(i=t.length-1),this._setCursor(r=t.eq(i),!0),this._ensureVisible(r)}},_ensureVisible:function(e){var t,n,i,r;n=(t=e.position().top)+e.height()+parseInt(e.css("margin-top"),10)+parseInt(e.css("margin-bottom"),10),i=this.$menu.scrollTop(),r=this.$menu.height()+parseInt(this.$menu.css("padding-top"),10)+parseInt(this.$menu.css("padding-bottom"),10),t<0?this.$menu.scrollTop(i+t):r<n&&this.$menu.scrollTop(i+(n-r))},close:function(){this.isOpen&&(this.isOpen=!1,this._removeCursor(),this._hide(),this.trigger("closed"))},open:function(){this.isOpen||(this.isOpen=!0,this.isEmpty||this._show(),this.trigger("opened"))},setLanguageDirection:function(e){this.$menu.css("ltr"===e?this.css.ltr:this.css.rtl)},moveCursorUp:function(){this._moveCursor(-1)},moveCursorDown:function(){this._moveCursor(1)},getDatumForSuggestion:function(e){var t=null;return e.length&&(t={raw:o.extractDatum(e),value:o.extractValue(e),datasetName:o.extractDatasetName(e)}),t},getCurrentCursor:function(){return this._getCursor().first()},getDatumForCursor:function(){return this.getDatumForSuggestion(this._getCursor().first())},getDatumForTopSuggestion:function(){return this.getDatumForSuggestion(this._getSuggestions().first())},cursorTopSuggestion:function(){this._setCursor(this._getSuggestions().first(),!1)},update:function(e){i.each(this.datasets,function(t){t.update(e)})},empty:function(){i.each(this.datasets,function(e){e.clear()}),this.isEmpty=!0},isVisible:function(){return this.isOpen&&!this.isEmpty},destroy:function(){this.$menu.off(".aa"),this.$menu=null,i.each(this.datasets,function(e){e.destroy()})}}),u.Dataset=o,e.exports=u},6809:function(e,t,n){"use strict";var i=n(488),r=n(4548);function s(e){e&&e.el||i.error("EventBus initialized without el"),this.$el=r.element(e.el)}i.mixin(s.prototype,{trigger:function(e,t,n,r){var s=i.Event("autocomplete:"+e);return this.$el.trigger(s,[t,n,r]),s}}),e.exports=s},9953:function(e,t,n){"use strict";var i=n(108),r=/\s+/;function s(e,t,n,i){var s,o,a;if(!n)return this;for(t=t.split(r),n=i?(o=n,a=i,o.bind?o.bind(a):function(){o.apply(a,[].slice.call(arguments,0))}):n,this._callbacks=this._callbacks||{};s=t.shift();)this._callbacks[s]=this._callbacks[s]||{sync:[],async:[]},this._callbacks[s][e].push(n);return this}function o(e,t,n){return function(){for(var i,r=0,s=e.length;!i&&r<s;r+=1)i=!1===e[r].apply(t,n);return!i}}e.exports={onSync:function(e,t,n){return s.call(this,"sync",e,t,n)},onAsync:function(e,t,n){return s.call(this,"async",e,t,n)},off:function(e){var t;if(!this._callbacks)return this;for(e=e.split(r);t=e.shift();)delete this._callbacks[t];return this},trigger:function(e){var t,n,s,a,u;if(!this._callbacks)return this;for(e=e.split(r),s=[].slice.call(arguments,1);(t=e.shift())&&(n=this._callbacks[t]);)a=o(n.sync,this,[t].concat(s)),u=o(n.async,this,[t].concat(s)),a()&&i(u);return this}}},4570:function(e){"use strict";e.exports={wrapper:'<span class="%ROOT%"></span>',dropdown:'<span class="%PREFIX%%DROPDOWN_MENU%"></span>',dataset:'<div class="%PREFIX%%DATASET%-%CLASS%"></div>',suggestions:'<span class="%PREFIX%%SUGGESTIONS%"></span>',suggestion:'<div class="%PREFIX%%SUGGESTION%"></div>'}},1036:function(e,t,n){"use strict";var i={9:"tab",27:"esc",37:"left",39:"right",13:"enter",38:"up",40:"down"},r=n(488),s=n(4548),o=n(9953);function a(e){var t,n,o,a,u,c=this;(e=e||{}).input||r.error("input is missing"),n=r.bind(this._onBlur,this),o=r.bind(this._onFocus,this),a=r.bind(this._onKeydown,this),u=r.bind(this._onInput,this),this.$hint=s.element(e.hint),this.$input=s.element(e.input).on("blur.aa",n).on("focus.aa",o).on("keydown.aa",a),0===this.$hint.length&&(this.setHint=this.getHint=this.clearHint=this.clearHintIfInvalid=r.noop),r.isMsie()?this.$input.on("keydown.aa keypress.aa cut.aa paste.aa",function(e){i[e.which||e.keyCode]||r.defer(r.bind(c._onInput,c,e))}):this.$input.on("input.aa",u),this.query=this.$input.val(),this.$overflowHelper=(t=this.$input,s.element('<pre aria-hidden="true"></pre>').css({position:"absolute",visibility:"hidden",whiteSpace:"pre",fontFamily:t.css("font-family"),fontSize:t.css("font-size"),fontStyle:t.css("font-style"),fontVariant:t.css("font-variant"),fontWeight:t.css("font-weight"),wordSpacing:t.css("word-spacing"),letterSpacing:t.css("letter-spacing"),textIndent:t.css("text-indent"),textRendering:t.css("text-rendering"),textTransform:t.css("text-transform")}).insertAfter(t))}function u(e){return e.altKey||e.ctrlKey||e.metaKey||e.shiftKey}a.normalizeQuery=function(e){return(e||"").replace(/^\s*/g,"").replace(/\s{2,}/g," ")},r.mixin(a.prototype,o,{_onBlur:function(){this.resetInputValue(),this.$input.removeAttr("aria-activedescendant"),this.trigger("blurred")},_onFocus:function(){this.trigger("focused")},_onKeydown:function(e){var t=i[e.which||e.keyCode];this._managePreventDefault(t,e),t&&this._shouldTrigger(t,e)&&this.trigger(t+"Keyed",e)},_onInput:function(){this._checkInputValue()},_managePreventDefault:function(e,t){var n,i,r;switch(e){case"tab":i=this.getHint(),r=this.getInputValue(),n=i&&i!==r&&!u(t);break;case"up":case"down":n=!u(t);break;default:n=!1}n&&t.preventDefault()},_shouldTrigger:function(e,t){return"tab"!==e||!u(t)},_checkInputValue:function(){var e,t,n,i,r;n=(i=e=this.getInputValue(),r=this.query,!!(t=a.normalizeQuery(i)===a.normalizeQuery(r))&&!!this.query&&this.query.length!==e.length),this.query=e,t?n&&this.trigger("whitespaceChanged",this.query):this.trigger("queryChanged",this.query)},focus:function(){this.$input.focus()},blur:function(){this.$input.blur()},getQuery:function(){return this.query},setQuery:function(e){this.query=e},getInputValue:function(){return this.$input.val()},setInputValue:function(e,t){void 0===e&&(e=this.query),this.$input.val(e),t?this.clearHint():this._checkInputValue()},expand:function(){this.$input.attr("aria-expanded","true")},collapse:function(){this.$input.attr("aria-expanded","false")},setActiveDescendant:function(e){this.$input.attr("aria-activedescendant",e)},removeActiveDescendant:function(){this.$input.removeAttr("aria-activedescendant")},resetInputValue:function(){this.setInputValue(this.query,!0)},getHint:function(){return this.$hint.val()},setHint:function(e){this.$hint.val(e)},clearHint:function(){this.setHint("")},clearHintIfInvalid:function(){var e,t,n;n=(e=this.getInputValue())!==(t=this.getHint())&&0===t.indexOf(e),""!==e&&n&&!this.hasOverflow()||this.clearHint()},getLanguageDirection:function(){return(this.$input.css("direction")||"ltr").toLowerCase()},hasOverflow:function(){var e=this.$input.width()-2;return this.$overflowHelper.text(this.getInputValue()),this.$overflowHelper.width()>=e},isCursorAtEnd:function(){var e,t,n;return(e=this.$input.val().length,t=this.$input[0].selectionStart,r.isNumber(t))?t===e:!document.selection||((n=document.selection.createRange()).moveStart("character",-e),e===n.text.length)},destroy:function(){this.$hint.off(".aa"),this.$input.off(".aa"),this.$hint=this.$input=this.$overflowHelper=null}}),e.exports=a},8113:function(e,t,n){"use strict";var i="aaAttrs",r=n(488),s=n(4548),o=n(6809),a=n(1036),u=n(2034),c=n(4570),l=n(8928);function h(e){if((e=e||{}).input||r.error("missing input"),this.isActivated=!1,this.debug=!!e.debug,this.autoselect=!!e.autoselect,this.autoselectOnBlur=!!e.autoselectOnBlur,this.openOnFocus=!!e.openOnFocus,this.minLength=r.isNumber(e.minLength)?e.minLength:1,this.autoWidth=void 0===e.autoWidth||!!e.autoWidth,this.clearOnSelected=!!e.clearOnSelected,this.tabAutocomplete=void 0===e.tabAutocomplete||!!e.tabAutocomplete,e.hint=!!e.hint,e.hint&&e.appendTo)throw Error("[autocomplete.js] hint and appendTo options can't be used at the same time");this.css=e.css=r.mixin({},l,e.appendTo?l.appendTo:{}),this.cssClasses=e.cssClasses=r.mixin({},l.defaultClasses,e.cssClasses||{}),this.cssClasses.prefix=e.cssClasses.formattedPrefix=r.formatPrefix(this.cssClasses.prefix,this.cssClasses.noPrefix),this.listboxId=e.listboxId=[this.cssClasses.root,"listbox",r.getUniqueId()].join("-");var t,n,a=function(e){n=s.element(e.input),o=s.element(c.wrapper.replace("%ROOT%",e.cssClasses.root)).css(e.css.wrapper),e.appendTo||"block"!==n.css("display")||"table"!==n.parent().css("display")||o.css("display","table-cell");var t,n,o,a,u,l=c.dropdown.replace("%PREFIX%",e.cssClasses.prefix).replace("%DROPDOWN_MENU%",e.cssClasses.dropdownMenu);a=s.element(l).css(e.css.dropdown).attr({role:"listbox",id:e.listboxId}),e.templates&&e.templates.dropdownMenu&&a.html(r.templatify(e.templates.dropdownMenu)()),(u=n.clone().css(e.css.hint).css({backgroundAttachment:(t=n).css("background-attachment"),backgroundClip:t.css("background-clip"),backgroundColor:t.css("background-color"),backgroundImage:t.css("background-image"),backgroundOrigin:t.css("background-origin"),backgroundPosition:t.css("background-position"),backgroundRepeat:t.css("background-repeat"),backgroundSize:t.css("background-size")})).val("").addClass(r.className(e.cssClasses.prefix,e.cssClasses.hint,!0)).removeAttr("id name placeholder required").prop("readonly",!0).attr({"aria-hidden":"true",autocomplete:"off",spellcheck:"false",tabindex:-1}),u.removeData&&u.removeData(),n.data(i,{"aria-autocomplete":n.attr("aria-autocomplete"),"aria-expanded":n.attr("aria-expanded"),"aria-owns":n.attr("aria-owns"),autocomplete:n.attr("autocomplete"),dir:n.attr("dir"),role:n.attr("role"),spellcheck:n.attr("spellcheck"),style:n.attr("style"),type:n.attr("type")}),n.addClass(r.className(e.cssClasses.prefix,e.cssClasses.input,!0)).attr({autocomplete:"off",spellcheck:!1,role:"combobox","aria-autocomplete":e.datasets&&e.datasets[0]&&e.datasets[0].displayKey?"both":"list","aria-expanded":"false","aria-label":e.ariaLabel,"aria-owns":e.listboxId}).css(e.hint?e.css.input:e.css.inputWithNoHint);try{n.attr("dir")||n.attr("dir","auto")}catch(e){}return(o=e.appendTo?o.appendTo(s.element(e.appendTo).eq(0)).eq(0):n.wrap(o).parent()).prepend(e.hint?u:null).append(a),{wrapper:o,input:n,hint:u,menu:a}}(e);this.$node=a.wrapper;var u=this.$input=a.input;t=a.menu,n=a.hint,e.dropdownMenuContainer&&s.element(e.dropdownMenuContainer).css("position","relative").append(t.css("top","0")),u.on("blur.aa",function(e){var n=document.activeElement;r.isMsie()&&(t[0]===n||t[0].contains(n))&&(e.preventDefault(),e.stopImmediatePropagation(),r.defer(function(){u.focus()}))}),t.on("mousedown.aa",function(e){e.preventDefault()}),this.eventBus=e.eventBus||new o({el:u}),this.dropdown=new h.Dropdown({appendTo:e.appendTo,wrapper:this.$node,menu:t,datasets:e.datasets,templates:e.templates,cssClasses:e.cssClasses,minLength:this.minLength}).onSync("suggestionClicked",this._onSuggestionClicked,this).onSync("cursorMoved",this._onCursorMoved,this).onSync("cursorRemoved",this._onCursorRemoved,this).onSync("opened",this._onOpened,this).onSync("closed",this._onClosed,this).onSync("shown",this._onShown,this).onSync("empty",this._onEmpty,this).onSync("redrawn",this._onRedrawn,this).onAsync("datasetRendered",this._onDatasetRendered,this),this.input=new h.Input({input:u,hint:n}).onSync("focused",this._onFocused,this).onSync("blurred",this._onBlurred,this).onSync("enterKeyed",this._onEnterKeyed,this).onSync("tabKeyed",this._onTabKeyed,this).onSync("escKeyed",this._onEscKeyed,this).onSync("upKeyed",this._onUpKeyed,this).onSync("downKeyed",this._onDownKeyed,this).onSync("leftKeyed",this._onLeftKeyed,this).onSync("rightKeyed",this._onRightKeyed,this).onSync("queryChanged",this._onQueryChanged,this).onSync("whitespaceChanged",this._onWhitespaceChanged,this),this._bindKeyboardShortcuts(e),this._setLanguageDirection()}r.mixin(h.prototype,{_bindKeyboardShortcuts:function(e){if(e.keyboardShortcuts){var t=this.$input,n=[];r.each(e.keyboardShortcuts,function(e){"string"==typeof e&&(e=e.toUpperCase().charCodeAt(0)),n.push(e)}),s.element(document).keydown(function(e){var i=e.target||e.srcElement,r=i.tagName;if(!i.isContentEditable&&"INPUT"!==r&&"SELECT"!==r&&"TEXTAREA"!==r){var s=e.which||e.keyCode;-1!==n.indexOf(s)&&(t.focus(),e.stopPropagation(),e.preventDefault())}})}},_onSuggestionClicked:function(e,t){var n;(n=this.dropdown.getDatumForSuggestion(t))&&this._select(n,{selectionMethod:"click"})},_onCursorMoved:function(e,t){var n=this.dropdown.getDatumForCursor(),i=this.dropdown.getCurrentCursor().attr("id");this.input.setActiveDescendant(i),n&&(t&&this.input.setInputValue(n.value,!0),this.eventBus.trigger("cursorchanged",n.raw,n.datasetName))},_onCursorRemoved:function(){this.input.resetInputValue(),this._updateHint(),this.eventBus.trigger("cursorremoved")},_onDatasetRendered:function(){this._updateHint(),this.eventBus.trigger("updated")},_onOpened:function(){this._updateHint(),this.input.expand(),this.eventBus.trigger("opened")},_onEmpty:function(){this.eventBus.trigger("empty")},_onRedrawn:function(){this.$node.css("top","0px"),this.$node.css("left","0px");var e=this.$input[0].getBoundingClientRect();this.autoWidth&&this.$node.css("width",e.width+"px");var t=this.$node[0].getBoundingClientRect(),n=e.bottom-t.top;this.$node.css("top",n+"px");var i=e.left-t.left;this.$node.css("left",i+"px"),this.eventBus.trigger("redrawn")},_onShown:function(){this.eventBus.trigger("shown"),this.autoselect&&this.dropdown.cursorTopSuggestion()},_onClosed:function(){this.input.clearHint(),this.input.removeActiveDescendant(),this.input.collapse(),this.eventBus.trigger("closed")},_onFocused:function(){if(this.isActivated=!0,this.openOnFocus){var e=this.input.getQuery();e.length>=this.minLength?this.dropdown.update(e):this.dropdown.empty(),this.dropdown.open()}},_onBlurred:function(){var e=this.dropdown.getDatumForCursor(),t=this.dropdown.getDatumForTopSuggestion(),n={selectionMethod:"blur"};this.debug||(this.autoselectOnBlur&&e?this._select(e,n):this.autoselectOnBlur&&t?this._select(t,n):(this.isActivated=!1,this.dropdown.empty(),this.dropdown.close()))},_onEnterKeyed:function(e,t){var n=this.dropdown.getDatumForCursor(),i=this.dropdown.getDatumForTopSuggestion(),r={selectionMethod:"enterKey"};n?(this._select(n,r),t.preventDefault()):this.autoselect&&i&&(this._select(i,r),t.preventDefault())},_onTabKeyed:function(e,t){var n;if(!this.tabAutocomplete)return void this.dropdown.close();(n=this.dropdown.getDatumForCursor())?(this._select(n,{selectionMethod:"tabKey"}),t.preventDefault()):this._autocomplete(!0)},_onEscKeyed:function(){this.dropdown.close(),this.input.resetInputValue()},_onUpKeyed:function(){var e=this.input.getQuery();this.dropdown.isEmpty&&e.length>=this.minLength?this.dropdown.update(e):this.dropdown.moveCursorUp(),this.dropdown.open()},_onDownKeyed:function(){var e=this.input.getQuery();this.dropdown.isEmpty&&e.length>=this.minLength?this.dropdown.update(e):this.dropdown.moveCursorDown(),this.dropdown.open()},_onLeftKeyed:function(){"rtl"===this.dir&&this._autocomplete()},_onRightKeyed:function(){"ltr"===this.dir&&this._autocomplete()},_onQueryChanged:function(e,t){this.input.clearHintIfInvalid(),t.length>=this.minLength?this.dropdown.update(t):this.dropdown.empty(),this.dropdown.open(),this._setLanguageDirection()},_onWhitespaceChanged:function(){this._updateHint(),this.dropdown.open()},_setLanguageDirection:function(){var e=this.input.getLanguageDirection();this.dir!==e&&(this.dir=e,this.$node.css("direction",e),this.dropdown.setLanguageDirection(e))},_updateHint:function(){var e,t,n,i;(e=this.dropdown.getDatumForTopSuggestion())&&this.dropdown.isVisible()&&!this.input.hasOverflow()?(t=this.input.getInputValue(),n=a.normalizeQuery(t),(i=RegExp("^(?:"+r.escapeRegExChars(n)+")(.+$)","i").exec(e.value))?this.input.setHint(t+i[1]):this.input.clearHint()):this.input.clearHint()},_autocomplete:function(e){var t,n,i,r;t=this.input.getHint(),n=this.input.getQuery(),i=e||this.input.isCursorAtEnd(),t&&n!==t&&i&&((r=this.dropdown.getDatumForTopSuggestion())&&this.input.setInputValue(r.value),this.eventBus.trigger("autocompleted",r.raw,r.datasetName))},_select:function(e,t){void 0!==e.value&&this.input.setQuery(e.value),this.clearOnSelected?this.setVal(""):this.input.setInputValue(e.value,!0),this._setLanguageDirection(),!1===this.eventBus.trigger("selected",e.raw,e.datasetName,t).isDefaultPrevented()&&(this.dropdown.close(),r.defer(r.bind(this.dropdown.empty,this.dropdown)))},open:function(){if(!this.isActivated){var e=this.input.getInputValue();e.length>=this.minLength?this.dropdown.update(e):this.dropdown.empty()}this.dropdown.open()},close:function(){this.dropdown.close()},setVal:function(e){e=r.toStr(e),this.isActivated?this.input.setInputValue(e):(this.input.setQuery(e),this.input.setInputValue(e,!0)),this._setLanguageDirection()},getVal:function(){return this.input.getQuery()},destroy:function(){var e,t,n;this.input.destroy(),this.dropdown.destroy(),e=this.$node,t=this.cssClasses,n=e.find(r.className(t.prefix,t.input)),r.each(n.data(i),function(e,t){void 0===e?n.removeAttr(t):n.attr(t,e)}),n.detach().removeClass(r.className(t.prefix,t.input,!0)).insertAfter(e),n.removeData&&n.removeData(i),e.remove(),this.$node=null},getWrapper:function(){return this.dropdown.$container[0]}}),h.Dropdown=u,h.Input=a,h.sources=n(657),e.exports=h},4548:function(e){"use strict";e.exports={element:null}},6029:function(e){"use strict";e.exports=function(e){var t=e.match(/Algolia for JavaScript \((\d+\.)(\d+\.)(\d+)\)/)||e.match(/Algolia for vanilla JavaScript (\d+\.)(\d+\.)(\d+)/);if(t)return[t[1],t[2],t[3]]}},488:function(e,t,n){"use strict";var i,r=n(4548);function s(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}e.exports={isArray:null,isFunction:null,isObject:null,bind:null,each:null,map:null,mixin:null,isMsie:function(e){if(void 0===e&&(e=navigator.userAgent),/(msie|trident)/i.test(e)){var t=e.match(/(msie |rv:)(\d+(.\d+)?)/i);if(t)return t[2]}return!1},escapeRegExChars:function(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")},isNumber:function(e){return"number"==typeof e},toStr:function(e){return null==e?"":e+""},cloneDeep:function(e){var t=this.mixin({},e),n=this;return this.each(t,function(e,i){e&&(n.isArray(e)?t[i]=[].concat(e):n.isObject(e)&&(t[i]=n.cloneDeep(e)))}),t},error:function(e){throw Error(e)},every:function(e,t){var n=!0;return e?(this.each(e,function(i,r){n&&(n=t.call(null,i,r,e)&&n)}),!!n):n},any:function(e,t){var n=!1;return e&&this.each(e,function(i,r){if(t.call(null,i,r,e))return n=!0,!1}),n},getUniqueId:(i=0,function(){return i++}),templatify:function(e){if(this.isFunction(e))return e;var t=r.element(e);return"SCRIPT"===t.prop("tagName")?function(){return t.text()}:function(){return String(e)}},defer:function(e){setTimeout(e,0)},noop:function(){},formatPrefix:function(e,t){return t?"":e+"-"},className:function(e,t,n){return(n?"":".")+e+t},escapeHighlightedString:function(e,t,n){t=t||"<em>";var i=document.createElement("div");i.appendChild(document.createTextNode(t)),n=n||"</em>";var r=document.createElement("div");r.appendChild(document.createTextNode(n));var o=document.createElement("div");return o.appendChild(document.createTextNode(e)),o.innerHTML.replace(RegExp(s(i.innerHTML),"g"),t).replace(RegExp(s(r.innerHTML),"g"),n)}}},6123:function(e,t,n){"use strict";var i=n(488),r=n(8659),s=n(6029);e.exports=function(e,t){var n=s(e.as._ua);return n&&n[0]>=3&&n[1]>20&&((t=t||{}).additionalUA="autocomplete.js "+r),function(n,r){e.search(n,t,function(e,t){if(e)return void i.error(e.message);r(t.hits,t)})}}},657:function(e,t,n){"use strict";e.exports={hits:n(6123),popularIn:n(7776)}},7776:function(e,t,n){"use strict";var i=n(488),r=n(8659),s=n(6029);e.exports=function(e,t,n,o){var a=s(e.as._ua);if(a&&a[0]>=3&&a[1]>20&&((t=t||{}).additionalUA="autocomplete.js "+r),!n.source)return i.error("Missing 'source' key");var u=i.isFunction(n.source)?n.source:function(e){return e[n.source]};if(!n.index)return i.error("Missing 'index' key");var c=n.index;return o=o||{},function(a,l){e.search(a,t,function(e,a){if(e)return void i.error(e.message);if(a.hits.length>0){var h=a.hits[0],p=i.mixin({hitsPerPage:0},n);delete p.source,delete p.index;var d=s(c.as._ua);d&&d[0]>=3&&d[1]>20&&(t.additionalUA="autocomplete.js "+r),c.search(u(h),p,function(e,t){if(e)return void i.error(e.message);var n=[];if(o.includeAll){var r=o.allTitle||"All departments";n.push(i.mixin({facet:{value:r,count:t.nbHits}},i.cloneDeep(h)))}i.each(t.facets,function(e,t){i.each(e,function(e,r){n.push(i.mixin({facet:{facet:t,value:r,count:e}},i.cloneDeep(h)))})});for(var s=1;s<a.hits.length;++s)n.push(a.hits[s]);l(n,a)});return}l([])})}}},8694:function(e,t,n){"use strict";var i=n(3988);n(4548).element=i;var r=n(488);r.isArray=i.isArray,r.isFunction=i.isFunction,r.isObject=i.isPlainObject,r.bind=i.proxy,r.each=function(e,t){i.each(e,function(e,n){return t(n,e)})},r.map=i.map,r.mixin=i.extend,r.Event=i.Event;var s="aaAutocomplete",o=n(8113),a=n(6809);function u(e,t,n,u){n=r.isArray(n)?n:[].slice.call(arguments,2);var c=i(e).each(function(e,r){var c=i(r),l=new a({el:c}),h=u||new o({input:c,eventBus:l,dropdownMenuContainer:t.dropdownMenuContainer,hint:void 0===t.hint||!!t.hint,minLength:t.minLength,autoselect:t.autoselect,autoselectOnBlur:t.autoselectOnBlur,tabAutocomplete:t.tabAutocomplete,openOnFocus:t.openOnFocus,templates:t.templates,debug:t.debug,clearOnSelected:t.clearOnSelected,cssClasses:t.cssClasses,datasets:n,keyboardShortcuts:t.keyboardShortcuts,appendTo:t.appendTo,autoWidth:t.autoWidth,ariaLabel:t.ariaLabel||r.getAttribute("aria-label")});c.data(s,h)});return c.autocomplete={},r.each(["open","close","getVal","setVal","destroy","getWrapper"],function(e){c.autocomplete[e]=function(){var t,n=arguments;return c.each(function(r,o){var a=i(o).data(s);t=a[e].apply(a,n)}),t}}),c}u.sources=o.sources,u.escapeHighlightedString=r.escapeHighlightedString;var c="autocomplete"in window,l=window.autocomplete;u.noConflict=function(){return c?window.autocomplete=l:delete window.autocomplete,u},e.exports=u},8659:function(e){e.exports="0.37.1"},3988:function(e){var t,n,i,r;t=window,function(e){var n,i=1,r=Array.prototype.slice,s=e.isFunction,o=function(e){return"string"==typeof e},a={},u={},c="onfocusin"in t,l={focus:"focusin",blur:"focusout"},h={mouseenter:"mouseover",mouseleave:"mouseout"};function p(e){return e._zid||(e._zid=i++)}function d(e,t,n,i){if((t=f(t)).ns)var r=RegExp("(?:^| )"+t.ns.replace(" "," .* ?")+"(?: |$)");return(a[p(e)]||[]).filter(function(e){return e&&(!t.e||e.e==t.e)&&(!t.ns||r.test(e.ns))&&(!n||p(e.fn)===p(n))&&(!i||e.sel==i)})}function f(e){var t=(""+e).split(".");return{e:t[0],ns:t.slice(1).sort().join(" ")}}function g(e,t){return e.del&&!c&&e.e in l||!!t}function m(e){return h[e]||c&&l[e]||e}function v(t,i,r,s,o,u,c){var l=p(t),d=a[l]||(a[l]=[]);i.split(/\s/).forEach(function(i){if("ready"==i)return e(document).ready(r);var a=f(i);a.fn=r,a.sel=o,a.e in h&&(r=function(t){var n=t.relatedTarget;if(!n||n!==this&&!e.contains(this,n))return a.fn.apply(this,arguments)}),a.del=u;var l=u||r;a.proxy=function(e){if(!(e=C(e)).isImmediatePropagationStopped()){try{var i=Object.getOwnPropertyDescriptor(e,"data");(!i||i.writable)&&(e.data=s)}catch(e){}var r=l.apply(t,e._args==n?[e]:[e].concat(e._args));return!1===r&&(e.preventDefault(),e.stopPropagation()),r}},a.i=d.length,d.push(a),"addEventListener"in t&&t.addEventListener(m(a.e),a.proxy,g(a,c))})}function y(e,t,n,i,r){var s=p(e);(t||"").split(/\s/).forEach(function(t){d(e,t,n,i).forEach(function(t){delete a[s][t.i],"removeEventListener"in e&&e.removeEventListener(m(t.e),t.proxy,g(t,r))})})}u.click=u.mousedown=u.mouseup=u.mousemove="MouseEvents",e.event={add:v,remove:y},e.proxy=function(t,n){var i=2 in arguments&&r.call(arguments,2);if(s(t)){var a=function(){return t.apply(n,i?i.concat(r.call(arguments)):arguments)};return a._zid=p(t),a}if(o(n))if(i)return i.unshift(t[n],t),e.proxy.apply(null,i);else return e.proxy(t[n],t);throw TypeError("expected function")},e.fn.bind=function(e,t,n){return this.on(e,t,n)},e.fn.unbind=function(e,t){return this.off(e,t)},e.fn.one=function(e,t,n,i){return this.on(e,t,n,i,1)};var x=function(){return!0},b=function(){return!1},w=/^([A-Z]|returnValue$|layer[XY]$|webkitMovement[XY]$)/,S={preventDefault:"isDefaultPrevented",stopImmediatePropagation:"isImmediatePropagationStopped",stopPropagation:"isPropagationStopped"};function C(t,i){if(i||!t.isDefaultPrevented){i||(i=t),e.each(S,function(e,n){var r=i[e];t[e]=function(){return this[n]=x,r&&r.apply(i,arguments)},t[n]=b});try{t.timeStamp||(t.timeStamp=Date.now())}catch(e){}(i.defaultPrevented!==n?i.defaultPrevented:"returnValue"in i?!1===i.returnValue:i.getPreventDefault&&i.getPreventDefault())&&(t.isDefaultPrevented=x)}return t}function E(e){var t,i={originalEvent:e};for(t in e)w.test(t)||e[t]===n||(i[t]=e[t]);return C(i,e)}e.fn.delegate=function(e,t,n){return this.on(t,e,n)},e.fn.undelegate=function(e,t,n){return this.off(t,e,n)},e.fn.live=function(t,n){return e(document.body).delegate(this.selector,t,n),this},e.fn.die=function(t,n){return e(document.body).undelegate(this.selector,t,n),this},e.fn.on=function(t,i,a,u,c){var l,h,p=this;return t&&!o(t)?(e.each(t,function(e,t){p.on(e,i,a,t,c)}),p):(o(i)||s(u)||!1===u||(u=a,a=i,i=n),(n===u||!1===a)&&(u=a,a=n),!1===u&&(u=b),p.each(function(n,s){c&&(l=function(e){return y(s,e.type,u),u.apply(this,arguments)}),i&&(h=function(t){var n,o=e(t.target).closest(i,s).get(0);if(o&&o!==s)return n=e.extend(E(t),{currentTarget:o,liveFired:s}),(l||u).apply(o,[n].concat(r.call(arguments,1)))}),v(s,t,u,a,i,h||l)}))},e.fn.off=function(t,i,r){var a=this;return t&&!o(t)?(e.each(t,function(e,t){a.off(e,i,t)}),a):(o(i)||s(r)||!1===r||(r=i,i=n),!1===r&&(r=b),a.each(function(){y(this,t,r,i)}))},e.fn.trigger=function(t,n){return(t=o(t)||e.isPlainObject(t)?e.Event(t):C(t))._args=n,this.each(function(){t.type in l&&"function"==typeof this[t.type]?this[t.type]():"dispatchEvent"in this?this.dispatchEvent(t):e(this).triggerHandler(t,n)})},e.fn.triggerHandler=function(t,n){var i,r;return this.each(function(s,a){(i=E(o(t)?e.Event(t):t))._args=n,i.target=a,e.each(d(a,t.type||t),function(e,t){if(r=t.proxy(i),i.isImmediatePropagationStopped())return!1})}),r},"focusin focusout focus blur load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select keydown keypress keyup error".split(" ").forEach(function(t){e.fn[t]=function(e){return 0 in arguments?this.bind(t,e):this.trigger(t)}}),e.Event=function(e,t){o(e)||(e=(t=e).type);var n=document.createEvent(u[e]||"Events"),i=!0;if(t)for(var r in t)"bubbles"==r?i=!!t[r]:n[r]=t[r];return n.initEvent(e,i,!0),C(n)}}(r=function(){var e,n,i,r,s,o,a=[],u=a.concat,c=a.filter,l=a.slice,h=t.document,p={},d={},f={"column-count":1,columns:1,"font-weight":1,"line-height":1,opacity:1,"z-index":1,zoom:1},g=/^\s*<(\w+|!)[^>]*>/,m=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,y=/^(?:body|html)$/i,x=/([A-Z])/g,b=["val","css","html","text","data","width","height","offset"],w=h.createElement("table"),S=h.createElement("tr"),C={tr:h.createElement("tbody"),tbody:w,thead:w,tfoot:w,td:S,th:S,"*":h.createElement("div")},E=/complete|loaded|interactive/,_=/^[\w-]*$/,k={},T=k.toString,O={},L=h.createElement("div"),A={tabindex:"tabIndex",readonly:"readOnly",for:"htmlFor",class:"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},$=Array.isArray||function(e){return e instanceof Array};function P(e){return null==e?String(e):k[T.call(e)]||"object"}function I(e){return"function"==P(e)}function Q(e){return null!=e&&e==e.window}function R(e){return null!=e&&e.nodeType==e.DOCUMENT_NODE}function N(e){return"object"==P(e)}function D(e){return N(e)&&!Q(e)&&Object.getPrototypeOf(e)==Object.prototype}function F(e){var t=!!e&&"length"in e&&e.length,n=i.type(e);return"function"!=n&&!Q(e)&&("array"==n||0===t||"number"==typeof t&&t>0&&t-1 in e)}function j(e){return e.replace(/::/g,"/").replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/_/g,"-").toLowerCase()}function H(e){return e in d?d[e]:d[e]=RegExp("(^|\\s)"+e+"(\\s|$)")}function V(e,t){return"number"!=typeof t||f[j(e)]?t:t+"px"}function B(e){return"children"in e?l.call(e.children):i.map(e.childNodes,function(e){if(1==e.nodeType)return e})}function M(e,t){var n,i=e?e.length:0;for(n=0;n<i;n++)this[n]=e[n];this.length=i,this.selector=t||""}function q(e,t){return null==t?i(e):i(e).filter(t)}function z(e,t,n,i){return I(t)?t.call(e,n,i):t}function K(e,t,n){null==n?e.removeAttribute(t):e.setAttribute(t,n)}function W(t,n){var i=t.className||"",r=i&&i.baseVal!==e;if(e===n)return r?i.baseVal:i;r?i.baseVal=n:t.className=n}function U(e){try{return e?"true"==e||"false"!=e&&("null"==e?null:+e+""==e?+e:/^[\[\{]/.test(e)?i.parseJSON(e):e):e}catch(t){return e}}return O.matches=function(e,t){if(!t||!e||1!==e.nodeType)return!1;var n=e.matches||e.webkitMatchesSelector||e.mozMatchesSelector||e.oMatchesSelector||e.matchesSelector;if(n)return n.call(e,t);var i,r=e.parentNode,s=!r;return s&&(r=L).appendChild(e),i=~O.qsa(r,t).indexOf(e),s&&L.removeChild(e),i},s=function(e){return e.replace(/-+(.)?/g,function(e,t){return t?t.toUpperCase():""})},o=function(e){return c.call(e,function(t,n){return e.indexOf(t)==n})},O.fragment=function(t,n,r){var s,o,a;return m.test(t)&&(s=i(h.createElement(RegExp.$1))),s||(t.replace&&(t=t.replace(v,"<$1></$2>")),e===n&&(n=g.test(t)&&RegExp.$1),n in C||(n="*"),(a=C[n]).innerHTML=""+t,s=i.each(l.call(a.childNodes),function(){a.removeChild(this)})),D(r)&&(o=i(s),i.each(r,function(e,t){b.indexOf(e)>-1?o[e](t):o.attr(e,t)})),s},O.Z=function(e,t){return new M(e,t)},O.isZ=function(e){return e instanceof O.Z},O.init=function(t,n){var r,s;if(!t)return O.Z();if("string"==typeof t)if("<"==(t=t.trim())[0]&&g.test(t))r=O.fragment(t,RegExp.$1,n),t=null;else{if(e!==n)return i(n).find(t);r=O.qsa(h,t)}else if(I(t))return i(h).ready(t);else if(O.isZ(t))return t;else if($(t))s=t,r=c.call(s,function(e){return null!=e});else if(N(t))r=[t],t=null;else if(g.test(t))r=O.fragment(t.trim(),RegExp.$1,n),t=null;else{if(e!==n)return i(n).find(t);r=O.qsa(h,t)}return O.Z(r,t)},(i=function(e,t){return O.init(e,t)}).extend=function(t){var i,r=l.call(arguments,1);return"boolean"==typeof t&&(i=t,t=r.shift()),r.forEach(function(r){!function t(i,r,s){for(n in r)s&&(D(r[n])||$(r[n]))?(D(r[n])&&!D(i[n])&&(i[n]={}),$(r[n])&&!$(i[n])&&(i[n]=[]),t(i[n],r[n],s)):r[n]!==e&&(i[n]=r[n])}(t,r,i)}),t},O.qsa=function(e,t){var n,i="#"==t[0],r=!i&&"."==t[0],s=i||r?t.slice(1):t,o=_.test(s);return e.getElementById&&o&&i?(n=e.getElementById(s))?[n]:[]:1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType?[]:l.call(o&&!i&&e.getElementsByClassName?r?e.getElementsByClassName(s):e.getElementsByTagName(t):e.querySelectorAll(t))},i.contains=h.documentElement.contains?function(e,t){return e!==t&&e.contains(t)}:function(e,t){for(;t&&(t=t.parentNode);)if(t===e)return!0;return!1},i.type=P,i.isFunction=I,i.isWindow=Q,i.isArray=$,i.isPlainObject=D,i.isEmptyObject=function(e){var t;for(t in e)return!1;return!0},i.isNumeric=function(e){var t=Number(e),n=typeof e;return null!=e&&"boolean"!=n&&("string"!=n||e.length)&&!isNaN(t)&&isFinite(t)||!1},i.inArray=function(e,t,n){return a.indexOf.call(t,e,n)},i.camelCase=s,i.trim=function(e){return null==e?"":String.prototype.trim.call(e)},i.uuid=0,i.support={},i.expr={},i.noop=function(){},i.map=function(e,t){var n,r,s,o=[];if(F(e))for(r=0;r<e.length;r++)null!=(n=t(e[r],r))&&o.push(n);else for(s in e)null!=(n=t(e[s],s))&&o.push(n);return o.length>0?i.fn.concat.apply([],o):o},i.each=function(e,t){var n,i;if(F(e))for(n=0;n<e.length&&!1!==t.call(e[n],n,e[n]);n++);else for(i in e)if(!1===t.call(e[i],i,e[i]))break;return e},i.grep=function(e,t){return c.call(e,t)},t.JSON&&(i.parseJSON=JSON.parse),i.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){k["[object "+t+"]"]=t.toLowerCase()}),i.fn={constructor:O.Z,length:0,forEach:a.forEach,reduce:a.reduce,push:a.push,sort:a.sort,splice:a.splice,indexOf:a.indexOf,concat:function(){var e,t,n=[];for(e=0;e<arguments.length;e++)t=arguments[e],n[e]=O.isZ(t)?t.toArray():t;return u.apply(O.isZ(this)?this.toArray():this,n)},map:function(e){return i(i.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return i(l.apply(this,arguments))},ready:function(e){return E.test(h.readyState)&&h.body?e(i):h.addEventListener("DOMContentLoaded",function(){e(i)},!1),this},get:function(t){return e===t?l.call(this):this[t>=0?t:t+this.length]},toArray:function(){return this.get()},size:function(){return this.length},remove:function(){return this.each(function(){null!=this.parentNode&&this.parentNode.removeChild(this)})},each:function(e){return a.every.call(this,function(t,n){return!1!==e.call(t,n,t)}),this},filter:function(e){return I(e)?this.not(this.not(e)):i(c.call(this,function(t){return O.matches(t,e)}))},add:function(e,t){return i(o(this.concat(i(e,t))))},is:function(e){return this.length>0&&O.matches(this[0],e)},not:function(t){var n=[];if(I(t)&&t.call!==e)this.each(function(e){t.call(this,e)||n.push(this)});else{var r="string"==typeof t?this.filter(t):F(t)&&I(t.item)?l.call(t):i(t);this.forEach(function(e){0>r.indexOf(e)&&n.push(e)})}return i(n)},has:function(e){return this.filter(function(){return N(e)?i.contains(this,e):i(this).find(e).size()})},eq:function(e){return -1===e?this.slice(e):this.slice(e,+e+1)},first:function(){var e=this[0];return e&&!N(e)?e:i(e)},last:function(){var e=this[this.length-1];return e&&!N(e)?e:i(e)},find:function(e){var t=this;return e?"object"==typeof e?i(e).filter(function(){var e=this;return a.some.call(t,function(t){return i.contains(t,e)})}):1==this.length?i(O.qsa(this[0],e)):this.map(function(){return O.qsa(this,e)}):i()},closest:function(e,t){var n=[],r="object"==typeof e&&i(e);return this.each(function(i,s){for(;s&&!(r?r.indexOf(s)>=0:O.matches(s,e));)s=s!==t&&!R(s)&&s.parentNode;s&&0>n.indexOf(s)&&n.push(s)}),i(n)},parents:function(e){for(var t=[],n=this;n.length>0;)n=i.map(n,function(e){if((e=e.parentNode)&&!R(e)&&0>t.indexOf(e))return t.push(e),e});return q(t,e)},parent:function(e){return q(o(this.pluck("parentNode")),e)},children:function(e){return q(this.map(function(){return B(this)}),e)},contents:function(){return this.map(function(){return this.contentDocument||l.call(this.childNodes)})},siblings:function(e){return q(this.map(function(e,t){return c.call(B(t.parentNode),function(e){return e!==t})}),e)},empty:function(){return this.each(function(){this.innerHTML=""})},pluck:function(e){return i.map(this,function(t){return t[e]})},show:function(){return this.each(function(){var e,t,n;"none"==this.style.display&&(this.style.display=""),"none"==getComputedStyle(this,"").getPropertyValue("display")&&(this.style.display=(p[e=this.nodeName]||(t=h.createElement(e),h.body.appendChild(t),n=getComputedStyle(t,"").getPropertyValue("display"),t.parentNode.removeChild(t),"none"==n&&(n="block"),p[e]=n),p[e]))})},replaceWith:function(e){return this.before(e).remove()},wrap:function(e){var t=I(e);if(this[0]&&!t)var n=i(e).get(0),r=n.parentNode||this.length>1;return this.each(function(s){i(this).wrapAll(t?e.call(this,s):r?n.cloneNode(!0):n)})},wrapAll:function(e){if(this[0]){var t;for(i(this[0]).before(e=i(e));(t=e.children()).length;)e=t.first();i(e).append(this)}return this},wrapInner:function(e){var t=I(e);return this.each(function(n){var r=i(this),s=r.contents(),o=t?e.call(this,n):e;s.length?s.wrapAll(o):r.append(o)})},unwrap:function(){return this.parent().each(function(){i(this).replaceWith(i(this).children())}),this},clone:function(){return this.map(function(){return this.cloneNode(!0)})},hide:function(){return this.css("display","none")},toggle:function(t){return this.each(function(){var n=i(this);(e===t?"none"==n.css("display"):t)?n.show():n.hide()})},prev:function(e){return i(this.pluck("previousElementSibling")).filter(e||"*")},next:function(e){return i(this.pluck("nextElementSibling")).filter(e||"*")},html:function(e){return 0 in arguments?this.each(function(t){var n=this.innerHTML;i(this).empty().append(z(this,e,t,n))}):0 in this?this[0].innerHTML:null},text:function(e){return 0 in arguments?this.each(function(t){var n=z(this,e,t,this.textContent);this.textContent=null==n?"":""+n}):0 in this?this.pluck("textContent").join(""):null},attr:function(t,i){var r;return"string"!=typeof t||1 in arguments?this.each(function(e){if(1===this.nodeType)if(N(t))for(n in t)K(this,n,t[n]);else K(this,t,z(this,i,e,this.getAttribute(t)))}):0 in this&&1==this[0].nodeType&&null!=(r=this[0].getAttribute(t))?r:e},removeAttr:function(e){return this.each(function(){1===this.nodeType&&e.split(" ").forEach(function(e){K(this,e)},this)})},prop:function(e,t){return e=A[e]||e,1 in arguments?this.each(function(n){this[e]=z(this,t,n,this[e])}):this[0]&&this[0][e]},removeProp:function(e){return e=A[e]||e,this.each(function(){delete this[e]})},data:function(t,n){var i="data-"+t.replace(x,"-$1").toLowerCase(),r=1 in arguments?this.attr(i,n):this.attr(i);return null!==r?U(r):e},val:function(e){return 0 in arguments?(null==e&&(e=""),this.each(function(t){this.value=z(this,e,t,this.value)})):this[0]&&(this[0].multiple?i(this[0]).find("option").filter(function(){return this.selected}).pluck("value"):this[0].value)},offset:function(e){if(e)return this.each(function(t){var n=i(this),r=z(this,e,t,n.offset()),s=n.offsetParent().offset(),o={top:r.top-s.top,left:r.left-s.left};"static"==n.css("position")&&(o.position="relative"),n.css(o)});if(!this.length)return null;if(h.documentElement!==this[0]&&!i.contains(h.documentElement,this[0]))return{top:0,left:0};var n=this[0].getBoundingClientRect();return{left:n.left+t.pageXOffset,top:n.top+t.pageYOffset,width:Math.round(n.width),height:Math.round(n.height)}},css:function(e,t){if(arguments.length<2){var r=this[0];if("string"==typeof e){if(!r)return;return r.style[s(e)]||getComputedStyle(r,"").getPropertyValue(e)}if($(e)){if(!r)return;var o={},a=getComputedStyle(r,"");return i.each(e,function(e,t){o[t]=r.style[s(t)]||a.getPropertyValue(t)}),o}}var u="";if("string"==P(e))t||0===t?u=j(e)+":"+V(e,t):this.each(function(){this.style.removeProperty(j(e))});else for(n in e)e[n]||0===e[n]?u+=j(n)+":"+V(n,e[n])+";":this.each(function(){this.style.removeProperty(j(n))});return this.each(function(){this.style.cssText+=";"+u})},index:function(e){return e?this.indexOf(i(e)[0]):this.parent().children().indexOf(this[0])},hasClass:function(e){return!!e&&a.some.call(this,function(e){return this.test(W(e))},H(e))},addClass:function(e){return e?this.each(function(t){if("className"in this){r=[];var n=W(this);z(this,e,t,n).split(/\s+/g).forEach(function(e){i(this).hasClass(e)||r.push(e)},this),r.length&&W(this,n+(n?" ":"")+r.join(" "))}}):this},removeClass:function(t){return this.each(function(n){if("className"in this){if(e===t)return W(this,"");z(this,t,n,r=W(this)).split(/\s+/g).forEach(function(e){r=r.replace(H(e)," ")}),W(this,r.trim())}})},toggleClass:function(t,n){return t?this.each(function(r){var s=i(this);z(this,t,r,W(this)).split(/\s+/g).forEach(function(t){(e===n?!s.hasClass(t):n)?s.addClass(t):s.removeClass(t)})}):this},scrollTop:function(t){if(this.length){var n="scrollTop"in this[0];return e===t?n?this[0].scrollTop:this[0].pageYOffset:this.each(n?function(){this.scrollTop=t}:function(){this.scrollTo(this.scrollX,t)})}},scrollLeft:function(t){if(this.length){var n="scrollLeft"in this[0];return e===t?n?this[0].scrollLeft:this[0].pageXOffset:this.each(n?function(){this.scrollLeft=t}:function(){this.scrollTo(t,this.scrollY)})}},position:function(){if(this.length){var e=this[0],t=this.offsetParent(),n=this.offset(),r=y.test(t[0].nodeName)?{top:0,left:0}:t.offset();return n.top-=parseFloat(i(e).css("margin-top"))||0,n.left-=parseFloat(i(e).css("margin-left"))||0,r.top+=parseFloat(i(t[0]).css("border-top-width"))||0,r.left+=parseFloat(i(t[0]).css("border-left-width"))||0,{top:n.top-r.top,left:n.left-r.left}}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent||h.body;e&&!y.test(e.nodeName)&&"static"==i(e).css("position");)e=e.offsetParent;return e})}},i.fn.detach=i.fn.remove,["width","height"].forEach(function(t){var n=t.replace(/./,function(e){return e[0].toUpperCase()});i.fn[t]=function(r){var s,o=this[0];return e===r?Q(o)?o["inner"+n]:R(o)?o.documentElement["scroll"+n]:(s=this.offset())&&s[t]:this.each(function(e){(o=i(this)).css(t,z(this,r,e,o[t]()))})}}),["after","prepend","before","append"].forEach(function(n,r){var s=r%2;i.fn[n]=function(){var n,o,a=i.map(arguments,function(t){var r=[];return"array"==(n=P(t))?(t.forEach(function(t){return t.nodeType!==e?r.push(t):i.zepto.isZ(t)?r=r.concat(t.get()):void(r=r.concat(O.fragment(t)))}),r):"object"==n||null==t?t:O.fragment(t)}),u=this.length>1;return a.length<1?this:this.each(function(e,n){o=s?n:n.parentNode,n=0==r?n.nextSibling:1==r?n.firstChild:2==r?n:null;var c=i.contains(h.documentElement,o);a.forEach(function(e){if(u)e=e.cloneNode(!0);else if(!o)return i(e).remove();o.insertBefore(e,n),c&&function e(t,n){n(t);for(var i=0,r=t.childNodes.length;i<r;i++)e(t.childNodes[i],n)}(e,function(e){if(null!=e.nodeName&&"SCRIPT"===e.nodeName.toUpperCase()&&(!e.type||"text/javascript"===e.type)&&!e.src){var n=e.ownerDocument?e.ownerDocument.defaultView:t;n.eval.call(n,e.innerHTML)}})})})},i.fn[s?n+"To":"insert"+(r?"Before":"After")]=function(e){return i(e)[n](this),this}}),O.Z.prototype=M.prototype=i.fn,O.uniq=o,O.deserializeValue=U,i.zepto=O,i}()),i=[],r.fn.remove=function(){return this.each(function(){this.parentNode&&("IMG"===this.tagName&&(i.push(this),this.src="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=",n&&clearTimeout(n),n=setTimeout(function(){i=[]},6e4)),this.parentNode.removeChild(this))})},function(e){var t={},n=e.fn.data,i=e.camelCase,r=e.expando="Zepto"+ +new Date,s=[];function o(n,o,a){var u,c,l=n[r]||(n[r]=++e.uuid),h=t[l]||(t[l]=(u=n,c={},e.each(u.attributes||s,function(t,n){0==n.name.indexOf("data-")&&(c[i(n.name.replace("data-",""))]=e.zepto.deserializeValue(n.value))}),c));return void 0!==o&&(h[i(o)]=a),h}e.fn.data=function(s,a){return void 0===a?e.isPlainObject(s)?this.each(function(t,n){e.each(s,function(e,t){o(n,e,t)})}):0 in this?function(s,a){var u=s[r],c=u&&t[u];if(void 0===a)return c||o(s);if(c){if(a in c)return c[a];var l=i(a);if(l in c)return c[l]}return n.call(e(s),a)}(this[0],s):void 0:this.each(function(){o(this,s,a)})},e.data=function(t,n,i){return e(t).data(n,i)},e.hasData=function(n){var i=n[r],s=i&&t[i];return!!s&&!e.isEmptyObject(s)},e.fn.removeData=function(n){return"string"==typeof n&&(n=n.split(/\s+/)),this.each(function(){var s=this[r],o=s&&t[s];o&&e.each(n||o,function(e){delete o[n?i(this):e]})})},["remove","empty"].forEach(function(t){var n=e.fn[t];e.fn[t]=function(){var e=this.find("*");return"remove"===t&&(e=e.add(this)),e.removeData(),n.call(this)}})}(r),e.exports=r},2148:function(e,t){!function(e){var t=/\S/,n=/\"/g,i=/\n/g,r=/\r/g,s=/\\/g,o=/\u2028/,a=/\u2029/;function u(e){return e.trim?e.trim():e.replace(/^\s*|\s*$/g,"")}function c(e,t,n){if(t.charAt(n)!=e.charAt(0))return!1;for(var i=1,r=e.length;i<r;i++)if(t.charAt(n+i)!=e.charAt(i))return!1;return!0}e.tags={"#":1,"^":2,"<":3,$:4,"/":5,"!":6,">":7,"=":8,_v:9,"{":10,"&":11,_t:12},e.scan=function(n,i){var r,s=n.length,o=0,a=null,l=null,h="",p=[],d=!1,f=0,g=0,m="{{",v="}}";function y(){h.length>0&&(p.push({tag:"_t",text:new String(h)}),h="")}function x(n,i){if(y(),n&&function(){for(var n=!0,i=g;i<p.length;i++)if(!(n=e.tags[p[i].tag]<e.tags._v||"_t"==p[i].tag&&null===p[i].text.match(t)))return!1;return n}())for(var r,s=g;s<p.length;s++)p[s].text&&((r=p[s+1])&&">"==r.tag&&(r.indent=p[s].text.toString()),p.splice(s,1));else i||p.push({tag:"\n"});d=!1,g=p.length}for(i&&(m=(i=i.split(" "))[0],v=i[1]),f=0;f<s;f++){0==o?c(m,n,f)?(--f,y(),o=1):"\n"==n.charAt(f)?x(d):h+=n.charAt(f):1==o?(f+=m.length-1,"="==(a=(l=e.tags[n.charAt(f+1)])?n.charAt(f+1):"_v")?(f=function(e,t){var n="="+v,i=e.indexOf(n,t),r=u(e.substring(e.indexOf("=",t)+1,i)).split(" ");return m=r[0],v=r[r.length-1],i+n.length-1}(n,f),o=0):(l&&f++,o=2),d=f):c(v,n,f)?(p.push({tag:a,n:u(h),otag:m,ctag:v,i:"/"==a?d-m.length:f+v.length}),h="",f+=v.length-1,o=0,"{"==a&&("}}"==v?f++:"}"===(r=p[p.length-1]).n.substr(r.n.length-1)&&(r.n=r.n.substring(0,r.n.length-1)))):h+=n.charAt(f)}return x(d,!0),p};var l={_t:!0,"\n":!0,$:!0,"/":!0};e.stringify=function(t,n,i){return"{code: function (c,p,i) { "+e.wrapMain(t.code)+" },"+function e(t){var n=[];for(var i in t.partials)n.push('"'+p(i)+'":{name:"'+p(t.partials[i].name)+'", '+e(t.partials[i])+"}");return"partials: {"+n.join(",")+"}, subs: "+function(e){var t=[];for(var n in e)t.push('"'+p(n)+'": function(c,p,t,i) {'+e[n]+"}");return"{ "+t.join(",")+" }"}(t.subs)}(t)+"}"};var h=0;function p(e){return e.replace(s,"\\\\").replace(n,'\\"').replace(i,"\\n").replace(r,"\\r").replace(o,"\\u2028").replace(a,"\\u2029")}function d(e){return~e.indexOf(".")?"d":"f"}function f(e,t){var n="<"+(t.prefix||"")+e.n+h++;return t.partials[n]={name:e.n,partials:{}},t.code+='t.b(t.rp("'+p(n)+'",c,p,"'+(e.indent||"")+'"));',n}function g(e,t){t.code+="t.b(t.t(t."+d(e.n)+'("'+p(e.n)+'",c,p,0)));'}function m(e){return"t.b("+e+");"}e.generate=function(t,n,i){h=0;var r={code:"",subs:{},partials:{}};return(e.walk(t,r),i.asString)?this.stringify(r,n,i):this.makeTemplate(r,n,i)},e.wrapMain=function(e){return'var t=this;t.b(i=i||"");'+e+"return t.fl();"},e.template=e.Template,e.makeTemplate=function(e,t,n){var i=this.makePartials(e);return i.code=Function("c","p","i",this.wrapMain(e.code)),new this.template(i,t,this,n)},e.makePartials=function(e){var t,n={subs:{},partials:e.partials,name:e.name};for(t in n.partials)n.partials[t]=this.makePartials(n.partials[t]);for(t in e.subs)n.subs[t]=Function("c","p","t","i",e.subs[t]);return n},e.codegen={"#":function(t,n){n.code+="if(t.s(t."+d(t.n)+'("'+p(t.n)+'",c,p,1),c,p,0,'+t.i+","+t.end+',"'+t.otag+" "+t.ctag+'")){t.rs(c,p,function(c,p,t){',e.walk(t.nodes,n),n.code+="});c.pop();}"},"^":function(t,n){n.code+="if(!t.s(t."+d(t.n)+'("'+p(t.n)+'",c,p,1),c,p,1,0,0,"")){',e.walk(t.nodes,n),n.code+="};"},">":f,"<":function(t,n){var i={partials:{},code:"",subs:{},inPartial:!0};e.walk(t.nodes,i);var r=n.partials[f(t,n)];r.subs=i.subs,r.partials=i.partials},$:function(t,n){var i={subs:{},code:"",partials:n.partials,prefix:t.n};e.walk(t.nodes,i),n.subs[t.n]=i.code,n.inPartial||(n.code+='t.sub("'+p(t.n)+'",c,p,i);')},"\n":function(e,t){t.code+=m('"\\n"'+(e.last?"":" + i"))},_v:function(e,t){t.code+="t.b(t.v(t."+d(e.n)+'("'+p(e.n)+'",c,p,0)));'},_t:function(e,t){t.code+=m('"'+p(e.text)+'"')},"{":g,"&":g},e.walk=function(t,n){for(var i,r=0,s=t.length;r<s;r++)(i=e.codegen[t[r].tag])&&i(t[r],n);return n},e.parse=function(t,n,i){return function t(n,i,r,s){var o=[],a=null,u=null,c=null;for(u=r[r.length-1];n.length>0;){if(c=n.shift(),u&&"<"==u.tag&&!(c.tag in l))throw Error("Illegal content in < super tag.");if(e.tags[c.tag]<=e.tags.$||function(e,t){for(var n=0,i=t.length;n<i;n++)if(t[n].o==e.n)return e.tag="#",!0}(c,s))r.push(c),c.nodes=t(n,c.tag,r,s);else if("/"==c.tag){if(0===r.length)throw Error("Closing tag without opener: /"+c.n);if(a=r.pop(),c.n!=a.n&&!function(e,t,n){for(var i=0,r=n.length;i<r;i++)if(n[i].c==e&&n[i].o==t)return!0}(c.n,a.n,s))throw Error("Nesting error: "+a.n+" vs. "+c.n);return a.end=c.i,o}else"\n"==c.tag&&(c.last=0==n.length||"\n"==n[0].tag);o.push(c)}if(r.length>0)throw Error("missing closing tag: "+r.pop().n);return o}(t,"",[],(i=i||{}).sectionTags||[])},e.cache={},e.cacheKey=function(e,t){return[e,!!t.asString,!!t.disableLambda,t.delimiters,!!t.modelGet].join("||")},e.compile=function(t,n){n=n||{};var i=e.cacheKey(t,n),r=this.cache[i];if(r){var s=r.partials;for(var o in s)delete s[o].instance;return r}return r=this.generate(this.parse(this.scan(t,n.delimiters),t,n),t,n),this.cache[i]=r}}(t)},112:function(e,t,n){var i=n(2148);i.Template=n(8719).Template,i.template=i.Template,e.exports=i},8719:function(e,t){!function(e){function t(e,t,n){var i;return t&&"object"==typeof t&&(void 0!==t[e]?i=t[e]:n&&t.get&&"function"==typeof t.get&&(i=t.get(e))),i}e.Template=function(e,t,n,i){e=e||{},this.r=e.code||this.r,this.c=n,this.options=i||{},this.text=t||"",this.partials=e.partials||{},this.subs=e.subs||{},this.buf=""},e.Template.prototype={r:function(e,t,n){return""},v:function(e){return a.test(e=u(e))?e.replace(n,"&amp;").replace(i,"&lt;").replace(r,"&gt;").replace(s,"&#39;").replace(o,"&quot;"):e},t:u,render:function(e,t,n){return this.ri([e],t||{},n)},ri:function(e,t,n){return this.r(e,t,n)},ep:function(e,t){var n=this.partials[e],i=t[n.name];if(n.instance&&n.base==i)return n.instance;if("string"==typeof i){if(!this.c)throw Error("No compiler available.");i=this.c.compile(i,this.options)}if(!i)return null;if(this.partials[e].base=i,n.subs){for(key in t.stackText||(t.stackText={}),n.subs)t.stackText[key]||(t.stackText[key]=void 0!==this.activeSub&&t.stackText[this.activeSub]?t.stackText[this.activeSub]:this.text);i=function(e,t,n,i,r,s){function o(){}function a(){}o.prototype=e,a.prototype=e.subs;var u,c=new o;for(u in c.subs=new a,c.subsText={},c.buf="",c.stackSubs=i=i||{},c.subsText=s,t)i[u]||(i[u]=t[u]);for(u in i)c.subs[u]=i[u];for(u in c.stackPartials=r=r||{},n)r[u]||(r[u]=n[u]);for(u in r)c.partials[u]=r[u];return c}(i,n.subs,n.partials,this.stackSubs,this.stackPartials,t.stackText)}return this.partials[e].instance=i,i},rp:function(e,t,n,i){var r=this.ep(e,n);return r?r.ri(t,n,i):""},rs:function(e,t,n){var i=e[e.length-1];if(!c(i))return void n(e,t,this);for(var r=0;r<i.length;r++)e.push(i[r]),n(e,t,this),e.pop()},s:function(e,t,n,i,r,s,o){var a;return(!c(e)||0!==e.length)&&("function"==typeof e&&(e=this.ms(e,t,n,i,r,s,o)),a=!!e,!i&&a&&t&&t.push("object"==typeof e?e:t[t.length-1]),a)},d:function(e,n,i,r){var s,o=e.split("."),a=this.f(o[0],n,i,r),u=this.options.modelGet,l=null;if("."===e&&c(n[n.length-2]))a=n[n.length-1];else for(var h=1;h<o.length;h++)void 0!==(s=t(o[h],a,u))?(l=a,a=s):a="";return(!r||!!a)&&(r||"function"!=typeof a||(n.push(l),a=this.mv(a,n,i),n.pop()),a)},f:function(e,n,i,r){for(var s=!1,o=null,a=!1,u=this.options.modelGet,c=n.length-1;c>=0;c--)if(void 0!==(s=t(e,n[c],u))){a=!0;break}return a?(r||"function"!=typeof s||(s=this.mv(s,n,i)),s):!r&&""},ls:function(e,t,n,i,r){var s=this.options.delimiters;return this.options.delimiters=r,this.b(this.ct(u(e.call(t,i)),t,n)),this.options.delimiters=s,!1},ct:function(e,t,n){if(this.options.disableLambda)throw Error("Lambda features disabled.");return this.c.compile(e,this.options).render(t,n)},b:function(e){this.buf+=e},fl:function(){var e=this.buf;return this.buf="",e},ms:function(e,t,n,i,r,s,o){var a,u=t[t.length-1],c=e.call(u);if("function"==typeof c)if(i)return!0;else return a=this.activeSub&&this.subsText&&this.subsText[this.activeSub]?this.subsText[this.activeSub]:this.text,this.ls(c,u,n,a.substring(r,s),o);return c},mv:function(e,t,n){var i=t[t.length-1],r=e.call(i);return"function"==typeof r?this.ct(u(r.call(i)),i,n):r},sub:function(e,t,n,i){var r=this.subs[e];r&&(this.activeSub=e,r(t,n,this,i),this.activeSub=!1)}};var n=/&/g,i=/</g,r=/>/g,s=/\'/g,o=/\"/g,a=/[&<>\"\']/;function u(e){return String(null==e?"":e)}var c=Array.isArray||function(e){return"[object Array]"===Object.prototype.toString.call(e)}}(t)},108:function(e,t,n){"use strict";var i,r,s,o=[n(154),n(2555),n(7853),n(4198),n(3584),n(3561)],a=-1,u=[],c=!1;function l(){i&&r&&(i=!1,r.length?u=r.concat(u):a=-1,u.length&&h())}function h(){if(!i){c=!1,i=!0;for(var e=u.length,t=setTimeout(l);e;){for(r=u,u=[];r&&++a<e;)r[a].run();a=-1,e=u.length}r=null,a=-1,i=!1,clearTimeout(t)}}for(var p=-1,d=o.length;++p<d;)if(o[p]&&o[p].test&&o[p].test()){s=o[p].install(h);break}function f(e,t){this.fun=e,this.array=t}f.prototype.run=function(){var e=this.fun,t=this.array;switch(t.length){case 0:return e();case 1:return e(t[0]);case 2:return e(t[0],t[1]);case 3:return e(t[0],t[1],t[2]);default:return e.apply(null,t)}},e.exports=function(e){var t=Array(arguments.length-1);if(arguments.length>1)for(var n=1;n<arguments.length;n++)t[n-1]=arguments[n];u.push(new f(e,t)),c||i||(c=!0,s())}},4198:function(e,t,n){"use strict";t.test=function(){return!n.g.setImmediate&&void 0!==n.g.MessageChannel},t.install=function(e){var t=new n.g.MessageChannel;return t.port1.onmessage=e,function(){t.port2.postMessage(0)}}},7853:function(e,t,n){"use strict";var i=n.g.MutationObserver||n.g.WebKitMutationObserver;t.test=function(){return i},t.install=function(e){var t=0,r=new i(e),s=n.g.document.createTextNode("");return r.observe(s,{characterData:!0}),function(){s.data=t=++t%2}}},2555:function(e,t,n){"use strict";t.test=function(){return"function"==typeof n.g.queueMicrotask},t.install=function(e){return function(){n.g.queueMicrotask(e)}}},3584:function(e,t,n){"use strict";t.test=function(){return"document"in n.g&&"onreadystatechange"in n.g.document.createElement("script")},t.install=function(e){return function(){var t=n.g.document.createElement("script");return t.onreadystatechange=function(){e(),t.onreadystatechange=null,t.parentNode.removeChild(t),t=null},n.g.document.documentElement.appendChild(t),e}}},3561:function(e,t){"use strict";t.test=function(){return!0},t.install=function(e){return function(){setTimeout(e,0)}}},8437:function(e){!function(){var t,n,i,r,s,o,a,u,c,l,h,p,d,f,g,m,v,y,x,b,w,S,C,E,_,k,T,O,L,A,$=function(e){var t=new $.Builder;return t.pipeline.add($.trimmer,$.stopWordFilter,$.stemmer),t.searchPipeline.add($.stemmer),e.call(t,t),t.build()};$.version="2.3.9",$.utils={},$.utils.warn=(t=this,function(e){t.console&&console.warn&&console.warn(e)}),$.utils.asString=function(e){return null==e?"":e.toString()},$.utils.clone=function(e){if(null==e)return e;for(var t=Object.create(null),n=Object.keys(e),i=0;i<n.length;i++){var r=n[i],s=e[r];if(Array.isArray(s)){t[r]=s.slice();continue}if("string"==typeof s||"number"==typeof s||"boolean"==typeof s){t[r]=s;continue}throw TypeError("clone is not deep and does not support nested objects")}return t},$.FieldRef=function(e,t,n){this.docRef=e,this.fieldName=t,this._stringValue=n},$.FieldRef.joiner="/",$.FieldRef.fromString=function(e){var t=e.indexOf($.FieldRef.joiner);if(-1===t)throw"malformed field ref string";var n=e.slice(0,t),i=e.slice(t+1);return new $.FieldRef(i,n,e)},$.FieldRef.prototype.toString=function(){return void 0==this._stringValue&&(this._stringValue=this.fieldName+$.FieldRef.joiner+this.docRef),this._stringValue},$.Set=function(e){if(this.elements=Object.create(null),e){this.length=e.length;for(var t=0;t<this.length;t++)this.elements[e[t]]=!0}else this.length=0},$.Set.complete={intersect:function(e){return e},union:function(){return this},contains:function(){return!0}},$.Set.empty={intersect:function(){return this},union:function(e){return e},contains:function(){return!1}},$.Set.prototype.contains=function(e){return!!this.elements[e]},$.Set.prototype.intersect=function(e){var t,n,i,r=[];if(e===$.Set.complete)return this;if(e===$.Set.empty)return e;this.length<e.length?(t=this,n=e):(t=e,n=this),i=Object.keys(t.elements);for(var s=0;s<i.length;s++){var o=i[s];o in n.elements&&r.push(o)}return new $.Set(r)},$.Set.prototype.union=function(e){return e===$.Set.complete?$.Set.complete:e===$.Set.empty?this:new $.Set(Object.keys(this.elements).concat(Object.keys(e.elements)))},$.idf=function(e,t){var n=0;for(var i in e)"_index"!=i&&(n+=Object.keys(e[i]).length);return Math.log(1+Math.abs((t-n+.5)/(n+.5)))},$.Token=function(e,t){this.str=e||"",this.metadata=t||{}},$.Token.prototype.toString=function(){return this.str},$.Token.prototype.update=function(e){return this.str=e(this.str,this.metadata),this},$.Token.prototype.clone=function(e){return e=e||function(e){return e},new $.Token(e(this.str,this.metadata),this.metadata)},$.tokenizer=function(e,t){if(null==e||void 0==e)return[];if(Array.isArray(e))return e.map(function(e){return new $.Token($.utils.asString(e).toLowerCase(),$.utils.clone(t))});for(var n=e.toString().toLowerCase(),i=n.length,r=[],s=0,o=0;s<=i;s++){var a=n.charAt(s),u=s-o;if(a.match($.tokenizer.separator)||s==i){if(u>0){var c=$.utils.clone(t)||{};c.position=[o,u],c.index=r.length,r.push(new $.Token(n.slice(o,s),c))}o=s+1}}return r},$.tokenizer.separator=/[\s\-]+/,$.Pipeline=function(){this._stack=[]},$.Pipeline.registeredFunctions=Object.create(null),$.Pipeline.registerFunction=function(e,t){t in this.registeredFunctions&&$.utils.warn("Overwriting existing registered function: "+t),e.label=t,$.Pipeline.registeredFunctions[e.label]=e},$.Pipeline.warnIfFunctionNotRegistered=function(e){e.label&&e.label in this.registeredFunctions||$.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},$.Pipeline.load=function(e){var t=new $.Pipeline;return e.forEach(function(e){var n=$.Pipeline.registeredFunctions[e];if(n)t.add(n);else throw Error("Cannot load unregistered function: "+e)}),t},$.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(e){$.Pipeline.warnIfFunctionNotRegistered(e),this._stack.push(e)},this)},$.Pipeline.prototype.after=function(e,t){$.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw Error("Cannot find existingFn");n+=1,this._stack.splice(n,0,t)},$.Pipeline.prototype.before=function(e,t){$.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw Error("Cannot find existingFn");this._stack.splice(n,0,t)},$.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);-1!=t&&this._stack.splice(t,1)},$.Pipeline.prototype.run=function(e){for(var t=this._stack.length,n=0;n<t;n++){for(var i=this._stack[n],r=[],s=0;s<e.length;s++){var o=i(e[s],s,e);if(null!=o&&""!==o)if(Array.isArray(o))for(var a=0;a<o.length;a++)r.push(o[a]);else r.push(o)}e=r}return e},$.Pipeline.prototype.runString=function(e,t){var n=new $.Token(e,t);return this.run([n]).map(function(e){return e.toString()})},$.Pipeline.prototype.reset=function(){this._stack=[]},$.Pipeline.prototype.toJSON=function(){return this._stack.map(function(e){return $.Pipeline.warnIfFunctionNotRegistered(e),e.label})},$.Vector=function(e){this._magnitude=0,this.elements=e||[]},$.Vector.prototype.positionForIndex=function(e){if(0==this.elements.length)return 0;for(var t=0,n=this.elements.length/2,i=n-t,r=Math.floor(i/2),s=this.elements[2*r];i>1&&(s<e&&(t=r),s>e&&(n=r),s!=e);)i=n-t,r=t+Math.floor(i/2),s=this.elements[2*r];return s==e||s>e?2*r:s<e?(r+1)*2:void 0},$.Vector.prototype.insert=function(e,t){this.upsert(e,t,function(){throw"duplicate index"})},$.Vector.prototype.upsert=function(e,t,n){this._magnitude=0;var i=this.positionForIndex(e);this.elements[i]==e?this.elements[i+1]=n(this.elements[i+1],t):this.elements.splice(i,0,e,t)},$.Vector.prototype.magnitude=function(){if(this._magnitude)return this._magnitude;for(var e=0,t=this.elements.length,n=1;n<t;n+=2){var i=this.elements[n];e+=i*i}return this._magnitude=Math.sqrt(e)},$.Vector.prototype.dot=function(e){for(var t=0,n=this.elements,i=e.elements,r=n.length,s=i.length,o=0,a=0,u=0,c=0;u<r&&c<s;)(o=n[u])<(a=i[c])?u+=2:o>a?c+=2:o==a&&(t+=n[u+1]*i[c+1],u+=2,c+=2);return t},$.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},$.Vector.prototype.toArray=function(){for(var e=Array(this.elements.length/2),t=1,n=0;t<this.elements.length;t+=2,n++)e[n]=this.elements[t];return e},$.Vector.prototype.toJSON=function(){return this.elements},n={ational:"ate",tional:"tion",enci:"ence",anci:"ance",izer:"ize",bli:"ble",alli:"al",entli:"ent",eli:"e",ousli:"ous",ization:"ize",ation:"ate",ator:"ate",alism:"al",iveness:"ive",fulness:"ful",ousness:"ous",aliti:"al",iviti:"ive",biliti:"ble",logi:"log"},i={icate:"ic",ative:"",alize:"al",iciti:"ic",ical:"ic",ful:"",ness:""},a="^("+(s="[^aeiou][^aeiouy]*")+")?"+(o=(r="[aeiouy]")+"[aeiou]*")+s+"("+o+")?$",u="^("+s+")?"+o+s+o+s,c=RegExp("^("+s+")?"+o+s),l=new RegExp(u),h=new RegExp(a),p=RegExp("^("+s+")?"+r),d=/^(.+?)(ss|i)es$/,f=/^(.+?)([^s])s$/,g=/^(.+?)eed$/,m=/^(.+?)(ed|ing)$/,v=/.$/,y=/(at|bl|iz)$/,x=RegExp("([^aeiouylsz])\\1$"),b=RegExp("^"+s+r+"[^aeiouwxy]$"),w=/^(.+?[^aeiou])y$/,S=/^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/,C=/^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/,E=/^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/,_=/^(.+?)(s|t)(ion)$/,k=/^(.+?)e$/,T=/ll$/,O=RegExp("^"+s+r+"[^aeiouwxy]$"),L=function(e){var t,r,s,o,a,u;if(e.length<3)return e;if("y"==(s=e.substr(0,1))&&(e=s.toUpperCase()+e.substr(1)),o=d,a=f,o.test(e)?e=e.replace(o,"$1$2"):a.test(e)&&(e=e.replace(a,"$1$2")),o=g,a=m,o.test(e)){var L=o.exec(e);(o=c).test(L[1])&&(o=v,e=e.replace(o,""))}else if(a.test(e)){var L=a.exec(e);t=L[1],(a=p).test(t)&&(e=t,a=y,u=x,a.test(e)?e+="e":u.test(e)?(o=v,e=e.replace(o,"")):b.test(e)&&(e+="e"))}if((o=w).test(e)){var L=o.exec(e);e=(t=L[1])+"i"}if((o=S).test(e)){var L=o.exec(e);t=L[1],r=L[2],(o=c).test(t)&&(e=t+n[r])}if((o=C).test(e)){var L=o.exec(e);t=L[1],r=L[2],(o=c).test(t)&&(e=t+i[r])}if(o=E,a=_,o.test(e)){var L=o.exec(e);t=L[1],(o=l).test(t)&&(e=t)}else if(a.test(e)){var L=a.exec(e);t=L[1]+L[2],(a=l).test(t)&&(e=t)}if((o=k).test(e)){var L=o.exec(e);t=L[1],o=l,a=h,u=O,(o.test(t)||a.test(t)&&!u.test(t))&&(e=t)}return o=T,a=l,o.test(e)&&a.test(e)&&(o=v,e=e.replace(o,"")),"y"==s&&(e=s.toLowerCase()+e.substr(1)),e},$.stemmer=function(e){return e.update(L)},$.Pipeline.registerFunction($.stemmer,"stemmer"),$.generateStopWordFilter=function(e){var t=e.reduce(function(e,t){return e[t]=t,e},{});return function(e){if(e&&t[e.toString()]!==e.toString())return e}},$.stopWordFilter=$.generateStopWordFilter(["a","able","about","across","after","all","almost","also","am","among","an","and","any","are","as","at","be","because","been","but","by","can","cannot","could","dear","did","do","does","either","else","ever","every","for","from","get","got","had","has","have","he","her","hers","him","his","how","however","i","if","in","into","is","it","its","just","least","let","like","likely","may","me","might","most","must","my","neither","no","nor","not","of","off","often","on","only","or","other","our","own","rather","said","say","says","she","should","since","so","some","than","that","the","their","them","then","there","these","they","this","tis","to","too","twas","us","wants","was","we","were","what","when","where","which","while","who","whom","why","will","with","would","yet","you","your"]),$.Pipeline.registerFunction($.stopWordFilter,"stopWordFilter"),$.trimmer=function(e){return e.update(function(e){return e.replace(/^\W+/,"").replace(/\W+$/,"")})},$.Pipeline.registerFunction($.trimmer,"trimmer"),$.TokenSet=function(){this.final=!1,this.edges={},this.id=$.TokenSet._nextId,$.TokenSet._nextId+=1},$.TokenSet._nextId=1,$.TokenSet.fromArray=function(e){for(var t=new $.TokenSet.Builder,n=0,i=e.length;n<i;n++)t.insert(e[n]);return t.finish(),t.root},$.TokenSet.fromClause=function(e){return"editDistance"in e?$.TokenSet.fromFuzzyString(e.term,e.editDistance):$.TokenSet.fromString(e.term)},$.TokenSet.fromFuzzyString=function(e,t){for(var n=new $.TokenSet,i=[{node:n,editsRemaining:t,str:e}];i.length;){var r=i.pop();if(r.str.length>0){var s,o=r.str.charAt(0);o in r.node.edges?s=r.node.edges[o]:(s=new $.TokenSet,r.node.edges[o]=s),1==r.str.length&&(s.final=!0),i.push({node:s,editsRemaining:r.editsRemaining,str:r.str.slice(1)})}if(0!=r.editsRemaining){if("*"in r.node.edges)var a=r.node.edges["*"];else{var a=new $.TokenSet;r.node.edges["*"]=a}if(0==r.str.length&&(a.final=!0),i.push({node:a,editsRemaining:r.editsRemaining-1,str:r.str}),r.str.length>1&&i.push({node:r.node,editsRemaining:r.editsRemaining-1,str:r.str.slice(1)}),1==r.str.length&&(r.node.final=!0),r.str.length>=1){if("*"in r.node.edges)var u=r.node.edges["*"];else{var u=new $.TokenSet;r.node.edges["*"]=u}1==r.str.length&&(u.final=!0),i.push({node:u,editsRemaining:r.editsRemaining-1,str:r.str.slice(1)})}if(r.str.length>1){var c,l=r.str.charAt(0),h=r.str.charAt(1);h in r.node.edges?c=r.node.edges[h]:(c=new $.TokenSet,r.node.edges[h]=c),1==r.str.length&&(c.final=!0),i.push({node:c,editsRemaining:r.editsRemaining-1,str:l+r.str.slice(2)})}}}return n},$.TokenSet.fromString=function(e){for(var t=new $.TokenSet,n=t,i=0,r=e.length;i<r;i++){var s=e[i],o=i==r-1;if("*"==s)t.edges[s]=t,t.final=o;else{var a=new $.TokenSet;a.final=o,t.edges[s]=a,t=a}}return n},$.TokenSet.prototype.toArray=function(){for(var e=[],t=[{prefix:"",node:this}];t.length;){var n=t.pop(),i=Object.keys(n.node.edges),r=i.length;n.node.final&&(n.prefix.charAt(0),e.push(n.prefix));for(var s=0;s<r;s++){var o=i[s];t.push({prefix:n.prefix.concat(o),node:n.node.edges[o]})}}return e},$.TokenSet.prototype.toString=function(){if(this._str)return this._str;for(var e=this.final?"1":"0",t=Object.keys(this.edges).sort(),n=t.length,i=0;i<n;i++){var r=t[i],s=this.edges[r];e=e+r+s.id}return e},$.TokenSet.prototype.intersect=function(e){for(var t=new $.TokenSet,n=void 0,i=[{qNode:e,output:t,node:this}];i.length;)for(var r=Object.keys((n=i.pop()).qNode.edges),s=r.length,o=Object.keys(n.node.edges),a=o.length,u=0;u<s;u++)for(var c=r[u],l=0;l<a;l++){var h=o[l];if(h==c||"*"==c){var p=n.node.edges[h],d=n.qNode.edges[c],f=p.final&&d.final,g=void 0;h in n.output.edges?(g=n.output.edges[h]).final=g.final||f:((g=new $.TokenSet).final=f,n.output.edges[h]=g),i.push({qNode:d,output:g,node:p})}}return t},$.TokenSet.Builder=function(){this.previousWord="",this.root=new $.TokenSet,this.uncheckedNodes=[],this.minimizedNodes={}},$.TokenSet.Builder.prototype.insert=function(e){var t,n=0;if(e<this.previousWord)throw Error("Out of order word insertion");for(var i=0;i<e.length&&i<this.previousWord.length&&e[i]==this.previousWord[i];i++)n++;this.minimize(n),t=0==this.uncheckedNodes.length?this.root:this.uncheckedNodes[this.uncheckedNodes.length-1].child;for(var i=n;i<e.length;i++){var r=new $.TokenSet,s=e[i];t.edges[s]=r,this.uncheckedNodes.push({parent:t,char:s,child:r}),t=r}t.final=!0,this.previousWord=e},$.TokenSet.Builder.prototype.finish=function(){this.minimize(0)},$.TokenSet.Builder.prototype.minimize=function(e){for(var t=this.uncheckedNodes.length-1;t>=e;t--){var n=this.uncheckedNodes[t],i=n.child.toString();i in this.minimizedNodes?n.parent.edges[n.char]=this.minimizedNodes[i]:(n.child._str=i,this.minimizedNodes[i]=n.child),this.uncheckedNodes.pop()}},$.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},$.Index.prototype.search=function(e){return this.query(function(t){new $.QueryParser(e,t).parse()})},$.Index.prototype.query=function(e){for(var t=new $.Query(this.fields),n=Object.create(null),i=Object.create(null),r=Object.create(null),s=Object.create(null),o=Object.create(null),a=0;a<this.fields.length;a++)i[this.fields[a]]=new $.Vector;e.call(t,t);for(var a=0;a<t.clauses.length;a++){var u=t.clauses[a],c=null,l=$.Set.empty;c=u.usePipeline?this.pipeline.runString(u.term,{fields:u.fields}):[u.term];for(var h=0;h<c.length;h++){u.term=c[h];var p=$.TokenSet.fromClause(u),d=this.tokenSet.intersect(p).toArray();if(0===d.length&&u.presence===$.Query.presence.REQUIRED){for(var f=0;f<u.fields.length;f++){var g=u.fields[f];s[g]=$.Set.empty}break}for(var m=0;m<d.length;m++)for(var v=d[m],y=this.invertedIndex[v],x=y._index,f=0;f<u.fields.length;f++){var g=u.fields[f],b=y[g],w=Object.keys(b),S=v+"/"+g,C=new $.Set(w);if(u.presence==$.Query.presence.REQUIRED&&(l=l.union(C),void 0===s[g]&&(s[g]=$.Set.complete)),u.presence==$.Query.presence.PROHIBITED){void 0===o[g]&&(o[g]=$.Set.empty),o[g]=o[g].union(C);continue}if(i[g].upsert(x,u.boost,function(e,t){return e+t}),!r[S]){for(var E=0;E<w.length;E++){var _,k=w[E],T=new $.FieldRef(k,g),O=b[k];void 0===(_=n[T])?n[T]=new $.MatchData(v,g,O):_.add(v,g,O)}r[S]=!0}}}if(u.presence===$.Query.presence.REQUIRED)for(var f=0;f<u.fields.length;f++){var g=u.fields[f];s[g]=s[g].intersect(l)}}for(var L=$.Set.complete,A=$.Set.empty,a=0;a<this.fields.length;a++){var g=this.fields[a];s[g]&&(L=L.intersect(s[g])),o[g]&&(A=A.union(o[g]))}var P=Object.keys(n),I=[],Q=Object.create(null);if(t.isNegated()){P=Object.keys(this.fieldVectors);for(var a=0;a<P.length;a++){var T=P[a],R=$.FieldRef.fromString(T);n[T]=new $.MatchData}}for(var a=0;a<P.length;a++){var R=$.FieldRef.fromString(P[a]),N=R.docRef;if(L.contains(N)&&!A.contains(N)){var D,F=this.fieldVectors[R],j=i[R.fieldName].similarity(F);if(void 0!==(D=Q[N]))D.score+=j,D.matchData.combine(n[R]);else{var H={ref:N,score:j,matchData:n[R]};Q[N]=H,I.push(H)}}}return I.sort(function(e,t){return t.score-e.score})},$.Index.prototype.toJSON=function(){var e=Object.keys(this.invertedIndex).sort().map(function(e){return[e,this.invertedIndex[e]]},this),t=Object.keys(this.fieldVectors).map(function(e){return[e,this.fieldVectors[e].toJSON()]},this);return{version:$.version,fields:this.fields,fieldVectors:t,invertedIndex:e,pipeline:this.pipeline.toJSON()}},$.Index.load=function(e){var t={},n={},i=e.fieldVectors,r=Object.create(null),s=e.invertedIndex,o=new $.TokenSet.Builder,a=$.Pipeline.load(e.pipeline);e.version!=$.version&&$.utils.warn("Version mismatch when loading serialised index. Current version of lunr '"+$.version+"' does not match serialized index '"+e.version+"'");for(var u=0;u<i.length;u++){var c=i[u],l=c[0],h=c[1];n[l]=new $.Vector(h)}for(var u=0;u<s.length;u++){var c=s[u],p=c[0],d=c[1];o.insert(p),r[p]=d}return o.finish(),t.fields=e.fields,t.fieldVectors=n,t.invertedIndex=r,t.tokenSet=o.root,t.pipeline=a,new $.Index(t)},$.Builder=function(){this._ref="id",this._fields=Object.create(null),this._documents=Object.create(null),this.invertedIndex=Object.create(null),this.fieldTermFrequencies={},this.fieldLengths={},this.tokenizer=$.tokenizer,this.pipeline=new $.Pipeline,this.searchPipeline=new $.Pipeline,this.documentCount=0,this._b=.75,this._k1=1.2,this.termIndex=0,this.metadataWhitelist=[]},$.Builder.prototype.ref=function(e){this._ref=e},$.Builder.prototype.field=function(e,t){if(/\//.test(e))throw RangeError("Field '"+e+"' contains illegal character '/'");this._fields[e]=t||{}},$.Builder.prototype.b=function(e){e<0?this._b=0:e>1?this._b=1:this._b=e},$.Builder.prototype.k1=function(e){this._k1=e},$.Builder.prototype.add=function(e,t){var n=e[this._ref],i=Object.keys(this._fields);this._documents[n]=t||{},this.documentCount+=1;for(var r=0;r<i.length;r++){var s=i[r],o=this._fields[s].extractor,a=o?o(e):e[s],u=this.tokenizer(a,{fields:[s]}),c=this.pipeline.run(u),l=new $.FieldRef(n,s),h=Object.create(null);this.fieldTermFrequencies[l]=h,this.fieldLengths[l]=0,this.fieldLengths[l]+=c.length;for(var p=0;p<c.length;p++){var d=c[p];if(void 0==h[d]&&(h[d]=0),h[d]+=1,void 0==this.invertedIndex[d]){var f=Object.create(null);f._index=this.termIndex,this.termIndex+=1;for(var g=0;g<i.length;g++)f[i[g]]=Object.create(null);this.invertedIndex[d]=f}void 0==this.invertedIndex[d][s][n]&&(this.invertedIndex[d][s][n]=Object.create(null));for(var m=0;m<this.metadataWhitelist.length;m++){var v=this.metadataWhitelist[m],y=d.metadata[v];void 0==this.invertedIndex[d][s][n][v]&&(this.invertedIndex[d][s][n][v]=[]),this.invertedIndex[d][s][n][v].push(y)}}}},$.Builder.prototype.calculateAverageFieldLengths=function(){for(var e=Object.keys(this.fieldLengths),t=e.length,n={},i={},r=0;r<t;r++){var s=$.FieldRef.fromString(e[r]),o=s.fieldName;i[o]||(i[o]=0),i[o]+=1,n[o]||(n[o]=0),n[o]+=this.fieldLengths[s]}for(var a=Object.keys(this._fields),r=0;r<a.length;r++){var u=a[r];n[u]=n[u]/i[u]}this.averageFieldLength=n},$.Builder.prototype.createFieldVectors=function(){for(var e={},t=Object.keys(this.fieldTermFrequencies),n=t.length,i=Object.create(null),r=0;r<n;r++){for(var s=$.FieldRef.fromString(t[r]),o=s.fieldName,a=this.fieldLengths[s],u=new $.Vector,c=this.fieldTermFrequencies[s],l=Object.keys(c),h=l.length,p=this._fields[o].boost||1,d=this._documents[s.docRef].boost||1,f=0;f<h;f++){var g,m,v=l[f],y=c[v],x=this.invertedIndex[v]._index;void 0===i[v]?(g=$.idf(this.invertedIndex[v],this.documentCount),i[v]=g):g=i[v],m=Math.round(1e3*(g*((this._k1+1)*y)/(this._k1*(1-this._b+this._b*(a/this.averageFieldLength[o]))+y)*p*d))/1e3,u.insert(x,m)}e[s]=u}this.fieldVectors=e},$.Builder.prototype.createTokenSet=function(){this.tokenSet=$.TokenSet.fromArray(Object.keys(this.invertedIndex).sort())},$.Builder.prototype.build=function(){return this.calculateAverageFieldLengths(),this.createFieldVectors(),this.createTokenSet(),new $.Index({invertedIndex:this.invertedIndex,fieldVectors:this.fieldVectors,tokenSet:this.tokenSet,fields:Object.keys(this._fields),pipeline:this.searchPipeline})},$.Builder.prototype.use=function(e){var t=Array.prototype.slice.call(arguments,1);t.unshift(this),e.apply(this,t)},$.MatchData=function(e,t,n){for(var i=Object.create(null),r=Object.keys(n||{}),s=0;s<r.length;s++){var o=r[s];i[o]=n[o].slice()}this.metadata=Object.create(null),void 0!==e&&(this.metadata[e]=Object.create(null),this.metadata[e][t]=i)},$.MatchData.prototype.combine=function(e){for(var t=Object.keys(e.metadata),n=0;n<t.length;n++){var i=t[n],r=Object.keys(e.metadata[i]);void 0==this.metadata[i]&&(this.metadata[i]=Object.create(null));for(var s=0;s<r.length;s++){var o=r[s],a=Object.keys(e.metadata[i][o]);void 0==this.metadata[i][o]&&(this.metadata[i][o]=Object.create(null));for(var u=0;u<a.length;u++){var c=a[u];void 0==this.metadata[i][o][c]?this.metadata[i][o][c]=e.metadata[i][o][c]:this.metadata[i][o][c]=this.metadata[i][o][c].concat(e.metadata[i][o][c])}}}},$.MatchData.prototype.add=function(e,t,n){if(!(e in this.metadata)){this.metadata[e]=Object.create(null),this.metadata[e][t]=n;return}if(!(t in this.metadata[e])){this.metadata[e][t]=n;return}for(var i=Object.keys(n),r=0;r<i.length;r++){var s=i[r];s in this.metadata[e][t]?this.metadata[e][t][s]=this.metadata[e][t][s].concat(n[s]):this.metadata[e][t][s]=n[s]}},$.Query=function(e){this.clauses=[],this.allFields=e},$.Query.wildcard=new String("*"),$.Query.wildcard.NONE=0,$.Query.wildcard.LEADING=1,$.Query.wildcard.TRAILING=2,$.Query.presence={OPTIONAL:1,REQUIRED:2,PROHIBITED:3},$.Query.prototype.clause=function(e){return"fields"in e||(e.fields=this.allFields),"boost"in e||(e.boost=1),"usePipeline"in e||(e.usePipeline=!0),"wildcard"in e||(e.wildcard=$.Query.wildcard.NONE),e.wildcard&$.Query.wildcard.LEADING&&e.term.charAt(0)!=$.Query.wildcard&&(e.term="*"+e.term),e.wildcard&$.Query.wildcard.TRAILING&&e.term.slice(-1)!=$.Query.wildcard&&(e.term=""+e.term+"*"),"presence"in e||(e.presence=$.Query.presence.OPTIONAL),this.clauses.push(e),this},$.Query.prototype.isNegated=function(){for(var e=0;e<this.clauses.length;e++)if(this.clauses[e].presence!=$.Query.presence.PROHIBITED)return!1;return!0},$.Query.prototype.term=function(e,t){if(Array.isArray(e))return e.forEach(function(e){this.term(e,$.utils.clone(t))},this),this;var n=t||{};return n.term=e.toString(),this.clause(n),this},$.QueryParseError=function(e,t,n){this.name="QueryParseError",this.message=e,this.start=t,this.end=n},$.QueryParseError.prototype=Error(),$.QueryLexer=function(e){this.lexemes=[],this.str=e,this.length=e.length,this.pos=0,this.start=0,this.escapeCharPositions=[]},$.QueryLexer.prototype.run=function(){for(var e=$.QueryLexer.lexText;e;)e=e(this)},$.QueryLexer.prototype.sliceString=function(){for(var e=[],t=this.start,n=this.pos,i=0;i<this.escapeCharPositions.length;i++)n=this.escapeCharPositions[i],e.push(this.str.slice(t,n)),t=n+1;return e.push(this.str.slice(t,this.pos)),this.escapeCharPositions.length=0,e.join("")},$.QueryLexer.prototype.emit=function(e){this.lexemes.push({type:e,str:this.sliceString(),start:this.start,end:this.pos}),this.start=this.pos},$.QueryLexer.prototype.escapeCharacter=function(){this.escapeCharPositions.push(this.pos-1),this.pos+=1},$.QueryLexer.prototype.next=function(){if(this.pos>=this.length)return $.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},$.QueryLexer.prototype.width=function(){return this.pos-this.start},$.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},$.QueryLexer.prototype.backup=function(){this.pos-=1},$.QueryLexer.prototype.acceptDigitRun=function(){var e,t;do t=(e=this.next()).charCodeAt(0);while(t>47&&t<58);e!=$.QueryLexer.EOS&&this.backup()},$.QueryLexer.prototype.more=function(){return this.pos<this.length},$.QueryLexer.EOS="EOS",$.QueryLexer.FIELD="FIELD",$.QueryLexer.TERM="TERM",$.QueryLexer.EDIT_DISTANCE="EDIT_DISTANCE",$.QueryLexer.BOOST="BOOST",$.QueryLexer.PRESENCE="PRESENCE",$.QueryLexer.lexField=function(e){return e.backup(),e.emit($.QueryLexer.FIELD),e.ignore(),$.QueryLexer.lexText},$.QueryLexer.lexTerm=function(e){if(e.width()>1&&(e.backup(),e.emit($.QueryLexer.TERM)),e.ignore(),e.more())return $.QueryLexer.lexText},$.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit($.QueryLexer.EDIT_DISTANCE),$.QueryLexer.lexText},$.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit($.QueryLexer.BOOST),$.QueryLexer.lexText},$.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit($.QueryLexer.TERM)},$.QueryLexer.termSeparator=$.tokenizer.separator,$.QueryLexer.lexText=function(e){for(;;){var t=e.next();if(t==$.QueryLexer.EOS)return $.QueryLexer.lexEOS;if(92==t.charCodeAt(0)){e.escapeCharacter();continue}if(":"==t)return $.QueryLexer.lexField;if("~"==t)return e.backup(),e.width()>0&&e.emit($.QueryLexer.TERM),$.QueryLexer.lexEditDistance;if("^"==t)return e.backup(),e.width()>0&&e.emit($.QueryLexer.TERM),$.QueryLexer.lexBoost;if("+"==t&&1===e.width()||"-"==t&&1===e.width())return e.emit($.QueryLexer.PRESENCE),$.QueryLexer.lexText;if(t.match($.QueryLexer.termSeparator))return $.QueryLexer.lexTerm}},$.QueryParser=function(e,t){this.lexer=new $.QueryLexer(e),this.query=t,this.currentClause={},this.lexemeIdx=0},$.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=$.QueryParser.parseClause;e;)e=e(this);return this.query},$.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},$.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},$.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},$.QueryParser.parseClause=function(e){var t=e.peekLexeme();if(void 0!=t)switch(t.type){case $.QueryLexer.PRESENCE:return $.QueryParser.parsePresence;case $.QueryLexer.FIELD:return $.QueryParser.parseField;case $.QueryLexer.TERM:return $.QueryParser.parseTerm;default:var n="expected either a field or a term, found "+t.type;throw t.str.length>=1&&(n+=" with value '"+t.str+"'"),new $.QueryParseError(n,t.start,t.end)}},$.QueryParser.parsePresence=function(e){var t=e.consumeLexeme();if(void 0!=t){switch(t.str){case"-":e.currentClause.presence=$.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=$.Query.presence.REQUIRED;break;default:var n="unrecognised presence operator'"+t.str+"'";throw new $.QueryParseError(n,t.start,t.end)}var i=e.peekLexeme();if(void 0==i){var n="expecting term or field, found nothing";throw new $.QueryParseError(n,t.start,t.end)}switch(i.type){case $.QueryLexer.FIELD:return $.QueryParser.parseField;case $.QueryLexer.TERM:return $.QueryParser.parseTerm;default:var n="expecting term or field, found '"+i.type+"'";throw new $.QueryParseError(n,i.start,i.end)}}},$.QueryParser.parseField=function(e){var t=e.consumeLexeme();if(void 0!=t){if(-1==e.query.allFields.indexOf(t.str)){var n=e.query.allFields.map(function(e){return"'"+e+"'"}).join(", "),i="unrecognised field '"+t.str+"', possible fields: "+n;throw new $.QueryParseError(i,t.start,t.end)}e.currentClause.fields=[t.str];var r=e.peekLexeme();if(void 0==r){var i="expecting term, found nothing";throw new $.QueryParseError(i,t.start,t.end)}if(r.type===$.QueryLexer.TERM)return $.QueryParser.parseTerm;var i="expecting term, found '"+r.type+"'";throw new $.QueryParseError(i,r.start,r.end)}},$.QueryParser.parseTerm=function(e){var t=e.consumeLexeme();if(void 0!=t){e.currentClause.term=t.str.toLowerCase(),-1!=t.str.indexOf("*")&&(e.currentClause.usePipeline=!1);var n=e.peekLexeme();if(void 0==n)return void e.nextClause();switch(n.type){case $.QueryLexer.TERM:return e.nextClause(),$.QueryParser.parseTerm;case $.QueryLexer.FIELD:return e.nextClause(),$.QueryParser.parseField;case $.QueryLexer.EDIT_DISTANCE:return $.QueryParser.parseEditDistance;case $.QueryLexer.BOOST:return $.QueryParser.parseBoost;case $.QueryLexer.PRESENCE:return e.nextClause(),$.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+n.type+"'";throw new $.QueryParseError(i,n.start,n.end)}}},$.QueryParser.parseEditDistance=function(e){var t=e.consumeLexeme();if(void 0!=t){var n=parseInt(t.str,10);if(isNaN(n)){var i="edit distance must be numeric";throw new $.QueryParseError(i,t.start,t.end)}e.currentClause.editDistance=n;var r=e.peekLexeme();if(void 0==r)return void e.nextClause();switch(r.type){case $.QueryLexer.TERM:return e.nextClause(),$.QueryParser.parseTerm;case $.QueryLexer.FIELD:return e.nextClause(),$.QueryParser.parseField;case $.QueryLexer.EDIT_DISTANCE:return $.QueryParser.parseEditDistance;case $.QueryLexer.BOOST:return $.QueryParser.parseBoost;case $.QueryLexer.PRESENCE:return e.nextClause(),$.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+r.type+"'";throw new $.QueryParseError(i,r.start,r.end)}}},$.QueryParser.parseBoost=function(e){var t=e.consumeLexeme();if(void 0!=t){var n=parseInt(t.str,10);if(isNaN(n)){var i="boost must be numeric";throw new $.QueryParseError(i,t.start,t.end)}e.currentClause.boost=n;var r=e.peekLexeme();if(void 0==r)return void e.nextClause();switch(r.type){case $.QueryLexer.TERM:return e.nextClause(),$.QueryParser.parseTerm;case $.QueryLexer.FIELD:return e.nextClause(),$.QueryParser.parseField;case $.QueryLexer.EDIT_DISTANCE:return $.QueryParser.parseEditDistance;case $.QueryLexer.BOOST:return $.QueryParser.parseBoost;case $.QueryLexer.PRESENCE:return e.nextClause(),$.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+r.type+"'";throw new $.QueryParseError(i,r.start,r.end)}}},A=function(){return $},"function"==typeof define&&define.amd?define(A):e.exports=A()}()},7668:function(e,t,n){"use strict";n.r(t),n.d(t,{default:()=>v});var i=n(112),r=n.n(i),s=n(4802);s.Z.tokenizer.separator=/[\s\-/]+/;let o=class{constructor(e,t,n="/",i){this.searchDocs=e,this.lunrIndex=s.Z.Index.load(t),this.baseUrl=n,this.maxHits=i}getLunrResult(e){return this.lunrIndex.query(function(t){let n=s.Z.tokenizer(e);t.term(n,{boost:10}),t.term(n,{wildcard:s.Z.Query.wildcard.TRAILING})})}getHit(e,t,n){return{hierarchy:{lvl0:e.pageTitle||e.title,lvl1:0===e.type?null:e.title},url:e.url,version:e.version,_snippetResult:n?{content:{value:n,matchLevel:"full"}}:null,_highlightResult:{hierarchy:{lvl0:{value:0===e.type?t||e.title:e.pageTitle},lvl1:0===e.type?null:{value:t||e.title}}}}}getTitleHit(e,t,n){let i=t[0],r=t[0]+n,s=e.title.substring(0,i)+'<span class="algolia-docsearch-suggestion--highlight">'+e.title.substring(i,r)+"</span>"+e.title.substring(r,e.title.length);return this.getHit(e,s)}getKeywordHit(e,t,n){let i=t[0],r=t[0]+n,s=e.title+"<br /><i>Keywords: "+e.keywords.substring(0,i)+'<span class="algolia-docsearch-suggestion--highlight">'+e.keywords.substring(i,r)+"</span>"+e.keywords.substring(r,e.keywords.length)+"</i>";return this.getHit(e,s)}getContentHit(e,t){let n=t[0],i=t[0]+t[1],r=n,s=i,o=!0,a=!0;for(let t=0;t<3;t++){let t=e.content.lastIndexOf(" ",r-2),n=e.content.lastIndexOf(".",r-2);if(n>0&&n>t){r=n+1,o=!1;break}if(t<0){r=0,o=!1;break}r=t+1}for(let t=0;t<10;t++){let t=e.content.indexOf(" ",s+1),n=e.content.indexOf(".",s+1);if(n>0&&n<t){s=n,a=!1;break}if(t<0){s=e.content.length,a=!1;break}s=t}let u=e.content.substring(r,n);return o&&(u="... "+u),u+='<span class="algolia-docsearch-suggestion--highlight">'+e.content.substring(n,i)+"</span>",u+=e.content.substring(i,s),a&&(u+=" ..."),this.getHit(e,null,u)}search(e){return new Promise((t,n)=>{let i=this.getLunrResult(e),r=[];i.length>this.maxHits&&(i.length=this.maxHits),this.titleHitsRes=[],this.contentHitsRes=[],i.forEach(t=>{let n=this.searchDocs[t.ref],{metadata:i}=t.matchData;for(let s in i)if(i[s].title){if(!this.titleHitsRes.includes(t.ref)){let o=i[s].title.position[0];r.push(this.getTitleHit(n,o,e.length)),this.titleHitsRes.push(t.ref)}}else if(i[s].content){let e=i[s].content.position[0];r.push(this.getContentHit(n,e))}else if(i[s].keywords){let o=i[s].keywords.position[0];r.push(this.getKeywordHit(n,o,e.length)),this.titleHitsRes.push(t.ref)}}),r.length>this.maxHits&&(r.length=this.maxHits),t(r)})}};var a=n(282),u=n.n(a);let c="algolia-docsearch",l=`${c}-suggestion`,h=`${c}-footer`,p={suggestion:`
2
+ <a class="${l}
3
+ {{#isCategoryHeader}}${l}__main{{/isCategoryHeader}}
4
+ {{#isSubCategoryHeader}}${l}__secondary{{/isSubCategoryHeader}}
5
+ "
6
+ aria-label="Link to the result"
7
+ href="{{{url}}}"
8
+ >
9
+ <div class="${l}--category-header">
10
+ <span class="${l}--category-header-lvl0">{{{category}}}</span>
11
+ </div>
12
+ <div class="${l}--wrapper">
13
+ <div class="${l}--subcategory-column">
14
+ <span class="${l}--subcategory-column-text">{{{subcategory}}}</span>
15
+ </div>
16
+ {{#isTextOrSubcategoryNonEmpty}}
17
+ <div class="${l}--content">
18
+ <div class="${l}--subcategory-inline">{{{subcategory}}}</div>
19
+ <div class="${l}--title">{{{title}}}</div>
20
+ {{#text}}<div class="${l}--text">{{{text}}}</div>{{/text}}
21
+ {{#version}}<div class="${l}--version">{{version}}</div>{{/version}}
22
+ </div>
23
+ {{/isTextOrSubcategoryNonEmpty}}
24
+ </div>
25
+ </a>
26
+ `,suggestionSimple:`
27
+ <div class="${l}
28
+ {{#isCategoryHeader}}${l}__main{{/isCategoryHeader}}
29
+ {{#isSubCategoryHeader}}${l}__secondary{{/isSubCategoryHeader}}
30
+ suggestion-layout-simple
31
+ ">
32
+ <div class="${l}--category-header">
33
+ {{^isLvl0}}
34
+ <span class="${l}--category-header-lvl0 ${l}--category-header-item">{{{category}}}</span>
35
+ {{^isLvl1}}
36
+ {{^isLvl1EmptyOrDuplicate}}
37
+ <span class="${l}--category-header-lvl1 ${l}--category-header-item">
38
+ {{{subcategory}}}
39
+ </span>
40
+ {{/isLvl1EmptyOrDuplicate}}
41
+ {{/isLvl1}}
42
+ {{/isLvl0}}
43
+ <div class="${l}--title ${l}--category-header-item">
44
+ {{#isLvl2}}
45
+ {{{title}}}
46
+ {{/isLvl2}}
47
+ {{#isLvl1}}
48
+ {{{subcategory}}}
49
+ {{/isLvl1}}
50
+ {{#isLvl0}}
51
+ {{{category}}}
52
+ {{/isLvl0}}
53
+ </div>
54
+ </div>
55
+ <div class="${l}--wrapper">
56
+ {{#text}}
57
+ <div class="${l}--content">
58
+ <div class="${l}--text">{{{text}}}</div>
59
+ </div>
60
+ {{/text}}
61
+ </div>
62
+ </div>
63
+ `,footer:`
64
+ <div class="${h}">
65
+ </div>
66
+ `,empty:`
67
+ <div class="${l}">
68
+ <div class="${l}--wrapper">
69
+ <div class="${l}--content ${l}--no-results">
70
+ <div class="${l}--title">
71
+ <div class="${l}--text">
72
+ No results found for query <b>"{{query}}"</b>
73
+ </div>
74
+ </div>
75
+ </div>
76
+ </div>
77
+ </div>
78
+ `,searchBox:`
79
+ <form novalidate="novalidate" onsubmit="return false;" class="searchbox">
80
+ <div role="search" class="searchbox__wrapper">
81
+ <input id="docsearch" type="search" name="search" placeholder="Search the docs" autocomplete="off" required="required" class="searchbox__input"/>
82
+ <button type="submit" title="Submit your search query." class="searchbox__submit" >
83
+ <svg width=12 height=12 role="img" aria-label="Search">
84
+ <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#sbx-icon-search-13"></use>
85
+ </svg>
86
+ </button>
87
+ <button type="reset" title="Clear the search query." class="searchbox__reset hide">
88
+ <svg width=12 height=12 role="img" aria-label="Reset">
89
+ <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#sbx-icon-clear-3"></use>
90
+ </svg>
91
+ </button>
92
+ </div>
93
+ </form>
94
+
95
+ <div class="svg-icons" style="height: 0; width: 0; position: absolute; visibility: hidden">
96
+ <svg xmlns="http://www.w3.org/2000/svg">
97
+ <symbol id="sbx-icon-clear-3" viewBox="0 0 40 40"><path d="M16.228 20L1.886 5.657 0 3.772 3.772 0l1.885 1.886L20 16.228 34.343 1.886 36.228 0 40 3.772l-1.886 1.885L23.772 20l14.342 14.343L40 36.228 36.228 40l-1.885-1.886L20 23.772 5.657 38.114 3.772 40 0 36.228l1.886-1.885L16.228 20z" fill-rule="evenodd"></symbol>
98
+ <symbol id="sbx-icon-search-13" viewBox="0 0 40 40"><path d="M26.806 29.012a16.312 16.312 0 0 1-10.427 3.746C7.332 32.758 0 25.425 0 16.378 0 7.334 7.333 0 16.38 0c9.045 0 16.378 7.333 16.378 16.38 0 3.96-1.406 7.593-3.746 10.426L39.547 37.34c.607.608.61 1.59-.004 2.203a1.56 1.56 0 0 1-2.202.004L26.807 29.012zm-10.427.627c7.322 0 13.26-5.938 13.26-13.26 0-7.324-5.938-13.26-13.26-13.26-7.324 0-13.26 5.936-13.26 13.26 0 7.322 5.936 13.26 13.26 13.26z" fill-rule="evenodd"></symbol>
99
+ </svg>
100
+ </div>
101
+ `};var d=n(3988),f=n.n(d);let g={mergeKeyWithParent(e,t){if(void 0===e[t]||"object"!=typeof e[t])return e;let n=f().extend({},e,e[t]);return delete n[t],n},groupBy(e,t){let n={};return f().each(e,(e,i)=>{if(void 0===i[t])throw Error(`[groupBy]: Object has no key ${t}`);let r=i[t];"string"==typeof r&&(r=r.toLowerCase()),Object.prototype.hasOwnProperty.call(n,r)||(n[r]=[]),n[r].push(i)}),n},values:e=>Object.keys(e).map(t=>e[t]),flatten(e){let t=[];return e.forEach(e=>{if(!Array.isArray(e))return void t.push(e);e.forEach(e=>{t.push(e)})}),t},flattenAndFlagFirst(e,t){let n=this.values(e).map(e=>e.map((e,n)=>(e[t]=0===n,e)));return this.flatten(n)},compact(e){let t=[];return e.forEach(e=>{e&&t.push(e)}),t},getHighlightedValue:(e,t)=>e._highlightResult&&e._highlightResult.hierarchy_camel&&e._highlightResult.hierarchy_camel[t]&&e._highlightResult.hierarchy_camel[t].matchLevel&&"none"!==e._highlightResult.hierarchy_camel[t].matchLevel&&e._highlightResult.hierarchy_camel[t].value?e._highlightResult.hierarchy_camel[t].value:e._highlightResult&&e._highlightResult&&e._highlightResult[t]&&e._highlightResult[t].value?e._highlightResult[t].value:e[t],getSnippetedValue(e,t){if(!e._snippetResult||!e._snippetResult[t]||!e._snippetResult[t].value)return e[t];let n=e._snippetResult[t].value;return n[0]!==n[0].toUpperCase()&&(n=`\u{2026}${n}`),-1===[".","!","?"].indexOf(n[n.length-1])&&(n=`${n}\u{2026}`),n},deepClone:e=>JSON.parse(JSON.stringify(e))};class m{constructor({searchDocs:e,searchIndex:t,inputSelector:n,debug:i=!1,baseUrl:r="/",queryDataCallback:s=null,autocompleteOptions:a={debug:!1,hint:!1,autoselect:!0},transformData:c=!1,queryHook:l=!1,handleSelected:h=!1,enhancedSearchInput:d=!1,layout:g="column",maxHits:v=5}){this.input=m.getInputFromSelector(n),this.queryDataCallback=s||null;let y=!!a&&!!a.debug&&a.debug;a.debug=i||y,this.autocompleteOptions=a,this.autocompleteOptions.cssClasses=this.autocompleteOptions.cssClasses||{},this.autocompleteOptions.cssClasses.prefix=this.autocompleteOptions.cssClasses.prefix||"ds";let x=this.input&&"function"==typeof this.input.attr&&this.input.attr("aria-label");this.autocompleteOptions.ariaLabel=this.autocompleteOptions.ariaLabel||x||"search input",this.isSimpleLayout="simple"===g,this.client=new o(e,t,r,v),d&&(this.input=m.injectSearchBox(this.input)),this.autocomplete=u()(this.input,a,[{source:this.getAutocompleteSource(c,l),templates:{suggestion:m.getSuggestionTemplate(this.isSimpleLayout),footer:p.footer,empty:m.getEmptyTemplate()}}]),this.handleSelected=h||this.handleSelected,h&&f()(".algolia-autocomplete").on("click",".ds-suggestions a",e=>{e.preventDefault()}),this.autocomplete.on("autocomplete:selected",this.handleSelected.bind(null,this.autocomplete.autocomplete)),this.autocomplete.on("autocomplete:shown",this.handleShown.bind(null,this.input)),d&&m.bindSearchBoxEvent(),document.addEventListener("keydown",e=>{(e.ctrlKey||e.metaKey)&&"k"==e.key&&(this.input.focus(),e.preventDefault())})}static injectSearchBox(e){e.before(p.searchBox);let t=e.prev().prev().find("input");return e.remove(),t}static bindSearchBoxEvent(){f()('.searchbox [type="reset"]').on("click",function(){f()("input#docsearch").focus(),f()(this).addClass("hide"),u().autocomplete.setVal("")}),f()("input#docsearch").on("keyup",()=>{let e=document.querySelector("input#docsearch"),t=document.querySelector('.searchbox [type="reset"]');t.className="searchbox__reset",0===e.value.length&&(t.className+=" hide")})}static getInputFromSelector(e){let t=f()(e).filter("input");return t.length?f()(t[0]):null}getAutocompleteSource(e,t){return(n,i)=>{t&&(n=t(n)||n),this.client.search(n).then(t=>{this.queryDataCallback&&"function"==typeof this.queryDataCallback&&this.queryDataCallback(t),e&&(t=e(t)||t),i(m.formatHits(t))})}}static formatHits(e){let t=g.deepClone(e).map(e=>(e._highlightResult&&(e._highlightResult=g.mergeKeyWithParent(e._highlightResult,"hierarchy")),g.mergeKeyWithParent(e,"hierarchy"))),n=g.groupBy(t,"lvl0");return f().each(n,(e,t)=>{let i=g.groupBy(t,"lvl1"),r=g.flattenAndFlagFirst(i,"isSubCategoryHeader");n[e]=r}),(n=g.flattenAndFlagFirst(n,"isCategoryHeader")).map(e=>{let t=m.formatURL(e),n=g.getHighlightedValue(e,"lvl0"),i=g.getHighlightedValue(e,"lvl1")||n,r=g.compact([g.getHighlightedValue(e,"lvl2")||i,g.getHighlightedValue(e,"lvl3"),g.getHighlightedValue(e,"lvl4"),g.getHighlightedValue(e,"lvl5"),g.getHighlightedValue(e,"lvl6")]).join('<span class="aa-suggestion-title-separator" aria-hidden="true"> \u203A </span>'),s=g.getSnippetedValue(e,"content"),o=i&&""!==i||r&&""!==r,a=!i||""===i||i===n,u=r&&""!==r&&r!==i,c=!u&&i&&""!==i&&i!==n,l=e.version;return{isLvl0:!c&&!u,isLvl1:c,isLvl2:u,isLvl1EmptyOrDuplicate:a,isCategoryHeader:e.isCategoryHeader,isSubCategoryHeader:e.isSubCategoryHeader,isTextOrSubcategoryNonEmpty:o,category:n,subcategory:i,title:r,text:s,url:t,version:l}})}static formatURL(e){let{url:t,anchor:n}=e;if(t){if(-1!==t.indexOf("#"));else if(n)return`${e.url}#${e.anchor}`;return t}return n?`#${e.anchor}`:(console.warn("no anchor nor url for : ",JSON.stringify(e)),null)}static getEmptyTemplate(){return e=>r().compile(p.empty).render(e)}static getSuggestionTemplate(e){let t=e?p.suggestionSimple:p.suggestion,n=r().compile(t);return e=>n.render(e)}handleSelected(e,t,n,i){let r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};"click"!==r.selectionMethod&&(e.setVal(""),window.location.assign(n.url))}handleShown(e){let t=e.offset().left+e.width()/2,n=f()(document).width()/2;isNaN(n)&&(n=900);let i=t-n>=0?"algolia-autocomplete-right":"algolia-autocomplete-left",r=t-n<0?"algolia-autocomplete-right":"algolia-autocomplete-left",s=f()(".algolia-autocomplete");s.hasClass(i)||s.addClass(i),s.hasClass(r)&&s.removeClass(r)}}let v=m}}]);
@@ -0,0 +1 @@
1
+ "use strict";(self.webpackChunkdocs_openc3_com=self.webpackChunkdocs_openc3_com||[]).push([["4593"],{3814:function(e,t,i){i.r(t),i.d(t,{frontMatter:()=>r,default:()=>c,toc:()=>h,metadata:()=>a,assets:()=>o,contentTitle:()=>l});var a=JSON.parse('{"id":"tools/tlm-grapher","title":"Telemetry Grapher","description":"Graph real time or historical data","source":"@site/docs/tools/tlm-grapher.md","sourceDirName":"tools","slug":"/tools/tlm-grapher","permalink":"/tools/staticdocs/docs/tools/tlm-grapher","draft":false,"unlisted":false,"editUrl":"https://github.com/OpenC3/cosmos/tree/main/docs.openc3.com/docs/tools/tlm-grapher.md","tags":[],"version":"current","frontMatter":{"title":"Telemetry Grapher","description":"Graph real time or historical data","sidebar_custom_props":{"myEmoji":"\uD83D\uDCC8"}},"sidebar":"defaultSidebar","previous":{"title":"Table Manager","permalink":"/tools/staticdocs/docs/tools/table-manager"},"next":{"title":"Telemetry Viewer","permalink":"/tools/staticdocs/docs/tools/tlm-viewer"}}'),n=i(2322),s=i(2840);let r={title:"Telemetry Grapher",description:"Graph real time or historical data",sidebar_custom_props:{myEmoji:"\uD83D\uDCC8"}},l=void 0,o={},h=[{value:"Introductions",id:"introductions",level:2},{value:"Telemetry Grapher Menus",id:"telemetry-grapher-menus",level:2},{value:"File Menu Items",id:"file-menu-items",level:3},{value:"Open Configuration",id:"open-configuration",level:4},{value:"Save Configuration",id:"save-configuration",level:4},{value:"Graph Menu Items",id:"graph-menu-items",level:3},{value:"Selecting Items",id:"selecting-items",level:2},{value:"Graph Window Management",id:"graph-window-management",level:2}];function d(e){let t={h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",p:"p",ul:"ul",...(0,s.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h2,{id:"introductions",children:"Introductions"}),"\n",(0,n.jsx)(t.p,{children:"Telemetry Grapher is a graphing application that allows for one or more telemetry points per graph. It supports multiple graphs per screen which can be resized and reordered. Multiple configurations can be saved and restored for different situations."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Telemetry Grapher",src:i(2603).Z+"",width:"1270",height:"927"})}),"\n",(0,n.jsx)(t.h2,{id:"telemetry-grapher-menus",children:"Telemetry Grapher Menus"}),"\n",(0,n.jsx)(t.h3,{id:"file-menu-items",children:"File Menu Items"}),"\n",(0,n.jsx)("img",{src:i(857).Z,alt:"File Menu",style:{float:"left","margin-right":"50px",height:"90px"}}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"Open a saved configuration (graphs and items)"}),"\n",(0,n.jsx)(t.li,{children:"Save the current configuration"}),"\n",(0,n.jsx)(t.li,{children:"Reset the configuration (default settings)"}),"\n"]}),"\n",(0,n.jsx)(t.h4,{id:"open-configuration",children:"Open Configuration"}),"\n",(0,n.jsx)(t.p,{children:"The Open Configuration dialog displays a list of all saved configurations. You select a configuration and then click Ok to load it. You can delete existing configurations by clicking the Trash icon next to a configuration name."}),"\n",(0,n.jsx)(t.h4,{id:"save-configuration",children:"Save Configuration"}),"\n",(0,n.jsx)(t.p,{children:"The Save Configuration dialog also displays a list of all saved configurations. You click the Configuration Name text field, enter the name of your new configuration, and click Ok to save. You can delete existing configurations by clicking the Trash icon next to a configuration name."}),"\n",(0,n.jsx)(t.h3,{id:"graph-menu-items",children:"Graph Menu Items"}),"\n",(0,n.jsx)("img",{src:i(9309).Z,alt:"File Menu",style:{float:"left","margin-right":"50px",height:"150px"}}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"Add a new graph"}),"\n",(0,n.jsx)(t.li,{children:"Start / Resume graphing"}),"\n",(0,n.jsx)(t.li,{children:"Pause graph"}),"\n",(0,n.jsx)(t.li,{children:"Stop graph"}),"\n",(0,n.jsx)(t.li,{children:"Edit grapher settings"}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"Editing the grapher settings brings up a dialog to change settings affecting every graph in the Telemetry Grapher tool. Changing the Seconds Graphed changes the visible windows displaying graph points. The smaller of Seconds Graphed and Points Graphed will be used when calculating the number of points to display. Changing the Points Saved will affect performance of the browser window if set too high. The default of 1,000,000 points can store over 11.5 days of 1Hz data points."}),"\n",(0,n.jsx)(t.p,{children:"Editing an individual graph by clicking the pencil icon in title bar of the graph brings up the edit graph dialog."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Edit Graph",src:i(8422).Z+"",width:"592",height:"766"})}),"\n",(0,n.jsx)(t.p,{children:"Editing the Start Date and Start Time will re-query the data to begin at the specified time. This operation can take several seconds depending on how far back data is requested. Similarly, specifying the End Date and End Time will limit the data request to the specified time. Leaving the End Date / End Time fields blank will cause Telemetry Grapher to continue to graph items in real-time as they arrive."}),"\n",(0,n.jsx)(t.p,{children:"Changing the Min Y and Max Y values simply sets the graph scale. Deleting the Min Y and Max Y values allows the graph to scale automatically as values arrive. Compare the following graph with the minimum set to 0 and the maximum set to 100 with the first graph image (auto-scale)."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Min Max",src:i(7708).Z+"",width:"1247",height:"718"})}),"\n",(0,n.jsx)(t.h2,{id:"selecting-items",children:"Selecting Items"}),"\n",(0,n.jsx)(t.p,{children:"Selecting a target from the Select Target drop down automatically updates the available packets in the Select Packet drop down which updates the available items in the Select Item drop down. Clicking Add Item adds the item to the graph which immediately begins graphing."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Temp 1",src:i(8813).Z+"",width:"1247",height:"829"})}),"\n",(0,n.jsx)(t.p,{children:"As time passes, the main graph fills up and starts scrolling while the overview graph at the bottom shows the entire history."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Temp 1 History",src:i(4854).Z+"",width:"1247",height:"829"})}),"\n",(0,n.jsx)(t.p,{children:"Selecting a new item and adding it to the graph automatically fills the graph with history until the beginning of the first item. This allows you to add items to the graph incrementally and maintain full history."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Temp1 Temp2",src:i(8133).Z+"",width:"1247",height:"829"})}),"\n",(0,n.jsx)(t.h2,{id:"graph-window-management",children:"Graph Window Management"}),"\n",(0,n.jsx)(t.p,{children:"All graphs can be moved around the browser window by clicking their title bar and moving them. Other graphs will move around intelligently to fill the space. This allows you order the graphs no matter which order they were created in."}),"\n",(0,n.jsx)(t.p,{children:"Each graph has a set of window buttons in the upper right corner. The first shrinks or grows the graph both horizontally and vertically to allow for 4 graphs in the same browser tab. Note that half height graphs no longer show the overview graph."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Four Graphs",src:i(3032).Z+"",width:"1247",height:"710"})}),"\n",(0,n.jsx)(t.p,{children:"The second button shrinks or grows the graph horizontally so it will either be half or full width of the browser window. This allows for two full width graphs on top of each other."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Two Full Width",src:i(5813).Z+"",width:"1247",height:"833"})}),"\n",(0,n.jsx)(t.p,{children:"The second button shrinks or grows the graph vertically so it will either be half or full height of the browser window. This allows for two full height graphs side by side."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Two Full Height",src:i(9038).Z+"",width:"1247",height:"833"})}),"\n",(0,n.jsx)(t.p,{children:"The line button minimizes the graph to effectively hide it. This allows you to focus on a single graph without losing existing graphs."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Minimized",src:i(8171).Z+"",width:"1247",height:"833"})}),"\n",(0,n.jsx)(t.p,{children:"The final X button closes the graph."})]})}function c(e={}){let{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},857:function(e,t,i){i.d(t,{Z:()=>a});let a=i.p+"assets/images/file_menu-1c05cfc08f9d07b3f7122d2fe1ad98ed428dc563d2c5d2edddbed71f46779eb8.png"},9309:function(e,t,i){i.d(t,{Z:()=>a});let a=i.p+"assets/images/graph_menu-289cbbb168622f661c1c98a7bd2c1b43f888e9c3560ba4e1d435ab62d0aad6de.png"},8422:function(e,t,i){i.d(t,{Z:()=>a});let a=i.p+"assets/images/edit_graph-9618076f837e0d358ea0bfbf503d43b377805d818370405536f5a1c049209e99.png"},3032:function(e,t,i){i.d(t,{Z:()=>a});let a=i.p+"assets/images/four_graphs-1aa5a7cb9ce51cec815fc9d8740b40e113bd171c4977711d47ef1e6daf02719e.png"},7708:function(e,t,i){i.d(t,{Z:()=>a});let a=i.p+"assets/images/graph_min_max-75be4a19a7e13a1b9b7a18a9b898b170c8ded7768b01ce6c6effd566ac8e071a.png"},8813:function(e,t,i){i.d(t,{Z:()=>a});let a=i.p+"assets/images/graph_temp1-028d8660c779136ff017b0b8a9fadb294e9ff478a65d7bd73032c3c2ed4f03d0.png"},8133:function(e,t,i){i.d(t,{Z:()=>a});let a=i.p+"assets/images/graph_temp1_temp2-ad650da0ddf1fb5c6e9764b737bfab3027f5abcb935ad86d9716dfdf13032dca.png"},4854:function(e,t,i){i.d(t,{Z:()=>a});let a=i.p+"assets/images/graph_temp1_time-53c18518755d1d1c816db7f0a67e26c5408aba32b644fda519b5ecf7a7ee9b27.png"},8171:function(e,t,i){i.d(t,{Z:()=>a});let a=i.p+"assets/images/minimized-47ddb9b9b68b47aae3d0a12cb39ab767adf446acbe213c0b5565c1bfaf8a463f.png"},2603:function(e,t,i){i.d(t,{Z:()=>a});let a=i.p+"assets/images/telemetry_grapher-3a37c074a25b7912a76d96fd46a1431d27202d71374f78c829f273e5cb342233.png"},9038:function(e,t,i){i.d(t,{Z:()=>a});let a=i.p+"assets/images/two_full_height-ccba2940b80345f3569ea47b7ddd3390c08195de91559f5586f85e36e411afd6.png"},5813:function(e,t,i){i.d(t,{Z:()=>a});let a=i.p+"assets/images/two_full_width-0116adbf994500a24d4717e002d32098f8d6197bcece510b84b90400f23feade.png"},2840:function(e,t,i){i.d(t,{Z:()=>l,a:()=>r});var a=i(2784);let n={},s=a.createContext(n);function r(e){let t=a.useContext(s);return a.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),a.createElement(s.Provider,{value:t},e.children)}}}]);
@@ -0,0 +1 @@
1
+ "use strict";(self.webpackChunkdocs_openc3_com=self.webpackChunkdocs_openc3_com||[]).push([["7471"],{4987:function(e,i,t){t.r(i),t.d(i,{frontMatter:()=>a,default:()=>h,toc:()=>d,metadata:()=>n,assets:()=>r,contentTitle:()=>l});var n=JSON.parse('{"id":"tools/limits-monitor","title":"Limits Monitor","description":"View out of limit items and log messages","source":"@site/docs/tools/limits-monitor.md","sourceDirName":"tools","slug":"/tools/limits-monitor","permalink":"/tools/staticdocs/docs/tools/limits-monitor","draft":false,"unlisted":false,"editUrl":"https://github.com/OpenC3/cosmos/tree/main/docs.openc3.com/docs/tools/limits-monitor.md","tags":[],"version":"current","frontMatter":{"title":"Limits Monitor","description":"View out of limit items and log messages","sidebar_custom_props":{"myEmoji":"\uD83D\uDEA5"}},"sidebar":"defaultSidebar","previous":{"title":"Handbooks","permalink":"/tools/staticdocs/docs/tools/handbooks"},"next":{"title":"Packet Viewer","permalink":"/tools/staticdocs/docs/tools/packet-viewer"}}'),s=t(2322),o=t(2840);let a={title:"Limits Monitor",description:"View out of limit items and log messages",sidebar_custom_props:{myEmoji:"\uD83D\uDEA5"}},l=void 0,r={},d=[{value:"Introduction",id:"introduction",level:2},{value:"Limits Monitor Menus",id:"limits-monitor-menus",level:2},{value:"File Menu Items",id:"file-menu-items",level:3},{value:"Show Ignored",id:"show-ignored",level:4},{value:"Change Limits Set",id:"change-limits-set",level:4},{value:"Open Configuration",id:"open-configuration",level:4},{value:"Save Configuration",id:"save-configuration",level:4},{value:"Limits Items",id:"limits-items",level:2},{value:"Limits Log",id:"limits-log",level:2}];function c(e){let i={a:"a",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",p:"p",ul:"ul",...(0,o.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.h2,{id:"introduction",children:"Introduction"}),"\n",(0,s.jsx)(i.p,{children:"The Limits Monitor application provides situational awareness for all telemetry items with limits. All limits items which violate their yellow or red limits are shown and continue to be shown until explicitly dismissed. Individual items and entire packets can be manually ignored to filter out known issues. In addition, all limits events are logged in a table which can be searched."}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"Cmd Tlm Server",src:t(3163).Z+"",width:"1270",height:"803"})}),"\n",(0,s.jsx)(i.h2,{id:"limits-monitor-menus",children:"Limits Monitor Menus"}),"\n",(0,s.jsx)(i.h3,{id:"file-menu-items",children:"File Menu Items"}),"\n",(0,s.jsx)("img",{src:t(1657).Z,alt:"File Menu",style:{float:"left","margin-right":"50px",height:"150px"}}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:"Show the list of ignored items"}),"\n",(0,s.jsx)(i.li,{children:"Change the overall COSMOS limits set"}),"\n",(0,s.jsx)(i.li,{children:"Opens a saved configuration"}),"\n",(0,s.jsx)(i.li,{children:"Save the current configuration (ignored items)"}),"\n",(0,s.jsx)(i.li,{children:"Reset the configuration (defaults settings)"}),"\n"]}),"\n",(0,s.jsx)(i.h4,{id:"show-ignored",children:"Show Ignored"}),"\n",(0,s.jsx)(i.p,{children:"This dialog displays all the items which the user has manually ignored by clicking the ignore icons next to out of limits items. Note that entire Packets which have been ignored are listed as TARGET PACKET without an item (as shown by INST MECH). Ignored items are removed by clicking the Trash icon. This means that the next time this item goes out of limits it will be displayed."}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"Ignored",src:t(7345).Z+"",width:"594",height:"306"})}),"\n",(0,s.jsx)(i.h4,{id:"change-limits-set",children:"Change Limits Set"}),"\n",(0,s.jsxs)(i.p,{children:["Limits sets are defined with the ",(0,s.jsx)(i.a,{href:"../configuration/telemetry#limits",children:"LIMITS"})," keyword on telemetry items. Each item must have at least a DEFAULT limits set but can also have other named limit sets. COSMOS only has a single limits set active at one time. This dialog allows the user to change the active limits set and apply new limit values across all of COSMOS."]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"Change Limits Set",src:t(918).Z+"",width:"647",height:"217"})}),"\n",(0,s.jsx)(i.h4,{id:"open-configuration",children:"Open Configuration"}),"\n",(0,s.jsx)(i.p,{children:"The Open Configuration dialog displays a list of all saved configurations. You select a configuration and then click Ok to load it. You can delete existing configurations by clicking the Trash icon next to a configuration name."}),"\n",(0,s.jsx)(i.h4,{id:"save-configuration",children:"Save Configuration"}),"\n",(0,s.jsx)(i.p,{children:"The Save Configuration dialog also displays a list of all saved configurations. You click the Configuration Name text field, enter the name of your new configuration, and click Ok to save. You can delete existing configurations by clicking the Trash icon next to a configuration name."}),"\n",(0,s.jsx)(i.h2,{id:"limits-items",children:"Limits Items"}),"\n",(0,s.jsx)(i.p,{children:"The main interface of Limits Monitor is the top where items are displayed when they violate a yellow or red limit."}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"Limits",src:t(3163).Z+"",width:"1270",height:"803"})}),"\n",(0,s.jsxs)(i.p,{children:["Items with limits values are displayed using a red yellow green limits bar displaying where the current value lies within the defined limits (as shown by the various TEMP items). Items with yellow or red ",(0,s.jsx)(i.a,{href:"/tools/staticdocs/docs/configuration/telemetry#state",children:"states"})," are simply displayed with their state color (as shown by GROUND1STATUS). The COSMOS Demo contains both INST HEALTH_STATUS TEMP2 and INST2 HEALTH_STATUS TEMP2 which are identically named items within different target packets. Limits Monitor only displays the item name to save space, however if you mouse over the value box the full target and packet name is displayed."]}),"\n",(0,s.jsx)(i.p,{children:"Clicking the first nested 'X' icon ignores the entire packet where the item resides. Any additional items in that packet which go out of limits are also ignored by Limits Monitor. Clicking the second (middle) 'X' ignores ONLY that specific item. If any packets or items are ignored the Overall Limits State is updated to indicate \"(Some items ignored)\" to indicate the Limits State is potentially being affected by ignored items."}),"\n",(0,s.jsx)(i.p,{children:"Clicking the last icon (eye with strike-through) temporarily hides the specified item. This is different from ignoring an item because if this item goes out of limits it will be again be displayed. Hiding an item is useful if the item has gone back to green and you want to continue to track it but want to clean up the current list of items. For example, we might hide the GROUND1STATUS items in the above example as they have transitioned back to green."}),"\n",(0,s.jsx)(i.h2,{id:"limits-log",children:"Limits Log"}),"\n",(0,s.jsx)(i.p,{children:"The Log section lists all limits events. Events can be filtered by using the Search box as shown."}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"Log",src:t(5314).Z+"",width:"1261",height:"522"})})]})}function h(e={}){let{wrapper:i}={...(0,o.a)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},1657:function(e,i,t){t.d(i,{Z:()=>n});let n=t.p+"assets/images/file_menu-953e2fc0c1a5b30c90d6f748add6ee28f8b42f30fc33d0b3c8709d6c85f06585.png"},918:function(e,i,t){t.d(i,{Z:()=>n});let n=t.p+"assets/images/change_limits_set-b72da282ea28d783bd7e1d0cd48db72486dacb4e76e1cd46d52c7999028d9c0d.png"},7345:function(e,i,t){t.d(i,{Z:()=>n});let n=t.p+"assets/images/ignored-0917bd9f41f4e93704daa45cc0a7b70809bdbba03615d6de254336141b598992.png"},3163:function(e,i,t){t.d(i,{Z:()=>n});let n=t.p+"assets/images/limits_monitor-34ca441e5a7198b4dc57a27b2e6fcb973dddad5eaaa5e9bf0d60738f4143c73a.png"},5314:function(e,i,t){t.d(i,{Z:()=>n});let n=t.p+"assets/images/log-6cf3276d9e6b7dc30573b2b6a5989c6c5defc658e2c0ae4c2150a5fd11fd49d3.png"},2840:function(e,i,t){t.d(i,{Z:()=>l,a:()=>a});var n=t(2784);let s={},o=n.createContext(s);function a(e){let i=n.useContext(o);return n.useMemo(function(){return"function"==typeof e?e(i):{...i,...e}},[i,e])}function l(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),n.createElement(o.Provider,{value:i},e.children)}}}]);
@@ -1 +1 @@
1
- "use strict";(self.webpackChunkdocs_openc3_com=self.webpackChunkdocs_openc3_com||[]).push([["1417"],{5525:function(e,n,t){t.r(n),t.d(n,{frontMatter:()=>r,default:()=>h,toc:()=>a,metadata:()=>i,assets:()=>l,contentTitle:()=>c});var i=JSON.parse('{"id":"tools/tlm-viewer","title":"Telemetry Viewer","description":"Build custom screens using built-in widgets","source":"@site/docs/tools/tlm-viewer.md","sourceDirName":"tools","slug":"/tools/tlm-viewer","permalink":"/tools/staticdocs/docs/tools/tlm-viewer","draft":false,"unlisted":false,"editUrl":"https://github.com/OpenC3/cosmos/tree/main/docs.openc3.com/docs/tools/tlm-viewer.md","tags":[],"version":"current","frontMatter":{"title":"Telemetry Viewer","description":"Build custom screens using built-in widgets","sidebar_custom_props":{"myEmoji":"\uD83D\uDEE0\uFE0F"}},"sidebar":"defaultSidebar","previous":{"title":"Telemetry Grapher","permalink":"/tools/staticdocs/docs/tools/tlm-grapher"},"next":{"title":"Guides","permalink":"/tools/staticdocs/docs/guides"}}'),s=t(2322),o=t(2840);let r={title:"Telemetry Viewer",description:"Build custom screens using built-in widgets",sidebar_custom_props:{myEmoji:"\uD83D\uDEE0\uFE0F"}},c=void 0,l={},a=[{value:"Introduction",id:"introduction",level:2},{value:"File Menu Items",id:"file-menu-items",level:3},{value:"Open Configuration",id:"open-configuration",level:4},{value:"Save Configuration",id:"save-configuration",level:4},{value:"Selecting Screens",id:"selecting-screens",level:2},{value:"New Screen",id:"new-screen",level:2},{value:"Edit Screen",id:"edit-screen",level:2},{value:"Screen Window Management",id:"screen-window-management",level:2},{value:"Building Screens",id:"building-screens",level:2}];function d(e){let n={a:"a",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",p:"p",ul:"ul",...(0,o.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,s.jsx)(n.p,{children:"Telemetry Viewer is a live telemetry viewer which displays custom built screens. Screens are configured through simple text files which utilize numerous built-in widgets."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Telemetry Viewer",src:t(6574).Z+"",width:"1274",height:"895"})}),"\n",(0,s.jsx)(n.h3,{id:"file-menu-items",children:"File Menu Items"}),"\n",(0,s.jsx)("img",{src:t(370).Z,alt:"File Menu",style:{float:"left","margin-right":"50px",height:"90px"}}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Open a saved configuration"}),"\n",(0,s.jsx)(n.li,{children:"Save the current configuration"}),"\n",(0,s.jsx)(n.li,{children:"Reset the configuration (default settings)"}),"\n"]}),"\n",(0,s.jsx)(n.h4,{id:"open-configuration",children:"Open Configuration"}),"\n",(0,s.jsx)(n.p,{children:"The Open Configuration dialog displays a list of all saved configurations. You select a configuration and then click Ok to load it. You can delete existing configurations by clicking the Trash icon next to a configuration name."}),"\n",(0,s.jsx)(n.h4,{id:"save-configuration",children:"Save Configuration"}),"\n",(0,s.jsx)(n.p,{children:"The Save Configuration dialog also displays a list of all saved configurations. You click the Configuration Name text field, enter the name of your new configuration, and click Ok to save. You can delete existing configurations by clicking the Trash icon next to a configuration name."}),"\n",(0,s.jsx)(n.h2,{id:"selecting-screens",children:"Selecting Screens"}),"\n",(0,s.jsx)(n.p,{children:"Selecting a target from the Select Target drop down automatically updates the available screens for that target in the Select Screen drop down. Clicking Show Screen causes that screen to display."}),"\n",(0,s.jsx)(n.h2,{id:"new-screen",children:"New Screen"}),"\n",(0,s.jsx)(n.p,{children:"Clicking New Screen brings up the new screen dialog."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Telemetry Viewer",src:t(6374).Z+"",width:"595",height:"424"})}),"\n",(0,s.jsx)(n.p,{children:"Screens are owned by Targets so Select Target chooses where the screen will be created. Screens can be based on a Packet such that all the items in that particular packet will be generated in a simple vertical screen similar to Packet Viewer. This is a good starting point for customizing a screen. Note that screen names must be unique so the screen name is set to 'adcs2' since an 'ADCS' screen already exists."}),"\n",(0,s.jsx)(n.h2,{id:"edit-screen",children:"Edit Screen"}),"\n",(0,s.jsx)(n.p,{children:"Clicking the pencil icon in the title bar of the screen brings up the edit dialog."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Telemetry Viewer",src:t(2747).Z+"",width:"1149",height:"698"})}),"\n",(0,s.jsx)(n.p,{children:"The screen source is displayed in an editor with syntax highlighting and auto-completion. You can download the screen source using the download button in the upper right or delete the screen using the trash icon in the upper left. Click Save to save the screen edits at which point Telemetry Viewer will re-render the screen."}),"\n",(0,s.jsx)(n.h2,{id:"screen-window-management",children:"Screen Window Management"}),"\n",(0,s.jsx)(n.p,{children:"All screens can be moved around the browser window by clicking their title bar and moving them. Other screens will move around intelligently to fill the space. This allows you to order the screens no matter which order they were created in."}),"\n",(0,s.jsx)(n.p,{children:"You can also float the screens by clicking the grid icon in the upper left of the title bar. It will change to a balloon icon and allow you to click up and down to change the relative Z index of the window. The image screen is floated in the following screen shot."}),"\n",(0,s.jsx)(n.p,{children:"The dash button in the upper right of the title bar minimizes the screen to effectively hide it. This allows you to focus on a single screen without closing existing screens. In the screen shot below there are two minimized windows at the very bottom."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Float Minimized",src:t(4245).Z+"",width:"1275",height:"928"})}),"\n",(0,s.jsx)(n.p,{children:"The X button closes the screen."}),"\n",(0,s.jsx)(n.h2,{id:"building-screens",children:"Building Screens"}),"\n",(0,s.jsxs)(n.p,{children:["For documentation on how to build Telemetry Screens and how to configure the\nscreen widgets please see the ",(0,s.jsx)(n.a,{href:"/tools/staticdocs/docs/configuration/telemetry-screens",children:"Telemetry Screens"}),"."]})]})}function h(e={}){let{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},370:function(e,n,t){t.d(n,{Z:()=>i});let i=t.p+"assets/images/file_menu-8a0c6243e35822617229a729a598ace78e401b6c29f66eb5e07035d77d9be1aa.png"},2747:function(e,n,t){t.d(n,{Z:()=>i});let i=t.p+"assets/images/edit_screen-c655c75fe90429c0425b61cccf23835b6882975abaa56de21d58c9a4b19a4773.png"},4245:function(e,n,t){t.d(n,{Z:()=>i});let i=t.p+"assets/images/float_minimize-a27fc649e517b279db5d2435fbd4f1de81418b9ef5f47fc83a9443bba0b1a7e0.png"},6374:function(e,n,t){t.d(n,{Z:()=>i});let i=t.p+"assets/images/new_screen-0d9bea0538e91fa2332346f1ff73b1dda2e418d295dcd7d6a13ba240cf32187e.png"},6574:function(e,n,t){t.d(n,{Z:()=>i});let i=t.p+"assets/images/telemetry_viewer-e4ac466930993a640f95aea4b01bb9a415eec77dfbfaa184f767cb59940ba943.png"},2840:function(e,n,t){t.d(n,{Z:()=>c,a:()=>r});var i=t(2784);let s={},o=i.createContext(s);function r(e){let n=i.useContext(o);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(o.Provider,{value:n},e.children)}}}]);
1
+ "use strict";(self.webpackChunkdocs_openc3_com=self.webpackChunkdocs_openc3_com||[]).push([["1417"],{5525:function(e,n,t){t.r(n),t.d(n,{frontMatter:()=>r,default:()=>h,toc:()=>a,metadata:()=>i,assets:()=>l,contentTitle:()=>c});var i=JSON.parse('{"id":"tools/tlm-viewer","title":"Telemetry Viewer","description":"Build custom screens using built-in widgets","source":"@site/docs/tools/tlm-viewer.md","sourceDirName":"tools","slug":"/tools/tlm-viewer","permalink":"/tools/staticdocs/docs/tools/tlm-viewer","draft":false,"unlisted":false,"editUrl":"https://github.com/OpenC3/cosmos/tree/main/docs.openc3.com/docs/tools/tlm-viewer.md","tags":[],"version":"current","frontMatter":{"title":"Telemetry Viewer","description":"Build custom screens using built-in widgets","sidebar_custom_props":{"myEmoji":"\uD83D\uDDA5\uFE0F"}},"sidebar":"defaultSidebar","previous":{"title":"Telemetry Grapher","permalink":"/tools/staticdocs/docs/tools/tlm-grapher"},"next":{"title":"Guides","permalink":"/tools/staticdocs/docs/guides"}}'),s=t(2322),o=t(2840);let r={title:"Telemetry Viewer",description:"Build custom screens using built-in widgets",sidebar_custom_props:{myEmoji:"\uD83D\uDDA5\uFE0F"}},c=void 0,l={},a=[{value:"Introduction",id:"introduction",level:2},{value:"File Menu Items",id:"file-menu-items",level:3},{value:"Open Configuration",id:"open-configuration",level:4},{value:"Save Configuration",id:"save-configuration",level:4},{value:"Selecting Screens",id:"selecting-screens",level:2},{value:"New Screen",id:"new-screen",level:2},{value:"Edit Screen",id:"edit-screen",level:2},{value:"Screen Window Management",id:"screen-window-management",level:2},{value:"Building Screens",id:"building-screens",level:2}];function d(e){let n={a:"a",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",p:"p",ul:"ul",...(0,o.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"introduction",children:"Introduction"}),"\n",(0,s.jsx)(n.p,{children:"Telemetry Viewer is a live telemetry viewer which displays custom built screens. Screens are configured through simple text files which utilize numerous built-in widgets."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Telemetry Viewer",src:t(6574).Z+"",width:"1274",height:"895"})}),"\n",(0,s.jsx)(n.h3,{id:"file-menu-items",children:"File Menu Items"}),"\n",(0,s.jsx)("img",{src:t(370).Z,alt:"File Menu",style:{float:"left","margin-right":"50px",height:"90px"}}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Open a saved configuration"}),"\n",(0,s.jsx)(n.li,{children:"Save the current configuration"}),"\n",(0,s.jsx)(n.li,{children:"Reset the configuration (default settings)"}),"\n"]}),"\n",(0,s.jsx)(n.h4,{id:"open-configuration",children:"Open Configuration"}),"\n",(0,s.jsx)(n.p,{children:"The Open Configuration dialog displays a list of all saved configurations. You select a configuration and then click Ok to load it. You can delete existing configurations by clicking the Trash icon next to a configuration name."}),"\n",(0,s.jsx)(n.h4,{id:"save-configuration",children:"Save Configuration"}),"\n",(0,s.jsx)(n.p,{children:"The Save Configuration dialog also displays a list of all saved configurations. You click the Configuration Name text field, enter the name of your new configuration, and click Ok to save. You can delete existing configurations by clicking the Trash icon next to a configuration name."}),"\n",(0,s.jsx)(n.h2,{id:"selecting-screens",children:"Selecting Screens"}),"\n",(0,s.jsx)(n.p,{children:"Selecting a target from the Select Target drop down automatically updates the available screens for that target in the Select Screen drop down. Clicking Show Screen causes that screen to display."}),"\n",(0,s.jsx)(n.h2,{id:"new-screen",children:"New Screen"}),"\n",(0,s.jsx)(n.p,{children:"Clicking New Screen brings up the new screen dialog."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Telemetry Viewer",src:t(6374).Z+"",width:"595",height:"424"})}),"\n",(0,s.jsx)(n.p,{children:"Screens are owned by Targets so Select Target chooses where the screen will be created. Screens can be based on a Packet such that all the items in that particular packet will be generated in a simple vertical screen similar to Packet Viewer. This is a good starting point for customizing a screen. Note that screen names must be unique so the screen name is set to 'adcs2' since an 'ADCS' screen already exists."}),"\n",(0,s.jsx)(n.h2,{id:"edit-screen",children:"Edit Screen"}),"\n",(0,s.jsx)(n.p,{children:"Clicking the pencil icon in the title bar of the screen brings up the edit dialog."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Telemetry Viewer",src:t(2747).Z+"",width:"1149",height:"698"})}),"\n",(0,s.jsx)(n.p,{children:"The screen source is displayed in an editor with syntax highlighting and auto-completion. You can download the screen source using the download button in the upper right or delete the screen using the trash icon in the upper left. Click Save to save the screen edits at which point Telemetry Viewer will re-render the screen."}),"\n",(0,s.jsx)(n.h2,{id:"screen-window-management",children:"Screen Window Management"}),"\n",(0,s.jsx)(n.p,{children:"All screens can be moved around the browser window by clicking their title bar and moving them. Other screens will move around intelligently to fill the space. This allows you to order the screens no matter which order they were created in."}),"\n",(0,s.jsx)(n.p,{children:"You can also float the screens by clicking the grid icon in the upper left of the title bar. It will change to a balloon icon and allow you to click up and down to change the relative Z index of the window. The image screen is floated in the following screen shot."}),"\n",(0,s.jsx)(n.p,{children:"The dash button in the upper right of the title bar minimizes the screen to effectively hide it. This allows you to focus on a single screen without closing existing screens. In the screen shot below there are two minimized windows at the very bottom."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Float Minimized",src:t(4245).Z+"",width:"1275",height:"928"})}),"\n",(0,s.jsx)(n.p,{children:"The X button closes the screen."}),"\n",(0,s.jsx)(n.h2,{id:"building-screens",children:"Building Screens"}),"\n",(0,s.jsxs)(n.p,{children:["For documentation on how to build Telemetry Screens and how to configure the\nscreen widgets please see the ",(0,s.jsx)(n.a,{href:"/tools/staticdocs/docs/configuration/telemetry-screens",children:"Telemetry Screens"}),"."]})]})}function h(e={}){let{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},370:function(e,n,t){t.d(n,{Z:()=>i});let i=t.p+"assets/images/file_menu-8a0c6243e35822617229a729a598ace78e401b6c29f66eb5e07035d77d9be1aa.png"},2747:function(e,n,t){t.d(n,{Z:()=>i});let i=t.p+"assets/images/edit_screen-c655c75fe90429c0425b61cccf23835b6882975abaa56de21d58c9a4b19a4773.png"},4245:function(e,n,t){t.d(n,{Z:()=>i});let i=t.p+"assets/images/float_minimize-a27fc649e517b279db5d2435fbd4f1de81418b9ef5f47fc83a9443bba0b1a7e0.png"},6374:function(e,n,t){t.d(n,{Z:()=>i});let i=t.p+"assets/images/new_screen-0d9bea0538e91fa2332346f1ff73b1dda2e418d295dcd7d6a13ba240cf32187e.png"},6574:function(e,n,t){t.d(n,{Z:()=>i});let i=t.p+"assets/images/telemetry_viewer-e4ac466930993a640f95aea4b01bb9a415eec77dfbfaa184f767cb59940ba943.png"},2840:function(e,n,t){t.d(n,{Z:()=>c,a:()=>r});var i=t(2784);let s={},o=i.createContext(s);function r(e){let n=i.useContext(o);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(o.Provider,{value:n},e.children)}}}]);
@@ -0,0 +1 @@
1
+ "use strict";(self.webpackChunkdocs_openc3_com=self.webpackChunkdocs_openc3_com||[]).push([["2448"],{3896:function(e,n,o){o.r(n),o.d(n,{frontMatter:()=>r,default:()=>h,toc:()=>l,metadata:()=>t,assets:()=>a,contentTitle:()=>c});var t=JSON.parse('{"id":"getting-started/upgrading","title":"Upgrading","description":"How to upgrade and migrate COSMOS","source":"@site/docs/getting-started/upgrading.md","sourceDirName":"getting-started","slug":"/getting-started/upgrading","permalink":"/tools/staticdocs/docs/getting-started/upgrading","draft":false,"unlisted":false,"editUrl":"https://github.com/OpenC3/cosmos/tree/main/docs.openc3.com/docs/getting-started/upgrading.md","tags":[],"version":"current","sidebarPosition":4,"frontMatter":{"sidebar_position":4,"title":"Upgrading","description":"How to upgrade and migrate COSMOS","sidebar_custom_props":{"myEmoji":"\u2B06\uFE0F"}},"sidebar":"defaultSidebar","previous":{"title":"Getting Started","permalink":"/tools/staticdocs/docs/getting-started/gettingstarted"},"next":{"title":"Command Line Interface","permalink":"/tools/staticdocs/docs/getting-started/cli"}}'),i=o(2322),s=o(2840);let r={sidebar_position:4,title:"Upgrading",description:"How to upgrade and migrate COSMOS",sidebar_custom_props:{myEmoji:"\u2B06\uFE0F"}},c=void 0,a={},l=[{value:"COSMOS Upgrades",id:"cosmos-upgrades",level:2},{value:"Upgrade Migration Process",id:"upgrade-migration-process",level:3},{value:"Migrating From COSMOS 5 to COSMOS 6",id:"migrating-from-cosmos-5-to-cosmos-6",level:2},{value:"Updating Vue",id:"updating-vue",level:3},{value:"The quick and dirty way",id:"the-quick-and-dirty-way",level:4},{value:"Step 1: Vue compat mode",id:"step-1-vue-compat-mode",level:4},{value:"(1.a) Update dependencies",id:"1a-update-dependencies",level:5},{value:"(1.b) Update the Vue config file (<code>vue.config.js</code>)",id:"1b-update-the-vue-config-file-vueconfigjs",level:5},{value:"(1.c) Update the eslint config file (<code>.eslintrc</code>)",id:"1c-update-the-eslint-config-file-eslintrc",level:5},{value:"(1.d) Fix build and runtime warnings and errors",id:"1d-fix-build-and-runtime-warnings-and-errors",level:5},{value:"Step 2: Bump compat mode from 2 to 3",id:"step-2-bump-compat-mode-from-2-to-3",level:4},{value:"Step 3: Update Vuetify",id:"step-3-update-vuetify",level:4},{value:"Step 4: Clean up",id:"step-4-clean-up",level:4},{value:"Migrating to the new OpenC3 common packages",id:"migrating-to-the-new-openc3-common-packages",level:3},{value:"Step 1: Update dependencies",id:"step-1-update-dependencies",level:4},{value:"Step 2: Update imports in your code",id:"step-2-update-imports-in-your-code",level:4},{value:"<code>@openc3/js-common</code>",id:"openc3js-common",level:4},{value:"<code>@openc3/vue-common</code>",id:"openc3vue-common",level:4},{value:"Migrating From COSMOS 4 to COSMOS 5",id:"migrating-from-cosmos-4-to-cosmos-5",level:2},{value:"Configuration Migration Tool",id:"configuration-migration-tool",level:3},{value:"Upgrading Custom Tools",id:"upgrading-custom-tools",level:3}];function d(e){let n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",h5:"h5",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h2,{id:"cosmos-upgrades",children:"COSMOS Upgrades"}),"\n",(0,i.jsx)(n.p,{children:"OpenC3 releases new versions of COSMOS on a monthy or better cadence. This is done for several reasons: to incorporate new features, fix existing bugs, update dependencies, and close CVEs. We extensively test each release at both the unit level, API level, and system level using Playwright against a deployed COSMOS. Thus we recommend upgrading COSMOS as quickly as possible when new releases become available. While COSMOS itself is tested extensively, we obviously can not test against customer plugins and custom deployments. We recommend having another installation of COSMOS which you can upgrade with your own plugins and verify functionality before upgrading your production environment."}),"\n",(0,i.jsx)(n.p,{children:"COSMOS is released as Docker containers. Since we're using Docker containers and volumes we can simply stop the existing COSMOS application, then download and run the new release."}),"\n",(0,i.jsx)(n.admonition,{title:"Release Notes",type:"info",children:(0,i.jsxs)(n.p,{children:["Always check the release notes associated with the release on the ",(0,i.jsx)(n.a,{href:"https://github.com/OpenC3/cosmos/releases",children:"releases"})," page. Sometimes there are migration notes."]})}),"\n",(0,i.jsx)(n.p,{children:"This example assumes an existing COSMOS project at C:\\cosmos-project."}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Stop the current COSMOS application"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-batch",children:"C:\\cosmos-project> openc3.bat stop\n"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Change the release in the .env file to the desired release"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-batch",children:"OPENC3_TAG=6.4.1\n"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Run the new COSMOS application"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-batch",children:"C:\\cosmos-project> openc3.bat run\n"})}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"upgrade-migration-process",children:"Upgrade Migration Process"}),"\n",(0,i.jsxs)(n.p,{children:["COSMOS doesn't use strict ",(0,i.jsx)(n.a,{href:"https://semver.org/",children:"semantic versioning"})," for our releases. Our major releases (5.0.0, 6.0.0, etc) are for major architectural changes and backward incompatibilities. Minor releases (6.1.0, 6.2.0, etc) add functionality but can also modify our configuration files. Thus certain minor releases are more important than others when skipping releases."]}),"\n",(0,i.jsx)(n.p,{children:"The following table identifies key release milestones which should be incrementally upgraded to by following the linked release notes. Versions not listed can be safely skipped while upgrading. For example, upgrading COSMOS 5.9.0 can go straight to 5.13.0 at which point the release notes should be carefully followed to avoid breaking changes. The Diff from the previous version to the linked version has been provided as a quick way to visualize the changes. Note that you should focus on changes to your own project configuration files: .env, compose.yaml, openc3-redis/users.acl, openc3-traefik/traefik.yaml. It is typically safe to simply copy the latest cacert.pem, openc3.sh and openc3.bat files. The reason we don't automatically overwrite these files is to avoid deleting user changes."}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{style:{textAlign:"left"},children:"Version"}),(0,i.jsx)(n.th,{style:{textAlign:"left"},children:"Summary"}),(0,i.jsx)(n.th,{children:"Diff"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{style:{textAlign:"left"},children:(0,i.jsx)(n.a,{href:"https://github.com/OpenC3/cosmos/releases/tag/v5.13.0",children:"5.13.0"})}),(0,i.jsx)(n.td,{style:{textAlign:"left"},children:"Breaking change to non-root containers and renamed minio volume. Requires running the migration script and updating compose.yaml and traefik configuration."}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.a,{href:"https://github.com/OpenC3/cosmos-project/compare/v5.12.0...v5.13.0",children:"v5.12.0...v5.13.0"})})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{style:{textAlign:"left"},children:(0,i.jsx)(n.a,{href:"https://github.com/OpenC3/cosmos/releases/tag/v5.15.0",children:"5.15.0"})}),(0,i.jsx)(n.td,{style:{textAlign:"left"},children:"The internal Traefik port was changed to 2900 to match our standard external port and to better support unprivileged runtime environments. Requires updating .env, compose.yaml, and traefik configuration."}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.a,{href:"https://github.com/OpenC3/cosmos-project/compare/v5.14.2...v5.15.0",children:"v5.14.2...v5.15.0"})})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{style:{textAlign:"left"},children:(0,i.jsx)(n.a,{href:"https://github.com/OpenC3/cosmos/releases/tag/v6.0.0",children:"6.0.0"})}),(0,i.jsxs)(n.td,{style:{textAlign:"left"},children:["The switch to Traefik 3 requires traefik configuration changes. If you have custom GUI tools follow the ",(0,i.jsx)(n.a,{href:"upgrading#migrating-from-cosmos-5-to-cosmos-6",children:"COSMOS 6 migration guide"}),"."]}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.a,{href:"https://github.com/OpenC3/cosmos-project/compare/v5.20.0...v6.0.0",children:"v5.20.0...v6.0.0"})})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{style:{textAlign:"left"},children:(0,i.jsx)(n.a,{href:"https://github.com/OpenC3/cosmos/releases/tag/v6.1.0",children:"6.1.0"})}),(0,i.jsx)(n.td,{style:{textAlign:"left"},children:"Changed from ActionCable to AnyCable which requires updates to compose.yaml, redis.acl, and traefik configuration. We also broke apart the COSMOS helm charts from a single chart to 3 charts."}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.a,{href:"https://github.com/OpenC3/cosmos-project/compare/v6.0.2...v6.1.0",children:"v6.0.2...v6.1.0"})})]})]})]}),"\n",(0,i.jsxs)(n.admonition,{title:"Downgrades",type:"warning",children:[(0,i.jsx)(n.p,{children:"Downgrades are not necessarily supported. When upgrading COSMOS we need to upgrade databases and sometimes migrate internal data structures. While we perform a full regression test on every release, we recommend upgrading an individual machine with your specific plugins and do local testing before rolling out the upgrade to your production system."}),(0,i.jsxs)(n.p,{children:["In general, patch releases (x.y.Z) can be downgraded, minor releases (x.Y.z) ",(0,i.jsx)(n.em,{children:"might"})," be able to be downgraded and major releases (X.y.z) are NOT able to be downgraded."]})]}),"\n",(0,i.jsx)(n.h2,{id:"migrating-from-cosmos-5-to-cosmos-6",children:"Migrating From COSMOS 5 to COSMOS 6"}),"\n",(0,i.jsx)(n.admonition,{title:"Developers Only",type:"info",children:(0,i.jsx)(n.p,{children:"If you haven't written any custom tools or widgets, there are no special changes required to upgrade from COSMOS 5 to COSMOS 6 other than updating your traefik configuration file. Simply follow the normal upgrade instructions above including following the release notes."})}),"\n",(0,i.jsxs)(n.p,{children:["COSMOS 6 introduces some breaking changes for custom tools regarding the Vue framework and our common library code. We've upgraded from Vue 2 (EOL December 31, 2023) to Vue 3. These versions of Vue are not compatible with each other, so any tools written with Vue 2 will need to be updated. Additionally, our ",(0,i.jsx)(n.code,{children:"@openc3/tool-common"})," NPM package has been deprecated with its functionality reorganized into two packages: ",(0,i.jsx)(n.code,{children:"@openc3/js-common"})," and ",(0,i.jsx)(n.code,{children:"@openc3/vue-common"}),". This is to provide a better experience for developers who are building COSMOS tools without the Vue framework."]}),"\n",(0,i.jsxs)(n.p,{children:["We also removed a few rarely used ",(0,i.jsx)(n.a,{href:"../guides/scripting-api#migration-from-cosmos-v5-to-v6",children:"API methods"})," in COSMOS 6."]}),"\n",(0,i.jsx)(n.h3,{id:"updating-vue",children:"Updating Vue"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.em,{children:"If your tool was not built with Vue (e.g. it was built without a frontend framework, or it was built with React, Angular, etc.), then you can skip this section."})}),"\n",(0,i.jsx)(n.h4,{id:"the-quick-and-dirty-way",children:"The quick and dirty way"}),"\n",(0,i.jsxs)(n.p,{children:["Tools that are relatively simple can probably be upgraded in one shot by just updating the dependencies and fixing any build errors that arise, and then fixing any runtime errors you find from testing and using your tool. If you're confident in this upgrade path, you can reference ",(0,i.jsx)(n.a,{href:"https://github.com/OpenC3/cosmos/pull/1747",children:"this pull request"})," to see what will need to change. Otherwise, the rest of this guide will walk you through a more in-depth and complete migration process."]}),"\n",(0,i.jsx)(n.h4,{id:"step-1-vue-compat-mode",children:"Step 1: Vue compat mode"}),"\n",(0,i.jsx)(n.p,{children:"The Vue team provided a compatibility mode to help with migrating from Vue 2 to Vue 3. This will let you get your tool up and running to make it easier to find the necessary changes."}),"\n",(0,i.jsx)(n.h5,{id:"1a-update-dependencies",children:"(1.a) Update dependencies"}),"\n",(0,i.jsx)(n.p,{children:'Use your package manager or edit the package.json file to update the following dependencies (ignore any packages marked "Update" that you aren\'t using)'}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Remove:"})," ",(0,i.jsx)(n.code,{children:"vue-template-compiler"})]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Add:"})," ",(0,i.jsx)(n.code,{children:"@vue/compat"})," >= 3.5 (",(0,i.jsx)(n.a,{href:"https://www.npmjs.com/package/@vue/compat",children:"npmjs.com"}),")"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Add:"})," ",(0,i.jsx)(n.code,{children:"@vue/compiler-sfc"})," >= 3.5 (",(0,i.jsx)(n.a,{href:"https://www.npmjs.com/package/@vue/compiler-sfc",children:"npmjs.com"}),")"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Update:"})," ",(0,i.jsx)(n.code,{children:"@vue/test-utils"})," >= 2.4 (",(0,i.jsx)(n.a,{href:"https://www.npmjs.com/package/@vue/compiler-sfc",children:"npmjs.com"}),")"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Update:"})," ",(0,i.jsx)(n.code,{children:"vue"})," >= 3.5 (",(0,i.jsx)(n.a,{href:"https://www.npmjs.com/package/vue",children:"npmjs.com"}),")"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Update:"})," ",(0,i.jsx)(n.code,{children:"vuex"})," >= 4.1 (",(0,i.jsx)(n.a,{href:"https://www.npmjs.com/package/vuex",children:"npmjs.com"}),")"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Update:"})," ",(0,i.jsx)(n.code,{children:"vue-router"})," >= 4.4 (",(0,i.jsx)(n.a,{href:"https://www.npmjs.com/package/vue-router",children:"npmjs.com"}),")"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Update:"})," ",(0,i.jsx)(n.code,{children:"vuetify"})," >= 3.7 (",(0,i.jsx)(n.a,{href:"https://www.npmjs.com/package/vuetify",children:"npmjs.com"}),")"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Update:"})," ",(0,i.jsx)(n.code,{children:"single-spa-vue"})," >= 3.0 (",(0,i.jsx)(n.a,{href:"https://www.npmjs.com/package/single-spa-vue",children:"npmjs.com"}),")"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Eslint will help call out changes you'll need to make to your code for the migration, so it's recommended to include eslint in your project if you haven't already. There are plenty of guides online that will explain how to do that. If you're using eslint, then make the additional changes to your tool's dependencies:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Add:"})," ",(0,i.jsx)(n.code,{children:"eslint-plugin-vuetify"})," >= 2.5 (",(0,i.jsx)(n.a,{href:"https://www.npmjs.com/package/eslint-plugin-vuetify",children:"npmjs.com"}),")"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Add:"})," ",(0,i.jsx)(n.code,{children:"vue-eslint-parser"})," >= 9.4 (",(0,i.jsx)(n.a,{href:"https://www.npmjs.com/package/vue-eslint-parser",children:"npmjs.com"}),")"]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["If you modified your package.json file manually, don't forget to ",(0,i.jsx)(n.code,{children:"yarn"})," or ",(0,i.jsx)(n.code,{children:"npm install"})," at your project's root to apply the changes."]}),"\n",(0,i.jsxs)(n.h5,{id:"1b-update-the-vue-config-file-vueconfigjs",children:["(1.b) Update the Vue config file (",(0,i.jsx)(n.code,{children:"vue.config.js"}),")"]}),"\n",(0,i.jsxs)(n.p,{children:["You likely have a ",(0,i.jsx)(n.code,{children:"chainWebpack"})," property in the object that's exported by this file which looks something like this (though your contents might vary)"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-js",children:"chainWebpack: (config) => {\n config.module\n .rule('vue')\n .use('vue-loader')\n .tap((options) => {\n return {\n prettify: false,\n }\n })\n},\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Add a resolution alias for ",(0,i.jsx)(n.code,{children:"@vue/compat"})," to the top of this block and set the compiler to use the Vue 2 compat mode:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-js",children:"chainWebpack: (config) => {\n config.resolve.alias.set('vue', '@vue/compat') // Add this line\n config.module\n .rule('vue')\n .use('vue-loader')\n .tap((options) => {\n return {\n prettify: false,\n compilerOptions: { // Add this block\n compatConfig: { //\n MODE: 2, //\n }, //\n }, // to here\n }\n })\n},\n"})}),"\n",(0,i.jsxs)(n.h5,{id:"1c-update-the-eslint-config-file-eslintrc",children:["(1.c) Update the eslint config file (",(0,i.jsx)(n.code,{children:".eslintrc"}),")"]}),"\n",(0,i.jsxs)(n.p,{children:["Find the string ",(0,i.jsx)(n.code,{children:"'plugin:vue/essential'"})," in your ",(0,i.jsx)(n.code,{children:"extends"})," block and change it to ",(0,i.jsx)(n.code,{children:"'plugin:vue/vue3-essential'"}),". If you don't have that plugin in your ",(0,i.jsx)(n.code,{children:"extends"})," block, or you're missing that block entirely, then add this. It will help find breaking changes in how your code is using the Vue API."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-js",children:"extends: [\n 'plugin:vue/vue3-essential', // change this from plugin:vue/essential\n 'plugin:prettier/recommended',\n '@vue/prettier',\n],\n"})}),"\n",(0,i.jsx)(n.h5,{id:"1d-fix-build-and-runtime-warnings-and-errors",children:"(1.d) Fix build and runtime warnings and errors"}),"\n",(0,i.jsxs)(n.p,{children:["Run your linting and build scripts (e.g. ",(0,i.jsx)(n.code,{children:"yarn lint"})," and ",(0,i.jsx)(n.code,{children:"yarn build"}),"). The eslint plugin and Vue's compat mode will find the first set of code changes you need to address. Fix these lint/build errors until your project builds successfully."]}),"\n",(0,i.jsxs)(n.p,{children:["Once it builds, run your project like you would for development. It's recommended to serve it from a local dev server with ",(0,i.jsx)(n.code,{children:"yarn serve"})," and add it to the import map overrides in the browser. Test the functionality of your tool and address any Vue errors and warnings that get printed to the browser console in the dev tools. ",(0,i.jsxs)(n.em,{children:["(NOTE: On ",(0,i.jsx)(n.code,{children:"MODE: 2"})," - your first pass through this section - it's ok if your tool doesn't completely work yet. Just address the warnings and errors that are logged to the browser console. You'll get your tool completely working in the next step.)"]})]}),"\n",(0,i.jsxs)(n.p,{children:["From our experience migrating the COSMOS first-party tools, you'll most likely have to make changes to your ",(0,i.jsx)(n.code,{children:"main.js"})," and ",(0,i.jsx)(n.code,{children:"router.js"}),' files at a minimum. You can reference the PR mentioned above in the "The quick and dirty way" section above to see what we changed, or search the internet for Vue 2 -> Vue 3 migration guides if you need help addressing any warnings or errors.']}),"\n",(0,i.jsx)(n.h4,{id:"step-2-bump-compat-mode-from-2-to-3",children:"Step 2: Bump compat mode from 2 to 3"}),"\n",(0,i.jsxs)(n.p,{children:["Change the ",(0,i.jsx)(n.code,{children:"compatConfig"})," you added to your vue config file (",(0,i.jsx)(n.code,{children:"vue.config.js"}),") from ",(0,i.jsx)(n.code,{children:"MODE: 2"})," to ",(0,i.jsx)(n.code,{children:"MODE: 3"}),". This will tell Vue's compat mode that you've addressed the changes in the previous step, and it will find the next set of issues (since this is a multi-step process). Repeat the \"(1.d) Fix build and runtime warnings and errors\" step."]}),"\n",(0,i.jsx)(n.h4,{id:"step-3-update-vuetify",children:"Step 3: Update Vuetify"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.em,{children:"If you're not using Vuetify, you can skip this step."})}),"\n",(0,i.jsxs)(n.p,{children:["Modify your eslint config (",(0,i.jsx)(n.code,{children:".eslintrc"}),") again to add the Vuetify plugin:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-js",children:"extends: [\n 'plugin:vue/vue3-essential',\n 'plugin:vuetify/base', // Add this line\n 'plugin:prettier/recommended',\n '@vue/prettier',\n],\n"})}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Note:"})," The Vuetify eslint plugin is only designed for migrating projects from Vuetify 2 to Vuetify 3 and can cause linting performance issues, so it should be removed once your tool migration is complete."]}),"\n",(0,i.jsxs)(n.p,{children:["Again in ",(0,i.jsx)(n.code,{children:".eslintrc"}),", find your ",(0,i.jsx)(n.code,{children:"parserOptions"})," block and add the ",(0,i.jsx)(n.code,{children:"parser"})," property above it:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-js",children:"parser: 'vue-eslint-parser', // Add this line\nparserOptions: {\n ...\n},\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Now when you run eslint, it can tell you about any changes you'll need to address regarding how your code is using the Vuetify API. To find these changes, run eslint on your Vue files (e.g. ",(0,i.jsx)(n.code,{children:"yarn eslint . --ext .vue"}),"). You can address these manually, or if you trust eslint or have good version control, you can have the plugin fix most of them automatically with ",(0,i.jsx)(n.code,{children:"yarn eslint . --ext .vue --fix"})]}),"\n",(0,i.jsxs)(n.p,{children:["Lastly, if you are using the Astro UXDS icons via Vuetify from COSMOS - or any custom icon packs for that matter - then you'll need to change their pack alias format from ",(0,i.jsx)(n.code,{children:"$packName-"})," to ",(0,i.jsx)(n.code,{children:"packName:"}),". Here's an example for the ",(0,i.jsx)(n.code,{children:"antenna-transmit"})," Astro icon:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-html",children:"\x3c!-- Vue 2 / Vuetify 2 (old) --\x3e\n<v-icon> $astro-antenna-transmit </v-icon>\n\n\x3c!-- Vue 3 / Vuetify 3 (new) --\x3e\n<v-icon> astro:antenna-transmit </v-icon>\n"})}),"\n",(0,i.jsx)(n.h4,{id:"step-4-clean-up",children:"Step 4: Clean up"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Remove the ",(0,i.jsx)(n.code,{children:"@vue/compat"})," and ",(0,i.jsx)(n.code,{children:"eslint-plugin-vuetify"})," dependencies you added in step 1.a"]}),"\n",(0,i.jsxs)(n.li,{children:["Remove the ",(0,i.jsx)(n.code,{children:"compatConfig"})," you added in step 1.b"]}),"\n",(0,i.jsxs)(n.li,{children:["Remove the ",(0,i.jsx)(n.code,{children:"'plugin:vuetify/base'"})," you added in step 3"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"migrating-to-the-new-openc3-common-packages",children:"Migrating to the new OpenC3 common packages"}),"\n",(0,i.jsxs)(n.p,{children:["As mentioned in the first paragraph of this guide, we've deprecated the ",(0,i.jsx)(n.code,{children:"@openc3/tool-common"})," NPM package. All of its functionality has remained the same, but everything is organized differently, so you'll have to update your dependencies and imports."]}),"\n",(0,i.jsx)(n.h4,{id:"step-1-update-dependencies",children:"Step 1: Update dependencies"}),"\n",(0,i.jsx)(n.p,{children:"Use your package manager or edit the package.json file to update the following dependencies"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Remove:"})," ",(0,i.jsx)(n.code,{children:"@openc3/tool-common"})]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Add:"})," ",(0,i.jsx)(n.code,{children:"@openc3/js-common"})," >= 6.0 (",(0,i.jsx)(n.a,{href:"https://www.npmjs.com/package/@openc3/js-common",children:"npmjs.com"}),")"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Add:"})," ",(0,i.jsx)(n.code,{children:"@openc3/vue-common"})," >= 6.0 (",(0,i.jsx)(n.a,{href:"https://www.npmjs.com/package/@openc3/vue-common",children:"npmjs.com"}),")","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"This is only needed if you are using our Vue stuff (components, plugins, etc.)"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"step-2-update-imports-in-your-code",children:"Step 2: Update imports in your code"}),"\n",(0,i.jsxs)(n.p,{children:["In COSMOS 5, things were imported directly from ",(0,i.jsx)(n.code,{children:"@openc3/tool-common"}),"'s ",(0,i.jsx)(n.code,{children:"src"})," directory and subsequently built into your tool by your build process. Everything in COSMOS 6 is now exported through several top-level exports in our new common packages. In general, the pattern is as follows:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["COSMOS 5: ",(0,i.jsx)(n.code,{children:"import bar from '@openc3/tool-common/src/foo/bar'"})]}),"\n",(0,i.jsxs)(n.li,{children:["COSMOS 6: ",(0,i.jsx)(n.code,{children:"import { bar } from '@openc3/vue-common/foo'"})]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["This pattern also lets you combine multiple import statements into one (e.g. ",(0,i.jsx)(n.code,{children:"import { bar, baz } from '@openc3/vue-common/foo'"}),")."]}),"\n",(0,i.jsx)(n.p,{children:"There are three exceptions to this pattern:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Widgets are no longer under the ",(0,i.jsx)(n.code,{children:"components"})," directory but instead get their own top-level export","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Old: ",(0,i.jsx)(n.code,{children:"import foo from '@openc3/tool-common/src/components/widgets/Foo"})]}),"\n",(0,i.jsxs)(n.li,{children:["New: ",(0,i.jsx)(n.code,{children:"import { foo } from '@openc3/vue-common/widgets"})]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["Icons got the same treatment","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Old: ",(0,i.jsx)(n.code,{children:"import bar from '@openc3/tool-common/src/components/icons/Bar"})]}),"\n",(0,i.jsxs)(n.li,{children:["New: ",(0,i.jsx)(n.code,{children:"import { bar } from '@openc3/vue-common/icons"})]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["The ",(0,i.jsx)(n.code,{children:"TimeFilters"})," mixin was moved from ",(0,i.jsx)(n.code,{children:"tools/base"})," to ",(0,i.jsx)(n.code,{children:"util"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Old: ",(0,i.jsx)(n.code,{children:"import TimeFilters from '@openc3/tool-common/src/tools/base/util/timeFilters"})]}),"\n",(0,i.jsxs)(n.li,{children:["New: ",(0,i.jsx)(n.code,{children:"import { TimeFilters } from '@openc3/vue-common/util"})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"openc3js-common",children:(0,i.jsx)(n.code,{children:"@openc3/js-common"})}),"\n",(0,i.jsxs)(n.p,{children:["This package contains things previously under ",(0,i.jsx)(n.code,{children:"@openc3/tool-common/src/services"}),". Anything not from that path will be in the ",(0,i.jsx)(n.code,{children:"vue-common"})," package discussed below."]}),"\n",(0,i.jsx)(n.p,{children:"Update any of your imports from that path accordingly. Here's an example:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-js",children:'// COSMOS 5 (old)\nimport Api from "@openc3/tool-common/src/services/api";\nimport Cable from "@openc3/tool-common/src/services/cable";\nimport { OpenC3Api } from "@openc3/tool-common/src/services/openc3Api";\n\n// COSMOS 6 (new)\nimport { Api, Cable, OpenC3Api } from "@openc3/js-common/services";\n'})}),"\n",(0,i.jsx)(n.p,{children:"This package also provides a couple more top-level imports which you likely will not need, but they might be useful, so I'll call them out here:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"import { prependBasePath } from '@openc3/js-common/utils"})," provides a function that will prepend the base path (e.g. localhost:2900) to Vue Router ",(0,i.jsx)(n.code,{children:"route"})," objects and their children. This can be useful if you run into certain quirks with single-spa and vue-router 4's routing logic where you need the full path. You can see how we use it ",(0,i.jsx)(n.a,{href:"https://github.com/OpenC3/cosmos/blob/f0193f4146e28e1cd383732763a9d27d84b5ca71/openc3-cosmos-init/plugins/packages/openc3-cosmos-tool-cmdtlmserver/src/router.js#L76",children:"here"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"import { devServerPlugin } from '@openc3/js-common/viteDevServerPlugin"}),". This Vite plugin is a temporary hack to run a local dev server for tools when migrating from webpack/vue-cli. It should be replaced with Vite's built-in ",(0,i.jsx)(n.code,{children:"vite dev"})," dev server, but that's currently not working - at least in our first-party COSMOS tools. You can see how we use it ",(0,i.jsx)(n.a,{href:"https://github.com/OpenC3/cosmos/blob/f0193f4146e28e1cd383732763a9d27d84b5ca71/openc3-cosmos-init/plugins/packages/openc3-cosmos-tool-cmdtlmserver/vite.config.js#L37",children:"here"}),"."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"openc3vue-common",children:(0,i.jsx)(n.code,{children:"@openc3/vue-common"})}),"\n",(0,i.jsxs)(n.p,{children:["This package provides all the shared Vue components we use to build our first-party tools. The main top-level exports are ",(0,i.jsx)(n.code,{children:"components"}),", ",(0,i.jsx)(n.code,{children:"icons"}),", ",(0,i.jsx)(n.code,{children:"plugins"}),", ",(0,i.jsx)(n.code,{children:"util"}),", and ",(0,i.jsx)(n.code,{children:"widgets"}),". There are also some tool-specific exports that we built for code sharing with COSMOS Enterprise, which you might find useful: ",(0,i.jsx)(n.code,{children:"tool/base"}),", ",(0,i.jsx)(n.code,{children:"tool/admin"}),", and ",(0,i.jsx)(n.code,{children:"tool/calendar"}),". Here's an example, but again, reference the pattern mentioned above."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-js",children:'// COSMOS 5 (old)\nimport DetailsDialog from "@openc3/tool-common/src/components/DetailsDialog";\nimport Graph from "@openc3/tool-common/src/components/Graph";\nimport Notify from "@openc3/tool-common/src/plugins/notify";\nimport TimeFilters from "@openc3/tool-common/src/tools/base/util/timeFilters";\nimport VWidget from "@openc3/tool-common/src/components/widgets/VWidget";\n\n// COSMOS 6 (new)\nimport { DetailsDialog, Graph } from "@openc3/vue-common/components";\nimport { Notify } from "@openc3/vue-common/plugins";\nimport { TimeFilters } from "@openc3/vue-common/util";\nimport { VWidget } from "@openc3/vue-common/widgets";\n'})}),"\n",(0,i.jsx)(n.h2,{id:"migrating-from-cosmos-4-to-cosmos-5",children:"Migrating From COSMOS 4 to COSMOS 5"}),"\n",(0,i.jsx)(n.admonition,{title:"All COSMOS Users",type:"info",children:(0,i.jsx)(n.p,{children:"All COSMOS 4 users must upgrade their configuration to 5. However, the command, telemetry and screen definitions (keywords and syntax) have remained the same."})}),"\n",(0,i.jsxs)(n.p,{children:["COSMOS 5 is a new architecture and treats targets as independent ",(0,i.jsx)(n.a,{href:"/tools/staticdocs/docs/configuration/plugins",children:"plugins"}),". Thus the primary effort in porting from COSMOS 4 to COSMOS 5 is converting targets to plugins. We recommend creating plugins for each independent target (with its own interface) but targets which share an interface will need to be part of the same plugin. The reason for independent plugins is it allows the plugin to be versioned separately and more easily shared outside your specific project. If you have very project specific targets (e.g. custom hardware) those can potentially be combined for ease of deployment."]}),"\n",(0,i.jsx)(n.h3,{id:"configuration-migration-tool",children:"Configuration Migration Tool"}),"\n",(0,i.jsx)(n.p,{children:"COSMOS 5 (but not COSMOS 6) includes a migration tool for converting an existing COSMOS 4 configuration into a COSMOS 5 plugin. This example assumes an existing COSMOS 4 configuration at C:\\COSMOS and a new COSMOS 5 installation at C:\\cosmos-project. Linux users can adjust paths and change from .bat to .sh to follow along."}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Change to the existing COSMOS 4 configuration directory. You should see the config, lib, procedures, outputs directory. You can then run the migration tool by specifying the absolute path to the COSMOS 5 installation."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-batch",children:"C:\\COSMOS> C:\\cosmos-project\\openc3.bat cli migrate -a demo\n"})}),"\n",(0,i.jsx)(n.p,{children:"This creates a new COSMOS 5 plugin called openc3-cosmos-demo with a target named DEMO containing the existing lib and procedures files as well as all the existing targets."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-batch",children:"C:\\COSMOS> C:\\cosmos-project\\openc3.bat cli migrate demo-part INST\n"})}),"\n",(0,i.jsx)(n.p,{children:"This would create a new COSMOS 5 plugin called openc3-cosmos-demo-part with a target named DEMO_PART containing the existing lib and procedures files as well as the INST target (but no others)."}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Open the new COSMOS 5 plugin and ensure the ",(0,i.jsx)(n.a,{href:"/tools/staticdocs/docs/configuration/plugins#plugintxt-configuration-file",children:"plugin.txt"})," file is correctly configured. The migration tool doesn't create VARIABLEs or MICROSERVICEs or handle target substitution so those features will have to added manually."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Follow the ",(0,i.jsx)(n.a,{href:"/tools/staticdocs/docs/getting-started/gettingstarted#building-your-plugin",children:"building your plugin"})," part of the Getting Started tutorial to build your new plugin and upload it to COSMOS 5."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"upgrading-custom-tools",children:"Upgrading Custom Tools"}),"\n",(0,i.jsxs)(n.p,{children:["COSMOS 4 was a Qt Desktop based application. COSMOS 5 is a completely new architecture which runs natively in the browser using ",(0,i.jsx)(n.a,{href:"https://vuejs.org/",children:"Vue.js"})," as the Javascript framework and ",(0,i.jsx)(n.a,{href:"https://vuetifyjs.com/en/",children:"Vuetify"})," as the GUI library. We utilize ",(0,i.jsx)(n.a,{href:"https://single-spa.js.org/",children:"single-spa"})," to allow you to write COSMOS tool plugins in any language and provide ",(0,i.jsx)(n.a,{href:"https://github.com/OpenC3/cosmos/tree/main/openc3/templates",children:"templates"})," for Vue.js (recommended), Angular, React and Svelte. Any COSMOS 4 custom tools will have to be completely re-written to run in COSMOS 5. We recommend using the native COSMOS ",(0,i.jsx)(n.a,{href:"https://github.com/OpenC3/cosmos/tree/main/openc3-cosmos-init/plugins/packages",children:"tools"})," and finding GUI concepts and functionality that best match the tool you're trying to re-create."]}),"\n",(0,i.jsxs)(n.p,{children:["If you need custom development get in touch at ",(0,i.jsx)(n.a,{href:"mailto:sales@openc3.com",children:"sales@openc3.com"}),"."]})]})}function h(e={}){let{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},2840:function(e,n,o){o.d(n,{Z:()=>c,a:()=>r});var t=o(2784);let i={},s=t.createContext(i);function r(e){let n=t.useContext(s);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]);